Refactor and cleanup CC dispatch logic

This commit is contained in:
hirsch 2016-06-25 17:49:34 -04:00
parent 394b374b7f
commit 1130fceea5
7 changed files with 173 additions and 116 deletions

98
amp.cpp
View file

@ -2,98 +2,162 @@
#include "amp.h" #include "amp.h"
#include "mustang.h" #include "mustang.h"
int
AmpCC::control_common1( int parm, int bucket, int value ) {
return amp->control_common1( parm, bucket, value );
}
int
AmpCC::control_common2( int parm, int bucket, int value ) {
return amp->control_common2( parm, bucket, value );
}
int
AmpCC::dispatch( int cc, int value ) {
switch( cc ) {
case 69:
// Gain
return cc69( value );
break;
case 70:
// Channel volume
return cc70( value );
break;
case 71:
// Treble
return cc71( value );
break;
case 72:
// Mid
return cc72( value );
break;
case 73:
// Bass
return cc73( value );
break;
case 74:
// Sag
return cc74( value );
break;
case 75:
// Bias
return cc75( value );
break;
case 76:
// Noise Gate
return cc76( value );
break;
case 77:
// Cabinet
return cc77( value );
break;
case 78:
// Presence / Gain2 / Cut
return cc78( value );
break;
case 79:
// Blend / Master Volume
return cc79( value );
break;
default:
return 0;
break;
}
}
int int
AmpCC::cc69( int value ) { AmpCC::cc69( int value ) {
return amp->control_common1( 0x01, 0x0c, value ); return control_common1( 0x01, 0x0c, value );
} }
int int
AmpCC::cc70( int value ) { AmpCC::cc70( int value ) {
return amp->control_common1( 0x00, 0x0c, value ); return control_common1( 0x00, 0x0c, value );
} }
int int
AmpCC::cc71( int value ) { AmpCC::cc71( int value ) {
return amp->control_common1( 0x04, 0x0c, value ); return control_common1( 0x04, 0x0c, value );
} }
int int
AmpCC::cc72( int value ) { AmpCC::cc72( int value ) {
return amp->control_common1( 0x05, 0x0c, value ); return control_common1( 0x05, 0x0c, value );
} }
int int
AmpCC::cc73( int value ) { AmpCC::cc73( int value ) {
return amp->control_common1( 0x06, 0x0c, value ); return control_common1( 0x06, 0x0c, value );
} }
int int
AmpCC::cc74( int value ) { AmpCC::cc74( int value ) {
if ( value > 2 ) return 0; if ( value > 2 ) return 0;
return amp->control_common2( 0x13, 0x8f, value ); return control_common2( 0x13, 0x8f, value );
} }
int int
AmpCC::cc75( int value ) { AmpCC::cc75( int value ) {
return amp->control_common1( 0x0a, 0x0d, value ); return control_common1( 0x0a, 0x0d, value );
} }
int int
AmpCC::cc76( int value ) { AmpCC::cc76( int value ) {
if ( value > 4 ) return 0; if ( value > 4 ) return 0;
return amp->control_common2( 0x0f, 0x90, value ); return control_common2( 0x0f, 0x90, value );
} }
int int
AmpCC::cc77( int value ) { AmpCC::cc77( int value ) {
if ( value < 1 || value > 12 ) return 0; if ( value < 1 || value > 12 ) return 0;
return amp->control_common2( 0x11, 0x8e, value ); return control_common2( 0x11, 0x8e, value );
} }
int int
AmpCC1::cc78( int value ) { AmpCC1::cc78( int value ) {
return amp->control_common1( 0x07, 0x0c, value ); return control_common1( 0x07, 0x0c, value );
} }
int int
AmpCC1::cc79( int value ) { AmpCC1::cc79( int value ) {
return amp->control_common1( 0x02, 0x0c, value ); return control_common1( 0x02, 0x0c, value );
} }
int int
AmpCC2::cc78( int value ) { AmpCC2::cc78( int value ) {
return amp->control_common1( 0x02, 0x0c, value ); return control_common1( 0x02, 0x0c, value );
} }
int int
AmpCC2::cc79( int value ) { AmpCC2::cc79( int value ) {
return amp->control_common1( 0x03, 0x0c, value ); return control_common1( 0x03, 0x0c, value );
} }
int int
AmpCC3::cc78( int value ) { AmpCC3::cc78( int value ) {
return amp->control_common1( 0x07, 0x0c, value ); return control_common1( 0x07, 0x0c, value );
} }
int int
AmpCC3::cc79( int value ) { AmpCC3::cc79( int value ) {
return amp->control_common1( 0x03, 0x0c, value ); return control_common1( 0x03, 0x0c, value );
} }
int int
AmpCC4::cc78( int value ) { AmpCC4::cc78( int value ) {
return amp->control_common1( 0x07, 0x0c, value ); return control_common1( 0x07, 0x0c, value );
} }
int int
AmpCC4::cc79( int value ) { AmpCC4::cc79( int value ) {
return amp->control_common1( 0x03, 0x0c, value ); return control_common1( 0x03, 0x0c, value );
} }

29
amp.h
View file

@ -14,31 +14,37 @@ class Mustang;
class AmpCC { class AmpCC {
protected: protected:
Mustang * amp; Mustang * amp;
public: // Only base class is friend of Mustang, so forward calls from
// derived classes through these methods.
int control_common1( int parm, int bucket, int value );
int control_common2( int parm, int bucket, int value );
public:
AmpCC( Mustang * theAmp ) : amp(theAmp) {} AmpCC( Mustang * theAmp ) : amp(theAmp) {}
virtual int dispatch( int cc, int value );
private:
// Gain // Gain
int cc69( int value ); virtual int cc69( int value );
// Ch. Volume // Ch. Volume
int cc70( int value ); virtual int cc70( int value );
// Treble // Treble
int cc71( int value ); virtual int cc71( int value );
// Mid // Mid
int cc72( int value ); virtual int cc72( int value );
// Bass // Bass
int cc73( int value ); virtual int cc73( int value );
// Sag // Sag
virtual int cc74( int value ); virtual int cc74( int value );
// Bias // Bias
virtual int cc75( int value ); virtual int cc75( int value );
// Noise Gate // Noise Gate
int cc76( int value ); virtual int cc76( int value );
// Cabinet // Cabinet
int cc77( int value ); virtual int cc77( int value );
// Dummy in base class // Dummy in base class
virtual int cc78( int value ) { return 0;} virtual int cc78( int value ) { return 0;}
@ -52,6 +58,7 @@ public:
class AmpCC1 : public AmpCC { class AmpCC1 : public AmpCC {
public: public:
AmpCC1( Mustang * theAmp ) : AmpCC(theAmp) {} AmpCC1( Mustang * theAmp ) : AmpCC(theAmp) {}
private:
// Presence // Presence
virtual int cc78( int value ); virtual int cc78( int value );
// Blend // Blend
@ -64,6 +71,7 @@ public:
class AmpCC2 : public AmpCC { class AmpCC2 : public AmpCC {
public: public:
AmpCC2( Mustang * theAmp ) : AmpCC(theAmp) {} AmpCC2( Mustang * theAmp ) : AmpCC(theAmp) {}
private:
// Gain2 // Gain2
virtual int cc78( int value ); virtual int cc78( int value );
// Master Volume // Master Volume
@ -76,6 +84,7 @@ public:
class AmpCC3 : public AmpCC { class AmpCC3 : public AmpCC {
public: public:
AmpCC3( Mustang * theAmp ) : AmpCC(theAmp) {} AmpCC3( Mustang * theAmp ) : AmpCC(theAmp) {}
private:
// Cut // Cut
virtual int cc78( int value ); virtual int cc78( int value );
// Master Volume // Master Volume
@ -90,6 +99,7 @@ public:
class AmpCC4 : public AmpCC { class AmpCC4 : public AmpCC {
public: public:
AmpCC4( Mustang * theAmp ) : AmpCC(theAmp) {} AmpCC4( Mustang * theAmp ) : AmpCC(theAmp) {}
private:
// Presence // Presence
virtual int cc78( int value ); virtual int cc78( int value );
// Master Volume // Master Volume
@ -102,6 +112,7 @@ public:
class AmpCC5 : public AmpCC { class AmpCC5 : public AmpCC {
public: public:
AmpCC5( Mustang * theAmp ) : AmpCC(theAmp) {} AmpCC5( Mustang * theAmp ) : AmpCC(theAmp) {}
private:
virtual int cc78( int value ) { return 0;} virtual int cc78( int value ) { return 0;}
virtual int cc79( int value ) { return 0;} virtual int cc79( int value ) { return 0;}
}; };

View file

@ -219,18 +219,24 @@ void Mustang::updateReverb(void) {
} }
int Mustang::effect_toggle(int state_index, int state) int Mustang::effect_toggle(int cc, int value)
{ {
int ret, received; int ret, received;
unsigned char array[LENGTH]; unsigned char array[LENGTH];
// Translate 23..26 --> 2..5 (current state index)
int state_index = cc - 21;
int state;
if ( value >= 0 && value <= 63 ) state = 1;
else if ( value > 63 && value <= 127 ) state = 0;
memset(array, 0x00, LENGTH); memset(array, 0x00, LENGTH);
array[0] = 0x19; array[0] = 0x19;
array[1] = 0xc3; array[1] = 0xc3;
// Translate DSP to family // Translate DSP to family
array[FAMILY] = curr_state[state_index][DSP] - 3; array[FAMILY] = curr_state[state_index][DSP] - 3;
// Invert logic // Invert logic
array[ACTIVE_INVERT] = state > 0 ? 0 : 1; array[ACTIVE_INVERT] = state;
array[FXSLOT] = curr_state[state_index][FXSLOT]; array[FXSLOT] = curr_state[state_index][FXSLOT];
#if 0 #if 0
for ( int i=0; i<15; i++ ) fprintf( stderr, "%02x ", array[i] ); for ( int i=0; i<15; i++ ) fprintf( stderr, "%02x ", array[i] );

View file

@ -128,8 +128,10 @@
#define SPRING_63_ID 0x21 #define SPRING_63_ID 0x21
#define SPRING_65_ID 0x0b #define SPRING_65_ID 0x0b
class Mustang class Mustang {
{ friend class AmpCC;
friend class ReverbCC;
public: public:
Mustang(); Mustang();
~Mustang(); ~Mustang();
@ -144,14 +146,8 @@ public:
int load_memory_bank(int); int load_memory_bank(int);
int save_effects(int , char *, int , struct fx_pedal_settings *); int save_effects(int , char *, int , struct fx_pedal_settings *);
// State: 1 = off, 0 = on int effect_toggle(int cc, int value);
int effect_toggle(int category, int state);
int control_common1(int parm, int bucket, int value);
int control_common2(int parm, int bucket, int value);
int efx_common1(int parm, int bucket, int type, int value);
AmpCC * getAmp( void ) { return curr_amp;} AmpCC * getAmp( void ) { return curr_amp;}
ReverbCC * getReverb( void ) { return curr_reverb;} ReverbCC * getReverb( void ) { return curr_reverb;}
@ -185,9 +181,13 @@ public:
AmpCC * curr_amp; AmpCC * curr_amp;
ReverbCC * curr_reverb; ReverbCC * curr_reverb;
int control_common1(int parm, int bucket, int value);
int control_common2(int parm, int bucket, int value);
int efx_common1(int parm, int bucket, int type, int value);
void updateAmp(void); void updateAmp(void);
void updateReverb(void); void updateReverb(void);
}; };
#endif // MUSTANG_H #endif // MUSTANG_H

View file

@ -42,90 +42,28 @@ void message_action( double deltatime, std::vector< unsigned char > *message, vo
int rc = 0; int rc = 0;
int cc = (*message)[1]; int cc = (*message)[1];
int value = (*message)[2]; int value = (*message)[2];
AmpCC *ampModel = mustang.getAmp();
ReverbCC *reverbModel = mustang.getReverb();
// Effects on/off // Effects on/off
if ( cc >= 23 && cc <= 26 ) { if ( cc >= 23 && cc <= 26 ) {
// Translate 23..26 --> 2..5 (current state index) rc = mustang.effect_toggle( cc, value );
int index = cc - 21;
int state;
if ( value >= 0 && value <= 63 ) state = 0;
else if ( value > 63 && value <= 127 ) state = 1;
rc = mustang.effect_toggle( index, state );
} }
// Set reverb model // Set reverb model
else if ( cc == 58 ) { else if ( cc == 58 ) {
rc = mustang.setReverb( value ); rc = mustang.setReverb( value );
} }
// Level // Reverb CC handler
else if ( cc == 59 ) { else if ( cc >= 59 && cc <= 63 ) {
rc = reverbModel->cc59( value ); ReverbCC *reverbModel = mustang.getReverb();
} rc = reverbModel->dispatch( cc, value );
// Decay
else if ( cc == 60 ) {
rc = reverbModel->cc60( value );
}
// Dwell
else if ( cc == 61 ) {
rc = reverbModel->cc61( value );
}
// Diffusion
else if ( cc == 62 ) {
rc = reverbModel->cc62( value );
}
// Tone
else if ( cc == 63 ) {
rc = reverbModel->cc63( value );
} }
// Set amp model // Set amp model
else if ( cc == 68 ) { else if ( cc == 68 ) {
// fprintf( stderr, "DEBUG: %d\n", value );
rc = mustang.setAmp( value ); rc = mustang.setAmp( value );
} }
// Gain // Amp CC Handler
else if ( cc == 69 ) { else if ( cc >= 69 && cc <= 79 ) {
rc = ampModel->cc69( value ); AmpCC *ampModel = mustang.getAmp();
} rc = ampModel->dispatch( cc, value );
// Channel volume
else if ( cc == 70 ) {
rc = ampModel->cc70( value );
}
// Treble
else if ( cc == 71 ) {
rc = ampModel->cc71( value );
}
// Mid
else if ( cc == 72 ) {
rc = ampModel->cc72( value );
}
// Bass
else if ( cc == 73 ) {
rc = ampModel->cc73( value );
}
// Sag
else if ( cc == 74 ) {
rc = ampModel->cc74( value );
}
// Bias
else if ( cc == 75 ) {
rc = ampModel->cc75( value );
}
// Noise Gate
else if ( cc == 76 ) {
rc = ampModel->cc76( value );
}
// Cabinet
else if ( cc == 77 ) {
rc = ampModel->cc77( value );
}
// Presence / Gain2 / Cut
else if ( cc == 78 ) {
rc = ampModel->cc78( value );
}
// Blend / Master Volume
else if ( cc == 79 ) {
rc = ampModel->cc79( value );
} }
if ( rc ) { if ( rc ) {
fprintf( stderr, "Error: CC#%d failed. RC = %d\n", cc, rc ); fprintf( stderr, "Error: CC#%d failed. RC = %d\n", cc, rc );

View file

@ -2,28 +2,63 @@
#include "reverb.h" #include "reverb.h"
#include "mustang.h" #include "mustang.h"
int
ReverbCC::efx_common1(int parm, int bucket, int type, int value) {
return amp->efx_common1( parm, bucket, type, value );
}
int
ReverbCC::dispatch( int cc, int value ) {
switch ( cc ) {
case 59:
// Level
return cc59( value );
break;
case 60:
// Decay
return cc60( value );
break;
case 61:
// Dwell
return cc61( value );
break;
case 62:
// Diffusion
return cc62( value );
break;
case 63:
// Tone
return cc63( value );
break;
default:
return 0;
break;
}
}
int int
ReverbCC::cc59( int value ) { ReverbCC::cc59( int value ) {
return amp->efx_common1( 0x00, 0x0b, REVERB_STATE, value ); return efx_common1( 0x00, 0x0b, REVERB_STATE, value );
} }
int int
ReverbCC::cc60( int value ) { ReverbCC::cc60( int value ) {
return amp->efx_common1( 0x01, 0x0b, REVERB_STATE, value ); return efx_common1( 0x01, 0x0b, REVERB_STATE, value );
} }
int int
ReverbCC::cc61( int value ) { ReverbCC::cc61( int value ) {
return amp->efx_common1( 0x02, 0x0b, REVERB_STATE, value ); return efx_common1( 0x02, 0x0b, REVERB_STATE, value );
} }
int int
ReverbCC::cc62( int value ) { ReverbCC::cc62( int value ) {
return amp->efx_common1( 0x03, 0x0b, REVERB_STATE, value ); return efx_common1( 0x03, 0x0b, REVERB_STATE, value );
} }
int int
ReverbCC::cc63( int value ) { ReverbCC::cc63( int value ) {
return amp->efx_common1( 0x04, 0x0b, REVERB_STATE, value ); return efx_common1( 0x04, 0x0b, REVERB_STATE, value );
} }

View file

@ -8,13 +8,16 @@ class Mustang;
class ReverbCC { class ReverbCC {
protected: protected:
Mustang * amp; Mustang * amp;
public: int efx_common1(int parm, int bucket, int type, int value);
public:
ReverbCC( Mustang * theAmp ) : amp(theAmp) {} ReverbCC( Mustang * theAmp ) : amp(theAmp) {}
int dispatch( int cc, int value );
private:
// Level // Level
int cc59( int value ); int cc59( int value );
// Decay // Decay