BUG: ALSA snd-virmidi: snd-virmidi is not MIDI 1.0 specification compliant
snd-virmidi, as of kernel 5.4.23, does not adhere to the MIDI specification:
From MIDI 1.0 Detailed Specification, Document Version 4.2, Appendix A-
1 (RUNNING STATUS), Page A-2:
"3. Buffer is cleared when a System Exclusive or Common status message is received."
snd-virmidi does not clear the running status in case of a SysEx message.
How to test:
Load snd-virmidi module and get the card number of the module. In the following 5 is assumed as the card number and device 1 is used.
You need two shells, in shell 1 do:
aconnect 'Virtual Raw MIDI 5-1':0 'Virtual Raw MIDI 5-1':0 amidi -p hw:VirMIDI,1 -d
Now, in shell 2 do:
amidi -p hw:VirMIDI,1 -S '80 01 02 F0 01 F7 80 02 03'
This sends a note off, followed by a SysEx, followed by another note off. The result in shell 1 is:
80 01 02 F0 01 F7 02 03
So snd-virmidi did not clear the running status. The correct result would be:
80 01 02 F0 01 F7 80 02 03
On Sun, 15 Mar 2020 12:57:13 +0100, Andreas Steinmetz wrote:
snd-virmidi, as of kernel 5.4.23, does not adhere to the MIDI specification:
From MIDI 1.0 Detailed Specification, Document Version 4.2, Appendix A-
1 (RUNNING STATUS), Page A-2:
"3. Buffer is cleared when a System Exclusive or Common status message is received."
snd-virmidi does not clear the running status in case of a SysEx message.
How to test:
Load snd-virmidi module and get the card number of the module. In the following 5 is assumed as the card number and device 1 is used.
You need two shells, in shell 1 do:
aconnect 'Virtual Raw MIDI 5-1':0 'Virtual Raw MIDI 5-1':0 amidi -p hw:VirMIDI,1 -d
Now, in shell 2 do:
amidi -p hw:VirMIDI,1 -S '80 01 02 F0 01 F7 80 02 03'
This sends a note off, followed by a SysEx, followed by another note off. The result in shell 1 is:
80 01 02 F0 01 F7 02 03
So snd-virmidi did not clear the running status. The correct result would be:
80 01 02 F0 01 F7 80 02 03
Thanks for the report. Indeed it's a very old bug. The fix is simple as below.
Since there is a similar bug in OSS emulation layer, too, I'm going to submit a proper patch set including this.
Takashi
--- a/sound/core/seq/seq_virmidi.c +++ b/sound/core/seq/seq_virmidi.c @@ -81,6 +81,7 @@ static int snd_virmidi_dev_receive_event(struct snd_virmidi_dev *rdev, if ((ev->flags & SNDRV_SEQ_EVENT_LENGTH_MASK) != SNDRV_SEQ_EVENT_LENGTH_VARIABLE) continue; snd_seq_dump_var_event(ev, (snd_seq_dump_func_t)snd_rawmidi_receive, vmidi->substream); + snd_midi_event_reset_decode(vmidi->parser); } else { len = snd_midi_event_decode(vmidi->parser, msg, sizeof(msg), ev); if (len > 0)
participants (2)
-
Andreas Steinmetz
-
Takashi Iwai