[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [sc-users] ToolsMenu and Server gui niceties
Oh, now i see... attached mean like written right inside of the post)) i was
trying to find some kind of file attachment...
anyway, after i've copied all the code into new rtf file and saved it as a
blackGui.sc to extensions folder of supercollider, i don't have ANY gui, nor
black or white)))
init_OSC
compiling class library..
NumPrimitives = 750
compiling dir: '/Applications/SuperCollider/SCClassLibrary'
compiling dir: '/Users/home/Library/Application
Support/SuperCollider/Extensions'
• ERROR: Parse error
in file '/Users/home/Library/Application
Support/SuperCollider/Extensions/blackGui.sc'
line 116 char 26:
stringColor, Color.clear]]•;
-----------------------------------
opening bracket was a '{', but found a ']'
in file '/Users/home/Library/Application
Support/SuperCollider/Extensions/blackGui.sc' line 116 char 26
pass 1 done
WARNING: FunctionDef contains variable declarations and so will not be
inlined.
in file '/Users/home/Library/Application
Support/SuperCollider/Extensions/ToolsMenu/ToolsMenu.sc'
line 81 char 37:
{ var temppath = thepath.fullPath;•
temppath.pop;
-----------------------------------
• ERROR: Parse error
in file '/Users/home/Library/Application
Support/SuperCollider/Extensions/blackGui.sc'
line 116 char 26:
stringColor, Color.clear]]•
-----------------------------------
opening bracket was a '{', but found a ']'
in file '/Users/home/Library/Application
Support/SuperCollider/Extensions/blackGui.sc' line 116 char 26
• ERROR: Parse error
in file '/Users/home/Library/Application
Support/SuperCollider/Extensions/blackGui.sc'
line 116 char 26:
stringColor, Color.clear]]•
-----------------------------------
• ERROR: file '/Users/home/Library/Application
Support/SuperCollider/Extensions/blackGui.sc' parse failed
error parsing
Extension overwriting SCSlider:defaultKeyDownAction
in file '/Users/home/Library/Application
Support/SuperCollider/Extensions/quarks/ixi/ixi
classes/osx/XiiClassExtensions_Cocoa.sc'.
Original method in file '/Common/GUI/osx/Base/SCView.sc'.
Extension overwriting SCEnvelopeView:asEnv
in file '/Users/home/Library/Application
Support/SuperCollider/Extensions/sc3-plugin-extensions/BhobUGens/classes/osx/asEnv.sc'.
Original method in file '/Common/GUI/osx/Base/SCView.sc'.
Extension overwriting SimpleNumber:asTimeString
in file '/Users/home/Library/Application
Support/SuperCollider/Extensions/sc3-plugin-extensions/LoopBufUGens/classes/LJP
Classes/Extensions/SimpleNumber-asTimeString.sc'.
Original method in file '/Common/Math/SimpleNumber.sc'.
Library has not been compiled successfully.
Thanks!
Miguel C. Negrão wrote:
>
> Hi
>
> yes, you need an extra file that is not in the zip. The class file for
> the black gui is in the original post that started this thread. For
> convenience an updated version attached here.
>
> hope this does it.
>
> Miguel
>
> Timur Kuyanov escreveu:
>> So, you mean that i need something more then files from toolsMenu.zip
>> file? i
>> uzipped it, and put toolsMenu folder inside of extensions folder. All
>> needed
>> quarks are also installed.
>>
>> I'm sorry, but i can't find any attachment in your post, only link to zip
>> file...
>>
>> Thank you!
>>
>>
>> Miguel C. Negrão wrote:
>>> then you probably haven't put the file in your extensions folder. The
>>> file is in the original post as an attachment.
>>>
>>> Miguel
>>>
>>> Timur Kuyanov escreveu:
>>>> Yes, now i have Tools menu next to help, but still no gui...ERROR:
>>>> Message
>>>> 'makeWindows' not understood.
>>>>
>>>>
>>>> Miguel C. Negrão wrote:
>>>>> Hi
>>>>>
>>>>> Timur Kuyanov escreveu:
>>>>>> Hello!
>>>>>>
>>>>>> Interesting to try your tools, but i'm new to SC, can you explain
>>>>>> steps
>>>>>> need
>>>>>> to be taken to get it work?
>>>>>>
>>>>>> I've put ToolsMenu folder to SCClassLibrary folder, now have this in
>>>>>> post
>>>>>> window:
>>>>>>
>>>>> Don't worry about it, it's not a problem, I got millions of those.
>>>>>
>>>>>> And anyway, i don't really understand what i need to do to use it? is
>>>>>> it
>>>>>> supposed to appear in menu of SC itself?
>>>>> Yes, it should appear in the menu next to help. Are you placing this
>>>>> in
>>>>> your startup file ? (you can change the paths to something else off
>>>>> course)
>>>>>
>>>>> ToolsMenu.add(
>>>>> [
>>>>> Platform.userAppSupportDir +/+ "startup.rtf",
>>>>> Platform.userAppSupportDir +/+ Extensions/"
>>>>> ];
>>>>> );
>>>>>
>>>>>
>>>>> What code i need to put in
>>>>>> startup.rtf to get "black gui"?))
>>>>>>
>>>>> Server.makeWindows. altogh even if you don't put this you will get the
>>>>> black server guis, just not the main volume slider. If you have place
>>>>> the class file in your extension folder it will overide the normal
>>>>> server window. Are you not seeing the black gui ? Where did you put
>>>>> the
>>>>> class files (.sc) ?
>>>>>
>>>>> Miguel
>>>>>
>>>>>
>>>>>> Sorry for stupid questions.
>>>>>>
>>>>>> Thanx!
>>>>>>
>>>>>>
>>>>>> Miguel C. Negrão wrote:
>>>>>>> Hi
>>>>>>>
>>>>>>> I've made a class to add some common used functions of supercollider
>>>>>>> in
>>>>>>> a menu using SCMenuItem.
>>>>>>> It allows to choose soundcard for each server or all at the same
>>>>>>> time,
>>>>>>> EQ, record window, auto sintax colorize on current document, color
>>>>>>> picker, open quarks, Init Midi, check current midi messages, run a
>>>>>>> file
>>>>>>> with cmd^r .
>>>>>>> Finally it adds a menu tree with all files in predetermined folders
>>>>>>> for easy access. When working on a project I'm always editing the
>>>>>>> same
>>>>>>> files, closing and opening the files, and I got fed up and decided
>>>>>>> to
>>>>>>> just put them in the menu bar for easy access.
>>>>>>> I hope this might be useful for someone else, I think specially
>>>>>>> newbies will appreciate being able to change the sound card (thanks
>>>>>>> for
>>>>>>> someone who posted the code in the list) and record from a gui
>>>>>>> (thanks
>>>>>>> wouter for ServerRecordWindow !).
>>>>>>>
>>>>>>> http://www.friendlyvirus.org/artists/zlb/code/ToolsMenu.zip
>>>>>>>
>>>>>>> Also included here is a nice minimal black gui for the server window
>>>>>>> I
>>>>>>> got a from a friend and that I refined a bit. It puts all server
>>>>>>> guis
>>>>>>> as
>>>>>>> a black strip in the bottom of the screen plus a big fader that
>>>>>>> changes
>>>>>>> the volume of all servers. To use this addon one must call
>>>>>>> Server.makeWindows each time a server is created and in the
>>>>>>> startup.rtf.
>>>>>>> It uses the gui version of queryAllNodes by Scott Wilson that I
>>>>>>> added
>>>>>>> as
>>>>>>> the method queryAllNodesGui.
>>>>>>>
>>>>>>> I hope this is useful.
>>>>>>> --
>>>>>>> Miguel Negrão // ZLB
>>>>>>> http://www.friendlyvirus.org/artists/zlb/
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> + Server {
>>>>>>>
>>>>>>> // shortcut server record
>>>>>>> rek {|chans=1, filename="test.aif", format="int24"|
>>>>>>> var path, sched;
>>>>>>> path = "~/Desktop/".standardizePath ++ filename;
>>>>>>> this.recChannels = chans;
>>>>>>> this.recSampleFormat = format;
>>>>>>> this.prepareForRecord( path );
>>>>>>> AppClock.sched(1.0, { this.record; nil });
>>>>>>> }
>>>>>>>
>>>>>>> stoprek { this.stopRecording }
>>>>>>>
>>>>>>> *makeWindows{
>>>>>>> var window,w;
>>>>>>> var bgColor= Color.grey(0.0, 0.9);
>>>>>>> var stringColor= Color.grey(0.8);
>>>>>>> var runningColor= Color.magenta;
>>>>>>> var bootingColor= Color.yellow(0.9);
>>>>>>> var bundlingColor= Color.new255(237, 157, 196);
>>>>>>> var width, font;
>>>>>>>
>>>>>>> Server.set.do({|se| if(se.window != nil)
>>>>>>> {
>>>>>>> Routine({
>>>>>>> se.window.close;
>>>>>>> 0.1.wait;
>>>>>>> se.makeWindow;
>>>>>>> }).play(AppClock)
>>>>>>> }{
>>>>>>> se.makeWindow
>>>>>>> }});
>>>>>>>
>>>>>>> width = SCWindow.screenBounds.width - 2;
>>>>>>> w = window = Window( "Main Volume",
>>>>>>> Rect(1, 1, width, 19),
>>>>>>> resizable: false, border: false);
>>>>>>> w.view.background_(bgColor);
>>>>>>> w.view.decorator = FlowLayout(w.view.bounds);
>>>>>>> w.front;
>>>>>>> Slider.new(w,Rect(0, 0, width-2, 16))
>>>>>>> .action_{|v| Server.set.do{ |server|
>>>>>>> server.volume.volume_([server.volume.min,server.volume.max,
>>>>>>> \db].asSpec.map(v.value))
>>>>>>> }
>>>>>>> }
>>>>>>> .canFocus_(false);
>>>>>>>
>>>>>>> }
>>>>>>> // server window customize
>>>>>>> makeWindow { arg w;
>>>>>>> var active, booter, killer, makeDefault, running, booting,
>>>>>>> stopped,
>>>>>>> bundling;
>>>>>>> var scoper;
>>>>>>> var countsViews, ctlr;
>>>>>>> var dumping=false, label, gui, volumeNum;
>>>>>>>
>>>>>>> var bgColor= Color.grey(0.0, 0.9);
>>>>>>> var stringColor= Color.grey(0.8);
>>>>>>> var runningColor= Color.magenta;
>>>>>>> var bootingColor= Color.yellow(0.9);
>>>>>>> var bundlingColor= Color.new255(237, 157, 196);
>>>>>>> var hideLocal= false;
>>>>>>> var hideInternal= false;
>>>>>>> var hideButt;
>>>>>>> var width, font;
>>>>>>>
>>>>>>> gui = GUI.current;
>>>>>>>
>>>>>>> if (window.notNil, { ^window.front });
>>>>>>>
>>>>>>> width = SCWindow.screenBounds.width - 2;
>>>>>>> font = Font("Monaco", 9);
>>>>>>>
>>>>>>> if(w.isNil) {
>>>>>>> label = name.asString + "server";
>>>>>>> w = window = Window( label,
>>>>>>> Rect(1,
>>>>>>> ((named.values.size-1)-named.values.indexOf(this)+1)*20+1,
>>>>>>> width, 19),
>>>>>>> resizable: false, border: false);
>>>>>>> w.view.background_(bgColor);
>>>>>>> w.view.decorator = FlowLayout(w.view.bounds);
>>>>>>> } { label = w.name };
>>>>>>>
>>>>>>> active = StaticText(w, Rect(0, 0, 78, 24));
>>>>>>> active.string = this.name.asString;
>>>>>>> active.align = \center;
>>>>>>> active.font = font;
>>>>>>> active.background = Color.clear;
>>>>>>> if(serverRunning,running,stopped);
>>>>>>>
>>>>>>> hideButt= Button(w, Rect(0, 0, 19, 19));
>>>>>>> hideButt.states= [["x", stringColor, Color.clear], ["",
>>>>>>> stringColor,
>>>>>>> Color.clear]];
>>>>>>> hideButt.action_({|view|
>>>>>>> if(view.value==1, {
>>>>>>> w.bounds_(Rect(1,
>>>>>>> ((named.values.size-1)-named.values.indexOf(this)+1)*20+1, 108,
>>>>>>> 19));
>>>>>>> w.view.children.do{|x|
>>>>>>> if([active, hideButt].includes(x).not, {
>>>>>>> x.visible= false;
>>>>>>> });
>>>>>>> };
>>>>>>> }, {
>>>>>>> w.bounds_(Rect(1,
>>>>>>> ((named.values.size-1)-named.values.indexOf(this)+1)*20+1, width,
>>>>>>> 19));
>>>>>>> w.view.children.do{|x| x.visible= true};
>>>>>>> });
>>>>>>> });
>>>>>>> if(isLocal&&hideLocal, { hideButt.valueAction_(1) });
>>>>>>> if(this.name==\internal&&hideInternal, { hideButt.valueAction_(1)
>>>>>>> });
>>>>>>>
>>>>>>>
>>>>>>> if(isLocal,{
>>>>>>> booter = Button(w, Rect(0, 0, 48, 24));
>>>>>>> booter.states = [["Boot", stringColor, Color.clear],
>>>>>>> ["Quit", stringColor, Color.clear]];
>>>>>>>
>>>>>>> booter.action = { arg view;
>>>>>>> if(view.value == 1, {
>>>>>>> booting.value;
>>>>>>> this.boot;
>>>>>>> });
>>>>>>> if(view.value == 0,{
>>>>>>> this.quit;
>>>>>>> });
>>>>>>> };
>>>>>>> booter.setProperty(\value,serverRunning.binaryValue);
>>>>>>>
>>>>>>> killer = Button(w, Rect(0,0, 24, 24));
>>>>>>> killer.states = [["K", stringColor, Color.clear]];
>>>>>>>
>>>>>>> killer.action = { Server.killAll };
>>>>>>> });
>>>>>>>
>>>>>>>
>>>>>>> makeDefault = Button(w, Rect(0, 0, 80, 24));
>>>>>>> makeDefault.states = [["-> default", stringColor, Color.clear]];
>>>>>>> makeDefault.action = {
>>>>>>> thisProcess.interpreter.s = this;
>>>>>>> Server.default = this;
>>>>>>> };
>>>>>>>
>>>>>>> w.view.keyDownAction = { arg ascii, char;
>>>>>>> var startDump, stopDump, stillRunning;
>>>>>>>
>>>>>>> case
>>>>>>> {char === $n} { this.queryAllNodesGui }
>>>>>>> {char === $l} { this.meter }
>>>>>>> {char === $N} { this.queryAllNodes(true) }
>>>>>>> {char === $ } { if(serverRunning.not) { this.boot } }
>>>>>>> {char === $s and: { Stethoscope.isValidServer( this )}} {
>>>>>>> this.scope
>>>>>>> }
>>>>>>> {char == $d} {
>>>>>>> if(this.isLocal or: { this.inProcess }) {
>>>>>>> stillRunning = {
>>>>>>> SystemClock.sched(0.2, { this.stopAliveThread });
>>>>>>> };
>>>>>>> startDump = {
>>>>>>> this.dumpOSC(1);
>>>>>>> this.stopAliveThread;
>>>>>>> dumping = true;
>>>>>>> w.name = "dumping osc: " ++ name.asString;
>>>>>>> CmdPeriod.add(stillRunning);
>>>>>>> };
>>>>>>> stopDump = {
>>>>>>> this.dumpOSC(0);
>>>>>>> this.startAliveThread;
>>>>>>> dumping = false;
>>>>>>> w.name = label;
>>>>>>> CmdPeriod.remove(stillRunning);
>>>>>>> };
>>>>>>> if(dumping, stopDump, startDump)
>>>>>>> } {
>>>>>>> "cannot dump a remote server's messages".inform
>>>>>>> }
>>>>>>>
>>>>>>> };
>>>>>>> };
>>>>>>>
>>>>>>> if (isLocal, {
>>>>>>>
>>>>>>> running = {
>>>>>>> active.stringColor_(runningColor);
>>>>>>> booter.setProperty(\value,1);
>>>>>>> };
>>>>>>> stopped = {
>>>>>>> active.stringColor_(stringColor);
>>>>>>> booter.setProperty(\value,0);
>>>>>>> };
>>>>>>> booting = {
>>>>>>> active.stringColor_(bootingColor);
>>>>>>> };
>>>>>>> bundling = {
>>>>>>> active.stringColor_(bundlingColor);
>>>>>>> booter.setProperty(\value,1);
>>>>>>> };
>>>>>>>
>>>>>>> w.onClose = {
>>>>>>> window = nil;
>>>>>>> ctlr.remove;
>>>>>>> };
>>>>>>> },{
>>>>>>> running = {
>>>>>>> active.stringColor = runningColor;
>>>>>>> active.background = Color.red;
>>>>>>> };
>>>>>>> stopped = {
>>>>>>> active.stringColor = stringColor;
>>>>>>> active.background = Color.black;
>>>>>>> };
>>>>>>> booting = {
>>>>>>> active.stringColor = bootingColor;
>>>>>>> active.background = Color.yellow;
>>>>>>> };
>>>>>>>
>>>>>>> bundling = {
>>>>>>> active.stringColor = bundlingColor;
>>>>>>> active.background = Color.red(0.5);
>>>>>>> booter.setProperty(\value,1);
>>>>>>> };
>>>>>>>
>>>>>>> w.onClose = {
>>>>>>> // but do not remove other responders
>>>>>>> this.stopAliveThread;
>>>>>>> ctlr.remove;
>>>>>>> };
>>>>>>> });
>>>>>>> if(serverRunning,running,stopped);
>>>>>>>
>>>>>>>
>>>>>>> countsViews =
>>>>>>> #[
>>>>>>> "Avg CPU :", "Peak CPU :",
>>>>>>> "UGens :", "Synths :", "Groups :", "SynthDefs :"
>>>>>>> ].collect({ arg name, i;
>>>>>>> var label,numView, pctView;
>>>>>>> label = StaticText(w, Rect(0,0, 80, 14));
>>>>>>> label.stringColor_(stringColor);
>>>>>>> label.string = name;
>>>>>>> label.align = \right;
>>>>>>>
>>>>>>> if (i < 2, {
>>>>>>> numView = StaticText(w, Rect(0,0, 38, 14));
>>>>>>> numView.stringColor_(stringColor);
>>>>>>> numView.string = "?";
>>>>>>> numView.align = \left;
>>>>>>>
>>>>>>> pctView = StaticText(w, Rect(0,0, 12, 14));
>>>>>>> pctView.stringColor_(stringColor);
>>>>>>> pctView.string = "%";
>>>>>>> pctView.align = \left;
>>>>>>> },{
>>>>>>> numView = StaticText(w, Rect(0,0, 50, 14));
>>>>>>> numView.stringColor_(stringColor);
>>>>>>> numView.string = "?";
>>>>>>> numView.align = \left;
>>>>>>> });
>>>>>>> numView
>>>>>>> });
>>>>>>>
>>>>>>> if(isLocal or: { options.remoteControlVolume }) {
>>>>>>> {
>>>>>>> var volSpec, cpVol;
>>>>>>> var volumeSlider, muteButton, muteActions, volController;
>>>>>>> muteActions = [{this.unmute}, {this.mute}];
>>>>>>> volSpec = [volume.min, volume.max, \db].asSpec;
>>>>>>>
>>>>>>> StaticText.new(w, Rect(0,0, 44, 18))
>>>>>>> .font_(font)
>>>>>>> .stringColor_(stringColor)
>>>>>>> .string_(" volume :");
>>>>>>>
>>>>>>> muteButton = gui.button.new(w, Rect(0, 0, 20, 16))
>>>>>>> .font_(font)
>>>>>>> .canFocus_(false)
>>>>>>> .states_([
>>>>>>> ["M", stringColor, Color.clear],
>>>>>>> ["M", Color.black, Color.red.alpha_(0.3)]
>>>>>>> ])
>>>>>>> .action_({arg me;
>>>>>>> this.serverRunning.if({
>>>>>>> muteActions[me.value].value;
>>>>>>> }, {
>>>>>>> "The server must be booted to mute it".warn;
>>>>>>> me.value_(0);
>>>>>>> })
>>>>>>> });
>>>>>>>
>>>>>>> volumeNum = gui.numberBox.new(w, Rect(0, 0, 28, 15))
>>>>>>> .font_(font)
>>>>>>> .value_(0.0)
>>>>>>> .align_(\center)
>>>>>>> .stringColor_(stringColor)
>>>>>>> .action_({arg me;
>>>>>>> var newdb;
>>>>>>> newdb = me.value.clip(-90, 6);
>>>>>>> this.volume_(newdb);
>>>>>>> volumeSlider.value_(volSpec.unmap(newdb));
>>>>>>> });
>>>>>>>
>>>>>>> volumeSlider = gui.slider.new(w, Rect(0, 0, 172, 16))
>>>>>>> .value_(volSpec.unmap(0))
>>>>>>> .onClose_{volController.remove}
>>>>>>> .action_({arg me;
>>>>>>> var newdb;
>>>>>>> newdb = volSpec.map(me.value).round(0.1);
>>>>>>> this.volume_(newdb);
>>>>>>> volumeNum.value_(newdb);
>>>>>>> })
>>>>>>> .keyDownAction_({arg slider, char, modifiers, unicode, keycode;
>>>>>>> if (char == $], { slider.increment; });
>>>>>>> if (char == $[, { slider.decrement; });
>>>>>>> if (unicode == 16rF700, { slider.increment; });
>>>>>>> if (unicode == 16rF703, { slider.increment; });
>>>>>>> if (unicode == 16rF701, { slider.decrement; });
>>>>>>> if (unicode == 16rF702, { slider.decrement; }); nil;
>>>>>>> });
>>>>>>> volController = SimpleController(volume)
>>>>>>> .put(\amp, {|changer, what, vol|
>>>>>>> {
>>>>>>> volumeNum.value_(vol.round(0.01));
>>>>>>> volumeSlider.value_(volSpec.unmap(vol));
>>>>>>> }.defer
>>>>>>> })
>>>>>>> .put(\mute, {|changer, what, flag|
>>>>>>> {
>>>>>>> muteButton.value_(flag.binaryValue);
>>>>>>> }.defer
>>>>>>> })
>>>>>>> .put(\ampRange, {|changer, what, min, max|
>>>>>>> volSpec = [min, max, \db].asSpec;
>>>>>>> volumeSlider.value_(volSpec.unmap(volume.volume));
>>>>>>> })
>>>>>>> }.value;
>>>>>>> };
>>>>>>>
>>>>>>>
>>>>>>> w.front;
>>>>>>>
>>>>>>> ctlr = SimpleController(this)
>>>>>>> .put(\serverRunning, { if(serverRunning,running,stopped) })
>>>>>>> .put(\counts,{
>>>>>>> countsViews.at(0).string = avgCPU.round(0.1);
>>>>>>> countsViews.at(1).string = peakCPU.round(0.1);
>>>>>>> countsViews.at(2).string = numUGens;
>>>>>>> countsViews.at(3).string = numSynths;
>>>>>>> countsViews.at(4).string = numGroups;
>>>>>>> countsViews.at(5).string = numSynthDefs;
>>>>>>> })
>>>>>>> .put(\bundling, bundling);
>>>>>>> this.startAliveThread;
>>>>>>>
>>>>>>> w.view.children.do{|view|
>>>>>>> view.bounds_(Rect(view.bounds.left, view.bounds.top,
>>>>>>> view.bounds.width,
>>>>>>> 14));
>>>>>>> if(view.respondsTo(\font)) { view.font_(font) };
>>>>>>> view.canFocus_(false);
>>>>>>> };
>>>>>>> }
>>>>>>>
>>>>>>> queryAllNodesGui {
>>>>>>> var resp, done = false;
>>>>>>>
>>>>>>> // msg[1] controls included
>>>>>>> // msg[2] nodeID of queried group
>>>>>>> // initial number of children
>>>>>>> resp = OSCresponderNode(this.addr, '/g_queryTree.reply', { arg
>>>>>>> time,
>>>>>>> responder, msg;
>>>>>>>
>>>>>>> //var finalEvent;
>>>>>>> var i = 2, j, controls, printControls = false, dumpFunc;
>>>>>>> if(msg[1] != 0, {printControls = true});
>>>>>>> dumpFunc = {|numChildren|
>>>>>>> var event, children;
>>>>>>> event = ().group;
>>>>>>> event.id = msg[i];
>>>>>>> event.instrument = nil; // need to know it's a group
>>>>>>> i = i + 2;
>>>>>>> children = Array.fill(numChildren, {
>>>>>>> var id, child;
>>>>>>> // i = id
>>>>>>> // i + 1 = numChildren
>>>>>>> // i + 2 = def (if synth)
>>>>>>> id = msg[i];
>>>>>>> if(msg[i+1] >=0, {
>>>>>>> child = dumpFunc.value(msg[i+1]);
>>>>>>> }, {
>>>>>>> j = 4;
>>>>>>> child = ().synth.instrument_(msg[i+2]);
>>>>>>> if(printControls, {
>>>>>>>
>>>>>>> controls = ();
>>>>>>> msg[i+3].do({
>>>>>>> controls[msg[i + j]] = msg[i + j + 1];
>>>>>>> j = j + 2;
>>>>>>> });
>>>>>>> child.controls = controls;
>>>>>>> i = i + 4 + (2 * controls.size);
>>>>>>> }, {i = i + 3 });
>>>>>>> });
>>>>>>> child.id = id;
>>>>>>> });
>>>>>>> event.children = children;
>>>>>>> event;
>>>>>>> };
>>>>>>> ~finalEvent = dumpFunc.value(msg[3]);
>>>>>>>
>>>>>>> done = true;
>>>>>>> {
>>>>>>> var collectChildren, levels, countSize;
>>>>>>> var window, view, bounds;
>>>>>>> var tabSize = 25;
>>>>>>> collectChildren = {|group|
>>>>>>> group.children.collect({|child|
>>>>>>> if(child.children.notNil,{
>>>>>>> child.id -> collectChildren.value(child);
>>>>>>> }, {
>>>>>>> child.id -> child.instrument;
>>>>>>> });
>>>>>>> });
>>>>>>> };
>>>>>>> levels = collectChildren.value(~finalEvent);
>>>>>>>
>>>>>>> countSize = {|array|
>>>>>>> var size = 0;
>>>>>>> array.do({|elem|
>>>>>>> if(elem.value.isArray, { size = size +
>>>>>>> countSize.value(elem.value) + 2}, {size = size + 1;});
>>>>>>> });
>>>>>>> size
>>>>>>> };
>>>>>>> //countSize.value(levels);
>>>>>>>
>>>>>>> window = Window.new(this.asString,scroll:true).front;
>>>>>>>
>>>>>>> window.view.hasHorizontalScroller_(false).background_(Color.black);
>>>>>>>
>>>>>>> bounds = Rect(0, 0, 400, tabSize *
>>>>>>> (countSize.value(levels)
>>>>>>> +
>>>>>>> 2));
>>>>>>> view = UserView.new(window, bounds);
>>>>>>>
>>>>>>> view.drawFunc = {
>>>>>>> var xtabs = 0, ytabs = 0, drawFunc;
>>>>>>>
>>>>>>> drawFunc = {|group|
>>>>>>> var thisSize, rect, endYTabs;
>>>>>>> xtabs = xtabs + 1;
>>>>>>> ytabs = ytabs + 1;
>>>>>>> group.do({|node|
>>>>>>> if(node.value.isArray, {
>>>>>>>
>>>>>>> thisSize = countSize.value(node);
>>>>>>> endYTabs = ytabs + thisSize + 0.2;
>>>>>>> rect = Rect(xtabs * tabSize,
>>>>>>> ytabs * tabSize,
>>>>>>> window.view.bounds.width - (xtabs *
>>>>>>> tabSize
>>>>>>> * 2),
>>>>>>> thisSize * tabSize;
>>>>>>> );
>>>>>>> Pen.fillColor = Color.green.alpha_(0.5);
>>>>>>> Pen.fillRect(rect);
>>>>>>> Pen.strokeRect(rect);
>>>>>>> (" Group" + node.key.asString + (node.key
>>>>>>> ==
>>>>>>> 1).if("- default group", "")).drawInRect(rect,
>>>>>>> Font("Helvetica", 11),
>>>>>>> Color.black);
>>>>>>> drawFunc.value(node.value);
>>>>>>> ytabs = endYTabs;
>>>>>>> //ytabs.postln;
>>>>>>> },{
>>>>>>> rect = Rect(xtabs * tabSize,
>>>>>>> ytabs * tabSize,
>>>>>>> 7 * tabSize,
>>>>>>> 0.8 * tabSize
>>>>>>> );
>>>>>>> //rect.postln;
>>>>>>> Pen.fillColor = Color.red;
>>>>>>> Pen.fillRect(rect);
>>>>>>> Pen.strokeRect(rect);
>>>>>>> (" " ++ node.key.asString +
>>>>>>> node.value.asString).drawInRect(rect, Font("Helvetica", 11),
>>>>>>> Color.black);
>>>>>>> ytabs = ytabs + 1;
>>>>>>> });
>>>>>>> });
>>>>>>> xtabs = xtabs - 1;
>>>>>>> };
>>>>>>> drawFunc.value(levels);
>>>>>>> };
>>>>>>> }.defer
>>>>>>> }).add.removeWhenDone;
>>>>>>> this.sendMsg("/g_queryTree", 0, 0);
>>>>>>> SystemClock.sched(3, {
>>>>>>> done.not.if({
>>>>>>> resp.remove;
>>>>>>> "Server failed to respond to Group:queryTree!".warn;
>>>>>>> });
>>>>>>> });
>>>>>>>
>>>>>>> }
>>>>>>>
>>>>>>> }
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>> --
>>>>> Miguel Negrão // ZLB
>>>>> http://www.friendlyvirus.org/artists/zlb/
>>>>>
>>>>> _______________________________________________
>>>>> sc-users mailing list
>>>>>
>>>>> info (subscription, etc.):
>>>>> http://www.beast.bham.ac.uk/research/sc_mailing_lists.shtml
>>>>> archive: https://listarc.bham.ac.uk/marchives/sc-users/
>>>>> search: https://listarc.bham.ac.uk/lists/sc-users/search/
>>>>>
>>>>>
>>>
>>> --
>>> Miguel Negrão // ZLB
>>> http://www.friendlyvirus.org/artists/zlb/
>>>
>>>
>>> _______________________________________________
>>> sc-users mailing list
>>>
>>> info (subscription, etc.):
>>> http://www.beast.bham.ac.uk/research/sc_mailing_lists.shtml
>>> archive: https://listarc.bham.ac.uk/marchives/sc-users/
>>> search: https://listarc.bham.ac.uk/lists/sc-users/search/
>>>
>>>
>>
>
>
> --
> Miguel Negrão // ZLB
> http://www.friendlyvirus.org/artists/zlb/
>
>
> + Server {
>
> // shortcut server record
> rek {|chans=1, filename="test.aif", format="int24"|
> var path, sched;
> path = "~/Desktop/".standardizePath ++ filename;
> this.recChannels = chans;
> this.recSampleFormat = format;
> this.prepareForRecord( path );
> AppClock.sched(1.0, { this.record; nil });
> }
>
> stoprek { this.stopRecording }
>
> *makeWindows{
> var window,w;
> var bgColor= Color.grey(0.0, 0.9);
> var stringColor= Color.grey(0.8);
> var runningColor= Color.magenta;
> var bootingColor= Color.yellow(0.9);
> var bundlingColor= Color.new255(237, 157, 196);
> var width, font;
>
> Server.set.do({|se| if(se.window != nil)
> {
> Routine({
> se.window.close;
> 0.1.wait;
> se.makeWindow;
> }).play(AppClock)
> }{
> se.makeWindow
> }});
>
> width = SCWindow.screenBounds.width - 2;
> w = window = Window( "Main Volume",
> Rect(1, 1, width, 19),
> resizable: false, border: false);
> w.view.background_(bgColor);
> w.view.decorator = FlowLayout(w.view.bounds);
> w.front;
> SmoothSlider.new(w,Rect(0, 0, width-2, 16))
> .action_{|v| Server.set.do{ |server|
> server.volume.volume_([server.volume.min,server.volume.max,
> \db].asSpec.map(v.value))
> }
> }
> .canFocus_(false)
> .mode_( \move );
>
> }
>
> // server window customize
> makeWindow { arg w;
> var active, booter, killer, makeDefault, running, booting, stopped,
> bundling;
> var scoper;
> var countsViews, ctlr;
> var dumping=false, label, gui, volumeNum;
>
> var bgColor= Color.grey(0.0, 0.9);
> var stringColor= Color.grey(0.8);
> var runningColor= Color.magenta;
> var bootingColor= Color.yellow(0.9);
> var bundlingColor= Color.new255(237, 157, 196);
> var hideLocal= false;
> var hideInternal= false;
> var hideButt;
> var width, font;
>
> gui = GUI.current;
>
> if (window.notNil, { ^window.front });
>
> width = SCWindow.screenBounds.width - 2;
> font = Font("Monaco", 9);
>
> if(w.isNil) {
> label = name.asString + "server";
> w = window = Window( label,
> Rect(1, ((named.values.size-1)-named.values.indexOf(this)+1)*20+1,
> width, 19),
> resizable: false, border: false);
> w.view.background_(bgColor);
> w.view.decorator = FlowLayout(w.view.bounds);
> } { label = w.name };
>
> active = StaticText(w, Rect(0, 0, 78, 24));
> active.string = this.name.asString;
> active.align = \center;
> active.font = font;
> active.background = Color.clear;
> if(serverRunning,running,stopped);
>
> hideButt= RoundButton(w, Rect(0, 0, 19, 19));
> hideButt.states= [["x", stringColor, Color.clear], ["", stringColor,
> Color.clear]];
> hideButt.action_({|view|
> if(view.value==1, {
> w.bounds_(Rect(1,
> ((named.values.size-1)-named.values.indexOf(this)+1)*20+1, 108, 19));
> w.view.children.do{|x|
> if([active, hideButt].includes(x).not, {
> x.visible= false;
> });
> };
> }, {
> w.bounds_(Rect(1,
> ((named.values.size-1)-named.values.indexOf(this)+1)*20+1, width, 19));
> w.view.children.do{|x| x.visible= true};
> });
> });
> if(isLocal&&hideLocal, { hideButt.valueAction_(1) });
> if(this.name==\internal&&hideInternal, { hideButt.valueAction_(1) });
>
>
> if(isLocal,{
> booter = Button(w, Rect(0, 0, 48, 24));
> booter.states = [["Boot", stringColor, Color.clear],
> ["Quit", stringColor, Color.clear]];
>
> booter.action = { arg view;
> if(view.value == 1, {
> booting.value;
> this.boot;
> });
> if(view.value == 0,{
> this.quit;
> });
> };
> booter.setProperty(\value,serverRunning.binaryValue);
>
> killer = Button(w, Rect(0,0, 24, 24));
> killer.states = [["K", stringColor, Color.clear]];
>
> killer.action = { Server.killAll };
> });
>
>
> makeDefault = Button(w, Rect(0, 0, 80, 24));
> makeDefault.states = [["-> default", stringColor, Color.clear]];
> makeDefault.action = {
> thisProcess.interpreter.s = this;
> Server.default = this;
> };
>
> w.view.keyDownAction = { arg ascii, char;
> var startDump, stopDump, stillRunning;
>
> case
> {char === $n} { this.queryAllNodesGui }
> {char === $l} { this.meter }
> {char === $N} { this.queryAllNodes(true) }
> {char === $ } { if(serverRunning.not) { this.boot } }
> {char === $s and: { Stethoscope.isValidServer( this )}} { this.scope }
> {char == $d} {
> if(this.isLocal or: { this.inProcess }) {
> stillRunning = {
> SystemClock.sched(0.2, { this.stopAliveThread });
> };
> startDump = {
> this.dumpOSC(1);
> this.stopAliveThread;
> dumping = true;
> w.name = "dumping osc: " ++ name.asString;
> CmdPeriod.add(stillRunning);
> };
> stopDump = {
> this.dumpOSC(0);
> this.startAliveThread;
> dumping = false;
> w.name = label;
> CmdPeriod.remove(stillRunning);
> };
> if(dumping, stopDump, startDump)
> } {
> "cannot dump a remote server's messages".inform
> }
>
> };
> };
>
> if (isLocal, {
>
> running = {
> active.stringColor_(runningColor);
> booter.setProperty(\value,1);
> };
> stopped = {
> active.stringColor_(stringColor);
> booter.setProperty(\value,0);
> };
> booting = {
> active.stringColor_(bootingColor);
> };
> bundling = {
> active.stringColor_(bundlingColor);
> booter.setProperty(\value,1);
> };
>
> w.onClose = {
> window = nil;
> ctlr.remove;
> };
> },{
> running = {
> active.stringColor = runningColor;
> active.background = Color.red;
> };
> stopped = {
> active.stringColor = stringColor;
> active.background = Color.black;
> };
> booting = {
> active.stringColor = bootingColor;
> active.background = Color.yellow;
> };
>
> bundling = {
> active.stringColor = bundlingColor;
> active.background = Color.red(0.5);
> booter.setProperty(\value,1);
> };
>
> w.onClose = {
> // but do not remove other responders
> this.stopAliveThread;
> ctlr.remove;
> };
> });
> if(serverRunning,running,stopped);
>
>
> countsViews =
> #[
> "Avg CPU :", "Peak CPU :",
> "UGens :", "Synths :", "Groups :", "SynthDefs :"
> ].collect({ arg name, i;
> var label,numView, pctView;
> label = StaticText(w, Rect(0,0, 80, 14));
> label.stringColor_(stringColor);
> label.string = name;
> label.align = \right;
>
> if (i < 2, {
> numView = StaticText(w, Rect(0,0, 38, 14));
> numView.stringColor_(stringColor);
> numView.string = "?";
> numView.align = \left;
>
> pctView = StaticText(w, Rect(0,0, 12, 14));
> pctView.stringColor_(stringColor);
> pctView.string = "%";
> pctView.align = \left;
> },{
> numView = StaticText(w, Rect(0,0, 50, 14));
> numView.stringColor_(stringColor);
> numView.string = "?";
> numView.align = \left;
> });
> numView
> });
>
> if(isLocal or: { options.remoteControlVolume }) {
> {
> var volSpec, cpVol;
> var volumeSlider, muteButton, muteActions, volController;
> muteActions = [{this.unmute}, {this.mute}];
> volSpec = [volume.min, volume.max, \db].asSpec;
>
> StaticText.new(w, Rect(0,0, 44, 18))
> .font_(font)
> .stringColor_(stringColor)
> .string_(" volume :");
>
> muteButton = gui.button.new(w, Rect(0, 0, 20, 16))
> .font_(font)
> .canFocus_(false)
> .states_([
> ["M", stringColor, Color.clear],
> ["M", Color.black, Color.red.alpha_(0.3)]
> ])
> .action_({arg me;
> this.serverRunning.if({
> muteActions[me.value].value;
> }, {
> "The server must be booted to mute it".warn;
> me.value_(0);
> })
> });
>
> volumeNum = gui.numberBox.new(w, Rect(0, 0, 28, 15))
> .font_(font)
> .value_(0.0)
> .align_(\center)
> .stringColor_(stringColor)
> .action_({arg me;
> var newdb;
> newdb = me.value.clip(-90, 6);
> this.volume_(newdb);
> volumeSlider.value_(volSpec.unmap(newdb));
> });
>
> volumeSlider = SmoothSlider.new(w, Rect(0, 0, 172, 16))
> .value_(volSpec.unmap(0))
> .onClose_{volController.remove}
> .action_({arg me;
> var newdb;
> newdb = volSpec.map(me.value).round(0.1);
> this.volume_(newdb);
> volumeNum.value_(newdb);
> })
> .keyDownAction_({arg slider, char, modifiers, unicode, keycode;
> if (char == $], { slider.increment; });
> if (char == $[, { slider.decrement; });
> if (unicode == 16rF700, { slider.increment; });
> if (unicode == 16rF703, { slider.increment; });
> if (unicode == 16rF701, { slider.decrement; });
> if (unicode == 16rF702, { slider.decrement; }); nil;
> })
> .mode_( \move );
> volController = SimpleController(volume)
> .put(\amp, {|changer, what, vol|
> {
> volumeNum.value_(vol.round(0.01));
> volumeSlider.value_(volSpec.unmap(vol));
> }.defer
> })
> .put(\mute, {|changer, what, flag|
> {
> muteButton.value_(flag.binaryValue);
> }.defer
> })
> .put(\ampRange, {|changer, what, min, max|
> volSpec = [min, max, \db].asSpec;
> volumeSlider.value_(volSpec.unmap(volume.volume));
> })
> }.value;
> };
>
>
> w.front;
>
> ctlr = SimpleController(this)
> .put(\serverRunning, { if(serverRunning,running,stopped) })
> .put(\counts,{
> countsViews.at(0).string = avgCPU.round(0.1);
> countsViews.at(1).string = peakCPU.round(0.1);
> countsViews.at(2).string = numUGens;
> countsViews.at(3).string = numSynths;
> countsViews.at(4).string = numGroups;
> countsViews.at(5).string = numSynthDefs;
> })
> .put(\bundling, bundling);
> this.startAliveThread;
>
> w.view.children.do{|view|
> view.bounds_(Rect(view.bounds.left, view.bounds.top, view.bounds.width,
> 14));
> if(view.respondsTo(\font)) { view.font_(font) };
> view.canFocus_(false);
> };
> }
>
> queryAllNodesGui {
> var resp, done = false;
>
> // msg[1] controls included
> // msg[2] nodeID of queried group
> // initial number of children
> resp = OSCresponderNode(this.addr, '/g_queryTree.reply', { arg time,
> responder, msg;
>
> //var finalEvent;
> var i = 2, j, controls, printControls = false, dumpFunc;
> if(msg[1] != 0, {printControls = true});
> dumpFunc = {|numChildren|
> var event, children;
> event = ().group;
> event.id = msg[i];
> event.instrument = nil; // need to know it's a group
> i = i + 2;
> children = Array.fill(numChildren, {
> var id, child;
> // i = id
> // i + 1 = numChildren
> // i + 2 = def (if synth)
> id = msg[i];
> if(msg[i+1] >=0, {
> child = dumpFunc.value(msg[i+1]);
> }, {
> j = 4;
> child = ().synth.instrument_(msg[i+2]);
> if(printControls, {
>
> controls = ();
> msg[i+3].do({
> controls[msg[i + j]] = msg[i + j + 1];
> j = j + 2;
> });
> child.controls = controls;
> i = i + 4 + (2 * controls.size);
> }, {i = i + 3 });
> });
> child.id = id;
> });
> event.children = children;
> event;
> };
> ~finalEvent = dumpFunc.value(msg[3]);
>
> done = true;
> {
> var collectChildren, levels, countSize;
> var window, view, bounds;
> var tabSize = 25;
> collectChildren = {|group|
> group.children.collect({|child|
> if(child.children.notNil,{
> child.id -> collectChildren.value(child);
> }, {
> child.id -> child.instrument;
> });
> });
> };
> levels = collectChildren.value(~finalEvent);
>
> countSize = {|array|
> var size = 0;
> array.do({|elem|
> if(elem.value.isArray, { size = size +
> countSize.value(elem.value) + 2}, {size = size + 1;});
> });
> size
> };
> //countSize.value(levels);
>
> window = Window.new(this.asString,scroll:true).front;
>
> window.view.hasHorizontalScroller_(false).background_(Color.black);
>
> bounds = Rect(0, 0, 400, tabSize * (countSize.value(levels) +
> 2));
> view = UserView.new(window, bounds);
>
> view.drawFunc = {
> var xtabs = 0, ytabs = 0, drawFunc;
>
> drawFunc = {|group|
> var thisSize, rect, endYTabs;
> xtabs = xtabs + 1;
> ytabs = ytabs + 1;
> group.do({|node|
> if(node.value.isArray, {
>
> thisSize = countSize.value(node);
> endYTabs = ytabs + thisSize + 0.2;
> rect = Rect(xtabs * tabSize,
> ytabs * tabSize,
> window.view.bounds.width - (xtabs * tabSize
> * 2),
> thisSize * tabSize;
> );
> Pen.fillColor = Color.green.alpha_(0.5);
> Pen.fillRect(rect);
> Pen.strokeRect(rect);
> (" Group" + node.key.asString + (node.key ==
> 1).if("- default group", "")).drawInRect(rect,
> Font("Helvetica", 11),
> Color.black);
> drawFunc.value(node.value);
> ytabs = endYTabs;
> //ytabs.postln;
> },{
> rect = Rect(xtabs * tabSize,
> ytabs * tabSize,
> 7 * tabSize,
> 0.8 * tabSize
> );
> //rect.postln;
> Pen.fillColor = Color.red;
> Pen.fillRect(rect);
> Pen.strokeRect(rect);
> (" " ++ node.key.asString +
> node.value.asString).drawInRect(rect, Font("Helvetica", 11), Color.black);
> ytabs = ytabs + 1;
> });
> });
> xtabs = xtabs - 1;
> };
> drawFunc.value(levels);
> };
> }.defer
> }).add.removeWhenDone;
> this.sendMsg("/g_queryTree", 0, 0);
> SystemClock.sched(3, {
> done.not.if({
> resp.remove;
> "Server failed to respond to Group:queryTree!".warn;
> });
> });
>
> }
>
> }
>
>
--
View this message in context: http://n2.nabble.com/ToolsMenu-and-Server-gui-niceties-tp2914037p3089140.html
Sent from the SuperCollider Users New (Use this!!!!) mailing list archive at Nabble.com.
_______________________________________________
sc-users mailing list
info (subscription, etc.): http://www.beast.bham.ac.uk/research/sc_mailing_lists.shtml
archive: https://listarc.bham.ac.uk/marchives/sc-users/
search: https://listarc.bham.ac.uk/lists/sc-users/search/