Skip to content

Commit e42eedd

Browse files
authored
Merge pull request #25 from TheKikGen/MIDITRANS
MGSFLTR pipe : Bug correction + new excluive bit mask filter
2 parents 3c682b5 + dde83ea commit e42eedd

File tree

3 files changed

+81
-21
lines changed

3 files changed

+81
-21
lines changed

UMK-4X4-SYSEX-IPL.TXT

+30-6
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ F0 77 77 78 06 06 F7
107107
F0 77 77 78 06 08 F7
108108

109109
06 09 Reboot in update mode
110-
F0 77 77 78 06 09 F7
110+
F0 77 77 78 06 08 F7
111111

112112
-------------------------------------------------------------------------------
113113
0B USB device settings
@@ -190,7 +190,7 @@ F0 77 77 78 11 00 00 < src slot:01-08 > < dest slot: 01-08 > F7
190190
F0 77 77 78 11 00 01 < slot: 01-08 | All slot:7F > F7
191191

192192
11 00 02 Attach/detach port to slot
193-
F0 77 77 78 11 00 02 < in port type> < in port: 0-F> <slot: 0-8> F7
193+
F0 77 77 78 11 00 02 < in port type> < in port: 0-F> <slot: 00-08> F7
194194
port type : cable = 0 | jack = 1 | virtual:2 | ithru = 3
195195
When slot = 0, the port is considered as detached from any slot.
196196

@@ -217,13 +217,15 @@ F0 77 77 78 11 01 05 <slot:1-8> <pipe index:nn> <no bypass:0 | bypass:1> F7
217217
-----------------------------------------------------------------------------------------------
218218
| PipeID | par1 | par2 | par3 | par4 |
219219
|---------+--------------------+--------------------+--------------------+--------------------|
220-
| MSGFLTR | inclusive | bits mask. | 00 (unused) | 00 (unused) |
221-
| 00 | filter:0 | ch voice:0001 (1) | | |
220+
| MSGFLTR | include:0 | bits mask. | 00 (unused) | 00 (unused) |
221+
| 00 | exclude:1 | ch voice:0001 (1) | | |
222222
| | | Sys.cmn :0010 (2) | | |
223223
| | | realtime:0100 (4) | | |
224224
| | | sysex :1000 (8) | | |
225-
| | MidiStatus | include:0 | status1:80-FF OR status2:80-FF |
226-
| | dble filter:1 | exclude:1 | (sysex not allowed)| if par4 unused:0 |
225+
| | | | | |
226+
| | MidiStatus | include:0 | midi status id1 OR midi status id2 |
227+
| | dble filter:2 | exclude:1 | | if par4 unused:0 |
228+
| | | | (see Midi status ids table for values) |
227229
|---------+--------------------+--------------------+--------------------+--------------------|
228230
| NOTECHG | transpose+:0 | semitone:00-7F | 00 (unused) | 00 (unused) |
229231
| 01 | transpose-:1 | semitone:00-7F | 00 (unused) | 00 (unused) |
@@ -265,3 +267,25 @@ F0 77 77 78 11 01 05 <slot:1-8> <pipe index:nn> <no bypass:0 | bypass:1> F7
265267
| | | | add:2 | value:0-7F |
266268
| | | | sub:3 | value:0-7F |
267269
-----------------------------------------------------------------------------------------------
270+
271+
--------------------------------
272+
| Midi status ids table |
273+
|------------------------------|
274+
| noteOffStatus | 0X08 |
275+
| noteOnStatus | 0X09 |
276+
| polyKeyPressureStatus | 0X0A |
277+
| controlChangeStatus | 0X0B |
278+
| programChangeStatus | 0X0C |
279+
| channelPressureStatus | 0X0D |
280+
| pitchBendStatus | 0X0E |
281+
| midiTimeCodeStatus | 0X11 |
282+
| songPosPointerStatus | 0X12 |
283+
| songSelectStatus | 0X13 |
284+
| tuneRequestStatus | 0X16 |
285+
| timingClockStatus | 0X18 |
286+
| startStatus | 0X1A |
287+
| continueStatus | 0X1B |
288+
| stopStatus | 0X1C |
289+
| activeSensingStatus | 0X1E |
290+
| systemResetStatus | 0X1F |
291+
--------------------------------

bin/umk4x4.stm32f103cb-128k-o3.bin

-32 Bytes
Binary file not shown.

mod_miditransfn_pipes.h

+51-15
Original file line numberDiff line numberDiff line change
@@ -148,32 +148,58 @@ const MidiTransFnVector_t MidiTransFnVector[FN_TRANSPIPE_VECTOR_SIZE] = {
148148
// -----------------------------------------------------------------------------------------------
149149
// | PipeID | par1 | par2 | par3 | par4 |
150150
// |---------+--------------------+--------------------+--------------------+--------------------|
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) | | |
153153
// | | | Sys.cmn :0010 (2) | | |
154154
// | | | realtime:0100 (4) | | |
155155
// | | | 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) |
158160
// -----------------------------------------------------------------------------------------------
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+
// --------------------------------
159182
boolean MidiTransFn_MessageFilter_CheckParms(transPipe_t *pipe)
160183
{
161184
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 ) {
164187
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;
168195
}
169196
return true;
170197
}
171198

172199
boolean MidiTransFn_MessageFilter(uint8_t portType, midiPacket_t *pk, transPipe_t *pipe)
173200
{
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 ) {
177203
uint8_t msgType = 0;
178204
uint8_t cin = pk->packet[0] & 0x0F ;
179205
// 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_
183209
else
184210
msgType = midiXparser::getMidiStatusMsgTypeMsk(pk->packet[1]); // All other msg
185211

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+
187222
}
223+
188224
// 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 ) ;
191227
if ( midiStatus == pipe->par3 || midiStatus == pipe->par4 )
192228
return (pipe->par2 == 0 ? true : false ); //Keep or drop...
193229
else return true;

0 commit comments

Comments
 (0)