Skip to content

Instantly share code, notes, and snippets.

@heerdyes
Last active October 20, 2024 14:19
Show Gist options
  • Save heerdyes/2dfeee4b57c42c26d709f0c0ffec3813 to your computer and use it in GitHub Desktop.
Save heerdyes/2dfeee4b57c42c26d709f0c0ffec3813 to your computer and use it in GitHub Desktop.
/ccjam.d/sonicpi/buffers
kc=nil
t=0.16
vab='0123456789abcdefghijklmnopqrstuvwxyz'
mz=[]
# 10 tracks
10.times do
mz.append({'q'=>'....', 'o'=>60, 'v'=>'t', 'mute'=>false, 'sy'=>:mod_fm,
'mw'=>'....', 'mp'=>'....', 'mr'=>'....',
'dv'=>'2', 'dp'=>'2',
'a'=>'1', 'd'=>'1', 's'=>'1', 'r'=>'1'})
end
ctr=0
# 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']='z.....'; mz[0]['o']=56; mz[0]['sy']=:mod_fm
mz[0]['v']='d'
mz[0]['a']='0'
mz[0]['d']='0'
mz[0]['s']='0'
mz[0]['r']='a'
mz[0]['mw']='1'
mz[0]['mp']='dcba9876543210'
mz[0]['mr']='222333444'
mz[0]['dv']='223344'
mz[0]['dp']='111222333444555'
mz[1]['q']='v...'; mz[1]['o']=46; mz[1]['sy']=:mod_fm
mz[1]['v']='s'
mz[1]['a']='0'
mz[1]['d']='0'
mz[1]['s']='0'
mz[1]['r']='5'
mz[1]['mw']='0'
mz[1]['mp']='8'
mz[1]['mr']='c'
mz[1]['dv']='2'
mz[1]['dp']='4'
mz[2]['q']='b.............'; mz[2]['o']=50; mz[2]['sy']=:bnoise
mz[2]['v']='579a97'
mz[2]['a']='p'
mz[2]['d']='0'
mz[2]['s']='0'
mz[2]['r']='9'
mz[2]['mw']='0'
mz[2]['mp']='0'
mz[2]['mr']='1'
mz[2]['dv']='1'
mz[2]['dp']='1'
mz[3]['q']='mxbn...............zbzxn......x..mxxm...'; mz[3]['o']=50; mz[3]['sy']=:mod_fm
mz[3]['v']='defeeccea99affa'
mz[3]['a']='0'
mz[3]['d']='0'
mz[3]['s']='6555644'
mz[3]['r']='0'
mz[3]['mw']='2'
mz[3]['mp']='33228888'
mz[3]['mr']='6'
mz[3]['dv']='3'
mz[3]['dp']='2'
sleep t
end
# the main loop
live_loop :mainlooper do
melostep 0
melostep 1
melostep 2
melostep 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==46 then
puts "muting everything"
10.times do |i|
mz[i]['mute']=true
end
elsif kc==47 then
puts "unmuting everything"
10.times do |i|
mz[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
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 :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
define :xoxdcode do |s,lim|
c=s[ctr%s.length]
v=vdcode c, lim
return v
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']
nt=ntdcode qi, oct
# velocity parsing
vy=xoxdcode mz[j]['v'], 1.0
# adsr parsing
atk=xoxdcode mz[j]['a'], 1.0
dcy=xoxdcode mz[j]['d'], 1.0
sus=xoxdcode mz[j]['s'], 1.0
rel=xoxdcode mz[j]['r'], 1.0
# mod_wave parsing
mmw=mz[j]['mw']
mwi=mmw[ctr%mmw.length]
mw=vab.index(mwi)%4
# mod_ (range,phase) parsing
mr=xoxdcode mz[j]['mr'], 12.0
mp=0.005 + (xoxdcode mz[j]['mp'], 4*t)
# divisor/depth parsing
dv=0.1 + (xoxdcode mz[j]['dv'], 10.0)
dp=0.1 + (xoxdcode mz[j]['dp'], 10.0)
# plug the synth
use_synth mz[j]['sy']
play nt, amp: vy,
attack: atk, decay: dcy, sustain: sus, release: rel,
mod_phase:mp, mod_range:mr, mod_wave:mw,
divisor: dv, depth: dp
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