// title: A Simple Synthesizer Keyboard 1 // author: prko // description: // code: ( s.waitForBoot{ var w, n, b, bs, k, ks, x, lay, ctl, kAct, lastPressed; k = (\a:0, \w:1, \s:2, \e:3, \d:4, \f:5, \t:6, \g:7, \y:8, \h:9, \u:10, \j:11, \k:12, \o:13, \l:14, \p:15, ';':16); n = k.size; x = { |i| { |g = 0| LFTri.ar((i + 69 + [0, 0.15]).midicps) * 0.1 * Env.adsr.kr(gate:g); }.play }!n; ctl = { |i=0, gate=0| x[i].set(\g, gate) }; w = Window("self ear-training", Rect(200, 200, 583, 136)); w.front; w.onClose_{ { |i| x[i].free }!n }; b = { |parent, label| Button(parent, 30@30) .states_([ [label], [label, Color.white, Color.grey] ]) .mouseDownAction_{ lastPressed = label; ctl.(label, 1); bs[label].value = 1 } .action_{ ctl.(label, 0); bs[label].value = 0 } }; lay = w.addFlowLayout; bs = { |i| b.(w, i) }!n; lay.nextLine; ks = { |i| StaticText(w, 30@30) .string_(k.findKeyForValue(i)) .align_(\center) }!n; kAct = { |c, v| c = c.asSymbol; (k.trueAt(c) != false).if{ ctl.(k[c], v); bs[k[c]].value = v } }; StaticText(w, 572@60).string_("Press, hold and then release the keys under the numbered buttons using" + "your computer keyboard. Alternatively, you might press, hold, and then release each button using" + "the left button of the computer mouse. The multi-touch on touchscreen may function, but it" + "hasn't been tested."); w.view .keyDownAction_{ |view, char| kAct.(char, 1) } .keyUpAction_{ |view, char, mod, unicode, keycode, key| kAct.(char, 0) } .mouseUpAction_{ //|view, x, y, modifiers, buttonNumber| var lastPressedK = k.findKeyForValue(lastPressed); kAct.(lastPressedK, 0) } } )