[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [sc-users] ToolsMenu and Server gui niceties



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/
> 
> 

-- 
View this message in context: http://n2.nabble.com/ToolsMenu-and-Server-gui-niceties-tp2914037p3063607.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/