Trying to make a basic midi controllable channel strip (and it's way harder than I thought)

So here’s the plan. I’d like to have a simple set of effects on all tracks : Compressor, Eq, filters, saturation. A basic channel strip to quickly craft a rough mix.

I have an EC4 controller and I’d like to have all 16 knobs set up to control these basic effects… but I’ve kept running into problems… and so far this seems impossible.

I’ve tried making a simple duplex script BUT:

  • you can’t assign a device to more than one DSP
  • the doofers are only 8 parameters… so nope
  • I’ve tried forcing a group of parameters to a given effect… doesn’t seem possible
  • I’ve tried mapping the same CC to control parameters and device selector in hope to force the selection of the first device
  • I’ve tried using kb shortcut to select corresponding device… but they only work when DSP is focused… so too much shortcuts

So yeah… It seems impossible or really tedious at first glance… any idea ?

Can’t you save a template song with all the needed fx for the channel strip, press ctrl plus m in renoise and press a parameter slider with the mouse, then twist a knob on your controller so its mapped? Rinse and repeat for all the fx parameters you wan to map and save song as template.

1 Like

No for several reasons : it’s super tedious to make (both on the hardware and software side) and you don’t have any flexibility (can’t add a track without remapping it all) or midi feedback (resulting in parameter jump)

the thing is Duplex is perfect but this is some edge case that could theoretically be solved either by creating an unlimited (or say, 32 parameters) doofer and by allowing to map a group of midi CC to a named device (or a given index). Or by using a trick I haven’t found yet.

I think it is possible to create a window bridge tool. The approach would be as follows (for track device controls):

  1. Create a window tool with multiple controls with variable names, all of them mappable midi, with a global vision to control most devices.
  2. Create an option to be able to change the device name. Create another option to change the device number.

The tool will detect the device name and number based on the set values.
The tool will automatically assign the proper routing for each variable of the selected device, also changing the name in the window controls as needed.

The user will only map a single tool once. You will only need to change 3 variables to redirect the routing:

  1. Track,
  2. Device name
  3. and number (position)

I remember this matter was discussed in another thread in the past. Nobody found a way to build it, but my approach could be very successful.

It is not easy to program, but I think it is possible. Involves constantly checking various states and ranges of values to avoid errors. But I think it would be a powerful tool. And if it is possible with track devices, it will also be possible for other devices, I suppose. It is necessary to study the API documentation well before starting.

Name of devices available

rprint(renoise.song().selected_track.available_devices) →

[1] => Audio/Effects/VST/???

[17] => Audio/Effects/VST/???

[18] => Audio/Effects/Native/Delay
[19] => Audio/Effects/Native/Multitap
[20] => Audio/Effects/Native/mpReverb 2
[21] => Audio/Effects/Native/Reverb
[22] => Audio/Effects/Native/Convolver
[23] => Audio/Effects/Native/Bus Compressor
[24] => Audio/Effects/Native/Compressor
[25] => Audio/Effects/Native/Gate 2
[26] => Audio/Effects/Native/Maximizer
[27] => Audio/Effects/Native/Analog Filter
[28] => Audio/Effects/Native/Digital Filter
[29] => Audio/Effects/Native/Comb Filter 2
[30] => Audio/Effects/Native/EQ 5
[31] => Audio/Effects/Native/EQ 10
[32] => Audio/Effects/Native/Mixer EQ
[33] => Audio/Effects/Native/Chorus 2
[34] => Audio/Effects/Native/Flanger 2
[35] => Audio/Effects/Native/Phaser 2
[36] => Audio/Effects/Native/RingMod 2
[37] => Audio/Effects/Native/LofiMat 2
[38] => Audio/Effects/Native/Distortion 2
[39] => Audio/Effects/Native/Cabinet Simulator
[40] => Audio/Effects/Native/Exciter
[41] => Audio/Effects/Native/Stereo Expander
[42] => Audio/Effects/Native/DC Offset
[43] => Audio/Effects/Native/Gainer
[44] => Audio/Effects/Native/Repeater
[45] => Audio/Effects/Native/Doofer
[46] => Audio/Effects/Native/#Line Input
[47] => Audio/Effects/Native/#ReWire Input
[48] => Audio/Effects/Native/#Send
[49] => Audio/Effects/Native/#Multiband Send
[50] => Audio/Effects/Native/*Instr. Macros
[51] => Audio/Effects/Native/*Instr. Automation
[52] => Audio/Effects/Native/*Instr. MIDI Control
[53] => Audio/Effects/Native/*Hydra
[54] => Audio/Effects/Native/*Meta Mixer
[55] => Audio/Effects/Native/*Formula
[56] => Audio/Effects/Native/*XY Pad
[57] => Audio/Effects/Native/*LFO
[58] => Audio/Effects/Native/*Key Tracker
[59] => Audio/Effects/Native/*Velocity Tracker
[60] => Audio/Effects/Native/*Signal Follower

Detect the range and names of devides of the selected track and select it

–minimum number of devices of selected track
1
–maximum number of devices of selected track
#renoise.song().selected_track.devices

–fixed name of first device
renoise.song().selected_track:device(1).name → TrackVolPan
–fixed name of second device if exist (if it is the “Analog Filter”)
renoise.song().selected_track:device(2).name → Analog Filter
etc…
–select a device if exist (if it is the “Analog Filter”)
renoise.song().selected_track_device_index=2

Parameters of first track device:

#renoise.song().selected_track:device(1).parameters → 5
renoise.song().selected_track:device(1):parameter(1).name → Panning
renoise.song().selected_track:device(1):parameter(2).name → Volume
renoise.song().selected_track:device(1):parameter(3).name → Width
renoise.song().selected_track:device(1):parameter(4).name → Post Panning
renoise.song().selected_track:device(1):parameter(5).name → Post Volume

Properties of the parameters to control the values:

oprint(renoise.song().selected_track:device(1):parameter(1)) →
class: DeviceParameter
properties:
is_automatable
is_automated
is_automated_observable
is_midi_mapped
is_midi_mapped_observable
name
polarity
show_in_mixer
show_in_mixer_observable
time_quantum
value
value_default
value_max
value_min
value_observable
value_quantum
value_string
value_string_observable
methods:
__STRICT
record_value

Change the “Volume” value of the device 1 (TrackVolPan):

renoise.song().selected_track:device(1):parameter(2).value=20

Notes:

  1. The global maximum number of parameters is 30 (EQ 10 or Repeater).
  2. Convolver looks like an unfinished device!: Impulse, Gain, Start, Length and Resample is not automatable but they are controllable.
  3. Each device is different, with different ranges.
  4. The range of non-infinite phisical faders or knobs is 0 to 127.
  5. The infinite spin knobs can play with +1 or -1 or +10 or -10 … to accelerate.

Do the same for all the parameters of all the devices to be tolerated. The value must always be within the valid range of the parameter. This is very tedious.

Then each object (knob, fader, button) needs to be routed through the MIDI input. Each object must be permanent. This way, you will only assign a full mapping once, and you can save it to a mapping file. And that’s it!

The advantage of this tool is that it would be possible to use any MIDI controller compatible with standard MIDI mapping, as long as it physically has enough controls (knobs, faders, buttons)

1 Like

Oh wow… the preview I recieved through the mail stopped at “nobody suceeded” but you actually sent tons of data. I’m gonna check that :smiley:

Really, the global maximum number of parameters is 90. Maybe I will build a global MIDI control tool with this approach. But the tool would be licensed, since it involves a lot of work. The main problem is in the control of all ranges.

The good news is that the window tool would not need to be in the foreground. Everything would be controlled from the physical MIDI controller, using the alphanumeric keyboard directly to control Renoise with his commands. It would be very practical and straightforward.