SynthDef(\flute, { arg out=0, gate=1, freq=440, amp=1.0, endReflection=0.5, jetReflection=0.5, jetRatio=0.32, noiseGain=0.15, vibFreq=5.925, vibGain=0.0, outputGain=1.0; var adsr = (amp*0.2) + EnvGen.ar(Env.adsr(0.005, 0.01, 1.1, 0.01), gate, doneAction: 2); var noise = WhiteNoise.ar(noiseGain); var vibrato = SinOsc.ar(vibFreq, 0, vibGain); var delay = (freq*0.66666).reciprocal; var lastOut = LocalIn.ar(1); var breathPressure = adsr*Mix([1.0, noise, vibrato]); var filter = LeakDC.ar(OnePole.ar(lastOut.neg, 0.7)); var pressureDiff = breathPressure - (jetReflection*filter); var jetDelay = DelayL.ar(pressureDiff, 0.025, delay*jetRatio); var jet = (jetDelay * (jetDelay.squared - 1.0)).clip2(1.0); var boreDelay = DelayL.ar(jet + (endReflection*filter), 0.05, delay); LocalOut.ar(boreDelay); Out.ar(out, 0.3*boreDelay*outputGain); }).store; SynthDef(\blowbotl, { arg out=0, amp=1.0, freq=440, rq=0.0, gate=1, noise=0.0, vibFreq=5.2, vibGain=0.0; var lastOut = LocalIn.ar(1); var adsr = amp*EnvGen.ar(Env.adsr(0.005, 0.01, 1.0, 0.010), gate, doneAction: 2); var vibrato = SinOsc.ar(vibFreq, 0, vibGain); var pressureDiff = (adsr+vibrato) - lastOut; var jet = (pressureDiff * (pressureDiff.squared - 1.0)).clip2(1.0); var randPressure = WhiteNoise.ar(noise)*adsr*(1.0 + pressureDiff); var resonator = Resonz.ar(adsr+randPressure - (jet*pressureDiff), freq, rq); LocalOut.ar(resonator); Out.ar(out, LeakDC.ar(resonator)); }).store SynthDef(\bowed, { arg out=0, amp=1.0, gate=1, freq=420, bowOffset = 0.0, bowSlope = 0.5, bowPosition = 0.75, vibFreq=6.127, vibGain=0.0; var betaRatio = 0.027236 + (0.2*bowPosition); var baseDelay = freq.reciprocal; var lastOut = LocalIn.ar(2); var vibrato = SinOsc.ar(vibFreq, 0, vibGain); var neckDelay = baseDelay*(1.0-betaRatio) + (baseDelay*vibrato); var neck = DelayL.ar(lastOut[0], 0.05, neckDelay); var bridge = DelayL.ar(lastOut[1], 0.025, baseDelay*betaRatio); var stringFilter = OnePole.ar(bridge*0.95, 0.55); var adsr = amp*EnvGen.ar(Env.adsr(0.02, 0.005, 1.0, 0.01), gate, doneAction: 2); var bridgeRefl = stringFilter.neg; var nutRefl = neck.neg; var stringVel = bridgeRefl + nutRefl; var velDiff = adsr - stringVel; var slope = 5.0 - (4.0*bowSlope); var bowtable = (( ((velDiff+bowOffset)*slope) + 0.75 ).abs ).pow(-4).clip(0, 1); var newVel = velDiff*bowtable; LocalOut.ar([bridgeRefl, nutRefl] + newVel); Out.ar(out, Resonz.ar( bridge*0.5, 500, 0.85 ) ); }, [\ir, 0,0, 0, 0, 0, 0, 0, 0]).store; SynthDef(\voicform, { arg out=0, gate=1, freq=440, amp=1.0, voiceGain=1.0, noiseGain=0.0, sweepRate=0.001; var voiced = Pulse.ar(freq, 0.1, voiceGain); var onezero = OneZero.ar(voiced, -0.9); var onepole = OnePole.ar(onezero, 0.97 - (amp*0.2)); var noise = WhiteNoise.ar(noiseGain*0.1); var excitation = onepole + noise; var ffreqs = Control.names([\ffreq]).kr([770, 1153, 2450, 3140]); var fradii = Control.names([\bw]).kr([0.950, 0.970, 0.780, 0.8]); var famps = Control.names([\gain]).kr([1.0, 0.355, 0.0355, 0.011]); var filters = TwoPole.ar(excitation, Lag.kr(ffreqs, sweepRate), Lag.kr(fradii, sweepRate), Lag.kr(famps, sweepRate) ); Out.ar(out, amp*Mix(filters) ); }).store;
Note: you can try using voicform with this class file: Phonemes
Example usage:
x = Synth(\voicform); x.set(\sweepRate, 0.5); i=0; ( i = i+1; a = Phonemes.parameter(i).flop; b = Phonemes.gain(i); Phonemes.string(i).postln; x.setn(\ffreq, a[0]); x.setn(\bw, 1-a[1]); x.setn(\gain, a[2].dbamp); x.set(\voiceGain, b[0]); x.set(\noiseGain, b[1]); x.set(\freq, exprand(200, 800) ); )