( // Clear any existing OSC definitions OSCdef.freeAll; // Define OSC responder for touch events OSCdef(\touchOSC, { |msg, time, addr, port| var x = msg[1], y = msg[2], pressure = msg[3], color = msg[4]; // Map x, y coordinates to frequency and amplitude var freq = x.linexp(0, 1, 100, 2000); var amp = pressure.linlin(0, 1, 0.1, 0.8); // Use color to select sound type (assuming color is an integer) var synthType = switch(color.asInteger, 0, { \sineTone }, 1, { \squareTone }, 2, { \sawTone }, 3, { \triTone }, 4, { \fmTone }, { \sineTone } // default ); // Create synth with mapped parameters Synth(synthType, [ \freq, freq, \amp, amp, \pan, y.linlin(0, 1, -0.8, 0.8), \attack, 0.01, \release, y.linlin(0, 1, 0.2, 2.0) ]); // Log the received data ["Touch data:", x, y, pressure, color, "->", synthType, freq, amp].postln; }, '/touch'); // OSC responder for control messages OSCdef(\controlOSC, { |msg, time, addr, port| var control = msg[1].asSymbol, value = msg[2]; // Log the control change ["Control change:", control, value].postln; // Handle different control parameters switch(control, \reverb_mix, { ~reverbSynth.set(\mix, value); }, \reverb_room, { ~reverbSynth.set(\room, value); }, \reverb_damp, { ~reverbSynth.set(\damp, value); }, \delay_time, { ~delaySynth.set(\delaytime, value); }, \delay_feedback, { ~delaySynth.set(\feedback, value); }, \delay_mix, { ~delaySynth.set(\mix, value); }, \filter_cutoff, { ~filterSynth.set(\cutoff, value.linexp(0, 1, 200, 10000)); }, \filter_res, { ~filterSynth.set(\res, value); } ); }, '/control'); // OSC responder for system commands OSCdef(\systemOSC, { |msg, time, addr, port| var command = msg[1].asSymbol; ["System command:", command].postln; switch(command, \start_effects, { ~startEffectsChain.value; }, \stop_effects, { ~stopEffectsChain.value; }, \reset, { ~resetSystem.value; } ); }, '/system'); // Start the OSC server on port 57120 (default SuperCollider port) thisProcess.openUDPPort(57120); "OSC server ready on port 57120".postln; "Registered OSC commands: /touch, /control, /system".postln; )