Mapping controller input

Hi,
When you setup controller input like described here:

How do you map the controller input to a reasonable value in Tidal?

Let's say you want to change #speed from -2 to 2 and get cc numbers from 0 - 127.

Hi @specht,
the easiest way to achieve such a behaviour would be to do the math on the SuperCollider side like:

(
var cc, mapping;
var osc;

~stopMidiToOsc.value;

osc = NetAddr.new("127.0.0.1", 6010);

MIDIClient.init;
MIDIIn.connectAll;

cc = MIDIFunc.cc({ |val, num, chan, src|
	((val/(127/4)) - 2).postln;
	osc.sendMsg("/ctrl", num.asString, ((val/(127/4)) - 2));
});

~stopMidiToOsc = {
	cc.free;
};
)

You are totally free to specify a control name (by changing the num.asString with a name like "myspeed") which you can use in TidalCycles. In the case of

osc.sendMsg("/ctrl", "myspeed", ((val/(127/4)) - 2));

you can use it in TidalCycles like:

d1 $ sound "bd" # speed (cF 1 "myspeed")
3 Likes

Thanks. Ok, in supercollider you can use linlin and linexp for mapping

val.linlin(0, 127, -2, 2);

Exploring this a bit further, but to me it seems more easy to do it on the Tidal side actually.

d1 $ sound "bd" # speed (range (-2) 2 $ cF 1 "12")

This way you don't have to re-evaluate in supercollider, because you need to define a new MIDIFunc.cc with a new mapping there.

Also on Linux, when you evaluate

MIDIClient.init;

twice, you get a doubled number of Supercollider MIDI in and output ports. This seems to work better:

MIDIClient.init(numIns,numOuts);
MIDIClient.init(7, 9);
4 Likes