Mozart golf - mini "Rondo"

13

Saída "Mozart - Alla Turca" para stdout (consulte o exemplo para "implementação de referência")

Tente descobrir como compactar o sintetizador e a música em tamanho mínimo.

Requisitos:

  • Formato adequado para alimentação aplay -f cd(endian assinado de 16 bits, 2 canais);
  • Toda a música deve ser tocada (sem notas ou partes puladas, pelo menos não menos do que no programa de amostra); a polifonia não é necessária;
  • Não pode simplesmente chamar /usr/bin/timidity, /usr/bin/soxou algo parecido (por exemplo, requer a instalação de um módulo especial de música);
  • Não pode acessar a rede ou assumir que a música está disponível localmente;

"Implementação de referência" com pontuação analisável: https://gist.github.com/vi/5478693
(Exemplo de programa Perl de amostra: https://gist.github.com/vi/5447962 )

Vi.
fonte
Você tem um link para partituras?
beary605
No momento, eu estava digitando o programa de amostra ouvindo e tentando e erro. Agora procurando ...
Vi.
Por exemplo, isso .
Vi.
Além disso, suponho que você já tenha percebido isso, mas todo mundo vai usar ondas quadradas.
Peter Taylor
2
Nota: o arranjo na partitura vinculada é bastante inútil para quem tenta implementar isso com apenas uma voz. Eu baixei vários arquivos MIDI e eles não concordam com todas as notas - eles podem estar na mesma tecla, mas discordam em algumas notas por 4 semitons! Para fazer deste um problema bem especificado, ele realmente precisa de uma única pontuação canônica (de preferência em algum formato facilmente analisado, para que os implementadores possam convertê-lo em um formato conveniente para sua implementação sem introduzir erros de transcrição).
Peter Taylor

Respostas:

11

Polifônico, Haskell, 2826 3177 4719

Saída de áudio: https://www.dropbox.com/s/nba6489tfet740r/hs-golf-turca.ogg

Recursos:

  • Todas as notas da mão direita . É claro que eu também poderia adicionar a mão esquerda (Fiz isso).
  • Articulação adequada das notas staccato etc.
  • Som razoavelmente agradável com dinâmica. Não apenas a modulação de volume simples, mas a transformação adequada do personagem de ataque e do conteúdo de overtone,como se você pegasse um piano de verdadena verdade, um pouco mais ... ei, essa peça deveria estar imitando as bandas turcas dos janízaros , certo?
  • Ressonância. Não parece incrivelmente bom, mas também não é tão ruim.
  • Compactação dinâmica. Não pergunte ...
  • Pontilhamento da saída. Isso é meio ridículo: com uma resolução adequada de 16 bits, quase ninguém ouviria os artefatos de quantização, mas para evitar a inclusão da biblioteca binária , utilizo efetivamente apenas a resolução de 7 bits, que posso cobrir com a saída ASCII. O dither em si é bastante alto, sem barulho ...
  • Cálculo multithread 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] Principal de compilação (def0.hs, def0.o)
Bin de vinculação / def0-hs ...
time sh -c 'bin / def0-hs + RTS -N4> hsoutp.pcm '
189.39user 138.41system 2: 06.62 decorrido 258% da CPU (0avgtext + 0avgdata 6440240maxresident) k
0inputs + 0outputs (0major + 403037minor) pagefaults 0swaps
ffmpy -loglevel -ar 44.1k -ac 2 -i hsoutp.pcm hsoutp.ogg


Aqui está uma versão parcialmente não-gasta e comentada: https://gist.github.com/leftaroundabout/5517198 .

deixou de girar contra-relógio
fonte
Boa tentativa. 2970 bytes UTF-8, 2826 pontos de código. Como não é concorrente da versão <600 python, poderia ser melhor direcionado para um som / polifonia mais agradável (mantendo-o abaixo de 5000 bytes, por exemplo).
Vi.
1
@Vi. Se você considerar como "comprimento de um programa" o número de bytes quando codificado em UTF-8, acho que você deve indicar isso na pergunta. Só para deixar claro, uma vez que algumas pessoas não usam esta definição (por exemplo, cada programador APL ...)
Bakuriu
@ Bakuriu Sim, certo.
Soham Chowdhury
Isso foi insano! Gostaria muito de ter uma idéia de como esse programa funciona.
Shiona
@ shiona: na verdade não é tão ofuscado, com assinaturas de tipo deve ser fácil o suficiente para qualquer pessoa familiarizada com Haskell e DSP básico.
deixou de girar no sentido contrário ao relógio
7

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

Minha solução usa um arquivo de dados e um script python. O arquivo de dados deve ser usado como entrada para o script. Não tenho aplay, mas funciona quando os importo como dados brutos no Audacity com PCM assinado de 16 bits, little endian e 2 canais.

O arquivo de dados tem 331 bytes. Aqui está um script python que o exibe:

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

Aqui está o script 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 você estiver executando o Windows, use a -uopção para os dois scripts, já que stdin e stdout estão lidando com dados binários.

caixa de papelão
fonte
Bom trabalho. Considerando 331 + 286 + 10 (para juntar o arquivo e o script) == 627.
Vi.
Você pode diminuir um pouco usando em os.read/writevez de sys.stdin/stdout.
Bakuriu
+50 para o belo esquema de compactação. Usando uma abordagem baseada em gramática sem codificação de entropia, não posso ser tão curto apenas nos valores das notas, sem levar em consideração os comprimentos.
Peter Taylor
Você pode descrever como compactou os dados? Estou interessado em saber como você conseguiu isso tão pequeno.
31813 SirLagsalot
1
@Sir_Lagsalot: é basicamente um dicionário aninhado / recursivo, ou seja, você tem motivos que consistem em notas (altura e comprimento codificados em um número), então você tem temas que contêm esses motivos e / ou notas únicas, partes que consistem em temas etc. Meu programa usa essencialmente o mesmo princípio (expandido por transposições, inversões etc.), apenas não mais compactado em um arquivo binário restrito; Simplesmente fiz todas as definições de variáveis ​​de nível superior.
deixou de girar no sentido anti-horário
4

GolfScript (129 + 369 = 498 bytes)

O programa e o arquivo de dados incluem caracteres não imprimíveis, portanto, darei representações Base64 e 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                                       /

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

Explicação

Eu alterei a pontuação fornecida (atualizada) (mais sobre isso mais tarde) em uma única sequência contendo bytes com valores de 0 a 24. Os comprimentos das notas são os primeiros; então os valores das notas, representados mod 25 e codificados por diferença. A razão para a codificação da diferença é que as passagens que são repetidas na transposição serão reduzidas para a mesma sequência e podem ser compactadas.

Em seguida, executei isso por meio de um programa de compactação string-to-GolfScript que mencionei antes (e que melhorei para ser competitivo nesse golfe) para obter o arquivo de dados, que é descompactado pela primeira parte do programa:

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

É uma expansão gramatical simples de um tipo que é familiar para quem já viu muitas perguntas marcadas .

Em seguida, divido essa sequência em pares [length note]e iteramos pelos pares. Os caracteres não imprimíveis vêm de uma sequência mágica que contém parâmetros de frequência para as notas: Estou usando o mod de truncamento implícito do GolfScript 256 de matrizes inteiras que são convertidas em strings para produzir uma onda triangular *, portanto a frequência base é 22050/256 Hz. Eu escrevi um programa para encontrar proporções inteiras que dão um bom ajuste; a seqüência mágica contém numeradores e o denominador 17 é o mesmo para todas as notas. O erro médio de ajuste é de cerca de 3,4 centavos.

Os comprimentos das notas são representados como estão e são muito mais plausíveis que a versão anterior da partitura. Como eu suspeitava, o arredondamento aumentou a redundância na string e reduziu o arquivo de dados compactados em 30 bytes, sem mencionar o salvamento da matriz de pesquisa. No entanto, ainda existem algumas passagens que acho suspeitas:

72 13

ou

71 9
69 2
71 2

dê barras com um sexto de crochê mais do que o resto das barras na partitura, e

85 9
85 4
85 24
85 23

ou

83 18
88 7
85 24
85 23

são um número inteiro de barras, mas com algumas compensações duvidosas.

O programa pode ser um pouco mais curto. Eu escolhi deliberadamente negociar em falta pelo tempo de execução. Com algumas melhorias na velocidade do intérprete GolfScript que enviei para Darren Smith e que acredito que ele planeja publicar em algum momento, a versão atual é executada em menos de 15 minutos no meu computador. Se eu não fizer putscada nota depois de gerá-la, ela ficará muito mais lenta.

* Confesso que meu comentário sobre todo mundo que usa ondas quadradas estava errado.

Peter Taylor
fonte
Como executar corretamente o GolfScript? Eu tento base64 -d <<< 'MjU2Y.....9Lw==' | golfscript e diz golfscript:405:in 'scan': invalid byte sequence in UTF-8 (ArgumentError)(o mesmo se eu salvar o programa em arquivo, é claro)
Vi.
Os comprimentos das notas são extraídos do arquivo MIDI usando o algoritmo bruto (veja o comentário no play.pl). Vou corrigir os comprimentos das notas para que sejam sãos.
Vi.
Atualizado a essência. Agora, o comprimento mínimo da nota é 1.
Vi.
Se eu tentar executar usando o intérprete online (o código inserido se parece 㔲戶獡⁥㌷慢敳せ为⽝㐨ⰴ屻ㅛ⤤⽝㉜㴤紪尯⤬⵻⭽⸥㈬⼯楺筰乾㈫┵为笧誂鮒꺤쎸��䇿䥅前屗慜浧❴㨽㭦∩ĦĂ༃ጔ؏༆ณؕḧ⸘研��⒖✏㰢⭻⩽㐴Ⱚ⹻〵⨾⩦㜱ⸯ⸮╽✧渺瀫瑵絳/), recebo undefined method class_id 'for nil: NilClass`
Vi.
1
E não há como funcionar no intérprete on-line - isso irá expirar.
Peter Taylor
2

Código da máquina x86 - 513 bytes

Isso não atende totalmente ao desafio, pois, em vez de produzir em um formato adequado para alimentar o aplay, ele toca midi.

Arquivo .COM executável e código-fonte do ASM - pode demorar até 14 segundos para a música iniciar. Também tocará um pouco devagar, pois a resolução do timer é 1/18 de segundo.

A música é codificada em 375 bytes usando a codificação Fibonacci e um dicionário composto pela música decodificada anteriormente.

Algoritmo de decodificação 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;
}

Depois que a música é decodificada, é simples enviá-la para a porta Midi.

Sir_Lagsalot
fonte
1
Ele se baseia no sintetizador existente (neste caso, MIDI dentro da placa de áudio), em vez de fornecer o seu próprio.
Vi.
Você pode hackear o sintetizador e fazer com que ele produza amostras para a respectiva porta ou para stdout / arquivo (usando syscalls do DOS ou Linux). Como um desafio separado, você pode criar uma versão com MIDI polifônico completo (ainda com compactação em um único arquivo COM).
Vi.
Só estou interessado no aspecto 'música compacta de Mozart' do desafio, não no sintetizador. Estou postando isso porque é divertido e deve ser interessante para os outros, em vez de vencer o desafio.
9789 SiriusSlot #
ESTÁ BEM. Esperando pela versão do Arduino ...
Vi.