dsp: pan implemented in trackoutput, event added

main
Harry van Haaren 2017-01-09 14:11:16 +00:00
parent e8b15b394c
commit fdec6fedbf
7 changed files with 73 additions and 2 deletions

View File

@ -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;
}

View File

@ -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:

View File

@ -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;

View File

@ -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

View File

@ -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);

View File

@ -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 )

View File

@ -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;