Mozart golf - mini "Rondo"

13

Salida "Mozart - Alla Turca" a stdout (vea la muestra para "implementación de referencia")

Intenta encontrar cómo empaquetar el sintetizador y la música en un tamaño mínimo.

Requisitos:

  • Formato adecuado para alimentar aplay -f cd(little endian firmado de 16 bits, 2 canales);
  • Se debe reproducir música completa (sin notas o partes omitidas, al menos no menos que en el programa de muestra), aunque no se requiere polifonía;
  • No puedo simplemente llamar /usr/bin/timidity, /usr/bin/soxo algo así (por ejemplo, requiere instalar un módulo de música especial);
  • No puedo acceder a la red o asumir que la música está disponible localmente;

"Implementación de referencia" con puntaje analizable: https://gist.github.com/vi/5478693
(Programa Perl de muestra anterior: https://gist.github.com/vi/5447962 )

Vi.
fuente
¿Tienes un enlace a partituras?
beary605
No actualmente, estaba escribiendo el programa de muestra escuchando y prueba y error. Ahora buscando ...
Vi.
Por ejemplo, esto .
Vi.
Además, supongo que ya te has dado cuenta de esto, pero todos usarán ondas cuadradas.
Peter Taylor
2
Nota: la disposición en la partitura vinculada es bastante inútil para cualquiera que intente implementar esto con una sola voz. He descargado varios archivos MIDI y no están de acuerdo con todas las notas: pueden estar en la misma clave, ¡pero no están de acuerdo con algunas notas de 4 semitonos! Para hacer de este un problema bien especificado, realmente necesita una única puntuación canónica (preferiblemente en algún formato fácil de analizar, para que los implementadores puedan convertirlo a un formato conveniente para su implementación sin introducir errores de transcripción).
Peter Taylor

Respuestas:

11

Polifónico, Haskell, 2826 3177 4719

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

caracteristicas:

  • Todas las notas de la mano derecha . Por supuesto, también podría agregar la mano izquierda (hecho eso).
  • Articulación adecuada de las notas staccato, etc.
  • Sonido razonablemente agradable con dinámica. No solo la simple modulación de volumen, sino la adecuada transformación del personaje de ataque y el contenido de armónicos,como si te subieras a un piano realen realidad, bastante más ... oye, se supone que esta pieza debe estar imitando bandas turcas de Janissary , ¿verdad?
  • Reverberación No suena increíblemente genial, pero tampoco está mal.
  • Compresión dinámica No preguntes ...
  • Tramado de la salida. Esto es algo ridículo: con una resolución adecuada de 16 bits, casi nadie escucharía los artefactos de cuantización, pero para evitar incluir la biblioteca binaria , utilizo efectivamente solo una resolución de 7 bits, que puedo cubrir con la salida ASCII. El tramado en sí mismo es bastante fuerte, sin forma de ruido ...
  • Cálculo multiproceso de acordes polifónicos.

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 de 1] Compilando Main (def0.hs, def0.o)
Vinculando bin / def0-hs ...
time sh -c 'bin / def0-hs + RTS -N4> hsoutp.pcm '
189.39user 138.41system 2: 06.62elapsed 258% CPU (0avgtext + 0avgdata 6440240maxresident) k
0inputs + 0outputs (0major + 403037minor) pagefaults 0swaps
ffmpeg-sfps -ar 44.1k -ac 2 -i hsoutp.pcm hsoutp.ogg


Aquí hay una versión parcialmente ignorada y comentada: https://gist.github.com/leftaroundabout/5517198 .

dejó de girar en sentido antihorario
fuente
Buen intento. 2970 UTF-8 bytes, 2826 puntos de código. Como no es un competidor para la versión de <600 python, podría estar mejor orientado hacia un sonido / polifonía más agradable (manteniéndolo por debajo de 5000 bytes, por ejemplo).
Vi.
1
@Vi. Si considera como "longitud de un programa" el número de bytes cuando UTF-8 codificó, entonces creo que debería indicarlo en la pregunta. Solo para dejar en claro, ya que algunas personas no usan esta definición (por ejemplo, todos los programadores APL ...)
Bakuriu
@Bakuriu Sí, claro LOL.
Soham Chowdhury
Eso fue una locura! Me encantaría tener alguna idea de cómo funciona este programa.
Shiona
@shiona: en realidad no está tan ofuscado, con las firmas tipográficas debería ser lo suficientemente fácil de entender para cualquier persona familiarizada con Haskell y DSP básico.
dejó de girar en sentido contrario a las agujas
7

Python, 331 + 286 = 617 (0.548 bytes por nota)

Mi solución usa un archivo de datos y un script de Python. El archivo de datos debe usarse como entrada para el script. No tengo una aplicación, pero funciona cuando la importo como datos sin procesar en Audacity con PCM de 16 bits firmado, little-endian y 2 canales.

El archivo de datos tiene 331 bytes. Aquí hay un script de Python que 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')

Aquí está el script de 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: Si está ejecutando Windows, use el -uinterruptor para ambos scripts, ya que stdin y stdout están tratando con datos binarios.

caja de cartón
fuente
Buen trabajo. Considerando 331 + 286 + 10 (para unir el archivo y el script) == 627.
Vi.
Puedes acortar un poco usando en os.read/writelugar de sys.stdin/stdout.
Bakuriu
+50 para el hermoso esquema de compresión. Utilizando un enfoque basado en la gramática sin codificación de entropía, no puedo ser tan corto solo con los valores de las notas, sin tener en cuenta las longitudes.
Peter Taylor
¿Puedes describir cómo comprimiste los datos? Me interesa saber cómo lo hiciste tan pequeño.
Sir_Lagsalot
1
@Sir_Lagsalot: es básicamente un diccionario anidado / recursivo, es decir, tiene motivos que consisten en notas (tono y duración codificadas en un número), luego tiene temas que contienen estos motivos y / o notas individuales, luego partes que consisten en temas, etc. Mi programa usa esencialmente el mismo principio (expandido por transposiciones, inversiones, etc.), simplemente no comprimido más en un archivo binario ajustado; Simplemente hice todas las definiciones de variables de nivel superior.
dejó de girar en sentido contrario a las agujas
4

GolfScript (129 + 369 = 498 bytes)

Tanto el programa como el archivo de datos incluyen caracteres no imprimibles, por lo que voy a dar representaciones de Base64 y xxd.

Programa (129 bytes):

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                                       /

Datos (369 bytes):

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                                       .

Explicación

He destrozado la puntuación suministrada (actualizada) (más sobre eso más adelante) en una sola cadena que contiene bytes con valores de 0 a 24. Las duraciones de las notas son lo primero; luego los valores de las notas, representados mod 25 y codificados por diferencia. La razón de la codificación de la diferencia es que los pasajes que se repiten en la transposición se reducirán a la misma secuencia y se pueden comprimir.

Luego ejecuté esto a través de un programa de compresión de cadena a GolfScript que he mencionado antes (y que mejoré para ser competitivo en este golf) para obtener el archivo de datos, que se descomprime en la primera parte del programa:

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

Es una simple expansión gramatical de un tipo que es familiar para cualquiera que haya examinado muchas preguntas etiquetadas .

Luego divido esta cadena en pares [length note]e itero a través de los pares. Los caracteres no imprimibles provienen de una cadena mágica que contiene parámetros de frecuencia para las notas: estoy usando el mod 256 de truncamiento implícito de GolfScript de matrices de enteros que se convierten en cadenas para producir una onda triangular *, por lo que la frecuencia base es 22050/256 Hz. Escribí un programa para encontrar relaciones enteras que dan una buena sintonía; la cadena mágica contiene numeradores, y el denominador 17 es el mismo para todas las notas. El error de ajuste promedio es de aproximadamente 3.4 centavos.

Las duraciones de las notas se representan como son y son mucho más plausibles que la versión anterior de la partitura. Como sospechaba, el redondeo aumentó la redundancia en la cadena y acortó el archivo de datos comprimido en 30 bytes, sin mencionar que guardó la matriz de búsqueda. Sin embargo, todavía hay algunos pasajes que me parecen sospechosos:

72 13

o

71 9
69 2
71 2

dar barras que son una sexta parte de un ganchillo más largas que el resto de las barras en la puntuación, y

85 9
85 4
85 24
85 23

o

83 18
88 7
85 24
85 23

son un número integral de barras, pero con algunas compensaciones dudosas.

El programa podría ser un poco más corto. Deliberadamente he optado por cambiar la escasez por tiempo de ejecución. Con algunas mejoras de velocidad en el intérprete de GolfScript que he enviado a Darren Smith y que creo que planea publicar en algún momento, la versión actual se ejecuta en menos de 15 minutos en mi computadora. Si no hago putscada nota después de generarla, entonces se ejecuta mucho más lento.

* Por la presente confieso que mi comentario sobre todos los que usan ondas cuadradas fue incorrecto.

Peter Taylor
fuente
¿Cómo ejecutar correctamente GolfScript? Intento base64 -d <<< 'MjU2Y.....9Lw==' | golfscript y dice golfscript:405:in 'scan': invalid byte sequence in UTF-8 (ArgumentError)(lo mismo si guardo el programa en un archivo, por supuesto)
Vi.
Las longitudes de las notas se extraen del archivo MIDI usando un algoritmo crudo (vea el comentario en play.pl). Arreglaré las longitudes de las notas para estar cuerdo.
Vi.
Actualizado la esencia. Ahora la longitud mínima de la nota es 1.
Vi.
Si intento ejecutar usando un intérprete en línea (el código insertado se ve así 㔲戶獡⁥㌷慢敳せ为⽝㐨ⰴ屻ㅛ⤤⽝㉜㴤紪尯⤬⵻⭽⸥㈬⼯楺筰乾㈫┵为笧誂鮒꺤쎸��䇿䥅前屗慜浧❴㨽㭦∩ĦĂ༃ጔ؏༆ณؕḧ⸘研��⒖✏㰢⭻⩽㐴Ⱚ⹻〵⨾⩦㜱ⸯ⸮╽✧渺瀫瑵絳/), obtengo undefined method class_id 'for nil: NilClass`
Vi.
1
Y no hay forma de que se ejecute en el intérprete en línea, ya que se agotará el tiempo de espera.
Peter Taylor
2

Código de máquina x86: 513 bytes

Esto no cumple completamente con el desafío, ya que en lugar de emitir en un formato adecuado para alimentar un aplay, reproduce el midi.

Archivo ejecutable .COM y código fuente asm : la música puede tardar hasta 14 segundos en iniciarse. También jugará un poco lento, ya que la resolución del temporizador es 1/18 de segundo.

La música se codifica en 375 bytes utilizando la codificación Fibonacci y un diccionario compuesto por la música previamente decodificada.

Algoritmo de decodificación de pseudocódigo:

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 vez que se decodifica la música, es una simple cuestión de enviarla al puerto Midi.

Sir_Lagsalot
fuente
1
Se basa en el sintetizador existente (MIDI dentro de la tarjeta de audio en este caso) en lugar de proporcionar el suyo.
Vi.
Puede hackear el sintetizador y hacer que muestre muestras en el puerto respectivo o en stdout / file (usando llamadas de sistema de DOS o Linux). Como desafío separado, puede hacer una versión con MIDI polifónico completo (aún con compresión en un solo archivo COM).
Vi.
Solo me interesa el aspecto de la "música compacta de Mozart" del desafío, no el sintetizador. Estoy publicando esto porque es divertido y debería ser interesante para los demás en lugar de ganar el desafío.
Sir_Lagsalot
OKAY. Esperando la versión de Arduino ...
Vi.