Golf Mozart - mini “Rondo”


13

Keluarkan "Mozart - Alla Turca" ke stdout (lihat contoh untuk "implementasi referensi")

Cobalah temukan cara mengemas synthesizer dan musik ke dalam ukuran minimal.

Persyaratan:

  • Format yang cocok untuk dimasukkan ke dalam aplay -f cd(ditandatangani endian 16-bit, 2 saluran);
  • Seluruh musik harus dimainkan (tanpa catatan atau bagian yang dilompati, setidaknya tidak kurang dari dalam program sampel), polifoni tidak diperlukan;
  • Tidak bisa begitu saja menelepon /usr/bin/timidity, /usr/bin/soxatau sesuatu seperti itu (misalnya perlu menginstal modul musik khusus);
  • Tidak dapat mengakses jaringan atau menganggap bahwa musik tersedia secara lokal;

"Implementasi referensi" dengan skor parsable: https://gist.github.com/vi/5478693
(Program Perl sampel lama: https://gist.github.com/vi/5447962 )


Apakah Anda memiliki tautan ke lembaran musik?
beary605

Tidak saat ini, saya mengetik program sampel dengan mendengarkan dan coba-coba. Sekarang mencari ...
Vi.

Sebagai contoh, ini .
Vi.

Juga, saya menganggap Anda sudah menyadari hal ini, tetapi semua orang akan menggunakan gelombang persegi.
Peter Taylor

2
Catatan: pengaturan dalam skor tertaut sangat tidak berguna bagi siapa pun yang mencoba menerapkan ini hanya dengan satu suara. Saya telah mengunduh berbagai file MIDI dan mereka tidak menyetujui semua catatan - mereka dapat berada di tombol yang sama, tetapi tidak setuju pada beberapa catatan dengan 4 semitone! Untuk membuat ini masalah yang ditentukan dengan baik, itu benar-benar membutuhkan skor kanonik tunggal (lebih disukai dalam beberapa format yang mudah diurai, sehingga pelaksana dapat mengonversinya menjadi format yang nyaman untuk implementasi mereka tanpa memperkenalkan kesalahan transkripsi).
Peter Taylor

Jawaban:


11

Polifonik, Haskell, 2826 3177 4719

Output audio: https://www.dropbox.com/s/nba6489tfet740r/hs-golf-turca.ogg

Fitur:

  • Semua catatan dari tangan kanan . Tentu saja saya bisa menambahkan tangan kiri juga (melakukan itu).
  • Artikulasi yang tepat dari catatan staccato dll.
  • Suara yang cukup bagus dengan dinamika. Bukan hanya modulasi volume yang sederhana, tetapi juga morphing karakter serangan dan konten nada yang tepat,seperti kamu bermain piano sungguhansebenarnya, agak lebih ... hei bagian ini seharusnya meniru band Janissary Turki , kan?
  • Berkumandang. Kedengarannya tidak luar biasa hebat, tapi juga tidak terlalu buruk.
  • Kompresi dinamis. Jangan tanya ...
  • Dithering dari output. Ini agak konyol: dengan resolusi 16-bit yang tepat, hampir tidak ada orang yang akan mendengar artefak quantisation, tetapi untuk menghindari termasuk perpustakaan biner , saya secara efektif hanya menggunakan resolusi 7-bit, yang dapat saya bahas dengan output ASCII. Gentar itu sendiri agak keras, tidak ada suara ...
  • Perhitungan multithreaded akord polifonik.

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] Kompilasi Main (def0.hs, def0.o)
Menghubungkan bin / def0-hs ...
time sh -c 'bin / def0-hs + RTS -N4> hsoutp.pcm '
189.39user 138.41sistem 2: 06.62menghapus CPU 258% (0avgtext + 0avgdata 6440240maxresident) k
0inputs + 0outputs (0major + 403037minor)
kesalahanfilejaga -ar 44.1k -ac 2 -i hsoutp.pcm hsoutp.ogg


Berikut ini adalah versi yang sebagian tidak diklik dan dikomentari: https://gist.github.com/leftaroundabout/5517198 .


Usaha yang bagus. 2970 UTF-8 byte, 2826 poin kode. Karena ini bukan pesaing untuk <600 versi python, bisa lebih baik diarahkan ke suara / polifoni yang lebih bagus (menyimpannya di bawah 5.000 byte, misalnya).
Vi.

1
@ Vi. Jika Anda menganggap sebagai "panjang program" jumlah byte ketika UTF-8 dikodekan maka saya pikir Anda harus menyatakan itu dalam pertanyaan. Hanya untuk memperjelas, karena beberapa orang tidak menggunakan definisi ini (mis. Setiap programmer APL ...)
Bakuriu

@ Bakuriu Ya, benar LOL.
Soham Chowdhury

Itu gila! Saya ingin sekali mengetahui bagaimana program ini bekerja.
shiona

@shiona: sebenarnya tidak terlalu membingungkan, dengan tipe tanda tangan itu harus cukup mudah dimengerti bagi siapa pun yang akrab dengan Haskell dan DSP dasar.
Berhenti menghidupkan counterclock

7

Python, 331 + 286 = 617 (0,548 byte per not)

Solusi saya menggunakan file data dan skrip python. File data harus digunakan sebagai input ke skrip. Saya tidak memiliki aplay, tetapi berfungsi ketika saya mengimpornya sebagai data mentah dalam Audacity dengan PCM 16-bit, little-endian, dan 2 saluran yang ditandatangani.

File data adalah 331 byte. Berikut skrip python yang menampilkannya:

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')

Berikut skrip 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)

Catatan: Jika Anda menjalankan Windows, gunakan -usakelar untuk kedua skrip karena stdin dan stdout berurusan dengan data biner.


Kerja bagus. Mempertimbangkan 331 + 286 + 10 (untuk menyatukan file dan skrip) == 627.
Vi.

Anda dapat mempersingkat sedikit menggunakan os.read/writebukan sys.stdin/stdout.
Bakuriu

+50 untuk skema kompresi yang indah. Menggunakan pendekatan berbasis tata bahasa tanpa pengkodean entropi saya tidak bisa mendapatkan yang singkat hanya pada nilai catatan, tanpa memperhitungkan panjangnya.
Peter Taylor

Bisakah Anda jelaskan bagaimana Anda mengompres data? Saya tertarik mengetahui bagaimana Anda mendapatkannya sangat kecil.
Sir_Lagsalot

1
@ Sir_Lagsalot: pada dasarnya kamus bersarang / berulang, yaitu Anda memiliki motif yang terdiri dari catatan (pitch dan panjang dikodekan dalam satu nomor), maka Anda memiliki tema yang berisi motif-motif ini dan / atau catatan tunggal, kemudian bagian-bagian yang terdiri dari tema dll. Program saya pada dasarnya menggunakan prinsip yang sama (diperluas dengan transposisi, inversi dll.), Hanya saja tidak dikompresi lebih lanjut menjadi file biner yang ketat; Saya hanya membuat semuanya definisi variabel tingkat atas.
lagi mengaktifkan counterclock

4

GolfScript (129 + 369 = 498 bytes)

Baik program dan file data termasuk karakter yang tidak diinginkan, jadi saya akan memberikan representasi Base64 dan xxd.

Program (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                                       /

Data (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                                       .

Penjelasan

Saya telah mengubah skor yang disediakan (diperbarui) (lebih lanjut tentang itu nanti) ke dalam string tunggal yang berisi byte dengan nilai dari 0 hingga 24. Panjang nada datang lebih dulu; kemudian nilai not, diwakili mod 25 dan perbedaan-disandikan. Alasan untuk pengkodean perbedaan adalah agar bagian-bagian yang diulang dalam transposisi akan dikurangi ke urutan yang sama dan dapat dikompresi.

Saya kemudian menjalankan ini melalui program kompresi string-ke-GolfScript yang telah saya sebutkan sebelumnya (dan yang saya tingkatkan agar dapat bersaing dalam golf ini) untuk mendapatkan file data, yang didekompresi oleh bagian pertama dari program:

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

Ini adalah perluasan tata bahasa sederhana dari tipe yang akrab bagi siapa saja yang melihat banyak pertanyaan .

Saya kemudian membagi string ini menjadi berpasangan [length note]dan beralih melalui pasangan. Karakter yang tidak dapat dicetak berasal dari string ajaib yang berisi parameter frekuensi untuk catatan: Saya menggunakan mod pemotongan GolfScript 256 256 array integer yang dikonversi ke string untuk menghasilkan gelombang segitiga *, sehingga frekuensi dasar adalah 22050/256 Hz. Saya menulis sebuah program untuk menemukan rasio integer yang memberikan penyesuaian yang baik; string ajaib berisi pembilang, dan penyebut 17 adalah sama untuk semua catatan. Kesalahan penyetelan rata-rata adalah sekitar 3,4 sen.

Panjang not direpresentasikan seperti apa adanya, dan jauh lebih masuk akal daripada versi skor sebelumnya. Seperti yang saya duga, pembulatan telah meningkatkan redundansi dalam string dan memperpendek file data terkompresi sebesar 30 byte, belum lagi menyimpan array pencarian. Namun, masih ada beberapa bagian yang saya anggap mencurigakan:

72 13

atau

71 9
69 2
71 2

berikan bilah yang merupakan keenam dari kaitan yang lebih panjang dari bilah lainnya dalam skor, dan

85 9
85 4
85 24
85 23

atau

83 18
88 7
85 24
85 23

adalah jumlah integral dari bar, tetapi dengan beberapa offset yang meragukan.

Program bisa sedikit lebih pendek. Saya sengaja memilih untuk berdagang pendek untuk waktu eksekusi. Dengan beberapa peningkatan kecepatan pada juru bahasa GolfScript yang telah saya kirimkan ke Darren Smith dan yang saya yakin dia berencana untuk menerbitkan di beberapa titik, versi saat ini berjalan dalam waktu kurang dari 15 menit di komputer saya. Jika saya tidak putssetiap catatan setelah menghasilkannya maka itu berjalan jauh lebih lambat.

* Saya dengan ini mengakui bahwa komentar saya tentang semua orang yang menggunakan gelombang persegi salah.


Bagaimana cara menjalankan GolfScript dengan benar? Saya mencoba base64 -d <<< 'MjU2Y.....9Lw==' | golfscript dan dikatakan golfscript:405:in 'scan': invalid byte sequence in UTF-8 (ArgumentError)(sama jika saya menyimpan program ke file, tentu saja)
Vi.

Panjang catatan diekstraksi dari file MIDI menggunakan algoritma mentah (lihat komentar ke play.pl). Saya akan memperbaiki panjang catatan menjadi waras.
Vi.

Diperbarui intinya. Sekarang panjang minimal catatannya adalah 1.
Vi.

Jika saya mencoba menjalankan menggunakan interpreter online (seperti kode yang dimasukkan 㔲戶獡⁥㌷慢敳せ为⽝㐨ⰴ屻ㅛ⤤⽝㉜㴤紪尯⤬⵻⭽⸥㈬⼯楺筰乾㈫┵为笧誂鮒꺤쎸��䇿䥅前屗慜浧❴㨽㭦∩ĦĂ༃ጔ؏༆ณؕḧ⸘研��⒖✏㰢⭻⩽㐴Ⱚ⹻〵⨾⩦㜱ⸯ⸮╽✧渺瀫瑵絳/), saya mendapatkan undefined method class_id 'untuk nil: NilClass`
Vi.

1
Dan tidak mungkin itu akan berjalan dalam penerjemah online - itu akan habis waktu.
Peter Taylor

2

Kode Mesin x86 - 513 Bytes

Ini tidak sepenuhnya memenuhi tantangan, karena alih-alih menghasilkan dalam format yang cocok untuk dimasukkan ke dalam aplay, ia memainkan midi.

File .COM dan kode sumber asm yang dapat dieksekusi - Diperlukan waktu hingga 14 detik untuk memulai musik. Ini juga akan bermain agak lambat, karena resolusi timer 1/18 detik.

Musik dikodekan dalam 375 byte menggunakan Fibonacci coding dan kamus yang terdiri dari musik yang sebelumnya diterjemahkan.

Algoritma Penguraian Kode Pseudocode:

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;
}

Setelah musik diterjemahkan, itu adalah masalah sederhana untuk mengeluarkannya ke port Midi.


1
Itu bergantung pada synthesizer yang ada (MIDI di dalam kartu audio dalam kasus ini) alih-alih menyediakan itu sendiri.
Vi.

Anda dapat meretas synthesizer dan membuat sampel keluaran ke port masing-masing atau ke stdout / file (menggunakan DOS atau Linux syscalls). Sebagai tantangan terpisah, Anda dapat membuat versi dengan MIDI polifonik yang lengkap (masih dengan kompresi menjadi file COM tunggal).
Vi.

Saya hanya tertarik pada aspek 'musik Mozart ringkas' dari tantangan, bukan synthesizer. Saya memposting ini karena ini menyenangkan dan harus menarik bagi orang lain daripada untuk memenangkan tantangan.
Sir_Lagsalot

BAIK. Menunggu versi Arduino ...
Vi.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.