diff --git a/src/dsp/dsp_sidechain_gain.cxx b/src/dsp/dsp_sidechain_gain.cxx index f77b191..f9ba820 100644 --- a/src/dsp/dsp_sidechain_gain.cxx +++ b/src/dsp/dsp_sidechain_gain.cxx @@ -5,6 +5,11 @@ #include SidechainGain::SidechainGain(int rate) : + /// initial control values + controlThreshold(0.2), + controlReduction(1), + controlReleaseTime(0.5), + /// filter state init w(10.0f / (rate * 0.02)), a(0.07f), @@ -12,9 +17,9 @@ SidechainGain::SidechainGain(int rate) : g1(0.0f), g2(0.0f), + peakFrameCounter(0), peakCountDuration( rate / 4 ), - currentTarget(0) { } @@ -26,7 +31,7 @@ void SidechainGain::process(unsigned int n_samples, float** inputs, float** outp float* inR = inputs[1]; float* side = inputs[2]; float* outL = outputs[0]; - float* outR = outputs[0]; + float* outR = outputs[1]; /// control inputs float threshold = controlThreshold; diff --git a/src/jack.cxx b/src/jack.cxx index e8ecaf9..fbcf4a0 100644 --- a/src/jack.cxx +++ b/src/jack.cxx @@ -85,7 +85,10 @@ Jack::Jack() : /// setup FX reverb = new Reverb( buffers.samplerate ); - reverb->dryWet( 0.5 ); + reverb->dryWet( 1 ); + + sidechainGain = new SidechainGain( buffers.samplerate ); + reverbMeter = new DBMeter( buffers.samplerate ); masterMeter = new DBMeter( buffers.samplerate ); @@ -177,16 +180,11 @@ int Jack::process (jack_nframes_t nframes) trackOutputs.at(i)->process( nframes, &buffers ); } - - metronome->process( nframes, &buffers ); - - - // process fx + /// process reverb float* buf[] = { buffers.audio[Buffers::REVERB], buffers.audio[Buffers::REVERB] }; - //if ( reverb->getActive() ) { reverbMeter->process(nframes, buffers.audio[Buffers::REVERB], buffers.audio[Buffers::REVERB] ); @@ -194,9 +192,34 @@ int Jack::process (jack_nframes_t nframes) } + /// process sidechain gaining + float* sidechainBuf[] = { + // input + buffers.audio[Buffers::MASTER_OUT_L], + buffers.audio[Buffers::MASTER_OUT_R], + buffers.audio[Buffers::SIDECHAIN], + // output + buffers.audio[Buffers::MASTER_OUT_L], + buffers.audio[Buffers::MASTER_OUT_R] + }; + + sidechainGain->process( nframes, &sidechainBuf[0], &sidechainBuf[3] ); + + /// metro signal after sidechain-gain, so its loud on the beats + metronome->process( nframes, &buffers ); + + /// mix reverb & post-sidechain in + for(unsigned int i = 0; i < buffers.nframes; i++) + { + float rev = buffers.audio[Buffers::REVERB][i]; + float post = buffers.audio[Buffers::POST_SIDECHAIN][i]; + + buffers.audio[Buffers::MASTER_OUT_L][i] += rev + post; + buffers.audio[Buffers::MASTER_OUT_R][i] += rev + post; + } - // db meter on master output, then memcpy to JACK + /// db meter on master masterMeter->process(nframes, buffers.audio[Buffers::MASTER_OUT_L], buffers.audio[Buffers::MASTER_OUT_R] ); if ( uiUpdateCounter > uiUpdateConstant ) @@ -210,16 +233,6 @@ int Jack::process (jack_nframes_t nframes) uiUpdateCounter += nframes; - for(unsigned int i = 0; i < buffers.nframes; i++) - { - float rev = buffers.audio[Buffers::REVERB][i]; - - buffers.audio[Buffers::MASTER_OUT_L][i] += rev; - buffers.audio[Buffers::MASTER_OUT_R][i] += rev; - } - - - // memcpy the internal MASTER_OUTPUT buffer to the JACK_MASTER_OUTPUT memcpy( buffers.audio[Buffers::JACK_MASTER_OUT_L], buffers.audio[Buffers::MASTER_OUT_L], @@ -228,7 +241,7 @@ int Jack::process (jack_nframes_t nframes) memcpy( buffers.audio[Buffers::JACK_MASTER_OUT_R], buffers.audio[Buffers::MASTER_OUT_R], - //buffers.audio[Buffers::TRACK_7], + //buffers.audio[Buffers::POST_SIDECHAIN], //buffers.audio[Buffers::REVERB], // uncomment to listen to reverb send only sizeof(float)*nframes); diff --git a/src/jack.hxx b/src/jack.hxx index e33681a..4182ac9 100644 --- a/src/jack.hxx +++ b/src/jack.hxx @@ -77,6 +77,7 @@ class Jack // FX Reverb* reverb; + SidechainGain* sidechainGain; DBMeter* reverbMeter; DBMeter* masterMeter; diff --git a/src/trackoutput.cxx b/src/trackoutput.cxx index 57a8247..ea4059e 100644 --- a/src/trackoutput.cxx +++ b/src/trackoutput.cxx @@ -86,14 +86,15 @@ void TrackOutput::process(unsigned int nframes, Buffers* buffers) for(unsigned int i = 0; i < nframes; i++) { // * master for "post-fader" sends - float tmp = trackBuffer[i] * _toMaster; + float tmp = trackBuffer[i]; - masterL[i] += tmp; - masterR[i] += tmp; + // post-sidechain *moves* signal between "before/after" ducking, not add! + masterL[i] += tmp * _toMaster * (1-_toPostSidechain); + masterR[i] += tmp * _toMaster * (1-_toPostSidechain); - reverb[i] += tmp * _toReverb; - sidechain[i] += tmp * _toSidechain; - postSidechain[i] += tmp * _toPostSidechain; + reverb[i] += tmp * _toReverb * _toMaster; + sidechain[i] += tmp * _toSidechain * _toMaster; + postSidechain[i] += tmp * _toPostSidechain * _toMaster; } }