Mercurial > hg > devuvuzelator
changeset 8:e15ebd222c63
* (Messy) fixes to VST (e.g. for in-place buffers)
author | Chris Cannam |
---|---|
date | Fri, 11 Jun 2010 20:20:20 +0100 |
parents | 5adad2ca3188 |
children | a1539d4e3b08 |
files | devuvuzelator-vst.cpp devuvuzelator.cpp |
diffstat | 2 files changed, 81 insertions(+), 20 deletions(-) [+] |
line wrap: on
line diff
--- a/devuvuzelator-vst.cpp Fri Jun 11 16:38:16 2010 +0100 +++ b/devuvuzelator-vst.cpp Fri Jun 11 20:20:20 2010 +0100 @@ -5,14 +5,13 @@ #include <iostream> #include <cmath> #include <cstdio> -#include <malloc.h> #include "public.sdk/source/vst2.x/audioeffect.h" #define snprintf _snprintf #define alloca _alloca -#define FFTSIZE 4096 +#define FFTSIZE 1024 #define WINSIZE 1024 #include "median.h" @@ -83,6 +82,8 @@ int m_read; float *m_buffer; float *m_outacc; + double *m_frame; + double *m_spare; double *m_real; double *m_imag; double *m_window; @@ -169,6 +170,8 @@ m_buffer = new float[m_winsize]; m_outacc = new float[m_winsize * 2]; m_window = new double[m_winsize]; + m_frame = new double[m_fftsize]; + m_spare = new double[m_fftsize]; m_real = new double[m_fftsize]; m_imag = new double[m_fftsize]; m_medians = new MedianFilter<double> *[m_fftsize/2+1]; @@ -198,6 +201,8 @@ { delete[] m_buffer; delete[] m_outacc; + delete[] m_frame; + delete[] m_spare; delete[] m_real; delete[] m_imag; delete[] m_window; @@ -228,17 +233,52 @@ { if (!m_input || !m_output) return; - int ii = 0; - int oi = 0; const int sc = sampleCount; +/* + static FILE *blah = 0; + if (!blah) { + blah = fopen("d:\\devuvu-counts.txt", "w"); + } - while (ii < sc) { + if (m_input == m_output) fprintf(blah, "in-place\n"); +*/ + float *output = m_output; + if (m_input == m_output) { + output = (float *)alloca(sampleCount * sizeof(float)); + } +/* + float inmean = 0; + for (int i = 0; i < sc; ++i) { + inmean += m_input[i] * m_input[i]; + fprintf(blah, "i:%d:%f ", i, m_input[i]); + } + inmean/=sc; + inmean = sqrt(inmean); - m_output[oi++] = m_outacc[m_read++]; + fprintf(blah, "%d\n", (int)sampleCount); + fflush(blah); +*/ + int oi = 0; + for (int ii = 0; ii < sc; ++ii) { + output[oi++] = m_outacc[m_read++]; +// m_output[oi++] = inmean * float(ii%100)/100; +// m_read++; if (m_fill == m_winsize) { processFrame(); +/* + for (int i = 0; i < m_winsize; ++i) { + float v = m_buffer[i]; + fprintf(blah, "%f ", v); + m_outacc[m_winsize + i] = m_buffer[i];//m_input[i];//m_buffer[i] ;//* m_window[i]; + } + fprintf(blah, "\n"); + +// for (int j = 0; j < m_winsize; ++j) { +// m_outacc[m_winsize+j] = inmean * float(j%100)/100; +// } +*/ for (int j = m_increment; j < m_winsize; ++j) { m_buffer[j - m_increment] = m_buffer[j]; @@ -252,45 +292,63 @@ m_outacc[j] = 0.f; } - m_fill -= m_increment; - m_read -= m_increment; + m_fill = m_fill - m_increment; + m_read = m_read - m_increment; } +/* + fprintf(blah, "%d:%f ", ii, m_input[ii]); +*/ + m_buffer[m_fill] = m_input[ii]; + ++m_fill; + } - m_buffer[m_fill++] = m_input[ii++]; - } + static int block = 0; + for (int i = 0; i < sc; ++i) { +// m_output[i] = float(block % 100) / 100; +// m_output[i] = inmean * float(i % 100) / 100; + } + ++block; + + if (m_input == m_output) { + for (int i = 0; i < sc; ++i) m_output[i] = output[i]; + } } void Devuvuzelator::processFrame() { - double *frame = (double *)alloca(m_fftsize * sizeof(double)); +/* for (int i = 0; i < m_winsize; ++i) { + m_outacc[m_winsize + i] += m_buffer[i] ;//* m_window[i]; + } + return; +*/ + for (int i = 0; i < m_fftsize; ++i) { - frame[i] = 0.0; + m_frame[i] = 0.0; } int ix = m_fftsize - m_winsize/2; while (ix < 0) ix += m_fftsize; for (int i = 0; i < m_winsize; ++i) { - frame[ix++] += m_buffer[i] * m_window[i]; + m_frame[ix++] += m_buffer[i] * m_window[i]; if (ix == m_fftsize) ix = 0; } - fft(m_fftsize, false, frame, 0, m_real, m_imag); + fft(m_fftsize, false, m_frame, 0, m_real, m_imag); - processSpectralFrame(); +// processSpectralFrame(); for (int i = 0; i < m_fftsize/2-1; ++i) { m_real[m_fftsize-i-1] = m_real[i+1]; m_imag[m_fftsize-i-1] = -m_imag[i+1]; } - double *spare = (double *)alloca(m_fftsize * sizeof(double)); - fft(m_fftsize, true, m_real, m_imag, frame, spare); + fft(m_fftsize, true, m_real, m_imag, m_frame, m_spare); ix = m_fftsize - m_winsize/2; while (ix < 0) ix += m_fftsize; for (int i = 0; i < m_winsize; ++i) { - m_outacc[m_winsize + i] += frame[ix++]; + m_outacc[m_winsize + i] += m_frame[ix++]; if (ix == m_fftsize) ix = 0; } }
--- a/devuvuzelator.cpp Fri Jun 11 16:38:16 2010 +0100 +++ b/devuvuzelator.cpp Fri Jun 11 20:20:20 2010 +0100 @@ -23,7 +23,7 @@ int highbin = 0.5 + (m_fftsize * highfreq) / m_sampleRate; for (int i = lowbin; i <= highbin; ++i) { - +/* if (!m_medians[i]) { const float filtersecs = 5.f; int filterlen = (filtersecs * m_sampleRate) / m_increment; @@ -32,7 +32,10 @@ m_medians[i]->push(mags[i]); double threshold = m_medians[i]->getAt(m_reduction); - if (mags[i] > threshold && mags[i] > 0.0) { + + */ + double threshold = 0.0; + if (mags[i] > threshold && mags[i] > 0.0) { double target = mags[i] - threshold; ratios[i] = (target / mags[i]); } else {