Classes (extension) | Libraries > JoshUGens | UGens > FFT

PV_MagMap : PV_ChainUGen : WidthFirstUGen : UGen : AbstractFunction : Object
ExtensionExtension

Remap magnitudes to a new mag curve
Source: JoshPV.sc

Description

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).

Class Methods

PV_MagMap.new(buffer, mapbuf)

Arguments:

buffer

An FFT buffer.

mapbuf

A signal buffer.

Inherited class methods

Instance Methods

Inherited instance methods

Examples

s.boot;

{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);
 }).add;



// 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);
 }).add;

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