Sân gôn Mozart - mini Foi Rondo


13

Xuất "Mozart - Alla Turca" sang thiết bị xuất chuẩn (xem mẫu để biết "triển khai tham chiếu")

Cố gắng tìm cách đóng gói cả nhạc tổng hợp và nhạc thành kích thước tối thiểu.

Yêu cầu:

  • Định dạng phù hợp để cho ăn vào aplay -f cd(ký cuối 16 bit nhỏ, 2 kênh);
  • Toàn bộ âm nhạc nên được phát (không có ghi chú hoặc phần bị bỏ qua, ít nhất là không ít hơn trong chương trình mẫu), mặc dù vậy không cần phải có đa âm;
  • Không thể chỉ gọi /usr/bin/timidity, /usr/bin/soxhoặc một cái gì đó như thế (ví dụ như yêu cầu để cài đặt một module âm nhạc đặc biệt);
  • Không thể truy cập mạng hoặc cho rằng nhạc có sẵn tại địa phương;

"Triển khai tham chiếu" với số điểm có thể phân tích được: https://gist.github.com/vi/5478693
(Chương trình Perl mẫu cũ: https://gist.github.com/vi/5447962 )


Bạn có một liên kết đến bản nhạc?
beary605

Không có hiện tại, tôi đã gõ chương trình mẫu bằng cách nghe và dùng thử & lỗi. Bây giờ đang tìm kiếm ...
Vi.

Ví dụ, này .
Vi.

Ngoài ra, tôi cho rằng bạn đã nhận ra điều này, nhưng mọi người sẽ sử dụng sóng vuông.
Peter Taylor

2
Lưu ý: sự sắp xếp trong điểm số được liên kết là khá vô ích đối với bất kỳ ai cố gắng thực hiện điều này chỉ với một giọng nói. Tôi đã tải xuống nhiều tệp MIDI khác nhau và chúng không đồng ý với tất cả các ghi chú - chúng có thể nằm trong cùng một khóa, nhưng không đồng ý với một số ghi chú của 4 nửa cung! Để làm cho vấn đề này được chỉ định rõ, nó thực sự cần một điểm số chính tắc (tốt nhất là ở một số định dạng được phân tích cú pháp dễ dàng, để người thực hiện có thể chuyển đổi nó thành định dạng thuận tiện cho việc thực hiện mà không gây ra lỗi sao chép).
Peter Taylor

Câu trả lời:


11

Đa âm, Haskell, 2826 3177 4719

Đầu ra âm thanh: https://www.dropbox.com/s/nba6361tfet740r/hs-golf-turca.ogg

Đặc trưng:

  • Tất cả ghi chú từ tay phải . Tất nhiên tôi cũng có thể thêm tay trái (đã làm điều đó).
  • Phát âm đúng các ghi chú staccato, vv
  • Âm thanh hợp lý tốt đẹp với sự năng động. Không chỉ điều chế âm lượng đơn giản, mà còn biến hình phù hợp của nhân vật tấn công và nội dung nhạc chuông,như bạn có một cây đàn piano thực sựthực ra, đúng hơn ... này, tác phẩm này được cho là bắt chước các ban nhạc Janissary của Thổ Nhĩ Kỳ , phải không?
  • Dội lại. Nghe có vẻ không tuyệt vời lắm, nhưng cũng không quá tệ.
  • Nén động. Đừng hỏi ...
  • Phối màu của đầu ra. Điều này thật vô lý: với độ phân giải 16 bit phù hợp, hầu như không ai nghe thấy các tạo phẩm lượng tử hóa, nhưng để tránh bao gồm thư viện nhị phân , tôi chỉ sử dụng hiệu quả độ phân giải 7 bit, mà tôi có thể bao quát với đầu ra ASCII. Bản thân hoà sắc khá ồn ào, không có tiếng ồn ...
  • Tính toán đa luồng của các hợp âm đa âm.

import Control.Parallel
main=mapM_ (\(d,s)->(\p->p>>p>>p>>p).putChar.toEnum.round.(+d).(*62).min 2.abs$s+1).zip(dθ 1).lim.rev.hgp 9. pl 9e6 (\_->0) . ä
 $[mT%8.1,t2%16.1,t3(∡7)%8,t4%8,t5%16,t3(∡7)%8,mT%8.1,t2%16.1,t3(tev arp8)%8,cdT%99] >>= \e->[e,e]
mM=ä[2-^8,1-^8,0-^8,1-^8,3-^4]
cM=ä[7-^20,8-^20,9.^4,F[(7,0),(6,1)](map((∡2).(.^4))[6,5,6])%0.75]
cMv=ä[10-^2,8.^4,9.^4,hom(.^4)[[24,5],[23,8,12],[22,4],[21,6,9],[22,3],[19,5,8],[20,4],[18,6,9],[17]]#7&(-14)%2.5,tr 2%0.4,1-^9,2-^12,1-^1]%4.5
 ⋎(ä[6-^4,lp(8.^4∡3)%(3/4),sil%2,lp(5.^4∡3)%h,lp(5.^4∡2)%h,1-^1∡7]&(-14)#7#4%5)
mMa f=ä[(1-3*f).^4,lp(5.^4∡(-2-f))%0.75,mMa f%1.5,mMa(f*2)%h,mMa f%1]#7
mTm=ä[mM%1,mM&2%1,mM#4&4%h,mM&7%h,mM&7%1,8.^4,ä[10.^4]%0.2,cM%1,cM%1,cM%0.85,ä[4.^4∡2,5.^2]#6#4%2]#7
mT=p$ä[mTm%8.1⋎(ä[sil%h,mMa 0%4,mMa 1%2.75,2.^4,(-2)-^2]&(-7)%8)]
m2=ä[ä(map((∡2).(.^4))[1,2,3,3]++[es[6,5,4,3]%h]++[0-^2∡2])%2
 ⋎(ä[sil%h,1.^4,8.^4,3.^4,10.^4,5-^2]⊿1.3&(-14)%2)]
t2=p$ä[m2&2%1.8,0-^5,m2&2%2,m2#7%1.8,(-2)-^5,m2#7%2,mT%3.5,cMv]
m3=ä$[3-^4,4-^4,5-^2]++map(-^4)[3,4,5,4,3,2,1,2,3,4,2,0]
m3a=ä[(ä[sil%(1/8),lp(8.^4)%1]:zw(\d n->ä[sil%(d/24),n-^1]⊿cos d)[0..][1,3,5],s),m3a%1]
m3ra=(map((%1). \[a,b,c]->es[a,c,b,c,a,c,b,c])[[1,3,5],[1,4,6],[-2,0,5]]!!)
t3 o=ä[ä[o$ḋ[m3%4,m3%2.5,1-^4,4-^4,2-^4,0-^4]&(-2)%7.5,1-^2∡7]%8
 ⋎(ḋ[sil%(3/8),m3a&4%2,m3a%h,m3a#4%h,m3a&1%1,m3a&4%2,m3a%h,m3a&1%(5/8),5-^2]&(-18)%8)]
mQ=es[2,1,0,2]
m4=mM⇆4
i4 e=ḋ[m4⇅11%h,m4⇅9%h,mQ⇆4⇅8%h,F[(5,e),(4,1)][mQ⇅7%h,mQ⇅5%h,m4&5%h,m4&7%h]%2,es[10,9,10,9]#2%h ]
mla[b,c,d]=ä[b-^4,lp(c-^4⋎(d-^4))%1]%1
i4a=ḋ[sil%h,ä(map mla[[1,3,5],[2,4,5],[1,3,5],[0,2,5]])#5%4,ä(map mla[[1,3,5],[2,5,7],[2,6,8]])#4%3,5-^2⋎(7-^2)]
t4=p$ä[ḋ[i4 1%4,i4 0%2.5,ä[mQ⇅6%h,mQ⇅4%h]#4#2%1,3-^2]%8⋎(i4a&(-9)%8)]
mlaa=mla[1,3,5]
m5=ä$map(-^8)[1..4]
i5=ḋ[m5⇅6%h,m5%h,m5&4%h,m5⇅9%h]
i5d=hom(-^4)[[2],[4,5],[0],[4,5]]%1
i5a=ḋ[sil%h,mlaa,i5d,mlaa,mla[-2,0,4],mlaa,i5d,sq 4[1,-1,-3,-2,-6,1]%2]&(-7)
t5=ḋ[ḋ[i5%2,i5%1.5,ä[8-^4,9-^4]#1%h,i5%2,ḋ[es[5,4,3,2,3,5,1,3,2,4,0,2]%2]%1.5,1-^2]%8⋎(i5a%8)
 ,p(ä[ä[i4 1%4,es[3,2,3,1,4,3,4,3,4,3,4,3]#2#1&7%1.5,m5⇅13%h,mQ⇅8%h,m5&7%(3/8),6-^8,mQ⇅7#5%h,6-^2]%8
 ⋎(ä[i4a%3.5,F[(1,-1),(7,0),(6,1)][hom(-^4)[[-2],[3,5],[2,5],[1,5]]%1]%1,mla[-3,1,4],mla[-3,2,4],hom(-^4)[[-2],[1,3],[-2],[2,4],[1,3]]%1.5]&(-9)%8)])%8]⊿0.8
am d=3-^d∡2∡5
amf=1-^υ∡2⋎(5-^1∡3)
vh v(c,d)=lp(ä[v-^12]:map(\t->ä[t⊿0%0.04,t%d])c,d)
aam=vh 11.am
aar=ä[1-^10,4-^10,6-^1]&4
eam=vh 10.em
dm=6-^1∡2⋎(11-^1)
em d=5-^d∡2⋎(9-^1)
cdM=ḋ[4-^8,3-^8,2.^8,3.^8,cdM%1]
cdT=ḋ[ä[3-^(8/3)∡7,10-^6,am 1,am 1,cdM&7%1,dm,aam 4.05%1,em(4/3),12-^4,am 1,am 1,cdM&7%1,dm,aam 1%1,eam 4%1]%12.5⋎(ä(sil%(11/24) : map((%1).(m3a&))[4,4,4,0,4,1,4,4,4,0,4,1])&(-18)%13.1)
 ,p(ä[ä[ä[8-^2]⊿2%h,aar%(3/8),10-^8,aar%1,aar%1,cdM&7%1,11-^1,vh 11(10-^4)%1,9-^(4/3)]%7⋎(ä(map m3ra[0,0,0,0,1,0,2])&(-7)%7)])%6.75
 ,ä[p(ä[12-^4])%(1/4),am 1,am 1,cdM&7%1,dm,aam 1%1,eam 4%1,amf,ä[3-^4,1-^υ,5-^4,1-^υ,3-^4,1-^4,3-^4,1-^4,5-^4,1-^2]%3.75∡7,ä[amf∡(-14)]%0.56,ä[amf∡(-14)]⊿0.8%1]%12⋎(ä(sil%(1/8):map((%1).(m3a&))[4,4,4,0,4,1,4,4,4]++[m3a&4%h,m3a&4%h,5-^(8/5)])&(-18)%12)]
type D=Double
data F=N Int D|F[(Int,D)][([F],D)]
φ⇸F a fs=F a$map(\(f,d)->(map φ f,d))fs
_⇸N i d=N i d
i##c
 |i<1=(i+7)##c/2
 |i>7=(i-7)##c*2
 |1>0=1.06**(c i+case i of{1->0;3->3;4->5;5->7;6->8;7->10;_->fri i})
pl dur acc(N n v)=(\ω η->map(sin.(\x->x+τ x^2/η). \i->v*exp(-i*η/s)*τ(i*v)*(0.8-τ((i-dur)/90))*sin(i*ω))[1..dur])(n##acc/15.5).exp$fri n/9
pl dur acc(F accm fs)=pl' dur (foldr(\(q,m)f i->if q==i then m else f i)acc accm) fs
pl' dur _ _|dur<=0 = []
pl' dur _ []=map(\_->0)[1..dur]
pl' dur acc((f,dr):fs)|n<-min dr dur=trans(round n)(foldr1(\a b->sum a`par`sum b`pseq`zw(+)a b)(map(pl(n+99)acc)f))$pl'(dur-dr)acc fs
trans n a b|(f,ol)<-splitAt n a,(or,l)<-splitAt 99 b=f++zw(+)ol or++l
fri=fromIntegral
F a fs#q=F((q,1):a)fs
N i d&n=N(n+i)d
f&n=(&n)⇸f
N i d⇅n=N(n-i)d
f⇅n=(⇅n)⇸f
N i d⇆_=N i d
F a fs⇆n=F a.reverse$take n fs
N i d⊿v=N i$d*v
f⊿v=(⊿v)⇸f
p=(⊿0.3)
n.^q=([F[][([N n 1],s/2/q)]],s/q)
n-^q=([N n 1],s/q)
(l,d)⋎(r,_)=(l++r,d)
(l,d)∡j=(l++map(\h->ä[h⊿0%0.01,h&j%100])l,d)
f%t=([f],s*t)
tr n=F[]$cycle[n-^15,(n+1)-^20]
ä=F[];ḋ=F$zip[6,3,7][1,1,1]
lp=ä.repeat
sil=N 0 0
tev f(l,d)=(map f l,d)
h=1/2
υ=4/3
s=4e+4
sq d=ä.map(-^d)
es=sq 8 
arp8 n@(N i v)=F[][([n,ä[n⊿0%(1/8),n&7⊿(v/υ)%100]],s)]
arp8 f=arp8⇸f
hom q=ä.map(foldr((⋎).q)$sil%1)
dθ l=2*asin l/pi:dθ(abs.sin$l*1e+9)
rev ls=(\z->z id(foldr(\m sg->(\v->z(*v)(map(*0)[0..m*14349]++sg)sg)$abs(cos$(m*3)^2)-0.6)ls.take 9$dθ 1)ls)$(.lwp 3 0).zw.((+).)
lwp ω c(x:l)=c:lwp ω((x+c*ω)/(ω+1))l
lwp _ _ _=[]
hgp ω l=zw(-)l$lwp ω 0 l
lime e(x:l)
 |abs(e*x)>1,e'<-((e*8+abs(1/x))/9)=e':lime e' l
 |1>0=e:lime((e*49999+1)/5e4)l
lime _[]=[]
lim ls=zw(\a u->τ$a/9+max(-2)(min 2$a*u)/6)(map(*0)[0..500]++ls).lwp 9 0.lime 1$hgp 9 ls
zw=zipWith
τ=tanh

$ make
ghc -o bin / def0-hs def0.hs -O2 -fllvm -threaded
[1 of 1] Biên dịch Main (def0.hs, def0.o)
Liên kết bin / def0-hs ...
time sh -c 'bin -có để đánh bại tất cả các phần tử
(0mgtext + 0,3 phần
trăm + 0,3 phần trăm + 0,3 phần
trăm -ar 44.1k -ac 2 -i hsoutp.pcm hsoutp.ogg


Đây là phiên bản chưa được chỉnh sửa và nhận xét một phần: https://gist.github.com/leftaroundabout/5517198 .


Cố gắng tốt đẹp. 2970 UTF-8 byte, 2826 điểm mã. Vì nó không phải là đối thủ của phiên bản <600 python, nên có thể hướng nó tốt hơn theo hướng âm thanh / đa âm tốt hơn (ví dụ giữ nó dưới 5000 byte).
Vi.

1
@Vi. Nếu bạn coi là "độ dài của một chương trình" số byte khi UTF-8 được mã hóa thì tôi nghĩ bạn nên nói rõ điều đó trong câu hỏi. Chỉ cần làm rõ, vì một số người không sử dụng định nghĩa này (ví dụ: mọi lập trình viên APL ...)
Bakuriu

@Bakuriu Vâng, phải rồi LOL.
Soham Chowdhury

Điều đó thật điên rồ! Tôi rất thích có được một số ý tưởng làm thế nào chương trình này hoạt động.
shiona

@shiona: thực sự không quá khó hiểu, với chữ ký loại, nó đủ dễ hiểu cho bất kỳ ai quen thuộc với Haskell và DSP cơ bản.
đã ngừng quay ngược chiều

7

Python, 331 + 286 = 617 (0,548 byte mỗi ghi chú)

Giải pháp của tôi sử dụng tệp dữ liệu và tập lệnh python. Tệp dữ liệu nên được sử dụng làm đầu vào cho tập lệnh. Tôi không có phát, nhưng nó hoạt động khi tôi nhập dữ liệu dưới dạng dữ liệu thô trong Audacity với PCM 16 bit đã ký, đầu cuối nhỏ và 2 kênh.

Tệp dữ liệu là 331 byte. Đây là một kịch bản python xuất ra nó:

import sys
sys.stdout.write('\x08\x1c\x9d\xb9"\xc7\xea\xf0\xb7)\xc0D!u\x0bB~\'\x91S\xb2\x0c\xe9\xf8T;\xfd\xc13\xcf\xb9\xa6r>\xbc\xc5\xb4\xbb\xf8\xa4\x9a\x05H\xa0\x1d\x0eIq\t\\+\t\xdbn\x03\xc3&\x98\xa0\x11\xc5\xaa\xef\xbcSR^\x13\xe7\xc7\x0e\xc0\xa9^\x91Z\xfc\x02\x11\xb9\x1bE\xfc/=\xb8\xaf5<\x12\xa2\xc4\x02\xec\xdcO\xc2a\x04<Q\xfd\xe9L\xbc\xab%\xf5wX1F\xa6\x88\xddP\xfec(_#\xb4\x0bN\xba&m\xe3\xa4\x08Q\xdb\xd9\xf3<Q\xc6\xf6\x0e\xd7\xacd\x1f"g\xce\xae.\xb0\x90{|\x04\xc5X\xe6x>\xefE\xc8\xb0\xd2?N\x83?\x04\x86"a\xcc\x9b\x8fq\x9c\xce\xa2\xb6f\x9ab\x92\x9e:\xc0S\xcd\th\xb1\x87\xecT\x9d\xf4\n\xaf\xc9$`E5\xcc\xc5\xa0m\xcc\n8\xf8:\x03\xf5\x02H\xf3k\xe5\x86\xa64\x90\xa2\xc2w\xfa\xb7\xc0\x1e*2\x93\xca\x12\xe3^!\xd5yQ,LXW\xb4\x96D\x8dB\x9c`\xbf\x96`s;\xb7}\xeb\x8c\xebI\xa0o\x00\x08\xfe\xf1\xd2M3}\x8e\xd0\xda\x97\'\xca\x83-\x14\xda\xa1ET\n\xe8\xc7@\x1c\xa2a\xbb\xa7\x1b\x014\xdcz\xc7\xa6\xc4\x1d\x18\x04\r\xb1\x9e\xe3\xd0\x18<\x98`N?a\xe4\x8e\x9d\xd5\r\xe7Z[\xf4\xed\xf1PQ')

Đây là kịch bản python:

import sys
k=0
m=185
p=[]
q=[]
for c in sys.stdin.read():k=k*256+ord(c)
while k:
    v=k%m;k/=m
    if v<184:q+=[v]
    elif v-m+1:q+=p[v-184]
    else:m+=1;p+=[q];q=[]
for n in q:r=[1,2,3,4,6,8,12,15,16][n%9]*2000;sys.stdout.write(''.join(chr(int(i*1.06**(n/9)/4.3)%99)for i in range(r*3))+'\0'*r)

Lưu ý: Nếu bạn đang chạy Windows, hãy sử dụng công -utắc cho cả hai tập lệnh vì stdin và thiết bị xuất chuẩn đang xử lý dữ liệu nhị phân.


Làm tốt lắm. Xem xét 331 + 286 + 10 (để liên kết tập tin và tập lệnh) == 627.
Vi.

Bạn có thể rút ngắn một chút bằng cách sử dụng os.read/writethay vì sys.stdin/stdout.
Bakuriu

+50 cho sơ đồ nén đẹp. Sử dụng một cách tiếp cận dựa trên ngữ pháp mà không cần mã hóa entropy, tôi không thể hiểu ngắn gọn về các giá trị ghi chú mà không tính đến độ dài.
Peter Taylor

Bạn có thể mô tả cách bạn nén dữ liệu? Tôi quan tâm đến việc làm thế nào bạn có được nó rất nhỏ.
Sir_Lagsalot

1
@Sir_Lagsalot: về cơ bản nó là một từ điển lồng nhau / đệ quy, tức là bạn có các họa tiết bao gồm các ghi chú (cao độ và độ dài được mã hóa trong một số), sau đó bạn có các chủ đề chứa các họa tiết này và / hoặc các ghi chú đơn, sau đó các phần bao gồm các chủ đề, v.v. Chương trình của tôi về cơ bản sử dụng cùng một nguyên tắc (được mở rộng bằng cách hoán vị, đảo ngược, v.v.), chỉ không được nén thêm vào một tệp nhị phân chặt chẽ; Thay vào đó, tôi chỉ đơn giản thực hiện mọi định nghĩa biến cấp cao nhất.
đã ngừng quay ngược chiều

4

GolfScript (129 + 369 = 498 byte)

Cả tệp chương trình và dữ liệu đều bao gồm các ký tự không thể in được, vì vậy tôi sẽ đưa ra các biểu diễn Base64 và xxd.

Chương trình (129 byte):

MjU2YmFzZSA2OWJhc2VbMDpOXS8oNDMse1xbMSQpXS9cMiQ9Kn0vXCwpey19KyUuLDIvL3ppcHt+
TisyNSU6Tid7goqSm6SuuMPP2+j2/0FFSU1SV1xcYWdtdCc9OmY7MTc2MCosey41MD4qZioxNy8u
Li59JScnOm4rcHV0c30v

0000000: 3235 3662 6173 6520 3639 6261 7365 5b30  256base 69base[0
0000010: 3a4e 5d2f 2834 332c 7b5c 5b31 2429 5d2f  :N]/(43,{\[1$)]/
0000020: 5c32 243d 2a7d 2f5c 2c29 7b2d 7d2b 252e  \2$=*}/\,){-}+%.
0000030: 2c32 2f2f 7a69 707b 7e4e 2b32 3525 3a4e  ,2//zip{~N+25%:N
0000040: 277b 828a 929b a4ae b8c3 cfdb e8f6 ff41  '{.............A
0000050: 4549 4d52 575c 5c61 676d 7427 3d3a 663b  EIMRW\\agmt'=:f;
0000060: 3137 3630 2a2c 7b2e 3530 3e2a 662a 3137  1760*,{.50>*f*17
0000070: 2f2e 2e2e 7d25 2727 3a6e 2b70 7574 737d  /...}%'':n+puts}
0000080: 2f                                       /

Dữ liệu (369 byte):

LoDJFvCRQqNdL7+JDvjtSkX4HBS2FwgvjfdxAHrF1/DcMIBtG/g7QZBLLYHpzgaWaM1TaHwbtxG+
l1lqsL3A8nuprtpPI20YbHm3lf7NxmYNdEIMTlhwTG+TlSn802DzN3YgIwbcKbtty9gWmF2nVS55
iJHQZd4HCcokoLRwH1g2XqP8Yo5xj5/YQm9DH85obUv47mii5n+PwsoJZ6yaz4eSpGps6dQMl+Pa
YP/WC6cVDBBGs3vq5cGe51H2u7oVArFuHrsI2sHkGNYHlhWudKn5RRvJhe3sxfrtQE/MekKRuZBt
f4B9qdyss66vFipSi1zf2MXF9A/CzwvMQ/t9PEtxw8kzxxikp2Ek3kc9TiamLl+iG2vjdWp84JzY
Mg6cE+3bFI4kVdn+d1NEnBR/S9HMnksgEc9sdAcyWsbSaGjwetwGTr7UXkpKO9aHF01D2i5pCO40
/keR0+a+NsBEOXZfatpXav44AJjalywtLeWu

0000000: 2e80 c916 f091 42a3 5d2f bf89 0ef8 ed4a  ......B.]/.....J
0000010: 45f8 1c14 b617 082f 8df7 7100 7ac5 d7f0  E....../..q.z...
0000020: dc30 806d 1bf8 3b41 904b 2d81 e9ce 0696  .0.m..;A.K-.....
0000030: 68cd 5368 7c1b b711 be97 596a b0bd c0f2  h.Sh|.....Yj....
0000040: 7ba9 aeda 4f23 6d18 6c79 b795 fecd c666  {...O#m.ly.....f
0000050: 0d74 420c 4e58 704c 6f93 9529 fcd3 60f3  .tB.NXpLo..)..`.
0000060: 3776 2023 06dc 29bb 6dcb d816 985d a755  7v #..).m....].U
0000070: 2e79 8891 d065 de07 09ca 24a0 b470 1f58  .y...e....$..p.X
0000080: 365e a3fc 628e 718f 9fd8 426f 431f ce68  6^..b.q...BoC..h
0000090: 6d4b f8ee 68a2 e67f 8fc2 ca09 67ac 9acf  mK..h.......g...
00000a0: 8792 a46a 6ce9 d40c 97e3 da60 ffd6 0ba7  ...jl......`....
00000b0: 150c 1046 b37b eae5 c19e e751 f6bb ba15  ...F.{.....Q....
00000c0: 02b1 6e1e bb08 dac1 e418 d607 9615 ae74  ..n............t
00000d0: a9f9 451b c985 edec c5fa ed40 4fcc 7a42  ..E........@O.zB
00000e0: 91b9 906d 7f80 7da9 dcac b3ae af16 2a52  ...m..}.......*R
00000f0: 8b5c dfd8 c5c5 f40f c2cf 0bcc 43fb 7d3c  .\..........C.}<
0000100: 4b71 c3c9 33c7 18a4 a761 24de 473d 4e26  Kq..3....a$.G=N&
0000110: a62e 5fa2 1b6b e375 6a7c e09c d832 0e9c  .._..k.uj|...2..
0000120: 13ed db14 8e24 55d9 fe77 5344 9c14 7f4b  .....$U..wSD...K
0000130: d1cc 9e4b 2011 cf6c 7407 325a c6d2 6868  ...K ..lt.2Z..hh
0000140: f07a dc06 4ebe d45e 4a4a 3bd6 8717 4d43  .z..N..^JJ;...MC
0000150: da2e 6908 ee34 fe47 91d3 e6be 36c0 4439  ..i..4.G....6.D9
0000160: 765f 6ada 576a fe38 0098 da97 2c2d 2de5  v_j.Wj.8....,--.
0000170: ae                                       .

Giải trình

Tôi đã chuyển số điểm được cung cấp (đã cập nhật) (nhiều hơn về sau) thành một chuỗi chứa các byte có giá trị từ 0 đến 24. Độ dài ghi chú đến trước; sau đó là các giá trị ghi chú, đại diện cho mod 25 và được mã hóa chênh lệch. Lý do cho mã hóa khác biệt là để các đoạn được lặp lại trong chuyển vị sẽ được giảm xuống cùng một chuỗi và có thể được nén.

Sau đó, tôi đã chạy nó thông qua một chương trình nén chuỗi-to-GolfScript mà tôi đã đề cập trước đó (và tôi đã cải thiện để có thể cạnh tranh trong môn golf này) để lấy tệp dữ liệu, được giải nén bởi phần đầu tiên của chương trình:

256base 69base[0:N]/(43,{\[1$)]/\2$=*}/\,){-}+%

Đó là một bản mở rộng ngữ pháp đơn giản thuộc loại quen thuộc với bất kỳ ai nhìn vào nhiều câu hỏi được gắn thẻ .

Sau đó tôi chia chuỗi này thành các cặp [length note]và lặp qua các cặp. Các ký tự không in được đến từ một chuỗi ma thuật chứa các tham số tần số cho các ghi chú: Tôi đang sử dụng mod 256 cắt ngắn ẩn của GolfScript được chuyển đổi thành chuỗi để tạo ra sóng tam giác *, vì vậy tần số cơ bản là 22050/256 Hz. Tôi đã viết một chương trình để tìm các tỷ số nguyên cho phép điều chỉnh tốt; chuỗi ma thuật chứa các tử số và mẫu số 17 giống nhau cho tất cả các ghi chú. Các lỗi điều chỉnh trung bình là khoảng 3,4 cent.

Độ dài ghi chú được thể hiện như là, và hợp lý hơn nhiều so với phiên bản trước của điểm số. Như tôi nghi ngờ, việc làm tròn đã làm tăng sự dư thừa trong chuỗi và rút ngắn tệp dữ liệu nén thêm 30 byte, chưa kể đến việc lưu mảng tra cứu. Tuy nhiên, vẫn còn một số đoạn mà tôi thấy nghi ngờ:

72 13

hoặc là

71 9
69 2
71 2

đưa ra các thanh dài hơn một phần sáu so với các thanh còn lại trong điểm và

85 9
85 4
85 24
85 23

hoặc là

83 18
88 7
85 24
85 23

là một số lượng không thể thiếu của các thanh, nhưng với một số độ lệch đáng ngờ.

Chương trình có thể ngắn hơn một chút. Tôi đã cố tình chọn giao dịch trong thời gian ngắn để thực hiện. Với một số cải tiến về tốc độ cho trình thông dịch GolfScript mà tôi đã gửi cho Darren Smith và tôi tin rằng anh ấy dự định sẽ xuất bản vào một lúc nào đó, phiên bản hiện tại chạy trong chưa đầy 15 phút trên máy tính của tôi. Nếu tôi không putsghi chú sau khi tạo nó thì nó sẽ chạy chậm hơn nhiều.

* Tôi xin thú nhận rằng nhận xét của tôi về mọi người sử dụng sóng vuông là sai.


Làm thế nào để chạy GolfScript đúng cách? Tôi thử base64 -d <<< 'MjU2Y.....9Lw==' | chơi golf và nó nói golfscript:405:in 'scan': invalid byte sequence in UTF-8 (ArgumentError)(tương tự nếu tôi lưu chương trình vào tập tin, tất nhiên)
Vi.

Lưu ý độ dài được trích xuất từ ​​tệp MIDI bằng thuật toán thô (xem bình luận cho play.pl). Tôi sẽ sửa các độ dài ghi chú để được lành mạnh.
Vi.

Cập nhật ý chính. Bây giờ độ dài tối thiểu của ghi chú là 1.
Vi.

Nếu tôi cố chạy bằng trình thông dịch trực tuyến (mã được chèn trông như thế nào 㔲戶獡⁥㌷慢敳せ为⽝㐨ⰴ屻ㅛ⤤⽝㉜㴤紪尯⤬⵻⭽⸥㈬⼯楺筰乾㈫┵为笧誂鮒꺤쎸��䇿䥅前屗慜浧❴㨽㭦∩ĦĂ༃ጔ؏༆ณؕḧ⸘研��⒖✏㰢⭻⩽㐴Ⱚ⹻〵⨾⩦㜱ⸯ⸮╽✧渺瀫瑵絳/), tôi nhận được undefined method class_id 'cho nil: NilClass`
Vi.

1
Và không có cách nào nó sẽ chạy trong trình thông dịch trực tuyến - điều đó sẽ hết thời gian.
Peter Taylor

2

Mã máy x86 - 513 byte

Điều này không hoàn toàn đáp ứng thách thức, vì thay vì xuất ra một định dạng phù hợp để đưa vào chơi, nó chơi midi.

Tệp .COM có thể thực thi và mã nguồn asm - Có thể mất tới 14 giây để nhạc bắt đầu. Nó cũng sẽ phát chậm một chút, vì độ phân giải của bộ đếm thời gian là 1/18 giây.

Âm nhạc được mã hóa ở 375 byte bằng cách sử dụng mã hóa Fibonacci và một từ điển bao gồm âm nhạc được giải mã trước đó.

Thuật toán giải mã mã giả:

store_pos=0;
if ( !readBit() ){
    note = FibonacciDecode() + 63;
    time = FibonacciDecode();
    store(note, time);
    store_pos++;
} else {
    pos = FibonacciDecode();
    run = FibonacciDecode();
    copy(store_pos-pos,store_pos,run);
    store_pos+=run;
}

Sau khi âm nhạc được giải mã, việc đưa nó ra cổng Midi là một vấn đề đơn giản.


1
Nó dựa vào bộ tổng hợp hiện có (MIDI bên trong card âm thanh trong trường hợp này) thay vì cung cấp nó.
Vi.

Bạn có thể hack trình tổng hợp và làm cho nó xuất các mẫu tới cổng tương ứng hoặc tới thiết bị xuất chuẩn / tệp (sử dụng các tòa nhà của DOS hoặc Linux). Như một thử thách riêng biệt, bạn có thể tạo một phiên bản với MIDI đa âm hoàn chỉnh (vẫn có nén vào tệp COM).
Vi.

Tôi chỉ quan tâm đến khía cạnh 'âm nhạc Mozart nhỏ gọn' của thử thách, chứ không phải tổng hợp. Tôi đang đăng bài này vì nó thú vị và nên thú vị với người khác hơn là để chiến thắng thử thách.
Sir_Lagsalot

ĐỒNG Ý. Đang chờ phiên bản Arduino ...
Vi.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.