void MidiDecoder::controlChange(int timbre, MidiEvent& midiEvent) { int receives = this->synthState->fullState.midiConfigValue[MIDICONFIG_RECEIVES] ; // the following one should always been treated... switch (midiEvent.value[0]) { case CC_BANK_SELECT: bankNumber[timbre] = midiEvent.value[1]; break; case CC_BANK_SELECT_LSB: bankNumberLSB[timbre] = midiEvent.value[1]; break; case CC_MODWHEEL: this->synth->getTimbre(timbre)->setMatrixSource(MATRIX_SOURCE_MODWHEEL, INV127 * midiEvent.value[1]); break; case CC_BREATH: this->synth->getTimbre(timbre)->setMatrixSource(MATRIX_SOURCE_BREATH, INV127 * midiEvent.value[1]); break; case CC_ALL_NOTES_OFF: this->synth->allNoteOff(timbre); break; case CC_ALL_SOUND_OFF: this->synth->allSoundOff(timbre); break; case CC_HOLD_PEDAL: this->synth->setHoldPedal(timbre, midiEvent.value[1]); break; case CC_VOLUME: this->synth->setMidiVolume(timbre, midiEvent.value[1]); break; case CC_PAN: this->synth->setMidiPan(timbre, midiEvent.value[1]); break; case CC_OMNI_OFF: // Omni on && omni OFF only accepted on original bas channel if (this->synthState->fullState.midiConfigValue[MIDICONFIG_CHANNEL1 + timbre] == midiEvent.channel ) { this->synth->allNoteOff(timbre); omniOn[timbre] = false; } break; case CC_OMNI_ON: // Omni on && omni OFF only accepted on original bas channel if (this->synthState->fullState.midiConfigValue[MIDICONFIG_CHANNEL1 + timbre] == midiEvent.channel ) { this->synth->allNoteOff(timbre); omniOn[timbre] = true; } break; case CC_RESET: this->synth->allNoteOff(timbre); this->runningStatus = 0; this->songPosition = 0; break; } // Receive CC enabled? if (receives & 0x01) { switch (midiEvent.value[0]) { case CC_ALGO: this->synth->setNewValueFromMidi(timbre, ROW_ENGINE, ENCODER_ENGINE_ALGO, (float)midiEvent.value[1]); break; case CC_IM1: case CC_IM2: this->synth->setNewValueFromMidi(timbre, ROW_MODULATION1, ENCODER_ENGINE_IM1 + (midiEvent.value[0] - CC_IM1) * 2, (float)midiEvent.value[1] * .1f); break; case CC_IM3: case CC_IM4: this->synth->setNewValueFromMidi(timbre, ROW_MODULATION2, ENCODER_ENGINE_IM3 + (midiEvent.value[0] - CC_IM3) *2, (float)midiEvent.value[1] * .1f); break; case CC_IM5: this->synth->setNewValueFromMidi(timbre, ROW_MODULATION3, ENCODER_ENGINE_IM5 + (midiEvent.value[0] - CC_IM5), (float)midiEvent.value[1] * .1f); break; case CC_MIX1: case CC_MIX2: this->synth->setNewValueFromMidi(timbre, ROW_OSC_MIX1, ENCODER_ENGINE_MIX1 + (midiEvent.value[0] - CC_MIX1), (float)midiEvent.value[1] * .00787401574803149606f); break; case CC_MIX3: case CC_MIX4: this->synth->setNewValueFromMidi(timbre, ROW_OSC_MIX2, ENCODER_ENGINE_MIX3 + (midiEvent.value[0] - CC_MIX3), (float)midiEvent.value[1] * .00787401574803149606f); break; case CC_PAN1: case CC_PAN2: this->synth->setNewValueFromMidi(timbre, ROW_OSC_MIX1, ENCODER_ENGINE_PAN1 + (midiEvent.value[0] - CC_PAN1), (float)midiEvent.value[1] * .00787401574803149606f * 2.0f - 1.0f); break; case CC_PAN3: case CC_PAN4: this->synth->setNewValueFromMidi(timbre, ROW_OSC_MIX2, ENCODER_ENGINE_PAN3 + (midiEvent.value[0] - CC_PAN3), (float)midiEvent.value[1] * .00787401574803149606f * 2.0f - 1.0f); break; case CC_OSC1_FREQ: case CC_OSC2_FREQ: case CC_OSC3_FREQ: case CC_OSC4_FREQ: case CC_OSC5_FREQ: case CC_OSC6_FREQ: this->synth->setNewValueFromMidi(timbre, ROW_OSC1 + midiEvent.value[0] - CC_OSC1_FREQ , ENCODER_OSC_FREQ, (float) midiEvent.value[1] * .0833333333333333f); break; case CC_MATRIXROW1_MUL: case CC_MATRIXROW2_MUL: case CC_MATRIXROW3_MUL: case CC_MATRIXROW4_MUL: // cc.value[1] = newValue * 5.0f + 50.1f; this->synth->setNewValueFromMidi(timbre, ROW_MATRIX1 + midiEvent.value[0] - CC_MATRIXROW1_MUL, ENCODER_MATRIX_MUL, (float) midiEvent.value[1] * .2f - 10.0f); break; case CC_LFO1_FREQ: case CC_LFO2_FREQ: case CC_LFO3_FREQ: // cc.value[1] = newValue * 5.0f + .1f; this->synth->setNewValueFromMidi(timbre, ROW_LFOOSC1 + midiEvent.value[0] - CC_LFO1_FREQ, ENCODER_LFO_FREQ, (float) midiEvent.value[1] *.2f); break; case CC_LFO_ENV2_SILENCE: this->synth->setNewValueFromMidi(timbre, ROW_LFOENV2, ENCODER_LFO_ENV2_SILENCE, (float) midiEvent.value[1] * .125f); break; case CC_STEPSEQ5_GATE: case CC_STEPSEQ6_GATE: // cc.value[1] = newValue * 100.0f + .1f; this->synth->setNewValueFromMidi(timbre, ROW_LFOSEQ1 + midiEvent.value[0] - CC_STEPSEQ5_GATE, ENCODER_STEPSEQ_GATE, (float)midiEvent.value[1] * .01f); break; case CC_MATRIX_SOURCE_CC1: case CC_MATRIX_SOURCE_CC2: case CC_MATRIX_SOURCE_CC3: case CC_MATRIX_SOURCE_CC4: // cc.value[1] = newValue * 5.0f + 50.1f; this->synth->setNewValueFromMidi(timbre, ROW_PERFORMANCE1, midiEvent.value[0] - CC_MATRIX_SOURCE_CC1, (float)(midiEvent.value[1] -64) * INV127 * 2.0 ); break; break; case CC_FILTER_TYPE: this->synth->setNewValueFromMidi(timbre, ROW_EFFECT, ENCODER_EFFECT_TYPE, (float)midiEvent.value[1]); break; case CC_FILTER_PARAM1: case CC_FILTER_PARAM2: case CC_FILTER_GAIN: this->synth->setNewValueFromMidi(timbre, ROW_EFFECT, midiEvent.value[0] - CC_FILTER_PARAM1 + 1, (float)midiEvent.value[1] * .01f); break; case CC_ENV_ATK_OP1: case CC_ENV_ATK_OP2: case CC_ENV_ATK_OP3: case CC_ENV_ATK_OP4: case CC_ENV_ATK_OP5: case CC_ENV_ATK_OP6: this->synth->setNewValueFromMidi(timbre, ROW_ENV1a + (midiEvent.value[0] - CC_ENV_ATK_OP1)* 2, ENCODER_ENV_A, (float)midiEvent.value[1] * .01562500000000000000f); break; case CC_ENV_ATK_ALL: for (int e = 0; e < 6; e++) { this->synth->setNewValueFromMidi(timbre, ROW_ENV1a + e * 2, ENCODER_ENV_A, (float)midiEvent.value[1] * .01562500000000000000f); } break; case CC_ENV_REL_OP1: case CC_ENV_REL_OP2: case CC_ENV_REL_OP3: case CC_ENV_REL_OP4: case CC_ENV_REL_OP5: case CC_ENV_REL_OP6: this->synth->setNewValueFromMidi(timbre, ROW_ENV1b + (midiEvent.value[0] - CC_ENV_REL_OP1)* 2, ENCODER_ENV_R, (float)midiEvent.value[1] * .03125000000000000000f); break; case CC_ENV_REL_ALL: for (int e = 0; e < 6; e++) { this->synth->setNewValueFromMidi(timbre, ROW_ENV1b + e * 2, ENCODER_ENV_R, (float)midiEvent.value[1] * .03125000000000000000f); } break; case CC_LFO1_PHASE: case CC_LFO2_PHASE: case CC_LFO3_PHASE: this->synth->setNewValueFromMidi(timbre, ROW_LFOPHASES, ENCODER_LFO_PHASE1 + midiEvent.value[0] - CC_LFO1_PHASE, (float)midiEvent.value[1] * .01f); break; case CC_LFO1_BIAS: case CC_LFO2_BIAS: case CC_LFO3_BIAS: this->synth->setNewValueFromMidi(timbre, ROW_LFOOSC1 + midiEvent.value[0] - CC_LFO1_BIAS, ENCODER_LFO_BIAS, (float)midiEvent.value[1] * .01f); break; case CC_LFO1_SHAPE: case CC_LFO2_SHAPE: case CC_LFO3_SHAPE: this->synth->setNewValueFromMidi(timbre, ROW_LFOOSC1 + midiEvent.value[0] - CC_LFO1_SHAPE, ENCODER_LFO_SHAPE, (float)midiEvent.value[1]); break; case CC_ARP_CLOCK: this->synth->setNewValueFromMidi(timbre, ROW_ARPEGGIATOR1, ENCODER_ARPEGGIATOR_CLOCK, (float)midiEvent.value[1]); break; case CC_ARP_DIRECTION: this->synth->setNewValueFromMidi(timbre, ROW_ARPEGGIATOR1, ENCODER_ARPEGGIATOR_DIRECTION, (float)midiEvent.value[1]); break; case CC_ARP_OCTAVE: this->synth->setNewValueFromMidi(timbre, ROW_ARPEGGIATOR1, ENCODER_ARPEGGIATOR_OCTAVE, (float)midiEvent.value[1]); break; case CC_ARP_PATTERN: this->synth->setNewValueFromMidi(timbre, ROW_ARPEGGIATOR2, ENCODER_ARPEGGIATOR_PATTERN, (float)midiEvent.value[1]); break; case CC_ARP_DIVISION: this->synth->setNewValueFromMidi(timbre, ROW_ARPEGGIATOR2, ENCODER_ARPEGGIATOR_DIVISION, (float)midiEvent.value[1]); break; case CC_ARP_DURATION: this->synth->setNewValueFromMidi(timbre, ROW_ARPEGGIATOR2, ENCODER_ARPEGGIATOR_DURATION, (float)midiEvent.value[1]); break; } } // Do we accept NRPN in the menu if (receives & 0x02) { switch (midiEvent.value[0]) { case 99: this->currentNrpn[timbre].paramMSB = midiEvent.value[1]; break; case 98: this->currentNrpn[timbre].paramLSB = midiEvent.value[1]; break; case 6: this->currentNrpn[timbre].valueMSB = midiEvent.value[1]; break; case 38: this->currentNrpn[timbre].valueLSB = midiEvent.value[1]; this->currentNrpn[timbre].readyToSend = true; break; case 96: // nrpn increment if (this->currentNrpn[timbre].valueLSB == 127) { this->currentNrpn[timbre].valueLSB = 0; this->currentNrpn[timbre].valueMSB ++; } else { this->currentNrpn[timbre].valueLSB ++; } this->currentNrpn[timbre].readyToSend = true; break; case 97: // nrpn decremenet if (this->currentNrpn[timbre].valueLSB == 0) { this->currentNrpn[timbre].valueLSB = 127; this->currentNrpn[timbre].valueMSB --; } else { this->currentNrpn[timbre].valueLSB --; } this->currentNrpn[timbre].readyToSend = true; break; default: break; } if (this->currentNrpn[timbre].readyToSend) { decodeNrpn(timbre); this->currentNrpn[timbre].readyToSend = false; } } }
void MidiDecoder::controlChange(int timbre, MidiEvent& midiEvent) { int receives = this->synthState->fullState.midiConfigValue[MIDICONFIG_RECEIVES] ; // the following one should always been received... switch (midiEvent.value[0]) { case CC_BANK_SELECT: bankNumber[timbre] = midiEvent.value[1]; break; case CC_BANK_SELECT_LSB: bankNumberLSB[timbre] = midiEvent.value[1]; break; case CC_MODWHEEL: this->synth->getTimbre(timbre)->setMatrixSource(MATRIX_SOURCE_MODWHEEL, INV127 * midiEvent.value[1]); break; case CC_ALL_NOTES_OFF: this->synth->allNoteOff(timbre); break; case CC_ALL_SOUND_OFF: this->synth->allSoundOff(timbre); break; case CC_HOLD_PEDAL: this->synth->setHoldPedal(timbre, midiEvent.value[1]); break; case CC_OMNI_OFF: // Omni on && omni OFF only accepted on original bas channel if (this->synthState->fullState.midiConfigValue[MIDICONFIG_CHANNEL1 + timbre] == midiEvent.channel ) { this->synth->allNoteOff(timbre); omniOn[timbre] = false; } break; case CC_OMNI_ON: // Omni on && omni OFF only accepted on original bas channel if (this->synthState->fullState.midiConfigValue[MIDICONFIG_CHANNEL1 + timbre] == midiEvent.channel ) { this->synth->allNoteOff(timbre); omniOn[timbre] = true; } break; case CC_RESET: this->synth->allNoteOff(timbre); this->runningStatus = 0; this->songPosition = 0; break; } if (receives == 1 || receives ==3) { switch (midiEvent.value[0]) { case CC_ALGO: this->synth->setNewValueFromMidi(timbre, ROW_ENGINE, ENCODER_ENGINE_ALGO, (float)midiEvent.value[1]); break; case CC_IM1: case CC_IM2: this->synth->setNewValueFromMidi(timbre, ROW_MODULATION1, ENCODER_ENGINE_IM1 + (midiEvent.value[0] - CC_IM1) * 2, (float)midiEvent.value[1] * .1f); break; case CC_IM3: case CC_IM4: this->synth->setNewValueFromMidi(timbre, ROW_MODULATION2, ENCODER_ENGINE_IM3 + (midiEvent.value[0] - CC_IM3) *2, (float)midiEvent.value[1] * .1f); break; case CC_IM5: this->synth->setNewValueFromMidi(timbre, ROW_MODULATION3, ENCODER_ENGINE_IM5 + (midiEvent.value[0] - CC_IM5), (float)midiEvent.value[1] * .1f); break; case CC_MIX1: case CC_MIX2: this->synth->setNewValueFromMidi(timbre, ROW_OSC_MIX1, ENCODER_ENGINE_MIX1 + (midiEvent.value[0] - CC_MIX1), (float)midiEvent.value[1] * .00787401574803149606f); break; case CC_MIX3: case CC_MIX4: this->synth->setNewValueFromMidi(timbre, ROW_OSC_MIX2, ENCODER_ENGINE_MIX3 + (midiEvent.value[0] - CC_MIX3), (float)midiEvent.value[1] * .00787401574803149606f); break; case CC_PAN1: case CC_PAN2: this->synth->setNewValueFromMidi(timbre, ROW_OSC_MIX1, ENCODER_ENGINE_PAN1 + (midiEvent.value[0] - CC_PAN1), (float)midiEvent.value[1] * .00787401574803149606f * 2.0f - 1.0f); break; case CC_PAN3: case CC_PAN4: this->synth->setNewValueFromMidi(timbre, ROW_OSC_MIX2, ENCODER_ENGINE_PAN3 + (midiEvent.value[0] - CC_PAN3), (float)midiEvent.value[1] * .00787401574803149606f * 2.0f - 1.0f); break; case CC_OSC1_FREQ: case CC_OSC2_FREQ: case CC_OSC3_FREQ: case CC_OSC4_FREQ: case CC_OSC5_FREQ: case CC_OSC6_FREQ: this->synth->setNewValueFromMidi(timbre, ROW_OSC1 + midiEvent.value[0] - CC_OSC1_FREQ , ENCODER_OSC_FREQ, (float) midiEvent.value[1] * .0833333333333333f); break; case CC_MATRIXROW1_MUL: case CC_MATRIXROW2_MUL: case CC_MATRIXROW3_MUL: case CC_MATRIXROW4_MUL: // cc.value[1] = newValue * 5.0f + 50.1f; this->synth->setNewValueFromMidi(timbre, ROW_MATRIX1 + midiEvent.value[0] - CC_MATRIXROW1_MUL, ENCODER_MATRIX_MUL, (float) midiEvent.value[1] * .2f - 10.0f); break; case CC_LFO1_FREQ: case CC_LFO2_FREQ: case CC_LFO3_FREQ: // cc.value[1] = newValue * 5.0f + .1f; this->synth->setNewValueFromMidi(timbre, ROW_LFOOSC1 + midiEvent.value[0] - CC_LFO1_FREQ, ENCODER_LFO_FREQ, (float) midiEvent.value[1] *.2f); break; case CC_LFO_ENV2_SILENCE: this->synth->setNewValueFromMidi(timbre, ROW_LFOENV2, ENCODER_LFO_ENV2_SILENCE, (float) midiEvent.value[1] * .125f); break; case CC_STEPSEQ5_GATE: case CC_STEPSEQ6_GATE: // cc.value[1] = newValue * 100.0f + .1f; this->synth->setNewValueFromMidi(timbre, ROW_LFOSEQ1 + midiEvent.value[0] - CC_STEPSEQ5_GATE, ENCODER_STEPSEQ_GATE, (float)midiEvent.value[1] * .01f); break; case CC_MATRIX_SOURCE_CC1: case CC_MATRIX_SOURCE_CC2: case CC_MATRIX_SOURCE_CC3: case CC_MATRIX_SOURCE_CC4: // cc.value[1] = newValue * 5.0f + 50.1f; this->synth->setNewValueFromMidi(timbre, ROW_PERFORMANCE1, midiEvent.value[0] - CC_MATRIX_SOURCE_CC1, (float)(midiEvent.value[1] -64) * INV127 * 2.0 ); break; break; } } // Do we accept NRPN in the menu if (receives == 2 || receives ==3) { switch (midiEvent.value[0]) { case 99: this->currentNrpn[timbre].paramMSB = midiEvent.value[1]; break; case 98: this->currentNrpn[timbre].paramLSB = midiEvent.value[1]; break; case 6: this->currentNrpn[timbre].valueMSB = midiEvent.value[1]; break; case 38: this->currentNrpn[timbre].valueLSB = midiEvent.value[1]; this->currentNrpn[timbre].readyToSend = true; break; case 96: // nrpn increment if (this->currentNrpn[timbre].valueLSB == 127) { this->currentNrpn[timbre].valueLSB = 0; this->currentNrpn[timbre].valueMSB ++; } else { this->currentNrpn[timbre].valueLSB ++; } this->currentNrpn[timbre].readyToSend = true; break; case 97: // nrpn decremenet if (this->currentNrpn[timbre].valueLSB == 0) { this->currentNrpn[timbre].valueLSB = 127; this->currentNrpn[timbre].valueMSB --; } else { this->currentNrpn[timbre].valueLSB --; } this->currentNrpn[timbre].readyToSend = true; break; default: break; } if (this->currentNrpn[timbre].readyToSend) { decodeNrpn(timbre); this->currentNrpn[timbre].readyToSend = false; } } }