{
   "labels" : [
      "midi",
      "osc",
      "converter"
   ],
   "code" : "var window = Window(\"OSC to MIDI\", Rect(200, 200, 690, 540), false).front;\r\nvar layout = window.addFlowLayout((0@0),(0@0));\r\nvar font = Font(\"Monaco\", 12), size1 = (200@20), size2 = (70@20), size3 = (20@20), midi, net, responders = ();\r\nvar gui_addrlabel = StaticText(window, (50@20)).font_(font).string_(\"addr\").align_(\\center);\r\nvar gui_addr = TextField(window, (150@20)).font_(font).align_(\\center).string_(\"all\").enabled_(false); // TODO!\r\nvar gui_portlabel = StaticText(window, (50@20)).font_(font).string_(\"port\").align_(\\center);\r\nvar gui_port = NumberBox(window, (75@20)).font_(font).value_(0).align_(\\center).clipLo_(0).clipHi_(0).enabled_(false); // TODO!\r\nvar gui_space = StaticText(window, (15@20));\r\nvar gui_midiinit = Button(window, (75@20)).states_([[\"INIT\"], [\"REFRESH\"]]);\r\nvar gui_devicelabel = StaticText(window, (50@20)).font_(font).string_(\"device\").align_(\\center);\r\nvar gui_mididevices = PopUpMenu(window, (175@20)).items_([\"-- init midi first --\"]);\r\ngui_midiinit.action_({ |but|\r\n\tif(but.value == 1) { MIDIClient.init } { but.value_(1) };\r\n\tgui_mididevices.items_(MIDIClient.destinations.collect{ |dest| dest.name })\r\n});\r\ngui_mididevices.action_({ |m| midi = MIDIOut(m.value) });\r\nlayout.nextLine; // labels\r\nStaticText(window, size1).font_(font).string_(\"msg\").align_(\\center);\r\n[\"min\", \"max\", \"type\", \"chan\", \"num\", \"min\", \"max\"].do{ |name| StaticText(window, size2).font_(font).string_(name).align_(\\center) };\r\n25.do{ |i| // 25 responders with conversion\r\n\tvar cmd=\"/cmd\"+/+i, inmin=0, inmax=1, type=\"control\", chan=0, outmin=0, outmax=127, num=50+i;\r\n\tTextField(window, size1).font_(font).stringColor_(Color.green(0.5)).string_(cmd).action_({ |v| cmd = v.string; responders[i].cmdName = cmd });\r\n\tNumberBox(window, size2).scroll_step_(0.01).step_(0.001).value_(inmin).align_(\\center).stringColor_(Color.red(0.8)).action_({ |v| inmin = v.value });\r\n\tNumberBox(window, size2).scroll_step_(0.01).step_(0.001).value_(inmax).align_(\\center).stringColor_(Color.red(0.8)).action_({ |v| inmax = v.value });\r\n\tPopUpMenu(window, size2).items_([\"control\"]).stringColor_(Color.yellow(0.8)).value_(0).action_({ |v| type = v.items[v.value].asSymbol });\r\n\tNumberBox(window, size2).value_(chan).clipLo_(0).clipHi_(15).align_(\\center).action_({ |v| chan = v.value });\r\n\tNumberBox(window, size2).value_(num).clipLo_(0).clipHi_(127).align_(\\center).action_({ |v| num = v.value });\r\n\tNumberBox(window, size2).value_(outmin).clipLo_(0).clipHi_(127).align_(\\center).stringColor_(Color.blue(0.8)).action_({ |v| outmin = v.value });\r\n\tNumberBox(window, size2).value_(outmax).clipLo_(0).clipHi_(127).align_(\\center).stringColor_(Color.blue(0.8)).action_({ |v| outmax = v.value});\r\n\tresponders[i] = OSCresponder(net, cmd, { |time, resp, msg, addr|\r\n\t\tvar val = msg[1].linlin(inmin, inmax, outmin, outmax).round;\r\n\t\t[type, chan, num, val].postln;\r\n\t\tmidi.perform(type, chan, num, val);\r\n\t}).add;\r\n};",
   "id" : "1-1ei",
   "is_private" : null,
   "author" : "rukano",
   "name" : "OSC to MIDI converter (GUI)",
   "description" : "Code written in about 1 hour trying to emulate gui and behaviour of osculator. Ended up being just a OSC to MIDI CC converter... but it's open to other things. Feel free to enhance and complement, or even make a class for this (and a future Quark?)\r\n\r\nGoal was to use less than 100 lines. Turned up working with just 35 :)",
   "ancestor_list" : []
}
