diff --git a/src/buffers.hxx b/src/buffers.hxx index ffae4b2..de72caa 100644 --- a/src/buffers.hxx +++ b/src/buffers.hxx @@ -34,20 +34,27 @@ public: MASTER_OUT_L, MASTER_OUT_R, - JACK_SEND_OUT, + JACK_SEND_OUT_L, + JACK_SEND_OUT_R, JACK_MASTER_OUT_L, JACK_MASTER_OUT_R, - JACK_SIDECHAIN_KEY, - JACK_SIDECHAIN_SIGNAL, + JACK_SIDECHAIN_KEY_L, + JACK_SIDECHAIN_KEY_R, + JACK_SIDECHAIN_SIGNAL_L, + JACK_SIDECHAIN_SIGNAL_R, - SEND, - SIDECHAIN_KEY, - SIDECHAIN_SIGNAL, + SEND_L, + SEND_R, + SIDECHAIN_KEY_L, + SIDECHAIN_KEY_R, + SIDECHAIN_SIGNAL_L, + SIDECHAIN_SIGNAL_R, MASTER_RETURN_L, MASTER_RETURN_R, - HEADPHONES_OUT, + HEADPHONES_OUT_L, + HEADPHONES_OUT_R, // MIDI MASTER_MIDI_INPUT, @@ -55,40 +62,72 @@ public: // track buffers: they are the "working" buffers per track: // the end result is mixed into the master output, while each // stage along the way the amplitude etc can be analysed - TRACK_0, - TRACK_1, - TRACK_2, - TRACK_3, - TRACK_4, - TRACK_5, - TRACK_6, - TRACK_7, + TRACK_0_L, + TRACK_0_R, + TRACK_1_L, + TRACK_1_R, + TRACK_2_L, + TRACK_2_R, + TRACK_3_L, + TRACK_3_R, + TRACK_4_L, + TRACK_4_R, + TRACK_5_L, + TRACK_5_R, + TRACK_6_L, + TRACK_6_R, + TRACK_7_L, + TRACK_7_R, //Per track sends/returns - SEND_TRACK_0, - SEND_TRACK_1, - SEND_TRACK_2, - SEND_TRACK_3, - SEND_TRACK_4, - SEND_TRACK_5, - SEND_TRACK_6, - SEND_TRACK_7, - RETURN_TRACK_0, - RETURN_TRACK_1, - RETURN_TRACK_2, - RETURN_TRACK_3, - RETURN_TRACK_4, - RETURN_TRACK_5, - RETURN_TRACK_6, - RETURN_TRACK_7, + SEND_TRACK_0_L, + SEND_TRACK_0_R, + SEND_TRACK_1_L, + SEND_TRACK_1_R, + SEND_TRACK_2_L, + SEND_TRACK_2_R, + SEND_TRACK_3_L, + SEND_TRACK_3_R, + SEND_TRACK_4_L, + SEND_TRACK_4_R, + SEND_TRACK_5_L, + SEND_TRACK_5_R, + SEND_TRACK_6_L, + SEND_TRACK_6_R, + SEND_TRACK_7_L, + SEND_TRACK_7_R, + RETURN_TRACK_0_L, + RETURN_TRACK_0_R, + RETURN_TRACK_1_L, + RETURN_TRACK_1_R, + RETURN_TRACK_2_L, + RETURN_TRACK_2_R, + RETURN_TRACK_3_L, + RETURN_TRACK_3_R, + RETURN_TRACK_4_L, + RETURN_TRACK_4_R, + RETURN_TRACK_5_L, + RETURN_TRACK_5_R, + RETURN_TRACK_6_L, + RETURN_TRACK_6_R, + RETURN_TRACK_7_L, + RETURN_TRACK_7_R, - JACK_TRACK_0, - JACK_TRACK_1, - JACK_TRACK_2, - JACK_TRACK_3, - JACK_TRACK_4, - JACK_TRACK_5, - JACK_TRACK_6, - JACK_TRACK_7, + JACK_TRACK_0_L, + JACK_TRACK_0_R, + JACK_TRACK_1_L, + JACK_TRACK_1_R, + JACK_TRACK_2_L, + JACK_TRACK_2_R, + JACK_TRACK_3_L, + JACK_TRACK_3_R, + JACK_TRACK_4_L, + JACK_TRACK_4_R, + JACK_TRACK_5_L, + JACK_TRACK_5_R, + JACK_TRACK_6_L, + JACK_TRACK_6_R, + JACK_TRACK_7_L, + JACK_TRACK_7_R, BUFFER_COUNT, diff --git a/src/jack.cxx b/src/jack.cxx index eb58b39..23892d5 100644 --- a/src/jack.cxx +++ b/src/jack.cxx @@ -145,29 +145,53 @@ Jack::Jack( std::string name ) : JackPortIsOutput, 0 ); - headphonesPort = jack_port_register( client, - "headphone_out", - JACK_DEFAULT_AUDIO_TYPE, - JackPortIsOutput, - 0 ); + headphonesPortL = jack_port_register( client, + "headphone_out_l", + JACK_DEFAULT_AUDIO_TYPE, + JackPortIsOutput, + 0 ); - sendOutput = jack_port_register( client, - "send_out", + headphonesPortR = jack_port_register( client, + "headphone_out_r", + JACK_DEFAULT_AUDIO_TYPE, + JackPortIsOutput, + 0 ); + + sendOutputL = jack_port_register( client, + "send_out_l", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0 ); - sidechainKeyOutput= jack_port_register( client, - "sidechain_key", - JACK_DEFAULT_AUDIO_TYPE, - JackPortIsOutput, - 0 ); + sendOutputR = jack_port_register( client, + "send_out_r", + JACK_DEFAULT_AUDIO_TYPE, + JackPortIsOutput, + 0 ); - sidechainSignalOutput= jack_port_register( client, - "sidechain_signal", - JACK_DEFAULT_AUDIO_TYPE, - JackPortIsOutput, - 0 ); + sidechainKeyOutputL = jack_port_register( client, + "sidechain_key_l", + JACK_DEFAULT_AUDIO_TYPE, + JackPortIsOutput, + 0 ); + + sidechainKeyOutputR = jack_port_register( client, + "sidechain_key_r", + JACK_DEFAULT_AUDIO_TYPE, + JackPortIsOutput, + 0 ); + + sidechainSignalOutputL = jack_port_register( client, + "sidechain_signal_l", + JACK_DEFAULT_AUDIO_TYPE, + JackPortIsOutput, + 0 ); + + sidechainSignalOutputR = jack_port_register( client, + "sidechain_signal_r", + JACK_DEFAULT_AUDIO_TYPE, + JackPortIsOutput, + 0 ); /* masterMidiInput = jack_port_register( client, @@ -188,9 +212,12 @@ Jack::Jack( std::string name ) : inputToXSideVol = 0.f; /// prepare internal buffers - buffers.audio[Buffers::SEND] = new float[ buffers.nframes ]; - buffers.audio[Buffers::SIDECHAIN_KEY] = new float[ buffers.nframes ]; - buffers.audio[Buffers::SIDECHAIN_SIGNAL]=new float[ buffers.nframes ]; + buffers.audio[Buffers::SEND_L] = new float[ buffers.nframes ]; + buffers.audio[Buffers::SEND_R] = new float[ buffers.nframes ]; + buffers.audio[Buffers::SIDECHAIN_KEY_L] = new float[ buffers.nframes ]; + buffers.audio[Buffers::SIDECHAIN_KEY_R] = new float[ buffers.nframes ]; + buffers.audio[Buffers::SIDECHAIN_SIGNAL_L]= new float[ buffers.nframes ]; + buffers.audio[Buffers::SIDECHAIN_SIGNAL_R]= new float[ buffers.nframes ]; buffers.audio[Buffers::MASTER_OUT_L] = new float[ buffers.nframes ]; buffers.audio[Buffers::MASTER_OUT_R] = new float[ buffers.nframes ]; @@ -207,19 +234,29 @@ Jack::Jack( std::string name ) : tracksendreturns.push_back(new JackSendReturn(i,loopers.back(),client)); trackOutputs.push_back( new TrackOutput(i, tracksendreturns.back() ) ); - buffers.audio[Buffers::TRACK_0 + i] = new float[ buffers.nframes ]; - buffers.audio[Buffers::SEND_TRACK_0+i]=new float[buffers.nframes]; - buffers.audio[Buffers::RETURN_TRACK_0+i]=new float[buffers.nframes]; + int o = i*2; + buffers.audio[Buffers::TRACK_0_L + o] = new float[ buffers.nframes ]; + buffers.audio[Buffers::TRACK_0_R + o] = new float[ buffers.nframes ]; + buffers.audio[Buffers::SEND_TRACK_0_L+o]=new float[buffers.nframes]; + buffers.audio[Buffers::SEND_TRACK_0_R+o]=new float[buffers.nframes]; + buffers.audio[Buffers::RETURN_TRACK_0_L+o]=new float[buffers.nframes]; + buffers.audio[Buffers::RETURN_TRACK_0_R+o]=new float[buffers.nframes]; timeManager->registerObserver( loopers.back() ); if(gui->enablePerTrackOutput) { char name[50]; - sprintf(name,"track_%d\n",i); - trackJackOutputPorts[i]=jack_port_register( client, + sprintf(name,"track_%d_l",i); + trackJackOutputPorts[o]=jack_port_register( client, name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0 ); + sprintf(name,"track_%d_r",i); + trackJackOutputPorts[o+1]=jack_port_register( client, + name, + JACK_DEFAULT_AUDIO_TYPE, + JackPortIsOutput, + 0 ); } } @@ -278,9 +315,13 @@ Jack::~Jack() delete inputMeter; delete masterMeter; for(int i = 0; i < NTRACKS; i++) { - delete [] buffers.audio[Buffers::TRACK_0+i]; - delete [] buffers.audio[Buffers::SEND_TRACK_0+i]; - delete [] buffers.audio[Buffers::RETURN_TRACK_0+i]; + int o = i*2; + delete [] buffers.audio[Buffers::TRACK_0_L+o]; + delete [] buffers.audio[Buffers::TRACK_0_R+o]; + delete [] buffers.audio[Buffers::SEND_TRACK_0_L+o]; + delete [] buffers.audio[Buffers::SEND_TRACK_0_R+o]; + delete [] buffers.audio[Buffers::RETURN_TRACK_0_L+o]; + delete [] buffers.audio[Buffers::RETURN_TRACK_0_R+o]; delete tracksendreturns[i]; delete loopers[i]; delete trackOutputs[i]; @@ -309,7 +350,7 @@ void Jack::quit() TrackOutput* Jack::getTrackOutput(int t) { - if ( t >= 0 && t < NTRACKS ) + if ( t >= 0 && t < NTRACKS*2 ) return trackOutputs.at(t); #ifdef DEBUG_TRACKS else { @@ -322,7 +363,7 @@ TrackOutput* Jack::getTrackOutput(int t) JackSendReturn* Jack::getJackSendReturn(int t) { - if ( t >= 0 && t < NTRACKS ) + if ( t >= 0 && t < NTRACKS*2 ) return tracksendreturns.at(t); #ifdef DEBUG_TRACKS else { @@ -336,7 +377,7 @@ JackSendReturn* Jack::getJackSendReturn(int t) Looper* Jack::getLooper(int t) { - if ( t >= 0 && t < NTRACKS ) + if ( t >= 0 && t < NTRACKS*2 ) return loopers.at(t); #ifdef DEBUG_TRACKS else { @@ -373,21 +414,27 @@ void Jack::unregisterMidiIO( MidiIO* mo ) int Jack::process (jack_nframes_t nframes) { /// get buffers - buffers.audio[Buffers::MASTER_INPUT_L] = (float*)jack_port_get_buffer( masterInputL , nframes ); - buffers.audio[Buffers::MASTER_INPUT_R] = (float*)jack_port_get_buffer( masterInputR , nframes ); - buffers.audio[Buffers::MASTER_RETURN_L] = (float*)jack_port_get_buffer( masterReturnL , nframes ); - buffers.audio[Buffers::MASTER_RETURN_R] = (float*)jack_port_get_buffer( masterReturnR , nframes ); - buffers.audio[Buffers::HEADPHONES_OUT] = (float*)jack_port_get_buffer( headphonesPort , nframes ); + buffers.audio[Buffers::MASTER_INPUT_L] = (float*)jack_port_get_buffer( masterInputL, nframes ); + buffers.audio[Buffers::MASTER_INPUT_R] = (float*)jack_port_get_buffer( masterInputR, nframes ); + buffers.audio[Buffers::MASTER_RETURN_L] = (float*)jack_port_get_buffer( masterReturnL, nframes ); + buffers.audio[Buffers::MASTER_RETURN_R] = (float*)jack_port_get_buffer( masterReturnR, nframes ); + buffers.audio[Buffers::HEADPHONES_OUT_L] = (float*)jack_port_get_buffer( headphonesPortL, nframes ); + buffers.audio[Buffers::HEADPHONES_OUT_R] = (float*)jack_port_get_buffer( headphonesPortR, nframes ); - buffers.audio[Buffers::JACK_SEND_OUT] = (float*)jack_port_get_buffer( sendOutput , nframes ); - buffers.audio[Buffers::JACK_MASTER_OUT_L] = (float*)jack_port_get_buffer( masterOutputL , nframes ); - buffers.audio[Buffers::JACK_MASTER_OUT_R] = (float*)jack_port_get_buffer( masterOutputR , nframes ); - buffers.audio[Buffers::JACK_SIDECHAIN_KEY] = (float*)jack_port_get_buffer(sidechainKeyOutput,nframes); - buffers.audio[Buffers::JACK_SIDECHAIN_SIGNAL]=(float*)jack_port_get_buffer(sidechainSignalOutput,nframes); + buffers.audio[Buffers::JACK_SEND_OUT_L] = (float*)jack_port_get_buffer( sendOutputL, nframes ); + buffers.audio[Buffers::JACK_SEND_OUT_R] = (float*)jack_port_get_buffer( sendOutputR, nframes ); + buffers.audio[Buffers::JACK_MASTER_OUT_L] = (float*)jack_port_get_buffer( masterOutputL, nframes ); + buffers.audio[Buffers::JACK_MASTER_OUT_R] = (float*)jack_port_get_buffer( masterOutputR, nframes ); + buffers.audio[Buffers::JACK_SIDECHAIN_KEY_L] = (float*)jack_port_get_buffer( sidechainKeyOutputL, nframes ); + buffers.audio[Buffers::JACK_SIDECHAIN_KEY_R] = (float*)jack_port_get_buffer( sidechainKeyOutputR, nframes ); + buffers.audio[Buffers::JACK_SIDECHAIN_SIGNAL_L]= (float*)jack_port_get_buffer( sidechainSignalOutputL,nframes ); + buffers.audio[Buffers::JACK_SIDECHAIN_SIGNAL_R]= (float*)jack_port_get_buffer( sidechainSignalOutputR,nframes ); if(gui->enablePerTrackOutput) { - for(int t=0; tenablePerTrackOutput) { - for(int t=0; t=fabs(masterVolDiff/10.0)) @@ -512,9 +565,12 @@ void Jack::processFrames(int nframes) buffers.audio[Buffers::JACK_MASTER_OUT_R][i] = (R + returnR*returnVol) * masterVolLag; /// write SEND content to JACK port - buffers.audio[Buffers::JACK_SEND_OUT][i] = buffers.audio[Buffers::SEND][i]; - buffers.audio[Buffers::JACK_SIDECHAIN_KEY][i] = buffers.audio[Buffers::SIDECHAIN_KEY][i]; - buffers.audio[Buffers::JACK_SIDECHAIN_SIGNAL][i] = buffers.audio[Buffers::SIDECHAIN_SIGNAL][i]; + buffers.audio[Buffers::JACK_SEND_OUT_L][i] = buffers.audio[Buffers::SEND_L][i]; + buffers.audio[Buffers::JACK_SEND_OUT_R][i] = buffers.audio[Buffers::SEND_R][i]; + buffers.audio[Buffers::JACK_SIDECHAIN_KEY_L][i] = buffers.audio[Buffers::SIDECHAIN_KEY_L][i]; + buffers.audio[Buffers::JACK_SIDECHAIN_KEY_R][i] = buffers.audio[Buffers::SIDECHAIN_KEY_R][i]; + buffers.audio[Buffers::JACK_SIDECHAIN_SIGNAL_L][i] = buffers.audio[Buffers::SIDECHAIN_SIGNAL_L][i]; + buffers.audio[Buffers::JACK_SIDECHAIN_SIGNAL_R][i] = buffers.audio[Buffers::SIDECHAIN_SIGNAL_R][i]; } @@ -553,20 +609,26 @@ void Jack::processFrames(int nframes) /// update buffers by nframes if(lastnframes+nframesenablePerTrackOutput) { for(int t=0; tnframes); - float* sendtrack=&(buffers->audio[Buffers::SEND_TRACK_0+m_trackid][0]); + float* sendtrackL=&(buffers->audio[Buffers::SEND_TRACK_0_L+m_trackid][0]); + float* sendtrackR=&(buffers->audio[Buffers::SEND_TRACK_0_R+m_trackid][0]); - float* rettrack=&(buffers->audio[Buffers::RETURN_TRACK_0+m_trackid][0]); + float* rettrackL=&(buffers->audio[Buffers::RETURN_TRACK_0_L+m_trackid][0]); + float* rettrackR=&(buffers->audio[Buffers::RETURN_TRACK_0_R+m_trackid][0]); - memset(sendtrack,0,nframes*sizeof(float)); + memset(sendtrackL,0,nframes*sizeof(float)); + memset(sendtrackR,0,nframes*sizeof(float)); //Process previous AudioProcessor m_previousProcessor->process(nframes,buffers); - float* send=(float*)jack_port_get_buffer(m_sendport,(jack_nframes_t)(buffers->nframes)); - float* ret=(float*)jack_port_get_buffer(m_returnport,(jack_nframes_t)(buffers->nframes)); + float* sendL=(float*)jack_port_get_buffer(m_sendport_l,(jack_nframes_t)(buffers->nframes)); + float* sendR=(float*)jack_port_get_buffer(m_sendport_r,(jack_nframes_t)(buffers->nframes)); + float* retL=(float*)jack_port_get_buffer(m_returnport_l,(jack_nframes_t)(buffers->nframes)); + float* retR=(float*)jack_port_get_buffer(m_returnport_r,(jack_nframes_t)(buffers->nframes)); if(offset) { - send+=offset; - ret+=offset; + sendL+=offset; + sendR+=offset; + retL+=offset; + retR+=offset; } - for(int i=0; inframes) // { // cout<nframes); - if(m_active) - memcpy(rettrack,ret,nframes*sizeof(float)); - else - memcpy(rettrack, - sendtrack,nframes*sizeof(float)); + if(m_active) { + memcpy(rettrackL,retL,nframes*sizeof(float)); + memcpy(rettrackR,retR,nframes*sizeof(float)); + } + else { + memcpy(rettrackL, + sendtrackL,nframes*sizeof(float)); + memcpy(rettrackR, + sendtrackR,nframes*sizeof(float)); + } m_counter+=nframes; } diff --git a/src/jacksendreturn.hxx b/src/jacksendreturn.hxx index 1d374da..e2fc3f6 100644 --- a/src/jacksendreturn.hxx +++ b/src/jacksendreturn.hxx @@ -45,8 +45,10 @@ public: private: bool m_active; float m_sendvol; - jack_port_t* m_sendport; - jack_port_t* m_returnport; + jack_port_t* m_sendport_l; + jack_port_t* m_sendport_r; + jack_port_t* m_returnport_l; + jack_port_t* m_returnport_r; int m_trackid; AudioProcessor* m_previousProcessor; int m_counter; diff --git a/src/looper.cxx b/src/looper.cxx index 58f88d5..c9b7f28 100644 --- a/src/looper.cxx +++ b/src/looper.cxx @@ -131,8 +131,8 @@ void Looper::process(unsigned int nframes, Buffers* buffers) playSpeed = float(actualFrames) / targetFrames; } - // TODO stereo sends - float* out = buffers->audio[Buffers::SEND_TRACK_0 + track]; + float* outL = buffers->audio[Buffers::SEND_TRACK_0_L + track]; + float* outR = buffers->audio[Buffers::SEND_TRACK_0_R + track]; for(unsigned int i = 0; i < nframes; i++ ) { // REFACTOR into system that is better than per sample function calls @@ -146,14 +146,14 @@ void Looper::process(unsigned int nframes, Buffers* buffers) // write the pitch-shifted signal to the track buffer //FIXME: pitchShift adds delay even for playSpeed = 1.0!! //we should use something better (e.g librubberband) - if(playSpeed!=1.0f) - pitchShift( 1, &tmpL, &out[i] ); - // TODO stereo sends - //pitchShift( 1, tmpR, &out[i] ); - else - // TODO stereo sends - out[i]+=tmpL; - //outR[i]+=tmpR; + if(playSpeed!=1.0f) { + pitchShift( 1, &tmpL, &outL[i] ); + pitchShift( 1, &tmpR, &outR[i] ); + } + else { + outL[i]+=tmpL; + outR[i]+=tmpR; + } } //printf("Looper %i playing(), speed = %f\n", track, playSpeed ); diff --git a/src/metronome.cxx b/src/metronome.cxx index bb75a19..ed082c2 100644 --- a/src/metronome.cxx +++ b/src/metronome.cxx @@ -100,7 +100,8 @@ void Metronome::process(int nframes, Buffers* buffers) if ( not active ) return; - float* out = buffers->audio[Buffers::HEADPHONES_OUT]; + float* outL = buffers->audio[Buffers::HEADPHONES_OUT_L]; + float* outR = buffers->audio[Buffers::HEADPHONES_OUT_R]; float* sample = &beatSample[0]; if( playBar ) { @@ -109,7 +110,8 @@ void Metronome::process(int nframes, Buffers* buffers) for(int i = 0; i < nframes; i++) { if ( playPoint < endPoint ) { - out[i] += sample[playPoint] * vol; + outL[i] += sample[playPoint] * vol; + outR[i] += sample[playPoint] * vol; playPoint++; } } diff --git a/src/trackoutput.cxx b/src/trackoutput.cxx index 7e6796c..ade553b 100644 --- a/src/trackoutput.cxx +++ b/src/trackoutput.cxx @@ -114,14 +114,16 @@ void TrackOutput::process(unsigned int nframes, Buffers* buffers) if(fabs(_toMaster-_toMasterLag)>=fabs(_toMasterDiff/100.0)) _toMasterLag+=_toMasterDiff/10.0; // get & zero track buffer - float* trackBuffer = buffers->audio[Buffers::RETURN_TRACK_0 + track]; - memset( trackBuffer, 0, sizeof(float)*nframes ); + float* trackBufferL = buffers->audio[Buffers::RETURN_TRACK_0_L + track]; + float* trackBufferR = buffers->audio[Buffers::RETURN_TRACK_0_R + track]; + memset( trackBufferL, 0, sizeof(float)*nframes ); + memset( trackBufferR, 0, sizeof(float)*nframes ); // call process() up the chain previousInChain->process( nframes, buffers ); // run the meter - dbMeter->process( nframes, trackBuffer, trackBuffer ); + dbMeter->process( nframes, trackBufferL, trackBufferR ); if (uiUpdateCounter > uiUpdateConstant ) { float l = dbMeter->getLeftDB() * _toMasterLag; @@ -134,15 +136,19 @@ void TrackOutput::process(unsigned int nframes, Buffers* buffers) uiUpdateCounter += nframes; // copy audio data into reverb / sidechain / master buffers - float* reverb = buffers->audio[Buffers::SEND]; - float* sidechain = buffers->audio[Buffers::SIDECHAIN_KEY]; - float* postSidechain = buffers->audio[Buffers::SIDECHAIN_SIGNAL]; + float* reverbL = buffers->audio[Buffers::SEND_L]; + float* reverbR = buffers->audio[Buffers::SEND_R]; + float* sidechainL = buffers->audio[Buffers::SIDECHAIN_KEY_L]; + float* sidechainR = buffers->audio[Buffers::SIDECHAIN_KEY_R]; + float* postSidechainL = buffers->audio[Buffers::SIDECHAIN_SIGNAL_L]; + float* postSidechainR = buffers->audio[Buffers::SIDECHAIN_SIGNAL_R]; float* masterL = buffers->audio[Buffers::MASTER_OUT_L]; float* masterR = buffers->audio[Buffers::MASTER_OUT_R]; - float* jackoutput = buffers->audio[Buffers::JACK_TRACK_0+track]; + float* jackoutputL = buffers->audio[Buffers::JACK_TRACK_0_L+track]; + float* jackoutputR = buffers->audio[Buffers::JACK_TRACK_0_R+track]; /* Trial + Error leads to this algo - its cheap and cheerful */ float p = ((_toMasterPan + 1.0f) * 0.5f) * (M_PI * 0.5); @@ -153,22 +159,31 @@ 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]; + float tmpL = trackBufferL[i]; + float tmpR = trackBufferR[i]; // post-sidechain *moves* signal between "before/after" ducking, not add! - masterL[i] += tmp * _toMasterLag * (1-_toPostSidechain) * pan_l; - masterR[i] += tmp * _toMasterLag * (1-_toPostSidechain) * pan_r; - if(jackoutput) - jackoutput[i] = tmp * _toMasterLag * (1-_toPostSidechain); - if ( _toPostfaderActive ) - reverb[i] += tmp * _toReverb * _toMasterLag; + masterL[i] += tmpL * _toMasterLag * (1-_toPostSidechain) * pan_l; + masterR[i] += tmpR * _toMasterLag * (1-_toPostSidechain) * pan_r; + if(jackoutputL) + jackoutputL[i] = tmpL * _toMasterLag * (1-_toPostSidechain); + if(jackoutputR) + jackoutputR[i] = tmpR * _toMasterLag * (1-_toPostSidechain); + if ( _toPostfaderActive ) { + reverbL[i] += tmpL * _toReverb * _toMasterLag; + reverbR[i] += tmpR * _toReverb * _toMasterLag; + } - if ( _toXSideActive ) - postSidechain[i] += tmp * _toPostSidechain * _toMasterLag; + if ( _toXSideActive ) { + postSidechainL[i] += tmpL * _toPostSidechain * _toMasterLag; + postSidechainR[i] += tmpR * _toPostSidechain * _toMasterLag; + } // turning down an element in the mix should *NOT* influence sidechaining - if ( _toKeyActive ) - sidechain[i] += tmp; + if ( _toKeyActive ) { + sidechainL[i] += tmpL; + sidechainR[i] += tmpR; + } } }