Jump to content

Recommended Posts

Posted

So it's possible to press the button, twiddle a knob on your synth, and have it automap to _one_ encoder? (I think I'm in love if this is true)

So you'd need n buttons, where n is the number of encoders you want to program this way ?

Wouldn't it be easier to make the button go into "automap to next "twiddled" knob mode"?

Or am I completely mistaken ? =/

This is called "MIDI Learn" mode in the MIDIbox NG Spec

I haven't elaborated what it exactly means, since older MIDIbox users already know this feature from the PIC based MIDIboxes :)

But: in distance to MIDIbox64, MIDI learn will also work for NRPN and SysEx events! :)

This might sound a bit strange but would it be possible to also include the following scenario:

Instead of handling a set of real, physical encoders and buttons connected to the DIN port, LED rings connected to the DOUT port, and a real LCD connected to the Core board - would it be possible to replace these by virtual devices that are connected to a MIDI in/out port? So, on top of the "MIDI output config file" that we have now, also include the possibility of a "MIDI input config file" in which we define what MIDI message mimics the left- and right-turn of an encoder or the push/release of a button?

In such a scenario, the MB NG would act as an interpreter. It would allow to use MIDIbox .ngc files with third party controllers like the Mackie/Logic range of controllers (specifically the C4) or the Behringer ones, and with a relatively low cost - only the core board would be required to give new life to those.

Actually "EVENT_xxx" already handles "virtual" controllers, which are mapped to hardware separately.

Currently you can't see this in my configuration file (aside from the encoder and LED matrix definitions) since I haven't completed the implementation of this part yet, and instead hard-defined HW assignments to get a starting point for development of the event handling.

However, your usecase will be configured on a slightly different way which I will demonstrate later today (once the EVENT_SENDER and "output" parameter has been added) :)

In general I totally agree with you, that MBNG could also be used as a "bridge" between stupid HW controllers and other devices.

It could also be used as an "intelligent USB-MIDI interface" with MBHP_CORE_LPC17 only - oh man, there are so many usecases ;)

Best Regards, Thorsten.

Posted

So, this shows how it will work.

Let's start from the beginning - how events can be chained.

So, let's assume we've a button which sends/receives a NoteOn:


EVENT_BUTTON id= 1 type=NoteOn chn=1 key=36 range= 0:127 ports=1000100000001000 lcd_pos=1:1:1 label="Button%3i: %e"
[/code] and you want to link it to a LED function. Means: the LED should turn on/off when you are pressing/depressing the button. And it should turn on/off when the button receives a Note On event (which is sometimes necessary as well.. e.g. if it is in toggle mode) Then just forward the event to another event - here LED:1
[code]
EVENT_BUTTON id= 1 fwd_id=LED:1 type=NoteOn chn=1 key=36 range= 0:127 ports=1000100000001000 lcd_pos=1:1:1 label="Button%3i: %e"
If the event doesn't exist (because you want to avoid unnecessary writing effort), we assume that it will have the same parameters like the button. Same can be done with a rotary encoder to link it with a LEDring:

EVENT_ENC id= 1 fwd_id=LED_MATRIX:1 type=CC chn=1 cc=16 range= 0:127 ports=1000100000001000 lcd_pos=1:1:1 label="Enc%3i: %e"
[/code] This works with any event - also with a generic receiver and sender. So, you could write:
[code]
# Here we combine a generic receiver and sender to convert CC#16 to a SysEx stream
EVENT_RECEIVER id= 1 fwd_id=SENDER:1 type=CC chn=1 cc=16 range= 0:127 ports=1000100000001000 lcd_pos=1:1:1 label="Receiver%3i: %e"
EVENT_SENDER id= 1 type=SysEx stream="0xf0 0x3e 0x13 ^dev 0x20 0x00 0 77 ^val 0xf7" ports=1000100000001000 lcd_pos=1:1:2 label="Sender%3i: %e"
oh... and of course:

# The same vice versa (SysEx -> CC)
EVENT_RECEIVER id= 2 fwd_id=SENDER:2 type=SysEx stream="0xf0 0x3e 0x13 ^dev 0x20 0x00 0 77 ^val 0xf7" \
range= 0:127 ports=1000100000001000 lcd_pos=1:1:1 label="Receiver%3i: %e"
EVENT_SENDER id= 2 type=CC chn=1 cc=16 ports=1000100000001000 lcd_pos=1:1:2 label="Sender%3i: %e"
[/code] It's even possible to chain events:
[code]
# A chain of events... max. 4 events can be chained (to avoid feedback loops or too deep recursions)
# note: in future we could also provide range scaling here, e.g.
# range 0:127 -> range 20:30 or even range 0:127 -> range 127:0 (inversion)
EVENT_RECEIVER id= 3 fwd_id=SENDER:3 type=CC chn=1 cc=17 range= 0:127 ports=1000100000001000 lcd_pos=1:1:1 label="Receiver%3i: %e"
EVENT_SENDER id= 3 fwd_id=SENDER:4 type=CC chn=1 cc=18 range= 0:127 ports=1000100000001000 lcd_pos=1:1:2 label="Sender%3i: %e"
EVENT_SENDER id= 4 fwd_id=SENDER:5 type=CC chn=1 cc=19 range= 0:127 ports=1000100000001000 lcd_pos=1:1:2 label="Sender%3i: %e"
EVENT_SENDER id= 5 type=CC chn=1 cc=20 range= 0:127 ports=1000100000001000 lcd_pos=1:1:2 label="Sender%3i: %e"
Now to your usecase:

# An external MIDI controller, sending to CC32 should control an ENC entry
EVENT_RECEIVER id= 6 fwd_id=ENC:6 type=CC chn=1 cc=32 range= 0:127 ports=1000100000001000

# the ENC entry forwards the new value to a SENDER
EVENT_ENC id= 6 fwd_id=SENDER:6 type=SysEx stream="0xf0 0x3e 0x13 ^dev 0x20 0x00 0 1 ^val 0xf7" syxdump_pos=1:1 \
range= 16:112 offset= 0 ports=1000100000001000 lcd_pos=1:1:2 label="OSC1 Octave ^octave %03d"

# the sender sends back the new ENC value to the external controller
# or: if the ENC is moved, the it will get the new value
EVENT_SENDER id= 6 type=CC chn=1 cc=32 range= 0:127 ports=1000100000001000
[/code]

In order to combine this with the group handling (which I will explain further once it's completely implemented), it will also be possible for a SENDER to send to the first ENC of a group.

E.g. let's say, we've grouped 16 (hardware) encoders, so that their assignments can be switched between the ENC id=1...16, ENC id=17..32, ENC id=33.48, etc.. items

Then it will also be possible for a SENDER to send to the current "first ENC" (so: id=1, 17, 33, ...) of the current selected encoder group.

-> this should completely cover your proposal :)

Best Regards, Thorsten.

Posted

So - finally a first public beta version is available! :)

->

More documentation will be available this evening, but I guess that our experts will already be able to start with the first experiments. ;)

This thread is locked now, please continue discussions in the new forum article.

Best Regards, Thorsten.

Guest
This topic is now closed to further replies.
×
×
  • Create New...