Defining capabilities If we want to use one or more Control Surfaces with CSI, we need to define what capabilities they have. ie. what controls they have (eg. buttons, faders, encoders, etc), what feedback mechanisms they have (displays, lights, etc), etc. .mst files are for midi devices and are used in the following examples -- similarly, .ost files are for OSC devices -- see the CSI/Surfaces/OSC folder for OSC examples. Note, this is nothing yet to do with what should happen when those buttons, etc are clicked, we're just defining the capabilities. We define these capabilities in a file with a .mst extension. Beyond the .mst extension, the rest of the filename is up to you, but it makes sense for it to reflect the model of controller. So for a BCF2000 control surface, I'd have a BCF2000.mst file, for a Launchpad Mini, I'd probably have a LaunchpadMini.mst. Here's a snippet from one of my .mst files: Widget Rotary8 Fader7Bit b0 20 7f FB_Fader7Bit b0 20 00 Toggle 90 1f 7f WidgetEnd Widget RotaryPush8 Press 90 1f 7f WidgetEnd Widget UpperButton1 Press 90 20 7f FB_TwoState 90 20 7f 90 20 00 WidgetEnd Widget Fader1 Fader14Bit e0 7f 7f FB_Fader14Bit e0 7f 7f Touch 90 68 7f 90 68 00 WidgetEnd A few things to note: • We're defining named Widgets. A Widget very often maps to a single physical control on a Surface, however it's important to realise it doesn't have to. For example a Widget may be a combination of a button and separate LED. • Within each Widget, we define the capabilities of that widget. These could be one or more of either: ◦ Message Generators - things that will result in a message being sent to CSI. eg. Press, Fader14Bit, etc ◦ Feedback Processors - things that will receive a message back from CSI to display feedback on the surface. eg. FB_TwoState, FB_Fader14Bit, etc where the FB represents FeedBack. • Each of the Message Generators and Feedback Processors may have a varying number of parameters that follow them that define the MIDI Message details sent/received and other behaviour. Look at the specific Message Generators/Feedback Processors you are using to see what parameters it supports. So for example, my UpperButton1 Widget is defined as: Widget UpperButton1 Press 90 20 7f FB_TwoState 90 20 7f 90 20 00 WidgetEnd Which says this Widget is a combination of a: • Press MIDI Generator, which means when pressed it will send the MIDI Message 90 20 7f • and a FB_TwoState Feedback Processor, which will: ◦ receive a MIDI Message of either 90 20 7f or 90 20 00 and display that to the user. In my case, this is displayed as an LED, where 90 20 7f represents the On state and 90 20 00 represents the Off state. Whereas my RotaryPush8 widget is much simpler, using a Press Message Generator that sends only the MIDI Message 90 20 7f when it is pressed. Nothing on release, and no feedback. Widget RotaryPush8 Press 90 1f 7f WidgetEnd Note: • Because the .mst file doesn't specify anything about behaviour, just surface capabilities, in theory anyone with the same model surface should be able to reuse the same .mst file, even if they want to assign different behaviours to those controls. eg. If I have a BCF2000, and so do you, in theory we can use the same .mst file. However, be careful here as if you have changed the configuration of your surface, it may be sending different midi messages, in which case someone else's .mst file may not work for you. • It's easy to forget that you're not controlling what the surface does in your MST. It is more accurate to say you are reflecting what it does. For example, if my surface isn't currently sending a message on button release, then defining it as a Press control with a Release message in your .mst won't magically make it start. Either edit the surface (if possible) to make it do that, or define it in the .mst as a Press with a single message. Message Generators Message Generators allow you to define what MIDI messages the surface sends to CSI: • Press - a simple generator that sends a single MIDI message on press, and optionally sends another message when released. Often, but not limited to, a button. • AnyPress - a variation of Press needed for some devices. • Fader7Bit - sends a MIDI message in a range specifying the current absolute value of the control. • Fader14Bit - like Fader7Bit, but has a larger (or more fine grained) set of values. • Encoders - unlike the Faders, an Encoder sends a relative value (increase/decrease) • MFTEncoder - a special encoder only found on the Midi Fighter Twister controller The general pattern here is to use the MIDI Monitor to observe what values are sent when your widget is manipulated. So for example, when I press one of the buttons on my controller I see this: images/MIDIMonitor.png The first line showed up when I pressed, the second one when I let go, so a reasonable assumption is the MIDI Generator in my Widget should be: Press 90 5d 7f 90 5d 00 That said, please read the section on Press for some guidance/recommendations. Feedback Processors Feedback Processors allow you to define how your Widget will display feedback from CSI to the user. A simple example may be lighting up an LED to indicate the Mute/Solo state of a track. Another may be positioning a motorised fader to the correct position for Track Volume. It is important to understand how this works in practise. Let's say we have a button defined in our MST file that has an LED light to indicate its status. Widget UpperButton1 Press 90 20 7f FB_TwoState 90 20 7f 90 20 00 WidgetEnd Then in our Zone file, we bind it to our TrackMute action. UpperButton1 TrackMute Here's the best case flow of what happens when we press the button on the surface: • Press the button • The surface sends the 90 20 7f message to CSI • CSI attempts to mute the track in Reaper • CSI then queries Reaper to see if the track is currently muted (eg. if the attempt to mute it worked) • Assuming it is muted, it then sends the 90 20 7f message back to the surface, instructing it to turn the light on At some point in the future, the track becomes unmuted (either by pressing the button again as above, or through the Reaper GUI) • CSI sends the 90 20 00 message back to the surface, instructing it to turn the light off Note: • It's important to understand it's not the surface deciding when to turn the light on or off. It's doing it in response to a message from CSI. We don't want the surface managing the state of the buttons, that responsibility belongs to Reaper/CSI. Included Feedback Processors • FB_TwoState • FB_ Fader14Bit • FB_ Fader7Bit • FB_ Encoder • FB_VUMeter • FB_GainReductionMeter • FB_QConProXMasterVUMeter • FB_MCUTimeDisplay • FB_MCUVUMeter • FB_MCUDisplayUpper • FB_MCUDisplayLower • FB_MCUXTDisplayUpper • FB_MCUXTDisplayLower • FB_MCUC4DisplayUpper • FB_MCUC4DisplayLower • FB_FP8Display • FB_FP16Display • FB_FP8DisplayUpper • FB_FP16DisplayUpper • FB_FP8DisplayUpperMiddle • FB_FP16DisplayUpperMiddle • FB_FP8DisplayLowerMiddle • FB_FP16DisplayLowerMiddle • FB_FP8DisplayLower • FB_FP16DisplayLower • FB_QConLiteDisplayUpper • FB_QConLiteDisplayUpperMid • FB_QConLiteDisplayLowerMid • FB_QConLiteDisplayLower • FB_MFT_RGB • FB_NovationLaunchpadMiniRGB7Bit • FB_FaderportRGB7Bit Virtual widgets If you read the [Defining Control Surface Capabilities]] page, you'd know that we define Widgets in our .mst/.ost files to represent the capabilities of our surfaces. I sometimes think of these Widgets (or at least the Message Generator part) as triggers I can use to [cause certain actions or behaviours to occur. If we run with that analogy, then the Widgets on our surfaces are not the only things we may want to use to trigger behaviours. Sometimes we may want to trigger them when certain things occur in Reaper itself, eg when the selected track changes. These are called Virtual Widgets. We don't have to define them in our MST files, as they are not coming from a control surface. We just need to use them in our zone files like any other Widget. The Virtual Widgets currently defined are: • OnTrackSelection - fires when a track is selected in Reaper. • OnPageEnter - fires after a new Page has been entered. • OnPageLeave - fires before the the old Page has been exited. • OnInitialization -- fires when CSI initializes -- not valid for EuCon -- if needed for EuCon, will add later Pages In CSI, a Page is the highest level of the hierarchy - with each Page containing one or more surfaces, and each surface having an .mst (if MIDI/MCU) or .ost (if OSC) file which describes the surface properties as well as a zone folder defining what exactly that surface will do in Reaper. CSI requires that at least one page exist (called "Home" by default) before surfaces can be added. But CSI allows you to create multiple Pages, with each Page containing the configuration information for whatever Surfaces and Actions you want CSI to recognize. Only one Page can be active in Reaper at any time, but you can switch between Pages easily and instantaneously similar to activating a zone. Pages allow you to have.... • Different surfaces enabled/disabled depending on what you're doing - i.e. different surfaces enabled on each Page • Different actions assigned to your surface depending on what your doing - i.e. different zone folders for one or more surfaces on each Page • Surface capabilities defined differently on each page - i.e. different .mst and/or files for one or more on each Page To create a Page: 1. Open Reaper's Preferences -> Control/OSC/Web 2. Select CSI 3. Click Edit to open the CSI Settings 4. On the left side of the CSI Settings, you can add a Page by clicking the Add button 5. Highlight the name of the Page you want to edit from the left, and add or modify surfaces on the right-hand portion of the screen As a best practice, your first page should be called "Home" (if anything just for consistency). Any pages you create beyond that can be named whatever you'd like. Now you can begin adding surfaces (Add MIDI or Add OSC buttons) and selecting which .mst/.osc and Zone folder each Page will utilize. See Installation for instructions on how to setup a surface. Page Settings If you select a Page and click the **Edit **button, there are some options for... Track visibility on surface follows: select Mixer Control Panel to have the surface visibility follow Reaper's MCP or Track Control Panel to have it follow the TCP. Example: Reaper allows you to hide a track in Reaper's Mixer (MCP) but still keep it visible in the TCP. Would you want to see that track on your control surface? If no, because it's hidden in the mixer and therefore should be on the surface, set track visibility on the surface to follow the Mixer Control Panel. If you'd prefer, you can have surface visibility follow the TCP view. Banks with other checked Pages: if checked, this will ensure your Pages will stay in 'sync'. So if you're banked to a particular place in the mixer and then change Pages, you stay in the same place. Reaper GUI follows surface: if checked, the on screen Mixer/Arrange window will bank with the surfaces. Can also be enabled/disabled with the ToggleScrollLink action. Paging Actions The Pages need to already be setup in CSI's preferences and then buttons on surface can be assigned to switch between Pages. This is similar to GoZone, but can impact multiple surfaces in CSI. Use the CSI GoPage action to jump between Pages in CSI. Use NextPage to cycle between Pages. In the below example, let's assume I have a Page called Home and another called Mix... On my Home page, I may want to utilize the "Channel" button on my surface to enter the Mix Page. Zone "Buttons|" Channel GoPage "Mix" // Activates the Mix page ZoneEnd But in order to get back to the Home page, I probably want to make sure I have the opposite happening when the Mix page is active. Zone "Buttons|" Channel GoPage "Home" // Activates the Home page ZoneEnd You could also use the NextPage action to just cycle through the Pages in your CSI setup. In a two page setup, this would essentially be a toggle, but if you had 3 or more pages, it will cycle through them. Zone "Buttons|" Channel NextPage // Cycles through the list of pages ZoneEnd PageNameDisplay This action can be assigned to a Display widget in order to show the name of the currently active Page. MainDisplay PageNameDisplay Defining Control Surface Behavior We define what behaviour should occur when particular widgets are pressed/turned/moved/etc in .zon files. If you remember in our CSI.INI file, for each surface we listed a number of things: MidiSurface AlphaTrack 8 8 AlphaTrack.mst AlphaTrack 1 0 0 0 In this example, the AlphaTrack.mst was where we defined what widgets were on the surface. The next item to the right, in this case 'AlphaTrack' is the name of a Zones folder. Inside this folder, we should create whatever .zon files we want that relate to the widgets on this surface. We can also use subfolders, and subfolders of subfolders and so on, in order to organize our .zon files. CSI will read in all the .zon files it finds in this folder, including all subfolders, so don't store backups/unused here, they WILL get pulled in. Note: CSI expects ONE ZONE ONLY PER FILE. Inside each .zon file we create a Zone to map the widgets on this surface to the actions we want to trigger. As you'll see on that page, we can also switch between currently active zones, compose zones out of other zones, etc. Types of Zones At this stage there are primarily two types of Zones that we can define: • Zones that control general Reaper functionality. eg. the Tracks in our project, the Transport controls, our Track Sends, etc • Zones that control VST instruments/FX inside Reaper. eg. How to map the parameters of your EQ, Reverb, etc on the selecte d track across your surfaces. They are both defined as Zones in .zon files, but there are some additional details for FX Zones that are worth discussing. Zones are where we do two things: • where we map the widgets defined in our mst files to the actions we want to perform when they are invoked (pressed, rotated, etc) • where we group multiple action/widget mappings together into related groups. A Simple Example The widget/action mapping part is easy. Let's say we have a widget called PlayButton, and we want it to perform the Play action when pressed, we would simply use the following syntax in our zon file. PlayButton Play There's obviously more options than just play. Have a look at the Action Reference page for more examples. However, we can't just have this sitting by itself. We need to put it inside a zone definition, usually along with other widgets performing related functions (say, the Stop, Record, FF, Rewind buttons, etc). At a minimum, we’d need something like this: Zone Home PlayButton Play ZoneEnd Provided our CSI.INI and Widget definitions are setup correctly, this should allow us to control the Play button from our Surface. One Zone Per File (CSI 1.1 and Up) CSI version 1.1 introduced a major change in that now you can only have one zone per file. In the past, a surface.zon file was usually comprised of multiple zones like: Home, Channel, Button, Mastertrack, Jogwheel, SelectedTrackSends. Starting with CSI 1.1, these now need to be separate files. A similar CSI 1.1 surface would now be comprised of multiple files like: Home.zon Channel.zon Button.zon MasterTrack.zon JogWheel.zon SelectedTrackSend.zon This change immensely improves performance when you have a large number of FX.zon's but also has the added benefit of making it easier to borrow other people's zones and more easily add them to your setup. Example: if you see a SelectedTrackSendSlot.zon file that works, you can just copy and paste that into your surface folder, and just add the appropriate mapping action to your home.zon. Tip: within each \CSI\Zones[Surface] folder, it's probably a best practice to create an "FX Zones" sub-folder if you plan on mapping FX. This way, your surface zone files can all live together in the root of the folder, and all of your fx zones can exist in the \CSI\Zones[Surface]\FX Zones folder, away from the surface files. Not a requirement, but will help keep things tidy. Naming Zones Some zones in CSI are "special zones" and require an exact name in order to work. Example: if you're controlling the faders/pans/etc. on multiple tracks across an 8-channel surface, that zone must be called "Channel" or it won't work. See the section on Navigators for more details on that. For zones where you do have have some flexibility in the naming convention, like a "Buttons" zone, there are some rules you'll have to follow. If your Zone name has a space in it, you'll need to wrap all references to that zone in quotes (Example: if you wanted a zone called "Zoom Buttons"), otherwise, the quotes are technically not required. That said, it's probably a good idea to wrap them all in quotes, spaces or not, just so you don't have to think about it. Every CSI surface must have a Home zone (i.e. home.zon if using CSI v1.1 and above). FX zone file names can be whatever you'd like them to, but the FX zone name in the .zon file itself must match the plugin name in Reaper exactly. See FX Zones for more information on how to create an FX.zon. A Slightly More Useful Example As great as it is to get that first action happening when you press a Surface button, let’s look at a slightly more interesting example. I might group a bunch of widgets together into a zone called Buttons, because the actions I am assigning to them are conceptually related: Zone "Buttons" Track ToggleMapSelectedTrackFXMenu Send ToggleMapSelectedTrackSends Pan ToggleMapSelectedTrackFX Shift+Pan GoZone Home Plugin ToggleScrollLink ChannelLeft TrackBank "-1" ChannelRight TrackBank "1" BankLeft TrackBank "-20" BankRight TrackBank "20" Rewind Rewind FastForward FastForward Stop Stop Play Play Record Record F1 NextPage ZoneEnd As another example, I might define a zone called Channels which collects all my track faders and related widgets into a single group, again because for me they are all related to controlling my tracks. Zone "Channel" TrackNavigator DisplayUpper| TrackNameDisplay TrackTouch+DisplayUpper| TrackVolumeDisplay Rotary| MCUTrackPan RecordArm| TrackRecordArm Solo| TrackSolo Mute| TrackMute Select| TrackUniqueSelect Shift+Select| TrackRangeSelect Control+Select| TrackSelect Shift+Control+Select| TogglePin Fader| TrackVolume FaderTouch| TrackTouch ZoneEnd Note the | character after the name of the widgets. These will get replaced with the actual number derived from the number of channels you entered during setup. It is simply a shorthand way of reducing typing. So for example if you specified 8 channels this line: Fader| TrackVolume will cause this to be generated automatically by CSI Fader1 TrackVolume Fader2 TrackVolume Fader3 TrackVolume Fader4 TrackVolume Fader5 TrackVolume Fader6 TrackVolume Fader7 TrackVolume Fader8 TrackVolume Changing Zones We can also change which zones are active at the moment using an Action called GoZone: SomeButton GoZone "AnotherZone" That is telling CSI to "overlay" that zone over the currently active zones. Any widgets used in AnotherZone that were previously mapped in the currently active zones will now trigger the actions defined in the anotherZone. Any that aren't used in AnotherZone will keep performing the actions they were before we triggered GoZone. This results in a very flexible system where can temporarily change certain control's behavior in response to whatever widgets and/or Virtual Widgets we like. Note: If a zone name contains a space, like "Selected Channel Buttons" for example, then any GoZone actions must have the zone name in quotes. As a best practice, if you always include the zone name in quotes (even when not technically required), you'll never have to worry. Adding Comments to Zones When triggering custom actions or using actions whose meanings may otherwise not be obvious, it's a good idea to add comments to your in your .zon files. CSI allows for two types of comments: 1. / Lines that begin with a forward slash are completely ignored by CSI and are good for commenting sections of code. Hint: these also work in .mst files. 2. // Trailing comments are preceeded by two forward slashes and can be used after an action in a .zon file Here is an example from a .zon file that uses both types of comments. First, the entire section is preceded by a comment using a single forward slash. Then, each of the automation modes is followed by a trailing comment identifying which mode is which. /To make MCU Std mode work like MCU Cubase mode, I'm using F1-F5 on the X-Touch One for the automation modes. Zone "SelChannelButtons|" SelectedTrackNavigator F1 TrackAutoMode 1 //Read F2 TrackAutoMode 3 //Write F3 TrackAutoMode 0 //Trim F4 TrackAutoMode 2 //Touch F5 TrackAutoMode 4 //Latch ZoneEnd FX Zones FX Zones are similar to normal [Zones]] in that we are mapping [Widgets defined in our mst files to behaviour we want to occur. The major difference is about what that behaviour is. In a normal Zone we're binding the widgets to some sort of action in Reaper, whereas for FX Zones, we're binding them to a parameter value in an FX plugin (eg. a VST, etc) A simple ReaEQ example As an example, I have one of my BCF2000's mapped to control ReaEQ. For each band I add, it maps an [Encoder]] to control the Frequency, a [Fader to control the Gain, and Shift plus the Encoder to control the Bandwidth/Q. images/reaeq.png The .zon file You'll need to create an "[plugin name].zon" file for each plugin you map. These are just .txt files with the extension changed to .zon and can be edited and created in any text editor. Do not put spaces or special characters in the .zon filenames. Using the example below, our file name would ultimately be: VST__ReaEQ__Cockos_.zon And here's an example of the contents of the following zon file: Zone "VST: ReaEQ (Cockos)" ReaEQ FocusedFXNavigator RotaryG11 FXParam 0 "Freq-Band 1" Fader1 FXParam 1 "Gain-Band 1" Shift+RotaryG11 FXParam 2 "Q-Band 1" RotaryG12 FXParam 3 "Freq-Band 2" Fader2 FXParam 4 "Gain-Band 2" Shift+RotaryG12 FXParam 5 "Q-Band 2" RotaryG13 FXParam 6 "Freq-Band 3" Fader3 FXParam 7 "Gain-Band 3" Shift+RotaryG13 FXParam 8 "Q-Band 3" RotaryG14 FXParam 9 "Freq-Band 4" Fader4 FXParam 10 "Gain-Band 4" Shift+RotaryG14 FXParam 11 "Q-Band 4" RotaryG15 FXParam 12 "Freq-Band 5" Fader5 FXParam 13 "Gain-Band 5" Shift+RotaryG15 FXParam 14 "Q-Band 5" RotaryG16 FXParam 15 "Freq-Band 6" Fader6 FXParam 16 "Gain-Band 6" Shift+RotaryG16 FXParam 17 "Q-Band 6" RotaryG17 FXParam 18 "Freq-Band 7" Fader7 FXParam 19 "Gain-Band 7" Shift+RotaryG17 FXParam 20 "Q-Band 7" RotaryG18 FXParam 21 "Freq-Band 8" Fader8 FXParam 22 "Gain-Band 8" Shift+RotaryG18 FXParam 23 "Q-Band 8" ZoneEnd Let's walk through the key pieces: • The first line Zone "VST: ReaEQ (Cockos)" ReaEQ defines the plugin that this zone is for, and needs to exactly match the name of the plugin as it appears in caption of the plugin window (see the first screenshot above, before the hyphen). • Note: If you rename a plugin in Reaper, your FX zone will need to be updated to match exactly. Anyone you share the FX .zon file with would either also have to rename their plugin in Reaper to match, or edit the .zon file to go back to the original name. • Don't worry about the second line above ("FocusedFXNavigator"), we'll deal with that below in the How to activate an FX Zone section. • We then have one line for each widget/plugin parameter mapping we want to create. As an example, the first one looks like this RotaryG11 FXParam 0 "Freq-Band 1" and breaks down as: ◦ RotaryG11 - the name of the widget ◦ FX Param 0 - the index of the plugin's parameter (I'll show you how to find that in a second) ◦ "Freq-Band 1" - this can be whatever name you want to give the parameter. Use this for your own reference in the .zon file. If you have a surface with displays and would like to learn how to see the FX Parameter Name and Parameter Values on the surface itself, see FX-Parameter-Mapping-Actions. Once you've created your .zon file, put it in the Zone directory for whatever Surface it refers to (the same folder you have your other Zone definitions for that surface. In theory you could even put it in the same file as the other zones for that surface, but this is not recommended. It's much easier, clearer and more reusable to go with one file per plugin. You may even create a dedicated "FXZones" subfolder within your surface zone just to separate FX .zon files from the surface .zon file. Finding Parameter Indexes Hopefully that's pretty easy, except for that Param Index issue. Where do we find them? One easy way I've found is to bring up the FX window in Reaper, and then click the UI button. images/reaeq_params.png As you can see, Reaper will display a list of all the params in can find for the plugin as it is currently setup. The first one is Index 0, the second one is index 1, etc. Note I said "as it is currently setup" just then. If you add another band to ReaEQ, you'll see you get more params added, so you might need to explore a little until you find all the params you need. Generating a Raw FX zon file • Run the Reaper action "CSI Toggle Write Params to /CSI/Zones/ZoneRawFXFiles when FX inserted" • Insert the FX of interest Result: if you navigate to your CSI\Zones\ZoneRawFXFiles folder, you should now see a "[plugin_name].txt" file. Open that file up, and you will see a list of all the FX Param numbers for every parameter in that plugin, along with the parameter name for easy reference. Here's an abbreviated example of what ReaEQ looks like... Zone "VST: ReaEQ (Cockos)" SelectedTrackNavigator FXParam 0 "Freq-Low Shelf" FXParam 1 "Gain-Low Shelf" FXParam 2 "Q-Low Shelf" ZoneEnd How to activate an FX Zone So, now we have our zone, we need a way to activate it. With normal zones, we could just GoZone to it using a widget, but with FX Zones it is slightly different. We have a couple of options: • Activate all the FX Zones for the currently selected track • Activate the FX Zone for the currently selected/focused FX window You can of course mix and match these, activating some FX Zones when the track is selected, and others only when the FX Window is focused, but any one FX Zone can only be activated by one or the other, not both. Navigators provide the context for the Actions triggered within our Zone. Navigators (if present) MUST be on the second line of the Zone definition. For example, if we’ve got a Fader widget bound to the TrackVolume action, which track will it change the Volume on? The selected track? The Master Track? Zone “MyWidgets” Fader TrackVolume EndZone Well, the answer depends on which Navigator we associate with the Zone: Available Navigators The full list of available navigators in CSI is as follows: • TrackNavigator • SelectedTrackNavigator • TrackSendSlotNavigator • TrackReceiveSlotNavigator • TrackFXMenuSlotNavigator • SelectedTrackSendNavigator • SelectedTrackReceiveNavigator • SelectedTrackFXMenuNavigator • SelectedTrackSendSlotNavigator • SelectedTrackReceiveSlotNavigator • FocusedFXNavigator • MasterTrackNavigator The below chart (view in a new tab to see full screen) is meant to help provide a quick reference guide for each navigator and how/when to use them. img TrackNavigator The TrackNavigator is what CSI uses to manage navigation and control of widgets that may impact multiple tracks. Example: you have an 8-fader surface with 8 rotaries, 8 solo, and 8 mute buttons that you'll want assigned to different tracks. This is where TrackNavigator differs from SelectedTrackNavigator - since we have more than one fader, and we will want to assign them to more than the selected track. In the below example, the faders are controlling TrackVolume across multiple tracks. You'll notice the use of the pipe character (located by pressing shift+backslash on your keyboard): see the section on setting up Zones for more details on why. Zone "Channel|" TrackNavigator Fader| TrackVolume ZoneEnd SelectedTrackNavigator Using the SelectedTrackNavigator will mean that the actions in that Zone act in the context of the currently selected track. The Fader will change the selected track’s volume, TrackPan alters Pan settings, etc. SelectedTrackNavigator is especially useful for tasks like setting the automation mode, record arming, or toggling input monitoring states for the selected track if, for instance, your surface doesn't have multiple sets of buttons for these actions for each channel. SelectedTrackNavigator is how that one Read or Write knob can be setup to work on an 8-fader surface -- the single button sets the automation mode for the selected track only. Zone “MyWidgets” SelectedTrackNavigator Fader TrackVolume EndZone TrackSendSlotNavigator Navigate sends slot for each channel on your surface (e.g. slot 1 on Channel 1, slot 1 on Channel 2, slot 1 on channel 3). Use the appropriate slot bank action to see the next set of send slots. Zone "TrackSendSlot" TrackSendSlotNavigator DisplayUpper| TrackSendNameDisplay DisplayLower| TrackSendVolumeDisplay Fader| TraclSendVolume BankLeft SendSlotBank "-1" BankRight SendSlotBank "1" ZoneEnd See Send Zones for more details. TrackReceiveSlotNavigator Navigate receive slots for each channel on your surface (e.g. slot 1 on Channel 1, slot 1 on Channel 2, slot 1 on channel 3). Use the appropriate slot bank action to see the next set of receive slots. Zone "TrackReceiveSlot" TrackReceiveSlotNavigator DisplayUpper| TrackReceiveNameDisplay DisplayLower| TrackReceiveVolumeDisplay Fader| TrackReceiveVolume BankLeft ReceiveSlotBank "-1" BankRight RecieveSlotBank "1" ZoneEnd See Receive Zones for more information. TrackFXMenuSlotNavigator Navigate FX Menu slots for each channel on your surface (e.g. slot 1 on Channel 1, slot 1 on Channel 2, slot 1 on channel 3). Use the appropriate slot bank action to see the next set of FX Menu slots. Zone "TrackFXMenuSlot" TrackFXMenuSlotNavigator DisplayUpper| TrackNameDisplay DisplayLower| FXNameDisplay RotaryPush| GoFXSlot BankLeft FXMenuSlotBank "-1" BankRight FXMenuSlotBank "1" ZoneEnd See FX Menu Zones for more information. SelectedTrackSendNavigator Selected channel's sends mapped across surface channels (e.g. slot 1 for selected track, slot 2 for selected track). Select a different track to see that track's sends. Zone "SelectedTrackSend" SelectedTrackSendNavigator DisplayUpper| TrackSendNameDisplay DisplayLower| TrackSendVolumeDisplay Rotary| TrackSendVolume ZoneEnd See Send Zones for more details. SelectedTrackReceiveNavigator Selected channel's receives mapped across surface channels (e.g. slot 1 for selected track, slot 2 for selected track). Select a different track to see that track's receives. Zone "SelectedTrackReceive" SelectedTrackReceiveNavigator DisplayUpper| TrackReceiveNameDisplay DisplayLower| TrackReceiveVolumeDisplay RotaryE| TrackReceiveVolume ZoneEnd See Receive Zones for more information. SelectedTrackFXMenuNavigator Selected channel's FX Menu mapped across surface channels (e.g. slot 1 for selected track, slot 2 for selected track). Zone "SelectedTrackFXMenu" SelectedTrackFXMenuNavigator DisplayUpper| FXMenuNameDisplay RotaryPushA| GoFXSlot ZoneEnd See FX Menu Zones for more information. SelectedTrackSendSlotNavigator Navigate up/down Selected Track Send Slots. This is particularly useful for single fader surfaces where you've got one fader and one menu, but still want to be able to use that fader or rotary to control sends. Use the appropriate SendSlotBank action to navigate sends. Zone "SelectedTrackSendSlot" SelectedTrackSendSlotNavigator DisplayUpper1 TrackNameDisplay DisplayLower1 TrackSendNameDisplay Fader1Touch+DisplayLower1 TrackSendVolumeDisplay Fader1 TrackSendVolume Mute1 TrackSendMute Rotary1 TrackSendPan BankLeft SendSlotBank -1 BankRight SendSlotBank 1 ZoneEnd See Send Zones for more details. SelectedTrackReceiveSlotNavigator Navigate up/down Selected Track Receive Slots. This is particularly useful for single fader surfaces where you've got one fader and one menu, but still want to be able to use that fader or rotary to control receives. Use the appropriate ReceiveSlotBank action to navigate receives. Zone "SelectedTrackReceiveSlot" SelectedTrackReceiveSlotNavigator DisplayUpper1 TrackNameDisplay DisplayLower1 TrackReceiveNameDisplay Fader1Touch+DisplayLower1 TrackReceiveVolumeDisplay Fader1 TrackReceiveVolume Mute1 TrackReceiveMute Rotary1 TrackReceivePan BankLeft ReceiveSlotBank -1 BankRight ReceiveSlotBank 1 ZoneEnd See Receive Zones for more information. FocusedFXNavigator Use this navigator for mapping FX when they gain focus in Reaper. See MapFocusedFXToWidgets for more details. Zone "VST: SPL Transient Designer Plus (Plugin Alliance)" FocusedFXNavigator RotaryA1 FXParam 2 "Attack" RotaryA2 FXParam 3 "Sustain" ZoneEnd MasterTrackNavigator Using a MasterTrackNavigator means all those same actions act in the context of the Master Track. TrackVolume, TrackPan, etc will all affect the Master Track, regardless of which tracks are selected. Zone “MyWidgets” MasterTrackNavigator Fader TrackVolume EndZone GoZone GoZone allows us to "overlay" a new zone over the top of the current zones. Parameter is the name of the new zone you wish to load: someButton GoZone "Home" See the page on Changing Zones for more details. Three Different Send Zone Types As of CSI version 1.1, there are 3 different type of Send zones to choose from depending on your particular needs, workflow, and surface. They are: • SelectedTrackSend (Note: prior to CSI version 1.1, this was the only type of Send zone and simple called "Send") • TrackSendSlot • SelectedTrackSendSlot SelectedTrackSend is best used when you have a surface with multiple channels and you want to map out the sends on the selected track, across those various channels. Example: you have an 8 channel MCU type device. Using a SelectedTrackSend zone will allow you to control up to 8 sends from the selected channel on each of the surface's channels. You setup the number of sends in the CSI device preferences. TrackSendSlot is best used when you have a multiple channel surface, but you only want to see sends for the channel that corresponds to the track navigator. Example: you have an 8 channel MCU type device. Using the TrackSendSlot will show you Send Slot #1 for channels 1-8. If you want to see the send loaded in Send Slot #2, you will use SendSlotBank action to navigate to the next slot, at which point, you'll be looking at Send Slot #2 for channels 1-8. You setup the number of tracks in the CSI device preferences. SelectedTrackSendSlot works best with single fader surfaces like the Behringer X-Touch One or Presonus FaderPort 2. This allows you to control sends from the Selected Channel by using the SendSlotBank action to navigate from send slot to send slot. In this use-case, you would setup 1 sein the CSI device preferences. Send Mapping and Unmapping Actions Depending on the type of send zone you are creating, you will need to create a CSI action to map the sends. SelectedTrackSend uses the CSI action MapSelectedTrackSendsToWidgets for mapping. TrackSendSlot uses the CSI action MapTrackSendsSlotToWidgets for mapping. SelectedTrackSendSlot uses the CSI action MapSelectedTrackSendsSlotToWidgets for mapping. Each of those has a corresponding Unmap action. Activating a Send Map You can activate the send map one of three ways. First, you can assign the mapping action above to a button like this... Zone "Buttons" Send MapSelectedTrackSendsToWidgets ZoneEnd Or, if you want the act of selecting a track to automatically map your sends (works with SelectedTrackSend and SelectedTrackSendSlot), you could set that up in your Home zone like this... Zone Home OnTrackSelection MapSelectedTrackSendsToWidgets IncludedZones "Buttons" "SelectedTrack" IncludedZonesEnd ZoneEnd Or, if you can dedicate a portion of your surface to sends and always want them to appear as part of your Home zone, you can simply add the send zone to the IncludedZones like this... Zone Home IncludedZones "Buttons" "Channel" "SelectedTrackSend" IncludedZonesEnd ZoneEnd Unmapping Send Zones Assuming the Send zone does not live in your Home zone, you'll also need a GoZone "Home" somewhere in your surface zone file to un-map sends and get back Home. Zone "Buttons" Send MapSelectedTrackSendsToWidgets Cancel GoZone "Home" ZoneEnd Or, if you'd want to manually unmap the sends, you could assign the Unmap action to a button or modifer+button combo... Shift+Send UnmapSelectedTrackSendsFromWidgets SelectedTrackSend Zone Example Note: SelectedTrackSend zones are a special type of zone so your send zone must be named "SelectedTrackSend" (exactly) and must use the SelectedTrackSendNavigator as shown below. Here's an example of a typical MCU send zone. Zone "SelectedTrackSend" SelectedTrackSendNavigator DisplayUpper| TrackSendNameDisplay DisplayLower| TrackSendVolumeDisplay Mute| TrackSendMute Fader| TrackSendVolume Rotary| TrackSendPan RotaryPush| NoAction ZoneEnd TrackSendSlot Zone Example Note: TrackSendSlot zones are a special type of zone so your send zone must be named "TrackSendSlot" (exactly) and must use the TrackSendSlotNavigator as shown below. Here's an example of a typical TrackSendSlot zone. Zone "TrackSendSlot" TrackSendSlotNavigator DisplayUpper| TrackSendNameDisplay DisplayLower| TrackSendVolumeDisplay Fader| TraclSendVolume BankLeft SendSlotBank "-1" BankRight SendSlotBank "1" ZoneEnd SelectedTrackSendSlot Zone Example Note: SelectedTrackSendSlot zones are a special type of zone so your send zone must be named "SelectedTrackSendSlot" (exactly) and must use the SelectedTrackSendSlotNavigator as shown below. Zone "SelectedTrackSendSlot" SelectedTrackSendSlotNavigator DisplayUpper1 TrackNameDisplay DisplayLower1 TrackSendNameDisplay Fader1Touch+DisplayLower1 TrackSendVolumeDisplay Fader1 TrackSendVolume Mute1 TrackSendMute Rotary1 TrackSendPan BankLeft SendSlotBank -1 BankRight SendSlotBank 1 ZoneEnd Send Actions The available send zone actions are shown below. TrackSendVolume TrackSendPan TrackSendMute TrackSendPrePost TrackSendInvertPolarity TrackSendNameDisplay TrackSendVolumeDisplay TrackSendPanDisplay TrackSendPrePostDisplay MapSelectedTrackSendsToWidgets UnmapSelectedTrackSendsFromWidgets What are Receives? Track Receives are like inverse sends. Lets say you're sending multiple mix elements to a "Room Reverb" bus. If you wanted to adjust the amount of reverb on multiple channels using Sends, you'd have to go track by track and adjust the send levels one at a time. A more efficient way would be to map the receives going into the Room Reverb bus, and adjusting the various levels from that one track. It's ultimately a much more efficient way of controlling multiple send levels feeding the same [receive] bus. Track Receives are useful for reverb adjustments across multiple tracks, cue/headphone mixes, and even adjusting monitor mixes in a live setup. Three Different Receive Zone Types As of CSI version 1.1, there are 3 different type of Receive zones to choose from depending on your particular needs, workflow, and surface. They are: • SelectedTrackReceive • TrackReceiveSlot • SelectedTrackReceiveSlot SelectedTrackReceive is best used when you have a surface with multiple channels and you want to map out the Receives on the selected track, across those various channels. Example: you have an 8 channel MCU type device. Using a SelectedTrackReceive zone will allow you to control up to 8 Receives from the selected channel on each of the surface's channels. You setup the number of receives in the CSI device preferences for sends (there's not a separate item for receives). TrackReceiveSlot is best used when you have a multiple channel surface, but you only want to see Receives for the channel that corresponds to the track navigator. Example: you have an 8 channel MCU type device. Using the TrackReceiveSlot will show you Receive Slot #1 for channels 1-8. If you want to see the Receive loaded in Receive Slot #2, you will use ReceiveSlotBank action to navigate to the next slot, at which point, you'll be looking at Receive Slot #2 for channels 1-8. You setup the number of tracks in the CSI device preferences. SelectedTrackReceiveSlot works best with single fader surfaces like the Behringer X-Touch One or Presonus FaderPort 2. This allows you to control Receives from the Selected Channel by using the ReceiveSlotBank action to navigate from Receive slot to Receive slot. In this use-case, you would setup 1 send in the CSI device preferences (there's not a separate item for receives). Receive Mapping and Unmapping Actions Depending on the type of Receive zone you are creating, you will need to create a CSI action to map the Receives. SelectedTrackReceive uses the CSI action MapSelectedTrackReceivesToWidgets for mapping. TrackReceiveSlot uses the CSI action MapTrackReceivesSlotToWidgets for mapping. SelectedTrackReceiveSlot uses the CSI action MapSelectedTrackReceivesSlotToWidgets for mapping. Each of those has a corresponding Unmap action. Activating a Receive Map You can activate the Receive map one of three ways. First, you can assign the mapping action above to a button like this... Zone "Buttons" Receive MapSelectedTrackReceivesToWidgets ZoneEnd Or, if you want the act of selecting a track to automatically map your Receives (works with SelectedTrackReceive and SelectedTrackReceiveSlot), you could set that up in your Home zone like this... Zone Home OnTrackSelection MapSelectedTrackReceivesToWidgets IncludedZones "Buttons" "SelectedTrack" IncludedZoneReceive ZoneEnd Or, if you can dedicate a portion of your surface to Receives and always want them to appear as part of your Home zone, you can simply add the Receive zone to the IncludedZones like this... Zone Home IncludedZones "Buttons" "Channel" "SelectedTrackReceive" IncludedZoneReceive ZoneEnd Unmapping Receive Zones Assuming the Receive zone does not live in your Home zone, you'll also need a GoZone "Home" somewhere in your surface zone file to un-map Receives and get back Home. Zone "Buttons" Receive MapSelectedTrackReceivesToWidgets Cancel GoZone "Home" ZoneEnd Or, if you'd want to manually unmap the Receives, you could assign the Unmap action to a button or modifer+button combo... Shift+Receive UnmapSelectedTrackReceivesFromWidgets SelectedTrackReceive Zone Example Note: SelectedTrackReceive zones are a special type of zone so your Receive zone must be named "SelectedTrackReceive" (exactly) and must use the SelectedTrackReceiveNavigator as shown below. Here's an example of a typical MCU Receive zone. Zone "SelectedTrackReceive" SelectedTrackReceiveNavigator DisplayUpper| TrackReceiveNameDisplay DisplayLower| TrackReceiveVolumeDisplay Mute| TrackReceiveMute Fader| TrackReceiveVolume Rotary| TrackReceivePan RotaryPush| NoAction ZoneEnd TrackReceiveSlot Zone Example Note: TrackReceiveSlot zones are a special type of zone so your Receive zone must be named "TrackReceiveSlot" (exactly) and must use the TrackReceiveSlotNavigator as shown below. Here's an example of a typical TrackReceiveSlot zone. Zone "TrackReceiveSlot" TrackReceiveSlotNavigator DisplayUpper| TrackReceiveNameDisplay DisplayLower| TrackReceiveVolumeDisplay Fader| TraclReceiveVolume BankLeft ReceiveSlotBank "-1" BankRight ReceiveSlotBank "1" ZoneEnd SelectedTrackReceiveSlot Zone Example Note: SelectedTrackReceiveSlot zones are a special type of zone so your Receive zone must be named "SelectedTrackReceiveSlot" (exactly) and must use the SelectedTrackReceiveSlotNavigator as shown below. Zone "SelectedTrackReceiveSlot" SelectedTrackReceiveSlotNavigator DisplayUpper1 TrackNameDisplay DisplayLower1 TrackReceiveNameDisplay Fader1Touch+DisplayLower1 TrackReceiveVolumeDisplay Fader1 TrackReceiveVolume Mute1 TrackReceiveMute Rotary1 TrackReceivePan BankLeft ReceiveSlotBank -1 BankRight ReceiveSlotBank 1 ZoneEnd Receive Actions The available receive actions are shown below. TrackReceiveVolume TrackReceivePan TrackReceiveMute TrackReceivePrePost TrackReceiveInvertPolarity TrackReceiveNameDisplay TrackReceiveVolumeDisplay TrackReceivePanDisplay TrackReceivePrePostDisplay - Two Different FXMenu Zone Types As of CSI version 1.1, there are 2 different types of FXMenu zones to choose from depending on your particular needs, workflow, and surface. They are: • SelectedTrackFXMenu (Note: prior to CSI version 1.1, this was the only type of FXMenu zone and simple called "FXMenu") • TrackFXMenuSlot SelectedTrackFXMenu is best used when you have a surface with multiple channels and you want to map out the FXMenus on the selected track, across those various channels. Example: you have an 8 channel MCU type device. Using a SelectedTrackFXMenu zone will allow you to control up to 8 FXMenus from the selected channel on each of the surface's channels. You setup the number of FXMenus in the CSI device preferences for sends (there's not a separate item for FXMenus). TrackFXMenuSlot is best used when you have a multiple channel surface, but you only want to see FX Slot for the channel that corresponds to the track navigator. Example: you have an 8 channel MCU type device. Using the TrackFXMenuSlot will show you FXMenu Slot #1 for channels 1-8. If you want to see the FX loaded in FXMenu Slot #2, you will use FXMenuSlotBank action to navigate to the next slot, at which point, you'll be looking at FXMenu Slot #2 for channels 1-8. You setup the number of tracks in the CSI device preferences. Pre-condition for both zone types: the FX still need to be mapped with their own fx.zon files and those .zon files would need to use the SelectedTrackNavigator. See FX Zones for details on how to create fx.zon files. FXMenu Mapping and Unmapping Actions Depending on the type of FXMenu zone you are creating, you will need to create a CSI action to map the FXMenus. SelectedTrackFXMenu uses the CSI action MapSelectedTrackFXToMenu for mapping. TrackFXMenuSlot uses the CSI action MapTrackFXMenusSlotToWidgets for mapping. Each of those has a corresponding Unmap action. Activating a FXMenu Map You can activate the FXMenu map one of three ways. First, you can assign the mapping action above to a button like this... Zone "Buttons" FXMenu MapSelectedTrackFXToMenu ZoneEnd Or, if you want the act of selecting a track to automatically map your FXMenus (works with SelectedTrackFXMenu and SelectedTrackFXMenuSlot), you could set that up in your Home zone like this... Zone Home OnTrackSelection MapSelectedTrackFXToMenu IncludedZones "Buttons" "SelectedTrack" IncludedZonesEnd ZoneEnd Or, if you can dedicate a portion of your surface to FXMenus and always want them to appear as part of your Home zone, you can simply add the FXMenu zone to the IncludedZones like this... Zone Home IncludedZones "Buttons" "Channel" "SelectedTrackFXMenu" IncludedZonesEnd ZoneEnd Unmapping FXMenu Zones Assuming the FXMenu zone does not live in your Home zone, you'll also need a GoZone "Home" somewhere in your surface zone file to un-map FXMenus and get back Home. Zone "Buttons" Plugin MapSelectedTrackFXMenusToWidgets Cancel GoZone "Home" ZoneEnd Or, if you'd want to manually unmap the FXMenus, you could assign the Unmap action to a button or modifer+button combo... Shift+FXMenu UnmapSelectedTrackFXFromMenu SelectedTrackFXMenu Zone Example Note: SelectedTrackFXMenu zones are a special type of zone so your FXMenu zone must be named "SelectedTrackFXMenu" (exactly) and must use the SelectedTrackFXMenuNavigator as shown below. Zone "SelectedTrackFXMenu" SelectedTrackFXMenuNavigator DisplayUpper| FXMenuNameDisplay RotaryPush| GoFXSlot ZoneEnd TrackFXMenuSlot Zone Example Note: TrackFXMenuSlot zones are a special type of zone so your FXMenu zone must be named "TrackFXMenuSlot" (exactly) and must use the TrackFXMenuSlotNavigator as shown below. Here's an example of a typical TrackFXMenuSlot zone. Zone "TrackFXMenuSlot" TrackFXMenuSlotNavigator DisplayUpper| TrackNameDisplay DisplayLower| FXNameDisplay RotaryPush| GoCurrentFXSlot BankLeft FXMenuSlotBank "-1" BankRight FXMenuSlotBank "1" ZoneEnd FXMenu Actions The available FXMenu actions are shown below. FXMenuNameDisplay MapSelectedTrackFXToMenu UnmapSelectedTrackFXFromMenu MapTrackFXMenusSlotToWidgets UnmapTrackFXMenusSlotFromWidgets GoFXSlot (used with SelectedTrackFXMenu) GoCurrentFXSlot (used with TrackFXMenuSlot) FXMenuSlotBank (used with TrackFXMenuSlot) CSI Actions Transport and Timeline • Rewind • FastForward • Play • Stop • Record • CycleTimeline • TimeDisplay • CycleTimeDisplayModes Tracks • TrackVolume • SoftTakeover7BitTrackVolume • SoftTakeover14BitTrackVolume • MCUTrackPan • TrackPan • TrackPanWidth • TrackPanL • TrackPanR • TrackSelect • TrackUniqueSelect • TrackRangeSelect • TrackSolo • TrackMute • TrackInvertPolarity • TrackRecordArm • TrackNameDisplay • TrackVolumeDisplay • MCUTrackPanDisplay • TrackPanDisplay • TrackPanWidthDisplay • TrackPanLeftDisplay • TrackPanRightDisplay • TrackOutputMeter • TrackOutputMeterAverageLR • TrackOutputMeterMaxPeakLR Track Sends • TrackSendVolume • TrackSendPan • TrackSendMute • TrackSendPrePost • TrackSendStereoMonoToggle • TrackSendInvertPolarity • TrackSendNameDisplay • TrackSendVolumeDisplay • TrackSendPanDisplay • TrackSendPrePostDisplay • MapSelectedTrackSendsToWidgets • UnmapSelectedTrackSendsFromWidgets • MapTrackSendsSlotToWidgets • UnmapTrackSendsSlotFromWidgets • MapSelectedTrackSendsSlotToWidgets • UnmapSelectedTrackSendsSlotFromWidgets Track Receives • TrackReceiveVolume • TrackReceivePan • TrackReceiveMute • TrackReceivePrePost • TrackReceiveInvertPolarity • TrackReceiveNameDisplay • TrackReceiveVolumeDisplay • TrackReceivePanDisplay • TrackReceivePrePostDisplay • MapSelectedTrackReceivesToWidgets • UnmapSelectedTrackReceivesFromWidgets • MapTrackReceivesSlotToWidgets • UnmapTrackReceivesSlotFromWidgets • MapSelectedTrackReceivesSlotToWidgets • UnmapSelectedTrackReceivesSlotFromWidgets FX • FXParam • FXParamRelative • FXNameDisplay • FXParamNameDisplay • FXParamValueDisplay • FXMenuNameDisplay • FocusedFXParam • FocusedFXParamNameDisplay • FocusedFXParamValueDisplay • MapSelectedTrackFXToWidgets • UnmapSelectedTrackFXFromMenu • MapSelectedTrackFXToMenu • UnmapSelectedTrackFXFromMenu • MapTrackFXMenusSlotToWidgets • UnmapTrackFXMenusSlotFromWidgets • GoFXSlot • GoCurrentFXSlot • FXGainReductionMeter Navigation • TrackBank • SelectedTrackBank • SendSlotBank • ReceiveSlotBank • FXMenuSlotBank • TogglePin • ToggleScrollLink • ForceScrollLink • NextPage • GoPage • GoZone • GoSubZone • PageNameDisplay • SetBroadcastGoZone • SetReceiveGoZone • SetBroadcastGoFXSlot • SetReceiveGoFXSlot • SetBroadcastMapSelectedTrackSendsToWidgets • SetReceiveMapSelectedTrackSendsToWidgets • SetBroadcastMapSelectedTrackReceivesToWidgets • SetReceiveMapSelectedTrackReceivesToWidgets • SetBroadcastMapSelectedTrackFXToWidgets • SetReceiveMapSelectedTrackFXToWidgets • SetBroadcastMapSelectedTrackFXToMenu • SetReceiveMapSelectedTrackFXToMenu • SetBroadcastMapTrackSendsSlotToWidgets • SetReceiveMapTrackSendsSlotToWidgets • SetBroadcastMapTrackReceivesSlotToWidgets • SetReceiveMapTrackReceivesSlotToWidgets • SetBroadcastMapTrackFXMenusSlotToWidgets • SetReceiveMapTrackFXMenusSlotToWidgets VCA • TrackToggleVCASpill • ToggleVCAMode Automation • TrackAutoMode • GlobalAutoMode • CycleTrackAutoMode • TrackAutoModeDisplay Other • NoAction • FixedTextDisplay • FixedRGBColourDisplay • ClearAllSolo • NoFeedback Modifiers • Shift • Option • Control • Alt • Touch • InvertFB • Hold Reaper Actions Button1 Reaper "40454" Button2 Reaper "_0e5b196e7f67994bab6de09c49f05926" Button3 Reaper "_SWSTL_SHOWALL" Invokes the Reaper Action (custom or built in) specified by the ID in the argument. The syntax is the word Reaper followed by the Command ID. How do you get the Command ID? Open the Reaper Action List, right-click on the action name, and select "Copy selected action command ID" which copies it to your clipboard. Paste the Command ID into the .zon file at the appropriate location. As a best practice, you can label the command ID in your .zon using two forward slashes to leave trailing comments like this: Button1 "_S&M_FXBYPLAST" // Bypasses last touched FX on the selected track Modifiers are a way to indicate that you want one control to perform different actions under different circumstances. For example, this could be when another button is pressed in combination with the control (like your keyboard behaving differently when you hold the Shift key down), or it could be when a button is held down for a longer period of time. Global Modifiers To avoid creating dependencies between zone files (where a control specified in one is referenced in another), there are a set of global modifiers available: • Shift • Option • Control • Alt In your .mst file you can name one or more controls on your surface with whichever of these you wish to use: Widget Shift Press 90 46 7f 90 46 00 WidgetEnd Widget Option Press 90 47 7f 90 47 00 WidgetEnd Widget Control Press 90 48 7f 90 48 00 WidgetEnd Widget Alt Press 90 49 7f 90 49 00 WidgetEnd Now you can use them like this in any of your zone files, but for consistency, we should all put our modifiers in the "Buttons|" Zone, which is typically included in the "Home" Zone: Zone "Buttons|" Shift Shift Option Option Control Control Alt Alt Save Reaper 40026 Shift+Save Reaper 40022 Undo Reaper 40029 Shift+Undo Reaper 40030 ZoneEnd Additionally, any widget can be defined to act as a modifier... Zone "Buttons|" Zoom Shift Rewind Rewind Shift+Rewind Reaper 40042 //go to start of project ZoneEnd ...In the above example, the Zoom widget was defined within the zone to act as the Shift modifier. That Shift modifier can then be combined with other widgets like the Rewind button to trigger additional actions. In this case, pressing Zoom+Rewind will return to the start of the project. Modifiers are global to a page, and as long as they are defined in a zone somewhere in that page, they can be used anywhere. You can also combine them together, such as: Shift+Control+Option+Alt+SomeButton SomeAction etc., but note that Shift+Control is the same as Control+Shift Tip: If you've defined a Shift modifier, a quick press of that button will enter a latching mode where the Shift modifier will remain active until pressed again. Built-in Modifiers Touch Touch messages can be used to tell CSI "when I'm touching this parameter, do this other thing." But Touch is a special kind of modifier in that a few things need to exist for it to work. First, you need a control surface that's capable of sending Touch and Touch Release messages for a given control. Examples: fader touch messages on an MCU device, rotary touch messages on a Eucon surface, or an OSC parameter set to work with touch messages. If you have a surface that supports touch message for certain controls, you need to define the touch messages in your .mst/.ost files. Here is an example using an MCU's fader1. Widget Fader1 Fader14Bit e0 7f 7f FB_Fader14Bit e0 7f 7f Touch 90 68 7f 90 68 00 WidgetEnd Next, you will need to actually create the touch modifier in your .zon file. The modifier name is not actually Touch; it's variable. The syntax for a touch modifier is [WidgetName]Touch. So the widget name in the above example was Fader1 and therefore, the modifier name for the touch message is: Fader1Touch+DisplayLower1 Which in the context of a SelectedTrackNavigator could allow us to do something like this where the track pan display always appears on the lower display, unless you're actually touching the fader, at which point, the track volume display will appear in the lower display. Zone "SelectedChannel" SelectedTrackNavigator DisplayUpper1 TrackNameDisplay DisplayLower1 TrackPanDisplay Fader1Touch+DisplayLower1 TrackVolumeDisplay Fader1 TrackVolume ZoneEnd Touch modifiers also work with the | character in a TrackNavigator context if you want all channels in the .zon to respond similarly. Here's the same zone as above with a TrackNavigator. Notice that the modifier is now Fader|Touch. Zone "Channel" TrackNavigator DisplayUpper| TrackNameDisplay DisplayLower| TrackPanDisplay Fader|Touch+DisplayLower| TrackVolumeDisplay Fader| TrackVolume ZoneEnd InvertFB Up is down, down is up, on is off, and off is on. Example: Reaper EQ FX bypass On means control surface EQ Active light should be Off. InvertFB+SomeButton FXParam 16 "Bypass" Hold A one-second hold of a button will result in a different action. For instance, pressing the "Click" button toggles the metronome, but holding the Click button opens the metronome settings. Important: for the Hold modifier to work, your button/widget must transmit release messages (otherwise, CSI will not be able to decipher between a hold and a button press). Click Reaper 40364 //Toggle metronome Hold+Click Reaper 40363 //Show metronome settings Navigators provide the context for the Actions triggered within our Zone. Navigators (if present) MUST be on the second line of the Zone definition. For example, if we’ve got a Fader widget bound to the TrackVolume action, which track will it change the Volume on? The selected track? The Master Track? Zone “MyWidgets” Fader TrackVolume EndZone Well, the answer depends on which Navigator we associate with the Zone: Available Navigators The full list of available navigators in CSI is as follows: • TrackNavigator • SelectedTrackNavigator • TrackSendSlotNavigator • TrackReceiveSlotNavigator • TrackFXMenuSlotNavigator • SelectedTrackSendNavigator • SelectedTrackReceiveNavigator • SelectedTrackFXMenuNavigator • SelectedTrackSendSlotNavigator • SelectedTrackReceiveSlotNavigator • FocusedFXNavigator • MasterTrackNavigator The below chart (view in a new tab to see full screen) is meant to help provide a quick reference guide for each navigator and how/when to use them. img TrackNavigator The TrackNavigator is what CSI uses to manage navigation and control of widgets that may impact multiple tracks. Example: you have an 8-fader surface with 8 rotaries, 8 solo, and 8 mute buttons that you'll want assigned to different tracks. This is where TrackNavigator differs from SelectedTrackNavigator - since we have more than one fader, and we will want to assign them to more than the selected track. In the below example, the faders are controlling TrackVolume across multiple tracks. You'll notice the use of the pipe character (located by pressing shift+backslash on your keyboard): see the section on setting up Zones for more details on why. Zone "Channel|" TrackNavigator Fader| TrackVolume ZoneEnd SelectedTrackNavigator Using the SelectedTrackNavigator will mean that the actions in that Zone act in the context of the currently selected track. The Fader will change the selected track’s volume, TrackPan alters Pan settings, etc. SelectedTrackNavigator is especially useful for tasks like setting the automation mode, record arming, or toggling input monitoring states for the selected track if, for instance, your surface doesn't have multiple sets of buttons for these actions for each channel. SelectedTrackNavigator is how that one Read or Write knob can be setup to work on an 8-fader surface -- the single button sets the automation mode for the selected track only. Zone “MyWidgets” SelectedTrackNavigator Fader TrackVolume EndZone TrackSendSlotNavigator Navigate sends slot for each channel on your surface (e.g. slot 1 on Channel 1, slot 1 on Channel 2, slot 1 on channel 3). Use the appropriate slot bank action to see the next set of send slots. Zone "TrackSendSlot" TrackSendSlotNavigator DisplayUpper| TrackSendNameDisplay DisplayLower| TrackSendVolumeDisplay Fader| TraclSendVolume BankLeft SendSlotBank "-1" BankRight SendSlotBank "1" ZoneEnd See Send Zones for more details. TrackReceiveSlotNavigator Navigate receive slots for each channel on your surface (e.g. slot 1 on Channel 1, slot 1 on Channel 2, slot 1 on channel 3). Use the appropriate slot bank action to see the next set of receive slots. Zone "TrackReceiveSlot" TrackReceiveSlotNavigator DisplayUpper| TrackReceiveNameDisplay DisplayLower| TrackReceiveVolumeDisplay Fader| TrackReceiveVolume BankLeft ReceiveSlotBank "-1" BankRight RecieveSlotBank "1" ZoneEnd See Receive Zones for more information. TrackFXMenuSlotNavigator Navigate FX Menu slots for each channel on your surface (e.g. slot 1 on Channel 1, slot 1 on Channel 2, slot 1 on channel 3). Use the appropriate slot bank action to see the next set of FX Menu slots. Zone "TrackFXMenuSlot" TrackFXMenuSlotNavigator DisplayUpper| TrackNameDisplay DisplayLower| FXNameDisplay RotaryPush| GoFXSlot BankLeft FXMenuSlotBank "-1" BankRight FXMenuSlotBank "1" ZoneEnd See FX Menu Zones for more information. SelectedTrackSendNavigator Selected channel's sends mapped across surface channels (e.g. slot 1 for selected track, slot 2 for selected track). Select a different track to see that track's sends. Zone "SelectedTrackSend" SelectedTrackSendNavigator DisplayUpper| TrackSendNameDisplay DisplayLower| TrackSendVolumeDisplay Rotary| TrackSendVolume ZoneEnd See Send Zones for more details. SelectedTrackReceiveNavigator Selected channel's receives mapped across surface channels (e.g. slot 1 for selected track, slot 2 for selected track). Select a different track to see that track's receives. Zone "SelectedTrackReceive" SelectedTrackReceiveNavigator DisplayUpper| TrackReceiveNameDisplay DisplayLower| TrackReceiveVolumeDisplay RotaryE| TrackReceiveVolume ZoneEnd See Receive Zones for more information. SelectedTrackFXMenuNavigator Selected channel's FX Menu mapped across surface channels (e.g. slot 1 for selected track, slot 2 for selected track). Zone "SelectedTrackFXMenu" SelectedTrackFXMenuNavigator DisplayUpper| FXMenuNameDisplay RotaryPushA| GoFXSlot ZoneEnd See FX Menu Zones for more information. SelectedTrackSendSlotNavigator Navigate up/down Selected Track Send Slots. This is particularly useful for single fader surfaces where you've got one fader and one menu, but still want to be able to use that fader or rotary to control sends. Use the appropriate SendSlotBank action to navigate sends. Zone "SelectedTrackSendSlot" SelectedTrackSendSlotNavigator DisplayUpper1 TrackNameDisplay DisplayLower1 TrackSendNameDisplay Fader1Touch+DisplayLower1 TrackSendVolumeDisplay Fader1 TrackSendVolume Mute1 TrackSendMute Rotary1 TrackSendPan BankLeft SendSlotBank -1 BankRight SendSlotBank 1 ZoneEnd See Send Zones for more details. SelectedTrackReceiveSlotNavigator Navigate up/down Selected Track Receive Slots. This is particularly useful for single fader surfaces where you've got one fader and one menu, but still want to be able to use that fader or rotary to control receives. Use the appropriate ReceiveSlotBank action to navigate receives. Zone "SelectedTrackReceiveSlot" SelectedTrackReceiveSlotNavigator DisplayUpper1 TrackNameDisplay DisplayLower1 TrackReceiveNameDisplay Fader1Touch+DisplayLower1 TrackReceiveVolumeDisplay Fader1 TrackReceiveVolume Mute1 TrackReceiveMute Rotary1 TrackReceivePan BankLeft ReceiveSlotBank -1 BankRight ReceiveSlotBank 1 ZoneEnd See Receive Zones for more information. FocusedFXNavigator Use this navigator for mapping FX when they gain focus in Reaper. See MapFocusedFXToWidgets for more details. Zone "VST: SPL Transient Designer Plus (Plugin Alliance)" FocusedFXNavigator RotaryA1 FXParam 2 "Attack" RotaryA2 FXParam 3 "Sustain" ZoneEnd MasterTrackNavigator Using a MasterTrackNavigator means all those same actions act in the context of the Master Track. TrackVolume, TrackPan, etc will all affect the Master Track, regardless of which tracks are selected. Zone “MyWidgets” MasterTrackNavigator Fader TrackVolume EndZone Invoking multiple Actions from a single Control is as simple as defining more than one in your zone file, eg: Button1 TrackMute Button1 Reaper "40455" Ref: Example from Geoff The actions will be executed in the order they appear in the zone definition. Latching Modifiers If your surface sends release messages on button press, then you can do a quick press and release to "latch" a modifier. Example: let's say you want to use a few actions that require a Shift modifier. Quickly pressing and releasing the Shift button will engage the latch mode, which is the same as continuing to hold down the Shift button. A quick press and release turns the latching off. Chaining Multiple Modifiers You're not limited to one modifier like Shift or Control or Alt. You can combine them to add additional capabilities to your surface. Here are some examples of what that might look like... Shift+Control+Button Control+Alt+Button Shift+Control+Alt+Button Shift+Control+Alt+Option+Button Modifiers Work on Displays Too! Did you know that you can use modifiers on your displays? Here is an example where the lower displays show the track volume, until you hold down Shift, when the TrackPans are displayed. DisplayLower| TrackVolumeDisplay Shift+DisplayLower| MCUTrackPanDisplay You Can Chain Actions For CSI "Macros" Want to run a few actions in a set sequence? Just create multiple lines in your .zon files with the actions in the order you want. CSI will trigger each action in the order from the .zon file similar to running a custom action (or macro). In this example, holding select will 1) select the track, 2) toggle the mixer setting to show/hide children in folders (which would only apply if a parent folder track), and 3) toggle VCA spill (which would only apply if a VCA master track). Hold+Select| TrackUniqueSelect Hold+Select| Reaper 41665 //Mixer: Toggle show tracks in folders in mixer Hold+Select| TrackToggleVCASpill "Refresh All Surfaces" Reaper Action to Test Changes to Your .zon Files If you're creating or modifying .zon files with Reaper open, and want to check out the changes, CSI will need to rescan the files. The most efficient way to do this (i.e. without needing to close and restart Reaper) is to run the Reaper action: Control surface: Refresh all surfaces ...this will allow CSI's parser to rescan your .zon files. Just remember to actually save the changes to your .zon files before you run it (speaking from experience)! Cycling Through Hardware Inputs From Your Control Surface Nos402 from the Reaper forums posted this trick which allows you to set the hardware input on your channel using SWS Cycle Actions. To do this, first setup a new SWS Cycle Action that looks like the one shown below. You basically add a row, right click it, click Insert statement -> REACONSOLE, then type in i1 if you want input 1, and i4 if you want input 4, etc. If you want a stereo pair, use i1s for stereo pair 1/2, and i3s for stereo pair 3/4. Be sure to "Add Step" in between each REACONSOLE command. Save that cycle action, and locate it in Reaper's Action List. Select it and Copy the Command ID. Now, we just have to add it to your [surface].zon file inside a zone with a selected track navigator similar to what's shown below. In my case, I'm using a one channel surface and have this linked to the Control modifier when used with the RecordArm button. Your Cycle Action number will likely differ than mine so be sure to copy yours from the Reaper Action List: Zone "SelectedChannel" SelectedTrackNavigator Control+RecordArm1 Reaper _S&M_CYCLACTION_12 ZoneEnd That's it! Centering Pan and FX Input/Output Gain Parameters You can use stepped parameters, or rather, a single-step parameter to center your pans or reset things like input/output gain on plugins. In the below example, I've got Input and Output Gain (plugin parameters 27 and 28 respectively) mapped to widgets RotaryB5 and B6 respectively. Now, in case I ever move them by accident or want to quickly reset them back to 0db, I'm utilizing the RotaryPush press with a single-step value of "[ 0.5 ]" to center the Input and Output gain parameters of this plugin. DisplayUpperB5 FXParamNameDisplay 27 "Input" DisplayLowerB5 FXParamValueDisplay 27 RotaryB5 FXParam 27 RotaryPushB5 FXParam 27 [ 0.5 ] Property+RotaryPushB5 NoFeedback / DisplayUpperB6 FXParamNameDisplay 28 "Output" DisplayLowerB6 FXParamValueDisplay 28 RotaryB6 FXParam 28 RotaryPushB6 FXParam 28 [ 0.5 ] The same would work for pan as shown below... Rotary| TrackPan Shift+RotaryPush| TrackPan [ 0.5 ] ...this tip could of course be expanded to any plugin parameter. Resetting Track Volume Similar to the pan reset trick above, you can reset the Track Volume of a channel to unity gain by doing something like this: Control+Select TrackVolume [ 0.716 ] ...in this case, I'm using a combination of the Control modifier plus the channel Select button to reset the track volume to unity gain (which is what the 0.716 represents). Creating a Simple OSC Template and .OST Here, I’m going to show you how to create a simple single channel setup for a phone using TouchOSC Editor, that we’ll then create an .ost and .zon files for use in CSI. The goal of this guide is not to create the best TouchOSC layout ever, but rather, just expose you to the concepts so you can create your own TouchOSC devices in the future by expanding on what you learn here. Pre-Conditions: • You’ve got TouchOSC Editor installed on your computer • You’ve got TouchOSC installed on your phone or tablet • They’re all talking to each other and Reaper (see my other guide on setting up a similar configuration) Step 1: Create the Template in TouchOSC Editor Let’s create a very simple template in Touch OSC Editor. I want a remote control where I can record myself remotely, and use my phone for Play, Record, Stop, with Volume and Pan on the selected channel. I also want a display to show me the Selected Track Name. So 6 controls total. Sample CSI Phone Remote 1. Open TouchOSC Editor 2. Where it says Layout on the left, I’m going to keep the size at “iPhone/iPadTouch” with a vertical orientation (default settings) – You should pick the size and layout that best matches your device!!! 3. Below that where it says Page, then Name, pick a name for your page. It’s a best practice to name your pages. 4. If you want to make that name visible on the template, click on “Label” and you can enter the page name in the Text field, and pick a color. 5. Now, right click on the black background that represents the phone screen. This opens a dropdown menu of available controls/displays/etc. 6. Select “Push Button” 7. Drag that button towards the bottom right and resize it to your liking being careful not to make it so small the control will be difficult to operate. 8. With the button selected and highlighted, let’s change the color to Green. Check the box for Local Feedback Off. 9. Now, with the button still selected, enter the name “Play” at the top then go down to the OSC tab, uncheck the “Auto” button, and provide a name for this control of: /Play. Note: If you were going to use multiple pages on your TouchOSC template, you can include a page number or page name in the control name by using an extra set of slashes. Example: let's say you want to call it page 1, play widget. That would look like this /1/Play. Then on page 2 you wanted a rotary, that might look like /2/Rotary1. And so forth. But let's not do multiple pages and keep it simple with just /Play for now. 10. Now right click a blank area and select “Label H.” 11. Drag this label over the middle of our button. 12. With the label selected, name this “PlayLabel” at the top-left hand side… 13. Change the color to Green 14. Resize it so it fills up most of the button 15. In the OSC tab uncheck auto 16. Label this control /PlayLabel 17. Uncheck the Background box 18. Where it says “Text” enter Play (this is what will appear in the label unless we tell CSI to show something else) 19. Change the size to something nice and big (say 20 or above) 20. You’ve now created a button and a label 21. Let’s repeat these steps and create a Stop button (yellow) and a Record button (red) that we’ll put right above the Play button. We’re going to update all of our labels and locations to say Stop and Record respectively. You should end up with something like this. Now let’s add a Fader for volume, a Rotary for pan, and a Label for our Track Name! 22. Now Right-Click the black area again and select “Fader V” from the dropdown 23. Drag this to the left of our buttons and make the size something comfortable 24. Name this Fader1, maybe make it blue, with an OSC control name of /Fader1 – all other settings at default 25. If the thick part of the fader is at the top, then check the box to invert the faders. For some reason, inverted faders (drawbar style) appear to be the normal. 26. Right click an empty space and select “Rotary V” 27. Move it above record and resize it 28. Let’s also make this blue, name it Rotary1, in the OSC tab give the control a name of /Rotary1 and leave all other settings at default One more control to go, let’s add a label. 29. Right-click an empty area and select “Label H” again 30. Let’s center this at the top 31. Resize it to make wider 32. Make the font size 18 or so 33. Label this “DisplayUpper1” with an OSC control name of /DisplayUpper1 and in the Text field lets add the text “Selected Track Name” [optional]. Completed Sample Do you have something that looks like this? 34. Now save your template! Step 2. Sync Your New Template to Your Phone or Tablet 1. In TouchOSC Editor click Sync 2. Open TouchOSC on your phone or Tablet 3. Find the layout selection and click the name of your currently selected layout 4. From the next window that appears, click Add 5. Wait until your PC appears under “Found Hosts” and click that PC name 6. This should automatically download your template to your phone or tablet 7. Go back to the Layout and select it 8. Click Done in the top right 9. You should now see your layout on your phone or tablet Step 3. Create a CSI .ost File for Your Template So now we need to define for CSI what controls exist in our template. So just as we need an .mst file for MIDI hardware, we need an .ost file for OSC templates. Being that we just created an OSC template from scratch, let’s create an .ost file from scratch too! • Open a text editor to begin creating your .ost file • Just like an .mst file, the first line is the word Widget followed by a description of that widget. • If it’s a control you’re going to go down a row and enter Control followed by the /[OSC_Control_Name] from our template. So our Play button would be /Play • If it’s a Feedback Processor (i.e. you need two-way communication) you need to define that. Controls usually have FB_Processors, but labels can be FB_Processors with no Control. You’re going to enter FB_Processor followed by the /[OSC_Control_Name] from our template. So our Play button would be /Play • The last row for each widget simply says WidgetEnd • Save your new .ost file in your CSI\Surfaces\OSC folder Here’s what I’ve setup. Notice that I didn’t create widgets for the labels for Play, Record, and Stop. That’s because I want that text to be fixed and static. Widget DisplayUpper1 FB_Processor /DisplayUpper1 WidgetEnd Widget Fader1 Control /Fader1 FB_Processor /Fader1 WidgetEnd Widget Rotary1 Control /Rotary1 FB_Processor /Rotary1 WidgetEnd Widget Play Control /Play FB_Processor /Play WidgetEnd Widget Stop Control /Stop FB_Processor /Stop WidgetEnd Widget Record Control /Record FB_Processor /Record WidgetEnd Step 4. Create a Zone Folder and .zon Files Now we need to tell CSI what to do with this new device by creating a Zone folder and .zon files. • Create a new sub-folder under CSI\Zones for your device (Example: CSI\Zones\TouchOSC Remote) • Open up a Text Editor • Use standard CSI syntax for creating zone files Your .zon files should look like this -- they are shown together below but each Zone is in its own file … Zone Home IncludedZones "Buttons" "SelectedChannel" IncludedZonesEnd ZoneEnd Zone "Buttons" Play Play Record Record Stop Stop ZoneEnd Zone "SelectedChannel" SelectedTrackNavigator Fader1 TrackVolume Rotary1 TrackPan DisplayUpper1 TrackNameDisplay ZoneEnd Step 5: Add Your Device to Your CSI Config and Restart Reaper 1. Open up Reaper’s Preferences 2. Go to Control/OSC/Web 3. Click on “Control Surface Integrator” (if not already there follow the installation instructions elsewhere in this wiki) 4. Click Edit to open the CSI preferences 5. Click the Page you’d like to add this surface to 6. Click Add OSC 7. Follow the instructions for adding an OSC device located elsewhere in this wiki 8. Click ok to save and apply your changes 9. Restart Reaper (OSC additions require a full restart)