Jump to content
Sign in to follow this  
Adieu

Max/MSP

Recommended Posts

This sequencing thing is getting boring! any tips/books/tuts for algorithmic music? 

Share this post


Link to post
Share on other sites

ooooh

Share this post


Link to post
Share on other sites

Anybody use both Max and SuperCollider?

I use the latter almost exclusively these days. The text-based workflow and the freedom to run it on damn near any platform are great, but I often miss VSTs and occasionally the suggestion of tangents inherit in the visual patching interface. Plus there are lots of nice features in Max 8 that make it pleasant to use.

I'm just way more comfortable and efficient with old-fashioned textual code than virtual patch cables and boxes.

Share this post


Link to post
Share on other sites

Yes, in fact in Max 6 I found a hack to import modules AMD-style (which is now the norm in Max 7+) and I wrote some modules based on the Novation LaunchPad for Max. I got pretty sidetracked though - I think the last thing I did was implementing a "paint" program for the LP where you could choose from 8 pixel colors and draw 8x8 icons. Silly, but fun.

As far as I know, though, JS in Max is limited to control rate. gen~ is audio rate but it's pretty low-level, basically C. Which all makes for an environment that's good for prototyping, but a little awkward to work in longer-term because things are kind of uneven, disjointed, and strewn about. Or maybe that was down to my own lack of organization.

SC is really nice because I can use the same syntax for both audio and control, and the level of abstraction of the UGens is at a real sweet spot, similar to a text version of Nord Modular. Also there's really nice syntactical sugar for arrays and the like, which makes it easy to build things like additive synths.

Plus, while both have very good documentation (mostly excellent, actually, but both have a handful of sparse/confusing spots) I find SC's more discoverable: highlight UGen or method, press Ctrl+D, click the one you want, and boom, you're zeroed into the relevant paragraph and ready to get down to business. With Max it felt like I had to pore over the documentation for each object, read it carefully and internalize it like a koan, which is charming but less practical. I think that's down to the nature of visual programming - you're working with inlets and outlets instead of functions and methods. The latter, just by virtue of having names, are much easier to describe and remember.

Share this post


Link to post
Share on other sites
1 hour ago, Nil said:

 @sweepstakes on a somehow related note, have you seen https://forum.toplap.org/t/gibber-2-0-roadmap/203 ?

Ah, somehow I've been ignoring Gibber although I see it mentioned on Toplap/Lurk all the time. This looks really cool, although it seems like the latency would be bad running in the browser? The inclusion of the Tidal mini-language is excellent, though.

Share this post


Link to post
Share on other sites

It seems to be a tad more verbose than Tidal but has nice potential. I'll stick with TC as I'm getting really comfortable with it and enjoy it tremendously. They plan Atom integration for Gibber 2, so maybe it'll reduce / prevent latency issues ?

Would love to hear your SC bits anyway !

  • Like 1

Share this post


Link to post
Share on other sites

Cool 🙂 Here's my latest semi-interesting thing. It's actually a modified example from the documents, but I can't remember which page now. Probably Select because everything else looks pretty standard? Anyway, it implements a faux phaser w/ additive synthesis. X position of mouse crossfades frequency values from harmonic series to collapsing into a single frequency. Y position is phaser depth.

Spoiler
(
a = { | freq = 400 |
	var coll = (1..32);
	var x = Lag.kr(MouseX.kr(0, 1), 2);
	var ix = 1 - x;
	var freak = freq * ((coll * ix) + (x * 2)) / 2;

	var y = Lag.kr(MouseY.kr(1, 9), 2);
	var iy = 5 - y;

	var harmies = Phasor.kr(0, SinOsc.kr(0.09, 0, 0.1, 0.1), 1, 32);
	var coeff = 1/512;
	var amp = coll.collect({|a|
		Select.kr((a - harmies).abs <= y, [
			coeff,
			(((a - harmies).abs/y))*coeff
		])
	});
	Mix.ar(SinOsc.ar(freak, 0, amp)) ! 2;
}.play;
s.freqscope;
)

 

When I was taking a break from Tidal, I made a bunch of self-contained stuff like this (kind of like a poor man's "redfall"):

Spoiler
(
SynthDef(\pendulum, { | note1=48, note2=51, trem=0.5, out=0 |
	var env = Line.kr(1, 0, 8, doneAction: Done.freeSelf);
	var lfo = LFTri.kr(trem, 0, 0.5, 0.5);
	var pan = IRand(0, 1) * 0.2 - 0.1;
	var oscs = SinOscFB.ar([note1 - Rand(0, 0.1), note2 + Rand(0, 0.1)].midicps, 1.1, [lfo ** 1.3, (1 - lfo) ** 1.3]);
	Out.ar(out, (( Pan2.ar(oscs[0], pan) + Pan2.ar(oscs[1], 0-pan)) ** 5.1 * env / 2));
}).add;
)

(
SynthDef(\sadbazz, { |note=55, out = 0 |
	var env = Line.kr(1, 0, 4, doneAction: Done.freeSelf);
	var env2 = Line.kr(1, 0, 0.25, -1);
	var osc = SinOscFB.ar([note + Rand(-0.02, 0.02), note + Rand(-0.02, 0.02)].midicps, (env + env2) ** 2.5 * 1.5, env ** 2 / 3);
	Out.ar(out, [osc[0], osc[1]]);
}).add;
)

(
var note1s = [48, 46];
var note2s = [51, 51, 55, 52];
var durs = [5, 5, 2.5, 5, 3.75];
var bassnotes = [36, 34, 37, 36, 34, 35, 32];
var trems = [0.5, 1, 1.25, 1.5, 0.25, 0.75];

p = Pbind(
	\instrument, \pendulum,
	\note1, Pseq(note1s, inf),
	\note2, Pseq(note2s, inf),
	\dur, Pseq(durs, inf),
	\trem, Prand(trems, inf),
	\out, 0
).play;

p = Pbind(
	\instrument, \sadbazz,
	\note, Pseq(bassnotes, inf),
	\dur, Prand(durs, inf),
	\out, 0
).play;
)

 

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...