// name: hevymetl-acoustic-algo3.ck // desc: how to turn HnkyTonk (Algorithm 3) into an acoustic guitar!! // now you can transcribe almost directly from a TX81 Patch!!! // // author: Perry R. Cook // date: June 2021, for REPAIRATHON 2021 // needs chuck 1.4.1.0 or above HnkyTonk g; // instance for shorthand, you'll see... HnkyTonk guit[6]; NRev r => dac; 0.15 => r.gain; 0.07 => r.mix; [0,0,0,0] @=> int waveForms[]; [97,71,77,81] @=> int opGains[]; [1.0,3.0,3.02,8.0] @=> float ratios[]; [31,28,31,31] @=> int attacks[]; [18,6,10,9] @=> int decays[]; [14,1,0,0] @=> int sustains[]; // 15,0,0,0 ??? [8,8,9,6] @=> int releases[]; for( int i; i < 6; i++ ) { guit[i] => r; for( int op; op < 4; op++ ) { guit[i].opWave( op,1 ); // sine waves all guit[i].opGain( op,g.getFMTableGain(opGains[op]) ); guit[i].opADSR( op, g.getFMTableTime(attacks[op]), g.getFMTableTime(decays[op]), g.getFMTableSusLevel(sustains[op]), g.getFMTableTime(releases[op]) ); guit[i].opRatio( op,ratios[op] ); guit[i].lfoDepth( 0.0 ); } } [38,45,50,55,59,64] @=> int DTuning[]; [38,45,50,57,62,66] @=> int DMaj[]; [40,47,52,55,59,64] @=> int Emi[]; slowStrum(DTuning, 0.8); second * 1 => now; allOff(); second/2 => now; 0.2::second => dur E; for( int i; i < 4; i++ ) { spork ~ fastStrum(Emi,1.0); 2*E => now; fastUp(Emi,0.95); E/4 => now; allOff(); 3*E/4 => now; spork ~ fastStrum(Emi,0.97); 2*E => now; fastUp(Emi,0.8); E/4 => now; allOff(); 3*E/4 => now; spork ~ fastStrum(Emi,0.95); 2*E => now; fastUp(Emi,0.9); E/4 => now; allOff(); 3*E/4 => now; spork ~ fastStrum(Emi,0.93); 2*E => now; fastUp(Emi,0.9); E/4 => now; allOff(); 3*E/4 => now; spork ~ fastStrum(DMaj,1.0); E => now; allOff(); E => now; spork ~ fastStrum(DMaj,0.9); E => now; if (maybe) { allOff(); } else { spork ~ fastStrum(DMaj,0.8); } E => now; } slowStrum(Emi,0.8); 2*second => now; allOff(); second => now; fun void allOff() { for (int i; i < 6; i++) 1 => guit[i].noteOff; } fun void slowStrum( int chord[], float vel) { for (int i; i < 6; i++) { Std.mtof(chord[i]) => guit[i].freq; vel => guit[i].noteOn; Math.random2f(0.05,0.15)::second => now; } } fun void fastStrum( int chord[], float vel) { for (int i; i < 6; i++) { Std.mtof(chord[i]) => guit[i].freq; vel => guit[i].noteOn; Math.random2f(0.005,0.02)::second => now; } } fun void fastUp( int chord[], float vel) { for (int i; i < 6; i++) { Std.mtof(chord[5-i]) => guit[5-i].freq; vel => guit[5-i].noteOn; // Math.random2f(0.001,0.005)::second => now; } }