5_osc_communication.scd 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. (
  2. // Clear any existing OSC definitions
  3. OSCdef.freeAll;
  4. // Define OSC responder for touch events
  5. OSCdef(\touchOSC, { |msg, time, addr, port|
  6. var x = msg[1], y = msg[2], pressure = msg[3], color = msg[4];
  7. // Map x, y coordinates to frequency and amplitude
  8. var freq = x.linexp(0, 1, 100, 2000);
  9. var amp = pressure.linlin(0, 1, 0.1, 0.8);
  10. // Use color to select sound type (assuming color is an integer)
  11. var synthType = switch(color.asInteger,
  12. 0, { \sineTone },
  13. 1, { \squareTone },
  14. 2, { \sawTone },
  15. 3, { \triTone },
  16. 4, { \fmTone },
  17. { \sineTone } // default
  18. );
  19. // Create synth with mapped parameters
  20. Synth(synthType, [
  21. \freq, freq,
  22. \amp, amp,
  23. \pan, y.linlin(0, 1, -0.8, 0.8),
  24. \attack, 0.01,
  25. \release, y.linlin(0, 1, 0.2, 2.0)
  26. ]);
  27. // Log the received data
  28. ["Touch data:", x, y, pressure, color, "->", synthType, freq, amp].postln;
  29. }, '/touch');
  30. // OSC responder for control messages
  31. OSCdef(\controlOSC, { |msg, time, addr, port|
  32. var control = msg[1].asSymbol, value = msg[2];
  33. // Log the control change
  34. ["Control change:", control, value].postln;
  35. // Handle different control parameters
  36. switch(control,
  37. \reverb_mix, { ~reverbSynth.set(\mix, value); },
  38. \reverb_room, { ~reverbSynth.set(\room, value); },
  39. \reverb_damp, { ~reverbSynth.set(\damp, value); },
  40. \delay_time, { ~delaySynth.set(\delaytime, value); },
  41. \delay_feedback, { ~delaySynth.set(\feedback, value); },
  42. \delay_mix, { ~delaySynth.set(\mix, value); },
  43. \filter_cutoff, { ~filterSynth.set(\cutoff, value.linexp(0, 1, 200, 10000)); },
  44. \filter_res, { ~filterSynth.set(\res, value); }
  45. );
  46. }, '/control');
  47. // OSC responder for system commands
  48. OSCdef(\systemOSC, { |msg, time, addr, port|
  49. var command = msg[1].asSymbol;
  50. ["System command:", command].postln;
  51. switch(command,
  52. \start_effects, { ~startEffectsChain.value; },
  53. \stop_effects, { ~stopEffectsChain.value; },
  54. \reset, { ~resetSystem.value; }
  55. );
  56. }, '/system');
  57. // Start the OSC server on port 57120 (default SuperCollider port)
  58. thisProcess.openUDPPort(57120);
  59. "OSC server ready on port 57120".postln;
  60. "Registered OSC commands: /touch, /control, /system".postln;
  61. )