// Listing 7.15 Using the HevyMetl FM UGen to synthesize an electric guitar // a brief FM electric guitar tribute HevyMetl jimi => PRCRev r => dac; // (1) FM "guitar" through reverb... jimi => Delay d => d => r; // (2) ...and a delay line (for big, outdoor sound) 0.3 => d.gain; 1.2 :: second => d.max => d.delay; // sets us up for whammy bar bend later 0.5 => jimi.lfoSpeed; // (3) Table of notes, durations, and modulations [[70.0,0.8,0.0],[67.0,0.4,0.0],[63.0,1.2,0.0], [67.0,1.2,0.0],[70.0,1.2,0.0],[75.0,2.4,0.2], [79.0,0.8,0.0],[77.0,0.4,0.0],[75.0,1.2,0.0], [67.0,1.2,0.1],[69.0,1.2,0.2]] @=> float banner[][]; // play through our data table first 0 => int i; while (i < banner.cap()) { // (4) Plays all the notes in the table banner[i][2] => jimi.lfoDepth; pick(banner[i][0],banner[i][1]); 1 +=> i; } // play last note longer, then Std.mtof(82) => jimi.freq; 1 => jimi.noteOn; 2.0 :: second => now; // go nuts and sweep frequency downward while (jimi.freq() > 100.0) { // (5) Big gliss (pitch sweep) downward 0.98 * jimi.freq() => jimi.freq; 0.01 :: second => now; } 1.0 :: second => now; 1 => jimi.noteOff; 2.0 :: second => now; // function to play a note for a duration fun void pick(float note,float howLong) { // (6) Function to pick each note Std.mtof(note) => jimi.freq; 1 => jimi.noteOn; (howLong - 0.1) :: second => now; 1 => jimi.noteOff; 0.1 :: second => now; }