Suggestion for @brad: It would be great if we could control whether global transpose is applied before/after filters. Here’s one way it could be done with minimal code change:
The Key Range filter could have an extra dropbox offering three options:
A. No global transpose (default)
B. Apply global transpose
C. Apply global transpose negated
This would allow users to apply the global transpose at arbitrary points in the filter chain, and even “undo” and “redo” the global transpose before/after any filter in the chain.
[Aside: I suggest making this addition to Key Range not Transpose filters because Key Range makes Transpose obsolete. In fact, if you wanted to consolidate some code, Transpose could probably be replaced with a Key Range filter that defaults to full key range.]
Are you talking about MIDI filters on routes? Routes have an option to ignore global transpose - maybe you can use that to trick it into doing what you want?
Although routes have an option to ignore global transpose, there’s currently no way to make a filter happen before global transpose gets applied except by chaining multiple routes in sequence (which gets very convoluted), and no way to “undo” the global transpose once global transpose has been applied along a route.
Example:I carefully prepare a song with various MIDI filters (key-splits, velocity ramps, etc.) for playing in the key of C, but when I arrive at the venue the vocalist informs me that she’s decided to sing it in Bb. I smile amiably and adjust my global transpose to -2, but discover that now all my key-splits are in the wrong places (because the transpose is applied before the filters). So I frantically race to find all pitch-dependent filters and adjust them for Bb (while mentally cursing the habitual capriciousness of singers).
The feature I suggested could solve the above by allowing us to add global transpose as the final filter on a route (or somewhere in the middle), plus it would enable some cool new things:
Hypothetical example:Using the new feature, I prepare a song in which each key-split filter is preceded by a filter that applies the negation of the global transpose, and succeeded by one that reapplies the global transpose. This changes the effect of the global transpose so that it moves all my key-splits without changing note pitches. When the vocalist informs me that her large older brother is replacing her and wants a key of low-G, I smile amiably, adjust my global transpose to -5 to change all my key-splits, and simply play it in G.
(The above examples may or may not have been inspired by actual events.)
Or… since I’ve discerned that @brad is the type of programmer who loves code beauty and symmetry… I shall shamelessly appeal to his sense of code completeness…
Everything on the MIDI route settings page has an equivalent filter or binding via which users can fine-tune the order of operations… except, alas, global transpose, which gets a sad face: