diff options
-rw-r--r-- | gnu/local.mk | 1 | ||||
-rw-r--r-- | gnu/packages/audio.scm | 33 | ||||
-rw-r--r-- | gnu/packages/patches/alsa-modular-synth-fix-vocoder.patch | 522 |
3 files changed, 3 insertions, 553 deletions
diff --git a/gnu/local.mk b/gnu/local.mk index 18a2389514..7d0458ca05 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -791,7 +791,6 @@ dist_patch_DATA = \ %D%/packages/patches/akonadi-not-relocatable.patch \ %D%/packages/patches/akonadi-timestamps.patch \ %D%/packages/patches/allegro-mesa-18.2.5-and-later.patch \ - %D%/packages/patches/alsa-modular-synth-fix-vocoder.patch \ %D%/packages/patches/amule-crypto-6.patch \ %D%/packages/patches/anki-mpv-args.patch \ %D%/packages/patches/antiword-CVE-2014-8123.patch \ diff --git a/gnu/packages/audio.scm b/gnu/packages/audio.scm index 7a5dfe0223..4acc345c3e 100644 --- a/gnu/packages/audio.scm +++ b/gnu/packages/audio.scm @@ -476,41 +476,15 @@ implementation of Adaptive Multi Rate Narrowband and Wideband (define-public alsa-modular-synth (package (name "alsa-modular-synth") - (version "2.1.2") + (version "2.2.0") (source (origin (method url-fetch) (uri (string-append "mirror://sourceforge/alsamodular/alsamodular" "/" version "/ams-" version ".tar.bz2")) (sha256 (base32 - "1azbrhpfk4nnybr7kgmc7w6al6xnzppg853vas8gmkh185kk11l0")) - (patches - (search-patches "alsa-modular-synth-fix-vocoder.patch")))) + "056dn6b9c5nsw2jdww7z1kxrjqqfvxjzxhsd5x9gi4wkwyiv21nz")))) (build-system gnu-build-system) - (arguments - `(#:configure-flags - '("--enable-qt5" - "CXXFLAGS=-std=gnu++11") - #:phases - (modify-phases %standard-phases - (add-after 'set-paths 'hide-default-gcc - (lambda* (#:key inputs #:allow-other-keys) - (let ((gcc (assoc-ref inputs "gcc"))) - ;; Remove the default GCC from CPLUS_INCLUDE_PATH to prevent - ;; conflicts with the GCC 5 input. - (setenv "CPLUS_INCLUDE_PATH" - (string-join - (delete (string-append gcc "/include/c++") - (string-split (getenv "CPLUS_INCLUDE_PATH") #\:)) - ":")) - #t))) - ;; Insert an extra space between linker flags. - (add-before 'configure 'add-missing-space - (lambda _ - (substitute* "configure" - (("LIBS\\+=\\$LIBSsave") "LIBS+=\" $LIBSsave\"") - (("CFLAGS\\+=\\$CFLAGSsave") "CFLAGS+=\" $CFLAGSsave\"")) - #t))))) (inputs `(("alsa-lib" ,alsa-lib) ;; We cannot use zita-alsa-pcmi (the successor of clalsadrv) due to @@ -523,8 +497,7 @@ implementation of Adaptive Multi Rate Narrowband and Wideband ("qtbase" ,qtbase))) (native-inputs `(("pkg-config" ,pkg-config) - ("qttools" ,qttools) - ("gcc@5" ,gcc-5))) + ("qttools" ,qttools))) (home-page "http://alsamodular.sourceforge.net/") (synopsis "Realtime modular synthesizer and effect processor") (description diff --git a/gnu/packages/patches/alsa-modular-synth-fix-vocoder.patch b/gnu/packages/patches/alsa-modular-synth-fix-vocoder.patch deleted file mode 100644 index 33a68a1dd8..0000000000 --- a/gnu/packages/patches/alsa-modular-synth-fix-vocoder.patch +++ /dev/null @@ -1,522 +0,0 @@ -This patch was taken from Debian. -https://salsa.debian.org/multimedia-team/ams/-/raw/master/debian/patches/0007-Make-vocoder-module-compatible-to-C-11.patch - -From: Guido Scholz <gscholz@users.sourceforge.net> -Date: Tue, 6 Nov 2018 21:55:38 +0100 -Subject: Make vocoder module compatible to C++11 - ---- - src/m_vocoder.cpp | 218 +++++++++++++++++++++++++++--------------------------- - src/m_vocoder.h | 31 ++++---- - 2 files changed, 124 insertions(+), 125 deletions(-) - -diff --git a/src/m_vocoder.cpp b/src/m_vocoder.cpp -index 572cf65..371e2cf 100644 ---- a/src/m_vocoder.cpp -+++ b/src/m_vocoder.cpp -@@ -18,10 +18,6 @@ - along with ams. If not, see <http://www.gnu.org/licenses/>. - */ - --#include <stdio.h> --#include <stdlib.h> --#include <unistd.h> --#include <math.h> - #include <qwidget.h> - #include <qstring.h> - #include <qslider.h> -@@ -36,16 +32,13 @@ - #include "synthdata.h" - #include "midicheckbox.h" - #include "midislider.h" --// For FFTW to be happy we must include complex.h before fftw3.h --#include <complex.h> --#include <fftw3.h> - #include "port.h" - #include "m_vocoder.h" - - // Window function - One way to make the FFT behave - // and give more continuous results over edge steps. - --float M_vocoder::windowcurve (int windowfunc, int len, int elem, float alpha) -+float M_vocoder::windowcurve (int windowfunc, unsigned int len, int elem, float alpha) - { - float out; - out = 1.0; -@@ -98,6 +91,7 @@ float M_vocoder::windowcurve (int windowfunc, int len, int elem, float alpha) - return (out); - } - -+ - M_vocoder::M_vocoder(QWidget* parent, int id) - : Module(M_type_vocoder, id, 5, parent, tr("FFT Vocoder")) - { -@@ -160,6 +154,7 @@ M_vocoder::M_vocoder(QWidget* parent, int id) - modbuf[l1] = (float *)malloc( fftsize * sizeof(float)); - memset( modbuf[l1], 0, fftsize * sizeof(float)); - } -+ - carrbuf = (float **)malloc(synthdata->poly * sizeof(float *)); - for (l1 = 0; l1 < synthdata->poly; l1++) { - carrbuf[l1] = (float *)malloc( fftsize * sizeof(float)); -@@ -175,38 +170,48 @@ M_vocoder::M_vocoder(QWidget* parent, int id) - window[l2] = windowcurve (whichwin, fftsize, l2, 0.25); - - // FFTW setup stuff -- carrinforward = (fftw_complex *) fftw_malloc (sizeof (fftw_complex) -- * fftsize); -- carrinbackward = (fftw_complex *) fftw_malloc (sizeof (fftw_complex) -- * fftsize); -- carroutforward = (fftw_complex *) fftw_malloc (sizeof (fftw_complex) -- * fftsize); -- carroutbackward = (fftw_complex *) fftw_malloc (sizeof (fftw_complex) -- * fftsize); -- modinforward = (fftw_complex *) fftw_malloc (sizeof (fftw_complex) -- * fftsize); -- modinbackward = (fftw_complex *) fftw_malloc (sizeof (fftw_complex) -- * fftsize); -- modoutforward = (fftw_complex *) fftw_malloc (sizeof (fftw_complex) -- * fftsize); -- modoutbackward = (fftw_complex *) fftw_malloc (sizeof (fftw_complex) -- * fftsize); -- fftw_set_timelimit (5.0); -- planmodforward = fftw_plan_dft_1d (fftsize, modinforward, -- modoutforward, FFTW_FORWARD, FFTW_MEASURE); -- planmodbackward = fftw_plan_dft_1d (fftsize, modinbackward, -- modoutbackward, FFTW_BACKWARD, FFTW_MEASURE); -- plancarrforward = fftw_plan_dft_1d (fftsize, carrinforward, -- carroutforward, FFTW_FORWARD, FFTW_MEASURE); -- plancarrbackward = fftw_plan_dft_1d (fftsize, carrinbackward, -- carroutbackward, FFTW_BACKWARD, FFTW_MEASURE); -+ carrinforward.reserve(fftsize); -+ carrinbackward.reserve(fftsize); -+ carroutforward.reserve(fftsize); -+ carroutbackward.reserve(fftsize); -+ modinforward.reserve(fftsize); -+ modinbackward.reserve(fftsize); -+ modoutforward.reserve(fftsize); -+ modoutbackward.reserve(fftsize); -+ -+ fftw_set_timelimit(5.0); -+ -+ planmodforward = fftw_plan_dft_1d(fftsize, -+ reinterpret_cast<fftw_complex*> (modinforward.data()), -+ reinterpret_cast<fftw_complex*> (modoutforward.data()), -+ FFTW_FORWARD, FFTW_MEASURE); -+ -+ planmodbackward = fftw_plan_dft_1d(fftsize, -+ reinterpret_cast<fftw_complex*> (modinbackward.data()), -+ reinterpret_cast<fftw_complex*> (modoutbackward.data()), -+ FFTW_BACKWARD, FFTW_MEASURE); -+ -+ plancarrforward = fftw_plan_dft_1d(fftsize, -+ reinterpret_cast<fftw_complex*> (carrinforward.data()), -+ reinterpret_cast<fftw_complex*> (carroutforward.data()), -+ FFTW_FORWARD, FFTW_MEASURE); -+ -+ plancarrbackward = fftw_plan_dft_1d(fftsize, -+ reinterpret_cast<fftw_complex*> (carrinbackward.data()), -+ reinterpret_cast<fftw_complex*> (carroutbackward.data()), -+ FFTW_BACKWARD, FFTW_MEASURE); - } - -+ - M_vocoder::~M_vocoder() { - -- int l1; -+ // Clean up FFTW stuff. -+ fftw_destroy_plan (plancarrforward); -+ fftw_destroy_plan (plancarrbackward); -+ fftw_destroy_plan (planmodforward); -+ fftw_destroy_plan (planmodbackward); - -- for (l1 = 0; l1 < synthdata->poly; l1++) { -+ for (int l1 = 0; l1 < synthdata->poly; l1++) { - free(modbuf[l1]); - free(carrbuf[l1]); - } -@@ -215,29 +220,14 @@ M_vocoder::~M_vocoder() { - free (window); - free (modmap); - free (armodmap); -- -- //#define FFTW_CLEANUP --#ifdef FFTW_CLEANUP -- // Clean up FFTW stuff. -- fftw_destroy_plan (plancarrforward); -- fftw_destroy_plan (plancarrbackward); -- fftw_destroy_plan (planmodforward); -- fftw_destroy_plan (planmodbackward); -- fftw_free (carrinforward); -- fftw_free (carrinbackward); -- fftw_free (carroutforward); -- fftw_free (carroutbackward); -- fftw_free (modinforward); -- fftw_free (modinbackward); -- fftw_free (modoutforward); -- fftw_free (modoutbackward); --#endif - } - -+ - void M_vocoder::generateCycle() { - - int l1; // l1 indexes along polyphony. - unsigned int l2; // l2 indexes along the cycle -+ const std::complex<double> I(0.0, 1.0); - - inModulator = port_M_modulator->getinputdata(); - inPitchShift = port_M_pitchshift->getinputdata(); -@@ -272,7 +262,7 @@ void M_vocoder::generateCycle() { - // Did the user change the FFT windowing function? - if (myFFTWindowFunc != whichwin) { - whichwin = myFFTWindowFunc; -- for (l2 = 0; l2 < (unsigned int) fftsize; l2++) -+ for (l2 = 0; l2 < fftsize; l2++) - window[l2] = windowcurve (whichwin, fftsize, l2, 0.25); - } - -@@ -294,7 +284,7 @@ void M_vocoder::generateCycle() { - } - - // window the input buffer to modinforward -- for (l2 = 0; l2 < (unsigned int)fftsize ; l2++) { -+ for (l2 = 0; l2 < fftsize ; l2++) { - modinforward[l2] = modbuf[l1][l2] * window[l2]; - } - -@@ -310,17 +300,18 @@ void M_vocoder::generateCycle() { - fftw_execute (planmodforward); - - // copy the FFT of the modulator to modinbackward. -- for (l2 = 0; l2 < (unsigned int)fftsize; l2++) -- modinbackward[l2] = modoutforward[l2]; -+ //for (l2 = 0; l2 < fftsize; l2++) -+ // modinbackward[l2] = modoutforward[l2]; -+ modinbackward = modoutforward; - - // Send the FFT of the modulator to the output for giggles - // and get an approximation of the first harmonic too. - float firstharmonicval; - int firstharmonicindex; - firstharmonicval = 0.0; -- firstharmonicindex = 1.0; -+ firstharmonicindex = 1; - for (l2 = 1; l2 < (unsigned int) synthdata->cyclesize; l2++) { -- data[2][l1][l2] = logf(fabs (creal (modoutforward[l2])) + 1.0); -+ data[2][l1][l2] = logf(fabs(modoutforward[l2].real()) + 1.0); - if (data[2][l1][l2] > firstharmonicval) { - firstharmonicindex = l2; - firstharmonicval = data[2][l1][l2] ; -@@ -333,35 +324,38 @@ void M_vocoder::generateCycle() { - - // intermediate frequency-domain munging of modulator - // Frequency (additive, Bode-style) shifting first -- for (l2 = 0; l2 < (unsigned int)fftsize; l2++) -- modinbackward[l2] = 0; -+ for (l2 = 0; l2 < fftsize; l2++) -+ modinbackward[l2] = 0.0; -+ - int lclfrq; -- for (l2 = 0; l2 < (unsigned int)fftsize/2; l2++) { -+ for (l2 = 0; l2 < fftsize/2; l2++) { - // positive frequencies (first half) of the FFT result - lclfrq = l2 + (int)freqshift + vcfreqshift * inFreqShift[l1][0]; - lclfrq = lclfrq > 0 ? lclfrq : 0; -- lclfrq = lclfrq < ((fftsize/2)-1) ? lclfrq : (fftsize/2)-1; -+ lclfrq = lclfrq < (int)((fftsize/2)-1) ? lclfrq : (fftsize/2)-1; - modinbackward [lclfrq] = modoutforward [l2]; - // Negative frequencies (second half of the fft result) -- modinbackward [fftsize - lclfrq] = modoutforward [ fftsize - l2]; -+ modinbackward [fftsize - lclfrq] = modoutforward [fftsize - l2]; - } - -- // Pitchshifting (multiplicative, harmonic-retaining) shifting. -- // Note that we reuse the modoutforward as working space -- for (l2 = 0; l2 < (unsigned int) fftsize; l2++) { -- modoutforward[l2] = modinbackward[l2]; -- }; -- for (l2 = 0; l2 < (unsigned int)fftsize; l2++) -- modinbackward[l2] = 0; -+ // Pitchshifting (multiplicative, harmonic-retaining) shifting. -+ // Note that we reuse the modoutforward as working space -+ //for (l2 = 0; l2 < fftsize; l2++) { -+ // modoutforward[l2] = modinbackward[l2]; -+ //}; -+ modoutforward = modinbackward; -+ -+ for (l2 = 0; l2 < fftsize; l2++) -+ modinbackward[l2] = 0.0; - - float psmod, psfactor; - psmod = (pitchshift + vcpitch * inPitchShift[l1][0]); - psfactor = pow (2.0, psmod); -- for (l2 = 0; l2 < (unsigned int)fftsize/2; l2++) { -+ for (l2 = 0; l2 < fftsize/2; l2++) { - // positive frequencies (first half) of the FFT result - lclfrq = l2 * psfactor; - lclfrq = lclfrq > 0 ? lclfrq : 0; -- lclfrq = lclfrq < ((fftsize/2)-1) ? lclfrq : (fftsize/2)-1; -+ lclfrq = lclfrq < (int)((fftsize/2)-1) ? lclfrq : (fftsize/2)-1; - // Old way to pitch shift: just move the bucket. But this puts - // nulls wherever the energy is split between two buckets with - // a 180 degree phase difference. -@@ -375,12 +369,12 @@ void M_vocoder::generateCycle() { - // Better way: move freq. bin, multiply angle by octave motion. - // - modinbackward[lclfrq] += -- cabs (modoutforward [l2]) -- * cexp (I * ( carg (modoutforward [l2]) -+ std::abs(modoutforward[l2]) -+ * std::exp (I * ( std::arg (modoutforward [l2]) - + (l2 * phaseshift * psfactor))); - modinbackward[fftsize - lclfrq] += -- cabs (modoutforward [ fftsize - l2]) -- * cexp (I * ( carg (modoutforward [ fftsize - l2]) -+ std::abs (modoutforward [ fftsize - l2]) -+ * std::exp (I * ( std::arg (modoutforward [ fftsize - l2]) - + (l2 * phaseshift * psfactor))); - }; - } -@@ -389,9 +383,9 @@ void M_vocoder::generateCycle() { - fftw_execute (planmodbackward); - - // renormalize the time-domain modulator output -- for (l2 = 0; l2 < (unsigned)fftsize; l2++) { -- modoutbackward [l2] = modoutbackward[l2] / float (fftsize) ; -- modoutbackward [l2] = modoutbackward[l2] / window[l2]; -+ for (l2 = 0; l2 < fftsize; l2++) { -+ modoutbackward [l2] = modoutbackward[l2] / (double) fftsize; -+ modoutbackward [l2] = modoutbackward[l2] / (double) window[l2]; - } - - unsigned int i; -@@ -400,13 +394,11 @@ void M_vocoder::generateCycle() { - - - // Splicing the new output to the results -- if (dynsplice == 0.0) -- { -+ if (dynsplice == 0.0) { - // output it as the altered modulator. - for (l2 = 0; l2 < synthdata->cyclesize; l2++) { -- data[0][l1][l2] = creal ( modoutbackward [l2 + -- fftsize/2 - -- synthdata->cyclesize/2 ]); -+ data[0][l1][l2] = -+ modoutbackward[l2 + fftsize/2 - synthdata->cyclesize/2].real(); - } - clomatch_index = fftsize - synthdata->cyclesize; - } -@@ -421,18 +413,21 @@ void M_vocoder::generateCycle() { - float tval, dtval; - int searchstart; - float spliceval, dspliceval; -- searchstart = fftsize/2 - synthdata->cyclesize; -- if (searchstart < 1) searchstart = 1; -- clomatch_index = searchstart; -+ -+ searchstart = fftsize/2 - synthdata->cyclesize; -+ if (searchstart < 1) -+ searchstart = 1; -+ -+ clomatch_index = searchstart; - spliceval = data[0][l1][synthdata->cyclesize - 1]; - dspliceval = spliceval - data[0][l1][synthdata->cyclesize - 2]; -- clov_sofar= fabs(creal(modoutbackward[clomatch_index])-spliceval ); -+ clov_sofar= fabs(modoutbackward[clomatch_index].real()-spliceval); - for (l2 = searchstart; - l2 < (searchstart + synthdata->cyclesize); - l2++) - { -- tval = creal (modoutbackward[l2]); -- dtval = tval - creal (modoutbackward [l2-1]); -+ tval = modoutbackward[l2].real(); -+ dtval = tval - modoutbackward [l2-1].real(); - if ( - ((fabs (tval - spliceval )) < clov_sofar ) - && ((dtval * dspliceval ) >= 0) -@@ -445,15 +440,15 @@ void M_vocoder::generateCycle() { - }; - // fprintf (stderr, "%d %f %f ", - // clomatch_index, clov_sofar, clodv_sofar); -- -+ - // What's our residual error, so that we can splice this - // with minimal "click"? -- residual = + spliceval - creal( modoutbackward[clomatch_index]); -+ residual = + spliceval - modoutbackward[clomatch_index].real(); - - // Move our wave, with the best match so far established, to - // the output buffer area. - for (l2 = 0; l2 < synthdata->cyclesize; l2++) { -- data[0][l1][l2] = creal ( modoutbackward [ clomatch_index + l2]) -+ data[0][l1][l2] = modoutbackward[clomatch_index + l2].real() - + ((1.0 - (float(l2) / float(synthdata->cyclesize))) * residual); - }; - -@@ -466,17 +461,18 @@ void M_vocoder::generateCycle() { - for (l2 = 0; l2 < fftsize - synthdata->cyclesize; l2++) { - carrbuf [l1][l2] = carrbuf [l1][l2 + synthdata->cyclesize]; - } -+ - for (l2 = 0; l2 < synthdata->cyclesize; l2++) { - carrbuf [l1][l2 + fftsize - synthdata->cyclesize] = inCarrier[l1][l2]; - } - -- for (l2 = 0; l2 < unsigned (fftsize); l2++) { -+ for (l2 = 0; l2 < fftsize; l2++) { - carrinforward [l2] = carrbuf [l1][l2] * window[l2]; - } - - fftw_execute (plancarrforward); - -- for (l2 = 0; l2 < (unsigned) fftsize; l2++) { -+ for (l2 = 0; l2 < fftsize; l2++) { - carrinbackward[l2] = carroutforward[l2]; - }; - -@@ -486,34 +482,37 @@ void M_vocoder::generateCycle() { - // Group the modulator into channels, and multipy the channels - // over the carrier. - -- int localchannels; -- localchannels = channels + vcchannels * inChannels[l1][0]; -- if (localchannels < 1) localchannels = 1; -- if (localchannels > fftsize - 1) localchannels = fftsize - 1; -- for (l2 = 0; l2 < (unsigned) fftsize; l2++) { -+ unsigned int localchannels = channels + vcchannels * inChannels[l1][0]; -+ if (localchannels < 1) -+ localchannels = 1; -+ -+ if (localchannels > fftsize - 1) -+ localchannels = fftsize - 1; -+ -+ for (l2 = 0; l2 < fftsize; l2++) { - modmap[l2] = 0; - // initial conditions... - if (l2 == 0) - for (i = 0; i < channels; i++) -- modmap[l2] += cabs (modoutforward[l2 + i]); -+ modmap[l2] += std::abs(modoutforward[l2 + i]); - else - modmap [l2] = modmap[l2 - 1]; - - // add the heads, subtract the tails - i = l2 + channels; -- if (l2 < (unsigned)fftsize - 2) -- modmap[l2] += cabs( modoutforward [i] ); -+ if (l2 < fftsize - 2) -+ modmap[l2] += std::abs(modoutforward[i]); - i = l2 - channels; - if (l2 >= channels) -- modmap[l2] -= cabs( modoutforward [i] ); -+ modmap[l2] -= std::abs(modoutforward[i]); - } - - // Normalize the modmap -- for (l2 = 0; l2 < (unsigned) fftsize; l2++) -+ for (l2 = 0; l2 < fftsize; l2++) - modmap[l2] = modmap[l2] / localchannels; - - // Do attack/release -- for (l2 = 0; l2 < (unsigned) fftsize; l2++) { -+ for (l2 = 0; l2 < fftsize; l2++) { - if (modmap [l2] > armodmap[l2]) - armodmap [l2] += (1 - attack) * (modmap[l2] - armodmap[l2]); - if (modmap [l2] < armodmap[l2]) -@@ -521,8 +520,8 @@ void M_vocoder::generateCycle() { - } - - // multiply the carrier by the modulation map. -- for (l2 = 0; l2 < (unsigned) fftsize; l2++) { -- carrinbackward[l2] = carroutforward[l2] * armodmap[l2]; -+ for (l2 = 0; l2 < fftsize; l2++) { -+ carrinbackward[l2] = carroutforward[l2] * (double) armodmap[l2]; - } - - // reverse transform to final output, and renormalize by 1/fftsize. -@@ -532,8 +531,7 @@ void M_vocoder::generateCycle() { - for (l2 = 0; l2 < synthdata->cyclesize; l2++) { - offset = l2 + (fftsize/2) - (synthdata->cyclesize / 2); - data[1][l1][l2]= -- (creal(carroutbackward[offset]/window[offset])) / (fftsize * 100); -+ (carroutbackward[offset].real()/window[offset]) / (fftsize * 100); - }; - }; - } -- -diff --git a/src/m_vocoder.h b/src/m_vocoder.h -index 38eac58..32c8521 100644 ---- a/src/m_vocoder.h -+++ b/src/m_vocoder.h -@@ -1,4 +1,4 @@ --/* -+/* - Vocoder - derived from m_delay.cpp - - Copyright (C) 2011 Bill Yerazunis <yerazunis@yahoo.com> -@@ -22,7 +22,9 @@ - #define M_VOCODER_H - - #include "module.h" --#include <complex.h> -+ -+#include <vector> -+#include <ccomplex> - #include <fftw3.h> - - #define MODULE_VOCODER_WIDTH 105 -@@ -30,7 +32,7 @@ - - class M_vocoder : public Module - { -- Q_OBJECT -+ Q_OBJECT - - float channels, vcchannels; - float attack, release; -@@ -42,21 +44,20 @@ class M_vocoder : public Module - - Port *port_M_modulator, *port_M_pitchshift, *port_M_freqshift, - *port_M_channels, *port_M_carrier; -+ - Port *port_modfft_out, *port_firstharmonic_out, -- *port_altmodulator_out, -- *port_vocoder_out; -+ *port_altmodulator_out, *port_vocoder_out; - -- fftw_plan planmodforward, planmodbackward, -+ fftw_plan planmodforward, planmodbackward, - plancarrforward, plancarrbackward; - -- fftw_complex *carrinforward, *carroutforward, -- *carrinbackward, *carroutbackward, -- *modinforward, *modoutforward, -- *modinbackward, *modoutbackward; -+ std::vector<std::complex<double>> carrinforward, carroutforward, -+ carrinbackward, carroutbackward, -+ modinforward, modoutforward, -+ modinbackward, modoutbackward; - -- public: -- int fftsize; -- float **inModulator, **inPitchShift, **inFreqShift, -+ unsigned int fftsize; -+ float **inModulator, **inPitchShift, **inFreqShift, - **inChannels, **inCarrier; - // the previous time-based samples, for overlapping - float **modbuf, **carrbuf; -@@ -68,10 +69,10 @@ class M_vocoder : public Module - float *armodmap; - - public: -- float windowcurve (int windowfunc, int len, int elem, float alpha ); -+ float windowcurve (int windowfunc, unsigned int len, int elem, float alpha ); - M_vocoder(QWidget* parent=0, int id = 0); - ~M_vocoder(); - void generateCycle(); - }; -- -+ - #endif |