Golf Mozart - mini «Rondo»

13

Sortie "Mozart - Alla Turca" vers stdout (voir l'exemple pour "implémentation de référence")

Essayez de trouver comment emballer le synthétiseur et la musique dans une taille minimale.

Exigences:

  • Format adapté à l'alimentation aplay -f cd(petit endian 16 bits signé, 2 canaux);
  • La musique entière doit être jouée (pas de notes ou de parties sautées, au moins pas moins que dans le programme d'échantillonnage), cependant la polyphonie n'est pas requise;
  • Ne peut pas simplement appeler /usr/bin/timidity, /usr/bin/soxou quelque chose comme ça (par exemple exiger d'installer un module de musique spécial);
  • Impossible d'accéder au réseau ou de supposer que la musique est disponible localement;

"Implémentation de référence" avec un score analysable: https://gist.github.com/vi/5478693
(Ancien exemple de programme Perl: https://gist.github.com/vi/5447962 )

Vi.
la source
Avez-vous un lien vers des partitions?
beary605
Non actuellement, je tapais l'exemple de programme en écoutant et en essayant et en erreur. Maintenant à la recherche de ...
Vi.
Par exemple, ceci .
Vi.
De plus, je suppose que vous l'avez déjà réalisé, mais tout le monde va utiliser des ondes carrées.
Peter Taylor
2
Remarque: l'arrangement dans la partition liée est assez inutile pour quiconque essaie de l'implémenter avec une seule voix. J'ai téléchargé divers fichiers MIDI et ils ne sont pas d'accord sur toutes les notes - ils peuvent être dans la même tonalité, mais en désaccord sur certaines notes par 4 demi-tons! Pour en faire un problème bien spécifié, il a vraiment besoin d'un seul score canonique (de préférence dans un format facilement analysable, afin que les implémenteurs puissent le convertir dans un format convenant à leur implémentation sans introduire d'erreurs de transcription).
Peter Taylor

Réponses:

11

Polyphonique, Haskell, 2826 3177 4719

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

Fonctionnalités:

  • Toutes les notes de la main droite . Je pourrais bien sûr ajouter la main gauche aussi (c'est fait).
  • Bonne articulation des notes staccato, etc.
  • Son raisonnablement agréable avec dynamique. Pas seulement une simple modulation de volume, mais un bon morphing du caractère d'attaque et du contenu harmonique,comme on monte sur un vrai pianoen fait, un peu plus ... hé cette pièce est supposée imiter des groupes de janissaires turcs , non?
  • Reverb. Cela ne sonne pas incroyablement bien, mais pas trop mal non plus.
  • Compression dynamique. Ne demandez pas ...
  • Tramage de la sortie. C'est un peu ridicule: avec une bonne résolution de 16 bits, presque personne n'entendrait les artefacts de quantification, mais pour éviter d'inclure la bibliothèque binaire , j'utilise effectivement uniquement une résolution de 7 bits, que je peux couvrir avec une sortie ASCII. Le tramage lui-même est plutôt bruyant, pas de formation de bruit ...
  • Calcul multithread des accords polyphoniques.

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 sur 1] Compilation principale (def0.hs, def0.o)
Liaison 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
ffmpic-lvel -ar 44.1k -ac 2 -i hsoutp.pcm hsoutp.ogg


Voici une version partiellement non golfée et commentée: https://gist.github.com/leftaroundabout/5517198 .

a cessé de tourner dans le sens antihoraire
la source
Bien essayé. 2970 octets UTF-8, 2826 points de code. Comme il n'est pas un concurrent pour la version <600 python, il pourrait être mieux orienté vers un son / polyphonie plus agréable (en le gardant sous 5000 octets, par exemple).
Vi.
1
@Vi. Si vous considérez comme "la longueur d'un programme" le nombre d'octets lors du codage UTF-8, alors je pense que vous devriez l'indiquer dans la question. Juste pour être clair, car certaines personnes n'utilisent pas cette définition (par exemple tous les programmeurs APL ...)
Bakuriu
@ Bakuriu Ouais, c'est vrai LOL.
Soham Chowdhury
C'était fou! J'aimerais avoir une idée du fonctionnement de ce programme.
shiona
@shiona: ce n'est en fait pas si obscurci, avec des signatures de type, il devrait être assez facile à comprendre pour quiconque connaît Haskell et le DSP de base.
cessé de tourner dans
7

Python, 331 + 286 = 617 (0,548 octets par note)

Ma solution utilise un fichier de données et un script python. Le fichier de données doit être utilisé comme entrée dans le script. Je n'ai pas d'aplay, mais cela fonctionne lorsque je l'importe en tant que données brutes dans Audacity avec PCM 16 bits signé, little-endian et 2 canaux.

Le fichier de données est de 331 octets. Voici un script python qui le génère:

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

Voici le 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)

Remarque: Si vous exécutez Windows, utilisez le -ucommutateur pour les deux scripts car stdin et stdout traitent des données binaires.

boîte en carton
la source
Bon travail. Considérant 331 + 286 + 10 (pour lier ensemble le fichier et le script) == 627.
Vi.
Vous pouvez raccourcir un peu en utilisant os.read/writeau lieu de sys.stdin/stdout.
Bakuriu
+50 pour le magnifique schéma de compression. En utilisant une approche basée sur la grammaire sans encodage entropique, je ne peux pas être aussi court que sur les valeurs des notes, sans prendre en compte les longueurs.
Peter Taylor
Pouvez-vous décrire comment vous avez compressé les données? Je voudrais savoir comment vous l'avez si petit.
Sir_Lagsalot
1
@Sir_Lagsalot: c'est essentiellement un dictionnaire imbriqué / récursif, c'est-à-dire que vous avez des motifs composés de notes (hauteur et longueur encodées en un seul nombre), puis vous avez des thèmes qui contiennent ces motifs et / ou des notes simples, puis des parties constituées de thèmes etc. Mon programme utilise essentiellement le même principe (développé par des transpositions, des inversions, etc.), mais pas plus compressé dans un fichier binaire serré; J'ai simplement fait toutes les définitions de variables de niveau supérieur à la place.
cessé de tourner dans
4

GolfScript (129 + 369 = 498 octets)

Le programme et le fichier de données contiennent des caractères non imprimables, donc je vais donner des représentations Base64 et xxd.

Programme (129 octets):

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                                       /

Données (369 octets):

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                                       .

Explication

J'ai modifié le score fourni (mis à jour) (plus à ce sujet plus tard) en une seule chaîne contenant des octets avec des valeurs de 0 à 24. La longueur des notes vient en premier; puis les valeurs de note, représentées par le mod 25 et codées par différence. La raison du codage différentiel est que les passages qui sont répétés en transposition seront réduits à la même séquence et pourront être compressés.

J'ai ensuite exécuté cela à travers un programme de compression chaîne vers GolfScript que j'ai mentionné précédemment (et que j'ai amélioré afin d'être compétitif dans ce golf) pour obtenir le fichier de données, qui est décompressé par la première partie du programme:

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

Il s'agit d'une simple extension grammaticale d'un type familier à tous ceux qui ont examiné de nombreuses questions étiquetées .

J'ai ensuite divisé cette chaîne en paires [length note]et parcouru les paires. Les caractères non imprimables proviennent d'une chaîne magique qui contient des paramètres de fréquence pour les notes: j'utilise le module 256 de troncature implicite de tableaux entiers qui sont convertis en chaînes pour produire une onde triangulaire *, donc la fréquence de base est 22050/256 Hz. J'ai écrit un programme pour trouver des ratios entiers qui donnent un bon réglage; la chaîne magique contient des numérateurs et le dénominateur 17 est le même pour toutes les notes. L'erreur de réglage moyenne est d'environ 3,4 cents.

Les longueurs des notes sont représentées telles quelles et sont beaucoup plus plausibles que la version précédente de la partition. Comme je le soupçonnais, l'arrondi a augmenté la redondance dans la chaîne et raccourci le fichier de données compressé de 30 octets, sans parler de l'enregistrement du tableau de recherche. Cependant, il y a encore quelques passages que je trouve suspect:

72 13

ou

71 9
69 2
71 2

donner des barres qui sont un sixième de crochet plus longues que les autres barres de la partition, et

85 9
85 4
85 24
85 23

ou

83 18
88 7
85 24
85 23

sont un nombre entier de barres, mais avec quelques décalages douteux.

Le programme pourrait être légèrement plus court. J'ai délibérément choisi d'échanger la brièveté contre le temps d'exécution. Avec quelques améliorations de vitesse à l'interpréteur GolfScript que j'ai soumises à Darren Smith et que je pense qu'il prévoit de publier à un moment donné, la version actuelle s'exécute en moins de 15 minutes sur mon ordinateur. Si je ne putsnote pas chaque note après l'avoir générée, elle s'exécute beaucoup plus lentement.

* J'avoue par la présente que mon commentaire sur tout le monde utilisant des ondes carrées était faux.

Peter Taylor
la source
Comment exécuter correctement GolfScript? J'essaye base64 -d <<< 'MjU2Y.....9Lw==' | golfscript et ça dit golfscript:405:in 'scan': invalid byte sequence in UTF-8 (ArgumentError)(pareil si j'enregistre le programme dans un fichier, bien sûr)
Vi.
Les longueurs des notes sont extraites du fichier MIDI en utilisant un algorithme brut (voir le commentaire du play.pl). Je vais fixer la longueur des notes pour qu'elle soit saine d'esprit.
Vi.
Mise à jour de l'essentiel. La longueur minimale de la note est maintenant de 1.
Vi.
Si j'essaie d'exécuter en utilisant l' interpréteur en ligne (le code inséré ressemble 㔲戶獡⁥㌷慢敳せ为⽝㐨ⰴ屻ㅛ⤤⽝㉜㴤紪尯⤬⵻⭽⸥㈬⼯楺筰乾㈫┵为笧誂鮒꺤쎸��䇿䥅前屗慜浧❴㨽㭦∩ĦĂ༃ጔ؏༆ณؕḧ⸘研��⒖✏㰢⭻⩽㐴Ⱚ⹻〵⨾⩦㜱ⸯ⸮╽✧渺瀫瑵絳/), j'obtiens undefined method class_id 'pour nil: NilClass`
Vi.
1
Et il n'y a aucun moyen qu'il s'exécute dans l'interpréteur en ligne - cela expirera.
Peter Taylor
2

Code machine x86 - 513 octets

Cela ne relève pas entièrement le défi, car au lieu de produire dans un format adapté à l'alimentation d'un jeu, il joue le midi.

Fichier .COM exécutable et code source asm - Le démarrage de la musique peut prendre jusqu'à 14 secondes. Il jouera également un peu lentement, car la résolution de la minuterie est de 1/18 de seconde.

La musique est codée en 375 octets en utilisant le codage Fibonacci et un dictionnaire composé de la musique décodée précédemment.

Algorithme de décodage de 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;
}

Une fois la musique décodée, il suffit de la sortir sur le port Midi.

Sir_Lagsalot
la source
1
Il s'appuie sur un synthétiseur existant (MIDI dans la carte audio dans ce cas) au lieu de fournir le sien.
Vi.
Vous pouvez pirater le synthétiseur et en faire des échantillons de sortie vers le port respectif ou vers stdout / fichier (en utilisant des appels système DOS ou Linux). En tant que défi distinct, vous pouvez créer une version avec MIDI polyphonique à part entière (toujours avec compression en un seul fichier COM).
Vi.
Je m'intéresse simplement à l'aspect «musique compacte de Mozart» du défi, pas au synthétiseur. Je poste ceci parce que c'est amusant et devrait être intéressant pour les autres plutôt que pour gagner le défi.
Sir_Lagsalot
D'ACCORD. En attente de la version Arduino ...
Vi.