/[svn]/libgig/trunk/src/gig.cpp
ViewVC logotype

Diff of /libgig/trunk/src/gig.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2402 by persson, Sat Jan 19 08:19:14 2013 UTC revision 2450 by persson, Wed May 8 17:53:07 2013 UTC
# Line 3000  namespace { Line 3000  namespace {
3000  // *************** MidiRule ***************  // *************** MidiRule ***************
3001  // *  // *
3002    
3003  MidiRuleCtrlTrigger::MidiRuleCtrlTrigger(RIFF::Chunk* _3ewg) {      MidiRuleCtrlTrigger::MidiRuleCtrlTrigger(RIFF::Chunk* _3ewg) {
3004      _3ewg->SetPos(36);          _3ewg->SetPos(36);
3005      Triggers = _3ewg->ReadUint8();          Triggers = _3ewg->ReadUint8();
3006      _3ewg->SetPos(40);          _3ewg->SetPos(40);
3007      ControllerNumber = _3ewg->ReadUint8();          ControllerNumber = _3ewg->ReadUint8();
3008      _3ewg->SetPos(46);          _3ewg->SetPos(46);
3009      for (int i = 0 ; i < Triggers ; i++) {          for (int i = 0 ; i < Triggers ; i++) {
3010          pTriggers[i].TriggerPoint = _3ewg->ReadUint8();              pTriggers[i].TriggerPoint = _3ewg->ReadUint8();
3011          pTriggers[i].Descending = _3ewg->ReadUint8();              pTriggers[i].Descending = _3ewg->ReadUint8();
3012          pTriggers[i].VelSensitivity = _3ewg->ReadUint8();              pTriggers[i].VelSensitivity = _3ewg->ReadUint8();
3013          pTriggers[i].Key = _3ewg->ReadUint8();              pTriggers[i].Key = _3ewg->ReadUint8();
3014          pTriggers[i].NoteOff = _3ewg->ReadUint8();              pTriggers[i].NoteOff = _3ewg->ReadUint8();
3015          pTriggers[i].Velocity = _3ewg->ReadUint8();              pTriggers[i].Velocity = _3ewg->ReadUint8();
3016          pTriggers[i].OverridePedal = _3ewg->ReadUint8();              pTriggers[i].OverridePedal = _3ewg->ReadUint8();
3017          _3ewg->ReadUint8();              _3ewg->ReadUint8();
3018            }
3019        }
3020    
3021        MidiRuleCtrlTrigger::MidiRuleCtrlTrigger() :
3022            ControllerNumber(0),
3023            Triggers(0) {
3024        }
3025    
3026        void MidiRuleCtrlTrigger::UpdateChunks(uint8_t* pData) const {
3027            pData[32] = 4;
3028            pData[33] = 16;
3029            pData[36] = Triggers;
3030            pData[40] = ControllerNumber;
3031            for (int i = 0 ; i < Triggers ; i++) {
3032                pData[46 + i * 8] = pTriggers[i].TriggerPoint;
3033                pData[47 + i * 8] = pTriggers[i].Descending;
3034                pData[48 + i * 8] = pTriggers[i].VelSensitivity;
3035                pData[49 + i * 8] = pTriggers[i].Key;
3036                pData[50 + i * 8] = pTriggers[i].NoteOff;
3037                pData[51 + i * 8] = pTriggers[i].Velocity;
3038                pData[52 + i * 8] = pTriggers[i].OverridePedal;
3039            }
3040        }
3041    
3042        MidiRuleLegato::MidiRuleLegato(RIFF::Chunk* _3ewg) {
3043            _3ewg->SetPos(36);
3044            LegatoSamples = _3ewg->ReadUint8(); // always 12
3045            _3ewg->SetPos(40);
3046            BypassUseController = _3ewg->ReadUint8();
3047            BypassKey = _3ewg->ReadUint8();
3048            BypassController = _3ewg->ReadUint8();
3049            ThresholdTime = _3ewg->ReadUint16();
3050            _3ewg->ReadInt16();
3051            ReleaseTime = _3ewg->ReadUint16();
3052            _3ewg->ReadInt16();
3053            KeyRange.low = _3ewg->ReadUint8();
3054            KeyRange.high = _3ewg->ReadUint8();
3055            _3ewg->SetPos(64);
3056            ReleaseTriggerKey = _3ewg->ReadUint8();
3057            AltSustain1Key = _3ewg->ReadUint8();
3058            AltSustain2Key = _3ewg->ReadUint8();
3059        }
3060    
3061        MidiRuleLegato::MidiRuleLegato() :
3062            LegatoSamples(12),
3063            BypassUseController(false),
3064            BypassKey(0),
3065            BypassController(1),
3066            ThresholdTime(20),
3067            ReleaseTime(20),
3068            ReleaseTriggerKey(0),
3069            AltSustain1Key(0),
3070            AltSustain2Key(0)
3071        {
3072            KeyRange.low = KeyRange.high = 0;
3073        }
3074    
3075        void MidiRuleLegato::UpdateChunks(uint8_t* pData) const {
3076            pData[32] = 0;
3077            pData[33] = 16;
3078            pData[36] = LegatoSamples;
3079            pData[40] = BypassUseController;
3080            pData[41] = BypassKey;
3081            pData[42] = BypassController;
3082            store16(&pData[43], ThresholdTime);
3083            store16(&pData[47], ReleaseTime);
3084            pData[51] = KeyRange.low;
3085            pData[52] = KeyRange.high;
3086            pData[64] = ReleaseTriggerKey;
3087            pData[65] = AltSustain1Key;
3088            pData[66] = AltSustain2Key;
3089        }
3090    
3091        MidiRuleAlternator::MidiRuleAlternator(RIFF::Chunk* _3ewg) {
3092            _3ewg->SetPos(36);
3093            Articulations = _3ewg->ReadUint8();
3094            int flags = _3ewg->ReadUint8();
3095            Polyphonic = flags & 8;
3096            Chained = flags & 4;
3097            Selector = (flags & 2) ? selector_controller :
3098                (flags & 1) ? selector_key_switch : selector_none;
3099            Patterns = _3ewg->ReadUint8();
3100            _3ewg->ReadUint8(); // chosen row
3101            _3ewg->ReadUint8(); // unknown
3102            _3ewg->ReadUint8(); // unknown
3103            _3ewg->ReadUint8(); // unknown
3104            KeySwitchRange.low = _3ewg->ReadUint8();
3105            KeySwitchRange.high = _3ewg->ReadUint8();
3106            Controller = _3ewg->ReadUint8();
3107            PlayRange.low = _3ewg->ReadUint8();
3108            PlayRange.high = _3ewg->ReadUint8();
3109    
3110            int n = std::min(int(Articulations), 32);
3111            for (int i = 0 ; i < n ; i++) {
3112                _3ewg->ReadString(pArticulations[i], 32);
3113            }
3114            _3ewg->SetPos(1072);
3115            n = std::min(int(Patterns), 32);
3116            for (int i = 0 ; i < n ; i++) {
3117                _3ewg->ReadString(pPatterns[i].Name, 16);
3118                pPatterns[i].Size = _3ewg->ReadUint8();
3119                _3ewg->Read(&pPatterns[i][0], 1, 32);
3120            }
3121      }      }
 }  
3122    
3123        MidiRuleAlternator::MidiRuleAlternator() :
3124            Articulations(0),
3125            Patterns(0),
3126            Selector(selector_none),
3127            Controller(0),
3128            Polyphonic(false),
3129            Chained(false)
3130        {
3131            PlayRange.low = PlayRange.high = 0;
3132            KeySwitchRange.low = KeySwitchRange.high = 0;
3133        }
3134    
3135        void MidiRuleAlternator::UpdateChunks(uint8_t* pData) const {
3136            pData[32] = 3;
3137            pData[33] = 16;
3138            pData[36] = Articulations;
3139            pData[37] = (Polyphonic ? 8 : 0) | (Chained ? 4 : 0) |
3140                (Selector == selector_controller ? 2 :
3141                 (Selector == selector_key_switch ? 1 : 0));
3142            pData[38] = Patterns;
3143    
3144            pData[43] = KeySwitchRange.low;
3145            pData[44] = KeySwitchRange.high;
3146            pData[45] = Controller;
3147            pData[46] = PlayRange.low;
3148            pData[47] = PlayRange.high;
3149    
3150            char* str = reinterpret_cast<char*>(pData);
3151            int pos = 48;
3152            int n = std::min(int(Articulations), 32);
3153            for (int i = 0 ; i < n ; i++, pos += 32) {
3154                strncpy(&str[pos], pArticulations[i].c_str(), 32);
3155            }
3156    
3157            pos = 1072;
3158            n = std::min(int(Patterns), 32);
3159            for (int i = 0 ; i < n ; i++, pos += 49) {
3160                strncpy(&str[pos], pPatterns[i].Name.c_str(), 16);
3161                pData[pos + 16] = pPatterns[i].Size;
3162                memcpy(&pData[pos + 16], &(pPatterns[i][0]), 32);
3163            }
3164        }
3165    
3166  // *************** Instrument ***************  // *************** Instrument ***************
3167  // *  // *
# Line 3063  MidiRuleCtrlTrigger::MidiRuleCtrlTrigger Line 3207  MidiRuleCtrlTrigger::MidiRuleCtrlTrigger
3207                      uint8_t id1 = _3ewg->ReadUint8();                      uint8_t id1 = _3ewg->ReadUint8();
3208                      uint8_t id2 = _3ewg->ReadUint8();                      uint8_t id2 = _3ewg->ReadUint8();
3209    
3210                      if (id1 == 4 && id2 == 16) {                      if (id2 == 16) {
3211                          pMidiRules[i++] = new MidiRuleCtrlTrigger(_3ewg);                          if (id1 == 4) {
3212                                pMidiRules[i++] = new MidiRuleCtrlTrigger(_3ewg);
3213                            } else if (id1 == 0) {
3214                                pMidiRules[i++] = new MidiRuleLegato(_3ewg);
3215                            } else if (id1 == 3) {
3216                                pMidiRules[i++] = new MidiRuleAlternator(_3ewg);
3217                            } else {
3218                                pMidiRules[i++] = new MidiRuleUnknown;
3219                            }
3220                        }
3221                        else if (id1 != 0 || id2 != 0) {
3222                            pMidiRules[i++] = new MidiRuleUnknown;
3223                      }                      }
3224                      //TODO: all the other types of rules                      //TODO: all the other types of rules
3225    
# Line 3156  MidiRuleCtrlTrigger::MidiRuleCtrlTrigger Line 3311  MidiRuleCtrlTrigger::MidiRuleCtrlTrigger
3311                                      DimensionKeyRange.low << 1;                                      DimensionKeyRange.low << 1;
3312          pData[10] = dimkeystart;          pData[10] = dimkeystart;
3313          pData[11] = DimensionKeyRange.high;          pData[11] = DimensionKeyRange.high;
3314    
3315            if (pMidiRules[0] == 0 && _3ewg->GetSize() >= 34) {
3316                pData[32] = 0;
3317                pData[33] = 0;
3318            } else {
3319                for (int i = 0 ; pMidiRules[i] ; i++) {
3320                    pMidiRules[i]->UpdateChunks(pData);
3321                }
3322            }
3323      }      }
3324    
3325      /**      /**
# Line 3237  MidiRuleCtrlTrigger::MidiRuleCtrlTrigger Line 3401  MidiRuleCtrlTrigger::MidiRuleCtrlTrigger
3401      MidiRule* Instrument::GetMidiRule(int i) {      MidiRule* Instrument::GetMidiRule(int i) {
3402          return pMidiRules[i];          return pMidiRules[i];
3403      }      }
3404        
3405        /**
3406         * Adds the "controller trigger" MIDI rule to the instrument.
3407         *
3408         * @returns the new MIDI rule
3409         */
3410        MidiRuleCtrlTrigger* Instrument::AddMidiRuleCtrlTrigger() {
3411            delete pMidiRules[0];
3412            MidiRuleCtrlTrigger* r = new MidiRuleCtrlTrigger;
3413            pMidiRules[0] = r;
3414            pMidiRules[1] = 0;
3415            return r;
3416        }
3417    
3418        /**
3419         * Adds the legato MIDI rule to the instrument.
3420         *
3421         * @returns the new MIDI rule
3422         */
3423        MidiRuleLegato* Instrument::AddMidiRuleLegato() {
3424            delete pMidiRules[0];
3425            MidiRuleLegato* r = new MidiRuleLegato;
3426            pMidiRules[0] = r;
3427            pMidiRules[1] = 0;
3428            return r;
3429        }
3430    
3431        /**
3432         * Adds the alternator MIDI rule to the instrument.
3433         *
3434         * @returns the new MIDI rule
3435         */
3436        MidiRuleAlternator* Instrument::AddMidiRuleAlternator() {
3437            delete pMidiRules[0];
3438            MidiRuleAlternator* r = new MidiRuleAlternator;
3439            pMidiRules[0] = r;
3440            pMidiRules[1] = 0;
3441            return r;
3442        }
3443    
3444        /**
3445         * Deletes a MIDI rule from the instrument.
3446         *
3447         * @param i - MIDI rule number
3448         */
3449        void Instrument::DeleteMidiRule(int i) {
3450            delete pMidiRules[i];
3451            pMidiRules[i] = 0;
3452        }
3453    
3454      /**      /**
3455       * Make a (semi) deep copy of the Instrument object given by @a orig       * Make a (semi) deep copy of the Instrument object given by @a orig
3456       * and assign it to this object.       * and assign it to this object.

Legend:
Removed from v.2402  
changed lines
  Added in v.2450

  ViewVC Help
Powered by ViewVC