@@ -148,32 +148,58 @@ const MidiTransFnVector_t MidiTransFnVector[FN_TRANSPIPE_VECTOR_SIZE] = {
148
148
// -----------------------------------------------------------------------------------------------
149
149
// | PipeID | par1 | par2 | par3 | par4 |
150
150
// |---------+--------------------+--------------------+--------------------+--------------------|
151
- // | MSGFLTR | inclusive | bits mask. | 00 (unused) | 00 (unused) |
152
- // | 00 | filter:0 | ch voice:0001 (1) | | |
151
+ // | MSGFLTR | include:0 | bits mask. | 00 (unused) | 00 (unused) |
152
+ // | 00 | exclude:1 | ch voice:0001 (1) | | |
153
153
// | | | Sys.cmn :0010 (2) | | |
154
154
// | | | realtime:0100 (4) | | |
155
155
// | | | sysex :1000 (8) | | |
156
- // | | MidiStatus | include:0 | status1:80-FF | status2:80-FF |
157
- // | | dble filter:1 | exclude:1 |(sysex not allowed) | if unused:0 |
156
+ // | | | | | |
157
+ // | | MidiStatus | include:0 | midi status id1** OR midi status id2 |
158
+ // | | dble filter:2 | exclude:1 | | if par4 unused:0 |
159
+ // | | | | (see Midi status ids table for values) |
158
160
// -----------------------------------------------------------------------------------------------
161
+ // --------------------------------
162
+ // | ** Midi status ids table |
163
+ // |------------------------------|
164
+ // | noteOffStatus | 0X08 |
165
+ // | noteOnStatus | 0X09 |
166
+ // | polyKeyPressureStatus | 0X0A |
167
+ // | controlChangeStatus | 0X0B |
168
+ // | programChangeStatus | 0X0C |
169
+ // | channelPressureStatus | 0X0D |
170
+ // | pitchBendStatus | 0X0E |
171
+ // | midiTimeCodeStatus | 0X11 |
172
+ // | songPosPointerStatus | 0X12 |
173
+ // | songSelectStatus | 0X13 |
174
+ // | tuneRequestStatus | 0X16 |
175
+ // | timingClockStatus | 0X18 |
176
+ // | startStatus | 0X1A |
177
+ // | continueStatus | 0X1B |
178
+ // | stopStatus | 0X1C |
179
+ // | activeSensingStatus | 0X1E |
180
+ // | systemResetStatus | 0X1F |
181
+ // --------------------------------
159
182
boolean MidiTransFn_MessageFilter_CheckParms (transPipe_t * pipe )
160
183
{
161
184
if ( pipe -> par1 > 1 ) return false;
162
- if ( pipe -> par1 == 0 && (pipe -> par2 == 0 || pipe -> par2 > 0B1111 ) ) return false;
163
- if ( pipe -> par1 == 1 ) {
185
+ if ( pipe -> par1 < 2 && (pipe -> par2 == 0 || pipe -> par2 > 0B1111 ) ) return false;
186
+ if ( pipe -> par1 == 2 ) {
164
187
if ( pipe -> par2 > 1 ) return false;
165
- if ( pipe -> par3 < 0x80 || (pipe -> par3 >= 0x80 && pipe -> par4 > 0 && pipe -> par4 < 0x80 ) ) return false;
166
- if ( pipe -> par3 == 0xF0 || pipe -> par3 == 0xF7 ) return false;
167
- if ( pipe -> par4 == 0xF0 || pipe -> par4 == 0xF7 ) return false;
188
+ if ( pipe -> par3 < 0x08 || pipe -> par3 > 0x1F
189
+ || pipe -> par3 == 0x10 || pipe -> par3 == 0x14 || pipe -> par3 == 0x15
190
+ || pipe -> par3 == 0x17 || pipe -> par3 == 0x19 || pipe -> par3 == 0x1D ) return false;
191
+
192
+ if ( pipe -> par4 != 0 && ( pipe -> par4 < 0x08 || pipe -> par4 > 0x1F
193
+ || pipe -> par4 == 0x10 || pipe -> par4 == 0x14 || pipe -> par4 == 0x15
194
+ || pipe -> par4 == 0x17 || pipe -> par4 == 0x19 || pipe -> par4 == 0x1D ) ) return false;
168
195
}
169
196
return true;
170
197
}
171
198
172
199
boolean MidiTransFn_MessageFilter (uint8_t portType , midiPacket_t * pk , transPipe_t * pipe )
173
200
{
174
-
175
- // Apply inclusive filter. Drop if not matching.
176
- if ( pipe -> par1 == 0 ) {
201
+ // Apply global include/exclude filter. Drop if not matching.
202
+ if ( pipe -> par1 < 2 ) {
177
203
uint8_t msgType = 0 ;
178
204
uint8_t cin = pk -> packet [0 ] & 0x0F ;
179
205
// Check if SysEx filter first and modify the msgType mask because it is a multipacket msg
@@ -183,11 +209,21 @@ boolean MidiTransFn_MessageFilter(uint8_t portType, midiPacket_t *pk, transPipe_
183
209
else
184
210
msgType = midiXparser ::getMidiStatusMsgTypeMsk (pk -> packet [1 ]); // All other msg
185
211
186
- return ( pipe -> par2 & msgType );
212
+ if ( pipe -> par2 & msgType ) {
213
+ // Include
214
+ if ( pipe -> par1 == 0 ) return true;
215
+ }
216
+ else {
217
+ // exclude
218
+ if ( pipe -> par1 == 1 ) return true;
219
+ }
220
+ return false;
221
+
187
222
}
223
+
188
224
// Midi Status double filter
189
- else if ( pipe -> par1 == 1 ) {
190
- uint8_t midiStatus = pk -> packet [1 ] & 0xF0 ;
225
+ else if ( pipe -> par1 == 2 ) {
226
+ uint8_t midiStatus = ( pk -> packet [1 ] >= 0xF0 ? pk -> packet [ 1 ] - 0xE0 : pk -> packet [ 1 ]>> 4 ) ;
191
227
if ( midiStatus == pipe -> par3 || midiStatus == pipe -> par4 )
192
228
return (pipe -> par2 == 0 ? true : false ); //Keep or drop...
193
229
else return true;
0 commit comments