Mozart golf - mini "Rondo"


13

Output "Mozart - Alla Turca" su stdout (vedere l'esempio per "implementazione di riferimento")

Prova a scoprire come impacchettare sia il sintetizzatore che la musica in dimensioni minime.

Requisiti:

  • Formato adatto all'alimentazione aplay -f cd(little endian a 16 bit con segno, 2 canali);
  • L'intera musica dovrebbe essere riprodotta (nessuna nota o parte saltata, almeno non inferiore a quella del programma di esempio), tuttavia la polifonia non è richiesta;
  • Non può chiamare /usr/bin/timidity, /usr/bin/soxo qualcosa del genere (ad esempio, richiede l'installazione di un modulo di musica speciale);
  • Impossibile accedere alla rete o supporre che la musica sia disponibile localmente;

"Implementazione di riferimento" con punteggio analizzabile: https://gist.github.com/vi/5478693
(Vecchio programma Perl di esempio: https://gist.github.com/vi/5447962 )


Hai un link agli spartiti?
beary605

No, al momento stavo scrivendo il programma di esempio ascoltando, prova ed errore. Ora cerco ...
Vi.

Ad esempio, questo .
Vi.

Inoltre, suppongo che tu l'abbia già capito, ma tutti useranno le onde quadrate.
Peter Taylor,

2
Nota: la disposizione nella partitura collegata è piuttosto inutile per chiunque cerchi di implementarla con una sola voce. Ho scaricato vari file MIDI e non sono d'accordo su tutte le note: possono essere nella stessa chiave, ma non sono d'accordo su alcune note di 4 semitoni! Per rendere questo un problema ben specificato ha davvero bisogno di un singolo punteggio canonico (preferibilmente in un formato facilmente analizzabile, in modo che gli implementatori possano convertirlo in un formato conveniente per la loro implementazione senza introdurre errori di trascrizione).
Peter Taylor,

Risposte:


11

Polifonico, Haskell, 2826 3177 4719

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

Caratteristiche:

  • Tutte le note dalla mano destra . Ovviamente potrei aggiungere anche la mano sinistra (Fatto).
  • Corretta articolazione delle note staccato ecc.
  • Suono ragionevolmente bello con dinamica. Non solo una semplice modulazione del volume, ma una corretta trasformazione del personaggio dell'attacco e del contenuto di sfumature,come se prendessi un vero pianofortein realtà, piuttosto di più ... ehi, questo pezzo dovrebbe imitare le band del Janissary turco , giusto?
  • Reverb. Non suona incredibilmente bene, ma neanche tanto male.
  • Compressione dinamica. Non chiedere ...
  • Dithering dell'output. Questo è un po 'ridicolo: con una corretta risoluzione a 16 bit, quasi nessuno ascolterebbe gli artefatti di quantizzazione, ma per evitare di includere la libreria binaria , uso effettivamente solo una risoluzione a 7 bit, che posso coprire con l'uscita ASCII. La dithith stessa è piuttosto rumorosa, senza rumore ...
  • Calcolo multithread di accordi polifonici.

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 di 1] Compilazione principale (def0.hs, def0.o)
Bin di collegamento / def0-hs ...
time sh -c 'bin / def0-hs + RTS -N4> hsoutp.pcm '
189.39utente 138.41sistema 2: 06.62 CPU 258% (0avgtext + 0avgdata 6440240maxresident) k
0inputs + 0outputs (0major + 403037minor) pagefaults 0s-
swfleffegic -fvel -ar 44.1k -ac 2 -i hsoutp.pcm hsoutp.ogg


Ecco una versione parzialmente non golfata e commentata: https://gist.github.com/leftaroundabout/5517198 .


Bel tentativo. 2970 UTF-8 byte, 2826 punti di codice. Poiché non è un concorrente per una versione <600 python, potrebbe essere meglio orientato verso un suono / polifonia più gradevole (mantenendolo ad esempio sotto i 5000 byte).
Vi.

1
@Vi. Se consideri come "lunghezza di un programma" il numero di byte quando codificato UTF-8, penso che dovresti affermarlo nella domanda. Giusto per chiarire, dal momento che alcune persone non usano questa definizione (ad esempio ogni programmatore APL ...)
Bakuriu,

@Bakuriu Sì, giusto LOL.
Soham Chowdhury,

È stato folle! Mi piacerebbe avere un'idea di come funziona questo programma.
shiona,

@shiona: in realtà non è così offuscato, con le firme dei tipi dovrebbe essere abbastanza facile da capire per chiunque abbia familiarità con Haskell e DSP di base.
cessò di girare in senso antiorario

7

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

La mia soluzione utilizza un file di dati e uno script Python. Il file di dati deve essere utilizzato come input per lo script. Non ho aplay, ma funziona quando lo importa come dati non elaborati in Audacity con PCM a 16 bit firmato, little-endian e 2 canali.

Il file di dati è di 331 byte. Ecco uno script Python che lo genera:

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

Ecco lo script di 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)

Nota: se si esegue Windows, utilizzare l' -uopzione per entrambi gli script poiché stdin e stdout si occupano di dati binari.


Buon lavoro. Considerando 331 + 286 + 10 (per legare insieme il file e lo script) == 627.
Vi.

Puoi accorciare un po 'usando os.read/writeinvece di sys.stdin/stdout.
Bakuriu,

+50 per il bellissimo schema di compressione. Usando un approccio basato sulla grammatica senza codifica entropica non riesco a ottenere così breve solo sui valori della nota, senza tener conto delle lunghezze.
Peter Taylor,

Puoi descrivere come hai compresso i dati? Sono interessato a sapere come l'hai ottenuto così piccolo.
Sir_Lagsalot,

1
@Sir_Lagsalot: è fondamentalmente un dizionario nidificato / ricorsivo, ovvero hai motivi costituiti da note (tonalità e lunghezza codificate in un numero), quindi hai temi che contengono questi motivi e / o singole note, quindi parti costituite da temi ecc. Il mio programma utilizza essenzialmente lo stesso principio (espanso da trasposizioni, inversioni ecc.), Ma non ulteriormente compresso in un file binario stretto; Invece, ho semplicemente creato tutte le definizioni delle variabili di livello superiore.
cessò di girare in senso antiorario

4

GolfScript (129 + 369 = 498 byte)

Sia il programma che il file di dati includono caratteri non stampabili, quindi fornirò le rappresentazioni Base64 e xxd.

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

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

Spiegazione

Ho modificato il punteggio (aggiornato) fornito (più avanti) in una singola stringa contenente byte con valori da 0 a 24. Le lunghezze delle note vengono prima; quindi i valori della nota, rappresentati con mod 25 e codificati con differenza. Il motivo della codifica delle differenze è che i passaggi che si ripetono in trasposizione saranno ridotti alla stessa sequenza e possono essere compressi.

Ho quindi eseguito questo attraverso un programma di compressione string-to-GolfScript che ho menzionato prima (e che ho migliorato per essere competitivo in questo golf) per ottenere il file di dati, che è decompresso dalla prima parte del programma:

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

È una semplice espansione grammaticale di un tipo che è familiare a chiunque abbia esaminato molte domande taggate .

Quindi ho diviso questa stringa in coppie [length note]e ho ripetuto le coppie. I caratteri non stampabili provengono da una stringa magica che contiene parametri di frequenza per le note: sto usando il mod troncamento implicito 256 di array di numeri interi di GolfScript che vengono convertiti in stringhe per produrre un'onda triangolare *, quindi la frequenza di base è 22050/256 Hz. Ho scritto un programma per trovare rapporti interi che danno una buona messa a punto; la stringa magica contiene numeratori e il denominatore 17 è lo stesso per tutte le note. L'errore di sintonizzazione medio è di circa 3,4 centesimi.

Le lunghezze delle note sono rappresentate così come sono e sono molto più plausibili della versione precedente della partitura. Come sospettavo, l'arrotondamento ha aumentato la ridondanza nella stringa e accorciato il file di dati compressi di 30 byte, per non parlare del salvataggio dell'array di ricerca. Tuttavia, ci sono ancora alcuni passaggi che ritengo sospetti:

72 13

o

71 9
69 2
71 2

dare barre che sono un sesto di un uncinetto più lunghe del resto delle barre nel punteggio e

85 9
85 4
85 24
85 23

o

83 18
88 7
85 24
85 23

sono un numero integrale di barre, ma con alcuni offset dubbi.

Il programma potrebbe essere leggermente più breve. Ho deliberatamente scelto di negoziare in breve tempo per i tempi di esecuzione. Con alcuni miglioramenti della velocità all'interprete GolfScript che ho inviato a Darren Smith e che credo abbia intenzione di pubblicare ad un certo punto, la versione corrente viene eseguita in meno di 15 minuti sul mio computer. Se noputs dopo ogni generazione non rilevo ciascuna nota, allora funziona molto più lentamente.

* Con la presente confesso che il mio commento su tutti quelli che usano le onde quadrate era sbagliato.


Come eseguire correttamente GolfScript? Provo base64 -d <<< 'MjU2Y.....9Lw==' | golfscript e dice golfscript:405:in 'scan': invalid byte sequence in UTF-8 (ArgumentError)(lo stesso se salvo il programma su file, ovviamente)
Vi.

Le lunghezze delle note vengono estratte dal file MIDI usando un algoritmo grezzo (vedere il commento a play.pl). Riparerò le lunghezze delle note per renderle sane.
Vi.

Aggiornato l'essenza. Ora la lunghezza minima della nota è 1.
Vi.

Se provo a eseguire usando l'interprete online (il codice inserito sembra 㔲戶獡⁥㌷慢敳せ为⽝㐨ⰴ屻ㅛ⤤⽝㉜㴤紪尯⤬⵻⭽⸥㈬⼯楺筰乾㈫┵为笧誂鮒꺤쎸��䇿䥅前屗慜浧❴㨽㭦∩ĦĂ༃ጔ؏༆ณؕḧ⸘研��⒖✏㰢⭻⩽㐴Ⱚ⹻〵⨾⩦㜱ⸯ⸮╽✧渺瀫瑵絳/), ottengo undefined method class_id 'per zero: NilClass`
Vi.

1
E non c'è modo che funzionerà nell'interprete online - che scadrà.
Peter Taylor,

2

Codice macchina x86 - 513 byte

Questo non soddisfa pienamente la sfida, poiché invece di produrre un formato adatto all'alimentazione in aplay, riproduce il midi.

File .COM eseguibile e codice sorgente asm - L'avvio della musica potrebbe richiedere fino a 14 secondi. Suonerà anche un po 'lentamente, poiché la risoluzione del timer è 1/18 di secondo.

La musica è codificata in 375 byte usando la codifica di Fibonacci e un dizionario composto dalla musica precedentemente decodificata.

Algoritmo di decodifica pseudocodice:

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

Una volta che la musica è stata decodificata, si tratta semplicemente di inviarla alla porta Midi.


1
Si basa sul sintetizzatore esistente (in questo caso MIDI all'interno della scheda audio) invece di fornire il proprio.
Vi.

Puoi hackerare il sintetizzatore e fare in modo che i campioni vengano inviati alla rispettiva porta o allo stdout / file (usando syscalls DOS o Linux). Come sfida separata puoi creare una versione con MIDI polifonico completo (sempre con compressione in un singolo file COM).
Vi.

Mi interessa solo l'aspetto della sfida "musica Mozart compatta", non il sintetizzatore. Sto pubblicando questo perché è divertente e dovrebbe essere interessante per gli altri piuttosto che vincere la sfida.
Sir_Lagsalot

OK. Aspettando la versione di Arduino ...
Vi.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.