46 for (
unsigned i = 0; i <
mNumBufs; i++) {
68 logMsg(
kLogInfo,
"Convolver allocating %u buffers of %d", newNumBufs, fftlen);
80 for (
unsigned i = 0; i < newNumBufs; i++) {
96 unsigned frames = inFile->
duration();
104 data = inFile->
buffer(chan);
106 unsigned newNumBufs = (frames / fftlen) + 1;
108 float norm = 1.0f / (float) fftlen;
111 for (
unsigned i = 0; i <
mNumBufs; i++) {
113 unsigned offs = i * fftlen;
114 for (
unsigned j = 0; j < fftlen; j++) {
115 unsigned k = j + offs;
116 if (k >= frames) *sPtr++ = 0.0;
117 else *sPtr++ = data[k] * norm;
130 unsigned numFrames = outputBuffer.mNumFrames;
131 unsigned numBufs = mNumBufs;
132 unsigned windowCount = mWindowCount;
133 unsigned fftlen = mFFTSize;
134 unsigned wInp = windowCount % numBufs;
135 unsigned rbufsize = numFrames *
sizeof(
sample);
136 unsigned cbufsize = fftlen *
sizeof(
sample);
137 sample norm = 1.0f / (float) fftlen;
139 if (numFrames != fftlen / 2) {
141 "Convolver::nextBuffer # frames %d wrong for FFT size %d (use a block resizer).",
142 numFrames, mFFTSize);
147 bzero(mInputFFTRe[wInp], cbufsize);
148 bzero(mInputFFTIm[wInp], cbufsize);
149 memcpy(mInputFFTRe[wInp], inp, rbufsize);
154 bool succ =
Fft_transform(mInputFFTRe[wInp], mInputFFTIm[wInp], fftlen);
158 bzero(mSpectrumBufferRe, cbufsize);
159 bzero(mSpectrumBufferIm, cbufsize);
160 for (
unsigned i = 0; i < numBufs; i++) {
161 wInp = (numBufs + windowCount - i) % numBufs;
166 complex_multiply_accumulate(
167 mFilterFFTRe[i], mFilterFFTIm[i],
168 mInputFFTRe[wInp], mInputFFTIm[wInp],
169 mSpectrumBufferRe, mSpectrumBufferIm);
188 float step = 1.0 / numFrames;
190 for (
unsigned i = 0; i < numFrames; i++) {
191 *outP++ = *re++ * norm;
198 memcpy(mLastOutput, mSpectrumBufferRe + numFrames, rbufsize);
220 sample re = (lRe * rRe) - (lIm * rIm);
221 sample im = (lRe * rIm) + (lIm * rRe);
sample * SampleBuffer
1-channel buffer data type, vector of (sample)
void logMsg(const char *format,...)
These are the public logging messages.
void pullInput(Buffer &outputBuffer)
Convolver(unsigned len=512)
Constructors.
void checkBuffers(unsigned newNumBufs)
alloc buffers
AdditiveInstrument.h – Sum-of-sines synthesis instrument class.
Effect – mix-in for classes that have unit generators as inputs (like filters).
float Sample
the same, written upper-case
bool Fft_inverseTransform(CFTTYPE real[], CFTTYPE imag[], size_t n)
unsigned duration() const
number of frames in the sound file
SampleBuffer mSpectrumBufferIm
~Convolver()
set the IR file name; runs the analysis ffts
virtual unsigned numChannels()
SampleBufferArray mFilterFFTIm
float sample
(could be changed to int, or double)
The Convolver is a CSL Effect.
SampleBufferArray mInputFFTRe
A list of past input spectra.
bool Fft_transform(CFTTYPE real[], CFTTYPE imag[], size_t n)
virtual SampleBuffer buffer(unsigned bufNum)
SampleBuffer mSpectrumBufferRe
current summation buffer
void nextBuffer(Buffer &outputBuffer)
main nextBuffer call does the fft/ifft
Buffer – the multi-channel sample buffer class (passed around between generators and IO guys)...
SampleBufferArray mFilterFFTRe
A ring buffer of IR fft buffers.
SampleBuffer mLastOutput
most-recent output
Enumeration for log message severity level.
SampleBufferArray mInputFFTIm
static JSoundFile * openSndfile(string path, int start=-1, int stop=-1, bool doRead=true)
Factory methods.
#define SAFE_MALLOC(ptr, type, len)
Useful Macros.
void complex_multiply_accumulate(SampleBuffer leftRe, SampleBuffer leftIm, SampleBuffer rightRe, SampleBuffer rightIm, SampleBuffer outRe, SampleBuffer outIm)
fast complex MAC using non-interleaved complex arrays
Base class of CSL exceptions (written upper-case). Has a string message.
void setIRFile(char *inFName, unsigned chan=0)