// title: Gabun/Bavaria // author: codepool // description: // Migration from the old SourceForge wiki. // code: /* all the patterns are just approximations, not part of 'real' songs. Licenced under Creative Commons 'some rights reserved' Julian Rohrhuber (jrh) 2002 / 2005 */ // A simulation of a Beng (a Gabon mouth bow): ( play { var bowRoot, stick, bow, mouth; var speed, stickPattern, rootStickPattern, rootStick, tstick, trigger, hi, lo; speed = 0.7; trigger = Impulse.kr(12*speed); stickPattern = Dseq([ Dseq(#[1, 0, 1, 0, 1, 1, 0, 1, 0.3, 1, 0], 8), Dseq(#[1, 0, 1, 0, 0.2, 1, 0, 1, 1, 1, 0], 2), Dseq(#[0, 1, 0, 1, 0, 1, 0, 0, 0.5, 1, 0], 2) ], inf) * Dwhite(0.8, 1.2, inf); hi = Dwhite(65.95, 66.05, 1); lo = 68; rootStickPattern = Dseq([hi, hi, lo, hi, lo, lo, hi, lo], inf); stick = Demand.kr(trigger, 0, stickPattern) * trigger; rootStick = PulseDivider.kr(stick, 3, 3); bowRoot = Lag.kr(Demand.kr(rootStick, 0, rootStickPattern).midicps, 0.05, 1/3.5); bow = CombL.ar( GrayNoise.ar(Decay2.kr(stick, 0.001, LFNoise1.kr(12, 0.05, 0.1), 0.3)), 0.01, Lag.kr(bowRoot, 0.15).reciprocal, LFNoise2.kr(0.32, 0.2, 0.5 - (0.2*ToggleFF.kr(rootStick)) * 4) // Add a little mouse-magic (comment previous line, uncomment the following) //LFNoise2.kr(0.32, MouseY.kr([0.2,0.005],[100,40],\exponential), 0.5 - (0.2*ToggleFF.kr(rootStick)) * 4) ); tstick = Trig.kr(stick,0.01); mouth = RLPF.ar( bow, Lag.kr( Demand.kr(tstick, 1, Dseq([Drand([ Drand(#[3, 4, 5, 6], 2), Drand(#[2, 3, 5], 4 * 3), Drand(#[ 2, 4, 6, 3 ], 3 * 4), Dseq(#[6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 6], 2) ], 3)], inf) ), 0.05) * bowRoot, LFNoise1.kr(0.8, 0.05, 0.1) ); Pan2.ar(LPF.ar(mouth, 2000), -0.3) + Pan2.ar(HPF.ar(bow * 0.3, 5000), 0.4) // If you're using "mouse-magic" you can leave out the first Pan2 // LPF.ar(mouth, 2000) + // Pan2.ar(HPF.ar(bow * 0.3, 5000), 0.4) }; ) // A Bavarian mouth harp: ( play { var root, finger, harp, mouth; var speed, trigger, troot; speed = MouseX.kr(0.7, 1.0) * 6; trigger = Impulse.ar(speed + LFNoise2.kr(0.1, 0.1)); troot = PulseDivider.ar(trigger, 24, 24); root = Demand.ar(troot, 1, Dseq([ 47, 52 ], inf)).midicps; finger = Demand.ar(trigger, 0, Dseq([ Dseq(#[1, 1, 0.05, 1, 0.7, 0.02, 1, 1, 0.1, 1, 0.1, 0.1], 4), Dseq(#[1, 1, 1, 0.1, 0.1, 0.2, 1, 1, 0.1, 1, 1, 0.1], 5), Dseq([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 2] ++ (0 ! 16+2)) ]) ) * trigger; harp = Saw.ar(Lag.ar(root, 0.15), Decay.ar(finger, LFNoise1.ar(0.4, 0.3, 0.8), 0.2)); mouth = RLPF.ar( harp, Lag.ar( Demand.ar(finger, 0, Dseq([ Dseq([ Dseq(#[4, 5, 6], 2), Dseq([6, 5, Drand(#[8, 7], 1)], 4), Dseq( #[3, 5, 6, 7, 6, 5, 7, 5, 6, 9, 8, 7, 5, 6, 4, 3], 2) ], 3) ], inf) ), 0.1) * root, LFNoise1.kr(0.3, 0.05, 0.08), 1, LPF.ar(harp, 2000) * 0.4 ); Pan2.ar( LPF.ar(mouth, 4000), LFNoise1.kr(0.5, 0.3) ); }; ) // Using patterns rather than Demand Ugens: ( SynthDef("mursing", { |freq, harm, t_trig, gate=1, metal=0.5, base=0.5, out, pan, amp=0.1| var env, harp, mouth, trigger; env = Linen.kr(gate, doneAction:2); trigger = Impulsar.ar(t_trig); amp = amp * Decay2.ar(trigger, LFNoise1.kr(5).range(0.0001, 0.01), LFNoise1.kr(5).range(0.4, 0.8), 0.2 ); harp = Saw.ar(Lag.kr(freq, 0.15)); harp = harp + PinkNoise.ar(harp.max(0) * 0.2) * amp * 10; mouth = RLPF.ar( harp, Lag.kr(harm, LFNoise1.kr(2).range(0.2, 0.3)) * freq, LFNoise1.kr(0.3).range(0.01, 0.05), 1, LPF.ar(harp, 2000) * 0.4 ); Out.ar(out, Pan2.ar( LPF.ar(mouth, 4000) + (HPF.ar(harp, 2000) * metal) + LPF.ar(harp, 400, 14 * base), pan, env ) ); }).store; ) ( var a, b; a = 0; b = 5; Pmono(\mursing, \note, Pseq([Pseq([Pn(a, 24), Pn(b, 24)], 2), Pseq([Pn(a, 12), Pn(b, 12)], 2)], inf), \octave, 4, \harm, Pseq([ Pseq([ Pseq([4, 1, 5]), Pseq([4, 6, 2]) ], 24), Pseq([ Pseq([7, 6, 5]), Pseq([1, 7, 4]) ], 24), Pseq([ Pseq([4, 1, 5]), Pseq([4, 6, 2]) ], 12), Pseq([ Pseq([7, 6, 5]), Pseq([6, 1, 1]) ], 12) ], inf), \t_trig, Pswitch([ Pseq([1, 0.3, 0.3, 1, 0, 0]), Pseq([1, 0.3, 0, 0, 1, 0])], Pseq([0,0,1,0,1,1,0], inf) ), \metal, Pbrown(0.3, 0.8, 0.01, inf), \base, Pwrand([1, 0.3], [0.1, 0.8], inf), \dur, 0.14 ).play; )