diff options
-rw-r--r-- | BowelyzerAnalyzer.sc | 192 |
1 files changed, 114 insertions, 78 deletions
diff --git a/BowelyzerAnalyzer.sc b/BowelyzerAnalyzer.sc index f50f89d..f6ad54e 100644 --- a/BowelyzerAnalyzer.sc +++ b/BowelyzerAnalyzer.sc @@ -33,107 +33,143 @@ BowelyzerAnalyzer{ arg config; config.at(\inputs).keysValuesDo({|name, inputChannel| ("Adding SynthDef \""++name++"\" on input "++inputChannel).postln; - SynthDef(name, { - arg sendReplyFreq, - amplitudeAttackTime, - amplitudeReleaseTime, - hfHainsworth, - hfFoote, - hfThreshold, - hfWaitTime, - pitchInitFreq, - pitchMinFreq, - pitchMaxFreq, - pitchExecFreq, - pitchMaxBinsPerOctave, - pitchMedian, - pitchAmpThreshold, - pitchPeakThreshold, - pitchDownSample - ; - var amplitude, input, detect, pitch, hasPitch; - //TODO: Add volume for SoundIn - input = SoundIn.ar(bus: inputChannel); - amplitude = Amplitude.kr( - in: input, - attackTime: amplitudeAttackTime, - releaseTime: amplitudeReleaseTime - ); - detect = A2K.kr( - PV_HainsworthFoote.ar( - FFT(LocalBuf(2048), input), - proph: hfHainsworth, - propf: hfFoote, - threshold: hfThreshold, - waittime: hfWaitTime - ) - ); - # pitch, hasPitch = Pitch.kr( - in: input, - initFreq: pitchInitFreq, - minFreq: pitchMinFreq, - maxFreq: pitchMaxFreq, - execFreq: pitchExecFreq, - maxBinsPerOctave: pitchMaxBinsPerOctave, - median: pitchMedian, - ampThreshold: pitchAmpThreshold, - peakThreshold: pitchPeakThreshold, - downSample: pitchDownSample - ); - SendReply.kr( - Impulse.kr(sendReplyFreq), - "/"++name, - [amplitude, pitch, hasPitch, detect] - ); - }).add; + this.addSynthWithName(name); }); } + addSynthWithName{ + arg name; + SynthDef(name, { + arg inputChannel, + sendReplyFreq, + amplitudeAttackTime, + amplitudeReleaseTime, + hfHainsworth, + hfFoote, + hfThreshold, + hfWaitTime, + pitchInitFreq, + pitchMinFreq, + pitchMaxFreq, + pitchExecFreq, + pitchMaxBinsPerOctave, + pitchMedian, + pitchAmpThreshold, + pitchPeakThreshold, + pitchDownSample + ; + var amplitude, input, detect, pitch, hasPitch; + //TODO: Add volume for SoundIn + input = SoundIn.ar(bus: inputChannel); + amplitude = Amplitude.kr( + in: input, + attackTime: amplitudeAttackTime, + releaseTime: amplitudeReleaseTime + ); + detect = A2K.kr( + PV_HainsworthFoote.ar( + FFT(LocalBuf(2048), input), + proph: hfHainsworth, + propf: hfFoote, + threshold: hfThreshold, + waittime: hfWaitTime + ) + ); + # pitch, hasPitch = Pitch.kr( + in: input, + initFreq: pitchInitFreq, + minFreq: pitchMinFreq, + maxFreq: pitchMaxFreq, + execFreq: pitchExecFreq, + maxBinsPerOctave: pitchMaxBinsPerOctave, + median: pitchMedian, + ampThreshold: pitchAmpThreshold, + peakThreshold: pitchPeakThreshold, + downSample: pitchDownSample + ); + // SendReply for OSCHub + SendReply.kr( + Impulse.kr(sendReplyFreq), + "/"++name, + [amplitude, pitch, hasPitch, detect] + ); + // SendReply for LevelIndicator + SendReply.kr( + Impulse.kr(10), + "/levels/"++name, + [ + Amplitude.kr(input), + K2A.ar( + Peak.ar( + input, + Delay1.kr(Impulse.kr(10)) + ).lag(0, 3) + ) + ] + ); + }).add; + } + startSynthsFromConfig{ arg config; config.at(\controls).keysValuesDo({|name, controls| postln("Starting synth \""++name++"\"."); - synths.add(name -> Synth( - name, - [ - sendReplyFreq: controls.at(\sendReplyFreq), - amplitudeAttackTime: controls.at(\amplitudeAttackTime), - amplitudeReleaseTime: controls.at(\amplitudeReleaseTime), - hfHainsworth: controls.at(\hfhainsworth), - hfFoote: controls.at(\hfFoote), - hfThreshold: controls.at(\hfThreshold), - hfWaitTime: controls.at(\hfWaitTime), - pitchInitFreq: controls.at(\pitchInitFreq), - pitchMinFreq: controls.at(\pitchMinFreq), - pitchMaxFreq: controls.at(\pitchMaxFreq), - pitchExecFreq: controls.at(\pitchExecFreq), - pitchMaxBinsPerOctave: controls.at(\pitchMaxBinsPerOctave), - pitchMedian: controls.at(\pitchMedian), - pitchAmpThreshold: controls.at(\pitchAmpThreshold), - pitchPeakThreshold: controls.at(\pitchPeakThreshold), - pitchDownSample: controls.at(\pitchDownSample) - ], - analyzerGroup - ); - ); + this.startSynthWithNameAndControls(name, controls, config.at(\inputs).at(name)); }); } + startSynthWithNameAndControls{ + arg name, controls, input; + synths.add(name -> Synth( + name, + [ + inputChannel: input, + sendReplyFreq: controls.at(\sendReplyFreq), + amplitudeAttackTime: controls.at(\amplitudeAttackTime), + amplitudeReleaseTime: controls.at(\amplitudeReleaseTime), + hfHainsworth: controls.at(\hfhainsworth), + hfFoote: controls.at(\hfFoote), + hfThreshold: controls.at(\hfThreshold), + hfWaitTime: controls.at(\hfWaitTime), + pitchInitFreq: controls.at(\pitchInitFreq), + pitchMinFreq: controls.at(\pitchMinFreq), + pitchMaxFreq: controls.at(\pitchMaxFreq), + pitchExecFreq: controls.at(\pitchExecFreq), + pitchMaxBinsPerOctave: controls.at(\pitchMaxBinsPerOctave), + pitchMedian: controls.at(\pitchMedian), + pitchAmpThreshold: controls.at(\pitchAmpThreshold), + pitchPeakThreshold: controls.at(\pitchPeakThreshold), + pitchDownSample: controls.at(\pitchDownSample) + ], + analyzerGroup + ); + ); + } + + // set a synth control by provoding its name, its control name and control value setSynthControl{ - arg name, control; - synths.at(name).set(control[0], control[1]); + arg name, controlName, controlValue; + synths.at(name).set(controlName, controlValue); } + // start a synth by name startAnalysisSynth{ arg name; synths.at(name).run(true); } + // stop a synth by name stopAnalysisSynth{ arg name; synths.at(name).run(false); } + // free a synth by name + freeAnalysisSynth{ + arg name; + synths.at(name).free; + } + startAllAnalysisSynths{ analyzerGroup.run(true); } |