Description:
I continually get suggested Sonic Pi videos by Youtube which looks like a utility for programming music via coding.
Here is my work so far making a blueprint for something similar for Xpressive instrument. Unlike my other patches, this one is in ExprTk parsing (the newer version with variables). Unfortunately xpressive does not support user defined functions so it is a bit messy. Delete the comments as Xpressive does not like comments. The actual file has no comments in O1:
// = TIMING & CLOCK =
// The tempo is pulled from LMMS.
// Set the tempo and trigger a note the number of bars
var b_rate := tempo / 60;
var s_rate := b_rate * 4;
// Phases for envelopes (0.0 to 1.0)
var step_ph := mod(t * s_rate, 1);
var beat_ph := mod(t * b_rate, 1);
// Counters for steps (0-15), beats (0-3) and the loop (0-15)
var s_idx := floor(mod(t * s_rate, 16));
var b_idx := floor(mod(t * b_rate, 4));
var bar_idx := floor(t * b_rate / 4);
var cur_bar := mod(bar_idx, 16);
// = COMPRESSION =
// Triggers on steps 0, 4, 8, 12. Change these numbers to trigger sidechain on different beats
var duck_t := (s_idx==0) + (s_idx==4) + (s_idx==8) + (s_idx==12);
// 0.85 is the ducking depth out of 1.00.
var ducking := 1.0 - (duck_t * exp(-step_ph * 6) * 0.85);
// = DRUM MACHINE =
// Kick drum triggers on 0, 4, 8, 12.
var k_trig := (mod(s_idx, 4) == 0);
var kick_a := k_trig * exp(-step_ph * 15) * sin(2 * pi * (50 * t - 5 * exp(-step_ph * 40)));
// Closed Hats triggers on offbeats (2, 6, 10, 14) with variable velocities.
var ch_trig := (mod(s_idx, 4) == 2);
var ch_vel := (s_idx==2)*1.0 + (s_idx==6)*0.5 + (s_idx==10)*1.0 + (s_idx==14)*0.6;
var chat_a := ch_trig * ch_vel * exp(-step_ph * 40) * sin(20000 * t * cos(15000 * t));
// Open Hats: Triggers on steps 2 and 10, only active after bar 8 (cur_bar >= 8).
var oh_trig := (s_idx==2) + (s_idx==10);
var ohat_a := oh_trig * exp(-step_ph * 5) * sin(20000 * t * cos(10000 * t)) * (cur_bar >= 8);
// Snare triggers on 4 and 12.
var sn_norm := (s_idx==4) + (s_idx==12);
var sn_stut := (mod(s_idx, 2) == 0) * (s_idx > 7);
var is_fill := (mod(cur_bar, 4) == 3);
var sn_trig := (1 - is_fill) * sn_norm + is_fill * sn_stut;
var sn_phas := 0.5 + 0.5 * sin(2 * pi * 0.2 * t); // Snare phaser LFO
var snare_a := sn_trig * exp(-step_ph * 20) * (sin(2*pi*200*t)*0.4 + sin(20000*t*cos(15000*t))*0.6*sn_phas);
// = 16 BAR MONO SEQUENCER =
// Format: (s_idx==[step])*[MIDI Note]
var b00 := (s_idx==0)*33 + (s_idx==3)*33 + (s_idx==6)*45 + (s_idx==9)*33 + (s_idx==12)*45;
var b01 := (s_idx==0)*33 + (s_idx==3)*33 + (s_idx==6)*45 + (s_idx==9)*33 + (s_idx==12)*45;
var b02 := (s_idx==0)*33 + (s_idx==3)*33 + (s_idx==6)*45 + (s_idx==9)*33 + (s_idx==12)*45;
var b03 := (s_idx==0)*33 + (s_idx==3)*45 + (s_idx==6)*33 + (s_idx==9)*45 + (s_idx==12)*33;
var b04 := (s_idx==0)*36 + (s_idx==3)*36 + (s_idx==6)*48 + (s_idx==9)*36 + (s_idx==12)*48;
var b05 := (s_idx==0)*36 + (s_idx==3)*36 + (s_idx==6)*48 + (s_idx==9)*36 + (s_idx==12)*48;
var b06 := (s_idx==0)*36 + (s_idx==3)*36 + (s_idx==6)*48 + (s_idx==9)*36 + (s_idx==12)*48;
var b07 := (s_idx==0)*36 + (s_idx==3)*48 + (s_idx==6)*36 + (s_idx==9)*48 + (s_idx==12)*36;
var b08 := (s_idx==0)*31 + (s_idx==3)*31 + (s_idx==6)*43 + (s_idx==9)*31 + (s_idx==12)*43;
var b09 := (s_idx==0)*31 + (s_idx==3)*31 + (s_idx==6)*43 + (s_idx==9)*31 + (s_idx==12)*43;
var b10 := (s_idx==0)*31 + (s_idx==3)*31 + (s_idx==6)*43 + (s_idx==9)*31 + (s_idx==12)*43;
var b11 := (s_idx==0)*31 + (s_idx==3)*43 + (s_idx==6)*31 + (s_idx==9)*43 + (s_idx==12)*31;
var b12 := (s_idx==0)*33 + (s_idx==2)*33 + (s_idx==4)*33 + (s_idx==6)*45;
var b13 := (s_idx==8)*33 + (s_idx==10)*33 + (s_idx==12)*45 + (s_idx==14)*45;
var b14 := (s_idx==0)*33 + (s_idx==2)*33 + (s_idx==4)*33 + (s_idx==6)*45;
var b15 := (s_idx==8)*45 + (s_idx==10)*45 + (s_idx==12)*45 + (s_idx==14)*57;
// Bank selector.
var bS1 := (cur_bar==0)*b00 + (cur_bar==1)*b01 + (cur_bar==2)*b02 + (cur_bar==3)*b03;
var bS2 := (cur_bar==4)*b04 + (cur_bar==5)*b05 + (cur_bar==6)*b06 + (cur_bar==7)*b07;
var bS3 := (cur_bar==8)*b08 + (cur_bar==9)*b09 + (cur_bar==10)*b10 + (cur_bar==11)*b11;
var bS4 := (cur_bar==12)*b12 + (cur_bar==13)*b13 + (cur_bar==14)*b14 + (cur_bar==15)*b15;
var cur_bass := bS1 + bS2 + bS3 + bS4;
var b_freq := 440 * pow(2, (cur_bass - 69) / 12);
var b_env := (cur_bass > 0) * exp(-step_ph * 8);
var f_lfo := 4.0 * sin(2 * pi * b_rate * 0.5 * t);
var f_cut := b_freq * (1.5 + 4.0 * exp(-step_ph*4) + f_lfo);
var bass_a := b_env * (2*mod(t*b_freq,1)-1) * 0.4 + b_env * sin(2*pi*f_cut*t) * 0.6;
var sub_a := b_env * sin(2*pi*(b_freq/2)*t) * 0.8;
// =CHORDS & GATE =
// Chords are mapped per beat (b_idx: 0, 1, 2, 3). Change the MIDI notes here.
var c00 := (b_idx==0)*57 + (b_idx==1)*57 + (b_idx==2)*53 + (b_idx==3)*55;
var c04 := (b_idx==0)*60 + (b_idx==1)*60 + (b_idx==2)*57 + (b_idx==3)*55;
var c08 := (b_idx==0)*55 + (b_idx==1)*55 + (b_idx==2)*52 + (b_idx==3)*53;
var c12 := (b_idx==0)*57 + (b_idx==1)*60 + (b_idx==2)*64 + (b_idx==3)*69;
var cur_chrd := (cur_bar<4)*c00 + (cur_bar>=4)*(cur_bar<8)*c04 + (cur_bar>=8)*(cur_bar<12)*c08 + (cur_bar>=12)*c12;
var c_freq := 440 * pow(2, (cur_chrd - 69) / 12);
var c_env := (cur_chrd > 0) * exp(-beat_ph * 2);
var c_ph1 := 2 * pi * c_freq * t;
var c_ph2 := 2 * pi * c_freq * 1.1892 * t;
var fm_i := 2.0 * exp(-beat_ph * 5);
var pad_c := (sin(c_ph1 + fm_i*sin(c_ph1*2.01)) + sin(c_ph2 + fm_i*sin(c_ph2*1.01))) * 0.33;
// Trance Gate to run faster (16th notes), change 's_rate * 2' to 's_rate * 4'.
var g_lfo := (mod(t * s_rate * 2, 1) < 0.5) * 1.0;
// Turns on the Trance Gate at selected bar.
var pad_g := pad_c * ((cur_bar >= 4) * g_lfo + (cur_bar < 4) * 1.0);
// Delay
var dt := t - (0.75 / b_rate);
var db := floor(mod(dt * b_rate, 4));
var dc00 := (db==0)*57 + (db==1)*57 + (db==2)*53 + (db==3)*55;
var dc04 := (db==0)*60 + (db==1)*60 + (db==2)*57 + (db==3)*55;
var dc08 := (db==0)*55 + (db==1)*55 + (db==2)*52 + (db==3)*53;
var dc12 := (db==0)*57 + (db==1)*60 + (db==2)*64 + (db==3)*69;
var d_chrd := (cur_bar<4)*dc00 + (cur_bar>=4)*(cur_bar<8)*dc04 + (cur_bar>=8)*(cur_bar<12)*dc08 + (cur_bar>=12)*dc12;
var d_freq := 440 * pow(2, (d_chrd - 69) / 12);
var pad_d := (d_chrd > 0) * exp(-mod(dt*b_rate,1)*2) * sin(2*pi*d_freq*dt) * 0.35 * (cur_bar >= 8);
var chrd_a := (c_env * pad_g * 0.4) + pad_d;
// =LEAD SYNTH=
var l00 := (s_idx==0)*69 + (s_idx==2)*72 + (s_idx==4)*76 + (s_idx==6)*74;
var l04 := (s_idx==8)*69 + (s_idx==10)*72 + (s_idx==12)*79 + (s_idx==14)*77;
var cur_ld := (cur_bar>=4)*(cur_bar<8)*l00 + (cur_bar>=8)*(cur_bar<12)*l04 + (cur_bar>=12)*l00;
var l_freq := 440 * pow(2, (cur_ld - 69) / 12);
var l_env := (cur_ld > 0) * exp(-step_ph * 4);
var l_sync := mod(mod(t * l_freq, 1) * (1.0 + 3.0 * l_env), 1);
var lead_a := l_env * (2 * l_sync - 1);
// =EFFECTS ===
// Noise Riser triggers on selected bar.
var r_ph := mod(t * b_rate / 4, 1);
var riser_a := (r_ph*r_ph) * sin(20000*t*cos(15000*t)) * sin(2*pi*(100+3000*r_ph)*t) * 0.3 * (cur_bar >= 12);
// =MASTER MIX=
// Adjust the multipliers to adjust the volumes.
var mix_d := kick_a*1.0 + snare_a*0.8 + chat_a*0.4 + ohat_a*0.5;
// Synths summed together and multiplied by the sidechain.
var mix_s := (bass_a*0.6 + sub_a*0.5 + chrd_a*0.6 + lead_a*0.4 + riser_a) * ducking;
tanh(mix_d + mix_s)
And an alternate way to structure it
var b_rate := tempo / 60;
var s_rate := b_rate * 4;
var step_ph := mod(t * s_rate, 1);
var beat_ph := mod(t * b_rate, 1);
var s_idx := floor(mod(t * s_rate, 16));
var b_idx := floor(mod(t * b_rate, 4));
var bar_idx := floor(t * b_rate / 4);
var cur_bar := mod(bar_idx, 16);
var is_pat_A := (cur_bar < 8);
var is_pat_B := (cur_bar >= 8);
var is_fill := (mod(cur_bar, 4) == 3);
var k_patA := (mod(s_idx, 4) == 0);
var sn_patA := (s_idx==4) + (s_idx==12);
var k_patB := (s_idx==0) + (s_idx==5) + (s_idx==8) + (s_idx==11);
var sn_patB := (s_idx==4) + (s_idx==12) + (s_idx==15);
var k_fill := (mod(s_idx, 2) == 0);
var sn_stut := (mod(s_idx, 2) == 0) * (s_idx > 7);
var ch_fill := 1.0;
var k_trig := (1 - is_fill) * (is_pat_A * k_patA + is_pat_B * k_patB) + (is_fill * k_fill);
var sn_trig := (1 - is_fill) * (is_pat_A * sn_patA + is_pat_B * sn_patB) + (is_fill * sn_stut);
var ch_trig := (1 - is_fill) * (mod(s_idx, 4) == 2) + (is_fill * ch_fill);
var oh_trig := (s_idx==2) + (s_idx==10);
var ducking := 1.0 - (k_trig * exp(-step_ph * 6) * 0.85);
var kick_a := k_trig * exp(-step_ph * 15) * sin(2 * pi * (50 * t - 5 * exp(-step_ph * 40)));
var ch_vel := (s_idx==2)*1.0 + (s_idx==6)*0.5 + (s_idx==10)*1.0 + (s_idx==14)*0.6 + is_fill*0.4;
var chat_a := ch_trig * ch_vel * exp(-step_ph * 40) * sin(20000 * t * cos(15000 * t));
var ohat_a := oh_trig * exp(-step_ph * 5) * sin(20000 * t * cos(10000 * t)) * is_pat_B;
var sn_phas := 0.5 + 0.5 * sin(2 * pi * 0.2 * t);
var snare_a := sn_trig * exp(-step_ph * 20) * (sin(2*pi*200*t)*0.4 + sin(20000*t*cos(15000*t))*0.6*sn_phas);
var b00 := (s_idx==0)*33 + (s_idx==3)*33 + (s_idx==6)*45 + (s_idx==9)*33 + (s_idx==12)*45;
var b01 := (s_idx==0)*33 + (s_idx==3)*33 + (s_idx==6)*45 + (s_idx==9)*33 + (s_idx==12)*45;
var b02 := (s_idx==0)*33 + (s_idx==3)*33 + (s_idx==6)*45 + (s_idx==9)*33 + (s_idx==12)*45;
var b03 := (s_idx==0)*33 + (s_idx==3)*45 + (s_idx==6)*33 + (s_idx==9)*45 + (s_idx==12)*33;
var b04 := (s_idx==0)*36 + (s_idx==3)*36 + (s_idx==6)*48 + (s_idx==9)*36 + (s_idx==12)*48;
var b05 := (s_idx==0)*36 + (s_idx==3)*36 + (s_idx==6)*48 + (s_idx==9)*36 + (s_idx==12)*48;
var b06 := (s_idx==0)*36 + (s_idx==3)*36 + (s_idx==6)*48 + (s_idx==9)*36 + (s_idx==12)*48;
var b07 := (s_idx==0)*36 + (s_idx==3)*48 + (s_idx==6)*36 + (s_idx==9)*48 + (s_idx==12)*36;
var b08 := (s_idx==0)*31 + (s_idx==3)*31 + (s_idx==6)*43 + (s_idx==9)*31 + (s_idx==12)*43;
var b09 := (s_idx==0)*31 + (s_idx==3)*31 + (s_idx==6)*43 + (s_idx==9)*31 + (s_idx==12)*43;
var b10 := (s_idx==0)*31 + (s_idx==3)*31 + (s_idx==6)*43 + (s_idx==9)*31 + (s_idx==12)*43;
var b11 := (s_idx==0)*31 + (s_idx==3)*43 + (s_idx==6)*31 + (s_idx==9)*43 + (s_idx==12)*31;
var b12 := (s_idx==0)*33 + (s_idx==2)*33 + (s_idx==4)*33 + (s_idx==6)*45;
var b13 := (s_idx==8)*33 + (s_idx==10)*33 + (s_idx==12)*45 + (s_idx==14)*45;
var b14 := (s_idx==0)*33 + (s_idx==2)*33 + (s_idx==4)*33 + (s_idx==6)*45;
var b15 := (s_idx==8)*45 + (s_idx==10)*45 + (s_idx==12)*45 + (s_idx==14)*57;
var bS1 := (cur_bar==0)*b00 + (cur_bar==1)*b01 + (cur_bar==2)*b02 + (cur_bar==3)*b03;
var bS2 := (cur_bar==4)*b04 + (cur_bar==5)*b05 + (cur_bar==6)*b06 + (cur_bar==7)*b07;
var bS3 := (cur_bar==8)*b08 + (cur_bar==9)*b09 + (cur_bar==10)*b10 + (cur_bar==11)*b11;
var bS4 := (cur_bar==12)*b12 + (cur_bar==13)*b13 + (cur_bar==14)*b14 + (cur_bar==15)*b15;
var cur_bass := bS1 + bS2 + bS3 + bS4;
var b_freq := 440 * pow(2, (cur_bass - 69) / 12);
var b_env := (cur_bass > 0) * exp(-step_ph * 8);
var f_lfo := 4.0 * sin(2 * pi * b_rate * 0.5 * t);
var f_cut := b_freq * (1.5 + 4.0 * exp(-step_ph*4) + f_lfo);
var bass_a := b_env * (2*mod(t*b_freq,1)-1) * 0.4 + b_env * sin(2*pi*f_cut*t) * 0.6;
var sub_a := b_env * sin(2*pi*(b_freq/2)*t) * 0.8;
var c00 := (b_idx==0)*57 + (b_idx==1)*57 + (b_idx==2)*53 + (b_idx==3)*55;
var c04 := (b_idx==0)*60 + (b_idx==1)*60 + (b_idx==2)*57 + (b_idx==3)*55;
var c08 := (b_idx==0)*55 + (b_idx==1)*55 + (b_idx==2)*52 + (b_idx==3)*53;
var c12 := (b_idx==0)*57 + (b_idx==1)*60 + (b_idx==2)*64 + (b_idx==3)*69;
var cur_chrd := (cur_bar<4)*c00 + (cur_bar>=4)*(cur_bar<8)*c04 + (cur_bar>=8)*(cur_bar<12)*c08 + (cur_bar>=12)*c12;
var c_freq := 440 * pow(2, (cur_chrd - 69) / 12);
var c_env := (cur_chrd > 0) * exp(-beat_ph * 2);
var c_ph1 := 2 * pi * c_freq * t;
var c_ph2 := 2 * pi * c_freq * 1.1892 * t;
var fm_i := 2.0 * exp(-beat_ph * 5);
var pad_c := (sin(c_ph1 + fm_i*sin(c_ph1*2.01)) + sin(c_ph2 + fm_i*sin(c_ph2*1.01))) * 0.33;
var g_lfo := (mod(t * s_rate * 2, 1) < 0.5) * 1.0;
var pad_g := pad_c * ((cur_bar >= 4) * g_lfo + (cur_bar < 4) * 1.0);
var dt := t - (0.75 / b_rate);
var db := floor(mod(dt * b_rate, 4));
var dc00 := (db==0)*57 + (db==1)*57 + (db==2)*53 + (db==3)*55;
var dc04 := (db==0)*60 + (db==1)*60 + (db==2)*57 + (db==3)*55;
var dc08 := (db==0)*55 + (db==1)*55 + (db==2)*52 + (db==3)*53;
var dc12 := (db==0)*57 + (db==1)*60 + (db==2)*64 + (db==3)*69;
var d_chrd := (cur_bar<4)*dc00 + (cur_bar>=4)*(cur_bar<8)*dc04 + (cur_bar>=8)*(cur_bar<12)*dc08 + (cur_bar>=12)*dc12;
var d_freq := 440 * pow(2, (d_chrd - 69) / 12);
var pad_d := (d_chrd > 0) * exp(-mod(dt*b_rate,1)*2) * sin(2*pi*d_freq*dt) * 0.35 * (cur_bar >= 8);
var chrd_a := (c_env * pad_g * 0.4) + pad_d;
var l00 := (s_idx==0)*69 + (s_idx==2)*72 + (s_idx==4)*76 + (s_idx==6)*74;
var l04 := (s_idx==8)*69 + (s_idx==10)*72 + (s_idx==12)*79 + (s_idx==14)*77;
var cur_ld := (cur_bar>=4)*(cur_bar<8)*l00 + (cur_bar>=8)*(cur_bar<12)*l04 + (cur_bar>=12)*l00;
var l_freq := 440 * pow(2, (cur_ld - 69) / 12);
var l_env := (cur_ld > 0) * exp(-step_ph * 4);
var l_sync := mod(mod(t * l_freq, 1) * (1.0 + 3.0 * l_env), 1);
var lead_a := l_env * (2 * l_sync - 1);
var r_ph := mod(t * b_rate / 4, 1);
var riser_a := (r_ph*r_ph) * sin(20000*t*cos(15000*t)) * sin(2*pi*(100+3000*r_ph)*t) * 0.3 * (cur_bar >= 12);
var mix_d := kick_a*1.0 + snare_a*0.8 + chat_a*0.4 + ohat_a*0.5;
var mix_s := (bass_a*0.6 + sub_a*0.5 + chrd_a*0.6 + lead_a*0.4 + riser_a) * ducking;
tanh(mix_d + mix_s)
Another example:
var step_time := 15.0 / tempo;
var step_ph := mod(t * (tempo / 15.0), 1.0);
var s_idx := floor(mod(t * (tempo / 15.0), 16));
var cur_bar := mod(floor(t * (tempo / 240.0)), 4);
var k_trig := (mod(s_idx, 4) == 0);
var kick_inst := k_trig * exp(-step_ph * 15) * sin(2 * pi * (50 * t - 5 * exp(-step_ph * 40)));
var sn_norm := (s_idx == 4) + (s_idx == 12);
var sn_stut := (mod(s_idx, 2) == 0) * (s_idx > 7);
var is_fill := (cur_bar == 3);
var sn_trig := (1 - is_fill) * sn_norm + (is_fill * sn_stut);
var pseudo_noise := sin(20000 * t * cos(15000 * t));
var snare_inst := 0.6 * pseudo_noise * exp(-step_ph * 20) * sn_trig;
var hat_trig := (s_idx == 2) + (s_idx == 6) + (s_idx == 10) + (s_idx == 14);
var hat_inst := 0.4 * pseudo_noise * exp(-step_ph * 40) * hat_trig * (cur_bar >= 1);
var b00 := (s_idx==0)*33 + (s_idx==3)*33 + (s_idx==6)*45 + (s_idx==9)*33 + (s_idx==12)*45;
var bass_gate := (b00 > 0);
var f_bass := 440.0 * 2^((b00 - 69.0) / 12.0);
var saw := 2.0 * mod(f_bass * t, 1.0) - 1.0;
var ducking := 1.0 - (k_trig * exp(-step_ph * 6.0) * 0.85);
var bass_env := bass_gate * exp(-step_ph * 4.0);
var bass_inst := saw * bass_env * ducking * 0.6;
Another example:
var b_rate := tempo / 60.0;
var s_rate := b_rate * 4.0;
var step_ph := mod(t * s_rate, 1.0);
var s_idx := floor(mod(t * s_rate, 16.0));
var k_trig := (mod(s_idx, 4) == 0);
var kick_click := k_trig * exp(-step_ph * 150.0) * 0.3;
var kick_inst := k_trig * exp(-step_ph * 15.0) * sin(2.0 * pi * (50.0 * t - 5.0 * exp(-step_ph * 40.0))) + kick_click;
var sn_norm := (s_idx == 4) + (s_idx == 12);
var pseudo_noise := sin(20000.0 * t * cos(15000.0 * t));
var sn_tone := sin(2.0 * pi * 200.0 * t) * exp(-step_ph * 15.0);
var snare_inst := sn_norm * (0.3 * sn_tone + 0.4 * pseudo_noise * exp(-step_ph * 20.0));
var ch_trig := (mod(s_idx, 2) != 0);
var ch_inst := 0.1 * ch_trig * exp(-step_ph * 50.0) * pseudo_noise;
var oh_trig := (s_idx == 2) + (s_idx == 6) + (s_idx == 10) + (s_idx == 14);
var oh_inst := 0.4 * oh_trig * exp(-step_ph * 8.0) * pseudo_noise;
var b00 := (s_idx==0)*35 + (s_idx==3)*35 + (s_idx==6)*47 + (s_idx==8)*45 + (s_idx==11)*42 + (s_idx==14)*38;
var bass_gate := (b00 > 0);
var f_bass := 440.0 * pow(2.0, (b00 - 69.0) / 12.0);
var fm_env := exp(-step_ph * 8.0) * 2.5;
var bass_raw := sin(2.0 * pi * f_bass * t + fm_env * sin(2.0 * pi * f_bass * t));
var ducking := 1.0 - (k_trig * exp(-step_ph * 6.0) * 0.85);
var bass_inst := bass_gate * exp(-step_ph * 5.0) * bass_raw * ducking * 0.7;
var chord_trig := (s_idx == 4) + (s_idx == 7) + (s_idx == 10);
var c_f1 := 440.0 * pow(2.0, (47.0 - 69.0) / 12.0);
var c_f2 := 440.0 * pow(2.0, (50.0 - 69.0) / 12.0);
var c_f3 := 440.0 * pow(2.0, (54.0 - 69.0) / 12.0);
var chord_wave := sin(2.0 * pi * c_f1 * t) + sin(2.0 * pi * c_f2 * t) + sin(2.0 * pi * c_f3 * t);
var chord_inst := chord_trig * exp(-step_ph * 6.0) * chord_wave * ducking * 0.15;
clamp(-1.0, kick_inst + snare_inst + ch_inst + oh_inst + bass_inst + chord_inst, 1.0);
clamp(-1.0, kick_inst + snare_inst + hat_inst + bass_inst, 1.0);