aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--BowelyzerAnalyzer.sc192
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);
}