I am sending filtered and transposed MIDI from some rackspaces to a globally located piano plugin. That way, I can tweak the piano sound for the entire gig with one edit.
The goal: to achieve some kind of patch persist function for the global piano. Regularly this won’t work because the note offs won’t reach the piano on Rackspace change.
Level 1 - done, but not satisfying: I inserted the following Global Rackspace Script:
var cc : ControlChangeMessage
MidiToGlobal : MidiInBlock
On Rackspace(oldRackspaceIndex, newRackspaceIndex)
cc = MakeControlChangeMessage(123, 127)
SendLater(MidiToGlobal, cc, 1000)
end
Level 2 - no idea
Instead of sending the “all notes off” to “MidiToGlobal” after 1000 ms, what could I do to send it at the first “note off” coming from a specific MIDI input after rackspace change and only if there had not been a “note on” before?
Beaus of the individual key ranges and transposes of the piano sounds.
Fair, but to my knowledge the problem persists event using a 2nd instance since the pending note offs from instance 1 will not reach instance 2 when instance 1 Rackspace is changed while holding notes.
That’s why I would like to do something (send all notes off) in a specific case (first note off after rackspace change), but only if no note on previously.
OK, after setting the correct OSC Port I got it running.
I am sending C3 from Ableton Live and can see incoming Messages in the global rackspace.
Again what learned (frei nach Lothar).
Now what is the issue?
You get having notes, right?
I’m not sending notes from Ableton, but directly from the individual rackspaces - works for me.
As you change rackspaces you will notice “all note off” commands 1000 ms after the Rackspace change.
The goad is to modify the Global Rackspace script to send an all note off to the port “MidiToGlobal” not after 1000ms, but at the first note off after Rackspace change.
One level up: stop listening for the note off as soon as there is a note off.
All what you think of needs scripting and I fear it will be a dirty hack.
Patch persist is working very well when using different rackspaces or different variation combined with a MIDI Filter plugin which filters out NOTE ON messages.
At the beginning of the post you talked about tweaking the piano sound once and in all rackspaces the sound is the same.
In my gig I cannot really reuse any sound because each Piano, E-Piano, Strings, Hammond etc
have to be sound different as the songs are different, the guitars are different.
And in my experience there is no perfect piano sound which is suitable for each song.
Oh, that might just be a little too dirty for me…
True, patch persist works well, but only if you don’t try to have it working for anything outside the Rackspace.
Well, yes, it needs to be used carefully indeed, but having some “global” sounds transposed and key range set to each individual song has worked for me for years in MainStage.
Stop playing before switching is the ideal workaround to patch persist.
Var NT : NoteTracker
NN : Integer
on NoteEvent (m : NoteMessage)
SendNow(m)
NN = GetNoteNumber(m)
if NN == C1 then
NoteTracker_StopAllPendingNotes(NT)
end
if IsNoteOn(m) then
NoteTracker_GotNoteOn(NT,NN)
end
if IsNoteOff(m) then
NoteTracker_GotNoteOff(NT,NN)
end
end
The Idea is to remember each Note On and Note Off message in a so called Note Tracker
And in my example when. C1 is played, just stop all Pending Notes.
The above example is a scriptlet code.
This could be ported to the global rackspace script to check the Note On/Off messages coming from the MIDI In
And in the on Rackspace Event just Stop the Note Tracker.
In the global rackspace I included a new widget to stop the Note Tracker.
And a sciptlet.
This widget can be synched with a local widget and whenever you activate it the Note Tracker should be stopped.
Var NT : NoteTracker
NN : Integer
SNT : Parameter 0..1 = 0
on NoteEvent (m : NoteMessage)
SendNow(m)
NN = GetNoteNumber(m)
if IsNoteOn(m) then
NoteTracker_GotNoteOn(NT,NN)
end
if IsNoteOff(m) then
NoteTracker_GotNoteOff(NT,NN)
end
end
// Called when a parameter value has changed
On ParameterValueChanged matching SNT
if SNT == 1 then
NoteTracker_StopAllPendingNotes(NT)
end
End
I’m back and the idea using the note tracker is great!
I can confirm that it stops pending notes when the widget is activated even after Rackspace change.
I guess, instead of getting into really dirty scripting, I will assign a controller to this widget and be able to stop pending notes to the global piano if needed.