// remap magnitudes to a new mag curve
// a curve of Env([0, 1], [1]) will output the input
// a curve of Env([1, 0], [1]) will output the inverse magnitudes (loud partials are quiet, quiet
// partials are loud... and so on. The Env times don't have to equal 1 (they are scaled internally
// to 1 no matter what)
{PinkNoise.ar(0.03) + SinOsc.ar(440, 0, 0.5)}.play(s)
SynthDef(\magmap, {arg fftbuf, envbuf;
var in, chain, out;
in = PinkNoise.ar(0.03) + SinOsc.ar(440, 0, 0.5);
chain = FFT(fftbuf, in);
chain = PV_MagMap(chain, envbuf);
out = IFFT(chain);
Out.ar(1, out);
}).load(s);
s.boot;
// the fft buf
s.sendMsg(\b_alloc, 0, 2048);
// the curve to map the sound onto
a = Env([0, 1, 0], [0.05, 0.95], \welch).plot;
// send the signal to a buffer
s.sendBundle(0.1, [\b_alloc, 1, 256, 1, [\b_setn, 1, 0, 256] ++ a.asSignal(256)])
// start the synth
s.sendMsg(\s_new, \magmap, z = s.nextNodeID, 0, 1, \fftbuf, 0, \envbuf, 1);
// free it
s.sendMsg(\n_free, z);
a = Env([1, 0], [1]).plot;
// send the signal to a buffer
s.sendBundle(0.1, [\b_alloc, 1, 256, 1, [\b_setn, 1, 0, 256] ++ a.asSignal(256)])
s.sendMsg(\s_new, \magmap, z = s.nextNodeID, 0, 1, \fftbuf, 0, \envbuf, 1);
// free it
s.sendMsg(\n_free, z);
SynthDef(\magmap, {arg fftbuf, envbuf, sndbuf;
var in, chain, out;
in = PlayBuf.ar(1, sndbuf, BufRateScale.kr(sndbuf), loop: 1);
chain = FFT(fftbuf, in);
chain = PV_MagMap(chain, envbuf);
out = IFFT(chain);
Out.ar(1, out);
}).load(s);
s.boot;
// the fft buf
s.sendMsg(\b_alloc, 0, 2048);
// the curve to map the sound onto
a = Env([0, 1], [1], \lin); // get original back
//a = Env([1, 0], [1], \lin); // noise partials are loudest
//a = Env([0.1, 1, 0.1], [0.5, 0.5], \exp); // shape the sound!
//a = Env([0.1, 1, 0.1], [0.8, 0.2], [\exp, \sin]);
// send the signal to a buffer
s.sendBundle(0.1, [\b_alloc, 1, 256, 1, [\b_setn, 1, 0, 256] ++ a.asSignal(256)],
[\b_allocRead, 2, "/Users/joshp/SND/vln-g4.aiff"])
// start the synth
s.sendMsg(\s_new, \magmap, z = s.nextNodeID, 0, 1, \fftbuf, 0, \envbuf, 1, \sndbuf, 2);
s.sendMsg(\n_free, z);
s.quit