asb2m10/dexed

Load voice data from the MIDI track in a DAW

Closed this issue · 5 comments

User story: As a user, I would like to put voice data into my MIDI track that is being played by Dexed in a DAW (the one that contains the notes to be played). When playing MIDI from the track, the voice data from the sysex should be loaded into the Dexed VST. My use case i that I would like to script loading voice data into Dexed inside Reaper.

Currently it seems that Dexed only accepts sysex over the MIDI device set under PARM as "MIDI In".

It would be nice if it would also accept sysex coming in from the MIDI track that is being played. Just like it plays MIDI notes, it should also load MIDI sysex. This way, MIDI notes and MIDI sysex could be saved together on the same track in the DAW. This would allow to automate (by scripting the DAW) the setup of multiple layers (tracks) in TX816 style.

image

In the picture, each of the tracks TG1...TG8 contains a sysex ("SYX") with the voice data that should be played by the Dexed instance that is on the respective track.

More information:
#352

Looks like MiniDexed also ignores sysex coming in via MIDI sends (i.e. MIDI that is being sent from one track to another; this works fine for notes but presently not for sysex).

Looking at the source, might possibly be a bug?

As per the high-level code flow in https://github.com/asb2m10/dexed/blob/b6cf2e9190e216387ad96f977284ebbef765b447/Source/PluginProcessor.cpp

  • The host VST3 application (DAW) sends MIDI events, which are then passed to the DexedAudioProcessor::processBlock() function for processing - or are they not?
  • DexedAudioProcessor::processBlock() calls DexedAudioProcessor::processMidiMessage() on each MIDI event
  • void DexedAudioProcessor::processMidiMessage() calls DexedAudioProcessor::handleIncomingMidiMessage() if it sees a sysex
  • DexedAudioProcessor::handleIncomingMidiMessage() loads the voice data from the sysex

...or at least that's how it seems intended to be, because as per my tests, it doesn't do that for whatever reason. But where is the culprit?

The same was asked in #87 if I understand it correctly. Back then, the answer was:

Dexed doesn't listen to any sysex midi message from the standard plugin midi stream: all of the DAW that I worked with flushes anything that is sysex related. It's the reason why Dexed have it's own configuration midi listener that bind to a specific hardware device to read the sysex data (and there is no JUCE API to call this)... Sorry, blame big names vsthosts :D.

Now, it seems that Reaper specifically allows sysex to be part of MIDI tracks, and it would be nice if Dexed would use them. I don't quite understand this answer, but I take it that #87 had been closed without this ever being solved?

The same was asked in #87 if I understand it correctly. Back then, the answer was:

Dexed doesn't listen to any sysex midi message from the standard plugin midi stream: all of the DAW that I worked with flushes anything that is sysex related. It's the reason why Dexed have it's own configuration midi listener that bind to a specific hardware device to read the sysex data (and there is no JUCE API to call this)... Sorry, blame big names vsthosts :D.

Now, it seems that Reaper specifically allows sysex to be part of MIDI tracks, and it would be nice if Dexed would use them. I don't quite understand this answer, but I take it that #87 had been closed without this ever being solved?

Originally, Reaper didn't support sysex from the midi track. I couldn't fix this since the DAW didn't sent anything; it was not a Dexed issue but a Reaper feature issue. The status shouldn't have been "Solved"; the "Not planned" was the right status for this issue at the time.

Afterwards Reaper did added sysex stream but I've also found another issue from JUCE 7.0.7 that duplicated the first byte of the sysex message if it came from the plugin; corrupting the midi stream.

Now on JUCE 7.0.11 everything should work out of the box. Please test this from the latest builds.

Thank you very much, works for me in 482c8cd.