2022-01-22

#jamuary jam number 11. I finally got around to learning how to hook up a MIDI controller (in this case a Korg nanoKONTROL2) to SuperCollider.

The MIDI hookup code looks like

(
MIDIClient.init;
MIDIIn.connectAll;

~sliders = Array.fill(8, 0);
~knobs = Array.fill(8, 0);

~sliderBus = Bus.control(numChannels: 8);
~knobBus = Bus.control(numChannels: 8);

8.do({ |i|
	MIDIdef.cc("slider" ++ i, {|v, nn, chan, src|
		~sliders[nn] = v;
		~sliderBus.setn(~sliders);
	}, i)
});

8.do({ |i|
	MIDIdef.cc("knob" ++ i, {|v, nn, chan, src|
		~knobs[nn-16] = v;
		~knobBus.setn(~knobs);
	}, i + 16)
});

The values for the knobs and sliders on the controller are put into an array (so that I can use them in interpreter-side code, for example pattern definitions) and into control busses (so they can be read by SynthDefs).

For this jam, I used my triangle synth, again, 5 copies of it this time with the filter cutoff and amplitude mapped to a knob and slider respectively.

5.do({ |i|
SynthDef(\tri++i, { |out, freq = 440, gate=1, control|
	var snd, env;
	env = EnvGen.ar(Env.asr(3, 0.9, 3), gate: gate, doneAction: 2);

	snd = Mix.new([
		LFTri.ar(freq),
		LFTri.ar(freq*1.005),
		PinkNoise.ar(0.2)
		]);
	snd = LPF.ar(snd, ~knobBus.kr(1,i).linexp(0, 127, 50, 15000));
	snd = snd * env;

	Out.ar(out, Pan2.ar(snd * ~sliderBus.kr(1, i).linlin(0, 127, 0, 1)));
}).add();

The pattern stuff was just some notes from a extended major chord looping out of phase

(
Pdef(\c0, Pbind(
  \instrument, \tri0,
  \dur, Pseq([8, 4], inf),
  \scale, Scale.major,
  \degree, Pseq([1, 5], inf),
  \legato, 0.7,
  \ctranspose, -12,
));

Pdef(\c1, Pbind(
  \instrument, \tri1,
  \dur, Pseq([5, 3], inf),
  \scale, Scale.major,
  \degree, 3,
  \legato, 0.7,
));

Pdef(\c2, Pbind(
  \instrument, \tri2,
  \dur, Pseq([7, 5], inf),
  \scale, Scale.major,
  \degree, 7,
  \legato, 0.7,
));

Pdef(\c3, Pbind(
  \instrument, \tri3,
  \dur, Pseq([2, 7], inf),
  \scale, Scale.major,
  \degree, 11,
  \legato, 0.7,
  \ctranspose, -12,
));

Pdef(\c4, Pbind(
  \instrument, \tri4,
  \dur, Pseq([3, 5], inf),
  \scale, Scale.major,
  \degree, 5,
  \legato, 0.7,
  \ctranspose, 12,
));
)

I set all of the loops going with

(
Pdef(\c0).play;
Pdef(\c1).play;
Pdef(\c2).play;
Pdef(\c3).play;
Pdef(\c4).play;
)

and then recorded a few minutes gradually bringing up the levels and filter cutoffs to create some movement.

I recorded everything to a stereo file (and forgot to do anything interesting with the panning of the individual synths), and then applied some ValhallaVintageVerb reverb (Med Ambience) in Reaper.

Not the most interesting jam, but it’s opened up some possibilities and made SC feel more like an instrument.