Send "All Notes Off" On First Note-Off After Rackspace Change

Dear communicty,

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?

Best regards,
Florian

Hi @Florian,

welcome to the family :wink:

For my understanding:
You have a Piano plugin in the global racspace and send MIDI from a local to the global?
How and why?

That’s correct. I do it via “MIDI over OSC”. Why? To tweak all piano sounds with a single edit of the global Piano (like an alias in Mainstage).

Why can’t you just use the MIDI In Plugin in the Global Rackspace?
Or maybe better - use a 2nd instance of Gig Performer

Can you upload a small gig so I can understand your routing and the resulting issue?

1 Like

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.

Upload is coming…

Flo 07b.gig (1.5 MB)

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?

1 Like

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.

1 Like

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.

1 Like

A tipp: Stop Playing before switching the rackspace :wink:

1 Like

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. :wink:

I have an idea, seems to work:

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.

1 Like

Try this:

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.

Maybe that helps.

Flo 07b SNT.gig (1.5 MB)

This is the code:

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
4 Likes

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. :ok_hand:

2 Likes