From 06808ba5ab05eea3e2559e648903ddf5bf4d5137 Mon Sep 17 00:00:00 2001 From: "Raine M. Ekman" Date: Sun, 22 Nov 2015 22:49:48 +0200 Subject: [PATCH 1/2] Organic: first stab at fixing #1499 through moving oscillator phase offsets into each note, in _n->m_pluginData. --- plugins/organic/organic.cpp | 23 +++++++++++++---------- plugins/organic/organic.h | 2 ++ 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/plugins/organic/organic.cpp b/plugins/organic/organic.cpp index 95e229613..d8bd87536 100644 --- a/plugins/organic/organic.cpp +++ b/plugins/organic/organic.cpp @@ -234,16 +234,14 @@ void organicInstrument::playNote( NotePlayHandle * _n, { Oscillator * oscs_l[m_numOscillators]; Oscillator * oscs_r[m_numOscillators]; + float * phaseOffsetLeft = new float[m_numOscillators]; + float * phaseOffsetRight = new float[m_numOscillators]; for( int i = m_numOscillators - 1; i >= 0; --i ) { - m_osc[i]->m_phaseOffsetLeft = rand() - / ( RAND_MAX + 1.0f ); - m_osc[i]->m_phaseOffsetRight = rand() - / ( RAND_MAX + 1.0f ); - - + phaseOffsetLeft[i] = rand() / ( RAND_MAX + 1.0f ); + phaseOffsetRight[i] = rand() / ( RAND_MAX + 1.0f ); // initialise ocillators @@ -255,7 +253,7 @@ void organicInstrument::playNote( NotePlayHandle * _n, &m_modulationAlgo, _n->frequency(), m_osc[i]->m_detuningLeft, - m_osc[i]->m_phaseOffsetLeft, + phaseOffsetLeft[i], m_osc[i]->m_volumeLeft ); // create right oscillator oscs_r[i] = new Oscillator( @@ -263,7 +261,7 @@ void organicInstrument::playNote( NotePlayHandle * _n, &m_modulationAlgo, _n->frequency(), m_osc[i]->m_detuningRight, - m_osc[i]->m_phaseOffsetRight, + phaseOffsetRight[i], m_osc[i]->m_volumeRight ); } else @@ -274,7 +272,7 @@ void organicInstrument::playNote( NotePlayHandle * _n, &m_modulationAlgo, _n->frequency(), m_osc[i]->m_detuningLeft, - m_osc[i]->m_phaseOffsetLeft, + phaseOffsetLeft[i], m_osc[i]->m_volumeLeft, oscs_l[i + 1] ); // create right oscillator @@ -283,7 +281,7 @@ void organicInstrument::playNote( NotePlayHandle * _n, &m_modulationAlgo, _n->frequency(), m_osc[i]->m_detuningRight, - m_osc[i]->m_phaseOffsetRight, + phaseOffsetRight[i], m_osc[i]->m_volumeRight, oscs_r[i + 1] ); } @@ -294,6 +292,8 @@ void organicInstrument::playNote( NotePlayHandle * _n, _n->m_pluginData = new oscPtr; static_cast( _n->m_pluginData )->oscLeft = oscs_l[0]; static_cast( _n->m_pluginData )->oscRight = oscs_r[0]; + static_cast( _n->m_pluginData )->phaseOffsetLeft = phaseOffsetLeft; + static_cast( _n->m_pluginData )->phaseOffsetRight = phaseOffsetRight; } Oscillator * osc_l = static_cast( _n->m_pluginData )->oscLeft; @@ -330,6 +330,9 @@ void organicInstrument::deleteNotePluginData( NotePlayHandle * _n ) _n->m_pluginData )->oscLeft ); delete static_cast( static_cast( _n->m_pluginData )->oscRight ); + delete[] static_cast( _n->m_pluginData )->phaseOffsetLeft; + delete[] static_cast( _n->m_pluginData )->phaseOffsetRight; + delete static_cast( _n->m_pluginData ); } diff --git a/plugins/organic/organic.h b/plugins/organic/organic.h index a5ef5451e..7aea5b061 100644 --- a/plugins/organic/organic.h +++ b/plugins/organic/organic.h @@ -153,6 +153,8 @@ private: MM_OPERATORS Oscillator * oscLeft; Oscillator * oscRight; + float * phaseOffsetLeft; + float * phaseOffsetRight; } ; const IntModel m_modulationAlgo; From ca0c278655a23d422166158e4c55845e6fbd6f22 Mon Sep 17 00:00:00 2001 From: "Raine M. Ekman" Date: Fri, 11 Mar 2016 11:45:16 +0200 Subject: [PATCH 2/2] Organic: move the oscillator phase offsets in the oscPtr that's stored as _n->m_pluginData, slightly prettier than separate float arrays. --- plugins/organic/organic.cpp | 28 ++++++++++++---------------- plugins/organic/organic.h | 5 +++-- 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/plugins/organic/organic.cpp b/plugins/organic/organic.cpp index 1e814961d..16db225e4 100644 --- a/plugins/organic/organic.cpp +++ b/plugins/organic/organic.cpp @@ -81,7 +81,7 @@ organicInstrument::organicInstrument( InstrumentTrack * _instrument_track ) : m_fx1Model( 0.0f, 0.0f, 0.99f, 0.01f , this, tr( "Distortion" ) ), m_volModel( 100.0f, 0.0f, 200.0f, 1.0f, this, tr( "Volume" ) ) { - m_numOscillators = 8; + m_numOscillators = NUM_OSCILLATORS; m_osc = new OscillatorObject*[ m_numOscillators ]; for (int i=0; i < m_numOscillators; i++) @@ -234,14 +234,15 @@ void organicInstrument::playNote( NotePlayHandle * _n, { Oscillator * oscs_l[m_numOscillators]; Oscillator * oscs_r[m_numOscillators]; - float * phaseOffsetLeft = new float[m_numOscillators]; - float * phaseOffsetRight = new float[m_numOscillators]; + + _n->m_pluginData = new oscPtr; for( int i = m_numOscillators - 1; i >= 0; --i ) { - - phaseOffsetLeft[i] = rand() / ( RAND_MAX + 1.0f ); - phaseOffsetRight[i] = rand() / ( RAND_MAX + 1.0f ); + static_cast( _n->m_pluginData )->phaseOffsetLeft[i] + = rand() / ( RAND_MAX + 1.0f ); + static_cast( _n->m_pluginData )->phaseOffsetRight[i] + = rand() / ( RAND_MAX + 1.0f ); // initialise ocillators @@ -253,7 +254,7 @@ void organicInstrument::playNote( NotePlayHandle * _n, &m_modulationAlgo, _n->frequency(), m_osc[i]->m_detuningLeft, - phaseOffsetLeft[i], + static_cast( _n->m_pluginData )->phaseOffsetLeft[i], m_osc[i]->m_volumeLeft ); // create right oscillator oscs_r[i] = new Oscillator( @@ -261,7 +262,7 @@ void organicInstrument::playNote( NotePlayHandle * _n, &m_modulationAlgo, _n->frequency(), m_osc[i]->m_detuningRight, - phaseOffsetRight[i], + static_cast( _n->m_pluginData )->phaseOffsetRight[i], m_osc[i]->m_volumeRight ); } else @@ -272,7 +273,7 @@ void organicInstrument::playNote( NotePlayHandle * _n, &m_modulationAlgo, _n->frequency(), m_osc[i]->m_detuningLeft, - phaseOffsetLeft[i], + static_cast( _n->m_pluginData )->phaseOffsetLeft[i], m_osc[i]->m_volumeLeft, oscs_l[i + 1] ); // create right oscillator @@ -281,7 +282,7 @@ void organicInstrument::playNote( NotePlayHandle * _n, &m_modulationAlgo, _n->frequency(), m_osc[i]->m_detuningRight, - phaseOffsetRight[i], + static_cast( _n->m_pluginData )->phaseOffsetRight[i], m_osc[i]->m_volumeRight, oscs_r[i + 1] ); } @@ -289,11 +290,8 @@ void organicInstrument::playNote( NotePlayHandle * _n, } - _n->m_pluginData = new oscPtr; static_cast( _n->m_pluginData )->oscLeft = oscs_l[0]; static_cast( _n->m_pluginData )->oscRight = oscs_r[0]; - static_cast( _n->m_pluginData )->phaseOffsetLeft = phaseOffsetLeft; - static_cast( _n->m_pluginData )->phaseOffsetRight = phaseOffsetRight; } Oscillator * osc_l = static_cast( _n->m_pluginData )->oscLeft; @@ -330,9 +328,7 @@ void organicInstrument::deleteNotePluginData( NotePlayHandle * _n ) _n->m_pluginData )->oscLeft ); delete static_cast( static_cast( _n->m_pluginData )->oscRight ); - delete[] static_cast( _n->m_pluginData )->phaseOffsetLeft; - delete[] static_cast( _n->m_pluginData )->phaseOffsetRight; - + delete static_cast( _n->m_pluginData ); } diff --git a/plugins/organic/organic.h b/plugins/organic/organic.h index 7aea5b061..6b368f01d 100644 --- a/plugins/organic/organic.h +++ b/plugins/organic/organic.h @@ -39,6 +39,7 @@ class Knob; class NotePlayHandle; class PixmapButton; +const int NUM_OSCILLATORS = 8; const int NUM_HARMONICS = 18; const QString HARMONIC_NAMES[NUM_HARMONICS] = { "Octave below", @@ -153,8 +154,8 @@ private: MM_OPERATORS Oscillator * oscLeft; Oscillator * oscRight; - float * phaseOffsetLeft; - float * phaseOffsetRight; + float phaseOffsetLeft[NUM_OSCILLATORS]; + float phaseOffsetRight[NUM_OSCILLATORS]; } ; const IntModel m_modulationAlgo;