{
   "author" : "grirgz",
   "name" : "A simple bus routing matrix with GUI",
   "description" : "",
   "ancestor_list" : [],
   "labels" : [
      "gui",
      "example",
      "matrix",
      "routing"
   ],
   "is_private" : null,
   "id" : "1-51E",
   "code" : "(\r\n// init busses (change ?? to !? to init again)\r\n~busses = ~busses ?? {\r\n\t~matrix_in_count = 8;\r\n\t~matrix_out_count = 4;\r\n\t~matrix_ins = ~matrix_in_count.collect({ arg idx;\r\n\t\tvar bus = Bus.audio(s,2);\r\n\t\tNdef(\\matrix).set(( \\in++idx ).asSymbol, bus);\r\n\t\tbus;\r\n\t});\r\n\t~matrix_outs = ~matrix_out_count.collect({ arg idx;\r\n\t\tvar bus = Bus.audio(s,2);\r\n\t\tNdef(\\matrix).set(( \\out++idx ).asSymbol, bus);\r\n\t\tbus;\r\n\t});\r\n};\r\n\r\n// the matrix synth!\r\nNdef(\\matrix, {\r\n\tvar ins;\r\n\r\n\t// Collects inputs in a list\r\n\t// Inside a Synthdef, instead of \"arg freq=440\", you can use \\freq.kr(440)\r\n\t// here we use this system to generate argument names in a loop\r\n\tins = ~matrix_in_count.collect { arg in_idx;\r\n\t\tInFeedback.ar(( \\in++in_idx ).asSymbol.kr(100), 2);\r\n\t};\r\n\r\n\t// for each output, sum the inputs with a different gain for each\r\n\t~matrix_out_count.do { arg out_idx;\r\n\t\tOut.ar(( \\out++out_idx ).asSymbol.kr(0), \r\n\t\t\tins.collect({ arg in, in_idx;\r\n\t\t\t\tin * (\\gain++in_idx++\"_\"++out_idx).asSymbol.kr(0)\r\n\t\t\t}).sum\r\n\t\t);\r\n\t};\r\n\t\r\n}).play;\r\n)\r\n\r\n// test\r\n\r\n(\r\n// source\r\nPdef(\\pp, Pbind(\r\n\t\\instrument, \\default,\r\n\t\\degree, Prand([0,1,4,3],inf),\r\n\t\\dur, 1/Prand([2,4,8],inf),\r\n\t\\out, ~matrix_ins[0],\r\n\t\\amp, 0.1\r\n)).play;\r\n\r\n// fxs\r\nNdef(\\fx1, { arg freq=200, pan=0, amp=0.1;\r\n\tvar sig;\r\n\tsig = InFeedback.ar(~matrix_outs[0], 2);\r\n\tsig = SinOsc.ar(freq) * sig;\r\n}).play;\r\n\r\nNdef(\\fx2, { arg freq=200, pan=0, amp=0.1;\r\n\tvar sig;\r\n\tsig = InFeedback.ar(~matrix_outs[1], 2);\r\n\tsig = LFSaw.ar(freq) * sig;\r\n}).play;\r\n);\r\n\r\n\r\n// gui\r\n\r\n(\r\n\t~matrix_gui = {\r\n\t\tvar win;\r\n\t\tvar layout;\r\n\t\twin = Window.new;\r\n\r\n\t\t// generate an array of array representing the knob grid\r\n\t\tlayout = GridLayout.rows(*\r\n\r\n\r\n\t\t\t// top label header\r\n\t\t\t[\r\n\t\t\t\t[ StaticText.new.string_(\"\") ] ++\r\n\t\t\t\t~matrix_out_count.collect { arg out_idx;\r\n\t\t\t\t\tStaticText.new.string_(\"Out \" ++ out_idx)\r\n\t\t\t\t}\r\n\t\t\t] ++\r\n\r\n\t\t\t// knobs\r\n\t\t\t~matrix_in_count.collect { arg in_idx;\r\n\t\t\t\t[ StaticText.new.string_(\"In \" ++ in_idx) ] ++ // left label header\r\n\t\t\t\t~matrix_out_count.collect { arg out_idx;\r\n\t\t\t\t\tvar knob;\r\n\t\t\t\t\tvar key = ( \\gain++in_idx++\"_\"++out_idx ).asSymbol;\r\n\t\t\t\t\tknob = Knob.new.action_({ arg my;\r\n\t\t\t\t\t\tNdef(\\matrix).set(key, my.value)\r\n\t\t\t\t\t});\r\n\t\t\t\t\tknob.value = Ndef(\\matrix).get(key);\r\n\t\t\t\t\tknob;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t);\r\n\t\twin.layout = layout;\r\n\t\twin.front;\r\n\t};\r\n\t~matrix_gui.value; // show the gui!\r\n)"
}
