The name stands for native midi programing wing for etc eos family products using behringer x-touch mini
It is a proof of concept for direct hook up (native) of a generic midi device to a etc eos family software device, either a desk or a computer. So it can be used as a low budget programing wing.
There has been a lack of customizability within the eos software (at least up to version 3.2.9.16) of how to handle an transform MIDI input. And the native support within the software is limited to (mostly) direct mapping of MIDI parameters to macros and some other parameters.
So far, there have been some solutions using a middle man like https://www.luminosus.org/ or using multiple middle men to first convert MIDI to OSC (https://andyland.info/wordpress/osc-to-midi-midi-to-osc-midi-over-network/, https://hexler.net/touchosc/manual/connections-bridge) and then translate OSC to /eos OSC commands (https://github.com/ETCLabs/OSCRouter/).
This requires a LAN and additional hardware, depending on setup more space near the desk for a laptop, cables and setup time. The quite useful luminosus has sadly also reach end of updates and in some cases, i had trouble using it caused by crashes or UI glitches.
After trying alternatives solutions (hacky stuff) and writing my own code, i stumbled upon a solution, which requires a ton of macros and show control events, but would remove additional software and hardware.
Here, i will just present a possible solution (educate me on better solutions) for that issue. I have used Behringer X-Touch Mini with planned seamless compatibility for Behringer X-Touch Compact (some things only make sense with that in mind). But it should work with any(?) MIDI device while following the principles.
Anything that is pressed (Encoderknob, Button, Fader Touch) should send MIDI Data when pressed or touched, and different or no data when released
Every possible event / MIDI Data (pressed/released for each) will be mapped to a seperate control event & macro in eos
Example Behringer X-Touch Mini:
Button, Encoderknob pressed: <channel> NoteOn <noteid> <velocity:127>
Button, Encoderknob released: <channel> NoteOff <noteid> <velocity:0>
Anything that is turned or moved (Fader slides, Encoder turns) should send MIDI Data when turned or moved.
When mapping to eos encoder, we need the relative change compared to last MIDI Data (Relative1 will send 127 or lower for decrease, 1 or bigger for increase depending on turn speed).
When mapping to an eos fader, we just need the position in a range between 0 and 127).
Every possible event / MIDI Data will be mapped to a seperate show control event & macro in eos
Example Behringer X-Touch Mini:
Relative1 Encoderknob turned (increasing): <channel> <ControlChange> <Relative1>
Relative1 Encoderknob turned (decreasing): <channel> <ControlChange> <127-(Relative1-1)>
Slider or Absolute Encoderknob moved: <channel> <ControlChange> <AbsoluteValue>
A ton of macros is needed. To create and edit, i have used USITT ASCII Import/Export, which is a plain text file that can be edited with any text editor. Either modes ("As Library Fixtures","As Custom Fixtures") are fine.
NMPW_Behringer_X_Touch_Mini_Macros_Eventlists_v1.asc
https://drive.google.com/file/d/1N0nrGLSnbFXCFhY2MHRwu9PImbcLQNk0/view?usp=sharing
Content: Macros 40000 thru 49999, Eventlists 40 thru 44, Magicsheet 40
Terrible image of Macro Magicsheet 40
https://drive.google.com/file/d/1N5cnBkcAeYSDddn9BOlHSzO3vBLPHKtP/view?usp=sharing
Image of Behringer X-Touch Mini MIDI mapping
https://drive.google.com/file/d/1N2DXX9bQQuY-gpc5zcK3QKxtr1IUf-Do/view?usp=sharing
Custom Config A X-Touch_Mini_ETC_LayerA_V1.bin for Behringer X-Touch Mini
https://drive.google.com/file/d/1My--TUXSO08KtXkSL0T7Vrr08hNaMyYH/view?usp=sharing
Custom Config B X-Touch_Mini_ETC_LayerB_V1.bin for Behringer X-Touch Mini
https://drive.google.com/file/d/1Myv8GRW4bG27U420m0yPYxzcLAlOzGHV/view?usp=sharing
OSC TX Port must target OSC RX Port, OSC UDP TX IP Address must be the device itself
When importing please always use Merge Data and only select to merge what you need.
Always save showfile before merge or import, macro 49998 can be used to delete relevant data before importing.
Delete old data before importing, it cant overwrite when trying to merge.
Buttons are Notes (NoteId starts at 0), mapped 1:1 to macros with offset 40000 for down; 40100 for up
Every button needs two events and minimum two macros (or button up can be ignored)
Buttons can be simple (Encoderknob pushed will put Pan into the command line)
Buttons can be complex
Macro 40132 -> when button is released
Other two macros implement a toggle logic that copy each other onto macro 40132 every time the macro is called
Macro 41032 explained:
Send_string /echo/eos/wheel=1
Changes wheelticks to fine mode (like shift&encoder on a desk), this must be sent via OSC, luckily we have looped our OSC TX back to OSC RX and the desk accepts the command
Macro 42032 Copy_To 40132
Replace the Macro for the next Button press
Send_MIDI_Raw 91 08 02 02
Broadcasts to all TX MIDI Devices: <NoteOn:9|Channel2:1> <NoteId:08> <Velocity:02>
My X-Touch Mini listens on MIDI Channel 2, and will put the 9th Button <NoteId:08> to a blinking state <Velocity:02>
Encoders are ControlChange (starts at CC10), mapped in groups of 10 with offset 45000 to macros for all increasing and decreasing data
I leave CC01 thru CC09 empty for faders
Increasing (depending on speed) sends
Data 01 and increasing, so we have to map every possible MIDI Data, but i gave up at +5 and -5, so we have for one encoder all these events:
CC10 01 -> Macro 45001 increase by 1 tick
CC10 02 -> Macro 45002 increase by 2 ticks
CC10 03 -> Macro 45003 increase by 3 ticks
CC10 04 -> Macro 45004 increase by 4 ticks
CC10 05 -> Macro 45005 increase by 5 ticks
-------------------------------------------
CC10 123 -> Macro 45006 decrease by 5 ticks
CC10 124 -> Macro 45007 decrease by 4 ticks
CC10 125 -> Macro 45008 decrease by 3 ticks
CC10 126 -> Macro 45009 decrease by 2 ticks
CC10 127 -> Macro 45010 decrease by 1 tick
I decided to use encoder wheel ticks instead of using relative data macros (i think this will fuck with command history and might throw errors when used in the wrong moment)
For every encoder there are a group of these macros
It seems necessary to chose a definitive parameter to put on the encoder. this sadly removes the ability to have encoders for any possible wheel/parameter, but there is no way to have the same mapping as in the eos encodermodule, because that info is not shared via OSC.
So i chose these parameters for Layer A:
Pan, Tilt, Edge, Zoom, Diffusion, Hue, Saturation, Frame Assembly
and Layer B
Shutter Thrust and Angle pairs.
It would be possible to create a Copy To logic to switch between different mappings to create different banks for Focus&Form / Color / Image&Shutter.
But it seems necessary to have the parameters hardcoded.
Faders are ControlChange (CC09) and they dont require macros but 128 events each
The only fader on X-Touch Mini is mapped to CC09.
Personally, it made more sense to me to think of the wing as a left-hand-device and with that in mind, i chose the single fader to be right-aligned of a fader page, because there wont be fader pages i just map it to Sub 10. For every possible value of the fader we need an event, because eos wont listen to any Data on CC09. It requires the specific Data to be catched by the Event. Luckily, when asigned to Action Sub X Fader, it interprets the 7bit Data and scales it properly from 0% to 100%.
Fader Buttons would be covered by the Button logic from before.
Motorized Fader Feedback doesnt seem impossible without external software. So i would not recommend implementing a fader page logic. The faders dont work the same as on a eos fader wing
Things could be automated pretty well, simply deliver configuration instructions to a script and the script spits out an .asc file ready for import. It could become a future project if there is demand.
The hope is still there for ETC to create better support for MIDI mapping within eos.