From 1130fceea5d5c89e19af3cdc2c96301045c70296 Mon Sep 17 00:00:00 2001 From: hirsch Date: Sat, 25 Jun 2016 17:49:34 -0400 Subject: [PATCH] Refactor and cleanup CC dispatch logic --- amp.cpp | 98 +++++++++++++++++++++++++++++++++++++++--------- amp.h | 29 +++++++++----- mustang.cpp | 10 ++++- mustang.h | 20 +++++----- mustang_midi.cpp | 80 +++++---------------------------------- reverb.cpp | 45 +++++++++++++++++++--- reverb.h | 7 +++- 7 files changed, 173 insertions(+), 116 deletions(-) diff --git a/amp.cpp b/amp.cpp index f996fb9..8ff1d10 100644 --- a/amp.cpp +++ b/amp.cpp @@ -2,98 +2,162 @@ #include "amp.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 AmpCC::cc69( int value ) { - return amp->control_common1( 0x01, 0x0c, value ); + return control_common1( 0x01, 0x0c, value ); } int AmpCC::cc70( int value ) { - return amp->control_common1( 0x00, 0x0c, value ); + return control_common1( 0x00, 0x0c, value ); } int AmpCC::cc71( int value ) { - return amp->control_common1( 0x04, 0x0c, value ); + return control_common1( 0x04, 0x0c, value ); } int AmpCC::cc72( int value ) { - return amp->control_common1( 0x05, 0x0c, value ); + return control_common1( 0x05, 0x0c, value ); } int AmpCC::cc73( int value ) { - return amp->control_common1( 0x06, 0x0c, value ); + return control_common1( 0x06, 0x0c, value ); } int AmpCC::cc74( int value ) { if ( value > 2 ) return 0; - return amp->control_common2( 0x13, 0x8f, value ); + return control_common2( 0x13, 0x8f, value ); } int AmpCC::cc75( int value ) { - return amp->control_common1( 0x0a, 0x0d, value ); + return control_common1( 0x0a, 0x0d, value ); } int AmpCC::cc76( int value ) { if ( value > 4 ) return 0; - return amp->control_common2( 0x0f, 0x90, value ); + return control_common2( 0x0f, 0x90, value ); } int AmpCC::cc77( int value ) { if ( value < 1 || value > 12 ) return 0; - return amp->control_common2( 0x11, 0x8e, value ); + return control_common2( 0x11, 0x8e, value ); } int AmpCC1::cc78( int value ) { - return amp->control_common1( 0x07, 0x0c, value ); + return control_common1( 0x07, 0x0c, value ); } int AmpCC1::cc79( int value ) { - return amp->control_common1( 0x02, 0x0c, value ); + return control_common1( 0x02, 0x0c, value ); } int AmpCC2::cc78( int value ) { - return amp->control_common1( 0x02, 0x0c, value ); + return control_common1( 0x02, 0x0c, value ); } int AmpCC2::cc79( int value ) { - return amp->control_common1( 0x03, 0x0c, value ); + return control_common1( 0x03, 0x0c, value ); } int AmpCC3::cc78( int value ) { - return amp->control_common1( 0x07, 0x0c, value ); + return control_common1( 0x07, 0x0c, value ); } int AmpCC3::cc79( int value ) { - return amp->control_common1( 0x03, 0x0c, value ); + return control_common1( 0x03, 0x0c, value ); } int AmpCC4::cc78( int value ) { - return amp->control_common1( 0x07, 0x0c, value ); + return control_common1( 0x07, 0x0c, value ); } int AmpCC4::cc79( int value ) { - return amp->control_common1( 0x03, 0x0c, value ); + return control_common1( 0x03, 0x0c, value ); } diff --git a/amp.h b/amp.h index 473113a..467a7ca 100644 --- a/amp.h +++ b/amp.h @@ -14,31 +14,37 @@ class Mustang; class AmpCC { protected: - 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) {} + virtual int dispatch( int cc, int value ); + +private: // Gain - int cc69( int value ); + virtual int cc69( int value ); // Ch. Volume - int cc70( int value ); + virtual int cc70( int value ); // Treble - int cc71( int value ); + virtual int cc71( int value ); // Mid - int cc72( int value ); + virtual int cc72( int value ); // Bass - int cc73( int value ); + virtual int cc73( int value ); // Sag virtual int cc74( int value ); // Bias virtual int cc75( int value ); // Noise Gate - int cc76( int value ); + virtual int cc76( int value ); // Cabinet - int cc77( int value ); + virtual int cc77( int value ); // Dummy in base class virtual int cc78( int value ) { return 0;} @@ -52,6 +58,7 @@ public: class AmpCC1 : public AmpCC { public: AmpCC1( Mustang * theAmp ) : AmpCC(theAmp) {} +private: // Presence virtual int cc78( int value ); // Blend @@ -64,6 +71,7 @@ public: class AmpCC2 : public AmpCC { public: AmpCC2( Mustang * theAmp ) : AmpCC(theAmp) {} +private: // Gain2 virtual int cc78( int value ); // Master Volume @@ -76,6 +84,7 @@ public: class AmpCC3 : public AmpCC { public: AmpCC3( Mustang * theAmp ) : AmpCC(theAmp) {} +private: // Cut virtual int cc78( int value ); // Master Volume @@ -90,6 +99,7 @@ public: class AmpCC4 : public AmpCC { public: AmpCC4( Mustang * theAmp ) : AmpCC(theAmp) {} +private: // Presence virtual int cc78( int value ); // Master Volume @@ -102,6 +112,7 @@ public: class AmpCC5 : public AmpCC { public: AmpCC5( Mustang * theAmp ) : AmpCC(theAmp) {} +private: virtual int cc78( int value ) { return 0;} virtual int cc79( int value ) { return 0;} }; diff --git a/mustang.cpp b/mustang.cpp index 7b159be..1222362 100644 --- a/mustang.cpp +++ b/mustang.cpp @@ -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; 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); array[0] = 0x19; array[1] = 0xc3; // Translate DSP to family array[FAMILY] = curr_state[state_index][DSP] - 3; // Invert logic - array[ACTIVE_INVERT] = state > 0 ? 0 : 1; + array[ACTIVE_INVERT] = state; array[FXSLOT] = curr_state[state_index][FXSLOT]; #if 0 for ( int i=0; i<15; i++ ) fprintf( stderr, "%02x ", array[i] ); diff --git a/mustang.h b/mustang.h index 91d8ab8..ee4d56d 100644 --- a/mustang.h +++ b/mustang.h @@ -128,8 +128,10 @@ #define SPRING_63_ID 0x21 #define SPRING_65_ID 0x0b -class Mustang -{ +class Mustang { + friend class AmpCC; + friend class ReverbCC; + public: Mustang(); ~Mustang(); @@ -144,14 +146,8 @@ public: int load_memory_bank(int); int save_effects(int , char *, int , struct fx_pedal_settings *); - // State: 1 = off, 0 = on - int effect_toggle(int category, int state); + int effect_toggle(int cc, int value); - 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;} ReverbCC * getReverb( void ) { return curr_reverb;} @@ -185,9 +181,13 @@ public: AmpCC * curr_amp; 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 updateReverb(void); - }; #endif // MUSTANG_H diff --git a/mustang_midi.cpp b/mustang_midi.cpp index 18352ed..01295cd 100644 --- a/mustang_midi.cpp +++ b/mustang_midi.cpp @@ -42,90 +42,28 @@ void message_action( double deltatime, std::vector< unsigned char > *message, vo int rc = 0; int cc = (*message)[1]; int value = (*message)[2]; - AmpCC *ampModel = mustang.getAmp(); - ReverbCC *reverbModel = mustang.getReverb(); // Effects on/off if ( cc >= 23 && cc <= 26 ) { - // Translate 23..26 --> 2..5 (current state index) - 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 ); + rc = mustang.effect_toggle( cc, value ); } // Set reverb model else if ( cc == 58 ) { rc = mustang.setReverb( value ); } - // Level - else if ( cc == 59 ) { - rc = reverbModel->cc59( 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 ); + // Reverb CC handler + else if ( cc >= 59 && cc <= 63 ) { + ReverbCC *reverbModel = mustang.getReverb(); + rc = reverbModel->dispatch( cc, value ); } // Set amp model else if ( cc == 68 ) { - // fprintf( stderr, "DEBUG: %d\n", value ); rc = mustang.setAmp( value ); } - // Gain - else if ( cc == 69 ) { - rc = ampModel->cc69( 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 ); + // Amp CC Handler + else if ( cc >= 69 && cc <= 79 ) { + AmpCC *ampModel = mustang.getAmp(); + rc = ampModel->dispatch( cc, value ); } if ( rc ) { fprintf( stderr, "Error: CC#%d failed. RC = %d\n", cc, rc ); diff --git a/reverb.cpp b/reverb.cpp index 1083e59..d97fc07 100644 --- a/reverb.cpp +++ b/reverb.cpp @@ -2,28 +2,63 @@ #include "reverb.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 ReverbCC::cc59( int value ) { - return amp->efx_common1( 0x00, 0x0b, REVERB_STATE, value ); + return efx_common1( 0x00, 0x0b, REVERB_STATE, value ); } int ReverbCC::cc60( int value ) { - return amp->efx_common1( 0x01, 0x0b, REVERB_STATE, value ); + return efx_common1( 0x01, 0x0b, REVERB_STATE, value ); } int ReverbCC::cc61( int value ) { - return amp->efx_common1( 0x02, 0x0b, REVERB_STATE, value ); + return efx_common1( 0x02, 0x0b, REVERB_STATE, value ); } int ReverbCC::cc62( int value ) { - return amp->efx_common1( 0x03, 0x0b, REVERB_STATE, value ); + return efx_common1( 0x03, 0x0b, REVERB_STATE, value ); } int ReverbCC::cc63( int value ) { - return amp->efx_common1( 0x04, 0x0b, REVERB_STATE, value ); + return efx_common1( 0x04, 0x0b, REVERB_STATE, value ); } diff --git a/reverb.h b/reverb.h index 401d16e..86a19fd 100644 --- a/reverb.h +++ b/reverb.h @@ -8,13 +8,16 @@ class Mustang; class ReverbCC { protected: - Mustang * amp; -public: + int efx_common1(int parm, int bucket, int type, int value); +public: ReverbCC( Mustang * theAmp ) : amp(theAmp) {} + int dispatch( int cc, int value ); + +private: // Level int cc59( int value ); // Decay