Compare commits

...

3 commits

Author SHA1 Message Date
d10686a994 sample substitution demo
All checks were successful
/ build (push) Successful in 44s
2025-07-11 19:24:19 -07:00
95fdf4f136 remove unused octave command 2025-07-11 18:56:58 -07:00
1111b39b90 down to 1115 2025-07-11 18:41:44 -07:00
3 changed files with 52 additions and 35 deletions

View file

@ -1,36 +1,35 @@
<META NAME=VIEWPORT CONTENT=INITIAL=SCALE=1>
<CENTER>
<P><A HREF=http://nycki.net/qrplay>qrplay v3b</A></P>
<TEXTAREA ID=F STYLE=WIDTH:MIN(40EM,99%);HEIGHT:9LH>; drum samples!
i 0000 1111 2222 4444 5555 6666 7777 8888 9999
<P><A HREF=http://nycki.net/qrplay>qrplay v3b</A><br>by nycki and SArpnt</P>
<TEXTAREA ID=F STYLE=WIDTH:MIN(40EM,99%);HEIGHT:9LH>; @title nupa's theme
; @authors nycki bsp
; single channel version
hx@
1[@0000]
; you can overwrite samples
0[-c+c]
00000000
2[
0[c-c+]1 1
0[e-c+]1 0[g-c+]1
0[c-b!+]1 1
0[e-b!+]1 0[g-b!+]1
0[d-a+]1 0[c-a+]1
]
hx@
2
0[d-a+]1 0[c-a+]1
0[d#-a!+]1 0[d-a!+]1
1 1
; state is NOT preserved when playing samples
0[cdefgab+]
0000
; state IS preserved during parallel play
@q {-ggeec}
cdefg
hx@
; infinite loop
0[i9x9x6xxx0]
0
2
0[d#-a!+]1 0[d-g+]1
0[c--c++]1 1
1 1
</TEXTAREA><P>
<BUTTON onclick="
F.A?.close();
F.A=A=new AudioContext;
// kill some time for the audio context to start?
S='@xx'+F.value;
// kill some time for the audio context to start
S='@qx@'+F.value;
// stack
B=[];
// stack variables
@ -49,7 +48,7 @@ C=[
'-ffed#ddc#',
'dddddd#e',
'--ba#bb-a+a#-b'
].map(c=>`{o06m${c}}x`);
].map(c=>`{@++m${c}}x`);
// main loop
M=_=>{
@ -57,7 +56,7 @@ M=_=>{
// next index into S
s=1;
// opcode
z='\n;+-@.3cdefgabx012456789jtsiqhwmuvo{}'.indexOf(a);
z='\n;+-@.3cdefgabx012456789jtsiqhwmuv{}'.indexOf(a);
// no match
z<0?0:
@ -68,8 +67,7 @@ M=_=>{
// reset octave and length
z<5?(O=0,L=1):
// dots and triplets
z<6?L*=3/2:
z<7?L/=3:
z<7?L*=3/(z<6?2:9):
// note or rest
z<15?(
z-=7,
@ -104,14 +102,11 @@ M=_=>{
z<33?(U=b+c+d,s+=3):
// change volume
z<34?(V=b+c,s+=2):
// change octave
z<35?(O=b+c-4,s+=2):
// play simultaneously
z<36?B[Z++]={L,O,T,U,V}:
z<35?B[Z++]={L,O,T,U,V}:
{L,O,T,U,V}=B[--Z];
// loop
S=S.slice(s);
S&&setTimeout(M)
(S=S.slice(s))&&setTimeout(M)
};M()
">#play</BUTTON> <BUTTON ONCLICK=F.A.close()>#stop</BUTTON>
">#play</BUTTON> <BUTTON ONCLICK=F.A.close()>#stop

View file

@ -1 +1,23 @@
<META NAME=VIEWPORT CONTENT=INITIAL=SCALE=1><CENTER><P><A HREF=http://nycki.net/qrplay>qrplay v3b</A></P><TEXTAREA ID=F STYLE=WIDTH:MIN(40EM,99%);HEIGHT:9LH></TEXTAREA><P><BUTTON onclick="F.A?.close();F.A=A=new AudioContext;S='@xx'+F.value;B=[];K=O=T=Z=L=0;U=137;V=40;C=['+g','-b+c#deff#g','g++ddb--g++ddb',,'+ea-g--b++g++c#','a#ga#g-a#+g-b+g','-a++c#-aae+e--a','-ffed#ddc#','dddddd#e','--ba#bb-a+a#-b'].map(c=>`{o06m${c}}x`);M=_=>{[a,b,c,d]=S;s=1;z='\n;+-@.3cdefgabx012456789jtsiqhwmuvo{}'.indexOf(a);z<0?0:z<2?K=z:K?0:z<4?O+=a+1|0:z<5?(O=0,L=1):z<6?L*=3/2:z<7?L/=3:z<15?(z-=7,o=new OscillatorNode(A,{type:'square',detune:100*(z*2-(z>2)-(b=='!')+(b=='#')+12*O-9)}),g=new GainNode(A,{gain:z<7&&.5**(12-V/5)}),o.connect(g),g.connect(A.destination),o.start(T),o.stop(T+=7.5*L/U)):z<22&&b=='['?(m=0,d=B.findIndex.call(S,c=>c=='['?!++m:c==']'?!--m:0),C[a]=S.slice(s,d),s=d+1):z<24?S=C[a]+S.slice(s--):z<31?L=2**(z-25):z<32?L=U/2**11:z<33?(U=b+c+d,s+=3):z<34?(V=b+c,s+=2):z<35?(O=b+c-4,s+=2):z<36?B[Z++]={L,O,T,U,V}:{L,O,T,U,V}=B[--Z];S=S.slice(s);S&&setTimeout(M)};M()">#play</BUTTON> <BUTTON ONCLICK=F.A.close()>#stop</BUTTON>
<META NAME=VIEWPORT CONTENT=INITIAL=SCALE=1><CENTER><P><A HREF=http://nycki.net/qrplay>qrplay v3b</A><br>by nycki and SArpnt</P><TEXTAREA ID=F STYLE=WIDTH:MIN(40EM,99%);HEIGHT:9LH>; @title nupa's theme
; @authors nycki bsp
; single channel version
1[@0000]
2[
0[c-c+]1 1
0[e-c+]1 0[g-c+]1
0[c-b!+]1 1
0[e-b!+]1 0[g-b!+]1
0[d-a+]1 0[c-a+]1
]
2
0[d-a+]1 0[c-a+]1
0[d#-a!+]1 0[d-a!+]1
1 1
2
0[d#-a!+]1 0[d-g+]1
0[c--c++]1 1
1 1</TEXTAREA><P><BUTTON onclick="F.A?.close();F.A=A=new AudioContext;S='@qx@'+F.value;B=[];K=O=T=Z=L=0;U=137;V=40;C=['+g','-b+c#deff#g','g++ddb--g++ddb',,'+ea-g--b++g++c#','a#ga#g-a#+g-b+g','-a++c#-aae+e--a','-ffed#ddc#','dddddd#e','--ba#bb-a+a#-b'].map(c=>`{@++m${c}}x`);M=_=>{[a,b,c,d]=S;s=1;z='\n;+-@.3cdefgabx012456789jtsiqhwmuv{}'.indexOf(a);z<0?0:z<2?K=z:K?0:z<4?O+=a+1|0:z<5?(O=0,L=1):z<7?L*=3/(z<6?2:9):z<15?(z-=7,o=new OscillatorNode(A,{type:'square',detune:100*(z*2-(z>2)-(b=='!')+(b=='#')+12*O-9)}),g=new GainNode(A,{gain:z<7&&.5**(12-V/5)}),o.connect(g),g.connect(A.destination),o.start(T),o.stop(T+=7.5*L/U)):z<22&&b=='['?(m=0,d=B.findIndex.call(S,c=>c=='['?!++m:c==']'?!--m:0),C[a]=S.slice(s,d),s=d+1):z<24?S=C[a]+S.slice(s--):z<31?L=2**(z-25):z<32?L=U/2**11:z<33?(U=b+c+d,s+=3):z<34?(V=b+c,s+=2):z<35?B[Z++]={L,O,T,U,V}:{L,O,T,U,V}=B[--Z];(S=S.slice(s))&&setTimeout(M)};M()">#play</BUTTON> <BUTTON ONCLICK=F.A.close()>#stop

View file

@ -1 +1 @@
data:text/html,<META%20NAME=VIEWPORT%20CONTENT=INITIAL=SCALE=1><CENTER><P><A%20HREF=http://nycki.net/qrplay>qrplay%20v3b</A></P><TEXTAREA%20ID=F%20STYLE=WIDTH:MIN(40EM,99%);HEIGHT:9LH></TEXTAREA><P><BUTTON%20onclick="F.A?.close();F.A=A=new%20AudioContext;S='@xx'+F.value;B=[];K=O=T=Z=L=0;U=137;V=40;C=['+g','-b+c%23deff%23g','g++ddb--g++ddb',,'+ea-g--b++g++c%23','a%23ga%23g-a%23+g-b+g','-a++c%23-aae+e--a','-ffed%23ddc%23','dddddd%23e','--ba%23bb-a+a%23-b'].map(c=>`{o06m${c}}x`);M=_=>{[a,b,c,d]=S;s=1;z='\n;+-@.3cdefgabx012456789jtsiqhwmuvo{}'.indexOf(a);z<0?0:z<2?K=z:K?0:z<4?O+=a+1|0:z<5?(O=0,L=1):z<6?L*=3/2:z<7?L/=3:z<15?(z-=7,o=new%20OscillatorNode(A,{type:'square',detune:100*(z*2-(z>2)-(b=='!')+(b=='%23')+12*O-9)}),g=new%20GainNode(A,{gain:z<7&&.5**(12-V/5)}),o.connect(g),g.connect(A.destination),o.start(T),o.stop(T+=7.5*L/U)):z<22&&b=='['?(m=0,d=B.findIndex.call(S,c=>c=='['?!++m:c==']'?!--m:0),C[a]=S.slice(s,d),s=d+1):z<24?S=C[a]+S.slice(s--):z<31?L=2**(z-25):z<32?L=U/2**11:z<33?(U=b+c+d,s+=3):z<34?(V=b+c,s+=2):z<35?(O=b+c-4,s+=2):z<36?B[Z++]={L,O,T,U,V}:{L,O,T,U,V}=B[--Z];S=S.slice(s);S&&setTimeout(M)};M()">%23play</BUTTON>%20<BUTTON%20ONCLICK=F.A.close()>%23stop</BUTTON>
data:text/html,<META%20NAME=VIEWPORT%20CONTENT=INITIAL=SCALE=1><CENTER><P><A%20HREF=http://nycki.net/qrplay>qrplay%20v3b</A></P><TEXTAREA%20ID=F%20STYLE=WIDTH:MIN(40EM,99%);HEIGHT:9LH></TEXTAREA><P><BUTTON%20onclick="F.A?.close();F.A=A=new%20AudioContext;S='@xx'+F.value;B=[];K=O=T=Z=L=0;U=137;V=40;C=['+g','-b+c%23deff%23g','g++ddb--g++ddb',,'+ea-g--b++g++c%23','a%23ga%23g-a%23+g-b+g','-a++c%23-aae+e--a','-ffed%23ddc%23','dddddd%23e','--ba%23bb-a+a%23-b'].map(c=>`{o06m${c}}x`);M=_=>{[a,b,c,d]=S;s=1;z='\n;+-@.3cdefgabx012456789jtsiqhwmuvo{}'.indexOf(a);z<0?0:z<2?K=z:K?0:z<4?O+=a+1|0:z<5?(O=0,L=1):z<6?L*=3/2:z<7?L/=3:z<15?(z-=7,o=new%20OscillatorNode(A,{type:'square',detune:100*(z*2-(z>2)-(b=='!')+(b=='%23')+12*O-9)}),g=new%20GainNode(A,{gain:z<7&&.5**(12-V/5)}),o.connect(g),g.connect(A.destination),o.start(T),o.stop(T+=7.5*L/U)):z<22&&b=='['?(m=0,d=B.findIndex.call(S,c=>c=='['?!++m:c==']'?!--m:0),C[a]=S.slice(s,d),s=d+1):z<24?S=C[a]+S.slice(s--):z<31?L=2**(z-25):z<32?L=U/2**11:z<33?(U=b+c+d,s+=3):z<34?(V=b+c,s+=2):z<35?(O=b+c-4,s+=2):z<36?B[Z++]={L,O,T,U,V}:{L,O,T,U,V}=B[--Z];S=S.slice(s);S&&setTimeout(M)};M()">%23play</BUTTON>%20<BUTTON%20ONCLICK=F.A.close()>%23stop