Johannes Kroll asked:
Did this patch get through? I don't see it on http://source.winehq.org/patches/ ...
It did. You looked too late in patches/. Committed patches are deleted sooner than rejected ones that are in turn deleted sooner than new/pending patches.
I'm still interested in your testing my other MIDI patches. I fact I have a queue of half a dozen patches ready for submission, except that I'd like somebody to test them with real MIDI HW.
There's another patch yet to be written: midiOutLongMessage CAN be used for coalesced non-sysex messages. This affects winealsa. Wineoss needs no change, because it simply dumps the bytes, one by one, regardless of SysEx or standard message. ALSA needs different API functions to be used. I've yet to check MacOSX CoreMIDI.
Regards, Jörg Höhle
On Mon, 11 Feb 2013 19:41:27 +0100 Joerg-Cyril.Hoehle@t-systems.com wrote:
Johannes Kroll asked:
Did this patch get through? I don't see it on http://source.winehq.org/patches/ ...
It did. You looked too late in patches/. Committed patches are deleted sooner than rejected ones that are in turn deleted sooner than new/pending patches.
Okay.
I'm still interested in your testing my other MIDI patches. I fact I have a queue of half a dozen patches ready for submission, except that I'd like somebody to test them with real MIDI HW.
There's another patch yet to be written: midiOutLongMessage CAN be used for coalesced non-sysex messages. This affects winealsa. Wineoss needs no change, because it simply dumps the bytes, one by one, regardless of SysEx or standard message. ALSA needs different API functions to be used. I've yet to check MacOSX CoreMIDI.
You asked me to test what happens when I remove the code that adds F0/F7 markers when they are missing. I changed modLongData like this:
[...] /* FIXME: MS doc is not 100% clear. Will lpData only contain system exclusive * data, or can it also contain raw MIDI data, to be split up and sent to * modShortData() ? * If the latest is true, then the following WARNing will fire up */ if (lpData[0] != 0xF0 || lpData[lpMidiHdr->dwBufferLength - 1] != 0xF7) { WARN("Alleged system exclusive buffer is not correct\n\tPlease report with MIDI file\n"); lpNewData = HeapAlloc(GetProcessHeap(), 0, lpMidiHdr->dwBufferLength + 2); } else { WARN("modLongData got SysEx message with correct F0/F7 markers.\n"); }
TRACE("dwBufferLength=%u !\n", lpMidiHdr->dwBufferLength); TRACE(" %02X %02X %02X ... %02X %02X %02X\n", lpData[0], lpData[1], lpData[2], lpData[lpMidiHdr->dwBufferLength-3], lpData[lpMidiHdr->dwBufferLength-2], lpData[lpMidiHdr->dwBufferLength-1]);
switch (MidiOutDev[wDevID].caps.wTechnology) { case MOD_FMSYNTH: /* FIXME: I don't think there is much to do here */ break; case MOD_MIDIPORT: if (lpData[0] != 0xF0) { //~ /* Send start of System Exclusive */ //~ len_add = 1; //~ lpNewData[0] = 0xF0; //~ memcpy(lpNewData + 1, lpData, lpMidiHdr->dwBufferLength); //~ WARN("Adding missing 0xF0 marker at the beginning of " //~ "system exclusive byte stream\n"); WARN("*** Not adding missing 0xF0 marker.\n"); } if (lpData[lpMidiHdr->dwBufferLength-1] != 0xF7) { //~ /* Send end of System Exclusive */ //~ if (!len_add) //~ memcpy(lpNewData, lpData, lpMidiHdr->dwBufferLength); //~ lpNewData[lpMidiHdr->dwBufferLength + len_add] = 0xF7; //~ len_add++; //~ WARN("Adding missing 0xF7 marker at the end of " //~ "system exclusive byte stream\n"); WARN("*** Not adding missing 0xF7 marker.\n"); } [...]
I then started the korg kontrol editor with the nanopad2 attached to USB. It does find the nanopad correctly, and it can receive the scene set correctly. But when I try to write the scene set, it fails with a timeout message box.
The log first indicates several SysEx message with included F0/F7 is requested to be written, this looks like this:
2.663:0031:trace:midi:modLongData (0000, 0x1cbc10, 00000040); 2.663:0031:warn:midi:modLongData modLongData got SysEx message with correct F0/F7 markers. 2.663:0031:trace:midi:modLongData dwBufferLength=6 ! 2.663:0031:trace:midi:modLongData F0 42 50 ... 00 01 F7
Then, a SysEx with start marker, but no end marker is requested to be sent (and I don't add the end marker):
17.015:003b:trace:midi:ALSA_modMessage (0005, 0008, 00008001, 001CA7A8, 00000040); 17.015:003b:trace:midi:modLongData (0005, 0x1ca7a8, 00000040); 17.015:003b:warn:midi:modLongData Alleged system exclusive buffer is not correct Please report with MIDI file 17.015:003b:trace:midi:modLongData dwBufferLength=125 ! 17.015:003b:trace:midi:modLongData F0 42 40 ... 00 00 00 17.015:003b:warn:midi:modLongData *** Not adding missing 0xF7 marker. 17.015:003b:trace:midi:modLongData client = 20 port = 0 17.015:003b:trace:midi:MIDI_NotifyClient wDevID = 0005 wMsg = 969 dwParm1 = 1CA7A8 dwParam2 = 0000 17.015:003b:trace:driver:DriverCallback (00000023, task 0002, 0x8001, 03C9, 00B28110, 001CA7A8, 00000000) 17.015:003b:trace:driver:DriverCallback Done 17.015:003b:trace:winmm:MMDRV_Message => MMSYSERR_NOERROR 17.015:0023:trace:winmm:midiOutUnprepareHeader (0x8001, 0x1ca7a8, 64) 17.015:0023:trace:winmm:MMDRV_Get (0x8001, 0003, N) 17.015:0023:trace:winmm:MMDRV_Message (MidiOut 5 6 0x00008001 0x001ca7a8 0x00000040) 17.015:0023:trace:winmm:MMDRV_Message Calling message(dev=5 msg=6 usr=0x00008001 p1=0x001ca7a8 p2=0x00000040) 17.015:0023:trace:midi:ALSA_modMessage (0005, 0006, 00008001, 001CA7A8, 00000040); 17.015:0023:trace:midi:modUnprepare (0005, 0x1ca7a8, 00000040); 17.015:0023:trace:winmm:MMDRV_Message => MMSYSERR_NOERROR 17.265:003a:trace:midi:midRecThread Thread loop 17.515:003a:trace:midi:midRecThread Thread loop 17.765:003a:trace:midi:midRecThread Thread loop 18.016:003a:trace:midi:midRecThread Thread loop 18.266:003a:trace:midi:midRecThread Thread loop 18.516:003a:trace:midi:midRecThread Thread loop 18.767:003a:trace:midi:midRecThread Thread loop 19.017:003a:trace:midi:midRecThread Thread loop 19.268:003a:trace:midi:midRecThread Thread loop 19.518:003a:trace:midi:midRecThread Thread loop 19.768:003a:trace:midi:midRecThread Thread loop 20.017:0009:trace:winmm:midiInStop (0x8000) 20.017:0009:trace:winmm:MMDRV_Get (0x8000, 0002, N) 20.017:0009:trace:winmm:MMDRV_Message (MidiIn 1 61 0x00008000 0x00000000 0x00000000) 20.017:0009:trace:winmm:MMDRV_Message Calling message(dev=1 msg=61 usr=0x00008000 p1=0x00000000 p2=0x00000000) 20.017:0009:trace:midi:ALSA_midMessage (0001, 003D, 00008000, 00000000, 00000000); 20.017:0009:trace:midi:midStop (0001); 20.017:0009:trace:winmm:MMDRV_Message => MMSYSERR_NOERROR 20.017:0009:trace:winmm:midiInReset (0x8000) 20.017:0009:trace:winmm:MMDRV_Get (0x8000, 0002, N) 20.017:0009:trace:winmm:MMDRV_Message (MidiIn 1 62 0x00008000 0x00000000 0x00000000) 20.017:0009:trace:winmm:MMDRV_Message Calling message(dev=1 msg=62 usr=0x00008000 p1=0x00000000 p2=0x00000000) 20.017:0009:trace:midi:ALSA_midMessage (0001, 003E, 00008000, 00000000, 00000000); 20.017:0009:trace:midi:midReset (0001); 20.017:0009:trace:midi:MIDI_NotifyClient wDevID = 0001 wMsg = 964 dwParm1 = B28258 dwParam2 = 4E31 20.017:0009:trace:driver:DriverCallback (00000023, task 0002, 0x8000, 03C4, 00B28110, 00B28258, 00004E31) 20.017:0009:trace:driver:DriverCallback Done 20.017:0009:trace:midi:MIDI_NotifyClient wDevID = 0001 wMsg = 964 dwParm1 = B28298 dwParam2 = 4E31 20.017:0009:trace:driver:DriverCallback (00000023, task 0002, 0x8000, 03C4, 00B28110, 00B28298, 00004E31) 20.018:0009:trace:driver:DriverCallback Done
After that, the timeout happens.
Joerg, if you want the complete log I can send it to you by PM, it's about 1.7M.
So the conclusion is that it's necessary to add the end markers if they are missing.
MSDN [1] contains this somewhat strange 'Note':
Note Any MIDI status byte other than a system-real-time message will terminate a system-exclusive message. If you are using multiple data blocks to send a single system-exclusive message, do not send any MIDI messages other than system-real-time messages between data blocks.
This could be interpreted to mean that Windows will add the 0xF7 marker, if it was missing, when any other MIDI message is sent. I don't know if that's true and I currently don't have a Windows machine to test.
[1] http://msdn.microsoft.com/en-us/library/windows/desktop/dd798657%28v=vs.85%2...