Last active
April 23, 2023 11:52
-
-
Save ryrun/f03d6e9cc340747165969b9d2feeaeaf to your computer and use it in GitHub Desktop.
Bluecat's Plug'N'Script - Midi Channel 1 Exclusive only, when playing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** \file | |
* MIDI channel filter. | |
* Filter MIDI events (keeps only MIDI events for the selected channel). | |
*/ | |
#include "lib/Midi.hxx" | |
// metadata | |
string name="MIDI Channel Special Filter"; | |
string description="Filters events of other channels (when channel 1 is used)"; | |
array<string> inputParametersNames={"Mode"}; | |
array<string> inputParametersEnums={"Ch1 Exkl;Ch1 Only;Ch1++;Off"}; | |
array<double> inputParameters(inputParametersNames.length,0); | |
array<double> inputParametersMin={0}; | |
array<double> inputParametersMax={3}; | |
array<double> inputParametersDefault={0}; | |
array<double> inputParametersSteps={1}; | |
array<MidiEvent> lateMidiIn = {}; | |
int channelOneInUse = 0; | |
int channelOtherInUse = 0; | |
uint8 notePlus = 255; | |
uint8 lastNotePlus = 255; | |
uint64 pblock = 0; | |
int8 mode = 0; | |
void reset() { | |
channelOneInUse = 0; | |
channelOtherInUse = 0; | |
notePlus = 255; | |
lastNotePlus = 255; | |
pblock = 0; | |
} | |
void processBlock(BlockData& data) { | |
array<MidiEvent> midiIn = {}; | |
string temp, temp2, temp3, temp4, temp5; | |
bool skip = false; | |
pblock++; | |
//just 1 midi event and 16 samples delay event per one process block, process it on the next process block (delayed for 16 samples) | |
if(mode == 2 && data.inputMidiEvents.length > 0 && data.inputMidiEvents.length < 3 && data.samples.length <= 16) { | |
//fill buffer | |
for(uint i=0;i<data.inputMidiEvents.length;i++) { | |
lateMidiIn.insertLast(data.inputMidiEvents[i]); | |
} | |
return; | |
} | |
//if late midi data, add this to buffer | |
if(lateMidiIn.length>0) { | |
midiIn = lateMidiIn; | |
lateMidiIn = {}; | |
} | |
//fill buffer with new events | |
for(uint i=0;i<data.inputMidiEvents.length;i++) { | |
if(MidiEventUtils::getType(data.inputMidiEvents[i]) == kMidiNoteOff || MidiEventUtils::getType(data.inputMidiEvents[i]) == kMidiNoteOn) { | |
midiIn.insertLast(data.inputMidiEvents[i]); | |
} | |
} | |
//preprocess for bass Mode | |
for(uint i=0;i<midiIn.length;i++) { | |
if(MidiEventUtils::getChannel(midiIn[i]) != 1) { | |
switch(MidiEventUtils::getType(midiIn[i])) { | |
case kMidiNoteOn: | |
notePlus = MidiEventUtils::getNote(midiIn[i]); | |
break; | |
case kMidiNoteOff: | |
notePlus = 255; | |
break; | |
} | |
} | |
} | |
//debugdata | |
intToString(mode, temp2); | |
intToString(pblock, temp3); | |
intToString(data.samples.length, temp4); | |
intToString(midiIn.length, temp5); | |
//process midi events | |
for(uint i=0;i<midiIn.length;i++) { | |
skip = false; | |
intToString(MidiEventUtils::getNote(midiIn[i]), temp); | |
switch (MidiEventUtils::getChannel(midiIn[i])) { | |
case 1: | |
switch(MidiEventUtils::getType(midiIn[i])) { | |
case kMidiNoteOn: | |
channelOneInUse ++; | |
break; | |
case kMidiNoteOff: | |
channelOneInUse --; | |
break; | |
} | |
data.outputMidiEvents.push(midiIn[i]); | |
if(mode == 2 && notePlus != 255) { | |
MidiEvent tempEv = midiIn[i]; | |
if(MidiEventUtils::getType(midiIn[i]) == kMidiNoteOn) { | |
//normal out | |
MidiEventUtils::setNote(tempEv, notePlus); | |
lastNotePlus = notePlus; | |
} else { | |
MidiEventUtils::setNote(tempEv, lastNotePlus); | |
} | |
data.outputMidiEvents.push(tempEv); | |
} | |
break; | |
default: | |
switch(MidiEventUtils::getType(midiIn[i])) { | |
case kMidiNoteOn: | |
channelOtherInUse ++; | |
break; | |
case kMidiNoteOff: | |
channelOtherInUse --; | |
break; | |
} | |
if( | |
(channelOneInUse==0 || mode == 3) && (mode != 1 && mode != 2) | |
) { | |
data.outputMidiEvents.push(midiIn[i]); | |
} else { | |
skip = true; | |
} | |
break; | |
} | |
/* | |
print( | |
(MidiEventUtils::getChannel(midiIn[i]) != 1 ? " ;" : "" ) + | |
(MidiEventUtils::getType(midiIn[i]) == kMidiNoteOn ? "Note On" : "Note Off") + | |
" " + temp + ";" + | |
(skip ? "- Skipped -":"") + | |
"Mode: " + temp2 + " --- #" + temp3 + " (" + temp4 + " samples, " + temp5 + " midi data)" | |
); | |
*/ | |
} | |
//switch mode only, hwn nothing is in process | |
if(channelOneInUse == 0 && channelOtherInUse == 0 && lateMidiIn.length == 0) { | |
mode = int8(inputParameters[0]+0.5); | |
} | |
} | |
int getLatency() { | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment