# FlexRouter: Flexible keyswitch router for Kontakt 5 - version 2.2.3 released



## tack (Nov 9, 2015)

*Version 2.2.3 is released* *on March 8, 2019.* *See this post.*

Hi gang,

I've been hacking on Yet Another Keyswitch Router multiscript. It's become featureful enough that I thought it might be useful to others as I _think _it has some unique features. It does require Kontakt 5.

Quick links:

GitHub project page
Direct link to compiled script
Some features include:

support for note, program change, or CC-based keyswitches
arbitrary translation between notes, CCs, and program changes
can route events to instruments on ports A-D (64 separate channels)
multiple note-based keyswitches can be activated simultaneously (useful for e.g. layering articulations)
one keyswitch note/CC/PC can trigger routing to multiple target channels
one instance of FlexRouter supports 16 rules
each rule supports up to 128 independently configured keyswitches
Optional anti-hanging for notes and sustain pedal when jumping between keyswitches
Optional CC chasing per rule
probably a few bugs 
Oblig screenshot:






Get a flavor of FlexRouter with this What's New video for version 2.1 (older version):



Original Tutorial / Walkthrough video (showing version 1):


----------



## chimuelo (Nov 9, 2015)

Sure but will the bugs eventually be fixed or this a Cubase Logic release..?

Just messing with you.
I'd definitely like to check it out.
I'm prepping for a heavily automated gig next year and already I see a need for multiple triggerings
from single controllers, etc.

Thanks


----------



## mickeyl (Nov 9, 2015)

Excellent, I'd love to use it!


----------



## FriFlo (Nov 10, 2015)

Cool! Could be close to what I was trying to script myself! Some questions:
The input CC changes the channel the midi data gets sent to? Or is it just translating a CC to note values (key switches)?
If it is routing to channels, have you figured out how to prevent hanging notes? When there is a played note still held and change the program, the held note doesn't receive a note off once letting the key go. This must be fixed script wise. I was kind of successful with that, but there were some problems! Don't remember exactly what, as it is some time ago.
Is it possible to have multiple input channels, that all can keys witch to all 64 Kontakt slots?
If you want to check out my take on it, here I posted it in Bob's thread:
http://vi-control.net/community/threads/velocity-keyswitch-multiscript.46466/


----------



## tack (Nov 10, 2015)

Thanks guys for your interest. I just wanted to make sure any additional effort wouldn't be for naught. I'll clean it up and toss it on GitHub once I decide on a license. It'll be open source and your merge requests will be welcome.




FriFlo said:


> The input CC changes the channel the midi data gets sent to? Or is it just translating a CC to note values (key switches)?



Both. Keyswitches (whether notes or CC events -- so I'm somewhat overloading the word "key" here) received on the keyswitch channel for a given rule will cause all events thereafter received on the source channel for the triggered keyswitch (which can be different than the keyswitch channel) to be routed to the target channel for that keyswitch.

Apart from affecting the active routing, keyswitches themselves can either be blocked (patches never see them), passed through (patches on the target channel see the keyswitch as-is), or redirected to either a specific note (with configurable velocity) or a CC event.



FriFlo said:


> If it is routing to channels, have you figured out how to prevent hanging notes? When there is a played note still held and change the program, the held note doesn't receive a note off once letting the key go. This must be fixed script wise.


Yep, no problem with hanging notes. Note-off events are sent to the channel(s) that received the note-on event, not the channel(s) that are currently active based on current keyswitches. 



FriFlo said:


> Is it possible to have multiple input channels, that all can keys witch to all 64 Kontakt slots?If you want to check out my take on it, here I posted it in Bob's thread: http://vi-control.net/community/threads/velocity-keyswitch-multiscript.46466/


Right now any keyswitch can already route to any of the 64 channels inside Kontakt, but it sounds like you're wanting to include program changes in the list of supported keyswitch events (currently notes or CC events)? So instead of e.g. note D-2 or CC32/2 triggering a keyswitch, you'd also like to be able to do that by say PC 2? If I understood this correctly it should be possible without changing too much of the MIDI event handling code.

Cheers!


----------



## FriFlo (Nov 10, 2015)

Sounds great! Program changes would be the logical choice IMO, since this midi data is meaningless in the world of sample libraries, so why waste any CC number. Doesn't really matter, actually, as there are enough unused CCs available! 
What troubles me, is that it isn't possible to assign CC or program change to the Cubase expression maps! This would make so much sense! But i cannot be solved with a Kontakt script. Steinberg hast to get to that.
I am looking forwards to see your script!


----------



## givemenoughrope (Nov 12, 2015)

I think using all 64 slots on Kontakt would be great!


----------



## vicontrolu (Nov 12, 2015)

I think i qualify as a hardcore beta tester since i am already key/CC-switching&stacking articulations in my template.  CCswitching is made inside the kontakt instrument though so it would be very nice to use the MS!

I might have a couple of suggestions too so i really cant wait to try it!

Thanks a bunch


----------



## tack (Nov 12, 2015)

vicontrolu said:


> I might have a couple of suggestions too so i really cant wait to try it!


I've done most of the code cleanup I was hoping to do. The GUI code looks terrible, but what can you do -- with KSP I'm finding the bar is set very low in terms of code elegance. 

So with any luck, I'll have something up tonight. I want to do a quick tutorial video to walk through some use-cases. Hopefully I'll get a chance to put that together tonight.


----------



## vicontrolu (Nov 12, 2015)

Terrific!


----------



## tack (Nov 13, 2015)

Thanks everyone for your interest and encouragement. I've finally scrounged some time to publish the code and put together a walkthrough video. See the top post of this thread for the links.

Cheers!


----------



## mark.warman (Nov 14, 2015)

Thank you for all the time and effort you've put into this freely shared project. It is for Kontakt 5 only (as I have just discovered when trying to apply the script inside K4!). Looking forward to trying it out.


----------



## tack (Nov 14, 2015)

mark.warman said:


> It is for Kontakt 5 only (as I have just discovered when trying to apply the script inside K4!).


Ah, I did completely fail to mention that anywhere. Thanks for pointing it out. I updated a few places and hopefully it's clearer it does require Kontakt 5.


----------



## vicontrolu (Nov 14, 2015)

Wow fantastic work, tack! I too think this has some unique and cool features 

The touch osc template + chromatic keyswitching looks really neat. I think i am going to upgrade to spitfire soon enoguh so i´d definitely have a look into this if i go this way.

As for my current setup, i dont think i am going to use it as much as i initially thought. In my case the main problem relies on the fact that, from what i have understood in the video -dont have time to test it now-, you cant stack or route midi simultaneously to different channels/ports with just a single keyswithc input, but you have to press 2 keyswitches simultaneously.

I think a goog source of inspiration and feaures if you want this script to excel at layering it would be the MS from OT released on the first Berlin WWs: Articulations manager. In this script you have 2 different articulations to adress midi simultaneously by each keyswitch, and you can control how to stack them: velocity (with efective, adjustable range) or CC ( CC can act as a switch between the 2 articulations or like a crossfade).

Thanks again, keep on rocking!


----------



## tack (Dec 22, 2015)

vicontrolu said:


> In this script you have 2 different articulations to adress midi simultaneously by each keyswitch, and you can control how to stack them: velocity (with efective, adjustable range) or CC ( CC can act as a switch between the 2 articulations or like a crossfade).


I've been thinking a bit about how this might work in terms of UX, especially when layering more than 2 articulations (which is possible with FlexRouter).

The first thing is that it needs to be optional. Sometimes you actually want both articulations fully mixed. My first thought is that one could configure a separate keyswitch whose sole purpose is to activate crossfading and be mixed in with the articulation keyswitches. (Remember "keyswitch" is an overloaded term here, it means both a note or a CC event.) The configurable for the keyswitch would define which CC should be used to control the crossfading when activated. Since (AFAIK) a multiscript can't control the volume of individual patches, crossfading would need to be implemented by injecting CC7 events to the patches as they're being faded. When a new keyswitch is activated, the volumes of the patches would be restored to the levels they were originally at before any crossfading was done.

So suppose you have C0 triggering regular longs on channel 1, D0 triggering con sord longs on channel 2, and E0 is a "crossfade keyswitch" configured to use CC85. When you hit C0+D0, you get longs mixed with con sord at their regular volumes. When you combine those with E0, it would set the volume levels of channel 1 and channel 2 based on the last-observed level of CC85, and then as you change CC85 the mix adjusts proportionately, so that value 0 is fully channel 1, value 64 is both channels 1 and 2 at half volume, and value 127 is fully channel 2.

Layering more than 2 articulations is I suppose a dubious corner case, but I suppose the obvious behaviour is that the CC range is divided up into 2 parts, the first half 0-63 crossfades between the first two keyswitches, and the second half 64-127 crossfades between the last two keyswitches.

Thoughts?


----------



## tack (Apr 30, 2016)

Hi all,

I've released version 2 of FlexRouter which has a number of new features to make your keyswitching lives easier. (And mine. )

*Get it here. *(Or see the project page on Github.)
*https://urandom.ca/flexrouter/latest*



​
Changes since version 1:

Keyswitch channels can now be omni (listen on all channels)
Target channels can be null. Triggering a keyswitch with a null target causes all subsequent events to route into a blackhole. (#5)
Added a rule-level default for source channels (which can be overridden per keyswitch).
Added optional anti-hanging for sustain pedal. (Notes already avoided hanging across keyswitches.) (#1)
Added optional CC chasing per rule. (#2)
Midi Program Change events can now be used for keyswitches and redirections
(I'm now using Program Changes in my DAW to trigger UACC events on all my Spitfire libraries as in the above screenshot.)

Keyswitch triggers can now be manually entered. (MIDI Learn is still possible but is no longer required.)
Rules can now have multiple instances of the same keyswitch. This allows a single note (or CC, or program change) to route to multiple patches.
Added a new button to clone a rule.

Unfortunately version 2 is not backward compatible with version 1. You will need to recreate your rules. Sorry. :(

Cheers!


----------



## tack (Jul 2, 2016)

Hi again!

On the heels of purchasing a couple libraries (Cinematic Studio Strings and Embertone Clarinet) which posed some new keyswitching challenges in my template, I added a few features to FlexRouter and have released FlexRouter 2.1

*Get it here. *(Or see the project page on Github.)

This time I decided to do a walkthrough video showcasing the new features:



Changes since version 2.0:

Keyswitches now support _multiple_ redirections: one keyswitch event can trigger multiple outgoing events.
Added a per-keyswitch feature to keep redirected notes pressed until the next keyswitch is triggered. Useful for patches that modify behaviour only as long as a note is held.
Added velocity range support to note-based keyswitches. Now the same note-based keyswitch can route to different patches based on velocity.
Added help info to all UI controls.
I'd like to give a tip of the hat to @FrozenPlain for his excellent enhancements and continued development of SublimeKSP!

Cheers!


----------



## tack (Jul 3, 2016)

Oh, one thing I forgot to mention: version 2.1 is backward compatible with 2.0, so to upgrade, just paste the new script into your existing instance. All your existing configuration will be preserved.


----------



## procreative (Jul 3, 2016)

Great script. Seems to me a problem with compiled version, still shows as 2.0.0. I wish someone would make this as a Logic Midi FX script!


----------



## tack (Jul 3, 2016)

procreative said:


> Seems to me a problem with compiled version, still shows as 2.0.0.


Weird. When you visit the link to the script, what do you see as the set_script_title() argument a few lines down? Does it say 2.1 or 2.0?

I wonder if your browser is showing you an old cached version. Try ctrl-shift-R?

If it looks good there, are you clicking Apply after you replace the contents of the Edit field?


----------



## jamwerks (Jul 3, 2016)

So yes we should share the scripts of the new K5 instruments that we create (without the samples of course). I plan on doing all of Adagio-Agitato, and possibly Claire (think I have 6 of 7 of those).

I imagine though that some of our settings are personnal, maybe some of the work can save time for all others?...


----------



## tack (Jul 3, 2016)

jamwerks said:


> I imagine though that some of our settings are personnal, maybe some of the work can save time for all others?...


I think therein lies the rub. My template is built off Program Change events. Someone else's might be a custom articulation CC. Someone else may choose to use dedicated keyswitch notes, they just want consistency across all their libraries. The presets for all of these would be different.

Maybe there is a common enough approach used by a critical mass where presets for that approach would make sense?

Another small technical issue is that the code is saved with the preset. So all presets would need to be regenerated each time a new version is released. This isn't a huge issue I suppose, but it's a small inconvenience to new releases. One possibility would be to build preset functionality straight into FlexRouter but that's not exactly trivial with KSP, and I think it's more trouble than it's worth.


----------



## tack (Jul 3, 2016)

vicontrolu said:


> In my case the main problem relies on the fact that, from what i have understood in the video -dont have time to test it now-, you cant stack or route midi simultaneously to different channels/ports with just a single keyswithc input, but you have to press 2 keyswitches simultaneously.
> 
> I think a goog source of inspiration and feaures if you want this script to excel at layering it would be the MS from OT released on the first Berlin WWs: Articulations manager. In this script you have 2 different articulations to adress midi simultaneously by each keyswitch, and you can control how to stack them: velocity (with efective, adjustable range) or CC ( CC can act as a switch between the 2 articulations or like a crossfade).


Although I didn't specifically set out to address this (interesting) use-case, it turns out that in FlexRouter 2.1, what you're talking about here is now mostly possible.

That is, a single keyswitch (note, CC, or program change) can route to multiple target channels. This is possible because it's allowed (as of 2.0) to have multiple instances of the same "keyswitch" (although not allowed through MIDI learn, you can use the New or Clone buttons to accomplish this).

And because you can now send multiple redirect events when a keyswitch is activated, this also makes a "divisi keyswitch" possible, to both set an articulation in the target patch, _and_ adjust the patch volume via CC7 (or CC11 if preferred).

Consider this configuration, which uses note-based keyswitches (but as always FlexRouter doesn't constrain keyswitches to just notes):

C1: route to violas patch on A1, and send CC7 value 127 (full volume)

D1: route to celli patch on A2, and send CC7 value 127 (full volume)
E1: route to violas patch on A1, and send CC7 value 90
E1: route to celli patch on A2 and send CC7 value 90
So by having multiple instances of E1, you can route to arbitrarily many target channels. (Well ok it's not arbitrary: each rule can have up to 127 keyswitches configured, and each instance can have up to 16 rules.)

Similarly, you could have this work on a single note keyswitch based on velocity:

C1 velocity 0-40: route to violas patch on A1, and send CC7 value 127 (full volume)

C1 velocity 41-90: route to celli patch on A2, and send CC7 value 127 (full volume)
C1 velocity 91-127: route to violas patch on A1, and send CC7 value 90
C1 velocity 91-127: route to celli patch on A2 and send CC7 value 90

The only thing that isn't possible right now is that while note-based keyswitches support a configurable velocity range, CCs are single value only. Now that the velocity range plumbing is in place, a CC range would be easy to add. I'll do that for version 2.2.

No support for crossfading though. That would be a bit of a challenge.


----------



## wst3 (Jul 4, 2016)

First, thanks for all your time and effort on Flexrouter!

Second... and this applies to anyone... I need a sanity check to see if I am overthinking this!

My requirements are fairly simple...
1) I want to leave the libraries alone, that is I don't want to reconfigure them to accept specific controls - even I have too many off them, there is no uniformity beyond some basic articulations, and there are updates and additions, so any solution has to let me map controls to the library. Flexrouter v2.1 seems to cover that pretty well (granted, this is all still a thought experiment, but it makes sense.)

2) I do not want to send key switches to the sequencer - neither Sonar nor Studio One can "chase" key switches, and they make a mess in Finale. Bome's MIDI Translator will take care of this, especially since I don't need it to do EVERYTHING now.

3) I had wanted some kind of visual indication of controls, and especially articulation changes, within the Piano Roll View, but I am abandoning that for now, and I am no longer certain it is really all that helpful.

So the next attempt at organizing/controlling my libraries will be to use Bome's to translate key presses to CCs, and then use FlexRouter to map CCs to the native commands in any given library.

Does this seem like a workable solution to anyone?


----------



## vicontrolu (Jul 4, 2016)

This is the best free mulktiscript of this kind. Awesome Tack!


----------



## tack (Jul 4, 2016)

wst3 said:


> Does this seem like a workable solution to anyone?


Not only workable, but almost word-for-word what I do, and FlexRouter's very raison d'être. 

Really the only point we part ways on is your comment about articulation changes in the piano roll. For me this is actually a huge deal.

So while I also have Bome MT send CCs to trigger articulations (see this thread for more details on my setup), I then have some scripting in Reaper to further translate the incoming CCs from MT to Program Change events, and within the MIDI editor, I do all articulation changes via Program Changes, which Reaper both displays reasonably well in the MIDI Editor, and also chases properly.

Then I use FlexRouter to translate those Program Changes to whatever the library in question is happy with. The only changes I make to the patches are with Spitfire libraries, where I switch them to use UACC. But that's not strictly necessary if you want to translate to Spitfire's default note-based keyswitches. So my flow is:

MIDI controller (sending either CC 119 or notes, depending on which articulation I'm triggering) -> Bome MT (translating either the CC or shift key+note to a consistent CC 119 out to a LoopBe1 port) -> Reaper (where a Lua script translates all incoming CC 119 to Program Change events) -> FlexRouter (translating Program Changes to whatever the patch wants) -> Patch (pretty much factory standard).



vicontrolu said:


> This is the best free mulktiscript of this kind. Awesome Tack!


Thanks!


----------



## lucor (Jul 4, 2016)

Only now just found this, incredible work!
One question: Is it possible to setup keyswitches with this script similar to what CSS does with the shorts? Because I've grown quite fond of doing it that way.
For example: I'd like to condense all of the 4 different trills patches in BWW into one keyswitch (let's say F-2) and then cycle through them with a CC (e.g. CC3). I'm able to do this with most of the Berlin stuff via CAPSULE, but since CAPSULE breaks down trills into bazillons of little pieces in the multis (trills+1, trills+2, trills+3, etc.) I can't do it that way with them.


----------



## wst3 (Jul 4, 2016)

tack said:


> Not only workable, but almost word-for-word what I do, and FlexRouter's very raison d'être.


I'm starting to pick up on that<G>! It really is brilliant!



tack said:


> Really the only point we part ways on is your comment about articulation changes in the piano roll. For me this is actually a huge deal.


Well it's a big deal for me too, I just haven't found the solution yet...

I need to read the other thread, and then re-read this post, and then I might have a question or two...

Very intrigued by your use of LUA - sadly not an option for Sonar or Studio One. We use LUA a fair bit in my day gig, which is Audio/Video integration. Many of the DSP manufacturers have adopted it.

Thanks again!!

Bill


----------



## tack (Jul 4, 2016)

lucor said:


> One question: Is it possible to setup keyswitches with this script similar to what CSS does with the shorts? Because I've grown quite fond of doing it that way.
> For example: I'd like to condense all of the 4 different trills patches in BWW into one keyswitch (let's say F-2) and then cycle through them with a CC (e.g. CC3). I'm able to do this with most of the Berlin stuff via CAPSULE, but since CAPSULE breaks down trills into bazillons of little pieces in the multis (trills+1, trills+2, trills+3, etc.) I can't do it that way with them.


Unfortunately no, this isn't possible. You could use a velocity sensitive keyswitch note to trigger the different shorts (which also works in CSS), but the idea of a context dependent CC isn't something FlexRouter can do. This is because each "keyswitch" (whether note, program change, or CC) is independent.

What you described requires some contextual behaviour, or knowledge of prior state: CC1 range 1-30 sends event X but only when keyswitch A was previously activated, otheerwise it sends event Y but only when keyswitch B was previously activated, and otherwise CC1 behaves normally.

That kind of contextual behaviour isn't something FlexRouter supports at the moment.


----------



## tack (Jul 4, 2016)

wst3 said:


> Well it's a big deal for me too, I just haven't found the solution yet...
> 
> I need to read the other thread, and then re-read this post, and then I might have a question or two...
> 
> Very intrigued by your use of LUA - sadly not an option for Sonar or Studio One. We use LUA a fair bit in my day gig, which is Audio/Video integration. Many of the DSP manufacturers have adopted it.


You may not actually need an intermediate CC. My preference would actually have been to have Bome MT output Program Change events directly.

The only reason I'm not is because, for whatever reason, Reaper can't step-record program changes, and being able to step record articulation changes/tweaks is important to my workflow. Maybe Sonar or Studio One don't have this limitation, and you could use Program Changes directly through to FlexRouter, which will then do the final translation to what the instruments want?

That assumes that Sonar or Studio One give you a reasonable UI for program changes in the MIDI editor. Reaper works ok for this sort of thing:

https://helix.urandom.ca/public/reaper-screenshot.png

In fact with Reaper, pretty much the _only_ sane way to do see articulations in the MIDI editor is with program changes, at least from what I can tell. I only wish it had expression maps


----------



## lucor (Jul 4, 2016)

tack said:


> Unfortunately no, this isn't possible. You could use a velocity sensitive keyswitch note to trigger the different shorts (which also works in CSS), but the idea of a context dependent CC isn't something FlexRouter can do. This is because each "keyswitch" (whether note, program change, or CC) is independent.
> 
> What you described requires some contextual behaviour, or knowledge of prior state: CC1 range 1-30 sends event X but only when keyswitch A was previously activated, otheerwise it sends event Y but only when keyswitch B was previously activated, and otherwise CC1 behaves normally.
> 
> That kind of contextual behaviour isn't something FlexRouter supports at the moment.



Thought as much. Using different velocities unfortunately doesn't work with Cubase's expression maps, which don't contain any velocity information. 
Nonetheless, this script will definitely come in handy though.


----------



## vicontrolu (Jul 4, 2016)

lucor said:


> Thought as much. Using different velocities unfortunately doesn't work with Cubase's expression maps, which don't contain any velocity information.
> Nonetheless, this script will definitely come in handy though.



I am exactly on the same boat as you. I use a keyswitch for shorts, then use a Cc to go from shorter to longer notes (spic/stac/marcato)

I wonder if some other multiscript could be used in conjunction with Flexrouter.

This or maybe we should start a kickstarter project for Flexrouter 2 ...


----------



## tack (Jul 4, 2016)

I wonder if it might be possible to implement this without too much of an overhaul to FlexRouter's internals (which is a scary proposition).

I think I might be able to make this work provided you put each of the articulation "groups" on different MIDI channels. So have spic/stac/sfz/etc. on say channel A1, have your trills m2, M2, m3, M3, P4, etc. patches on channel A2, etc.

The new feature that'd be necessary (in addition to CC value ranges which is coming in FlexRouter 2.2) is the option to define a keyswitch as "redirect only" and be passive with respect to configuring routes.

So now suppose you wanted your shorts triggered by C1, and your trills triggered by D1:

Keyswitch: C1 velocity 0-127
Action: block
Target channel: A1

Keyswitch: CC1 range 0-40
Action: redirect to target patch spiccato keyswitch
Target channel: A1
Option: Passive (redirections only)

Keyswitch: CC1 range 41-90
Action: redirect to target patch staccato keyswitch
Target channel: A1
Option: Passive (redirections only)

Keyswitch: CC1 range 91-127
Action: redirect to target patch sfz keyswitch
Target channel: A1
Option: Passive (redirections only)

Keyswitch: D1 velocity 0-127
Action: block
Target channel: A2

Keyswitch: CC1 range 0-30
Action: redirect to target patch trills m2 keyswitch
Target channel: A2
Option: Passive (redirections only)

Keyswitch: CC1 range 31-60
Action: redirect to target patch trills M2 keyswitch
Target channel: A2
Option: Passive (redirections only)

... you get the idea...

Now the kludge here is that CC1 will always send those keyswitches to both channels. So if I sent CC1 value 20, I'd be setting spiccato on channel A1 and trills m2 on channel A2. But the channel that non-keyswitch MIDI events were routed to would depend on which keyswitch (C1 or D1) was triggered.

It's not exactly the prettiest -- it does require you to separate the articulation groups on their own MIDI channels -- but I think it could work functionally and wouldn't require much effort to implement.

Thoughts?


----------



## procreative (Jul 4, 2016)

The version looks right now, maybe it was cached or maybe the site had a glitch.

I am using Art Conductor to control keyswitches and with CSS using either velocity keyswitches for some of the articulations or CC I had an issue. 

I found a way to use CC within Art Conductor however I wished to retain the option to play in the CC changes via a Keyboard. However it would have meant a separate setup for just this library as the Keyboard was programmed to send CC from C-1 to C0 using CC values starting at 1, 2 etc (whereas the CC keyswitches used values all over the place).

So using Flexrouter I sent the same setup I use for other libraries but converted the Keyswitches output by Art Conductor into CC values into CSS. Took a while to figure out how to programme it but it works great.

Many thanks!

In an ideal world would prefer a Midi FX script for Logic that could be easily added to many tracks, but this still does the job great.

PS As CSS has all the available articulations also as CC, anyone else could use a note keyswitch to trigger the CC keyswitch and avoid velocity keyswitches altogether.


----------



## vicontrolu (Jul 5, 2016)

tack said:


> I wonder if it might be possible to implement this without too much of an overhaul to FlexRouter's internals (which is a scary proposition).
> 
> I think I might be able to make this work provided you put each of the articulation "groups" on different MIDI channels. So have spic/stac/sfz/etc. on say channel A1, have your trills m2, M2, m3, M3, P4, etc. patches on channel A2, etc.
> 
> ...



Looks perfect to me, as long as its functional

I guess the answer is no but, if its about keeping the same midi channel, could we put all the articulations of a "group" in an instrument banks?


----------



## tack (Jul 5, 2016)

vicontrolu said:


> Looks perfect to me, as long as its functional


I think it will be functional, but the modwheel will change articulations on all patches, even those not being actively routed to for non-keyswitch events. So it might look a bit weird but I think it would work in practice.



vicontrolu said:


> I guess the answer is no but, if its about keeping the same midi channel, could we put all the articulations of a "group" in an instrument banks?


You could do, if you like for organization purposes, but it wouldn't make any difference. Ultimately all that matters is that the articulation groups each on separate MIDI channels, which you can do if the patches are all in the same bank or on separate banks. This means you could have up to 64 different articulation groups.

I'll play with the idea tonight.


----------



## procreative (Jul 6, 2016)

Hey Tack, great script. Wondered if it can do something similar to http://vi-control.net/community/threads/artzid-new-script-for-cinematic-studio-strings.53558/page-6

Peter seems to have found a way to separate the HT and WT Trills, I think by triggering 2 notes on 1 key press probably with some kind of rules to the intervals?

I have committed to Art Conductor so moving system just for that feature would be silly. However not sure how I could do this as it means having some kind of rules as to what notes pass to CSS and maybe that is a different kind of script altogether?


----------



## tack (Jul 6, 2016)

procreative said:


> Wondered if it can do something similar to http://vi-control.net/community/threads/artzid-new-script-for-cinematic-studio-strings.53558/page-6


I saw that too, and thought it was a good idea (especially for the notation use-case). FlexRouter can't do that presently. It might be possible to add without any big core changes. I have to give some thought about how to do it cleanly/efficiently. Maybe for 2.2.


----------



## procreative (Jul 6, 2016)

In Logic I found a midi script called Harmoniser I think. You can create 2nds, 3rds etc from one or several notes. Problem is you need 2 instances for both articulations and there is no way to switch between them or bypass both.

I think for it to work it either needs to be inside Art Conductor or within your script.


----------



## procreative (Jul 7, 2016)

Actually the script is called Chord Trigger


----------



## gadi (Feb 12, 2017)

Thanks so much for this script, one question though.
In the KS Action I'm unable to redirect to CC1, I type 1 press enter - but it only lets me insert 2 and above..


----------



## tack (Feb 12, 2017)

gadi said:


> In the KS Action I'm unable to redirect to CC1, I type 1 press enter - but it only lets me insert 2 and above..


Yeah, that was initially a design decision, thinking that surely no one would ever want to redirect to CC1! I removed that arbitrary restriction in my codebase for 2.2. Unfortunately I've been sitting on 2.2 far too long and a release is overdue.

You can try the beta, if you like.

https://urandom.ca/flexrouter/beta

Please do let me know if you find any bugs.


----------



## gadi (Feb 12, 2017)

tack said:


> Yeah, that was initially a design decision, thinking that surely no one would ever want to redirect to CC1! I removed that arbitrary restriction in my codebase for 2.2. Unfortunately I've been sitting on 2.2 far too long and a release is overdue.
> 
> You can try the beta, if you like.
> 
> ...




Best customer service ever!!!


----------



## tack (Feb 12, 2017)

Customer satisfaction guaranteed or double your money back!


----------



## Batrawi (Feb 23, 2017)

Hi Tack
Been using your script with CSS ever since I bought it (actually your script saved me from throwing away the library)

Recently I started using this cool Multi Divisi script by ScoringFilm to auto arrange all my strings sections in one instance of Kontakt
http://vi-control.net/community/threads/multi-divisi-script.59985/

However, I can't get this script to work with flexrouter.
Any idea how can I get both scripts work together?

Sorry for the noob question as I really know nothing about scripting and have very little awareness of kontakt's functionalities

Edit: Disregard, got it working thx


----------



## tack (Feb 25, 2017)

Batrawi said:


> Edit: Disregard, got it working thx


Oh, cool, I was just going to look at this. 

Can you share what the solution was in case there are others who run into the same challenges?

Thanks!


----------



## Batrawi (Feb 25, 2017)

tack said:


> Oh, cool, I was just going to look at this.
> 
> Can you share what the solution was in case there are others who run into the same challenges?
> 
> Thanks!



I just loaded the scripts in a different order.
Flexrouter first, then Multi Divisi second and they worked perfectly together without conflicting with each other.

Not sure if loading scripts in specific order can even cause a problem or make any difference...but for me they just didn't work together when I loaded Multi Divisi first (maybe I was doing something wrong that has nothing to do with order)


----------



## FriFlo (Apr 3, 2017)

This is really a great script and I want to thank you for giving it away for free. The amount of work that went into this is obvious looking at the length of the script!
I just noticed that VEpro VST3 can't receive program changes, so I wanted to go for CC 0. You only provide CCs starting from 2 as input "keyswitch". Is there a reason you left out 0? It would be quite handy for writing the expression maps, as it is one action less to be edited.


----------



## tack (Apr 3, 2017)

FriFlo said:


> This is really a great script and I want to thank you for giving it away for free. The amount of work that went into this is obvious looking at the length of the script!


Thanks. 

If nothing else, writing FlexRouter has given me an immense appreciation for those VI developers who write massive projects in KSP. The language is not pleasant to work with. 



FriFlo said:


> You only provide CCs starting from 2 as input "keyswitch". Is there a reason you left out 0?


There was actually a reason I left out _1_, and 0 came along for the ride. But it wasn't a very good reason, and in 2.2 I've set it to 0.

I've been sitting on the beta for 2.2 for long enough, so I'll release it later on today and that should fix your problems.


----------



## FriFlo (Apr 3, 2017)

tack said:


> Thanks.
> 
> If nothing else, writing FlexRouter has given me an immense appreciation for those VI developers who write massive projects in KSP. The language is not pleasant to work with.
> 
> ...


Oh thank you so much! I didn't expect that at all ... I hope I can help you out some other time. Feel free to ask!


----------



## tack (Apr 3, 2017)

Hi all,

I've released 2.2, which is a modest release compared to 2.1.

*Get it here. *(Or see the project page on Github.)

2.2.0 brings these features:

Supports CC value ranges for keyswitch input (e.g. a "keyswitch" could be CC 1 values 0-32)
Use-case: use modwheel to switch to different shorts patches by range (spicatto, staccato, staccatissimo, for example)

Option to have the keyswitch only process translations (redirections), but not affect current routing
Sometimes you just want a simple translator.
Use-case: shorts combination patch on channel 1, longs combination patch on channel 2. C0 routes to channel 1, D0 routes to channel 2. CC1 0-32 redirects to F1 and CC1 33-64 redirects to G1 (which are keyswitches on the target patches), both with "ignore routing" option. This allows CC1 to control the patch that had been previously selected by either C0 or D0.

Lower the minimum CC value from 2 to 0 (just to make @FriFlo happy )
Improved UX when adjusting some values in the UI
As always, please let me know if you find any bugs. The logic is getting terribly unwieldy now and it's becoming increasingly difficult to test, so I wouldn't be shocked to learn that some regressions slipped in.

Cheers!


----------



## FriFlo (Apr 5, 2017)

I guess, I'll have to cheer again, as all content from roughly the last 3 days seems missing after a forum crash ...


----------



## tack (Apr 5, 2017)

Doh! Hopefully it'll be restored soon. I mean, _surely_ this is a properly run site with daily incremental backups, right?


----------



## tack (Sep 5, 2017)

Hi everyone,

I've released 2.2.1, a small maintenance release with these changes:

Fix bug where anti note hanging would fail to work on MIDI channels other than 1

Fix bug where CCs would sometimes not be properly chased

*Get it here. *(Or see the project page on Github.)


----------



## robgb (Sep 6, 2017)

Great news. Been using FlexRouter for awhile now. It's pretty brilliant.



tack said:


> *Version 2.2.1 is released* *on September 5, 2017.* *See this post.*
> 
> Hi gang,
> 
> ...


----------



## tack (Sep 6, 2017)

robgb said:


> Great news. Been using FlexRouter for awhile now. It's pretty brilliant.


Thanks Rob


----------



## DMDComposer (Oct 4, 2017)

I want to be able to to use spitfire strings UACC for spiccato lets say but also have LASS spiccato play as well however when I switch to legato I dont want the LASS Spiccato to be playing anymore and I can't figure out how to tell flexrouter to disable this. I know you mentioned how you can use Cinematic strings tremolos in place of spitefire tremolos or something like that but I guess im asking how do you layer both of them? Especially since LASS has no keyswitch on individual articulations because I only want to layer the spiccato with spitfires'. Is this even possible?


----------



## tack (Oct 4, 2017)

DMDComposer said:


> I want to be able to to use spitfire strings UACC for spiccato lets say but also have LASS spiccato play as well however when I switch to legato I dont want the LASS Spiccato to be playing anymore and I can't figure out how to tell flexrouter to disable this. I know you mentioned how you can use Cinematic strings tremolos in place of spitefire tremolos or something like that but I guess im asking how do you layer both of them? Especially since LASS has no keyswitch on individual articulations because I only want to layer the spiccato with spitfires'. Is this even possible?



The easiest way to do this would be to unload the spiccato articulation from the combination palette, load spiccato as an individual articulation on channel 2 (supposing you have the combination patch loaded on channel 1), and also load the LASS spiccato patch in also on channel 2. Then, for the keyswitch you use for spiccato, instead of having the keyswitch action redirect to CC32, set the action to block and set the target channel for that keyswitch to channel 2.

With this configuration, when you press the spiccato keyswitch, it will route subsequent non-keyswitch events over to channel 2 for your layered spiccato. Other keyswitches (which you presumably already have setup now) will work as before, routing to channel 1 (probably the default target for the rule?) and redirecting to CC32.

I have an idea of how this could be configured while keeping Spitfire spiccato in the combination palette via UACC and putting only the LASS spiccato on channel 2 but I'm not in front of my DAW to test it and there's a chance it won't work. It basically involves creating a duplicate keyswitch for whatever you're using to trigger spiccato, and that second keyswitch would route to channel 2 (with the keyswitch action set to block). This _might_ work, but it's possible that the second keyswitch will override the channel routing of the first one, resulting in subsequent notes only going to one or the other MIDI channel, not both. (If it does work this way now I think I'll change it, because it seems like a clean enough way to setup routing to multiple target channels via a single keyswitch.)


----------



## DMDComposer (Oct 4, 2017)

Thank you for your quick response.

That sounds perfect although I'm having a little trouble getting it to go back to using other articulations in the spitfire combination palette.

I have the combination on channel [A] 1, and a single spitfire & LASS spiccato on channel [A] 2 as you said.

Combination palette is using UAAC. For the individual spitfire spiccato I left it alone no UACC just opened it up on channel [A] 2.

Here is a screenshot of my Flexrouter settings. Did I mess something up? If I start on an articualation for example longs it will work. Ill switch to spiccato using UACC #32 value 42 and itll play my combination spiccatos however I can't switch back to any or any other articualtion without manually bypassing Flexrouter then un-bypassing and then itll reset back.







It would be great to not load an individual track for articualtions I want to double with LASS however if it is not possible like you said because of the override its not the end of the world lol. I can manage. I just want to get your first idea working lol. Thanks! :D


----------



## tack (Oct 4, 2017)

DMDComposer said:


> I just want to get your first idea working lol


Yes and that first idea really should have worked. Can't rule out a FlexRouter bug here. I'll give it a try in a few hours when I'm in front of my DAW and will get back to you.


----------



## tack (Oct 4, 2017)

DMDComposer said:


> however I can't switch back to any or any other articualtion without manually bypassing Flexrouter then un-bypassing and then itll reset back.


I think I understand why this is happening.

Do you just have a single keyswitch for spicatto? If this is the case then FlexRouter won't know that it needs to route back to channel 1 for the other UACCs. Routing is only changed based on keyswitch events, so if you don't have a keyswitch configured for the other CC32 values, it'll be stuck on channel 2 after you trigger spiccato.

It's possible to solve this by creating two "catch-all" keyswitches for CC32 values 0-41 and another one for CC32 values 43-127, both with a passthrough KS action and setting the target to [A]1 (or your rule default). Alternatively, if you don't mind CC32 value 42 being fired into your combination palette on channel 1 -- and you wouldn't because you've unloaded spiccato there -- then you can create a single catch-all for CC32 values 0-127.

It turns out that this exact recipe can be used to do it the way you originally wanted (keeping Spitfire spiccato in the combination palette and only loading in LASS spiccato on channel 2). The only difference is you don't need to unload spiccato in your combination palette or load the standalone patch on channel 2.

In other words:

1. Create a keyswitch on CC32 values 0-127, default target ([A]1) and set the KS action to passthrough.






2. Create a keyswitch on CC32 value 42, target [A]2 and set the KS action to block.






You can repeat #3 for all such layers you'd like to have.

When you trigger spiccato via CC32/42, the first keyswitch executes (because value 42 is within the 0-127 range), setting up a route to channel 1 and passing the CC32/42 event to the Spitfire patch, and then the second keyswitch executes (because value 42 is within the 42-42 range), which _adds_ channel 2 to the routing targets.

When you trigger a UACC other than 42, only the first keyswitch executes, which first resets all routing (undoing the routing to channels 1 and 2), and then sets routing back up to channel 1, again passing the UACC event onto the patch on channel 1.

Hope that helps!


----------



## DMDComposer (Oct 5, 2017)

tack said:


> Do you just have a single keyswitch for spicatto?
> Hope that helps!



I was just using a single key switch for spiccato but the new way you described it worked perfectly! I can keep spitfire all in the combination palette and just load LASS spicc or anything else I want on a different track. This is perfect thank you so much for your quick response, helping me out, and writing this script. :D


----------



## DMDComposer (Oct 5, 2017)

tack said:


> You can repeat #3 for all such layers you'd like to have.



So its working but I'm a little confused because its not what you said when adding a 3rd or 4th articulation and I want to ask in case I run into problems down the road I'm not aware of.

Adding spiccato worked perfectly so now for some parts I want to add spicc+staccato. And you said just repeat the same process however having the KS Action set to BLOCK doesn't work when adding a 3rd articulation. I have to set each rule to passthrough otherwise spitfire when I add the second stacc doesn't like to reset back. But if everything is on passthrough it works. Is this okay or something I'm doing wrong?

Like I said it works on passthrough I just want to make sure its not gonna cause problems down the road lol.

P.S.

Is it possible to setup velocities triggers with flexrouter? In the aspect that usign spitfire strings it would be cool if I can hit a velocity range of 115-127 on the spiccato patch that instead of playing LASS Spiccato it could play LASS Stacc SLAM for those high notes. Is this possible? Sorry for all the questions I've watched your vids and noticed velocity keyswitch is possible but not sure if velocity on note input works? Thanks!


----------



## DMDComposer (Oct 5, 2017)

Sorry for all the posts, Is this normal the delay? Maybe this is the cause of the passthrough but the staccato isn't switching over at the same time as Spitfirestrings as seen here. I'm using expression maps and with fast 8ths triplets at 120 bpm the staccato activates on spitfire but the LASS is delayed to the 2nd note not on the first with spitfire.


----------



## tack (Oct 5, 2017)

DMDComposer said:


> Adding spiccato worked perfectly so now for some parts I want to add spicc+staccato. And you said just repeat the same process however having the KS Action set to BLOCK doesn't work when adding a 3rd articulation.


You mean using Spitfire staccato from the combination palette and LASS spiccato on channel 2? Or perhaps LASS staccato on channel 3? Yes, this _should_ work exactly the same way. If it's not, I'm still not ruling out bugs. 

But if you meant spiccato from the SF combination patch and LASS staccato, the recipe won't work.




DMDComposer said:


> Is it possible to setup velocities triggers with flexrouter? In the aspect that usign spitfire strings it would be cool if I can hit a velocity range of 115-127 on the spiccato patch that instead of playing LASS Spiccato it could play LASS Stacc SLAM for those high notes. Is this possible?


I think it should be possible (again I'm not currently in front of my DAW to test) but now things are starting to get ugly, and it'll only work if you go back to the initial idea of unloading spiccato on the combination palette and having both SF/LASS individual spiccato patches loaded on channel 2, and using separate catch-all rules that avoid covering UACC 42.

Because for it to work while keeping spiccato on the combination palette, for high velocity notes, FlexRouter would need to have the concept of non-latched keyswitches, remembering the prior state. In ot
her words, when it sees a high velocity note, it'd have to send UACC 42 for spiccato, and for lower velocity notes, your expected behavior is presumably for it to send the UACC for the last articulation you were on. It doesn't currently support this idea of previous state to simulate a non-latching articulation.

So, off the top of my head, I think it'd look something like:

Create keyswitch for CC 32 values 0-41 with passthrough the channel 1
Create keyswitch for CC 32 values 43-127 with passthrough to channel 1
Create keyswitch for notes with velocity 1-114 with passthrough to channel 1
Create keyswitch for notes with velocity 115-127 with passthrough to channel 2
If you're doing a lot of these customizations for UACC, you may be better off creating individual keyswitches for each separate UACC value and passing through, then reconfiguring (or duplicating as needed) a UACC keyswitch where you want to do something different.




DMDComposer said:


> Sorry for all the posts, Is this normal the delay? Maybe this is the cause of the passthrough but the staccato isn't switching over at the same time as Spitfirestrings as seen here.


There shouldn't be any delay, no. I think I'll need to look a bit closer at what you're doing. Can you save your slot out as a .nkp and email it to me at [email protected]?


----------



## DMDComposer (Oct 5, 2017)

tack said:


> You mean using Spitfire staccato from the combination palette and LASS spiccato on channel 2? Or perhaps LASS staccato on channel 3? Yes, this _should_ work exactly the same way. If it's not, I'm still not ruling out bugs.



Yes, Because I'm using VEPRO to manage my channels I have an instance of Kontakt For Violin 1 Longs channel 1, Violin 1 Shorts channel 2 etc... I then have each kontakt instrument on OMNI so I can easily move the channels of everything inside kontakt using VEPRO without having to change each individual track within kontakt.

That being said, I'm Violins 1 Core Techniques from Symphonic Strings and Violin 1 Core Techniques from Spitfire Chamber Strings both on UACC on OMNI channel. I then have spiccato from LASS on 1 and Staccato on 2. ((I use B so I know it doesnt confuse with my A channels since I'm using [A] 1-16.)) I then use UACC #32 value 42 for spicc to layer LASS spic with spitfire and it works great. I use #32 value 50 to layer LASS Stacc with spitfire's "short 0'5" since they've strayed from stacc but I like having staccato. That's where having both 42 & 50 on ks BLOCKED doesn't work because spitfire won't switch back articulations however on passthrough it works.

Here is an image in case I was confusing lol.






Also if it matters I am using expression maps to trigger the UACC for the keyswitches.



tack said:


> If you're doing a lot of these customizations for UACC, you may be better off creating individual keyswitches for each separate UACC value and passing through, then reconfiguring (or duplicating as needed) a UACC keyswitch where you want to do something different.



I'll try this and get back to you as this as you said might be easier and just use individual articulations to achieve this outside of the combination palette.

I've emailed you the .nkp as I might be messing something up lol. Let me know if I can be clearer or you need anything else :D


----------



## tack (Nov 12, 2017)

I just dropped version 2.2.2, another maintenance release with a couple fixes:

Handle CC123 (All Notes Off)
This should fix inconsistencies with Cubase expression maps using note-based keyswitches.

Fix a bug where notes could hang if the sustain pedal was being chased across more than 1 target channel

*Get it here. *(Or see the project page on Github.)


----------



## DMDComposer (Nov 12, 2017)

tack said:


> I just dropped version 2.2.2, another maintenance release with a couple fixes:
> 
> Handle CC123 (All Notes Off)
> This should fix inconsistencies with Cubase expression maps using note-based keyswitches.
> ...


Hi Tack,

Thanks for the update. Is the "Get it here" link updated to the flexrouter 2.2.2 script as I noticed in the script it still says 2.2.1?

If it is the same I tried copying the raw data from the project page but Im getting errors copying/pasting it in. I'm doing something wrong I imagine lol.

https://gyazo.com/15f3c67823318327375ed78491d8eb5a


----------



## tack (Nov 12, 2017)

DMDComposer said:


> Thanks for the update. Is the "Get it here" link updated to the flexrouter 2.2.2 script as I noticed in the script it still says 2.2.1?


Hm, the link looks good here. Perhaps you've browser cache issues? Maybe shift-reload to bypass the browser cache?

From a Linux shell:

```
$ curl -s https://urandom.ca/flexrouter/latest | grep set_script_title
set_script_title("FlexRouter 2.2.2")
```




DMDComposer said:


> If it is the same I tried copying the raw data from the project page but Im getting errors copying/pasting it in. I'm doing something wrong I imagine lol.


It looks like you're pasting the original uncompiled code, which Kontakt definitely won't like. The latest compiled script is what you want to paste in.


----------



## DMDComposer (Nov 12, 2017)

tack said:


> Hm, the link looks good here. Perhaps you've browser cache issues? Maybe shift-reload to bypass the browser cache?
> 
> From a Linux shell:
> 
> ...


Yes! That was it... man I feel silly that I didn't think of that.. thanks for helping and thank you so much for the update. :D


----------



## tack (Nov 12, 2017)

DMDComposer said:


> Yes! That was it... man I feel silly that I didn't think of that.. thanks for helping and thank you so much for the update. :D


No problem! If you need help or find bugs, you know where to find me.


----------



## Orchestrator (Mar 12, 2018)

Hi,

I just implemented your flex router into my Sibelius playback configuration and I am very happy with what it can do. I have one feature request though. Is it possible to add a plus sign underneath the target channel. It would be great if you can route incoming midi to multiple midi channels after pressing certain key switches. I want to double my sustained/legato patches with a staccato patch when there is an accent articulation used in Sibelius.


----------



## tack (Mar 12, 2018)

Orchestrator said:


> Is it possible to add a plus sign underneath the target channel. It would be great if you can route incoming midi to multiple midi channels after pressing certain key switches. I want to double my sustained/legato patches with a staccato patch when there is an accent articulation used in Sibelius.


I'll take a look. It may require a surprising amount of redesign under the hood, but if not I'll consider adding support for multiple destination channels per keyswitch. For now the solution is to create two separate keyswitches for the same MIDI event that have the different routing details.


----------



## Orchestrator (Mar 12, 2018)

tack said:


> For now the solution is to create two separate keyswitches for the same MIDI event that have the different routing details.



I tried your solution and it works perfect. Forget my request. Thanks a lot!


----------



## teammwrp (Nov 13, 2018)

Hi, I'm trying to use 2.2.2 and, from using Kontakt's MIDI Monitor in series after it, I see that it's multiplying a CC & value (which I _am_ meaning to send, but only once) dozens of times. Bypassing FR brings it back to the expected number of times, but I can't for the life of me figure out where FR is doing this multiplication. 

Any ideas?


----------



## tack (Nov 13, 2018)

@teammwrp does it to this even with an empty, unconfigured instance of FR? If not (and an out-of-box instance doesn't do this), can you save out your multiscript instance as a .nkp and PM it to me? I'll take a look (probably tomorrow evening though). Suffice it to say that's not expected behavior 

Also what CC event are you sending?


----------



## teammwrp (Nov 13, 2018)

I know it's probably a PEBKAC error. I'll PM you.


----------



## DMDComposer (Mar 8, 2019)

Hi,

Was wondering if someone could help me with my script. I've been working on it for hours and I can't figure out what I'm doing wrong. I feel it should be doable and must be a certain order or button I'm not seeing.

I'm looking for the following:

[A1] Legato
[A2] Sustains with/without vibrato (then cc2 controls without, romantic, strong vibrato switching to A2, B1, B2 for the different patches)
[A3] Shorts

Basically, I'm trying to reduce my keyswitches to 3 or 4 max channels. Then when I keyswitch on that specific channel, it'll open up various possibilities for different keyswitches that will only correspond when I'm on that channel. Which should work with flexrouter if I'm not mistaken?

I've attached my script for reference.

https://www.dropbox.com/s/ekw9irx5dhrhtkt/_Strings Channel Switching.nkp?dl=0


----------



## tack (Mar 8, 2019)

DMDComposer said:


> Basically, I'm trying to reduce my keyswitches to 3 or 4 max channels. Then when I keyswitch on that specific channel, it'll open up various possibilities for different keyswitches that will only correspond when I'm on that channel. Which should work with flexrouter if I'm not mistaken?


The misunderstanding here is thinking that CC2 will get routed to a new target channel by the Channel Switching rule, so that the Sustain Vibrato rule can use the target from the Channel Switching rule as its own source channel.

The source channel always refers to the originating MIDI coming into the multiscript -- there's no internal routing flow that performs internal translations to be processed by later rules

I think the easy solution here is to have two instances of FlexRouter: the first one is your Channel Switching rule, and the second one does the switching by CC2. In this case, the first instance _will_ route CC2 to the appropriate channel as it leaves the multiscript, and then the input to the second multiscript instance will indeed have the expected source channel.


----------



## tack (Mar 8, 2019)

@DMDComposer your nkp has reminded me that I actually need to cut a new release of FlexRouter. It had an off-by-one error that I fixed a while ago in the beta version, which results in some weird behaviour when removing keyswitches. This leaves the keyswitch array in a wonky state. You can see this problem when you try to delete the C7 keyswitch in your Sustain Vibrato rule.


----------



## DMDComposer (Mar 8, 2019)

tack said:


> @DMDComposer your nkp has reminded me that I actually need to cut a new release of FlexRouter. It had an off-by-one error that I fixed a while ago in the beta version, which results in some weird behaviour when removing keyswitches. This leaves the keyswitch array in a wonky state. You can see this problem when you try to delete the C7 keyswitch in your Sustain Vibrato rule.


Thats hilarious you just posted this. Because I was fixing my nkp from your suggestion (which worked great btw thank you,) that array bug was happening. I got fed up and just started from scratch but I'm glad to hear that you're aware of the bug. :D

Thanks Tack. :D


----------



## tack (Mar 8, 2019)

2.2.3 is now released, which has these changes since the previous release:

Fix strange issues deleting keyswitches, especially when deleting the last keyswitch in the list
Reduce event duplication with CC chasing
Fix bug when CC chasing and anti-CC-hanging were combined. This problem only occurred when routing to Kontakt ports B-D.
Fix help text in the Ignore Routing option
*Get it here. *(Or see the project page on Github.)

@DMDComposer please let me know if you encounter any more issues with the keyswitch deletion.


----------



## jamwerks (Mar 9, 2019)

Hi @tack, great product! I've used before and will do again when the Century 2.0's come out. Was there every any "how to" video made?


----------



## tack (Mar 9, 2019)

jamwerks said:


> Was there every any "how to" video made?


I'm afraid not. The closest thing would be the video I did for the 2.1 release which covers a bunch of new features and how to use them:


----------



## givemenoughrope (Jul 9, 2019)

Flexrouter plus vst expression...thing of beauty. Thank you, tack!


----------



## tack (Jul 9, 2019)

givemenoughrope said:


> Thank you, tack!


You're welcome! Very happy to hear you're getting good use out of it.


----------



## givemenoughrope (Jul 9, 2019)

Indeed. Cleans up the whole template really nicely.


----------



## jbuhler (Jan 23, 2020)

Just found this (via @ProfoundSilence) and so far so good. But I can’t figure out how to rename a rule. Is there a trick I’m missing?


----------



## ProfoundSilence (Jan 23, 2020)

jbuhler said:


> Just found this (via @ProfoundSilence) and so far so good. But I can’t figure out how to rename a rule. Is there a trick I’m missing?


click and drag.


----------



## tack (Jan 23, 2020)

jbuhler said:


> But I can’t figure out how to rename a rule. Is there a trick I’m missing?


Like ProfoundSilence said, you just click in the Rule Name text field. This focuses the element and you can type in it. You can click-drag to select text as usual, or the usual keyboard shortcuts work too (home, shift-end, delete/backspace, etc.)


----------



## jbuhler (Jan 23, 2020)

When I click and type nothing happens. But I'll try various combinations when I get back to my rig tonight.

ETA: Mojave, using Kontakt 6.2.1


----------



## JohannesR (Jan 23, 2020)

Works like a charm on Mojave here. Both Kontakt 5 and 6.

Flesxrouter is just brilliant - I love it!! Thanks tack!


----------



## jbuhler (Jan 23, 2020)

Ok, I figured it out. I was clicking in the wrong place, in the dropdown menu instead of the space next to the label "Rule Name." D'oh!

Thanks for the help!


----------



## nordicguy (Jan 12, 2021)

Hi,
I'm getting this error when pasting the "latest" text content:
<ERROR (line 3079): ignore_midi is not allowed in this callback type!>
line the error in referring to:
if (%blackholed_sources[$MIDI_CHANNEL] # 0)
ignore_midi
-> end if
This happens with Kontakt 5.8.1 (R43)
Any hints would be appreciated, thank you.


----------



## tack (Jan 12, 2021)

nordicguy said:


> I'm getting this error when pasting the "latest" text content:


Works fine for me?


----------



## nordicguy (Jan 12, 2021)

tack said:


> Works fine for me?


Thank you for the video and of course for the script tack!

EDIT: I was totally out of nowhere, sorry about that, had to use the script in Multi, of course...

Thanks again tack.


----------



## Theodor_the_1st (Mar 4, 2021)

@tack, I find your script extremely helpful! Thank you!

In Cubase 10.5.20 I've created the expression map like this:
A = 16 articulations (1-16) for the patch on channel 1
B = 16 articulations (17-32) for the patch on channel 2
C = 16 articulations (33-48) for both patches unison
total = 48 slots

Thanks to your script I can use a single MIDI note to play 2 patches at once. Hurray!


----------



## ProfoundSilence (Mar 4, 2021)

Theodor_the_1st said:


> @tack, I find your script extremely helpful! Thank you!
> 
> In Cubase 10.5.20 I've created the expression map like this:
> A = 16 articulations (1-16) for the patch on channel 1
> ...


Using keyswitches you can actually just activate as many as you want. 

I.e. if you have spiccato on channel 5 with F as a keyswitch and you have pizzicato on channel 6 with G as a keyswitch - you can just press F and G at the same time.


----------



## Theodor_the_1st (Mar 4, 2021)

ProfoundSilence said:


> Using keyswitches you can actually just activate as many as you want.
> 
> I.e. if you have spiccato on channel 5 with F as a keyswitch and you have pizzicato on channel 6 with G as a keyswitch - you can just press F and G at the same time.


Thanks, but I prefer multi patches (patches containing groups activated by different keys).


----------



## Theodor_the_1st (Mar 6, 2021)

@tack, is there a way to make FlexRouter ignore all the CC messages? I'd like to route only note messages. Thank you!


----------



## tack (Mar 6, 2021)

Theodor_the_1st said:


> @tack, is there a way to make FlexRouter ignore all the CC messages? I'd like to route only note messages. Thank you!


FlexRouter can't do event filtering, but you can always put the stock MIDI Filter KSP downstream of FlexRouter if you want to do selective filtering.


----------



## Theodor_the_1st (Mar 6, 2021)

tack said:


> FlexRouter can't do event filtering, but you can always put the stock MIDI Filter KSP downstream of FlexRouter if you want to do selective filtering.


The stock MIDI filter KSP affects all loaded patches, taking away the possibility of sending CC to them by other means.

This is how I've configured FlexRouter:






I think that a workaround would be to add a script like this one (see below) to the second patch (i.e. the patch that should receive only note data from FlexRouter).

``` KSP

on controller
if ($CC_NUM=7)
ignore_controller
end if
end on

```
Actually, all I need FlexRouter to do is route note data only (so the first patch could also ignore CC coming from FlexRouter).

I also asked for help here.


----------



## Theodor_the_1st (Mar 9, 2021)

tack said:


> FlexRouter can't do event filtering, but you can always put the stock MIDI Filter KSP downstream of FlexRouter if you want to do selective filtering.


(while studying FlexRouter)


----------



## tack (Mar 9, 2021)

Theodor_the_1st said:


> (while studying FlexRouter)


It must be said, FlexRouter was the product of much wailing and gnashing of teeth, the release of which was made possible only through sheer force of will.

It gave me a new respect for makers of sophisticated Kontakt libraries, and also made me fairly sure they're all certifiable.

That said, I _think_ Kontakt 6 has improved the particular area lamented within the screenshot. Admittedly it's been a while since I looked at KSP (after several failed suicide attempts my therapist obtained a court order that I cease and desist all use of KSP in the interest of my and public safety).

I believe I understand your use case from your screenshot, and a blanket "filter events of type X" when a keyswitch is activated probably wouldn't be too difficult to add.

Pull requests on GitHub will be reviewed with gratitude. 

(Though this reminds me, I have uncommitted changes to implement note transposition. I need to get a new release out the door.)


----------



## Theodor_the_1st (Mar 10, 2021)

Thank you kindly for the reply, @tack . It's hilarious!



tack said:


> I believe I understand your use case from your screenshot, and a blanket "filter events of type X" when a keyswitch is activated probably wouldn't be too difficult to add.


On an instrument script, you can't filter a CC coming from FlexRouter (a CC coming from a different channel than the one the patch is on). For example, if you use the ignore_controller command with the *if* ($MIDI_CHANNEL=*15* *and* $CC_NUM=*7*) condition, you'll effectively disable CC7. I really hope though that in the source code of FlexRouter this filtering can be done without too much effort.



> *tack:*
> 
> Pull requests on GitHub will be reviewed with gratitude.
> 
> (Though this reminds me, I have uncommitted changes to implement note transposition. I need to get a new release out the door.)


I'll create a pull request as soon as I find a solution. It's the least I can do.

EDIT: FlexRouter's Source Code is a bit hard to understand and while I try every day to find a solution (for filtering CC's), I'm also trying to make my own multi script. In the post #12 here I asked if anyone knows how to write a 3 element conditional (x and y and z). If anyone's interested in joining the discussion, please do so. This is why I edited this post.

EDIT 2: This is what I'm trying to achieve (a single note plays both patches at the same time, while CC7 is controlled using separate tracks):

View attachment Untitled.mp4


----------



## Theodor_the_1st (Mar 15, 2021)

@tack, in the FlexRouter's source code I have found a couple of lines that are not covered by the KSP Reference manual (like "define", "family" and "macro"). This makes me think you've used other sources to learn KSP. Am I right or this is something basic in scripting languages (that is understood by itself)?


----------



## tack (Mar 15, 2021)

Theodor_the_1st said:


> @tack, in the FlexRouter's source code I have found a couple of lines that are not covered by the KSP Reference manual (like "define", "family" and "macro"). This makes me think you've used other sources to learn KSP


FlexRouter uses Nils Liberg's KSP extensions, which provide many useful abstractions on top of KSP to make it suck just a little bit less:









GitHub - jtackaberry/flexrouter: Flexible keyswitch router for Kontakt (multiscript)


Flexible keyswitch router for Kontakt (multiscript) - GitHub - jtackaberry/flexrouter: Flexible keyswitch router for Kontakt (multiscript)




github.com


----------



## Theodor_the_1st (Mar 15, 2021)

Uh... now we're talking.
Thank you!

I found all the information I needed here:


Nils Liberg's Kontakt Script Editor



🥳


----------



## Theodor_the_1st (Mar 23, 2021)

(while reading Alicia Keys Library documentation)


----------



## lydian91 (Apr 2, 2021)

tack said:


> Option to have the keyswitch only process translations (redirections), but not affect current routing
> 
> Sometimes you just want a simple translator.
> Use-case: shorts combination patch on channel 1, longs combination patch on channel 2. C0 routes to channel 1, D0 routes to channel 2. CC1 0-32 redirects to F1 and CC1 33-64 redirects to G1 (which are keyswitches on the target patches), both with "ignore routing" option. This allows CC1 to control the patch that had been previously selected by either C0 or D0.


I'm not entirely understanding the "Ignore routing" function. I'm currently setting up CSS.

For example, I have several duplicate patches of the 1st Violins in one instance of Kontakt (within VE Pro).

Single VEP Channel (set to "All"):
• CSS Vln 1 Patch A (MIDI channel 1) — for sustain
• CSS Vln 1 Patch B (MIDI channel 2) — for shorts (i.e. staccato/marcato)
• Etc..

So for the shorts on channel 2, the rule receives program changes and redirects to cc58 to trigger the articulations based on the developer's default values (e.g. 11-15 for spicc, 16-20 for staccatissimo, etc.). So the source is channel 2 and and the target is also channel 2.

The confusing part is that the four CSS "staccato" variations do not trigger unless "Ignore routing" is turned on for each redirection. Within this same rule, I have two additional redirections that trigger marcato via CC58 (one with overlay, the other without). These trigger just fine without "Ignore routing" enabled.

Why are staccato and marcato variations reacting differently to this feature when they are in the same patch, being triggered the same way within the same FlexRouter rule?

**Edit: I'm noticing the discrepancy is only occurring in VE Pro. I tried the same script with Kontakt hosted in DP and "Ignore routing" was not necessary for the staccato articulations.


----------



## tack (Apr 9, 2021)

Really sorry @lydian91 about the slow reply.



lydian91 said:


> I'm not entirely understanding the "Ignore routing" function.


Normally when you activate a keyswitch, FlexRouter will set up routing from the source channel to the target channel, such that after the keyswitch is triggered, any subsequent non-keyswitch events coming in on the source channel will be diverted to the target channel. When "Ignore routing" is enabled on a keyswitch, redirects (i.e. injected events) are processed as usual, but the routing is not changed, so whatever the previous (non "ignore routing") keyswitch had established in terms of routing is preserved.

One of FlexRouter's key use cases is to be able to control multiple patches, each on different channels within Kontakt, from a single MIDI channel in your DAW. This is the Router of FlexRouter. 

In your case, because you said that source channel was set to 2, it sounds like you don't actually need routing. This implies that, within your DAW, you're directly setting the channel of events destined for the longs patch to channel 1, and events destined for the shorts patch to channel 2? And are you also setting the program change events explicitly to channels 1 and 2?

If this is the case, indeed, you want the source channel in FR set to channel 2. And you'd also want the keyswitch channel and the target channel set to channel 2 for that rule. For sustains, you'd want _another_ rule all likewise set to channel 1. A rule can only establish a single route (in this case it's just channel 1 routing to channel 1, or channel 2 routing to channel 2), so if you want channels 1 and 2 to operate independently, you'll need 2 rules. (I appreciate this is not particularly clear, and the lack of documentation doesn't help things here. In fact, I even needed to remind myself how that worked. )

Now, if you actually _do_ want to control everything from a single channel in your DAW, and have the program changes all on a single channel control which patch in Kontakt future events are routed to -- this being the primary use case for FlexRouter -- then you just need 1 rule, set the keyswitch and source channel for that rule to whatever channel you want to use in your DAW (or omni if you don't care), and then have the keyswitches set the specific target channel where the patch is.

Hope that helps!


----------



## lydian91 (Apr 10, 2021)

tack said:


> Hope that helps!


Very much so, thanks!


----------



## lucor (Sep 18, 2021)

Jason, I know you're a very busy man, but if you ever decide to work on FlexRouter again, what would be really cool would be the possibility to set a _delay _for each keyswitch.

For example, let's say I have an instrument with 3 articulations, which each have a rough delay of 20ms, 40ms and 70ms.
I could then delay the notes of the first two articulations by 50ms and 30ms and then set the whole track to a predelay of -70ms, and everything will line up perfectly to the beat. This would also open up amazing possibilities for using Kontakt with Notation software, where nudging notes around is even more of a pain in the ass.

The problem here is of course when playing things live, since the 20ms articulation will now be much less responsive, but maybe a global CC to turn the delays on and off would help?

I'd really wish that DAWs would start to implement the option to set separate predelays in their keyswitch systems instead, so this wouldn't be needed, but I'm not holding my breath (though at least Digital Performer has just taken a first step towards it).


----------



## TonalDynamics (May 16, 2022)

tack said:


> 2.2.3 is now released, which has these changes since the previous release:
> 
> Fix strange issues deleting keyswitches, especially when deleting the last keyswitch in the list
> Reduce event duplication with CC chasing
> ...


Thank you Tack for this helpful tool.

I am however running into a fairly severe bump in the road - how do you make a certain rule _stop _transmitting on the target channel once you switch articulations?

I have a staccato overlay set up with BST, Stac. on CH 3 and Legato on CH 1 via redirects.

The rule works, but when I switch short articulations the legato keeps playing (not good)

So the target channel continues to transmit sound even after I send a subsequent channel change message to Kontakt, as well as receive MIDI so it keeps changing articulations 🤔


Is there some kind of 'killswitch' CC I can bake into my Sound Variations to stop this behavior?

Cheers


----------



## tack (May 16, 2022)

TonalDynamics said:


> I am however running into a fairly severe bump in the road - how do you make a certain rule _stop _transmitting on the target channel once you switch articulations?


When you trigger a keyswitch that sets up a route to a different channel, new events _do_ stop going to the old channel.



TonalDynamics said:


> The rule works, but when I switch short articulations the legato keeps playing (not good)
> 
> So the target channel continues to transmit sound even after I send a subsequent channel change message to Kontakt, as well as receive MIDI so it keeps changing articulations 🤔


Just to be clear, "channel change" isn't a MIDI message, this just a route mapping that FlexRouter maintains, routing incoming events to potentially different channels downstream to Kontakt.

But the use case you're describing is standard fare for FlexRouter. When you activate a keyswitch, the route is changed. If you have an active note on the previous channel, FlexRouter tracks it and will replay the note-up event back to the original MIDI channel that received the note-down, even if that's not the current target channel. This is standard anti-hanging logic.

So I'm not sure what's going wrong for you. Save out your FlexRouter instance as a preset and email me the resulting .nkp file, along with a .mid file that contains the events that reproduces what you're seeing, and I'll take a look.


----------



## JohannesR (May 16, 2022)

@tack I can’t express how much I love FlexRouter. One of those small things that makes life easier big time! The cure for sample library inconsistencies. Should be a donation feature somewhere!!


----------



## TonalDynamics (May 16, 2022)

tack said:


> Just to be clear, "channel change" isn't a MIDI message, this just a route mapping that FlexRouter maintains, routing incoming events to potentially different channels downstream to Kontakt.


Forgive me, I should have been more clear on that point:

I'm using Studio One Sound Variation (basically articulation sets) MIDI events to trigger the rules in FR, i.e. the 'stac. overlay' articulation in the middle here:




So I'm sending CC58:0 into my rule via CH1 thusly:









^ I have two Keyswitches within the same rule

Top KS plays legato on CH1 CAPSULE multi instrument
Bottom KS plays the CH3 Staccato (another CAPSULE in the same Kontakt instance)
So that works fine - but I can't get MIDI to stop transmitting from CH1 to CH3 _or _get CH3 to stop playing, if that makes sense.

For instance, if I click any of these long articulations (which are also on CH1) after I use my stac. overlay (invoking FR rule):





It 'sends' that CH Change message to Kontakt, yet CH3 (shorts) continues to play, and even the articulations keep switching in parity with whatever slot gets selected in CH1.

So Kontakt still thinks CH3 is 'active' somehow.

Is this a disconnect between the way Studio One handles sending CH change messages to Kontakt, and the way FR is managing it?

Is there some other way I should be going about this?

Thanks so much.


----------



## TonalDynamics (May 16, 2022)

I've effected a workaround and going to post it here for any forlorn S1 users to use if they run across this issue:



tack said:


> the use case you're describing is standard fare for FlexRouter. When you activate a keyswitch, the route is changed


I did not find this to be the case, either when triggering a new KS from my DAW articulation map, or within the FR rule.

What _does work _however is to create a quick-and-dirty manual 'reset' articulation in your DAW (sound variation in my case):






I just used the next CC58 velocity value, but you can ostensibly use any trigger you wish as long as it doesn't conflict with any existing articulation maps.

Then go back into FlexRouter, MIDI Learn the new articulation, set the source for the 'hanging channel' (the one that's triggering by mistake; in my case CH3 is receiving input from CH1 against my wishes, so I use CH1 as the source) in question as the source and target, and set to 'passthrough', like this:







And you now have a way to kill the extra channels from sounding. All that's left is to add it to the Sound Variation timeline ex post facto, like this:







Hopefully this may save someone a chunk of time at some point.

Cheers


----------



## tack (May 16, 2022)

TonalDynamics said:


> ^ I have two Keyswitches within the same rule
> 
> Top KS plays legato on CH1 CAPSULE multi instrument
> Bottom KS plays the CH3 Staccato (another CAPSULE in the same Kontakt instance)


I'm with you so far. Send CC58 value 0 on ch1 to FR and FR will send C0 to both ch1 and ch3, and then setup a route so that all subsequent MIDI from ch 1 is routed to both ch1 and ch3 -- until the next keyswitch event occurs that changes the routing again, importantly.



TonalDynamics said:


> So that works fine - but I can't get MIDI to stop transmitting from CH1 to CH3 _or _get CH3 to stop playing, if that makes sense.


The way to get it to stop is to send a different FR-configured keyswitch that changes the routing arrangement.



TonalDynamics said:


> It 'sends' that CH Change message to Kontakt


I still don't quite understand what you mean by this. I mean, I _think_ I know what you mean, but there's no such message to send. This isn't part of the MIDI protocol. MIDI channel is a property of each event (well, non-system messages anyway), rather than a distinct message. So maybe you mean something else than what I'm understanding?



TonalDynamics said:


> I did not find this to be the case, either when triggering a new KS from my DAW articulation map, or within the FR rule.


Was that new KS defined in FR? So far we've only talked about two (overlapping) keyswitches assigned to CC58/0. Until FR receives a KS for something that it thinks is a KS, it won't change the routing.



TonalDynamics said:


> All that's left is to add it to the Sound Variation timeline ex post facto, like this:


Based on my reading of this screenshot -- and I don't know S1 so forgive me if I proceed to make some bogus assumptions, and cluebatting on S1's operation is welcome -- each of those articulation changes are presumably configured by S1 to emit some sort of MIDI message(s) and/or modify the target channel of events being sent to Kontakt. We know that the Stac Overlay articulation sends CC58/0. But if Legato sent out a keyswitch that FR was configured for (something _other_ than CC58/0), then you wouldn't need your Overlay Reset KS. You could just have the Legato KS in FlexRouter setup to route only to channel 1.

Say for example:

Stac Overlay - sends CC58/0 (as before)
Rule 1 KS 1: route to ch 1, send C0 on ch 1
Rule 1 KS 2 (overlaps with KS 1): route to ch 3, send C0 on ch 3

Legato - sends CC58/1 (new)
Rule 1 KS 3: route to ch 1, send C0 on ch 1


Then when you activate legato again, it will disable the staccato overlay (i.e. it will stop routing to ch3).


----------



## tack (May 16, 2022)

JohannesR said:


> @tack I can’t express how much I love FlexRouter. One of those small things that makes life easier big time! The cure for sample library inconsistencies. Should be a donation feature somewhere!!


Thanks Johannes! I'm delighted to hear it. My position on donations can be found over on the website for my related project Reaticulate.


----------



## TonalDynamics (May 16, 2022)

tack said:


> I still don't quite understand what you mean by this. I mean, I _think_ I know what you mean, but there's no such message to send. This isn't part of the MIDI protocol. MIDI channel is a property of each event (well, non-system messages anyway), rather than a distinct message. So maybe you mean something else than what I'm understanding?


Yeah it's just a feature of S1's Sound Variations (not at first, but was added due to massive demand), to be able to send MIDI over different channels (16 per VSTi), in order to achieve similar results to what FlexRouter does.

Sadly, it _still_ doesn't allow transmitting over multiple channels at once, a year or so later, which essentially cripples the feature for my layering needs and ended up leading me to FlexRouter.



tack said:


> The way to get it to stop is to send a different FR-configured keyswitch that changes the routing arrangement.


Yes I thought as much, and tested by making a 'dummy' keyswitch on CC58:2 - but somehow couldn't get it to work...

However I Just tested it again and just copied the exact Activation Sequence of the Legato Keyswitch verbatim (CH1 | C 0) into a FR KS-and it works- but I had to input the correct source channel manually.

The only downer there is that I will have to do it for all 40-60 of my articulations _per_ instrument, and while the learn function should make quick work of that, I'll have to go through for literally thousands of KS and input the correct channel (I fill up 1-16 on most of my Kontakt section multis).

Good to know that I can at least get it working, though!

Does 'Learn++' detect input channel as well as notes?

Thanks for the help btw


----------



## TonalDynamics (May 17, 2022)

Sorry, I've _almost_ got this nailed down but I'm still hung up at the last issue:

In order to add a list of an instrument's articulations as FR KS as you mentioned here,



tack said:


> The way to get it to stop is to send a different FR-configured keyswitch that changes the routing arrangement.


I'm having to not only go through and 'learn' every KS, but also manually configure the Source and Target channels for _each _keyswitch to allow simple passthrough.

Thing is, every Target CH. is identical to the Source CH., and the Learn feature doesn't seem to detect channel input, so I'm going to have to go through and do this manually for every articulation/instrument combo in my arsenal when I make a FR KS.

Is there some kind of option to make the default target 'same as source'?
Because having to do this manually for thousands of KS (eventually) is going to be a huge time-sink.

I actually can't believe this issue hasn't come up with other users before, since it's not really so much a bug as it is an interaction with the most common use-case involving automated articulation switching.

At this point I'm still looking at my 'reset button' band-aid as the most efficient solution.

Any other suggestions to make this a more streamlined process?

Thanks again,
TD


----------

