// name: fm-bleep.ck // desc: simple FM synthesis bleep generator // modulator to carrier TriOsc m => SinOsc c => ADSR adsr => LPF lpf => dac; // adsr adsr.set( 10::ms, 5::ms, .5, 20::ms ); // set low pass filter 5000 => lpf.freq; 2 => lpf.Q; // FM synthesis (sync is 2) 2 => c.sync; // carrier frequency 220 => c.freq; // modulator frequency 220 => m.freq; // index of modulation 50 => m.gain; // carrier / modulator ratio .5 => float ratio; // useful play method fun void play( float pitch, float velocity, dur T ) { // pitch -> carrier pitch => Std.mtof => c.freq; // modulator c.freq() * ratio => m.freq; // velocity velocity => adsr.gain; // open envelope adsr.keyOn(); // advance time T - adsr.releaseTime() => now; // close the envelope adsr.keyOff(); // wait for release adsr.releaseTime() => now; } // independent filter sweep shred fun void sweep() { // time loop while( true ) { // sweep using sine 100+400*(Math.sin(now/second*.5)+1)/2 => lpf.freq; // update rate 10::ms => now; } } // spork sweep spork ~ sweep(); // pitch offset 0 => int offset; // time loop while( true ) { // play play( 60+offset, 1, 200::ms ); play( 62+offset, 1, 200::ms ); play( 64+offset, 1, 200::ms ); play( 65+offset, 1, 200::ms ); play( 67+offset, 1, 400::ms ); }