reusable percussion
All checks were successful
/ build (push) Successful in 44s

This commit is contained in:
Nycki 2025-07-07 17:19:04 -07:00
parent 347ee76cf0
commit 37457b694e
2 changed files with 10 additions and 16 deletions

View file

@ -26,35 +26,28 @@ r=.4; // speed in s/beat
l=1; // note length in beats
T=[]; // elapsed beats per channel
v=f.value; // input text
s=A.sampleRate;
W=A.createBuffer(1,2*s,s);
for(i=0;i++<2*s;W.getChannelData(0)[i]=Math.random()*3-1);
w=A.createBufferSource();
w.buffer=W;
w.loop=true;
w.connect(B);
// white noise for percussion
W=A.createBuffer(1,s=A.sampleRate,s);
for(i=0;i++<2*s;W.getChannelData(0)[i]=Math.random()*2-1);
p=n=>(n.connect(B),n.start(t*r),t+=l,n.stop(t*r)); // todo: can this be inlined?
for(
i=o=k=t=Z=0;
// loop over input, look ahead one character for sharp/flat
// see bottom of loop for z and g initializers
c=v[i++],d=v[i],c;
z<0?0: // unknown character, ignore
!z?(o=0,l=1/8): // @ reset
z<3?o+=g: // -+ change octave
z>28?k=z-29:// start or end of comment. POVUKR multi-character codes not implemented.
k?0: // middle of comment
z>27?(T[Z]=t,Z=+v.slice(i,i+=2),t=T[Z]||0): // change channel
z>18?(w.start(t*r),t+=l,w.stop(t*r)):
// play white noise for 012456789. 3 is omitted on purpose, used for triplets.
z>18?p((w=A.createBufferSource(),w.buffer=W,w.loop=1,w)):
z>17?t+=l: // rest. 012456789 percussion not implemented.
z&1?l=g: // change note length
( // play note
a=new OscillatorNode(A,{
type:'square',
detune:100*(g+o+(d=='#')-(d=='!')) // # sharp or ! flat
}),
a.connect(B),a.start(t*r),t+=l,a.stop(t*r)
)
// play music note ABCDEFG, suffix # for sharp or ! for flat
p(new OscillatorNode(A,{type:'square',detune:100*(g+o+(d=='#')-(d=='!'))}))
// type of g varies depending on the operation
) g=[,-12,12,4,-9,2,-7,1,-5,.5,-4,.25,-2,1/8,0,l/3,2,l*1.5][z=`@-+wchdqeifsgta3b.x012456789z\npovukr'`.indexOf(c.toLowerCase())]
">#play</button> <button onclick=f.A.close()>#stop</button>

View file

@ -0,0 +1 @@
<meta name=viewport content=width=device-width,initial-scale=1><textarea id=f></textarea><br><button onclick="/*qrplay v2a, nycki & SArpnt, 2025*/f.A?.close();B=new GainNode(f.A=A=new AudioContext,{gain:0.1});B.connect(A.destination);r=.4;l=1;T=[];v=f.value;W=A.createBuffer(1,s=A.sampleRate,s);for(i=0;i++<2*s;W.getChannelData(0)[i]=Math.random()*2-1);p=n=>(n.connect(B),n.start(t*r),t+=l,n.stop(t*r));for(i=o=k=t=Z=0;c=v[i++],d=v[i],c;z<0?0:!z?(o=0,l=1/8):z<3?o+=g:z>28?k=z-29:k?0:z>27?(T[Z]=t,Z=+v.slice(i,i+=2),t=T[Z]||0):z>18?p((w=A.createBufferSource(),w.buffer=W,w.loop=1,w)):z>17?t+=l:z&1?l=g:p(new OscillatorNode(A,{type:'square',detune:100*(g+o+(d=='#')-(d=='!'))}))) g=[,-12,12,4,-9,2,-7,1,-5,.5,-4,.25,-2,1/8,0,l/3,2,l*1.5][z=`@-+wchdqeifsgta3b.x012456789z\npovukr'`.indexOf(c.toLowerCase())]">#play</button> <button onclick=f.A.close()>#stop</button>