( var w, size, list, keys, specs, currentKey, updView, round, putVal, derive; var thumbSize; thumbSize = 10; round = 0.05; keys = [\x, \y, \z]; specs = (x: \amp, y: \amp, z:\amp).collect { arg item; item.asSpec.step_(round) }; currentKey = keys.first; size = 32; keys.do { arg key; var pat; pat = Pdefn.at(key); if(pat.isNil or: { pat.pattern.respondsTo(\list).not }) { Pdefn(key, Pseq(0.0 ! size)) }; }; updView = { b.value = specs[currentKey].unmap(Pdefn(currentKey).pattern.list) }; putVal = { arg i, val; Pdefn(currentKey).pattern.list.put(i, specs[currentKey].map(val)) }; w = SCWindow("pdefn seq", Rect(10, 450, 360, 150)); w.view.decorator = FlowLayout(w.view.bounds); b = SCMultiSliderView(w, Rect(0, 0, size * (thumbSize + 1), 100)) .action_({ arg b; putVal.(b.index, b.currentvalue) }); SCPopUpMenu(w, Rect(10,10, 110, 18)).items_(keys) .action_({ arg view; currentKey = view.items[view.value].round(round); updView.value; }); SCButton(w, Rect(10,10, 110, 18)) .states_( [["code", Color.black, Color.clear]]) .action_({ Pdefn(currentKey).asCompileString.postln }); SCButton(w, Rect(10,10, 110, 18)) .states_( [["throw", Color.black, Color.clear]]) .action_({ putVal.(size.rand, 1.0.rand.round(round)); updView.value; }); updView.value; //b.isFilled_(true); b.valueThumbSize_(1.0); b.indexThumbSize_(thumbSize); b.gap_(1.0); w.front; ) ( SynthDef("help-sinegrain", { arg out=0, freq=440, dur=0.05, amp=0.1; var env; env = EnvGen.kr(Env.perc(0.01, dur, amp), doneAction:2); Out.ar(out, SinOsc.ar(freq, 0, env)) }).store; ) s.boot; ( var a; a = Pshuf({ rrand(300, 700.0) } ! 16, inf); Pbind( \instrument, 'help-sinegrain', \freq, Ptuple(a ! 3), \dur, 0.125, \amp, Ptuple([ Pn(Pdefn(\x), inf), Pn(Pdefn(\y), inf), Pn(Pdefn(\z), inf) ]) ).play )