09 ‐ Tips and Tricks - FunkybotsEvilTwin/CSIUserGuide GitHub Wiki

This section is a collection of useful CSI workflow enhancements, many of which were contributed by CSI users in the community. These tips and tricks cover a variety of creative ways to improve your experience using CSI, from chaining actions together for macros to using your control surface to create sends in Reaper.

If you have additional tips to share, feel free to contribute in the CSI thread on the Reaper forums.

Table of Contents


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 SelectedTrack zone 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 "SelectedTrack"
     Control+RecordArm1                 Reaper _S&M_CYCLACTION_12
ZoneEnd

That's it!


Centering Pan and FX Parameters

You can use stepped parameters, or a single-step parameter, to quickly center pan controls or reset FX parameters such as EQ gains, input/output gain, and more. This allows you to quickly return a parameter to a default or neutral position with a button press.

For example, if you have an EQ gain control mapped to a rotary encoder, you can set up the corresponding push action on the encoder to reset the gain to its default center position (e.g., 0.50 for a neutral EQ gain). Additionally, if you have extra display space, you can use FixedTextDisplay to provide a reminder such as "Push to Reset."

Example: Resetting an EQ Gain Control

In this setup, RotaryA2 controls an FX parameter (e.g., a low EQ gain), while RotaryPushA2 resets it to the default center value (0.50). The display also provides a visual cue.

	RotaryA2 FXParam 7 [ 0.00>1.00 (0.0) (0)  ]
	RotaryPushA2 FXParam 7 [ 0.50 ]
	ShiftRotaryA2 NoAction 
	DisplayUpperA2 FixedTextDisplay "LowGain" 7 
	DisplayLowerA2 FXParamValueDisplay 7 
	DisplayRotaryPushA2 FixedTextDisplay "Push to Reset"
	DisplayUpperShiftA2 NoAction 
	DisplayLowerShiftA2 NoAction 

Example: Centering Pan Controls

A similar method can be used for track panning. By mapping RotaryPush with a single-step value, you can instantly return the pan to the center position (0.50) when needed.

Rotary|               TrackPan
Shift+RotaryPush|     TrackPan [ 0.5 ]

This method can be extended to other FX parameters, such as resetting a mix level to 100% with a single button press.


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). Note: The unity-gain track volume level can vary a bit from Reaper install to Reaper install as it's dependent on the "Volume Fader Range" setting found in Reaper's Preferences -> Appearance -> Track Control Panels. So start with 0.716 and adjust that number up or down as needed to get the fader to reset to 0.0db.


Exclusive Solo and Exclusive Mute

These suggestions come from Reaper forum user M4TU. If you want Exclusive Solo functionality (i.e. only one track solo'd at a time), you could do something like this in your TrackZone...

Zone "Track"
    Shift+Solo|     Reaper 40340   // Track: Unsolo all tracks
    Shift+Solo|     TrackSolo
ZoneEnd

Exclusive Mute works a little differently because there is no native CSI action, but can be accomplished like this...

Zone "Track"
    Shift+Mute|     Reaper 40339   // Track: Unmute all tracks
    Shift+Mute|     TrackMute
ZoneEnd

Dedicated TrackNameDisplay for Last Touched Track

If you've got a surface that transmits touch messages and you want a display that will show the name of the track you're touching, you can attach a Fader Touch modifier to the display. But because fader touch messages were designed to override existing functionality, you'd have to add a FixedTextDisplay action wtih an empty string (just 2 empty quotes with a space between), followed by the fader touch syntax with a TrackNameDisplay as shown below.

Zone "Track"
    MainDisplay|                   FixedTextDisplay " "
    Fader|Touch+MainDisplay|       TrackNameDisplay
ZoneEnd

Want to See the Active Zone or Mapping In Reaper?

Big thanks to Reaper forum user Manwë for this incredible tip! Would you like to see the active zone name, or even have the active mapping appear on screen within Reaper itself? You can do this by leveraging the “SWS/S&M: Resources - Show image, slot” actions and combining those with custom images.

CSI-IMAGE-DEMO

Pre-Condition: You must have SWS extensions installed.

Step 1: Increase the Number of Show Image Slots

By default, only 4 “Show Image Slots” exist. So if you want to extend the number of these, you need to open the S&M.ini, locate the line "S&M_SHOW_IMG=___", then change the number, resave the S&M.ini, and restart Reaper.

Step 2: Make .png template files for your zone names and/or mappings

Make a PNG template for your zones [you can use pixlr.com] and add them to your Images resources in your SWS Extensions menu.

To make it easier, Manwë has already provided image files for the most common zone names which can be found here: CSI ZONE PNGs.zip

Step 3: Add your images in SWS Extensions

Now that we have images we want to use, we must assign those to the S&M Image Slots in Reaper.

  1. Open Reaper’s Action List
  2. Run the action “SWS/S&M: Open/close Resources window (images)”
  3. Right click on the empty space under the word slot and select “Add Slot”
  4. Locate the image file you’d like to assign to the S&M Show Image Slot 1 action
  5. Repeat this for other slots/images as required

Step 4: Add the S&M Show Image Slot Actions to Your Zone Activation Buttons

Now you just need to add the images in the corresponding slots to the zone activation buttons (or OnZoneActivation virtual widget) within CSI.

Example: if I have Image Slot 1 assigned to show the Home.zon, and use the F1 button on my surface to go Home, I can do this to make “Home” appear in Reaper whenever I GoHome.

Zone "Buttons"

     F1                        GoHome
     F1                        Reaper _S&M_SHOW_IMG1

Repeat this as needed for other zones and image slots.

Step 5: Setup the Window in Reaper as desired

You may want to dock the image window, you may prefer a floating window, you may want it on another screen. May be a good idea to include it in screen sets.

What if I Forget My Mapping? Can I Use it for That Too?

Yes, you can also use this to display images for your mapping, including creating a toggle using Cycle Actions to flip between the zone name image and the mapping image as shown below.

CSI-TOGGLE-DEMO

To set this type of behavior up, first, make 2 new custom actions for the 2 images you want to use for the selected zone like the following:

///First custom action for the Surface mapping image. I named mine "CSI HOME MAPPING--> UNDOCK"

SWS/S&M: Resources - Show image, slot __
Dock/undock currently focused window

Second custom action...

///Second custom action to return to the docked CSI zone image. I named mine "CSI HOME ZONE-->DOCK"

SWS/S&M: Resources - Show image, slot __
Dock/undock currently focused window

Now, create an SWS Cycle Action with toggle enabled like the following:

(custom action command ID)          Custom: CSI HOME MAPPING-->UNDOCK
!                                   -----Step-----
(custom action command ID)          Custom: CSI HOME ZONE-->DOCK

Dock your Zone image where you'd like it, map your Cycle Action to a surface button in your zone and press, resize/locate your Mapping image where you'd like it and done!

The only downside is you would need to have the Zone image docked before activating another zone. Otherwise the Zone image and projection image are swapped. Quick fix though!


I Want a Button Assigned to a Reaper Action to Remain Lit

Thanks to MT4U for this one! Imagine you've got a Reaper Action assigned to a button and that Reaper Action does not provide feedback so the button light is permanently off. But you'd prefer the opposite. You want the button light to remain on at all times. You can try using the Feedback=Yes widget mode combined with InvertFB modifier as shown below...

     InvertFB+Drop          Reaper 41665 Feedback=Yes   //Show/hide children of selected tracks

Using a CSI Surface To Control MIDI CC's (Expression, Channel Aftertouch, and more)

This tip comes from the prolific Mixmonkey. Let's say you want to use your surface (X-Touch for example) to send MIDI CC's to a certain track or plugin using CSI. You can do that by creating an fx zone file for the ReaControlMIDI plugin.

  1. Add the ReaControlMIDI plugin to a track in your project
  2. Assign the CC's or MIDI controls you want to one of the five available parameters in ReaControlMIDI. Example: 1. Volume, 2. Pan, 3. PitchWheel, 4. Expression, 5. Channel Pressure (you can change any or as many of these as you'd like)
  3. If this is a configuration you'd use often, probably a good idea to save this preset as default
  4. Now, create an FX.zon for ReaControlMIDI by either auto-mapping, learning, or creating an fx.zon from scratch. You should end up with something that resembles the below example.
Zone "VST: ReaControlMIDI (Cockos)" "ReaControlMIDI"
	OnZoneActivation SetXTouchDisplayColors Cyan
	OnZoneDeactivation RestoreXTouchDisplayColors

#Begin auto generated section
	Fader1	FXParam 0
	DisplayUpper1	FixedTextDisplay "Bank MSB"
	DisplayLower1	FXParamValueDisplay 0

	Fader2	FXParam 1
	DisplayUpper2	FixedTextDisplay "Bank LSB"
	DisplayLower2	FXParamValueDisplay 1

	Fader3	FXParam 2
	DisplayUpper3	FixedTextDisplay "Program"
	DisplayLower3	FXParamValueDisplay 2

	Fader4	FXParam 3
	DisplayUpper4	FixedTextDisplay "Volume"
	DisplayLower4	FXParamValueDisplay 3

	Fader5	FXParam 4
	DisplayUpper5	FixedTextDisplay "Pan"
	DisplayLower5	FXParamValueDisplay 4

	Fader6	FXParam 5
	DisplayUpper6	FixedTextDisplay "Pitch Wheel"
	DisplayLower6	FXParamValueDisplay 5

	Fader7	FXParam 6
	DisplayUpper7	FixedTextDisplay "Expression"
	DisplayLower7	FXParamValueDisplay 6

	Fader8	FXParam 7
	DisplayUpper8	FixedTextDisplay "Channel Pressure"
	DisplayLower8	FXParamValueDisplay 7

#End auto generated section
ZoneEnd

0 Bank MSB
1 Bank LSB
2 Program
3 Volume
4 Pan
5 Pitch Wheel
6 Expression
7 Channel Pressure
8 Channel
9 Transpose
10 Snap to Scale
11 Scale Root
12 Scale Type
13 Bank/Program Enable
14 CC Enable
15 Bypass
16 Wet
17 Delta

Now, with the above, you simply need activate the ReaControlMIDI mapping on your surface and you can use your controller to transmit MIDI CC's as needed.


Creating Sends From Your Control Surface

Using two custom scripts written by Ilya Kuznetsov, CSI allows you to set up sends and receives directly from your control surface. These scripts let you select source tracks (sends) and destination tracks (receives) in Reaper and create the routing automatically.

1. Setup: Install the Scripts in Reaper

Before using these scripts, you need to save them to your Reaper Scripts directory and add them to the Action List.

Steps to Install:

  1. Copy and save the first script as cs_send.lua in your Reaper/Scripts folder.
  2. Copy and save the second script as cs_receive.lua in the same Reaper/Scripts folder.
  3. Open Reaper, go to Actions → Show Action List.
  4. Click Load, then navigate to and select cs_send.lua. Repeat for cs_receive.lua.
  5. Both scripts will now appear in the Action List and can be triggered from your control surface.

2. How to Use the Scripts

Step 1: Select Tracks to Send From

  • Select one or more tracks that will send audio.
  • Run the cs_send script.

Step 2: Select Tracks to Receive Audio

  • Select one or more tracks that will receive audio.
  • Run the cs_receive script.

Once completed, the selected tracks will be connected via Reaper’s routing system.

3. Assigning Scripts to a Control Surface Button

To trigger these scripts from your control surface, you need to map them to buttons in your CSI Zone file.

Steps to Assign:

The Command ID's for custom scripts are unique to each user's machine. So the Command ID's shown in the example below, will be different from your system. Follow these steps to setup the button assignments.

  1. Open Reaper’s Action List and find the loaded scripts.
  2. Right-click each script and select Copy Selected Action Command ID.
  3. Open your CSI Zone file and paste the copied Action Command ID into the button assignment.
Zone Home

    F7     Reaper _RS919b9de323ff51fd51c7c0735e407184c8d7c4c8     // cs_send
    F8     Reaper _RSf0e7b9f6b7f0d20cc111136b32c40950b09800a7     // cs_recive

cs_send.lua (Script 1)


local command_id =  ({reaper.get_action_context()})[4]  -- Getting the ID of the current script
local current_state = reaper.GetToggleCommandState(command_id)

-- Function to check if data has been deleted
local function checkForData()
    -- Checking if data exists in ExtState
    local trackIDsString = reaper.GetExtState("cs_send", "trackIDs")

    if trackIDsString == "" then
        reaper.SetToggleCommandState(0, command_id, 0)
        return -- Finish work if data is missing
    else
        -- If the data exists, we continue checking after a short delay
        reaper.defer(checkForData)
    end
end

-- Function for saving selected tracks
local function saveSelectedTracks()
    -- Getting selected tracks
    local selectedTracks = {}
    local count = reaper.CountSelectedTracks(0)

    if count == 0 then
    reaper.DeleteExtState("cs_send", "trackIDs", true)
    reaper.SetToggleCommandState(0, command_id, 0)
    return
    end
    
    for i = 0, count - 1 do
        local track = reaper.GetSelectedTrack(0, i)
        local trackID = reaper.GetTrackGUID(track) -- We use a unique track identifier
        table.insert(selectedTracks, trackID)
    end

    -- Converting the array to a string
    local trackIDsString = table.concat(selectedTracks, ",")

    -- Saving the string in ExtState
    reaper.SetExtState("cs_send", "trackIDs", trackIDsString, false)

end

-- Starting the main process
reaper.SetExtState("cs_send", "script_id", tostring(command_id), true)
if current_state == 1 then
    reaper.SetToggleCommandState(0, command_id, 0)  -- State off
    reaper.DeleteExtState("cs_send", "trackIDs", true)
else
    reaper.SetToggleCommandState(0, command_id, 1)  -- State on
    saveSelectedTracks()
end

cs_receive.lua (Script 2)


--local section = "cs_send"
--local key = "trackIDs"

--Get id script cs_send
local cs_send_ID = tonumber(reaper.GetExtState("cs_send", "script_id"))

-- Get save data
local trackIDsString = reaper.GetExtState("cs_send", "trackIDs")

-- Check, data exist
if trackIDsString == "" then
    return -- Finish work if there is no data
end

-- We delete data from the section after reading it
reaper.DeleteExtState("cs_send", "trackIDs", true)

-- Split the string back into an array
local savedTrackIDs = {}
for trackID in string.gmatch(trackIDsString, "[^,]+") do
    table.insert(savedTrackIDs, trackID)
end

-- Getting selected tracks
local selectedTracks = {}
for i = 0, reaper.CountTracks(0) - 1 do
    local track = reaper.GetTrack(0, i)
    if reaper.IsTrackSelected(track) then
        table.insert(selectedTracks, track)
    end
end

-- We create sends between saved tracks and selected ones
for _, guid in ipairs(savedTrackIDs) do
    local savedTrack = reaper.BR_GetMediaTrackByGUID(0, guid)
    if savedTrack then
        for _, selectedTrack in ipairs(selectedTracks) do
            -- Create a send (for example, 1st send)
            local sendIndex = reaper.CreateTrackSend(savedTrack, selectedTrack)
        end
    end
end

-- Change the state of the cs_send script to disabled

reaper.SetToggleCommandState(0, cs_send_ID, 0)

Jog and Scrub Behavior

Ilya Kuznetsov also provided two additional scripts that will provide more traditional JogWheel and Scrub behavior from CSI. These scripts allow for more precise movement when jogging forward and backward, as well as scrubbing audio with finer control.

Setting Up the Jog and Scrub Scripts

  1. Save the Scripts in Your Reaper Scripts Directory

    • Copy the following scripts to a text editor (scroll down for scripts):
      • cs_JogFwd.lua (Jog Forward)
      • cs_JogRew.lua (Jog Backward)
      • cs_ScrubFwd.lua (Scrub Forward)
      • cs_ScrubRew.lua (Scrub Backward)
    • Save them using the above names to a location in your Reaper\Scripts directory.
  2. Load the Scripts into Reaper

    • Open Reaper’s Actions List (? key shortcut).
    • Click Load, navigate to the Reaper\Scripts folder, and select each script.
    • Once loaded, the scripts will be available in the Action List for assignment.
  3. Assigning Jog and Scrub Scripts to Your Control Surface
    The Command ID's for custom scripts are unique to each user's machine. So the Command ID's shown in the example below, will be different from your system. Follow these steps to setup the button assignments.

    • Locate the scripts in the Action List.
    • Right-click each script and select Copy Selected Action Command ID.
    • Open your CSI zone file for your control surface.
    • Paste the copied command IDs next to the corresponding button, jog wheel, or encoder widget in your CSI zone file.
  4. Example Assignments

    • Assign the Jog Forward and Jog Backward scripts to your jog wheel for timeline movement.
    • Assign the Scrub Forward and Scrub Backward scripts to another set of controls for audio scrubbing.
Zone Home

    Decrease+JogWheel           Reaper _RS8835b6d09e85c72e49da42bc031311c0044b1ed0    // cs_JogRew.lua
    Increase+JogWheel           Reaper _RSf2be60b70f669c320254aeae0d541ca479e342d1    // cs_JogFwd.lua

    Scrub+Decrease+JogWheel     Reaper _RSe894e9551d61f6b65768a477e412c6b2b38bb271    // cs_ScrubRew.lua
    Scrub+Increase+JogWheel     Reaper _RSe05488e1d366f1f79046bde1ac96dbd3ffcdaf06    // cs_ScrubFwd.lua
  1. Testing the Scripts
    • After making changes, reload CSI by running the Refresh All Surfaces action in Reaper.
    • Test jog and scrub behavior by rotating the jog wheel or pressing assigned buttons.

These scripts provide a smoother, more responsive jog and scrub experience when navigating through your project, giving you better control over transport and playback positioning.

Recommended Settings in Reaper

For optimal performance with these jog and scrub scripts, we recommend starting out with these settings in Reaper’s Preferences > Audio > Scrub/Jog section.

Jog and Scrub Settings

cs_JogFwd.lua (Script 1)

reaper.CSurf_OnRewFwd(1, 1)

cs_JogRew.lua (Script 2)

reaper.CSurf_OnRewFwd(1, -1)

cs_ScrubFwd.lua (Script 3)

reaper.CSurf_ScrubAmt(2.25)

cs_ScrubRew.lua (Script 4)

reaper.CSurf_ScrubAmt(-2.25)

Using an OSC Device as a Virtual Display for Your MIDI Controller

If you have a MIDI device without built-in displays, such as the BCR-2000 or MIDI Fighter Twister, you can use an OSC-based virtual surface to provide real-time visual feedback. This setup allows the OSC device to mirror your MIDI controller and keep them in sync via the Open Sound Control (OSC) protocol.

Setting Up a Virtual Surface with Displays

1. Create an OSC Template Matching Your Hardware

  • Use an OSC app like TouchOSC or Lemur to create a template that mimics your MIDI controller.
  • The template should match the physical controls (knobs, faders, buttons) and add displays for real-time feedback.
  • Use the same Widget names on the OSC Device as used in the MIDI device.
  • This OSC template will act as a virtual mirror for your MIDI controller.

2. Set Up CSI with a Separate Surface Folder for the OSC Device

  • In your main CSI folder, create a new folder for the OSC surface.
  • Name it something like BCR_2000_iPad or MFTwister_iPad.
  • Inside this folder, create a new Surface.txt file for the OSC device.
  • The Surface.txt will need to have the Widget names and OSC address for each Control and Label (aka Display). See the Surface.txt Files section for details.
  • In the OSC surface folder, create a set of Zone folders for the OSC device that mirror the MIDI device's zone folders, but add in display Widgets and Actions. Make sure the folder structure and zone mappings otherwise match the MIDI device.

3. Add Both Devices to CSI in Reaper

  • Open Reaper’s PreferencesControl/OSC/WebControl Surface Integrator.
  • Add both your MIDI device and your OSC device as separate surfaces.
  • Set up their respective MIDI and OSC assignments. See Setting Up Your Control Surfaces for details.
  • Once both devices and their assignments are setup, click the Advanced button.

CSI Preferences Screen


4. Set Up Broadcast and Listener Settings

Step 4A: Add the MIDI Device as a Broadcaster and Listener

  • In the Broadcast Device section, select your MIDI controller and click Add. Broadcasters do not listen to themselves by default, so next...
  • In the Listener Device section, select the same MIDI controller and click Add.
  • Check the relevant options, such as SelectedTrackFX, SelectedTrackSends, SelectedTrackReceives, FXMenu, etc. Do not check the ModSquad box.
  • Now ad the OSC Device as a Listener and check all the same boxes.

Step 4B: Add the OSC Device as a Broadcaster and Listener

  • In the Broadcast Device section, select your OSC device and click Add.
  • In the Listener Device section, select the same OSC device and click Add.
  • Check the same options as in the prior step to ensure the devices stay synchronized.
  • Now add the MIDI Device as a Listener and check the same options.

CSI Broadcast and Listen


5. Manually Editing the CSI.ini to Share Zone Folders

  • Exit Reaper.
  • Navigate to your Reaper Resource Path and open CSI.ini in a text editor.
  • Find the SurfaceFolder, ZoneFolder, and FXZoneFolder settings for both devices.
  • Modify the ZoneFolder and FXZoneFolder so both surfaces point to the same folder.
    • DO NOT change SurfaceFolder.
    • This ensures both surfaces use the same mappings while remaining separate devices in CSI.

⚠ Important Note:
🚨 If you enter the Assignments screen in CSI's settings again in the future, it will overwrite these manual changes to the CSI.ini. Once you have this working, avoid re-entering the Assignments screen or be prepared to manually reapply these edits each time you do.

Example of a correctly configured CSI.ini:

Version=7.0

SurfaceType=MIDI SurfaceName=BCR2000 SurfaceChannelCount=8 MidiInput=5 MidiOutput=5 MIDISurfaceRefreshRate=15 MaxMIDIMesssagesPerRun=200 
SurfaceType=OSC SurfaceName=iPad_Air SurfaceChannelCount=8 ReceiveOnPort=8001 TransmitToPort=9001 TransmitToIPAddress=192.168.1.146 MaxPacketsPerRun=0 

PageName=Home PageFollowsMCP=No SynchPages=Yes ScrollLink=Yes ScrollSynch=Yes
	Surface=BCR2000 SurfaceFolder=BCR2000 ZoneFolder=BCR2000_iPad FXZoneFolder=BCR2000_iPad StartChannel=0
	Surface=iPad_Air SurfaceFolder=BCR2000_iPad ZoneFolder=BCR2000_iPad FXZoneFolder=BCR2000_iPad StartChannel=0

	Broadcaster=BCR2000
	Listener=BCR2000 GoHome=Yes SelectedTrackSends=No SelectedTrackReceives=No FXMenu=Yes Modifiers=No SelectedTrackFX=Yes 
	Listener=iPad_Air GoHome=Yes SelectedTrackSends=No SelectedTrackReceives=No FXMenu=Yes Modifiers=No SelectedTrackFX=Yes 

	Broadcaster=iPad_Air
	Listener=iPad_Air GoHome=Yes SelectedTrackSends=No SelectedTrackReceives=No FXMenu=Yes Modifiers=No SelectedTrackFX=Yes 
	Listener=BCR2000 GoHome=Yes SelectedTrackSends=No SelectedTrackReceives=No FXMenu=Yes Modifiers=No SelectedTrackFX=Yes 
  • Save the changes and close the CSI.ini.
  • Restart Reaper.

6. Testing Your Setup

  • Launch Reaper
  • You should see any Display widgets in your Home.zon reflected on your OSC device
  • Test buttons and controls
  • Test FX Learn (create a map, refresh all surfaces, use the map)
  • When controlling FX or controls in Reaper, make sure the widgets on both devices work and mirror each other

Additional Considerations

  • Use the OSC Device for FX Learning

    • When mapping FX parameters with CSI’s FX Learn feature, you must use the OSC device, not the physical MIDI controller.
    • FX Learn does not use CSI’s Broadcast/Listener system in real time.
    • Since the OSC device has both displays and controls, it provides the necessary visual feedback during the learning process.
    • After mapping FX via Learn Mode, you can control FX using the MIDI hardware.
  • Why Use OSC for Virtual Displays?

    • Many MIDI controllers lack screens, making it difficult to track parameters.
    • By pairing an OSC display, you gain real-time feedback that stays in sync with your MIDI hardware.
  • How Does the Virtual Surface Stay in Sync?

    • Since both the MIDI and OSC devices share the same Zone and FXZone folders, changes made on one device will immediately reflect on the other.
  • Troubleshooting

    • If your OSC surface is not updating, check:
      • IP addresses and Send/Receive ports in CSI’s Settings > Surfaces.
      • Ensure your OSC app (TouchOSC, Lemur) is running and properly connected.
      • Verify the ZoneFolder and FXZoneFolder settings in CSI.ini.
      • If all else fails, try different pairs of ports (8000/9000, 8001/9001, 8002/9002, etc.). OSC is very picky about ports.
    • Make sure MIDI Device is not enabled in Reaper's Preferences > Audio Devices > MIDI Inputs and MIDI Outputs section.
    • Ensure the MIDI device's Surface.txt folder is in the correct folder, and the OSC device's Surface.txt folder is also in the correct folder.
    • Start your MIDI and OSC devices before launching Reaper.

By following these steps, you can create a seamless hybrid MIDI + OSC control setup, combining the best of both worlds.


How To Create TouchOSC Buttons With Feedback

The latest major version of TouchOSC removed the "Local Feedback" option that previously allowed buttons to cleanly receive external feedback from CSI. Without this option, TouchOSC buttons that both send and receive messages may behave erratically or inconsistently.

To work around this, you can create two separate button layers in TouchOSC:

  • One layer handles sending messages to CSI
  • The other layer handles receiving feedback from CSI

With this approach, neither button is performing both tasks, avoiding the conflict introduced in newer versions of TouchOSC.


Step 1. Create the Send Button Layer in TouchOSC

  • Create your first button.
  • Name it
  • Go to the OSC > Messages section
  • Configure it to Send only
  • Ensure that Receive is not enabled
  • This button should be set to Interactive, since this is the layer you will press

TouchOSC Button Layer 1


Step 2. Create the Feedback Button Layer in TouchOSC

  • Duplicate the original button
  • Use the same widget name and OSC address as the prior button
  • In the properties panel:
    • Uncheck "Interactive" — this layer is passive and not touchable
    • Under OSC > Messages, uncheck both Press and Release
    • Also make sure the Send checkbox is not selected — this button only receives

This button will receive external state changes from CSI and visually reflect them.

TouchOSC Button Layer 2


Step 3. (Optional) Add a Display Layer

If you’d like the button to include a text label (such as the name or value of the action), you can add a Label element layered over the button.

  • Ensure Visible is checked
  • Ensure Interactive is not checked
  • Don't check the Background box, we want the feedback to be visible from the Receive-only layer in step 2
  • Under OSC > Messages, make sure Receive is checked (Send isn't totally necessary but doesn't hurt)

Button Display Layer

Overriding Control Surface Button Feedback With MIDI

This tip comes from Cragster! Some control surfaces have illuminated buttons that do not properly respond to CSI’s feedback system. In certain cases, you can override this behavior by using CSI’s SendMIDIMessage action to manually control the LED feedback.

In the example below, a button is used to enter the Folder zone, and the light is manually turned on using SendMIDIMessage. When exiting the Folder zone using a Shift modifier, another MIDI message turns the light off.

Zone Home
    Button SendMIDIMessage "0x90 0x47 0x7f" 
    Button GoZone Folder
    Shift+Button SendMIDIMessage "0x90 0x47 0x00"
    Shift+Button GoZone Folder

The result:

  • Pressing the button enters the Folder zone and turns the light on.
  • Pressing Shift + the button exits the Folder zone and turns the light off.

This gives you control over the surface feedback using explicit MIDI commands, allowing better sync between visual state and function even on controls that don’t natively support receiving external feedback from CSI.

Solo the Entire SelectedTracks Zone Using a Shortcut

This tip comes from LDT2. You can create a surface assignment that will toggle Solo or Mute for all selected tracks using native Reaper actions. This setup is especially useful in the SelectedTracks zone when you want to affect the entire group of selected tracks at once.

In the example below, we bind Shift+Solo1 and Shift+Mute1 to the appropriate Reaper actions. These will toggle solo or mute for all selected tracks from channel 1 on the surface. Meanwhile, regular solo and mute functions still work per-channel.

This lets you quickly solo or mute the entire zone while retaining the ability to solo or mute individual channels as normal.

Zone SelectedTracks

    Solo|                    TrackSolo
    Shift+Solo1              Reaper 7                           // Toggle solo for selected tracks
    Option+Solo|             ClearAllSolo

    Mute|                    TrackMute
    Shift+Mute1              Reaper 6                           // Toggle mute for selected tracks
    Option+Mute|             Reaper 40339 Feedback=No           // Unmute all tracks