Last active
October 20, 2024 14:19
-
-
Save heerdyes/2dfeee4b57c42c26d709f0c0ffec3813 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 | |
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