Bill Allombert on Fri, 11 Jul 2025 15:02:27 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: playing music with GP |
On Thu, Jul 10, 2025 at 01:25:12PM -0700, American Citizen wrote: > Hmmm, Hans, your script works great, but there seems to be a mild > dissonance, due to the scale of octave being used. Are you using chromatic > scale? I am curious, because the exact tones don't match my orchestral > memory of those tones in "Ode to Joy" I am not a musician and there are so many way this could be wrong. Anyway, I have made a new version incorporating Hans improvement. Cheers, Bill
FREQ=8000; A=440; TEMPO=60/100*4; start() = fileextern(Str("aplay -r",FREQ," -q -traw"),"w"); freq(n)= 2^(n/12)*A; lerp(a,b,t) = a*(1-t)+b*t; adsr(i,l,a,d,s,r) = { if( i<a, i/a, i<a+d, lerp(1,s,(i-a)/d), i>l-r, lerp(0,s,(l-i)/r), s); } playnote(f,freq,t)= { my(l=FREQ*TEMPO*t,a=FREQ*0.025,d=FREQ*0.05,s=0.66,r=FREQ*0.05); for(i=1,l, my(c=2*Pi*freq*i/FREQ); my(r=round(128+adsr(i,l,a,d,s,r)*(120*sin(c)))); filewrite1(f,strchr(r)); ); fileflush(f); } my(note=Map(["a",0;"b",2;"c",3;"d",5;"e",7;"f",8;"g",10])); play(f,s)= { my(p,m=1,V=Vec(s),T=4); p=mapget(note,V[1]); foreach(V[^1],c,if(c=="#",p++, c=="b",p--, c=="'",p+=12, c==",",p-=12, c==".",m=3/2, T=eval(c))); playnote(f,freq(p),m/T); } ode_to_joy=strsplit("b b c d d c b a g, g, a b b. a8 a2 b b c d d c b a g, g, a b a. g,8 g,2"," "); ode_to_joy2=strsplit("d d eb f f eb d c bb bb c d d. c8 c2 d d eb f f eb d c bb bb c d c. bb8 bb2"," "); f = start(); for(i=1,#ode_to_joy2,play(f,ode_to_joy[i])); fileclose(f);