FX Mapping Actions - FunkybotsEvilTwin/CSIUserGuide GitHub Wiki

CSI allows you to map plugin parameters to your control surface. See FX Mapping: Learn Mode and FX Mapping: Manual for details on how to map your FX and instruments to your surface. See FX Zone Activation Methods for details on how to activate those maps.


FX Mapping Actions

LearnFocusedFX

Once properly configured, LearnFocusedFX is the CSI action to engage Learn mode. This allows you to quickly map FX and instruments to your controller. See FX Mapping: Learn Mode for additional information.

Zone Home
    Instrument     LearnFocusedFX

FXParam

FXParam is the CSI action to control a plugin parameter. Let's say we've followed the steps in Finding FXParam Numbers and we can see that ReaComp's parameter list looks something like this...

Zone "VST: ReaComp"
     FXParam 0 "Thresh"
     FXParam 1 "Ratio"
     FXParam 2 "Attack"
     FXParam 4 "Release"
...
ZoneEnd

If you want to map these first four parameters to the first four rotary knobs on your surface, you'd use the following syntax (in this case my widget names are RotaryA1 through A4, yours may vary):

Zone "VST: ReaComp"
RotaryA1      FXParam 0
RotaryA2      FXParam 1
RotaryA3      FXParam 2
RotaryA3      FXParam 4
ZoneEnd

Alternatively, if you wanted to include the names (not as displays, that's coming in the next section, but just for easy reference) this is also acceptable...

RotaryA1 FXParam 0 "Thresh"
RotaryA2 FXParam 1 "Ratio"
RotaryA3 FXParam 2 "Attack"
RotaryA3 FXParam 4 "Release"

...as is this method (using trailing comments)...

RotaryA1 FXParam 0 //Thresh
RotaryA2 FXParam 1 // Ratio
RotaryA3 FXParam 2 // Attack
RotaryA3 FXParam 4 // Release

FXParamNameDisplay

If you wanted to add in the name of the the Parameter to the corresponding display, that would look like this...

DisplayUpperA1 FXParamNameDisplay 0 "Thresh"
RotaryA1 FXParam 0
DisplayUpperA2 FXParamNameDisplay 1 "Ratio"
RotaryA2 FXParam 1
DisplayUpperA3 FXParamNameDisplay 2 "Attack"
RotaryA3 FXParam 2
DisplayUpperA3 FXParamNameDisplay 3 "Release"
RotaryA3 FXParam 4

FXParamValueDisplay

And if you wanted to use one of your displays to show the actual parameter value (e.g. "32ms" or "220hz") on your displays, there is a CSI action for that as well. Combining all three examples together you'd end up with the following:

DisplayUpperA1 FXParamNameDisplay 0 "Thresh"
DisplayLowerA1 FXParamValueDisplay 0 
RotaryA1 FXParam 0
/
DisplayUpperA2 FXParamNameDisplay 1 "Ratio"
DisplayLowerA2 FXParamValueDisplay 1 
RotaryA2 FXParam 1
/
DisplayUpperA3 FXParamNameDisplay 2 "Attack"
DisplayLowerA3 FXParamValueDisplay 2 
RotaryA3 FXParam 2
/
DisplayUpperA4 FXParamNameDisplay 3 "Release"
DisplayLowerA4 FXParamValueDisplay 3 
RotaryA4 FXParam 4

You may notice in the above example I broke up each set of widgets with an empty row with a single / character. This essentially "comments out" the empty line, but will make your .zon file easier to read and troubleshoot later on, so I recommend this as a best practice when grouping together multiple widgets for a single FX parameter.

FXNameDisplay

If you want your display to show the FX Name, you could simply add a line to one of your display widgets such as:

DisplayUpperA1 FXNameDisplay

Which would display on your surface (continuing the example from above with ReaComp):

VST: ReaComp (Cockos)

FXMenuNameDisplay

FXMenuNameDisplay is typically used in TrackFXMenu and SelectedTrackFXMenu zones to show the name of the FX loaded into the corresponding FX slot. If there is a plugin alias in the fx.zon file, it will display the alias. Otherwise, it will display the full plugin name from the first line of the zone file, including the plugin format and any vendor information. It's recommended that users create a plugin alias when creating fx.zon files for this reason.

Zone TrackFXMenu
        DisplayUpper|         FXMenuNameDisplay
        DisplayLower|         FXBypassDisplay
        Rotary|               NoAction
        RotaryPush|           ShowFXSlot
        RotaryPush|           GoFXSlot
        Mute|                 ToggleFXBypass
        Left                  TrackFXMenuBank -1
        Right                 TrackFXMenuBank 1
ZoneEnd

GoFXSlot

GoFXSlot is used in TrackFXMenu and SelectedTrackFXMenu zones to activate the FX mapping for the corresponding FX slot. See the example below from a TrackFXMenu where pressing RotaryPush will activate the FX map for the corresponding FX.

Zone TrackFXMenu
        DisplayUpper|         FXMenuNameDisplay
        DisplayLower|         FXBypassDisplay
        Rotary|               NoAction
        RotaryPush|           ShowFXSlot
        RotaryPush|           GoFXSlot
        Mute|                 ToggleFXBypass
        Left                  TrackFXMenuBank -1
        Right                 TrackFXMenuBank 1
ZoneEnd

ShowFXSlot, HideFXSlot

ShowFXSlot will float the GUI for the corresponding FX slot on the surface. When paired with GoFXSlot as shown below, activating the FX slot on your surface will both map the FX on the surface and open the GUI on screen.

Zone TrackFXMenu
        DisplayUpper|         FXMenuNameDisplay
        DisplayLower|         FXBypassDisplay
        Rotary|               NoAction
        RotaryPush|           ShowFXSlot
        RotaryPush|           GoFXSlot
        Mute|                 ToggleFXBypass
        Left                  TrackFXMenuBank -1
        Right                 TrackFXMenuBank 1
ZoneEnd

HideFXSlot will similarly close the GUI. This can be paired with the OnZoneDeactivation virtual widget to automatically close the GUI when the FX mapping is disabled as shown below.

Zone FXEpilogue
     OnZoneDeactivation  HideFXSlot
     Plugin              ClearFXSlot    
ZoneEnd

ToggleFXBypass

Use this action in a SelectedTrackFXMenu or TrackFXMenu zone to assign toggling the FX Slot to a button.

Zone TrackFXMenu
        DisplayUpper|         FXMenuNameDisplay
        Rotary|               NoAction
        RotaryPush|           GoFXSlot
        Mute|                 ToggleFXBypass
        Left                  TrackFXMenuBank -1
        Right                 TrackFXMenuBank 1
ZoneEnd

FXBypassDisplay

If you want to add the FX state ("Enabled" or "Bypass") to the SelectedTrackFXMenu or TrackFXMenu you would utilize the FXBypassDisplay action as shown below:

Zone TrackFXMenu
        DisplayUpper|         FXMenuNameDisplay
        DisplayLower|         FXBypassDisplay
        Rotary|               NoAction
        RotaryPush|           GoFXSlot
        Mute|                 ToggleFXBypass
        Left                  TrackFXMenuBank -1
        Right                 TrackFXMenuBank 1
ZoneEnd

ToggleFXOffline, FXOfflineDisplay

Use ToggleFXOffline to change the FX status to "offline" in Reaper. Offline FX is similar to Bypass, but it removes the plugin from memory and additional processing. In the below example, it's assigned to Shift+Mute. The corresponding display action is FXOfflineDisplay.

Zone SelectedTrackFXMenu
        DisplayUpper|         FXMenuNameDisplay
        DisplayLower|         FXBypassDisplay
        Shift+DisplayLower|   FXOfflineDisplay
        Rotary|               NoAction
        RotaryPush|           GoFXSlot
        Mute|                 ToggleFXBypass
        Shift+Mute|           ToggleFXOffline
        Left                  SelectedTrackFXMenuBank -1
        Right                 SelectedTrackFXMenuBank 1

        RecordArm|            NoAction
        Solo|                 NoAction
        Select|               NoAction
     Fader|                   NoAction    
ZoneEnd

LastTouchedFXParam, ToggleEnableLastTouchedFXParamMapping, DisableLastTouchedFXParamMapping

LastTouchedFXParam is a CSI action that allows you to assign a control on your surface to the last touched plugin parameter. This can be a very fast way to assign plugin parameters to your surface without having to create an fx.zon in advance. This is very useful for quickly writing automation or tweaking a plugin parameter.

For instance, let's say you already have Fader1 on your surface mapped to track volume of the Selected track, and you want to map Shift+Fader1 the last-touched FX parameter. Your .zon file might look like this...

Zone SelectedTrack
     Fader1              TrackVolume
     Shift+Fader1        LastTouchedFXParam
ZoneEnd

Now, when you enable the Shift modifier, Fader1 will control the last touched plugin parameter. If you want to change the parameter you're controlling, just use your mouse and move the next plugin parameter. Your surface will update to control the new parameter as long as you're still in Shift mode (or when you next hold down the shift modifier). Tip: a quick tap of Shift latches the shift modifier - very handy in this example.

You can also have a LastTouchedFXParam zone and toggle it via the ToggleEnableLastTouchedFXParamMapping action. The default state for this action is off.

Zone Home
     F2                  ToggleEnableLastTouchedFXParamMapping   
ZoneEnd

Which then calls up this LastTouchedFXParam.zon.

Zone LastTouchedFXParam
     Fader1              LastTouchedFXParam
     DisplayUpper1       LastTouchedFXParamNameDisplay
     DisplayLower1       LastTouchedFXParamValueDisplay
ZoneEnd

There is also a DisableLastTouchedFXParam mapping. For instance, you can combine that action with the GoHome action to ensure that LastTouchedFXParam mapping gets turned off whenever you GoHome.

     Track                ClearModifiers 
     Track                DisableLastTouchedFXParamMapping Feedback=No
     Track                GoHome

LastTouchedFXParamNameDisplay and LastTouchedFXParamValueDisplay

As shown in the LastTouchedFXParam.zon above, let's say our surface has displays and we want the upper display to show the Parameter Name and lower display to show the parameter value whenever the LastTouchedFXParam zone is active. The LastTouchedFXParamNameDisplay and LastTouchedFXParamValueDisplay actions are designed to do just that.

Zone LastTouchedFXParam
     Fader1               LastTouchedFXParam
     DisplayUpper1        LastTouchedFXParamNameDisplay
     DisplayLower1        LastTouchedFXParamValueDisplay
ZoneEnd

FXParamRelative

FXParamRelative uses the value from the controller as a delta and adds it to the current parameter value. If the value is negative, that amounts to subtracting it from the current parameter value.

     SomeWidget    FXParamRelative 4

FXGainReductionMeter

A small handful of plugins (I believe VST3) will report Gain Reduction values to the host, allowing you to see how much compression (for example) is taking place. If the plugin supports this, you can assign this to a widget in CSI.

     VUMeter        FXGainReductionMeter   

ToggleEnableFocusedFXMapping, DisableFocusedFXMapping

FocusedFX mapping is enabled by default. This means if you have a fx.zon file for a particular FX/instrument plugin, and open the GUI in Reaper, that mapping will become activated on your surface as the default behavior. You can toggle this behavior off and on by assigning a button to the ToggleEnableFocusedFXMapping action as shown below:

     AudioInstrument    ToggleEnableFocusedFXMapping

There is also a DisableFocusedFXMapping action that can be used to turn it off. If you wanted to disable FocusedFXMapping by default, you could stick this in your Home zone for example as shown below:

Zone Home
OnInitialization DisableFocusedFXMapping
    IncludedZones
        Track
        MasterTrack
    IncludedZonesEnd
ZoneEnd

TCPFXParam, TCPFXParamValueDisplay, TCPFXParamNameDisplay

CSI allows it to automatically map widgets to the TCP fx on the selected track. This has the benefit of allowing a single zone to control multiple FX on the same channel and automatically update as you navigate from track to track. If you've ever used Cubase's Quick Controls, this is a very similar workflow.

The SelectedTrackTCPFX zone, acts as a template that dictates the mapping of TCP FX. The TCPFXParam, TCPFXParamValueDisplay, and TCPFXParamNameDisplay actions are all used to dictate how those FXParams are mapped to your surface. See the example below for an MCU/X-Touch style surface.

Zone SelectedTrackTCPFX

     DisplayUpper1       TCPFXParamNameDisplay 0
     DisplayLower1       TCPFXParamValueDisplay 0
     Rotary1             TCPFXParam 0

     DisplayUpper2       TCPFXParamNameDisplay 1
     DisplayLower2       TCPFXParamValueDisplay 1
     Rotary2             TCPFXParam 1

     DisplayUpper3       TCPFXParamNameDisplay 2
     DisplayLower3       TCPFXParamValueDisplay 2
     Rotary3             TCPFXParam 2

     DisplayUpper4       TCPFXParamNameDisplay 3
     DisplayLower4       TCPFXParamValueDisplay 3
     Rotary4             TCPFXParam 3

     DisplayUpper5       TCPFXParamNameDisplay 4
     DisplayLower5       TCPFXParamValueDisplay 4
     Rotary5             TCPFXParam 4

     DisplayUpper6       TCPFXParamNameDisplay 5
     DisplayLower6       TCPFXParamValueDisplay 5
     Rotary6             TCPFXParam 5

     DisplayUpper7       TCPFXParamNameDisplay 6
     DisplayLower7       TCPFXParamValueDisplay 6
     Rotary7             TCPFXParam 6

     DisplayUpper8       TCPFXParamNameDisplay 7
     DisplayLower8       TCPFXParamValueDisplay 7
     Rotary8             TCPFXParam 7

ZoneEnd

JSFXParam

The JSFXParam action is used when mapping Reaper's JS effects. These effects do not use normalized parameter ranges like VST, VST3, AU, CLAP fx, and thus require their own action type to alert CSI of the non-normalized ranges. Note: you may still encounter issues with JSFXParams depending on the plugin and how it's range is configured.

Here's an example from the JS Chorus fx.

Zone "JS: Chorus" "JSChorus"

     Fader1 JSFXParam 0
     RotaryPush1 NoAction 
     Rotary1 NoAction 
     DisplayUpper1 FixedTextDisplay "Chorus Length (ms)" 0 
     DisplayLower1 FXParamValueDisplay 0 

     Fader2 JSFXParam 1
     RotaryPush2 NoAction 
     Rotary2 NoAction 
     DisplayUpper2 FixedTextDisplay "Number Of Voices" 1 
     DisplayLower2 FXParamValueDisplay 1 

     Fader3 JSFXParam 2
     RotaryPush3 NoAction 
     Rotary3 NoAction 
     DisplayUpper3 FixedTextDisplay "Rate (Hz)" 2 
     DisplayLower3 FXParamValueDisplay 2 

     Fader4 JSFXParam 3
     RotaryPush4 NoAction 
     Rotary4 NoAction 
     DisplayUpper4 FixedTextDisplay "Pitch Fudge Factor" 3 
     DisplayLower4 FXParamValueDisplay 3 

     Fader5 JSFXParam 4
     RotaryPush5 NoAction 
     Rotary5 NoAction 
     DisplayUpper5 FixedTextDisplay "Wet Mix (dB)" 4 
     DisplayLower5 FXParamValueDisplay 4 

     Fader6 JSFXParam 5
     RotaryPush6 NoAction 
     Rotary6 NoAction 
     DisplayUpper6 FixedTextDisplay "Dry Mix (dB)" 5 
     DisplayLower6 FXParamValueDisplay 5 

     Fader7 NoAction 
     RotaryPush7 FXParam 6 
     Rotary7 NoAction 
     DisplayUpper7 FixedTextDisplay "Bypass" 6 
     DisplayLower7 FXParamValueDisplay 6 

     Fader8 NoAction 
     RotaryPush8 NoAction 
     Rotary8 NoAction 
     DisplayUpper8 NoAction 
     DisplayLower8 NoAction 

ZoneEnd