모차르트 골프-미니“론도”


13

"Mozart-Alla Turca"를 stdout으로 출력 ( "참조 구현"샘플 참조)

신시사이저와 음악을 모두 최소 크기로 포장하는 방법을 찾으십시오.

요구 사항 :

  • 공급에 적합한 형식 aplay -f cd(서명 된 16 비트 리틀 엔디안, 2 채널);
  • 전체 음악을 연주해야합니다 (적어도 샘플 프로그램에서 건너 뛰지 않은 음표 나 부분은 없어야 함).
  • 단지 호출 할 수 없습니다 /usr/bin/timidity, /usr/bin/sox(예를 들어 특별한 음악 모듈을 설치하는 데 필요한) 또는 같은;
  • 네트워크에 액세스 할 수 없거나 음악을 로컬에서 사용할 수 있다고 가정합니다.

구문 분석 가능한 점수가있는 "참조 구현": https://gist.github.com/vi/5478693
(이전 샘플 Perl 프로그램 : https://gist.github.com/vi/5447962 )


악보에 대한 링크가 있습니까?
beary605

현재는 청취 및 시행 착오를 통해 샘플 프로그램을 입력하고있었습니다. 지금 찾고있는 사람
Vi.

예를 들어 this 입니다.
Vi.

또한, 나는 당신이 이미 이것을 알고 있다고 가정하지만, 모든 사람들은 구형파를 사용할 것입니다.
피터 테일러

2
참고 : 링크 된 점수의 배열은 하나의 음성으로이를 구현하려고하는 사람에게는 꽤 쓸모가 없습니다. 다양한 MIDI 파일을 다운로드했는데 모든 음표에 동의하지는 않습니다. 동일한 키에있을 수 있지만 4 반음으로 일부 음표에 동의하지 않습니다! 이것을 잘 구체화 한 문제로 만들려면 실제로 단일 정식 점수가 필요합니다 (바람직하게는 쉽게 구문 분석되는 형식으로 구현자가 전사 오류를 일으키지 않고 구현에 편리한 형식으로 변환 할 수 있음).
피터 테일러

답변:


11

대위법, 하스켈, 2826 3177 4719

오디오 출력 : https://www.dropbox.com/s/nba6489tfet740r/hs-golf-turca.ogg

풍모:

  • 모든 노트 로부터 오른쪽 . 물론 왼손도 추가 할 수 있습니다 (그것을 했음).
  • 스타카토 음표의 적절한 조음
  • 다이나믹 한 사운드. 단순한 볼륨 변조뿐만 아니라 공격 캐릭터와 톤 콘텐츠의 적절한 모핑,진짜 피아노를 타는 것처럼사실, 오히려 더 ...이 조각은 터키 Janissary 밴드를 모방하는 것으로 추정됩니다 .
  • 리버브. 놀랍게도 훌륭하지는 않지만 너무 나쁘지는 않습니다.
  • 동적 압축. 묻지마 ...
  • 출력 디더링. 이것은 어리석은 일입니다. 적절한 16 비트 해상도를 사용하면 누구도 양자화 아티팩트를 거의 듣지 못하지만 바이너리 라이브러리를 포함하지 않기 위해 7 비트 해상도 만 효과적으로 사용하므로 ASCII 출력으로 처리 할 수 ​​있습니다. 디더 자체는 다소 시끄럽고 잡음이 없습니다 ...
  • 다성 화음의 다중 스레드 계산.

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-스레드
[1 of 1] 메인 컴파일 (def0.hs, def0.o)
bin / def0-hs 연결 ...
time sh -c 'bin / def0-hs + RTS -N4> hsoutp.pcm '
189.39user 138.41 시스템 2 : 06.62 경과 258 % CPU (0avgtext + 0avgdata 6440240maxresident) k 0
입력 +0 출력 (0major + 403037minor) 페이지
오류 -ar 44.1k -ac 2 -i hsoutp.pcm hsoutp.ogg


https://gist.github.com/leftaroundabout/5517198 은 부분적으로 ungolfed 및 주석이 달린 버전 입니다.


좋은 시도. 2970 UTF-8 바이트, 2826 코드 포인트 <600 파이썬 버전의 경쟁자가 아니기 때문에 더 좋은 사운드 / 폴리포니 (예 : 5000 바이트 이하로 유지)에 더 잘 맞을 수 있습니다.
Vi.

1
@Vi. UTF-8로 인코딩 할 때 바이트 수를 "프로그램 길이"로 생각하면 질문에 이것을 명시해야한다고 생각합니다. 어떤 사람들은이 정의를 사용하지 않기 때문에 (예 : 모든 APL 프로그래머 ...)
Bakuriu

@Bakuriu 그래 맞아 LOL.
Soham Chowdhury

그것은 미쳤다! 이 프로그램이 어떻게 작동하는지 알고 싶습니다.
shiona

@shiona : 그것은 난독 있다는 사실이 아니다 유형의 서명을 이 하스켈 기본 DSP에 익숙 누구나 이해하기 쉬운 충분합니다.
반 시계 회전을 중단

7

Python, 331 + 286 = 617 (음표 당 0.548 바이트)

내 솔루션은 데이터 파일과 파이썬 스크립트를 사용합니다. 데이터 파일은 스크립트의 입력으로 사용되어야합니다. 나는 놀지는 않지만 서명 된 16 비트 PCM, 리틀 엔디안 및 2 채널을 사용 하여 Audacity의 원시 데이터로 가져올 때 작동합니다 .

데이터 파일은 331 바이트입니다. 파이썬 스크립트는 다음과 같습니다.

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

파이썬 스크립트는 다음과 같습니다.

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)

참고 : Windows를 실행하는 경우 -ustdin 및 stdout이 이진 데이터를 처리하므로 두 스크립트 모두에 스위치를 사용하십시오 .


잘 했어. 331 + 286 + 10 고려 (파일과 스크립트를 묶기 위해) == 627.
Vi.

os.read/write대신을 사용하여 비트를 줄일 수 있습니다 sys.stdin/stdout.
Bakuriu

아름다운 압축 체계의 경우 +50 엔트로피 인코딩없이 문법 기반 접근법을 사용하면 길이를 고려하지 않고 메모 값만으로 짧게 얻을 수 없습니다.
피터 테일러

데이터 압축 방법을 설명 할 수 있습니까? 어떻게 그렇게 작은 지 알고 싶습니다.
Sir_Lagsalot

1
@ Sir_Lagsalot : 기본적으로 중첩 된 / 재귀 사전입니다. 즉, 노트 (피치와 길이가 하나의 숫자로 인코딩 된)로 구성된 모티프가 있고이 모티프 및 / 또는 단일 노트가 포함 된 테마가 있고 테마로 구성된 부분이 있습니다. 내 프로그램은 본질적으로 동일한 원리 (전치, 반전 등으로 확장)를 사용하지만 꽉 이진 파일로 압축되지 않습니다. 대신 모든 것을 최상위 변수 정의로 만들었습니다.
반 시계 회전을 중단

4

GolfScript (129 + 369 = 498 바이트)

프로그램과 데이터 파일 모두 인쇄 할 수없는 문자를 포함하므로 Base64 및 xxd 표현을 제공하겠습니다.

프로그램 (129 바이트) :

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                                       /

데이터 (369 바이트) :

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                                       .

설명

(업데이트 된) 제공된 점수 (나중에 자세히 설명)를 0에서 24 사이의 값을 가진 바이트를 포함하는 단일 문자열로 엉망으로 만들었습니다. 노트 길이가 먼저 나옵니다. 그런 다음 메모 값은 mod 25를 나타내며 차이 인코딩됩니다. 차이 인코딩의 이유는 전치에서 반복되는 계대가 동일한 순서로 감소되고 압축 될 수 있기 때문이다.

그런 다음 이전에 언급 한 (그리고이 골프에서 경쟁하기 위해 향상시킨) 문자열 대 골프 스크립트 압축 프로그램을 통해 데이터 파일을 가져 왔습니다.이 파일은 프로그램의 첫 부분에서 압축 해제되었습니다.

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

태그가 붙은 많은 질문을 본 사람에게 친숙한 유형의 간단한 문법 확장입니다 .

그런 다음이 문자열을 쌍으로 나누고 쌍 [length note]을 반복합니다. 인쇄 할 수없는 문자는 음표에 대한 주파수 매개 변수가 포함 된 마술 문자열에서 나옵니다. 필자는 정수 배열의 GolfScript의 암시 적 잘라 내기 모드 256을 사용하여 삼각형 파동 *을 생성하기 위해 문자열로 변환하므로 기본 주파수는 22050/256입니다. Hz. 좋은 튜닝을 제공하는 정수 비율을 찾는 프로그램을 작성했습니다. 매직 스트링은 분자를 포함하고, 분모 (17)는 모든 음에 대해 동일하다. 평균 튜닝 오류는 약 3.4 센트입니다.

음표 길이는 그대로 표시되며 이전 버전의 점수보다 훨씬 그럴듯합니다. 내가 의심 한 것처럼, 반올림은 문자열의 중복성을 증가시키고 압축 배열을 저장하는 것은 말할 것도없이 압축 된 데이터 파일을 30 바이트 단축했습니다. 그러나 여전히 의심스러운 구절이 있습니다.

72 13

또는

71 9
69 2
71 2

점수의 나머지 막대보다 6 분의 1의 크로 셰 뜨개질 바를 제공하고

85 9
85 4
85 24
85 23

또는

83 18
88 7
85 24
85 23

바는 정수이지만, 모호한 오프셋이 있습니다.

프로그램이 약간 짧을 수 있습니다. 나는 고의적으로 집행 시간을 짧게 거래하기로 결정했습니다. Darren Smith에게 제출 한 골프 스크립트 인터프리터의 속도가 향상되었으며 어느 시점에 게시 할 예정인 현재 버전은 내 컴퓨터에서 15 분 이내에 실행됩니다. puts노트를 생성 한 후에 각 노트를 작성 하지 않으면 훨씬 느리게 실행됩니다.

* 나는 사각 파를 사용하는 모든 사람에 대한 나의 의견이 잘못되었다고 고백합니다.


GolfScript를 올바르게 실행하는 방법? 나는 base64 -d <<< 'MjU2Y.....9Lw==' | golfscript를 시도 하고 golfscript:405:in 'scan': invalid byte sequence in UTF-8 (ArgumentError)(물론 프로그램을 파일로 저장하면 동일)
Vi.

음 길이는 미가공 알고리즘을 사용하여 MIDI 파일에서 추출됩니다 (play.pl에 대한 주석 참조). 음표 길이를 깔끔하게 수정하겠습니다.
Vi.

요지를 업데이트했습니다. 이제 음표의 최소 길이는 1입니다.
Vi.

온라인 인터프리터를 사용하여 실행하려고하면 (삽입 된 코드는 다음과 같습니다 㔲戶獡⁥㌷慢敳せ为⽝㐨ⰴ屻ㅛ⤤⽝㉜㴤紪尯⤬⵻⭽⸥㈬⼯楺筰乾㈫┵为笧誂鮒꺤쎸��䇿䥅前屗慜浧❴㨽㭦∩ĦĂ༃ጔ؏༆ณؕḧ⸘研��⒖✏㰢⭻⩽㐴Ⱚ⹻〵⨾⩦㜱ⸯ⸮╽✧渺瀫瑵絳/) undefined method nil : NilClass`
Vi에

1
온라인 통역사에서 실행될 방법도 없습니다. 시간이 초과됩니다.
피터 테일러

2

x86 기계 코드-513 바이트

이것은 플레이에 적합한 형식으로 출력하는 대신 미디를 재생하기 때문에 도전 과제를 완전히 충족시키지 못합니다.

실행 가능한 .COM 파일 및 asm 소스 코드 -음악을 시작하는 데 최대 14 초가 걸릴 수 있습니다. 타이머 해상도가 1/18 초이므로 약간 느리게 재생됩니다.

음악은 피보나치 코딩 과 이전에 디코딩 된 음악으로 구성된 사전을 사용하여 375 바이트로 인코딩됩니다 .

의사 코드 디코딩 알고리즘 :

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

음악이 해독되면 음악을 Midi 포트로 출력하기 만하면됩니다.


1
자체 제공하는 대신 기존 신디사이저 (이 경우 오디오 카드 내부의 MIDI)에 의존합니다.
Vi.

신시사이저를 해킹하여 샘플을 각 포트 또는 stdout / file (DOS 또는 Linux syscalls 사용)로 출력 할 수 있습니다. 별도의 문제로, 본격적인 다성 MIDI (여전히 단일 COM 파일로 압축)를 사용하여 버전을 만들 수 있습니다.
Vi.

신디사이저가 아니라 도전의 '컴팩트 한 모차르트 음악'측면에 관심이 있습니다. 재미 있고 도전에서 이기기보다는 다른 사람들에게 흥미로워 야하기 때문에 이것을 게시하고 있습니다.
Sir_Lagsalot

확인. Arduino 버전을 기다리는 중 ...
Vi.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.