59 lines
1.3 KiB
Racket
59 lines
1.3 KiB
Racket
#lang scribble/manual
|
|
@(require (for-label racket))
|
|
|
|
@title{FFTTrigger}
|
|
Outputs the necessary signal for FFT chains, without doing an FFT on a signal@section{categories}
|
|
UGens>FFT
|
|
|
|
@section{classmethods}
|
|
|
|
@section{private}
|
|
categories
|
|
|
|
@section{method}
|
|
new
|
|
@section{argument}
|
|
buffer
|
|
a buffer to condition for FFT use
|
|
@section{argument}
|
|
hop
|
|
the hop size for timing triggers (defaults to 0.5)
|
|
@section{argument}
|
|
polar
|
|
a flag. If 0.0, the buffer will be prepared for complex data, if > 0.0, polar data is set up.
|
|
|
|
@section{examples}
|
|
|
|
|
|
@racketblock[
|
|
(
|
|
s.waitForBoot({
|
|
b = Buffer.alloc(s, 512);
|
|
});
|
|
)
|
|
// Reminder: This isn't the intended typical usage! It's OK to do this though.
|
|
(
|
|
x = {
|
|
var mags, phases, chain, sig;
|
|
// Create simple undulating magnitudes
|
|
mags = {FSinOsc.kr(ExpRand(0.1, 1)).range(0, 1)}.dup(100);
|
|
// Then give them a "rolloff" to make the sound less unpleasant
|
|
mags = mags * ((1, 0.99 .. 0.01).squared);
|
|
// Let's turn the bins on and off at different rates, I'm *sure* that'll sound interesting
|
|
mags = mags * {LFPulse.kr(2 ** IRand(-3, 5)).range(0, 1)}.dup(100);
|
|
// Let's ignore phase for now
|
|
phases = 0.dup(100);
|
|
chain = FFTTrigger(b, 0.5);
|
|
// Now we can do the packing
|
|
chain = PackFFT(chain, 512, [mags, phases].flop.flatten, 0, 99, 1);
|
|
sig = IFFT(chain);
|
|
Out.ar(0, sig.dup);
|
|
}.play(s);
|
|
)
|
|
x.free;
|
|
b.free;
|
|
::
|
|
|
|
]
|
|
|
|
|