Supercollider tips, Q/A


#101

Looks great. Is this clojure based?


#102

Yeah it maps an audio bus to and argument.

I believe you set() the argument to a constant value to unmap it from the audio bus.


#103

That’s so cool, you have the physicality of a modular but the flexibility of a computer (if you don’t like one of your “modules”, just write some new code)


#104

Yep, I was really hyped on clojure when I started the project, (and now I use it in my day-job). So it uses clojurescript on the front-end, and also clojurescript on the backend (compiles to javascript, which I then run with Node)

I didn’t touch sclang apart from writing some synthdefs (although I’m working on a clojurescript synthdef compiler to handle that part now)

At first I was going to use Overtone, which is a Clojure based SuperCollider client, but when I tried running it on the Raspberry Pi it took minutes to start up, which didn’t really fit my vision of bringing a tiny box around to gigs and jam sessions. The clojurescript/node route starts up a lot faster, but it’s a bit lacking in development tools and community support.

I’ll definitely check out that James McCartney talk and thanks for linking the github issue, that clears things up a bit.


#105

I went down a supercollider 3 hole and found Nick Collins’s 12 week course. It’s very good. Supercollider is so much different and more complex than I remember. The James McCarthy talk was a good retrospective on what I remember, being one of the people who paid for SC2 back in the day.

I’ve committed to doing a full 12 week class on Nick’s curriculum. It will be held at Noisebridge starting in February. I’m rushing through the chapters as prep and it’s going well. On chapter 5 as of today.

Anyone in the bay area can attend, the fee is zero dollars. Check the Noisebridge wiki for updates and this thread. Date and time TBD.


#106

That totally works. Thanks.


#107

I’m a big user of ixi quarks, I’ve used it for years for productions and live work.

I was hoping someone could point me in the right direction to get my midi controllers talking to the instruments?

The preference file gives some instruction to find out info about what controllers are hooked up but not how to get things to talk to each other.

I’m by no means a coder, I once had some granular patch mapped to my midi keyboard way back using Supercollider 2 but that was about it.

Any help or pointers would be really appreciated!


#108

Could you elaborate on this, or point towards any resources that could?

I’ve made a class that just encapsulated a bunch of primitives, but I am having trouble imagining more complex ideas.

I’m thinking I should start examining some of the class source files to get ideas.


#109

general answer

  • look up “object oriented programming”, “separation of concerns”, “code reuse” and so on.

  • select SC class names and hit command+i

example

say i want to measure time between arbitrary events in sclang. i can make a variable and a function:

~now = nil;
~time = nil;
~tap = { 
	var thenow = SystemClock.seconds;
	if (~now.notNil, {
		~time = thenow - ~now;
		~now = thenow;
	}, { 
		~time = -1;
		~now = thenow;
	});
}

~measure_something = {
    ~tap.value;
    postln(~time);
};

this is all well and good until i want to measure more than one thing. now i have to keep an array of times, and change the function signature to take an index into that array, or something. more generally, changes i make to the context in which i’m using the timer code require me to change the timer code itself. maybe i will end up with copies of this code pasted all over with minor variants. undesirable for many reasons.

the more reusable way is to make a class; my variable and function become and field and a method:

Tapper {
	var <>now, <>time;

	*new {
		^super.new.init;
	}

	init {
		now = nil;
		time = -1;
	}

	tap {
		var thenow;
		thenow = SystemClock.seconds;
		if (now.notNil, {
			time = thenow - now;
			now = thenow;
		}, { 
			time = -1;
			now = thenow;
		});
		^time
	}
}

and it is now trivial to safely reuse this code to make many timers to measure many different events:

n = 32;
~timers = Array.fill(32, { Tapper.new });
~handle_some_event = { arg which; postln(~timers[which].tap ); };

this is a dumb example, and classes can do a lot more (polymorphism, static state, &c), but that is one basic idea.

sclang has a big enough bag of tricks that you can actually roll your own OOP system with Events or something pretty easily, but Classes are the clean and efficient way (they are compiled to bytecode on sclang boot, and potentially execute much faster than interpreted sclang code.)


#110

hey @rmro, I’ve been meaning to put up a link to Eli Fieldsteel’s wonderful supercollider tutorials anyway, but in your case I would suggest checking out lesson six on MIDI:

That whole series is wonderful, I’m only up to video seven, but there are so many little tricks and bits and pieces that are all new to me. highly recommended.


#111

Hey thanks for this much appreciated. I’ll put some time aside to go through these. For me, ixi mapped to a controller would turn it into something else. Could be my mission for 2018


#112

Yeah, Eli Fieldsteel’s youtube series are great, I learned alot from them.


#113

Another +1 for Eli’s great YouTube videos.
(Both series he has done are excellent)


#114

Does anyone know the syntax to call a method of a class from another method of the same class?

MyClass {

methodOne {
^result;
}

methodTwo {
methodOne.value();
^result;
}
}

I thought maybe it would be “this.methodOne”, but I can’t seem to get that to work. Can’t find an example like this in the documentation.


#115
Foobar{
	*new { ^super.new.init }

	init { }

	foo { postln("foo"); }

	bar { postln("bar"); this.foo; }
}
x = Foobar.new; // a Foobar
x.foo // prints "foo"
x.bar // prints "bar", "foo"

#116

Thanks for the verification on that.

“this.methodName” was what I first tried, but as seems to happen that was not really the issue I was having!


#117

I’m looking for a bit of SC advice.

I tried to install ixi Quarks as classes rather than the application which I normally use, with the idea of going through the you tube tutorials mentioned earlier in this thread. Not managed to get it to work though.

Maybe the directions in the ixi help files are out for f date, not sure. I tried creating an extensions folder and also using the quark.gui command but both were unsuccessful so any help would be much appreciated.

As mentioned earlier my plan is to try to get some midi mapping working with my controllers.


#118

i haven’t really used ixi quarks. i do notice that it hasn’t been updated since 2012.

the video above doesn’t appear to use ixi either, just the builtin SC functions like MIDIdef. these are really pretty easy to use:
(from the helpfile)

MIDIIn.connectAll
MIDIdef.cc(\test1, {arg ...args; args.postln}, 1); // match cc 1
MIDIdef.cc(\test2, {arg ...args; args.postln}, 1, 1); // match cc1, chan 1
MIDIdef.cc(\test3, {arg ...args; args.postln}, (1..10)); // match cc 1-10
MIDIdef.noteOn(\test4, {arg ...args; args.postln}); // match any noteOn

#119

Heya everyone. I got a startup tech job and I’ve been busy. The first Supercollider class was last Wednesday. It was a great success! I’ll keep the Noisebridge wiki updated with more dates and progress. Would be cool to see some llllllll community people in SF.


#120

Hey maybe this resource is useful for someone making noise with SC.

https://en.wikibooks.org/wiki/Designing_Sound_in_SuperCollider

I’m looking forward to checking it out this weekend as I have the book. I’ve enjoyed some of the theory and lifted a few techniques from the examples but am not really motivated when it comes to pd/max.