aboutsummaryrefslogtreecommitdiffstats
path: root/Bowelyzer.sc
diff options
context:
space:
mode:
Diffstat (limited to 'Bowelyzer.sc')
-rw-r--r--Bowelyzer.sc141
1 files changed, 111 insertions, 30 deletions
diff --git a/Bowelyzer.sc b/Bowelyzer.sc
index 3071588..e2d868a 100644
--- a/Bowelyzer.sc
+++ b/Bowelyzer.sc
@@ -24,12 +24,14 @@ Bowelyzer{
analyzer = BowelyzerAnalyzer.new(config.config);
gui = BowelyzerGUI.new(config.config);
this.addGUIListeners;
+ this.addServerListeners;
},
5,
{"scsynth failed to start!".postln});
}
addGUIListeners{
+ // listen for control changes
OSCdef.newMatching(
key: \controls,
func: {|msg, time, addr, recvPort|
@@ -46,50 +48,60 @@ Bowelyzer{
path: "/controls",
srcID: NetAddr.new("127.0.0.1", NetAddr.langPort)
);
+ // listen for input changes (rename and input channel)
OSCdef.newMatching(
key: \inputs,
func: {|msg, time, addr, recvPort|
+ var name = msg[1],
+ type = msg[2],
+ update = msg[3];
postln("Received: "++msg);
- if(msg[1].notNil && msg[2].notNil && msg[3].notNil,{
- if(config.config.at(\inputs).includesKey(msg[1]) && config.config.at(\controls).includesKey(msg[1]),{
- switch(msg[2],
+ if(name.notNil && type.notNil && update.notNil,{
+ if(config.config.at(\inputs).includesKey(name) && config.config.at(\controls).includesKey(name),{
+ switch(type,
\name,{
//if the name exists and the new name is not empty, change it
- if(msg[3]!= "",{
+ if(update != "",{
//move the controls
- config.config.at(\controls).put(msg[3].asSymbol, config.config.at(\controls).at(msg[1]));
- config.config.at(\controls).removeAt(msg[1].asSymbol);
+ config.config.at(\controls).put(update.asSymbol, config.config.at(\controls).at(name));
+ config.config.at(\controls).removeAt(name.asSymbol);
// rename the input
- config.config.at(\inputs).put(msg[3].asSymbol, config.config.at(\inputs).at(msg[1]));
- config.config.at(\inputs).removeAt(msg[1]);
- // rename the GUI element in channelView
+ config.config.at(\inputs).put(update.asSymbol, config.config.at(\inputs).at(name));
+ config.config.at(\inputs).removeAt(name);
Routine{
- gui.channels.keysValuesDo({|name, channelView|
- postln(name++"->"++channelView.name);
- if(channelView.name.asSymbol == msg[1].asSymbol, {
- channelView.name = msg[3].asSymbol;
+ // rename the channel View
+ gui.channels.do({|channel|
+ if(channel.name.asSymbol == name.asSymbol, {
+ channel.name = update.asSymbol;
});
});
- //TODO: rename the LevelListener
+ // OSC indicator: stop old task, remove it and create a new one with updated name
+ gui.indicators.at(name).stop;
+ gui.indicators.removeAt(name);
+ gui.addOSCIndicatorFadeOutTask(update);
}.play(AppClock);
+ // stop the listener for LevelIndicator by name and start a new one based upon the updated name
+ OSCdef(\levels_++name).free;
+ this.setupLevelListener(update, NetAddr.new(config.config.at(\synthServerAddress), config.config.at(\synthServerPort)));
// free the synth on the server and start a new one according to the config
- analyzer.freeAnalysisSynth(msg[1].asSymbol);
- analyzer.addSynthWithName(msg[3]);
+ analyzer.freeAnalysisSynth(name.asSymbol);
+ analyzer.addSynthWithName(update);
+ //TODO: only start the Synth, if the channel toggle button is okay
Routine{
1.wait;
- analyzer.startSynthWithNameAndControls(msg[3].asSymbol, config.config.at(\controls).at(msg[3]), config.config.at(\inputs).at(msg[3]));
+ analyzer.startSynthWithNameAndControls(update.asSymbol, config.config.at(\controls).at(update), config.config.at(\inputs).at(update));
}.play;
- hub.freeSynthListener(msg[1]);
- hub.addSynthListener(msg[3]);
- hub.startSynthListener(msg[3]);
+ hub.freeSynthListener(name);
+ hub.addSynthListener(update);
+ hub.startSynthListener(update);
});
},
\input,{
// if the input name exists and the new is an Integer and greater/equal 0
- if(((msg[3].isInteger) && (msg[3].asInteger >= 0)),{
+ if(((update.isInteger) && (update.asInteger >= 0)),{
// change the input in configuration
- config.config.at(\inputs).put(msg[1], msg[3].asInteger);
- analyzer.setSynthControl(msg[1].asSymbol, \inputChannel, msg[3].asInteger);
+ config.config.at(\inputs).put(name, update.asInteger);
+ analyzer.setSynthControl(name.asSymbol, \inputChannel, update.asInteger);
});
}
);
@@ -99,15 +111,18 @@ Bowelyzer{
path: "/inputs",
srcID: NetAddr.new("127.0.0.1", NetAddr.langPort)
);
+ // listen for toggling messages to "mute" channel
OSCdef.newMatching(
key: \toggle,
func: {|msg, time, addr, recvPort|
+ var name = msg[1],
+ toggle = msg[2];
postln("Received: "++msg);
- if(msg[1].notNil && msg[2].notNil && msg[3].notNil,{
- if(config.config.at(\inputs).includesKey(msg[1]),{
- switch(msg[3],
- 0,{analyzer.startAnalysisSynth(msg[1])},
- 1,{analyzer.stopAnalysisSynth(msg[1])}
+ if(msg[1].notNil && msg[2].notNil && msg[2].isInteger,{
+ if(config.config.at(\inputs).includesKey(name),{
+ switch(toggle,
+ 0,{analyzer.startAnalysisSynth(name)},
+ 1,{analyzer.stopAnalysisSynth(name)}
);
});
});
@@ -116,6 +131,72 @@ Bowelyzer{
srcID: NetAddr.new("127.0.0.1", NetAddr.langPort)
);
}
- //TODO: add SimpleController
- //TODO: delegate changes to BowelyzerConfig.config and update analyzer and GUI with it
+
+ // add OSCdefs listening for messages coming from scsynth, to update the GUI
+ addServerListeners{
+ this.setupIndicatorListener;
+ // add and start a listener for each channel's LevelIndicator
+ config.config.at(\inputs).pairsDo({|key,value|
+ this.setupLevelListener(key, NetAddr.new(config.config.at(\synthServerAddress), config.config.at(\synthServerPort)));
+ });
+ }
+
+ // setup a listener for a level indicator by name and source (of synth server)
+ setupIndicatorListener{
+ // listen for indicator messages
+ OSCdef.newMatching(
+ key: \indicate,
+ func: {|msg, time, addr, recvPort|
+ var name = msg[1];
+ //postln("Indicate for "++name);
+ if(config.config.at(\inputs).includesKey(name),{
+ if(gui.indicators.includesKey(name),{
+ gui.indicators.at(name).stop;
+ gui.indicators.at(name).reset;
+ gui.indicators.at(name).start(AppClock);
+ });
+ });
+ },
+ path: "/indicate",
+ srcID: NetAddr.new("127.0.0.1", NetAddr.langPort)
+ );
+ }
+
+ // setup a listener for a level indicator by name and source (of synth server)
+ setupLevelListener{
+ arg name, server;
+ postln("Setting up LevelListener for: "++name);
+ OSCdef.newMatching(
+ key: \levels_++name,
+ func: {|msg, time, addr, recvPort|
+ var name = msg[0].asString.replace("/levels/", "").asSymbol,
+ value = msg[3].ampdb.linlin(-40, 0, 0, 1),
+ peak = msg[4].ampdb.linlin(-40, 0, 0, 1);
+ //postln("Receiving: "++msg);
+ {
+ gui.channels.do({|channel|
+ if(channel.name.asSymbol == name,{
+ channel.children.do({|channelChild|
+ if(channelChild.name.asSymbol == \meterAndControls,{
+ channelChild.children.do({|meterAndControls|
+ if(meterAndControls.name.asSymbol == \meterView, {
+ meterAndControls.children.do({|meterView|
+ if(meterView.isKindOf(LevelIndicator), {
+ //postln("Setting up LevelIndicator for "++name);
+ meterView.value = value;
+ meterView.peakLevel = peak;
+ });
+ });
+ });
+ });
+ });
+ });
+ });
+ });
+ }.defer;
+ },
+ path: "/levels/"++name,
+ srcID: server
+ );
+ }
}