// Simple Guitar Design version 0.1.3 // Copyright 2009 Kijjasak Triyanond (kijjaz@gmail.com) // This software is protected by the GNU General Public License class kjz_SympatheticString { Gain input => LPF in_f => Delay d1 => Delay d2; samp => d2.max => d2.delay; d1 => Gain d1_g; d2 => Gain d2_g; d1_g => Gain sum; d2_g => sum; sum => Gain feedback => d1; sum => Gain output; // initialization second => d1.max; .55 => d1_g.gain; // direct feedback .45 => d2_g.gain; // filtered feedback .995 => feedback.gain; // overall feedback 8000 => in_f.freq; fun void freq(float x) { second / x - samp => d1.delay; } } Noise s => LPF s_f => Delay d1 => Delay d2; 2::samp => d2.max => d2.delay; d1 => Gain d1_g; d2 => Gain d2_g; d1_g => Gain sum; d2_g => sum; sum => Gain feedback => d1; sum => LPF guitarbody => Dyno master => dac; // initialization second => d1.max; // i'm sure i don't wanna play a note lower than 1Hz for now. guitarbody.set(6000, 2); // filter the outcome of the sound .9 => d1_g.gain; // direct feedback .1 => d2_g.gain; // filtered feedback 1 => feedback.gain; // overall feedback .8 => master.gain; // lower the volumn a bit it case things blows up master.limit(); // PICK TONE SECTION 1 => s_f.Q; // Pick tone sustain 1000.0 => float PickTone; 1 => float PickToneFreqMod; // testing: Add sympathetic strings kjz_SympatheticString syms[4]; 48 => Std.mtof => syms[0].freq; 48 + 7 => Std.mtof => syms[1].freq; 48 + 7 + 7 => Std.mtof => syms[2].freq; 48 + 12 + 5 => Std.mtof => syms[3].freq; HPF sympathetics => master; 1200 => sympathetics.freq; .04 => sympathetics.gain; for(int i; i < 4; i++) { guitarbody => syms[i].input; syms[i].output => sympathetics; } [0-12, 7, 12, 14, 15, 14, 12, -2-12, -4-12, 7, 12, 14, 15, 14, 12, 19-36, 17-36, 7, 8, 10, 12, 7, 8, 6, 7, -5-12, -1, 2, 5, 9, 11, 14] @=> int Melody1[]; int i; float freq; while(true) { Melody1[i] + 65 => Std.mtof => freq; second / freq - samp => d1.delay; PickTone + freq * PickToneFreqMod => s_f.freq; 1 => s.gain; second / freq => now; 0 => s.gain; if (i % 8 < 6) .25::second => now; else .75::second => now; (i + 1) % Melody1.cap() => i; }