You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Two issues with incoming SysEx found by customer (with Claude assistance) in issue #1040. Forking these out here because they are not the same as the original reported issue.
Note that this is more of a stress test than an real-world scenario. The customer is asking the device to send configuration dumps in a spammy fashion. We need to investigate to find out if the device itself is causing the issues (by not queueing up the responses and just overwriting its own buffers) or it's something in Windows. Regardless, the two issues below are issues Windows needs to handle.
F0 leaks into data, corrupting the SysEx
Discovered by Claude. Note message number 618 contains the SysEx 0xF0, which is not valid SysEx data. We'll need to see if the device is sending multiple SysEx End bytes, or something else is going on there.
Claude's analysis and additional info from the customer:
@Psychlist1972 — switched the MIDI Baby Gen4 to the KS transport (Device Manager →
usbmidi2-acx). Confirmed on KS via midi list endpoints: endpoint now \?\swd#midisrv#midiu_ks_3718844848695588880_outpin.0_inpin.2#…. Re-ran the same
config-dump hammer and captured native UMP in midi.exe — 9 cycles, attached.
The KSA failure from this report does not reproduce on KS. When a block is framed
correctly it comes back byte-perfect. Block 0F 00 00 is byte-identical on 6 of 9
reads, with both non-default 0x40 parameter bytes intact, matching the Android
ground truth from the original report: F0 00 02 17 0F 00 00 01 00 …00… 11 00 …00… 40 00 …00… 09×9 40 09×6 00 …00… 01 F7
No interior SysEx7 byte drops, no 0x40 loss, no abandoned messages of the KSA kind.
So moving off the KSA aggregation path resolves the corruption described here.
However, KS surfaces a different, clearly driver-side defect: SysEx message-boundary
framing. usbmidi2-acx fails to segment back-to-back SysEx messages. Instead of
End-ing block N and Start-ing block N+1, it leaks the next block's raw 0xF0 start
byte into the current message as a data byte and continues, welding adjacent blocks
into one oversized SysEx7 stream. Example — that same 0F 00 00 read balloons to 195
bytes because it's actually 0F 00 00 + 0F 00 01 + 0F 00 02 concatenated.
This is malformed UMP on the wire, not a reassembly artifact. Raw packet, capture
index 618:
3023F000 02000000 → MT3, Group 1, SysEx7 Continue, count 3, data F0 00 02
A 0xF0 in a SysEx7 Continue data field isn't a valid 7-bit data byte, so this is
usbmidi2-acx producing invalid UMP irrespective of upstream USB timing — and the
device delimits cleanly (Android ground truth). Across the 9 cycles: 14/107
reassembled messages carry an interior 0xF0; 19 embedded F0 00 02 17 leaked-start
markers; the count of delimited messages per cycle swings 9–21 for an identical dump.
Note this isn't a version-parity comparison: KS transport DLL is 1.0.15.0 vs KSA
1.0.16.1 (SDK 1.0.17-rc.4.25 overall) — KS is the older build and still avoids the
interior-drop failure.
This boundary-framing behavior looks distinct from the KSA interior-drop this issue is
scoped to, and adjacent to #1025 (usbmidi2-acx framing/CIN). Happy to keep it here or
file it as a separate usbmidi2-acx issue with the capture — whichever you prefer for
triage. Capture attached: usbmidi2_acx_capture.txt.
Connect a class-compliant USB-MIDI 1.0 device (here: Disaster Area MIDI Baby Gen4, firmware v34). Move it to the USBMIDI2-ACX driver via device manager.
Monitor the endpoint in the Windows MIDI Services Console: midi.exe, message/UMP view, or directly via trace.
Trigger the device's full-configuration SysEx dump repeatedly. Here the dump was requested by the vendor's editor issuing config-read SysEx; each cycle begins with a Universal Identity Request/Reply (F0 7E … 06 02 …) followed by the config blocks.
Is the data from the device well-formed? TBD. The customer shared Android output from the same dumps, but that doesn't mean the data itself is "correct" coming from the device. All operating systems have to have some level of affordance for bad MIDI data.
I've contacts the MIDI Baby folks about the device.
Two issues with incoming SysEx found by customer (with Claude assistance) in issue #1040. Forking these out here because they are not the same as the original reported issue.
Note that this is more of a stress test than an real-world scenario. The customer is asking the device to send configuration dumps in a spammy fashion. We need to investigate to find out if the device itself is causing the issues (by not queueing up the responses and just overwriting its own buffers) or it's something in Windows. Regardless, the two issues below are issues Windows needs to handle.
F0 leaks into data, corrupting the SysEx
Discovered by Claude. Note message number 618 contains the SysEx 0xF0, which is not valid SysEx data. We'll need to see if the device is sending multiple SysEx End bytes, or something else is going on there.
Claude's analysis and additional info from the customer:
@Psychlist1972 — switched the MIDI Baby Gen4 to the KS transport (Device Manager →
usbmidi2-acx). Confirmed on KS via
midi list endpoints: endpoint now\?\swd#midisrv#midiu_ks_3718844848695588880_outpin.0_inpin.2#…. Re-ran the sameconfig-dump hammer and captured native UMP in
midi.exe— 9 cycles, attached.The KSA failure from this report does not reproduce on KS. When a block is framed
correctly it comes back byte-perfect. Block
0F 00 00is byte-identical on 6 of 9reads, with both non-default
0x40parameter bytes intact, matching the Androidground truth from the original report:
F0 00 02 17 0F 00 00 01 00 …00… 11 00 …00… 40 00 …00… 09×9 40 09×6 00 …00… 01 F7No interior SysEx7 byte drops, no
0x40loss, no abandoned messages of the KSA kind.So moving off the KSA aggregation path resolves the corruption described here.
However, KS surfaces a different, clearly driver-side defect: SysEx message-boundary
framing. usbmidi2-acx fails to segment back-to-back SysEx messages. Instead of
End-ing block N and Start-ing block N+1, it leaks the next block's raw
0xF0startbyte into the current message as a data byte and continues, welding adjacent blocks
into one oversized SysEx7 stream. Example — that same
0F 00 00read balloons to 195bytes because it's actually
0F 00 00+0F 00 01+0F 00 02concatenated.This is malformed UMP on the wire, not a reassembly artifact. Raw packet, capture
index 618:
A
0xF0in a SysEx7 Continue data field isn't a valid 7-bit data byte, so this isusbmidi2-acx producing invalid UMP irrespective of upstream USB timing — and the
device delimits cleanly (Android ground truth). Across the 9 cycles: 14/107
reassembled messages carry an interior
0xF0; 19 embeddedF0 00 02 17leaked-startmarkers; the count of delimited messages per cycle swings 9–21 for an identical dump.
Note this isn't a version-parity comparison: KS transport DLL is 1.0.15.0 vs KSA
1.0.16.1 (SDK 1.0.17-rc.4.25 overall) — KS is the older build and still avoids the
interior-drop failure.
This boundary-framing behavior looks distinct from the KSA interior-drop this issue is
scoped to, and adjacent to #1025 (usbmidi2-acx framing/CIN). Happy to keep it here or
file it as a separate usbmidi2-acx issue with the capture — whichever you prefer for
triage. Capture attached:
usbmidi2_acx_capture.txt.This is the device in use
https://www.disasterareadesigns.com/shop/p/midi-baby
Steps to reproduce
Unknowns:
Is the data from the device well-formed? TBD. The customer shared Android output from the same dumps, but that doesn't mean the data itself is "correct" coming from the device. All operating systems have to have some level of affordance for bad MIDI data.
I've contacts the MIDI Baby folks about the device.