diff --git a/src/event.cxx b/src/event.cxx index cf52316..2e199b4 100644 --- a/src/event.cxx +++ b/src/event.cxx @@ -25,6 +25,7 @@ const char* EventMasterInputVol::prettyName = "master:input_vol"; const char* EventMasterInputTo::prettyName = "master:input_to"; const char* EventMasterInputToActive::prettyName = "master:input_to_active"; +const char* EventTrackPan::prettyName = "track:pan"; const char* EventTrackVol::prettyName = "track:volume"; const char* EventTrackSend::prettyName = "track:send"; const char* EventTrackSendActive::prettyName = "track:send_active"; @@ -73,6 +74,9 @@ const char* Event::getPrettyName( int type ) return EventMasterInputToActive::prettyName; } + case TRACK_PAN: { + return EventTrackPan::prettyName; + } case TRACK_VOLUME: { return EventTrackVol::prettyName; } diff --git a/src/event.hxx b/src/event.hxx index 3cc598d..8e7c1e3 100644 --- a/src/event.hxx +++ b/src/event.hxx @@ -87,6 +87,7 @@ enum EVENT_TYPE { TRACK_SEND_ACTIVE, TRACK_SIGNAL_LEVEL, TRACK_VOLUME, + TRACK_PAN, TRACK_RECORD_ARM, FX_REVERB, @@ -477,6 +478,35 @@ public: } }; +class EventTrackPan : public EventBase +{ +public: + int type() + { + return int(TRACK_PAN); + } + uint32_t size() + { + return sizeof(EventTrackPan); + } + static const char* prettyName; + const char* name() + { + return prettyName; + } + + int track; + float pan; + + EventTrackPan() {}; + EventTrackPan(int t, float p) + { + track = t; + pan = p; + } +}; + + class EventTrackRecordArm : public EventBase { public: diff --git a/src/eventhandlerdsp.cxx b/src/eventhandlerdsp.cxx index a53986f..279d129 100644 --- a/src/eventhandlerdsp.cxx +++ b/src/eventhandlerdsp.cxx @@ -322,6 +322,16 @@ void handleDspEvents() } } + case Event::TRACK_PAN: { + if ( availableRead >= sizeof(EventTrackPan) ) { + EventTrackPan ev; + jack_ringbuffer_read( rbToDsp, (char*)&ev, sizeof(EventTrackPan) ); + jack->getLogic()->trackPan( ev.track, ev.pan ); + //jack->bindingTrack = ev.track; + break; + } + } + case Event::TRACK_RECORD_ARM: { if ( availableRead >= sizeof(EventTrackRecordArm) ) { EventTrackRecordArm ev; diff --git a/src/logic.cxx b/src/logic.cxx index 8d5ecd9..a4ce29d 100644 --- a/src/logic.cxx +++ b/src/logic.cxx @@ -71,6 +71,14 @@ void Logic::masterReturn( int returnNum, float value ) jack->getControllerUpdater()->masterReturnVolume( value ); } +void Logic::trackPan(int t, float p) +{ + if ( t >= 0 && t < NTRACKS ) { + jack->getTrackOutput( t )->setPan( p ); + //jack->getControllerUpdater()->volume( t, v ); + } +} + void Logic::trackVolume(int t, float v) { if ( t == -1 ) { // master track diff --git a/src/logic.hxx b/src/logic.hxx index 5c6540f..1d2006e 100644 --- a/src/logic.hxx +++ b/src/logic.hxx @@ -52,6 +52,7 @@ public: void masterReturn( int returnNum, float v); + void trackPan(int track, float pan); void trackVolume(int track, float volume); void trackRecordArm(int track, bool armed); void trackSendActive(int track, int send, bool active); diff --git a/src/trackoutput.cxx b/src/trackoutput.cxx index cd1d2ed..7e6796c 100644 --- a/src/trackoutput.cxx +++ b/src/trackoutput.cxx @@ -36,6 +36,7 @@ TrackOutput::TrackOutput(int t, AudioProcessor* ap) : _toMaster = 0.8; _toMasterLag = 0.8; _toMasterDiff = 0; + _toMasterPan = 0.f; _toReverb = 0.0; _toSidechain = 0.0; _toPostSidechain = 0.0; @@ -86,6 +87,11 @@ void TrackOutput::setSendActive( int send, bool a ) } } +void TrackOutput::setPan( float pan ) +{ + _toMasterPan = pan; +} + void TrackOutput::setSend( int send, float value ) { switch( send ) { @@ -138,13 +144,20 @@ void TrackOutput::process(unsigned int nframes, Buffers* buffers) float* jackoutput = buffers->audio[Buffers::JACK_TRACK_0+track]; + /* Trial + Error leads to this algo - its cheap and cheerful */ + float p = ((_toMasterPan + 1.0f) * 0.5f) * (M_PI * 0.5); + float sin_p = sin(p); + float cos_p = cos(p); + float pan_r = sin_p * sin_p; + float pan_l = cos_p * cos_p; + for(unsigned int i = 0; i < nframes; i++) { // * master for "post-fader" sends float tmp = trackBuffer[i]; // post-sidechain *moves* signal between "before/after" ducking, not add! - masterL[i] += tmp * _toMasterLag * (1-_toPostSidechain); - masterR[i] += tmp * _toMasterLag * (1-_toPostSidechain); + 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 ) diff --git a/src/trackoutput.hxx b/src/trackoutput.hxx index f7e81d3..b924fed 100644 --- a/src/trackoutput.hxx +++ b/src/trackoutput.hxx @@ -43,6 +43,9 @@ public: float getMaster(); + // panning + void setPan ( float pan ); + bool recordArm(); void recordArm(bool r); @@ -64,6 +67,8 @@ private: float _toMaster; float _toMasterLag; float _toMasterDiff; + /* -1 indicates 100% left, 0 is centered, 1 indicates right */ + float _toMasterPan; float _toReverb; float _toSidechain;