NOTAM Meetups: Fall 2023

Greetings fellow SuperColliderers!

I have the pleasure of hosting Notam’s monthly SuperCollider meetups for this coming season! The meetings will take place online approximately once a month on Zoom at 7pm CET (Oslo Time):

SuperCollider meetup:
Meeting ID: 974 3258 0111
Link: Launch Meeting - Zoom

At these meetups, SuperCollider users of all skill levels get together to share ideas, frustrations, help each other and show off projects and workflows in an inspiring and friendly way.

If you have accessibility related requests or questions about the meetup, please send me a message here and I’ll do what I can to address them!

All community events at Notam fall under the NOTAM Code of Conduct to make them as inclusive as possible. Please follow the link and read the full Code of Conduct before joining an event: Notam Code of Conduct - Notam

I’ll return here every once in a while to advertise forthcoming meetups, to follow up on any discussions, etc. so be sure to follow this thread via the :bell: on the right!

The meetup dates for the fall will be:

2023-09-20T17:00:00Z
2023-10-17T17:00:00Z
2023-11-13T18:00:00Z
2023-12-11T18:00:00Z

Happy SuperCollisions in the meantime!

10 Likes

I’m very pleased to be able to host @nathan at our meetup next week - here’s what he plans to share:

“In this talk, I will discuss my album Haywire Frontier, released on September 9th on the record label tokinogake. There are lots of strands to the album, but in particular I’ll talk about a personal approach to composing rhythmic material that coalesced during the project. This approach was borne out of an interest in rhythms that are neither completely grid-based nor completely random, and that are also very easy to write in sclang.”


Nathan Ho (he/him) is an SF Bay Area-based electronic musician, educator, and specialist in digital signal processing. He draws from his mathematical and scientific background, using a vocabulary of custom synthesis and algorithmic sequencing techniques to make aggressive, maximalist music spanning academia to rave. He is a former SuperCollider developer, and now maintains a YouTube channel (SynthDef) and blog which host educational materials on sound design, synthesis, and DSP.

8 Likes

Looking forward to see you all in a few hours! :nerd_face:

1 Like

Here is the code I used for the audio examples. Sorry about the mixed tabs and spaces.

(
SynthDef(\kick, {
	var snd, duration, velocity;
	duration = \duration.kr(1.0);
	velocity = duration.linlin(1, 0, 1, 0);
	snd = SinOsc.ar(
		60
		* (1 + (8 * Env.perc(0, 0.001).ar * velocity))
		* (1 + (8 * Env.perc(0, 0.03).ar * velocity))
		* (1 + (0.5 * Env.perc(0, 0.3).ar * velocity))
		* ([1, -1] * 0.1).midiratio
	);
	snd = snd * (1 + (Env.perc(0, 0.03).ar * velocity));
	snd = snd + (BPF.ar(Hasher.ar(Sweep.ar), 8321, 0.3) * Env.perc(0.001, 0.003).ar * 1.dbamp * velocity);
	snd = snd.tanh;
	snd = snd + (BPF.ar(Hasher.ar(Sweep.ar), 3321, 0.3) * Env.perc(0.03, 0.05).ar * -10.dbamp * velocity);
	snd = snd * velocity.sqrt;
	snd = snd + GVerb.ar(snd.sum * -30.dbamp, 30, 1);
	snd = snd * Env.perc(0.001, duration.min(0.6)).ar(Done.freeSelf);
	snd = snd * -3.dbamp;
	Out.ar(\out.kr(0), snd);
}).add;

SynthDef(\snare, {
	var snd;
	snd = SinOsc.ar(
		260
		* (1 + (3 * Env.perc(0.001, 0.04, curve: -6).ar))
		* [1, 4.3, 8.4]
	);
	snd = snd * [0, -8, -12].dbamp;
	snd = snd * Env.perc(0.001, [0.3, 0.1, 0.03]).ar;
	snd = snd.sum;
	snd = snd + (BPF.ar(WhiteNoise.ar, 2310, 0.25) * Env.perc(0.03, 0.3).ar * 12.dbamp);
	snd = snd + (BPF.ar(WhiteNoise.ar, 7310, 0.3) * Env.perc(0.003, 0.04).ar * 8.dbamp);
	snd = snd.tanh;
	snd = snd + PitchShift.ar(snd, 0.06, 2.4);
	snd = snd + PitchShift.ar(snd * -5.dbamp, 0.08, 1.3);
	snd = snd * Env.linen(0.001, 0.23, 0.01).ar(Done.freeSelf);
	snd = snd * -7.dbamp;
	snd = snd ! 2;
	Out.ar(\out.kr(0), snd);
}).add;
)

// Pwhite-into-dur rhythm: BORING
(
Routine({
    20.do {
        s.bind { Synth(\kick) };
        rrand(0.03, 0.6).wait;
    };
}).play;
)

// Accelerating rhythm
(
Routine({
    3.do {
        (0.75 ** (0..10)).do { |duration|
            s.bind { Synth(\kick) };
            duration.wait;
        };
    };
}).play;
)

// Recursion, level 1
(
Routine({
    ((0.8 ** (0..8)).normalizeSum * 15.0).do { |phraseDuration|
        ((0.75 ** (0..10)).normalizeSum * phraseDuration).do { |duration|
            s.bind { Synth(\kick) };
            duration.wait;
        };
    };
}).play;
)

// Velocity variation
(
Routine({
    ((0.8 ** (0..8)).normalizeSum * 15.0).do { |phraseDuration|
        ((0.75 ** (0..10)).normalizeSum * phraseDuration).do { |duration|
			s.bind { Synth(\kick, [duration: duration]) };
            duration.wait;
        };
    };
}).play;
)

// Interruption with snare
(
Routine({
    ((0.8 ** (0..8)).normalizeSum * 15.0).do { |phraseDuration|
        ((0.75 ** (0..10)).normalizeSum * phraseDuration).do { |duration|
            s.bind { Synth(\kick, [duration: duration]) };
            duration.wait;
        };
        if(0.5.coin) {
            s.bind { Synth(\snare) };
            0.28.wait;
        };
    };
}).play;
)

// Three levels of acceleration
(
Routine({
	((0.8 ** (0..8)).normalizeSum * 50.0).do { |sectionDuration|
		((0.8 ** (0..8)).normalizeSum * sectionDuration).do { |phraseDuration|
			((0.75 ** (0..10)).normalizeSum * phraseDuration).do { |duration|
				s.bind { Synth(\kick, [duration: duration]) };
				duration.wait;
			};
			if(0.5.coin) {
				s.bind { Synth(\snare) };
				0.28.wait;
			};
		};
	};
}).play;
)

// Hierarchy of mixed acceleration/deceleration
(
Routine({
	((0.8 ** (0..8)).normalizeSum * 50.0).do { |sectionDuration|
		((0.8 ** (0..8)).normalizeSum.reverse * sectionDuration).do { |phraseDuration|
			((0.75 ** (0..10)).normalizeSum * phraseDuration).do { |duration|
				s.bind { Synth(\kick, [duration: duration]) };
				duration.wait;
			};
		};
	};
}).play;
)

// Sorted random rhythm
(
Routine({
    (({ exprand(0.01, 0.5) } ! 20).sort.normalizeSum * 3.5).do { |duration|
		s.bind { Synth(\kick, [duration: duration]) };
        duration.wait;
    };
}).play;
)

// Self-similar rhythms, a la John Cage
(
Routine({
    var row;
    row = [0.2, 1, 1.4, 0.8, 1].normalizeSum;
    (row * 20.0).do { |sectionDuration|
        (row * sectionDuration).do { |phraseDuration|
            (row * phraseDuration).do { |duration|
                s.bind { Synth(\kick, [duration: duration]) };
                duration.wait;
            };
        };
    };
}).play;
)

// Sinusoidal rhythm
(
Routine({
    30.do { |i|
		var duration;
		duration = cos(i * 2pi / 20).linlin(-1, 1, 0.05, 0.2);
        s.bind { Synth(\kick, [duration: duration]) };
        duration.wait;
    };
}).play;
)

// Gridless discrete rhythms
(
Routine({
    30.do { |i|
		var duration;
		duration = [0.02, 0.1, 0.432].choose;
        s.bind { Synth(\kick, [duration: duration]) };
		duration.wait;
    };
}).play;
)
9 Likes

For anyone who missed the talk, I’ve expanded it into a blog post.

3 Likes