Add osc_receiver_alt with monophonic release handling

This commit is contained in:
Michael Winter 2026-04-19 18:07:19 +02:00
parent 3b68c1a49e
commit 655cb68f31

View file

@ -0,0 +1,57 @@
// osc_receiver.scd - OSC receiver for webapp
// Run this in SuperCollider: sclang supercollider/osc_receiver.scd
// Then click nodes in the webapp to play tones
s.boot;
(
s.waitForBoot {
// Store reference to current synth and frequency
var currentSynth = nil;
var currentFreq = nil;
// Define synth on the server with ASR envelope
// Note: doneAction is 0 (no auto-free) - we manage release manually
SynthDef(\sineTone, {
|freq = 440, amp = 0.25, gate = 1|
var env = EnvGen.kr(
Env.adsr(2, 3, 0.5, 3),
gate,
doneAction: 0 // Don't auto-free - we'll release manually
);
Out.ar(0, SinOsc.ar(freq) * env * amp);
}).add;
// Wait for synth to be added to server
s.sync;
// OSC handler for /freq messages - explicitly bind to port 57120
~oscHandler = OSCFunc({ |msg, time, addr, recvPort|
if (msg.size >= 3, {
var freq = msg[2].asFloat;
if (freq > 0, {
// Check if this is the same frequency - just release
if (currentSynth.notNil and: { currentFreq == freq }, {
currentSynth.set(\gate, 0);
currentSynth = nil;
currentFreq = nil;
}, {
// Different frequency - release old, create new
if (currentSynth.notNil, {
currentSynth.set(\gate, 0);
});
currentSynth = Synth(\sineTone, [\freq, freq, \amp, 0.25]);
currentFreq = freq;
});
});
});
}, '/freq', nil, 57120);
"OSC receiver ready on port 57120".postln;
"Click nodes in webapp to play".postln;
// Keep alive
while { true } { 10.wait; };
}
)