Till Bovermann (2016)
re-synthesise!
Till Bovermann (2016)
A performance based on Chip Interpretations/BetaBlocker and WaveSet resynthesis. Premiered 2016 at Spektrum Berlin, and performed at Azkuna Zentroa, Bilbao.
// this uses RTWaveSet and MeTA
// http://3dmin-code.org/instrument-sketching/MeTA
// http://3dmin-code.org/instrument-sketching/RTWaveSets // closed source for now
// the data resource
// goes into 3_helperNdefs/wsData.scd
m.helpers[\wsData] = RTWaveSetData(server: m.server);
// waveset recorder
// goes into 3_efx/aux/wsAux.scd
Ndef(\ws).addSpec(\active, ControlSpec(0, 1, 'linear', 1, 0));
Ndef(\ws).addSpec(\leak, ControlSpec(0.9, 1, 'exp', 0, 0));
m.aux[\ws] = Ndef(\ws, {
var in = \in.ar(0!m.config.numChans).sum;
in = LeakDC.ar(in, \leak.kr(0.995));
RTWaveSetAnalysis.ar(m.helpers[\wsData], in, \active.kr(1))//.poll
});
// goes into 3_generators/wsResynth.scd
Ndef(\ws); // return value
(
Ndef(\wsResynth).ar(2);
// specs
// useful ranges for controls
Ndef(\wsResynth).addSpec(\trig, [0.5, 100, \exp]);
Ndef(\wsResynth).addSpec(\rateIdx, [0, 5, \lin, 1]);
Ndef(\wsResynth).addSpec(\gSize, [1, 40, \lin, 1]);
Ndef(\wsResynth).addSpec(\repeat, [1, 10, \lin, 1]);
Ndef(\wsResynth).addSpec(\lpFreq, [100, 20000, \exp]);
Ndef(\wsResynth).addSpec(\amp, [0, 1]); // amplitude
Ndef(\wsResynth).addSpec(\on, [0, 1, \lin, 1]); // on/off
Ndef(\wsResynth, {
var snd;
var pan;
// slow automated panning
pan = LPF.kr(BrownNoise.kr, 1);
snd = RTWaveSetPlayerTriggered.ar(
// data input
m.helpers[\wsData],
// regular trigger,
// rate changed each time rChange is called from the language
// 5 * (0.125, 0.25 .. 2) // << possible rates
// slowly adapting from previous level within 5 seconds
Impulse.ar(
\trig.kr(5)
* TRand.kr(0.125, 2, \rChange.tr(0))
.round(0.125).lag(5)
),
// just the last index
RTWaveSetSelector.ar(m.helpers[\wsData]),
// playback rate fixed to a bunch of values
// [0.125, 0.25, 0.5, 0.75, 1, 2] that are slightly off
Select.kr(\rateIdx.kr(4), [0.125, 0.25, 0.5, 0.75, 1, 2])
* LFNoise0.kr(0.2).range(0.95, 1.05),
// group size between 1..40
\gSize.kr(1),
// repeat between 1..10
\repeat.kr(1));
// oh yeah, this is my personal phase-panning
snd = m.utils[\phasePan].value(snd, pan);
// turn-on-the-sound-mechanism
(snd * \amp.kr(1)).tanh * \on.kr(0, 0.2);
}).play;
);
////////////// MAPPING ///////////////////////
// on/off
Ndef(\wsResynth).addHalo(\offFunc, {
Ndef(\wsResynth).set(\on, 0);
});
Ndef(\wsResynth).addHalo(\onFunc, {
Ndef(\wsResynth).set(\on, 1);
});
// knobs used to set rate, groupSize and repeat
Ndef(\wsResynth).addHalo(\sndA, {|value|
Ndef(\wsResynth).setUni(\rateIdx, value)
});
Ndef(\wsResynth).addHalo(\sndB, {|value|
Ndef(\wsResynth).setUni(\gSize, value)
});
Ndef(\wsResynth).addHalo(\pan, {|value|
Ndef(\wsResynth).setUni(\repeat, value)
});
// button triggers new arbitrary rate
Ndef(\wsResynth).addHalo(\fcs, {|value|
Ndef(\wsResynth).set(\rChange, 1.postln)
});
Also available at sc-code.org.