Mozart golf - mini „Rondo”

13

Wyjście „Mozart - Alla Turca” na standardowe wyjście (patrz przykład dla „referencyjnego wdrożenia”)

Spróbuj znaleźć, jak spakować zarówno syntezator, jak i muzykę do minimalnego rozmiaru.

Wymagania:

  • Format odpowiedni do wprowadzania aplay -f cd(podpisany 16-bitowy mały endian, 2 kanały);
  • Należy odtwarzać całą muzykę (bez pomijanych nut lub partii, przynajmniej nie mniej niż w programie przykładowym), jednak polifonia nie jest wymagana;
  • Nie można po prostu zadzwonić /usr/bin/timidity, /usr/bin/soxlub coś w tym rodzaju (np wymagać zainstalowania specjalnego modułu muzycznego);
  • Nie można uzyskać dostępu do sieci lub założyć, że muzyka jest dostępna lokalnie;

„Implementacja referencyjna” z możliwym do przetworzenia wynikiem: https://gist.github.com/vi/5478693
(Stary przykładowy program Perl: https://gist.github.com/vi/5447962 )

Vi.
źródło
Czy masz link do nuty?
beary605
Nie, obecnie pisałem przykładowy program, nasłuchując, próbując i popełniając błędy. Teraz szukam ...
Vi.
Na przykład to .
Vi.
Zakładam też, że już to zauważyłeś, ale wszyscy będą używać fal prostokątnych.
Peter Taylor
2
Uwaga: układ w połączonej partyturze jest dość bezużyteczny dla każdego, kto próbuje to zaimplementować tylko jednym głosem. Pobrałem różne pliki MIDI i nie są one zgodne co do wszystkich nut - mogą być w tym samym tonie, ale nie zgadzają się w przypadku niektórych nut o 4 półtonach! Aby ten problem był dobrze określony, naprawdę potrzebuje pojedynczego wyniku kanonicznego (najlepiej w jakimś łatwym do przeanalizowania formacie, aby implementatorzy mogli przekonwertować go na format wygodny dla ich implementacji bez wprowadzania błędów transkrypcji).
Peter Taylor

Odpowiedzi:

11

Polifoniczny, Haskell, 2826 3177 4719

Wyjście audio: https://www.dropbox.com/s/nba6489tfet740r/hs-golf-turca.ogg

Cechy:

  • Wszystkie notatki z prawej ręki . Oczywiście mógłbym również dodać lewą rękę (skończone).
  • Prawidłowa artykulacja nut staccato itp.
  • Dość ładny dźwięk z dynamiką. Nie tylko zwykła modulacja głośności, ale także odpowiednie przekształcenie postaci ataku i zawartości nadtonu,jak na prawdziwym pianiniewłaściwie bardziej ... hej, ten utwór ma naśladować tureckie zespoły Janissary , prawda?
  • Pogłos Nie brzmi niesamowicie świetnie, ale też nie jest tak źle.
  • Kompresja dynamiczna. Nie pytaj ...
  • Dithering wyniku. Jest to trochę śmieszne: przy odpowiedniej 16-bitowej rozdzielczości prawie nikt nie słyszałby artefaktów kwantyzacji, ale aby uniknąć dołączenia biblioteki binarnej , skutecznie używam tylko 7-bitowej rozdzielczości, którą mogę pokryć wyjściem ASCII. Sam dither jest raczej głośny, nie kształtuje hałasu ...
  • Wielowątkowe obliczanie akordów polifonicznych.

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] Kompilowanie Main (def0.hs, def0.o)
Łączenie bin / def0-hs ...
time sh -c 'bin / def0-hs + RTS -N4> hsoutp.pcm '
189.39user 138.41system 2: 06.62 upłynął 258% CPU (0avgtext + 0avgdata 6440240maxresident) k 0
wejść + 0 wyjść (0major + 403037minor) pagefault-svl-ffs -fs-ffl-ff-svl
-fffs -ar 44,1k -ac 2 -i hsoutp.pcm hsoutp.ogg


Oto częściowo nieoznaczona i skomentowana wersja: https://gist.github.com/leftaroundabout/5517198 .

przestał się obracać w lewo
źródło
Niezła próba. 2970 bajtów UTF-8, 2826 punktów kodowych. Ponieważ nie jest konkurentem dla wersji <600 python, może być lepiej ukierunkowany na ładniejszy dźwięk / polifonię (na przykład utrzymując go poniżej 5000 bajtów).
Vi.
1
@Vi. Jeśli weźmiesz pod uwagę „długość programu” liczbę bajtów w kodowaniu UTF-8, myślę, że powinieneś podać to w pytaniu. Żeby było jasne, ponieważ niektórzy ludzie nie używają tej definicji (np. Każdy programista APL ...)
Bakuriu 26.04.2013
@ Bakuriu Tak, prawy LOL.
Soham Chowdhury
To było szalone! Chciałbym dowiedzieć się, jak działa ten program.
shiona
@shiona: w rzeczywistości nie jest to tak zaciemnione, z podpisami typu powinno być łatwe do zrozumienia dla każdego, kto zna Haskell i podstawowe DSP.
przestał się obracać w lewo
7

Python, 331 + 286 = 617 (0,548 bajtów na notatkę)

Moje rozwiązanie wykorzystuje plik danych i skrypt Pythona. Plik danych powinien zostać wykorzystany jako dane wejściowe do skryptu. Nie mam aplikacji, ale działa, gdy importuję ją jako surowe dane w Audacity z podpisanym 16-bitowym PCM, little-endian i 2 kanałami.

Plik danych ma 331 bajtów. Oto skrypt Pythona, który go wyprowadza:

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

Oto skrypt Pythona:

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)

Uwaga: Jeśli używasz systemu Windows, użyj -uprzełącznika dla obu skryptów, ponieważ stdin i stdout zajmują się danymi binarnymi.

pudełko kartonowe
źródło
Dobra robota. Biorąc pod uwagę 331 + 286 + 10 (do powiązania pliku i skryptu) == 627.
Vi.
Możesz nieco skrócić, używając os.read/writezamiast sys.stdin/stdout.
Bakuriu
+50 za piękny schemat kompresji. Używając podejścia opartego na gramatyce bez kodowania entropijnego, nie mogę tego streścić tylko na wartościach nut, bez uwzględnienia długości.
Peter Taylor
Czy możesz opisać, w jaki sposób skompresowałeś dane? Chcę wiedzieć, skąd masz tak mały.
Sir_Lagsalot
1
@ Sir_Lagsalot: jest to w zasadzie słownik zagnieżdżony / rekurencyjny, tzn. Masz motywy składające się z nut (wysokość i długość zakodowane w jednym numerze), następnie masz motywy zawierające te motywy i / lub pojedyncze nuty, następnie części składające się z motywów itp. Mój program używa zasadniczo tej samej zasady (rozszerzonej o transpozycje, inwersje itp.), Po prostu nie jest dalej kompresowany w ciasny plik binarny; Zamiast tego stworzyłem wszystkie definicje zmiennych najwyższego poziomu.
przestał się obracać w lewo
4

GolfScript (129 + 369 = 498 bajtów)

Zarówno program, jak i plik danych zawierają znaki niedrukowalne, więc przedstawię reprezentacje Base64 i xxd.

Program (129 bajtów):

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                                       /

Dane (369 bajtów):

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  [email protected]
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                                       .

Wyjaśnienie

Przekształciłem (zaktualizowaną) partyturę (więcej na ten temat później) w pojedynczy ciąg zawierający bajty o wartościach od 0 do 24. Długości nut są najważniejsze; następnie wartości nut, reprezentowane przez mod 25 i zakodowane różnicowo. Przyczyną kodowania różnicowego jest to, że fragmenty powtarzane w transpozycji zostaną zredukowane do tej samej sekwencji i mogą zostać skompresowane.

Następnie uruchomiłem to przez program do kompresji ciągów znaków do GolfScript, o którym wspomniałem wcześniej (i który poprawiłem, aby być konkurencyjnym w tym golfie), aby uzyskać plik danych, który jest dekompresowany przez pierwszą część programu:

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

Jest to proste rozszerzenie gramatyczne tego typu, które jest znane każdemu, kto spojrzał na wiele pytań oznaczonych .

Następnie podzielę ten ciąg na pary [length note]i iteruję po parach. Znaki niedrukowalne pochodzą z magicznego ciągu znaków zawierającego parametry częstotliwości notatek: używam domyślnego skrótu GolfScript mod 256 tablic liczb całkowitych, które są konwertowane na ciągi, aby utworzyć falę trójkąta *, więc częstotliwość podstawowa wynosi 22050/256 Hz Napisałem program do znalezienia współczynników całkowitych, które dają dobre dostrojenie; magiczny ciąg zawiera liczniki, a mianownik 17 jest taki sam dla wszystkich nut. Średni błąd strojenia wynosi około 3,4 centa.

Długości nut są przedstawiane w postaci, w jakiej są, i są znacznie bardziej prawdopodobne niż poprzednia wersja partytury. Jak podejrzewałem, zaokrąglanie zwiększyło nadmiarowość ciągu i skróciło skompresowany plik danych o 30 bajtów, nie mówiąc już o zapisaniu tablicy odnośników. Jednak nadal istnieją pewne fragmenty, które uważam za podejrzane:

72 13

lub

71 9
69 2
71 2

dać słupki, które są szóstą szydełka dłuższe niż reszta słupków w partyturze, i

85 9
85 4
85 24
85 23

lub

83 18
88 7
85 24
85 23

są całkowitą liczbą taktów, ale z pewnymi wątpliwymi przesunięciami.

Program może być nieco krótszy. Celowo wybrałem krótką wymianę na czas realizacji. Z pewnymi poprawkami szybkości interpretera GolfScript, które przesłałem Darrenowi Smithowi i które, jak sądzę, planuje opublikować w pewnym momencie, obecna wersja działa na moim komputerze w mniej niż 15 minut. Jeśli nie putswygeneruję każdej nuty po wygenerowaniu, to działa znacznie wolniej.

* Wyznaję, że mój komentarz na temat wszystkich osób korzystających z fal prostokątnych był błędny.

Peter Taylor
źródło
Jak poprawnie uruchomić GolfScript? Próbuję base64 -d <<< 'MjU2Y.....9Lw==' | golfscript i mówi golfscript:405:in 'scan': invalid byte sequence in UTF-8 (ArgumentError)(to samo, jeśli zapisuję program do pliku, oczywiście)
Vi.
Długości nut są wydobywane z pliku MIDI przy użyciu surowego algorytmu (patrz komentarz do play.pl). Naprawię długości nut, żeby były rozsądne.
Vi.
Zaktualizowano istotę. Teraz minimalna długość nuty wynosi 1.
Vi.
Jeśli spróbuję uruchomić przy użyciu interpretera online (wstawiony kod wygląda 㔲戶獡⁥㌷慢敳せ为⽝㐨ⰴ屻ㅛ⤤⽝㉜㴤紪尯⤬⵻⭽⸥㈬⼯楺筰乾㈫┵为笧誂鮒꺤쎸��䇿䥅前屗慜浧❴㨽㭦∩ĦĂ༃ጔ؏༆ณؕḧ⸘研��⒖✏㰢⭻⩽㐴Ⱚ⹻〵⨾⩦㜱ⸯ⸮╽✧渺瀫瑵絳/), dostaję undefined method class_id 'na zero: NilClass`
Vi.
1
I nie ma mowy, żeby działał w tłumaczu online - to się skończy.
Peter Taylor
2

Kod maszynowy x86 - 513 bajtów

To nie do końca spełnia wyzwanie, ponieważ zamiast wyświetlać w formacie odpowiednim do wprowadzenia do gry, gra midi.

Plik wykonywalny .COM i kod źródłowy asm - uruchomienie muzyki może potrwać do 14 sekund. Będzie również odtwarzać trochę wolniej, ponieważ rozdzielczość timera wynosi 1/18 sekundy.

Muzyka jest kodowana w 375 bajtach przy użyciu kodowania Fibonacciego i słownika złożonego z wcześniej zdekodowanej muzyki.

Algorytm dekodowania pseudokodu:

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

Po odkodowaniu muzyki, wystarczy wysłać ją do portu Midi.

Sir_Lagsalot
źródło
1
Opiera się na istniejącym syntezatorze (w tym przypadku MIDI wewnątrz karty dźwiękowej) zamiast na własnym.
Vi.
Możesz zhakować syntezator i zmusić go do wysyłania próbek do odpowiedniego portu lub do standardowego wejścia / pliku (przy użyciu wywołań systemowych DOS lub Linux). Jako osobne wyzwanie możesz stworzyć wersję z pełnoprawnym polifonicznym MIDI (wciąż z kompresją do pojedynczego pliku COM).
Vi.
Interesuje mnie tylko aspekt „kompaktowej muzyki Mozarta”, a nie syntezator. Publikuję to, ponieważ jest zabawne i powinno być interesujące dla innych, a nie dla wygrania wyzwania.
Sir_Lagsalot
DOBRZE. Czekam na wersję Arduino ...
Vi.