Bryan, Here's a self-contained, single ChucK file, version of "Smooth Criminal" //**************************************************** // Smooth Criminal Tribute, by P. Cook, May 3, 2009 // because I should be doing more important things // like reading Tom Lieber's Independent work final report :-) 0.1 => float tempo; Mandolin bass1 => HalfRect clip => Gain main => dac; Mandolin bass2 => clip; bass1 => main; bass2 => main; Impulse kick => TwoPole kp => main; 50.0 => kp.freq; 0.99 => kp.radius; 0.1 => kp.gain; Noise n => ADSR snare => TwoPole sp => Delay sdel => main; 200.0 => sp.freq; 0.9 => sp.radius; 0.1 => sp.gain; snare.set(0.001,0.1,0.0,0.1); (4.0 * tempo) :: second => sdel.max => sdel.delay; 0.3 => bass1.bodySize => bass2.bodySize; 0.03 => bass1.stringDetune; 0.03 => bass2.stringDetune; 0.05 => bass1.stringDamping; 0.05 => bass2.stringDamping; SndBuf dope => main; "special:dope" => dope.read; 0.0 => dope.gain; SndBuf dope2 => main; "special:dope" => dope2.read; 0.0 => dope2.gain; Blit b => TwoPole p1 => Gain voice; b => TwoPole p2 => voice; b => TwoPole p3 => voice; 100 => b.harmonics; 0.998 => p1.radius => p2.radius => p3.radius; 0.03 => p1.gain; 0.01 => p2.gain; 0.01 => p3.gain; 0.0 => b.gain; SinOsc vib => blackhole; 6.0 => vib.freq; Std.mtof(60) => b.freq; Std.mtof(64) => float bTarg; doVerse(4); doChorus(4); spork ~ doMoogy(4); doVerse(4); doChorus(4); spork ~ gliss(); doTag(); spork ~ fade(); spork ~ doMoogy(4); doDopeVerse(4); fun void doMoogy(int howmany) { Moog m => JCRev r => main; 0.9 => m.filterQ; 0.9 => m.filterSweepRate; 0.05 => r.mix; 15.0 => r.gain; [69, 71, 72, 74, 76, 78, 79, 81] @=> int scale[]; 0 => int measure; 0 => int note; while (measure < howmany) { 0 => int note; while (note < 32) { 1 => m.noteOff; Std.mtof(scale[Std.rand2(0,7)]) => m.freq; if (Std.rand2f(0.0,1.0) < 0.4) 1 => m.noteOn; tempo :: second => now; note++; } measure++; } r =< main; } fun void doChorus(int howmany) { [64,64,64,64,64,64,67,64,64,64,67,64,64,64,62,60,59,60] @=> int dopes[]; [ 1, 1, 1, 1, 1, 1, 2, 4, 1, 1, 2, 4, 1, 1, 2, 2, 2, 2] @=> int ddurs[]; 0 => int measure; 0 => int note; 3.0 => dope.gain; while (measure < howmany) { Std.mtof(41) => bass1.freq; 1 => bass1.noteOn; Std.mtof(41-12) => bass2.freq; 1 => bass2.noteOn; (2.0 * tempo) :: second => now; 0 => int note; while (note < 18) { 1.03 * (Std.mtof(dopes[note]) / Std.mtof(67)) => dope.rate; 0 => dope.pos; (tempo*ddurs[note]) :: second => now; note++; } measure++; } } fun void doVerse(int howmany) { [45,45,45,45,45,45,45,47,47,47,47,48,48,48,48,47,43,40,45] @=> int notes[]; [ 2, 1, 1, 1, 1, 1, 1, 2, 4, 1, 1, 2, 4, 1, 1, 2, 2, 2, 2] @=> int durs[]; [ 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0] @=> int kicks[]; [ 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0] @=> int snares[]; 0 => int note; 0 => int measure; while (measure < howmany) { Std.mtof(notes[note]) => bass1.freq; Std.mtof(notes[note]-12) => bass2.freq; 1 => bass1.noteOn; 1 => bass2.noteOn; if (kicks[note]==1) 1 => kick.next; if (snares[note]==1) 1 => snare.keyOn; (durs[note] * tempo/2.0) :: second => now; 0 => bass1.noteOn => bass2.noteOn; 1 => snare.keyOff;; (durs[note] * tempo/2.0) :: second => now; note++; if (note==19) { 0 => note; measure++; } } } fun void doTag() { [64,60,62,64,40,64,60,62,64,40] @=> int dopes2[]; [ 2, 2, 2, 2, 4, 2, 2, 2, 2, 4] @=> int ddurs2[]; 0 => int measure; 0 => int note; 3.0 => dope.gain; 3.0 => dope2.gain; while (note < 10) { 1.03 * (Std.mtof(dopes2[note]) / Std.mtof(67)) => dope2.rate; dope2.rate()*2.0 => dope.rate; 0 => dope2.pos; 0 => dope.pos; (tempo*ddurs2[note]) :: second => now; note++; } 0.0 => dope2.gain; Noise n => main; 0.1 => n.gain; 0.07 :: second => now; n =< main; 0.03 :: second => now; 4.0 => b.gain; voice => main; Std.mtof(76) => dope2.rate; 0 => dope2.pos; 0.4 :: second => now; 300.0 => p1.freq; 900.0 => p2.freq; 2300.0 => p3.freq; Std.mtof(62) => bTarg; 0.1 :: second => now; 360.0 => p1.freq; 2000.0 => p2.freq; 2600.0 => p3.freq; 0.03 => p1.gain; 0.03 => p2.gain; 0.03 => p3.gain; Std.mtof(60) => bTarg; 0.1 :: second => now; 700.0 => p1.freq; 1100.0 => p2.freq; 2500.0 => p3.freq; Std.mtof(57) => bTarg; 0.2 :: second => now; 700.0 => p1.freq; 1200.0 => p2.freq; 2500.0 => p3.freq; 0.0 => b.gain; voice =< main; } fun void gliss() { while (1) { (0.01* bTarg) + (0.99 * b.freq()) => b.freq; 0.0005 :: second => now; } } fun void fade() { while (1) { (0.985 * main.gain()) => main.gain; 0.04 :: second => now; } } fun void doDopeVerse(int howmany) { [45,45,45,45,45,45,45,47,47,47,47,48,48,48,48,47,43,40,45] @=> int notes[]; [ 2, 1, 1, 1, 1, 1, 1, 2, 4, 1, 1, 2, 4, 1, 1, 2, 2, 2, 2] @=> int durs[]; [ 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0] @=> int kicks[]; [ 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0] @=> int snares[]; 0 => int note; 0 => int measure; 3.0 => dope.gain; while (measure < howmany) { Std.mtof(notes[note]) => bass1.freq; 4.1 * (Std.mtof(notes[note]) / Std.mtof(67)) => dope.rate; 0 => dope.pos; Std.mtof(notes[note]-12) => bass2.freq; 1 => bass1.noteOn; 1 => bass2.noteOn; if (kicks[note]==1) 1 => kick.next; if (snares[note]==1) 1 => snare.keyOn; (durs[note] * tempo/2.0) :: second => now; 0 => bass1.noteOn => bass2.noteOn; 1 => snare.keyOff;; (durs[note] * tempo/2.0) :: second => now; note++; if (note==19) { 0 => note; measure++; } } }