FWIW, I built a MidiFX plugin to work around the problem until it gets fixed. Below is my script you can feel free to copy and paste into your Midi Scripter and save in LogicX/Mainstage 3 until Arturia fixes the bug.
The workaround basically intercepts the sustain pedal sends and tracks which notes you're playing and does not transmit the noteOff messages until you release the pedal. Depending on the patch you're using you may need to tweak your release values to get the desired effect. The only value you really need to tweak is the topmost variable where you specify your sustain polarity value. It'll either be 0 or 127. 127 is normal polarity for a sustain pedal that is depressed. Hope this helps some of you.
/*
Copyright 2014 - James Ely
Sustain Fixer MidiFX - v 1.0
Feel free to use this script as a work around for your Arturia V-Synths that do not obey
proper sustain pedal inputs in Mainstage 3 until Arturia fixes their V-synths to work correctly.
This script is provided AS IS with no guarantee that it will work for your particular situation.
If you rig starts spewing stuck notes out in the middle of a set, I am not responsible!
I've noticed with this script that the "note stealing" the Prophet VS does can sometimes freak
out and you start hearing popping noises from the V-Synth's channel until you go into the UI of
the Prophet VS and reset the voice number for the patch. This script could be expanded to
only allow it to store the required number of notes for your polyphony settings in your Arturia
V-Synth but I didn't do so to prevent the script from being too complex, and because I didn't
need it in my particular case.
This script may not be repackaged or sold without my consent. It is free for your use in your
setup as you see fit. Hope this helps some of you out there.
*/
// Sustain polarity
// Specify the value that indicates your sustain pedal is on.
// (usually 127 for normal polarity or 0 for reverse polarity)
var sustainPolarity = 127;
// Nothing below this line should need to be edited unless you are modifying the script.
var activeNotes = [];
var sustainToggle = false;
var record, a;
var objNoteOff;
function HandleMIDI(event)
{
// When a note on is received store the value in the activeNotes array and send it
if (event instanceof NoteOn) {
// If the new note on already exists in the activeNotes array. Stop the old instance and add the new note
for (a in activeNotes) {
if (activeNotes[a].originalPitch == event.pitch) {
objNoteOff = new NoteOff();
objNoteOff.pitch = activeNotes[a].originalPitch;
objNoteOff.send();
// Remove the note event from the inactive notes array
activeNotes.splice(a,1);
}
}
// Store a copy of the new note pitch in activeNotes, register it as active and send it
record = {originalPitch:event.pitch, noteState:'a'};
event.send();
activeNotes.push(record);
}
// If the message is a NoteOff see if sustain is still pressed
else if (event instanceof NoteOff) {
// If sustain is not pressed, send the NoteOff message directly out and remove event from array
if (sustainToggle == false) {
event.send();
for (a in activeNotes) {
if (activeNotes[a].originalPitch == event.pitch) {
// Remove the note event from the inactive notes array
activeNotes.splice(a,1);
}
}
}
// If sustain is pressed, register the note as inactive
else {
for (a in activeNotes) {
if (activeNotes[a].originalPitch == event.pitch && activeNotes[a].noteState == 'a') {
activeNotes[a].noteState='i';
}
}
}
}
// If a control change for sustain is received set the sustainToggle accordingly
else if (event instanceof ControlChange && event.number == 64) {
if (event.value == sustainPolarity) {
sustainToggle = true;
}
else {
sustainToggle = false;
// Send NoteOff to all inactive notes when the sustain pedal is released
for (a=0; a<activeNotes.length; a++) {
if (activeNotes[a].noteState == 'i') {
objNoteOff = new NoteOff();
objNoteOff.pitch = activeNotes[a].originalPitch;
objNoteOff.send();
activeNotes.splice(a,1);
a = a-1;
}
}
}
}
else {
event.send();
}
}