Skip to content

Instantly share code, notes, and snippets.

@heerdyes
Last active October 20, 2024 13:30
Show Gist options
  • Save heerdyes/65bb52990c86ac1d31db32054fb0968a to your computer and use it in GitHub Desktop.
Save heerdyes/65bb52990c86ac1d31db32054fb0968a to your computer and use it in GitHub Desktop.
/ccjam.d/sonicpi/buffers
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