Last active
October 20, 2024 13:30
-
-
Save heerdyes/65bb52990c86ac1d31db32054fb0968a to your computer and use it in GitHub Desktop.
/ccjam.d/sonicpi/buffers
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
kc=nil | |
vab='0123456789abcdefghijklmnopqrstuvwxyz' | |
mz=[] | |
pz=[] | |
# 10 tracks each for melody and samples | |
10.times do | |
mz.append({'q'=>'....', 'o'=>60, 'sy'=>:beep, 'v'=>'tttt', 'a'=>'1111', 'r'=>'1111', 'mute'=>false}) | |
pz.append({'q'=>'....', 'v'=>'mmmm', 'mute'=>false}) | |
end | |
ctr=0 | |
t=0.18 | |
# osc keyboard fsm state | |
# 0 -> m -> 1 -> [0-9] -> 0 | |
# 0 -> p -> 2 -> [0-9] -> 0 | |
state=0 | |
live_loop :loopmod do | |
# melody tracks | |
mz[0]['q']='....'; mz[0]['o']=60; mz[0]['sy']=:dtri | |
mz[0]['v']='k' | |
mz[0]['a']='1' | |
mz[0]['r']='1' | |
mz[1]['q']='....'; mz[1]['o']=60; mz[1]['sy']=:cnoise | |
mz[1]['v']='e' | |
mz[1]['a']='2' | |
mz[1]['r']='1' | |
mz[2]['q']='....'; mz[2]['o']=60; mz[2]['sy']=:blade | |
mz[2]['v']='h' | |
mz[2]['a']='3' | |
mz[2]['r']='2' | |
mz[3]['q']='....'; mz[3]['o']=60; mz[3]['sy']=:dpulse | |
mz[3]['v']='f' | |
mz[3]['a']='1' | |
mz[3]['r']='1' | |
# sample tracks | |
pz[0]['q']='....' | |
pz[0]['v']='r' | |
pz[1]['q']='....' | |
pz[1]['v']='c' | |
pz[2]['q']='....' | |
pz[2]['v']='k' | |
pz[3]['q']='....' | |
pz[3]['v']='g' | |
sleep t | |
end | |
# the main loop | |
live_loop :mainlooper do | |
melostep 0 | |
melostep 1 | |
melostep 2 | |
melostep 3 | |
smplstep 0 | |
smplstep 1 | |
smplstep 2 | |
smplstep 3 | |
ctrstep | |
sleep t | |
end | |
# osc control interface | |
live_loop :nwp5 do | |
use_real_time | |
args = sync "/osc*/picmd" | |
kc=args[0] | |
puts kc | |
# fsm for melo/samp track toggling | |
if state==0 then | |
if kc==77 then | |
state=1 | |
puts "melody track toggle state" | |
elsif kc==80 then | |
state=2 | |
puts "sample track toggle state" | |
elsif kc==46 then | |
puts "muting everything" | |
10.times do |i| | |
mz[i]['mute']=true | |
pz[i]['mute']=true | |
end | |
elsif kc==47 then | |
puts "unmuting everything" | |
10.times do |i| | |
mz[i]['mute']=false | |
pz[i]['mute']=false | |
end | |
end | |
elsif state==1 then | |
if kc==10 then | |
state=0 | |
puts "back to state 0" | |
elsif kc==46 then | |
puts "muting all melody tracks" | |
10.times do |i| | |
mz[i]['mute']=true | |
end | |
elsif kc==47 then | |
puts "unmuting all melody tracks" | |
10.times do |i| | |
mz[i]['mute']=false | |
end | |
else | |
trk=kc-48 | |
mz[trk]['mute']=!mz[trk]['mute'] | |
puts "toggled track #{trk}" | |
end | |
elsif state==2 then | |
if kc==10 then | |
state=0 | |
puts "back to state 0" | |
elsif kc==46 then | |
puts "muting all sample tracks" | |
10.times do |i| | |
pz[i]['mute']=true | |
end | |
elsif kc==47 then | |
puts "unmuting all sample tracks" | |
10.times do |i| | |
pz[i]['mute']=false | |
end | |
else | |
trk=kc-48 | |
pz[trk]['mute']=!pz[trk]['mute'] | |
end | |
end | |
end | |
# keymap | |
keytab={ | |
'z'=>0, 's'=>1, | |
'x'=>2, 'd'=>3, | |
'c'=>4, | |
'v'=>5, 'g'=>6, | |
'b'=>7, 'h'=>8, | |
'n'=>9, 'j'=>10, | |
'm'=>11, | |
'Z'=>12, 'S'=>13, | |
'X'=>14, 'D'=>15, | |
'C'=>16, | |
'V'=>17, 'G'=>18, | |
'B'=>19, 'H'=>20, | |
'N'=>21, 'J'=>22, | |
'M'=>23 | |
} | |
define :ntdcode do |c,o| | |
if not keytab.key?(c) then | |
puts "#{c} is not a key!" | |
return o | |
end | |
return o+keytab[c] | |
end | |
define :smpldcode do |c| | |
samplist=[:drum_bass_hard, :drum_bass_soft, | |
:drum_cowbell, :drum_cymbal_closed, | |
:drum_cymbal_hard, | |
:drum_cymbal_open, :drum_cymbal_pedal, | |
:drum_cymbal_soft, :drum_heavy_kick, | |
:drum_roll, :drum_snare_hard, | |
:drum_snare_soft, | |
:drum_splash_hard, :drum_splash_soft, | |
:drum_tom_hi_hard, :drum_tom_hi_soft, | |
:drum_tom_lo_hard, | |
:drum_tom_lo_soft, :drum_tom_mid_hard, | |
:drum_tom_mid_soft, :bd_fat, | |
:bd_haus, :bd_klub, | |
:bd_fat] | |
if not keytab.key?(c) then | |
puts "#{c} is not a key!" | |
return :elec_chime | |
end | |
return samplist[keytab[c]] | |
end | |
define :vdcode do |c,mx| | |
if not vab[c] then | |
puts "#{c} not an alphanumeral" | |
return 0 | |
end | |
vi=vab.index(c) | |
return (vi/(10.0+26.0)) * mx | |
end | |
# melody stepper | |
define :melostep do |j| | |
if mz[j]['mute'] then; return; end | |
# note parsing | |
mq=mz[j]['q'] | |
qi=mq[ctr%mq.length] | |
if qi=='.' then; return; end | |
oct=mz[j]['o'] | |
sy=mz[j]['sy'] | |
nt=ntdcode qi, oct | |
# velocity parsing | |
mv=mz[j]['v'] | |
vi=mv[ctr%mv.length] | |
vy=vdcode vi, 1.0 | |
# attack parsing | |
ma=mz[j]['a'] | |
ai=ma[ctr%ma.length] | |
atk=vdcode ai, 1.0 | |
# release parsing | |
mr=mz[j]['r'] | |
ri=mr[ctr%mr.length] | |
rel=vdcode ri, 1.0 | |
# play note | |
use_synth sy | |
play nt, amp: vy, attack: atk, release: rel | |
end | |
# percussion stepper | |
define :smplstep do |j| | |
if pz[j]['mute'] then; return; end | |
pq=pz[j]['q'] | |
qi=pq[ctr%pq.length] | |
if qi=='.' then; return; end | |
smp=smpldcode qi | |
# velocity parsing | |
pv=pz[j]['v'] | |
vi=pv[ctr%pv.length] | |
vy=vdcode vi, 1.0 | |
# trigger sample | |
sample smp, amp: vy | |
end | |
define :ctrstep do | |
ctr=ctr+1 | |
if ctr>=4096 then | |
ctr=0 | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment