예제 #1
0
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;
        }
    }
}
예제 #2
0
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;
        }
    }
}