void MidiBlackKeyFilter::processMidiEvents (VstMidiEventVec *inputs, VstMidiEventVec *outputs, VstInt32 sampleFrames) { const int listenchannel = FLOAT_TO_CHANNEL(param[kInChannel]); int BlackChannel = FLOAT_TO_CHANNEL(param[kBlackChannel]); int WhiteChannel = FLOAT_TO_CHANNEL(param[kWhiteChannel]); // process incoming events for (unsigned int i=0;i<inputs[0].size();i++) { //copying event "i" from input (with all its fields) VstMidiEvent tomod = inputs[0][i]; unsigned int status = tomod.midiData[0] & 0xf0; // scraping channel const int channel = tomod.midiData[0] & 0x0f; // isolating channel const int data1 = tomod.midiData[1] & 0x7f; const int data2 = tomod.midiData[2] & 0x7f; // make zero-velocity noteons look like "real" noteoffs if (status==MIDI_NOTEON && data2==0) status=MIDI_NOTEOFF; if (channel == listenchannel || listenchannel == -1) { if (status == MIDI_NOTEON) { if (isBlackKey(data1)) { if (BlackChannel==ANY_CHANNEL) BlackChannel = channel; tomod.midiData[0] = MIDI_NOTEON | BlackChannel; tomod.midiData[2] = midiLimit(roundToInt((float)data2 * 2.f * param[kBlackVelocity])); } else { if (WhiteChannel==ANY_CHANNEL) WhiteChannel = channel; tomod.midiData[0] = MIDI_NOTEON | WhiteChannel; tomod.midiData[2] = midiLimit(roundToInt((float)data2 * 2.f * param[kWhiteVelocity])); } if (tomod.midiData[2]>0) playingOnChannel[data1][channel] = tomod.midiData[0]&0x0f; } else if (status == MIDI_NOTEOFF) { if (isBlackKey(data1)) { if (BlackChannel==ANY_CHANNEL) BlackChannel = channel; tomod.midiData[0] = MIDI_NOTEOFF | BlackChannel; } else { if (WhiteChannel==ANY_CHANNEL) WhiteChannel = channel; tomod.midiData[0] = MIDI_NOTEOFF | WhiteChannel; } playingOnChannel[data1][channel] = -1; } } outputs[0].push_back(tomod); } }
//have fun modifying this one! void MidiGain::processMidiEvents (VstMidiEventVec *inputs, VstMidiEventVec *outputs) { // process incoming events VstMidiEventVec::iterator it; for (it=inputs[0].begin(); it<inputs[0].end(); it++) { const int status = it->midiData[0] & 0xf0; // scraping channel const int channel = it->midiData[0] & 0x0f; // isolating channel (0-15) const int data1 = it->midiData[1] & 0x7f; // note/cc number, etc const int data2 = it->midiData[2] & 0x7f; // velocity/cc value, etc if (isNoteOn(*it)) { int newVelocity = roundToInt(2.f * param[kGain] * (float)data2); it->midiData[2] = midiLimit(newVelocity); } outputs[0].push_back(*it); } }
void MidiKeySplit4::processMidiEvents(VstMidiEventVec *inputs, VstMidiEventVec *outputs, VstInt32 sampleFrames) { const char ch = FLOAT_TO_CHANNEL015(param[kInChannel]); signed char ch1 = FLOAT_TO_CHANNEL(param[kOutChannel1]); signed char ch2 = FLOAT_TO_CHANNEL(param[kOutChannel2]); signed char ch3 = FLOAT_TO_CHANNEL(param[kOutChannel3]); signed char ch4 = FLOAT_TO_CHANNEL(param[kOutChannel4]); const char split1 = FLOAT_TO_MIDI_X(param[kSplit1]); const char split2 = FLOAT_TO_MIDI_X(param[kSplit2]); const char split3 = FLOAT_TO_MIDI_X(param[kSplit3]); const char transp1 = roundToInt(96.f*param[kTransp1])-48; const char transp2 = roundToInt(96.f*param[kTransp2])-48; const char transp3 = roundToInt(96.f*param[kTransp3])-48; const char transp4 = roundToInt(96.f*param[kTransp4])-48; // process incoming events for (unsigned int i=0;i<inputs[0].size();i++) { //copying event "i" from input (with all its fields) VstMidiEvent tomod = inputs[0][i]; int status = tomod.midiData[0] & 0xf0; // scraping channel int channel = tomod.midiData[0] & 0x0f; // isolating channel int data1 = tomod.midiData[1] & 0x7f; int data2 = tomod.midiData[2] & 0x7f; if (status==MIDI_NOTEON && data2==0) status=MIDI_NOTEOFF; if (ch1==-1) ch1=channel; if (ch2==-1) ch2=channel; if (ch3==-1) ch3=channel; if (ch4==-1) ch4=channel; if (channel==ch) { if (status==MIDI_NOTEON) { if (split1==learn) { setParameterAutomated(kSplit1,MIDI_TO_FLOAT_X(data1)); } if (split2==learn) { setParameterAutomated(kSplit2,MIDI_TO_FLOAT_X(data1)); } if (split3==learn) { setParameterAutomated(kSplit3,MIDI_TO_FLOAT_X(data1)); } if (data1<split1) { transposed[data1] = transp1; tomod.midiData[0] = status | ch1; tomod.midiData[1] = midiLimit(data1+transp1); } else if (data1<split2) { transposed[data1] = transp2; tomod.midiData[0] = status | ch2; tomod.midiData[1] = midiLimit(data1+transp2); } else if (data1<split3) { transposed[data1] = transp3; tomod.midiData[0] = status | ch3; tomod.midiData[1] = midiLimit(data1+transp3); } else { transposed[data1] = transp4; tomod.midiData[0] = status | ch4; tomod.midiData[1] = midiLimit(data1+transp4); } } else if (status==MIDI_NOTEOFF) { if (data1<split1) { tomod.midiData[0] = status | ch1; tomod.midiData[1] = midiLimit(data1+transposed[data1]); transposed[data1]=-999; } else if (data1<split2) { tomod.midiData[0] = status | ch2; tomod.midiData[1] = midiLimit(data1+transposed[data1]); transposed[data1]=-999; } else if (data1<split3) { tomod.midiData[0] = status | ch3; tomod.midiData[1] = midiLimit(data1+transposed[data1]); transposed[data1]=-999; } else { tomod.midiData[0] = status | ch4; tomod.midiData[1] = midiLimit(data1+transposed[data1]); transposed[data1]=-999; } } if (status==MIDI_POLYKEYPRESSURE) { if (data1<split1) { tomod.midiData[0] = status | ch1; tomod.midiData[1] = midiLimit(data1+transp1); } else if (data1<split2) { tomod.midiData[0] = status | ch2; tomod.midiData[1] = midiLimit(data1+transp2); } else if (data1<split3) { tomod.midiData[0] = status | ch3; tomod.midiData[1] = midiLimit(data1+transp3); } else { tomod.midiData[0] = status | ch4; tomod.midiData[1] = midiLimit(data1+transp4); } } } outputs[0].push_back(tomod); } }
int nextHenon(double alpha, double beta, double& x, double& xx) { double xxx = xx; xx = x; x = 1 + alpha * xx * xx + beta * xxx; return midiLimit((int)((x + 1.0)/2.0 * 127.0 + 0.5)); }