PDA

View Full Version : Most hassle-free way to make non-MPE plugins work like MPE?


kilna
10-22-2018, 09:57 PM
I love my Roli seaboards, and I also love the MPE instruments that are playable with them. However, I already have a lot of money invested in non-MPE plugins. In an ideal world, I'd be able to leverage these.

MPE allows you to pitch bend and adjust all sorts of CCs per each played note. It does this by changing the MIDI channel of each played note and having the associated control changes for a given note be locked to he channel that note was played on.

You can emulate MPE with non-MPE plugins... "all" you have to do is run a separate instance of the plugin responding to each MIDI channel. The rub... separate instances means separate FX parameters for each instance.

Ideally, I'd like a way to duplicate a plugin instance up to 16 times over, make each respond to a different input MIDI channel, and tie *all* parameters (perhaps via parameter modulation?) such that a change on the master is replictated to all instances. I know this will eat a lot of CPU and memory, I have a monster of a machine and these are typically light plugins, so I'm not concerned.

I'm a developer with a couple of decades of experience, but I've never developed for Reaper or in lua before. With enough patience I could probably write something to accomplish this goal, but I want to confirm something meeting some or all of my needs doesn't already exist.

mschnell
10-22-2018, 10:18 PM
Short answer: JSFXes can do this. Reascripts can't. So LUA etc is out of question, you need to do JSFX programming in EEL. No big deal if you are a software developer. We can work together on this.


Long answer:

I am intending to buy a Seaboard Rise 49, and so I am very interested in this discussion.

At firs I want to get my monophonic plugins e.g. (Kontakt based) Sample Modeling and (SWAM based) Audio Modeling run with the Seaboard. Does this already work for you without hassle ?

Then I'd like to use the Seaboard as a usual keyboard (as it is supposed to replace the "upper" masterkeyboard in my Live setup). Does this already work for you without hassle ?

Then I'll try to learn to play MPE instruments (e.g. the famous synth plugin that comes with the Seaboard). What did you find trying this ?

I found that Pianoteq in fact does handle MPE. I might want to try this, but it does not seem to make much sense for me. I don't know about Kontakt's ability to use MPE. Do you ?

Finally I'd like to create a setup with multiple monophonic instruments combined to an MPE instruments. I found that with the Seaboard you can set the count of channels used with MPE. Maybe this is enough for a recording type of work, but for Live, the count of available voices maybe needs to be dynamically managed. I suppose I rather easily can do a JSFX that distributes the messages to appropriate channels if necessary. What do you think ?

-Michael

kilna
10-23-2018, 12:25 AM
I'm working with Blocks rather than a Rise (I have 4 of the 24 key blocks controllers arranged into 2 48-key keyboards so I can have accompaniment)... my understanding is the Roli Dashboard app is basically the same between the two systems. It allows you to configure a given keyboard in one of the following modes (from the Roli website):

MPE
MPE Mode optimizes the Block with any other hardware or software that supports MPE. When MPE mode is selected, the global channel is set to 1. Global messages – like from a sustain pedal – are sent on the global channel, while note information is sent on channels with the range set by MIDI Start Channel and MIDI End Channel, by default 2–16.

Multi Channel Mode
In Multi Channel Mode, the Block transmits data over multiple channels of MIDI. This setting makes it compatible with non-MPE multi-timbral synths.

Piano Mode
In Piano Mode the Block will behave like a conventional MIDI keyboard by turning off the Glide, Slide, Press, and Lift dimensions of touch. The Block transmits all MIDI data on a single MIDI channel only, making it compatible with mono-timbral synths.

Single Channel Mode
In Single Channel Mode the Block transmits all MIDI data on a single MIDI channel only. This makes it compatible with mono-timbral synths. Pitch bend, channel pressure, or Slide (MIDI CC 74) messages will apply to all notes equally.

So, in short, depending on your settings in Roli Dashboard it should support any of the configurations you described. You'll have to open the Dashboard and change the mode setting if you want to switch between them.

With regard to using it as a primary keyboard, I have rapidly adopted it as my go-to because of how expressive it is... there really isn't anything like it. However, I still prefer a regular hard keyboard for instruments that you don't expect to pitch bend, like a piano. The weight of real non-squishy keys gives a different kind of physical feedback... if you're like me you'll switch between the Roli or a traditional keyboard depending on what instrument you're playing.

With regard to my experience with MPE instruments... I own Equator, Strobe 2, Auras and the free Cypher2 player... I've fallen in love with doing slides, glides and pressure changes so much that I want every synth VST I own to be able to do the same thing (hence this post). It really has changed my entire approach to music creation, no more endless envelope tweaking... I can now do what used to take an hour of screwdriver tweaks and get the same expression in realtime.

With regard to managing the number of voices, you can configure in the Roli Dashboard how many MIDI channels to use in MPE and Multi Channel modes, so if you know you're never going to use more than 10 fingers at once (probably a reasonable assumption) you can trim that value back.

preferred.nomenclature
10-23-2018, 05:08 AM
Ideally, I'd like a way to duplicate a plugin instance up to 16 times over, make each respond to a different input MIDI channel, and tie *all* parameters (perhaps via parameter modulation?) such that a change on the master is replictated to all instances.

That would be amazing. It doesn’t exist as far as I know. I think I’ve seen seen scripts that do pieces of what you describe, will try to find and point you to them.

mschnell
10-23-2018, 06:34 AM
To begin with, did you try to limit MPE to 2 channels (2+3) and use two monophonic VSTs each on one of the channels ?

I do know that AudioModeling is closely affiliated with Roli and hence their SWAM instruments (I do have some of those) should be easily supported.

-Michael

kilna
10-23-2018, 09:57 AM
There are 2 approaches you can take, I've only done one of them so far.

The first, which I have done, is to create a separate track for each note-specific VST instance, and set the track's MIDI-in to just one of the MIDI input channels. I made the same number of these to match the number of MIDI channels the Roli was configured to output on. This worked when manually configured.

The second method, which I have not done yet because I only just concocted it, is to create a single track with a large number of outputs... and set the "MIDI input" in the IO section of the plugin connector for that specific FX instance to "MIDI Bus 1" (which I assume limits to MIDI channel 1 since there are 16 busses listed)... and then route audio output channels 1+2 of the VST as appropriate (in the case of the second instance, channels 3+4, in the case of the 3rd 5+6, etc). Ideally this would be the approach; I don't want to have a ton of separate tracks if I can avoid it, and from what I was reading it seems that parameter modulation works natively only within a track. Hopefully the multiple output channels can be mixed down to stereo within the FX chain.

mschnell
10-23-2018, 01:24 PM
You don't need multiple tracks at all.

You can place all necessary instances of the plugin in a single FX track's "chain" and to the appropriate routing within this track:

Audio: "Pin-Routing" (using the [2 in 2 out] (or similar) button and assign each plugin to two (of the 64 possible) channels, e.g. 1+2, 3+4, 5+6, .... At the end you can place some pluging (e.g. ReaEQ) and sum the appropriate channels at the two inputs of same.

Midi: most plugins just pass through the midi stream. If it does not, there are options to froward the stream to the next plugin.

Now you can simply set each plugin to receive a dedicated Midi channel.

-Michael

kilna
10-23-2018, 01:36 PM
I believe we're saying the same thing in different ways... pin routing is colloquially the "plugin connector" I referred to, as it's described in the UI/docs. One thing you might not have caught though is that in the upper right of the pin routing pop-up for a given FX entry, there is an "IO" button... it's a menu to set various audio and MIDI I/O aside from the audio pin grid. There, you can set the MIDI input to a given "bus"... I assume these busses are channels, since there are 16. So (if my assumption is correct) the setting of the MIDI channel doesn't have to be within the VST itself if the VST responds on all MIDI channels.

mschnell
10-23-2018, 02:10 PM
No the Midi buses are not the Midi channels.

By the buses Reaper internally blows up the 16 Midi channels to 256 (16 Buses with 16 channels each). At all menus where you can route Midi, you can select a bus as target and/or source. Additionally in the dedicated routing menus you can select if the channel is to stay the same or if it is to be filtered and/or modified.

-Michael

ChristopherT
10-23-2018, 02:18 PM
I too am contemplating getting a seaboard - so very interested in Reaper responding to some of the MPE info.

I really hope to play some of my Kontakt orchestral libraries with a seaboard (especially cello, viola and violin)

I'm still a little hesitant to purchase and jump in, not knowing if I can successfully interact with Kontakt instruments via Reaper.

Watching this topic :)

ashcat_lt
10-23-2018, 04:46 PM
There's no good easy way to automaticly link ALL of the parameters between two plugins at the once, let alone across more than two. You would have to do it manually one by one by one. That'll be tedious, but IS doable, and once you've got it, you can save the FX Chain or a Track Template and recall it whenever you want.

kilna
10-23-2018, 05:15 PM
There's no good easy way to automaticly link ALL of the parameters between two plugins at the once, let alone across more than two. You would have to do it manually one by one by one. That'll be tedious, but IS doable, and once you've got it, you can save the FX Chain or a Track Template and recall it whenever you want.

Yeah, there's really no way to do this without some custom coding... though from the sounds of it, this may be useful to more than just me.

I really hope to play some of my Kontakt orchestral libraries with a seaboard (especially cello, viola and violin)

Yes, my thoughts exactly! I've heard there are string libraries out there that are already MPE compatible, but I'm loathe to spend more money, especially if I can get what might be a pretty comparable result by exploding out a few instances of existing VSTs I have... NI's string stuff is already pretty damned good, I just need to get the expressiveness of the Roli into them without having to do endless manual plumbing each time.

No the Midi buses are not the Midi channels.

Dang it. So does that mean there's no way of limiting the MIDI channel a given FX instance is sent, since as best as I can tell there's only one MIDI input to the FX chain, which has all the channels? Ideally each FX instance in the chain would get just one MIDI channel, and preferably have that channel remapped to channel 1. Not quite sure how to go about handling the MIDI plumbing if trying to use a single track with multiple discretely routed stereo pairs for each per-note FX instance.

mschnell
10-23-2018, 10:20 PM
the setting of the MIDI channel doesn't have to be within the VST itself if the VST responds on all MIDI channels.
Of course if using a VST per voice same would need to be set not to respond to all Midi channels (unless the midi stream is filtered by other means before).

-Michael

mschnell
10-23-2018, 10:25 PM
Yeah, there's really no way to do this without some custom coding... though from the sounds of it, this may be useful to more than just me.
Should be doable for plugins that present their parameters in "decent" DAW automation variables (e.g. SWAM instruments do so), but with Kontakt libraries the DAW parameters are completely cryptic and not automatable (unless you dedicatedly define some for that purpose).

-Michael

mschnell
10-23-2018, 10:31 PM
So does that mean there's no way of limiting the MIDI channel a given FX instance is sent
Of course there is. As mentioned in my first post in this thread, JSFX plugins are a perfect means to do "Midi filters", modifying the Midi stream in any possible way. Here you can e.g remove all but a dedicated channel.

But I suppose the more obvious way is to (e.g.) add the global channel to all other channels and/or merge voice-channels in the MPE stream and set the plugin instances to use only a dedicated channel each.

I seem to remember that a JSFX also can be done in a way that it sends out Midi messages to dedicated Midi buses. But I did not try to use this feature, yet.

-Michael

kilna
10-23-2018, 10:37 PM
For a working example, I created a Reaper project with ReaSynth on 4 tracks, routing 4 different source MIDI channels to each. I couldn't figure out a way to get it to work on a single track with multiple outputs due to the inability to limit a given VST to a specific MIDI channel input.

You can download the project here:

https://drive.google.com/file/d/1-6j3g8jByJdMsLGcyFglzzYM_A8dvgeX/

Obviously this does not have the parameter modulation/syncing addressed.

Maybe all of this would be better served by a VST wrapper rather than trying to have Reaper do everything.

mschnell
10-23-2018, 10:41 PM
Only if that "VST wrapper" does exactly what you require.

In fact I started to use Reaper as the "VST wappers" I tested (e.g. Forte) were not able to accomplish my requirements, but Reaper could do this by JSFX scripts.

-Michael

mschnell
10-23-2018, 10:44 PM
ReaSynth on 4 tracks, routing 4 different source MIDI channels to each
Seems rather chaotic to me.

For four voices with a monophonic synth attached to each I would limit the Seaboard to 4 MPE channels (2,3,4,5) and just set each synth to a single channel.

"Global" (channel 1) messages of course still to be handled if/as appropriate.

-Michael

kilna
10-23-2018, 10:51 PM
Of course there is. As mentioned in my first post in this thread, JSFX plugins are a perfect means to do "Midi filters", modifying the Midi stream in any possible way. Here you can e.g remove all but a dedicated channel.

Sure you can filter MIDI. But there's no way to filter MIDI per FX on a chain of FX, since each FX item in an FX chain inherits the MIDI output of the prior... I would not be able to have the stack of per-channel FX in a single track with multiple-stereo-pairs for the output of the track. The FX would have to be in separate tracks, increasing clutter and making parameter modulation more difficult.

kilna
10-23-2018, 10:58 PM
Seems rather chaotic to me.

For four voices with a monophonic synth attached to each I would limit the Seaboard to 4 MPE channels (2,3,4,5) and just set each synth to a single channel.

"Global" (channel 1) messages of course still to be handled if/as appropriate.

-Michael

Technically speaking what I've implemented here is Mulit-Channel using Roli's nomenclature, rather than MPE... so I can use channel 1 and not care in this specific case. I don't think we'll get true MPE using this method anyway unless we start routing global CCs to channel 1 and everything else to other channels.

I only did 4 channels 'cause I didn't want to spend all night on a proof-of-concept, and I routed all 16 input channels into those 4 just to see if I could. You could just as easily set the Roli Dashboard to only do 4 channels of output in Multi-Channel mode and skip all of the routing past channel 4.

kilna
10-23-2018, 11:12 PM
I don't think we'll get true MPE using this method anyway

...and by this, I mean that a stack of per-channel non-MPE FX is not going to "know" what a global CC "means", there's no singular place to route globals... it has to either be routed to every target FX or no target.

mschnell
10-24-2018, 06:51 AM
But there's no way to filter MIDI per FX on a chain of FX,

Of course there is.

The simple way (as suggested by the Midi specs) is to just set the VSTis each to a single dedicated input channel.

Reaper extends this to using Midi buses.

Later this day I will test this, and do a JSFX that outputs Midi messages on multiple buses. I'll upload it here for you to try.

Now you can set the source Midi bus individually for each VSTi in the FX chain and each will get what the JSFX decides on multiple channels, if appropriate.

-Michael

mschnell
10-24-2018, 06:57 AM
I don't think we'll get true MPE using this method anyway unless we start routing global CCs to channel 1 and everything else to other channels.
I understand that this is exactly what the ROLI does: channel 1 = global, channels 1..n used for voices, n user definable between 2 and 16.

Now a JSFX (or other Reaper functionality) could merge channel 1 to all other channels by sending the channel 1 messages multiple times with different channels (and/or use Midi buses in a similar way).

-Michael

mschnell
10-24-2018, 07:04 AM
...and by this, I mean that a stack of per-channel non-MPE FX is not going to "know" what a global CC "means", there's no singular place to route globals... it has to either be routed to every target FX or no target.
If you want to use a monophonic VSTi (or a multitimbral VSTI with monophonic voices), there is no difference between "global" and "dedicated to a voice", as there is only one voice (or multiple completely independent voices).

Regarding a VSTi that can create multiple inter-depending voices, same would need to speak MPE, or need dedicatedly crafted preprocessing for it's special needs.

IMHO, creating dedicatedly crafted preprocessing for any kind of VSTi makes sense, anyway, as e.g. most VST's can't adhere to note-off velocity ("lift"), but for e.g. a Trumpet, Sax or Flute voice it would be appropriate to e.g. do a "fall" triggered by fast lift. With the instruments I use, fall and similar endings are triggered by dedicated articulations like Multi-Key gestures that don't seem appropriate with a ROLI.

Anyway, appropriate routing is easily doable.

-Michael

mschnell
10-24-2018, 08:56 AM
Later this day ...
here you are:

desc:MidiBus Test

slider1:0<0,2,1{all,filter bus,convert channel to bus}>mode
slider2:1<1,16,1>in bus
slider3:1<1,16,1>out bus
slider4:0<0,1,1{off,on}>send channel 1 to buses 2..16

@init
ext_midi_bus = 1;

@slider


@block
while (midirecv(offset, msg1, msg2, msg3)) (
bus = midi_bus;
channel = msg1 & 0x0f;
(slider1 != 1)|| (bus == (slider2-1)) ? (
slider1 == 2 ? (
midi_bus = channel;
) : (
midi_bus = slider3-1;
);
midisend(offset, msg1, msg2, msg3);
_midicount += 1;
);
slider4 && (channel == 0) ? (
i = 1;
loop (15,
midi_bus = i;
midisend(offset, msg1, msg2, msg3);
_midicount += 1;
i += 1;
);
);
);


-Michael

kilna
10-24-2018, 12:12 PM
The simple way (as suggested by the Midi specs) is to just set the VSTis each to a single dedicated input channel.


The problem of course is that each FX will do that in its own way, and it's a manual step that is repeated for each FX instance, which is why you suggested:

Later this day I will test this, and do a JSFX that outputs Midi messages on multiple buses. I'll upload it here for you to try.

So buses are specific to a given track? By their name I was left with the impression that buses are shared for the whole project, but if they're discrete per track then we can route incoming MIDI on channel 2 -> Bus 2 channel 1. MIDI input for a track is on Bus 1 right, so we can just leave Bus 1 Channel 1 as-is and anything that needs to pay attention to global can listen to that. Is this how your JSFX below is constructed?

Thoughts / Questions:


The output MIDI channel on the target buses should be configurable and default to 1 (route incoming MIDI on channel 2 -> Bus 2 channel 1)
Amount of polyphony should be configurable, in addition to which MIDI channel to start at
Since it seems to work OK in my demo above, channels beyond the polyphony amount should loop back to the first channel, so if we start at channel 2 as per MPE default for the first note-channel, and have 4 note poly set, then channel 6 should map to bus 2, channel 7 to bus 3, etc. This is similar to the same behavior as the MPE spec for any polyphony amount greater than 15, a channel with a note already playing will be re-used.
How will we bulk add the FX into the chain with the appropriate bus inputs set? Seems like a simple duplicate of an existing FX item in the chain and subsequent modification of the input bus for each would be the way to go, so the "MPE Explode" functionality would be a context-menu action for an existing FX item. The setup process would be add the VSTi item into the FX chain, optionally configure it, right-click the FX item, select "MPE Explode", you are prompted for the amount of polyphony and start MIDI channel, and then the appropriate FX and routing are added into the FX chain at that spot.
How will we go about parameter modulation in bulk for all params in the group of the identical newly created FX items?
How do we mix the multichannel audio output down to stereo...? I've not worked with multichannel tracks in Reaper, are they mixed down to stereo for "free", i.e., with no additional work needed on my part?


I want to help... pointers on where to get started coding for any of the above would be helpful.

I won't be able to try out your JSFX until tonight, it's noon here now.

mschnell
10-24-2018, 03:10 PM
So buses are specific to a given track? By their name I was left with the impression that buses are shared for the whole project,
I initially had this impression as well (buses as a means of routing Midi behind the scenes). But I now seem to understand that the buses are just extensions of the Midi channel (from 16 to 256 of them)

Is this how your JSFX below is constructed?
I think yes. The plugin is a proof of concept for a within-FX-chain Midi router by means of Buses. I suppose the GUI is self explaining...

If you understand and verify the basic functionality of the plugin and find it's usable for that purpose, it of course can be enhanced with necessary or desirable features.

What do you mean by "parameter modulation". Right now we are just discussing parameters that can be modulated by Midi CCs. DAW-variable only parameters can be handled, but this will be a second step.

For mixing the audio you simply can combine the channels at the input pins of some plugin. But if you want to have more control there also are Mixer plugins (supposedly JSFXes).

"Bulk add" obviously is a task a Reascript could perform. But I am not very knowledgeable with this issue. There are several specialists for this in the JSFX/Reascript forum.

I use multiple tracks to hold the VSTs that are to be active for a certain patch, and use SWS "LiveConfigs" for switching between them, by muting/unmuting appropriate tracks.

-Michael

kilna
10-25-2018, 01:48 PM
OK, so I've used your code as a starting point and added the features related to routing that I described above:


desc:MIDI Channel to Bus
//tags: MIDI processing routing

in_pin:none
out_pin:none

slider1:1<0,15,1{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}>Start MIDI Channel / Bus
slider2:14<1,16,1{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}>Qty of Channels / Busses (MPE Polyphony)
slider3:1<0,1,1{Disabled,Enabled}>Map High Channels Wrapped Busses
slider4:0<0,16,1{Disabled,1,2,3,4,5,6,7,8,9,10,11,12,13,14,1 5,16}>Broadcast Channel (sent to every output bus)
slider5:0<0,16,1{Passthrough (mapping disabled),1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}>Map to MIDI Channel

@init

ext_midi_bus = 1;

@slider

start_channel = slider1;
end_channel = start_channel + slider2;
(end_channel > 15) ? (end_channel = 15;);
num_channels = (end_channel - start_channel + 1);
wrap = slider3;
broadcast = (slider4 > 0);
broadcast_channel = (slider4 - 1);
map = (slider5 > 0);
map_channel = (slider5 - 1);

@block
while (midirecv(offset, msg1, msg2, msg3)) (

input_bus = midi_bus;
input_channel = (msg1 & 0x0f);
message = (msg1 & 0xf0);
(broadcast && (input_channel == broadcast_channel)) ? (
bus = start_channel;
loop( num_channels,
output_channel = ( map ? map_channel : input_channel );
midi_bus = bus;
midisend(offset, (message + output_channel), msg2, msg3);
bus += 1;
);
) : (
((input_channel >= start_channel) && ((input_channel <= end_channel) || wrap)) ? (
output_bus = input_channel;
(input_channel > end_channel) ? (
output_bus = (((input_channel - start_channel) % num_channels) + start_channel);
);
midi_bus = output_bus;
output_channel = ( map ? map_channel : input_channel );
midisend(offset, (message + output_channel), msg2, msg3);
) : (
midisend(offset, msg1, msg2, msg3);
);
);
);


This does all of the things I want:


Configurable polyphony
Configurable start channel/bus
Ability to rewrite to a target channel (since many FX only respond on one channel)
Ability to map a larger number of incoming MIDI channels to a smaller number of busses (higher MIDI channels wrap back around to use lower bus numbers)... this allows me to run, say, only 4 VTSs while retaining as much polyphony as I want during recording the MPE MIDI stream.
Ability to optionally send one MIDI channel to all of the target busses (for MPE common-info on MIDI channel 1)


If you want full MPE compatibility, set:


Start Midi Channel -> 2
Qty of Channels / Busses -> 15
Map High Channel Wrapped Busses -> Either option
Broadcast Channel -> 1
Map to MIDI Channel -> Whatever your FX are configured to


...and you'll of course need 15 instances of whatever FX you want, configured each for busses 2 through 16

I've also updated my proof-of-concept Reaper file to use the new methodolgy:

https://drive.google.com/file/d/1VDRQ6xmgVwWxM9vO6hyvIlVpEzHMA7XS/view?usp=sharing

In this example I have 4 ReaSynth instances, each responding to busses 2-5... the MIDI Channel to Bus plugin configured for start channel 2, channel quantity 4, wrap enabled, broadcast to channel 1, and mapped to channel 1.

mschnell
10-25-2018, 03:23 PM
GREAT !!!

Do you think this as a ready v1.0 at this point of time ?
Do you want me to add an about section and upload it to be used by ReaPack ?
Or (better) do you want to do this yourself ?

Thanks,
-Michael

kilna
10-25-2018, 03:33 PM
What do you mean by "parameter modulation". Right now we are just discussing parameters that can be modulated by Midi CCs. DAW-variable only parameters can be handled, but this will be a second step.

Yes, it'd be something new in addition... So the idea I had is that I'm never going to want to change an FX parameter for only one instance of the duplicated FX, if I change it on one, I want the same value replicated across all of the other FX responding on different channels. Parameter modulation is a way for Reaper to take a change made on a parameter in one FX item in the chain and have that in turn change a parameter in a different FX in the same chain. What I'd want is to do this for all parameters. This way I only have to move an envelope in the first FX in the chain to alter the same value in all of the duplicated FX.

For mixing the audio you simply can combine the channels at the input pins of some plugin. But if you want to have more control there also are Mixer plugins (supposedly JSFXes).

I implemented this in my proof-of-concept above using ReaEQ at the end of the FX chain.

"Bulk add" obviously is a work a Reascript could perform. But I am not very knowledgeable with this issue. There are several specialists for this in the JSFX/Reascript forum.

This is what I am going to work on next. Ideally the script action will:


Prompt the user for amount of polyphony and start MIDI channel
Add the "MIDI Channel to Bus" JSFX configured as above, just before the selected FX instance
Duplicate the selected FX instance in the chain until the amount of polyphony is satisfied
Configure each of the cloned and original FX to point at an appropriate input MIDI Bus and output stereo pair
Set up parameter modulation on all params with the first FX instance as a master to each of the duplicated FX instances
Add ReaEQ (or another lighter FX) at the end of the FX chain to mix all of the instances down to a single stereo pair

kilna
10-25-2018, 03:39 PM
Do you think this as a ready v1.0 at this point of time ?


I think the "MIDI Channel to Bus" component is stable based on my tests.


Do you want me to add an about section and upload it to be used by ReaPack ?
Or (better) do you want to do this yourself ?


I think I want to learn about ReaPack, so I'll do it... The "MIDI Channel to Bus" JSFX is probably more generally useful than just for MPE so it should be its own distribution in ReaPack, and then the MPE Reascript action I described above would have a dependency on it.

mschnell
10-25-2018, 10:15 PM
Great !

There are two things to learn about feeding ReaPack:
1) creating meta information in the source code of the file(s)
2) using GitHub for uploading, version managing and "polling/pushing"

You should skim this thread -> https://forum.cockos.com/showthread.php?t=177978for more information

Re 1: I'll do an example for this JSFX later this day which you can modify place at the top of the code and then upload it to GitHub.

I am not sure about how the dependency to "the MPE Reascript action" could be managed by RaPack (other than mentioning that in the "about:" section). (Nor did I full understand the purpose of the MPE Reascript action.)

-Michael

mschnell
10-26-2018, 08:41 AM
Later this day:


desc: MIDI Channel to Bus
tags: MIDI processing routing
author: kilna & Michael Schnell (mschnell@bschnell.de)
version: 1.0
changelog: initial release
donation: United Nations Foundation http://www.unfoundation.org/
about:
## Description
A Midi stream received in a single Midi Bus containing messages with multiple channels is distributed do multiple Midi Buses.

## usage
“Start MIDI Channel / Bus” selects the first Midi channel that is to be routed to the set out output buses
“Qty of Channels / Busses (MPE Polyphony)” defines the number of different channels (starting frim the start channel) that are to be routed to the set out output buses. Other channels are passed through unchanged.
“Map High Channels Wrapped Busses” ???
“Broadcast Channel (sent to every output bus)” channel to be sent to all buses defined by the two first settings
“Map to MIDI Channel” if enabled, the channel of the messages that are routed to the buses defined by the two first settings is changed to the one defined here.


// NO WARRANTY IS GRANTED. THIS PLUG-IN IS PROVIDED ON AN "AS IS" BASIS, WITHOUT
// WARRANTY OF ANY KIND. NO LIABILITY IS GRANTED, INCLUDING, BUT NOT LIMITED TO,
// ANY DIRECT OR INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGE ARISING
// OUT OF THE USE OR INABILITY TO USE THIS PLUG-IN, COMPUTER FAILTURE OF
// MALFUNCTION INCLUDED. THE USE OF THE SOURCE CODE, EITHER PARTIALLY OR IN
// TOTAL, IS ONLY GRANTED, IF USED IN THE SENSE OF THE AUTHOR'S INTENTION, AND
// USED WITH ACKNOWLEDGEMENT OF THE AUTHOR. FURTHERMORE IS THIS PLUG-IN A THIRD
// PARTY CONTRIBUTION, EVEN IF INCLUDED IN REAPER(TM), COCKOS INCORPORATED OR
// ITS AFFILIATES HAVE NOTHING TO DO WITH IT. LAST BUT NOT LEAST, BY USING THIS
// PLUG-IN YOU RELINQUISH YOUR CLAIM TO SUE IT'S AUTHOR, AS WELL AS THE CLAIM TO
// ENTRUST SOMEBODY ELSE WITH DOING SO.

in_pin:none
out_pin:none
...


Please insert you signature and a description of "Map High Channels Wrapped Busses" (as I don't understand what this is supposed to do).

Hope this helps.

kilna
10-26-2018, 10:19 AM
Please insert you signature and a description of "Map High Channels Wrapped Busses" (as I don't understand what this is supposed to do.

I have been struggling to describe this part of it, and I am not happy with that name.

So when recording MPE MIDI, the amount of polyphony you have for recording (which in MPE translates to MIDI channels) can be up to 15. Higher numbers are good, because you want to avoid note conflicts.

Now, say you do not want to run 15 synths, to keep CPU or memory use down, or just to reduce clutter... what this parameter does is if you only have 4 busses configured, and a MIDI note comes in on what would have been routed to a 5th bus, then it is instead routed to the first bus. The 6th would go to the 2nd, etc.

This way, an MPE MIDI performance with 15 channels of note data can still be used with a smaller number of VSTs/busses. Also, you can leave your ROLI with the default settings and not have to change the number of MIDI channels it uses... you just set it once and use it the same configuration for natively MPE instruments and composite FX constructed using this routing.

So, I don't know how to explain that in a sentence of text short enough to fit onto the label for the drop-down menu. I really don't like the description it has right now, I want to change it, I just don't know what to change it to.

mschnell
10-26-2018, 11:24 AM
I see.

But I feel that the algorithm is not perfect right now, if you want to decently manage a reduction of the max voices.

I suggest to track the running notes/channels in the MPE input and to assign new notes to the output channels/buses in a round-robin way, independently of the input channel, re-using an output voice by sending a note-off and affiliating a new input channel to same.

The downside is that you need to cut a note before the corresponding note-off event including the note-off-velocity (aka "lift dimension") occurs. This obviously will degrade certain sounds.

-Michael

mschnell
10-26-2018, 10:46 PM
BTW. (happily you got up to speed with EERL programming very fast :) ) :
Regarding reducing the count of voices I suggest using an array that holds the assignments of incoming channels to outgoing "slots", used in a "overwrite the least recently used entry" way with a configurable max count of active entries.

Same would hold the incoming channel (or maybe the outgoing slot if sorted the other way) (or -1 for unused), a mark that a sound is running (set with note-on, reset with note-off) and the note-on velocity (the same byte as the mark could be used: "not running" = 0, as note-on velocity 0 means note-off), and a "last used" timestamp .

If a message with a not managed channel arrives, the least recently used entry that is not "running" is re-used. No problem here.

If no not running entry is found, the least recently used entry needs to be re-used. Now you need to send a Note-off to the old target slot to kill the sound (as supposedly the keyboard did not detect legato here). Here I suggest to use the saved note-on velocity for note-of velocity to provide the best possible consistency.

It makes sense to save this fact (including the "old" channel) in the same or in an additional array, to be able to discard messages to such channel, preventing incoming messages to a dead voice from taking away a voice slot.

Using just note-on and note-off events for assigning slots to incoming channels can't be done, because MPS allows for meaningful messages to a channel before note-on (e.g. Pitch-bend for staring a detuned sound) and after note-off (modulating the release phase).

Afterthought:
All this is strictly about means to use "any" VSTi with an MPE enabled keyboard. There also are things that might be viable for dedicated sound engines. E.g. I use "The Trumpet" by sampleModeling, which is based on NI Kontakt. Here it would make sense to convert Note-Off velocity ("lift" Dimension) to triggering a "Fall", which is done by sending note-on events outside the range of the instrument). Kontakt can't manage Note-off velocity :( .

-Michael

woodslanding
10-28-2018, 09:39 PM
I have a note limiting script for MPE. More on it here:

https://forum.cockos.com/showthread.php?p=2045105#post2045105

I do just that. However, I do (very!) occasionally get stuck notes, so I don't know if it did it correctly.

In the stash at:
https://stash.reaper.fm/v/34469/MPE%...l%20Strip.jsfx

mschnell
10-28-2018, 11:20 PM
I'll take a look later this day. Maybe trying to integrating the to scripts...

-Michael

mschnell
10-29-2018, 11:57 AM
I have a note limiting script for MPE.
Thanks for providing the code.

In fact I did my own version of a round-robin Midi bus scheduler for an MPE data stream. It seems to be partly working, but while implementing the details, I remembered your warning regarding stuck notes. To prevent stuck notes, I intended to make sure that there are no Note-On events without appropriate Note-Off events in any of the outgoing buses.

Taking a closer look, this prevents the usual (non MPE) way how a keyboard sends legato notes: ignoring that the target is monophonic, simply send a Note--On before the Note-Off of the previous key.

Now an MPE keyboard needs to handle each voice as a monophonic instrument. So I am very unsure how it is to detect that the player intends legato (instead of starting a new voice), and what information exactly it sends to the sound engine.

Unfortunately I don't have an MPE keyboard (yet) .

Any help regarding these specs ?

-Michael

mschnell
10-30-2018, 07:22 AM
Some more thoughts:

I suppose an MPE keyboard sends legato transitions in the same way as a normal keyboard: the Note-off messages for the first note is sent after the Note-On message of the second note. All on the same channel.

Now if there only are two notes, it would be easy to handle this by the JSFX, saving the two least recent two Note-On for any slot (output-channel), kill one if a Note-Off for the same key is detected and send Note-Off events for the remaining ones if a slot needs to be reused for another input channel.

But if the keyboard would be allowed to send many overlapping notes this would not work so easily.

How can we be sure what the ROLI does ?

-Michael

gofer
10-31-2018, 03:09 AM
There's no special handling of legato on the keyboard's side. The second note will be on a different channel. An MPE instrument would just ignore the channel information for the legato decision. If notes overlap - no matter the channel - do legato.

This means, if you create a bunch of instruments to make a fake MPE instrument, the legato decision of that instrument cluster is not working (without some clever processing of the MIDI stream). Most legato instruments are monophonic, so for these I just reduce the channels sent by the Seaboard to a single one. For instruments with "poly legato" (eg some guitar vsti with legato per string) I haven't found a satisfying solution.

That's true for ROLI. Linnstrument possibly is different, because it can handle its rows akin to guitar strings, so it maybe does send (I haven't played one): same row -> same channel.

mschnell
10-31-2018, 07:34 AM
Later this day I will do and post a version of the MPE distribution JSFX that can handle legato:

Two note-On messages per slot are saved. If a third one comes in the oldest is deleted and an appropriate Note-Off is sent into the slot. So we have at most two running notes.

If a slot is re-used due to receiving a new channel and no free slot, and no slot with no running note, a slot is hijacked and up to two notere-Of messages are sent.

I suppose this will work decently.

But OTOH, I don't know what to do if the keyboard does not notify the sound engine of a legato transition. In fact I did see performances with ROLI keyboards and SWAM instruments (AudioModeling seems to be closely affiliated with ROLI) and it seems to work great. Hence this issue seems to be solved.

-Michael

woodslanding
10-31-2018, 09:24 AM
Later this day I will do and post a version of the MPE distribution JSFX that can handle legato:

Two note-On messages per slot are saved. If a third one comes in the oldest is deleted and an appropriate Note-Off is sent into the slot. So we have at most two running notes.

If a slot is re-used due to receiving a new channel and no free slot, and no slot with no running note, a slot is hijacked and up to two notere-Of messages are sent.

I suppose this will work decently.

But OTOH, I don't know what to do if the keyboard does not notify the sound engine of a legato transition. In fact I did see performances with ROLI keyboards and SWAM instruments (AudioModeling seems to be closely affiliated with ROLI) and it seems to work great. Hence this issue seems to be solved.

-Michael

Unless you are using the roli monophonically, there is know way to insure (or even know) that two different notes are (to be) sent on the same channel. The legato effect is done with pitch bend of a single note in polyphonic applications. In monophonic applications, I don't see that you need to do anything other than rechannelize all notes to a single channel.

Am I missing something? Can you explain what you are trying to do in musical performance terms?

mschnell
10-31-2018, 11:36 AM
The legato effect is done with pitch bend of a single note in polyphonic applications.

This is not appropriate at all.

Blow a trumpet, a sax or a flute, and without ceasing blowing change the note or even do a trill. The effect is completely different from a non-legato (there are multiple kinds of that) e.g. by stopping blowing, change the note and the do a new blowing attack.

Move the bow of a violin and press a finger on the string. The effect is completely different from a non-legato done by stopping the bow, changing pressing the finger and then start the bow moving - usually in the opposite direction.

And as you see: no pitch-bend sliding involved here. But decent solo sound engines of course are able to do legato transitions that include pitch bending. This is controlled e.g. by the velocity of the target key's Note-On message.

In fact decently crafted solo instruments (like AudioModelling's SWAM based Flute or Cello or SampleModeling's Kontakt based "Trumpet" are all about doing perfect transitions between notes. They distinguish between multiple modes from staccato to legato. Here even the Note-On velocity of the target key is used to do a more or a less harsh transition. It's an absolute no-go not to support this by the keyboard.

Can you explain what you are trying to do in musical performance terms?

The ROLI should be used to play several different kinds of sound engines as different "patches":
- its own 15 voice MPE aware synthesizer
- one monophonic voice such as SWAM Flute
- one dupohonic engine such as SWAM Cello
- standard polyphonic (not multitimbral) sound engines such as Kontakt sample instruments or physical modeling Hammond organ plugins
- sets of multiple (say five) monophonic engines (e.g. SWAM or Kontakt based) to do sets of Orchestra-like sounds.

The patch switching needs to be done by means of a Midi message from a controller board. (No PC GUI available when Live playing.)

Now the MPE signal from the ROLI śeems to need to be preprocessed and distributed to the multiple instruments in different ways according to the actually selected patch. Or is there a way to send the ROLI a Midi signal to have it switch modes (e.g. between "Mono" or "single channel" to allow as well for normal Legato performance as for playing standard polyphonic instruments, and MPE for dedicated instruments such as the ROLY MPE synth and dedicatedly crafted sets of monophonic "orchestra" voices.


Thanks,
-Michael

gofer
10-31-2018, 12:29 PM
SWAM doesn't do a lot special in terms of MPE. The wind instruments are strictly monophonic and just play on any channel they receive. If you overlap while playing they will use legato, that's all. Pitch bend, pressure and "Slide" will be listened to only on the channel of the current active note (the one you touched last). The string instruments do basically the same but add lots of internal scripting to decide which string to emulate and a possibility to play doubles. Even when playing doubles you don't get polyphonic expression with SWAM strings - the last played note is the one that dictates pitchbend/pressure/Slide for both sounding virtual strings.

The only things MPE they do that I am aware of are the possibility to make them expect a pitch bend range of 48 semitones (so they match with the keywaves of Seaboards), and providing a preset that fits with the MPE typical controllers (aftertouch for blowing strength/bow pressure, etc).

They benefit a lot from having dynamics, pitch bends/vibrato and other expressions right under the very finger that plays the current note. It's the directness of control which makes them fit so well with that kind of MIDI controller and a pleasure to play.

gofer
10-31-2018, 01:04 PM
Or is there a way to send the ROLI a Midi signal to have it switch modes (e.g. between "Mono" or "single channel" to allow as well for normal Legato performance as for playing standard polyphonic instruments, and MPE for dedicated instruments such as the ROLY MPE synth and dedicatedly crafted sets of monophonic "orchestra" voices.


Thanks,
-Michael

For the Blocks series, as of now there isn't - it is requested though and may come at some point. For Rise, I read about sysex messages you can send to set them up.

Doing the processing via plugins has the huge advantage that you can have different setups simultaneously. Each Reaper track can have the appropriate setting so you don't need to care about switching the Seaboard's modes and can layer instruments with different channel count, pitch range, or whatnot expectations. woodslanding's JS comes in really handy with that.

mschnell
10-31-2018, 02:09 PM
As I do have the SWAM instruments I talked about and the Kontakt Trumpet (working rather similar by means of elaborated Kontakt scripting), and I already did a lot of support JSFXes for same, I decently know how they work. Of course they are strictly monophonic (only the Cello can be set to duophonic mode, which is a rather wild beast that I need to research more deeply). Here of course the standard "polyphonic keyboard legato" works perfectly well.

Regarding the Rise adhering to SysEx messages is really good news. Of course I can send those with my patch selecting system of JSFXes. Maybe with that I don't even need to use a channel reducing software, but advice the Rise to use as many channels, and use MPE or standard polyphonic mode, as the patch requires. It would be great if you could point me to more information on this...

Regarding the channel reducing JSFX, sending Note-Off events when a slot is re-used by a new MPE channel is necessary even if the sound engine is strictly monophonic, as otherwise it will do a legato transition even though in MPE a new channel (i.e. a new key) is denoted.

-Michael

mschnell
10-31-2018, 02:13 PM
Here the current state of the MPE slot assignment JSFX. Please test with a ROLI device if you find the time to do so.

This (testing) version features a graphic display that shows the current state of the array of stored Note-on events (up to two per slot).

Thanks,
-Michael

Part 1:

desc:MIDI Channel to Bus
//tags: MIDI processing routing

in_pin:none
out_pin:none

slider1:1<0,15,1{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}>Start MIDI Channel / Bus
slider2:14<1,16,1{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}>Qty of input Channels (MPE Polyphony)
//slider3:1<0,1,1{Disabled,Enabled}>Map High Channels Wrapped Busses
slider3:14<1,16,1{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}>Qty of oputput Channels / Busses ("slots")
slider4:0<0,16,1{Disabled,1,2,3,4,5,6,7,8,9,10,11,12,13,14,1 5,16}>Broadcast Channel (sent to every output bus)
slider5:0<0,16,1{Passthrough (mapping disabled),1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}>Map to MIDI Channel

@init

ext_midi_bus = 1;
NOTE_ON = 0x90;
NOTE_OFF = 0x80;
MAX_TIME = 99999999999999;
slot = 0*16; // array for storing messages
timestamp = 1*16; // array for storing timestamps
noteonvel = 2*16; // array for latest note - on velocity;
msg_nr = 0; // total message numner. Do we need to consider overrun ?

@slider

start_channel = slider1;
end_channel = start_channel + slider2;
(end_channel > 15) ? (
end_channel = 15;
slider2 = end_channel-start_channel;
);
num_channels = (end_channel - start_channel + 1);
//wrap = slider3;
slots = slider3+1;
slots > num_channels ? (
slots = num_channels;
slider3 = slots-1;
);
broadcast = slider4 > 0;
broadcast_channel = slider4 - 1;
map = slider5 > 0;
map_channel = slider5 - 1;

memset(slot, 0, 16);
memset(timestamp, 0, 16);
memset(noteonvel, 0, 16);

@block
while (midirecv(offset, msg1, msg2, msg3)) (
msg_nr += 1;
input_bus = midi_bus;
input_channel = (msg1 & 0x0f);
message = (msg1 & 0xf0);
(broadcast && (input_channel == broadcast_channel)) ? (
bus = start_channel;
loop( num_channels,
output_channel = ( map ? map_channel : input_channel );
midi_bus = bus;
midisend(offset, (message + output_channel), msg2, msg3);
bus += 1;
);
) : (
// ((input_channel >= start_channel) && ((input_channel <= end_channel) || wrap)) ? (
num_channels == slots ? (
((input_channel >= start_channel) && (input_channel <= end_channel)) ? (
output_bus = input_channel;
(input_channel > end_channel) ? (
output_bus = (((input_channel - start_channel) % num_channels) + start_channel);
);
midi_bus = output_bus;
output_channel = ( map ? map_channel : input_channel );
midisend(offset, (message + output_channel), msg2, msg3);
) : (
midisend(offset, msg1, msg2, msg3);
);
) : ( // reduce channel count;
yon = (message == NOTE_ON) && (msg3 != 0) ;
yoff = (message == NOTE_OFF) || ((message == NOTE_OFF) && (msg3 == 0));

// search free slot

ss = -1;
i = 0;
mintime = MAX_TIME;
minrun = MAX_TIME;
while (i<slots) (
vel = noteonvel[i];
xmsg = slot[i];
xmsg1 = (xmsg >> 14) & 0xFF;
(!(xmsg1 & 0x80)) || ((xmsg1 & 0x0f) == input_channel) ? ( // free or this channel
ss < 0 ? (
ss = i;
);
) : (
mintime > timestamp[i] ? (
mintime = timestamp[i];
ss_mintime = i;
);
!vel ? ( // note running
minrun > timestamp[i] ? (
minrun = timestamp[i];
ss_minrun = i;
);
);
);
i += 1;
);
shutup = 0;
// ____ss = ss;
ss < 0 ? ( // no free slot
minrun == MAX_TIME ? ( // no silent slot
shutup = 1;
ss = ss_mintime;
) : (
ss = ss_minrun;;
);
);

/* test
xmsg = slot[ss];
xon = (xmsg >> 22) & 0x01;
xmsg1 = (xmsg >> 14) & 0xFF;
xmsg2 = (xmsg >> 7) & 0x7F;
xmsg3 = xmsg & 0x7F;
*/
shutup ? (
vel = noteonvel[ss];
vel1 = vel & 0x3FFF;
vel2 = (vel >> 14) & 0x3FFF;
noteonvel[ss] = 0;
// ____1 = vel1;
// ____2 = vel2;
vel ? (
xmsg = slot[ss];
xmsg1 = (xmsg >> 14) & 0x0F; // channel
output_channel = map ? map_channel : xmsg1;
xmsg1 = NOTE_OFF + output_channel;
);
vel1 ? (
xmsg2 = (vel1 >> 7) & 0x7F;
xmsg3 = vel1 & 0x7F;
midi_bus = ss;
midisend(offset, xmsg1, xmsg2, xmsg3); // kill currently running Note to free slot
);
vel2 ? (
xmsg2 = (vel2 >> 7) & 0x7F;
xmsg3 = vel2 & 0x7F;
midi_bus = ss;
midisend(offset, xmsg1, xmsg2, xmsg3); // Kill currently running note to free slot
);
);

xmsg = (msg1 << 14) | (msg2 << 7) | msg3;
slot[ss] = xmsg;
timestamp[ss] = msg_nr;
v1 = 0;
v2 = 0;
yon ? ( // a NOTE_ON message
vel = noteonvel[ss];
vel1 = vel & 0x3FFF;
vel2 = (vel >> 14) & 0x3FFF;
vel1 ? ( // slot already running
(vel1 >> 7) & 0x7F == msg2 ? (
v1 = 1; // already stored in 1
);
);
vel2 ? ( // slot already running
(vel2 >> 7) & 0x7F == msg2 ? (
v2 = 1; // already stored in 2
);
);
!(v1 || v2) ? ( // not stored
vel1 && vel2 ? ( // a third unr*****ed Note-On
vel = ((vel & 0xFFFC000) >> 14) | (((msg2 << 7) | msg3)) << 14; // reove oldest entry
xmsg = slot[ss];
xmsg1 = (xmsg >> 14) & 0x0F; // channel
output_channel = map ? map_channel : xmsg1;
xmsg1 = NOTE_OFF + output_channel;
xmsg2 = (vel1 >> 7) & 0x7F;
xmsg3 = vel1 & 0x7F;
midi_bus = ss;
midisend(offset, xmsg1, xmsg2, xmsg3); // Kill oldest currently running note
) : (
!vel1 ? ( // 1 is free
vel = (vel & 0xFFFC000) | ((msg2 << 7) | msg3) ;
// ____1 = ((msg2 << 7) | msg3) ;
) : (
!vel2 ? ( // 2 is free
vel = (vel & 0x3FFF) | (((msg2 << 7) | msg3) << 14);
// ____2 = ((msg2 << 7) | msg3) ;
);
);
);
noteonvel[ss] = vel;
);
);
yoff ? (
vel = noteonvel[ss];
vel1 = vel & 0x3FFF;
vel2 = (vel >> 14) & 0x3FFF;
// ____0 = vel;
// ____1 = vel1;
// ____2 = vel2;
vel1 ? (
(vel1 >> 7) & 0x7F == msg2 ? ( // Note_Off for first saved Note_On
vel &= 0xFFFC000; // remove this
// ____11 = ((msg2 << 7) | msg3) ;
noteonvel[ss] = vel;
);
);
vel2 ? (
(vel2 >> 7) & 0x7F == msg2 ? ( // Note_Off for second saved Note_On
vel &= 0x3FFF; // remove this
// ____21 = ((msg2 << 7) | msg3) ;
noteonvel[ss] = vel;
);
);
);

midi_bus = ss;
output_channel = map ? map_channel : input_channel;
!yon || !(v1 || v2) ? midisend(offset, message + output_channel, msg2, msg3);
);
);
);

mschnell
10-31-2018, 02:14 PM
too long or a forum message.
Part 2 (debug grapics) :

@gfx 640 400

gfx_r=gfx_g=gfx_b=1; gfx_a=1;
gfx_setfont(2,#font,18);
gfx_y = 5;
gfx_x = 10;
gfx_drawstr("Slot");
gfx_x = 10 + 40;
gfx_drawstr("Last");
gfx_x = 10 + 80 * 1;
gfx_drawstr("Msg1");
gfx_x = 10 + 80 * 2;
gfx_drawstr("Msg2");
gfx_x = 10 + 80 * 3;
gfx_drawstr("Msg3");
gfx_x = 10 + 80 * 4;
gfx_drawstr("N_ON1");
gfx_x = 10 + 80 * 5;
gfx_drawstr("N_ON_2");
gfx_x = 10 + 80 * 6;
gfx_drawstr("Time");

_i = 0;
loop (16,
_xmsg = slot[_i];
_xmsg1 = (_xmsg >> 14) & 0xFF;
_xmsg2 = (_xmsg >> 7) & 0x7F;
_xmsg3 = _xmsg & 0x7F;
_t = timestamp[_i];
_v = noteonvel[_i];
_v1 = _v & 0x7F;
_n1 = (_v >> 7) & 0x7F;
_v2 = (_v >> 14) & 0x7F;
_n2 = (_v >> 21) & 0x7F;
gfx_y = 30 + 20 * _i;
gfx_x = 10;
#_t = sprintf(#, "%d", _i);
gfx_drawstr(#_t);
gfx_x = 10 + 40;
_i == ss ? gfx_drawstr ("*");
gfx_x = 10 + 80 * 1;
#_t = sprintf(#, "%2.2x", _xmsg1);
gfx_drawstr(#_t);
gfx_x = 10 + 80 * 2;
#_t = sprintf(#, "%2.2x", _xmsg2);
gfx_drawstr(#_t);
gfx_x = 10 + 80 * 3;
#_t = sprintf(#, "%2.2x", _xmsg3);
gfx_drawstr(#_t);
gfx_x = 10 + 80 * 4;
#_t = sprintf(#, "%2.2x", _n1);
gfx_drawstr(#_t);
gfx_x = 10 + 80 * 4 + 30;
#_t = sprintf(#, "%2.2x", _v1);
gfx_drawstr(#_t);
gfx_x = 10 + 80 * 5;
#_t = sprintf(#, "%2.2x", _n2);
gfx_drawstr(#_t);
gfx_x = 10 + 80 * 5 + 30;
#_t = sprintf(#, "%2.2x", _v2);
gfx_drawstr(#_t);
gfx_x = 10 + 80 * 6;
#_t = sprintf(#, "%d", _t);
gfx_drawstr(#_t);

_i += 1;
);
/*
_n0 = (____0 >> 7) & 0x7F;
_n1 = (____1 >> 7) & 0x7F;
_n2 = (____2 >> 7) & 0x7F;
_n11 = (____1 >> 7) & 0x7F;
_n21 = (____2 >> 7) & 0x7F;

gfx_y = 30 + 20 * (_i+1);
gfx_x = 10 + 80 * 0;
#_t = sprintf(#, "%2.2x", _n0);
gfx_drawstr(#_t);
gfx_x = 10 + 80 * 1;
#_t = sprintf(#, "%2.2x", _n1);
gfx_drawstr(#_t);
gfx_x = 10 + 80 * 2;
#_t = sprintf(#, "%2.2x", _n2);
gfx_drawstr(#_t);
gfx_x = 10 + 80 * 4;
#_t = sprintf(#, "%2.2x", ____ss);
gfx_drawstr(#_t);
gfx_x = 10 + 80 * 5;
#_t = sprintf(#, "%2.2x", ____s);
gfx_drawstr(#_t);
*/

gofer
10-31-2018, 02:38 PM
I hope this link to the SysEx info works:https://support.roli.com/support/discussions/topics/36000005031/page/1?url_locale=
Scroll to about the middle of page 1 of the thread, there's two relevant posts by an admin called Red about Rise's SysEx and how to rerset the firmware. The whole thing is "not officially supported, and so you do so at your own risk".

/EDIT: You can spot them by some fat fonts and list formatting.

Re-reading, I assume there's additional info needed in terms of SysEx. Red only mentions some two-digit decimal adresses, nothing about the header. Maybe there's something in the manual, or some Juce documentatiom or you'll be able to sniff the chatter between Dashboard and Rise once you have it. Or someone with a Rise can do it for you. A lot of important parameters are done via RPN and NRPN.

mschnell
10-31-2018, 03:33 PM
Thanks a lot !

My initial search did not reveal how to construct a SysEx message to switch the mode (standard poly <-> MPE) and the MPE channel count.

So further insight would be very welcome.

-Michael

gofer
10-31-2018, 03:54 PM
I don't get it either. MPE on/off doesn't seem to be available in his list.

Start channel, End channel as well as global channel which would define the channel range all are declared to be RPN 6. I assume he means RPN MSB (CC 101). Maybe they are all to be sent on the desired channel for that setting, as mentioned for the start channel? No mentioning of the Data Entry (CC6/38) value, it's all quite vague...

mschnell
10-31-2018, 04:00 PM
I seem to remember that it's not just MPE on/off, but multiple Modes that can be selected.

Here -> https://www.youtube.com/watch?v=6rbEMfWHDOY is an example of someone seemingly using two instances of a monophonic instrument and nonetheless doing legato all the time in the beginning you can see how the instances are uses in a round robin way - supposedly by means of MPE.

-Michael

gofer
10-31-2018, 04:15 PM
I guess he simply has set the Seaboard to send on two MIDI channels, his two tracks to receive only one of them each and leaves the rest to chance and the individual legato scripts of the two SWAM instances. I don't think there's anything more elaborate at work there.

mschnell
10-31-2018, 05:11 PM
I also don't think he uses any additional tooling.

But nonetheless obviously the round robin channel association is at work, and OTOH obviously the staccato/legato dicisions are perfectly done. I suppose the Rise in some way performs an algorithm for this. (While I do know that the SWAM Cello works in the usual way detecting overlapping notes to decide for legato.)

I just took a look at the latest AudioModeling Cello version I donwloaded a few weeks ago. Same has a dedicated "Seaboard" preset I can load. It also has a Linstrument preset (AFAIK, Linstrument also sends MPE).

The AudioModeling Flute also features these presets. But I am very happy playing same with the Breath Controller, and so I think I will try to invent some combination of the 5 D ROLI controls and the 4 D TEC BBCv2 controls.

Obviously I will be bound to go to the psychiatry soon.
-Michael

gofer
10-31-2018, 05:15 PM
I seem to remember that it's not just MPE on/off, but multiple Modes that can be selected.

I think MPE on/off merely declares whether a global channel is used to send controllers that should work on all channels of an MPE "zone", which is a conglomerat of a global channel and some channels used for polyphonic noteon/noteoff/aftertouch/CC74 data, which are defined with "start channel" and "end channel". Per default, as you probably know, Seaboard sends global on channel 1 and polyphonic data on channels 2 through 16.

For example to use Omnisphere, I used to switch off MPE, so I could set it to send polyphonic data on channels 1 through 8 (and no global data at all) Maybe it's also possible to just set channels 1 through 8 while MPE is on, never tried that.
Nowadays I use a JSFX similar to woodslanding's (but with my own crude spaghetti code) to redistribute the channels and copy anything I want to be global onto all 8 channels. It also reduces the pitch bend range to match Omnisphere's maximum 24 semitones and can remap aftertouch/CC74 to other controllers and rescale them. Plus it does some velocity scaling which is often needed for instruments not designed for touch style input devices. Works nice. woodslanding's plugin does most of that and some extra stuff (with much neater code).

The modes you remember, I suppose are basically presets with different configurations of the available settings, most of which you find in Red's list.
To be frank (which I am bound to be, as that's my name :)) ROLI's Dashboard application is full of little quirks, buglettes and inconveniences. For their "Single channel" mode alone I reported at least six weird behaviors, such as unnecessary reset messages with every note-on (pitch bend and CC74 reset, even when you set up to to not use slide or glide at all...). They may have improved that, I didn't check since I found post processing deals with it neatly and brings additional advantages, too.

gofer
10-31-2018, 05:40 PM
I also don't think he uses any additional tooling.

But nonetheless obviously the round robin channel association is at work, and OTOH obviously the staccato/legato dicisions are perfectly done. I suppose the Rise in some way performs an algorithm for this. (While I do know that the SWAM Cello works in the usual was detecting overlapping notes to decide for legato.)
-Michael

The round robin is just what the Seaboards "naturally" do if you tell them to use more than a single channel. I don't think I see anything special in terms of staccato/legato decisions there. I can spot the two celli each playing different notes on the same string at the same time, so they surely don't properly emulate a single cello.

mschnell
11-01-2018, 01:43 AM
I understand that the video is about simulating playing two Celli and does a good job on this. The Celli even play the same note from time to time and the sound of that is perfectly realistic.

Of course I do know, that the round robin scheduling is the "usual" way, the Seaboard works.

What makes me wonder is that same seems not to happen in all occasions the player presses a new key, but the player can perfectly control legato transitions on one of the Celli. A perfect example would be a trill: holding on key and repeatedly pressing and lifting a key nearby, which should do note transitions sounding similar to doing a similar finger action on a string of a real instrument: no glide but interconnected sound variations. Unfortunately he does not try this in the Video.

Maybe you can record the Midi the RILO sends when doing such a trill and let me know what happens ?

Thanks,
-Michael

mschnell
11-01-2018, 01:49 AM
In fact I did not yet understand what "Dashboard" does. Will it only configure the Seaboard, or will the Midi data stream from the Seaboard somehow pass through it ?

In fact the conclusion seems to be that I will not be able to use a Seaboard in my setup unless I find a way to dynamically (by means of my patch selection software system) set it up to appropriate modes required by the different sounds it is supposed to control :( .

I don't want to add the Seaboard as a third keyboard, but I want it to replace the (upper) light-weighted keyboard I use additional to the (lower) Piano-action keyboard. Hence it needs to be able to most of the time work like in a traditional mode, while appropriate (new) patches would need MPE data.

-Michael

mschnell
11-02-2018, 11:33 PM
Any further thoughts ?

-Michael

gofer
11-03-2018, 03:20 AM
As far as I understand Dashboard controls the Seabord's settings. You can set the Seaboard up to your needs, connect it to another device and it will use that setup even without Dashboard.

Re the video: In the comments the guy confirms my assumption that he limited the Seabord to 2 MIDI channels and the SWAM plugins to a single channel each.
But:
Using Seaboard Block, I didn't always get the same results as he does. Either Rise has a different routine to distribute the channels when all available channels are in use and it comes to "note stealing" (to the worse in this special situation), or they changed the routine for all their Seaboards after the video was created. As you're contemplating a Rise, MIDI examples made with Blocks may or may not be misleading.

Instead of relying on Seaboard's channel distribution I tried to use woodslanding's JS to reduce the channel range to 2, but somehow totally failed, not sure whether that's my fault or a bug in his code. I already knew that my own plugin isn't failsave when it comes to note stealing and needs work there.


Re playing "like in a traditional mode":
As mentioned before, the "single channel" mode they provide for the Blocks series has a number of flaws, which made me dabble with writing JSFX for them in the first place. This also may or may not be a problem with Rise. Reducing to a single channel works fine in both my own plugin as well as woodslanding's - as far as I tested, which was not too much as I was more interested in his pitch bend reduction routine back then.


Myself, I haven't really touched my "hard keyboard" ever since I got all my single channel issues resolved via JS. But I am not trying to play multiple legato instruments at the same time. I'm sure something can be optimized there (at least for two-voice-legato), but it may never be quite ideal in all playing situations.

If somehow possible you should try it first. It is a very inspirational and intuitive playing experience for sure and I am certain you'll like that part of it.
Playing like a traditional keyboard technically works with additional processing (may work out of the box with a Rise), but it plays very different and you might prefer hard keys. I never was much of a keaboardist let alone piano player. Coming from the guitar I actually prefer the way Seaboards play and feel, but that is highly subjective. For serious keyboard players, I assume Seaboards are not really suitable as "allrounders" but remain specialists.

mschnell
11-03-2018, 04:13 AM
As far as I understand Dashboard controls the Seabord's settings. You can set the Seaboard up to your needs, connect it to another device and it will use that setup even without Dashboard.
That is what I assumed. Thanks for the confirmation.

Re the video: In the comments the guy confirms my assumption that he limited the Seabord to 2 MIDI channels and the SWAM plugins to a single channel each.
That is what I assumed. (But I did not check the comments. )

Using Seaboard Block, I didn't always get the same results as he does.
I suppose the Block needs to take care of other blocks connected, and this might make the note stealing algorithm more complex or less workable.


Instead of relying on Seaboard's channel distribution I tried to use woodslanding's JS to reduce the channel range to 2, but somehow totally failed, not sure whether that's my fault or a bug in his code. I already knew that my own plugin isn't failsave when it comes to note stealing and needs work there. You might also tried to use the JSFX I posted above. Regarding note-stealing it might work better or worse. But it does show what it does, if you also add the graphics code from the other post, and hence debugging and searching for improvement is a lot easier.



Re playing "like in a traditional mode":...
I have no doubt that this works just fine. The problem is that I might need to switch the seaboard modes on the fly while live playing (without a Monitor attached to the system "on stage"!), and I did not yet find a decent documentation how to do that via Midi.


If somehow possible you should try it first. It is a very inspirational and intuitive playing experience for sure and I am certain you'll like that part of it.
That is exactly what I am up to. But regarding trying, I need to swap the other keyboard out of my live setup for the seaboard, and from that point it needs to work for me as similar as possible like the old one did. Any additional goodies need to be explored and configured only after that. But I'd like to be sure that it will indeed be usable before I buy it. Of course for the usual piano-like playing the 88 key hard (hammer) keyboard is there to stay.

Thanks for your comments,
-Michael

gofer
11-03-2018, 05:03 AM
I suppose the Block needs to take care of other blocks connected, and this might make the note stealing algorithm more complex or less workable.

As of now Blocks have a serious inconvenience regarding this I feel inclined to rant about, but it would derail the thread. You may well be right about this. I tested with a single Block, because said inconvenience makes the setup as in the video impossible with multiple Blocks (if done using Dashboard only, that is).


You might also tried to use the JSFX I posted above. Regarding note-stealing it might work better or worse. But it does show what it does, if you also add the graphics code from the other post, and hence debugging and searching for improvement is a lot easier.

Yep, I noticed it after posting. It will come in handy when I go about fixing my own channel redistribution, so that's awesome to have, thanks. At a quick glance, I could not for example play a long note on one hand and a legato line with the other, it will kill all but the last note in that situation. I'll check furtherhopefully this evening, wheather is too nice to spend much more time indoors, but I'll give some feedback then.

I have some vague hunch that for this special use case, 2 voices, the routine could be made to always reuse the channel of the note that is closest to the new (third) note. Not sure, but that may be a good enough decision for many cases???

I have no doubt that this works just fine. The problem is that I might need to switch the seaboard modes on the fly while live playing (without a Monitor attached to the system "on stage"!), and I did not yet find a decent documentation how to do that via Midi.

Don't you think you could find a way marry your patch switching method with the JSFX way of processing the data within Reaper?

That is exactly what I am up to. But regarding trying, I need to swap the other keyboard out of my live setup for the seaboard, and from that point it needs to work for me as similar as possible like the old one did. Any additional goodies need to be explored and configured only after that. But I'd like to be sure that it will indeed be usable before I buy it. Of course for the usual piano-like playing the 88 key hard (hammer) keyboard is there to stay.

Thanks for your comments,
-Michael

I'd so love to convice you to get one anyway :D. First because it is that good but also to get more MPE discussion going here at Cockos forum. There is much to improve regarding editing MPE in Reaper...


Now I really need to catch some sunlight, later :)

mschnell
11-03-2018, 12:05 PM
Regarding my JSFX, pleaese keep in mind that it's original purpose is to use Reaper Midi Bus feature.So it does not output a limited count of Midi channels (that could be routed to other tracks or be used by monophonic plugins), but it uses a count of midi buses and either keeps the original channel or always uses the same channel. Now in Reaper Midi buses can be routed/used like midi channels: either be distributed/sent to other tracks or used as input selectors for the plugins in the current track /via the [2in/2out] button.

So you need to modify your rerouting and plugin channel usage to test it.

The graphics window will show what is does. Please come back if you have any questions.

I am not sure if I really want to play multiple monophonic instruments at the time by the Rise. Maybe just setting a siingle mono instrument to "All channels" (or doing a plugin that maps all input channels to a single one) might make it compatible with the Rise (regarding the legato detection). The same should be true with a single polyphonic instrument (just playing multiple voices that identically react on controllers - maybe I need to filter out some controllers). And an MPE aware Synth should work decently, anyway. But being a freak, obviously I am interested in extending the usage of such equipment :) .

-Michael

woodslanding
11-03-2018, 10:07 PM
In fact I did not yet understand what "Dashboard" does. Will it only configure the Seaboard, or will the Midi data stream from the Seaboard somehow pass through it ?

In fact the conclusion seems to be that I will not be able to use a Seaboard in my setup unless I find a way to dynamically (by means of my patch selection software system) set it up to appropriate modes required by the different sounds it is supposed to control :( .

I don't want to add the Seaboard as a third keyboard, but I want it to replace the (upper) light-weighted keyboard I use additional to the (lower) Piano-action keyboard. Hence it needs to be able to most of the time work like in a traditional mode, while appropriate (new) patches would need MPE data.

-Michael

Well, it is certainly my intention to be able to use my seaboards without ever touching the dashboard. Set pitch bend to 48, mode to MPE (globals on chan 1, voices on 2-16) and then just change settings in my jsfx to control whatever is on the recieving end, whether X channels of Kontakt, fully MPE compatible synths, or hopefully the script that started this all with multiple parameter-linked VSTs.

Not sure where my plug-in is at currently, as I haven't been using the roli the last month or so. IIRC I was getting occasional stuck notes, which I have been unable to track down in the code, and was hoping some script guru with a roli would notice what I did wrong....

I hope to be back at it sometime soon, but really busy with actual music right now ;)

mschnell
11-03-2018, 10:55 PM
I suppose my script with handling of overlapping Note-On events on the same channel (aka legato) (storing up to two for later insertion of Not-Off if necessary, and direct insertion of a Note-Off in case of more than two) should work for MPE- Channel/Slot reduction. More features (such as Pitch-bend factor, or using Midi-Channels instead of Midi-Bus for output-Slot ID) can be added if it really works.

Unfortunately all this is not able to solve the problem of the ROLI (potentially not) transferring decent channel-legato information in certain MPE modes.

-Michael

gofer
11-04-2018, 10:16 AM
I am not sure whether "Note-off in case of more than two" is helpful.

For the purpose of mere "MPE-Channel reduction" (with no intention of trigering legato in the instrument) it certainly is not the right way to go. If no channel is free, then the new note should just share the channel (and consequentially also performance data like pitch and pressure) with one of the older notes, not kill an old note entirely. That way you only sacrifice independent control (of a subset of your notes), not entire notes which were intended to sound by the performer. I think that's also what the MPE specs say.


I have no idea what you could mean by "decent channel-legato information" that ROLI could send.
The only thing I could imagine right now would be an option similar to what some guitar vsti have when it comes to decide on whether to do a hammer-on/pull-off or a full retrigger, like "if a new note is less than n semitones apart from an active old note, then reuse the channel (IOW play legato)". I'd still not vote for "kill the old note", the legato instrument should already know what to do with it. But that would obviously defeat the whole purpose of MPE...

gofer
11-04-2018, 11:18 AM
Michael, I forgot that I wanted to give you a short example of data from the Seaboard Block to test with. Attached are two bars of simple legato playing with both hands. This is what the Seaboard Block sends when left at default settings (base channel 1, Note channels 2-16).

mschnell
11-04-2018, 03:30 PM
Re-using a channel / slot without killing the note would trigger a Legato in a monophonic plugin that is able to do legato. That is absolutely not what might be desirable when pressing a completely unaffiliated key. That is why my plugin sends Note-off(s) in that case.

Of course you are right that the purpose of MPE and legato is contradicting.

OTOH, this seems to work (with the Rise), as it is exactly what the video with the two Celli shows.

But trying to accomplish this in accordance with or even without the help pf the keyboard during a channel reducing preprocessing tool seems rather hopeless :(

-Michael

Bansaw
11-04-2018, 05:18 PM
I'm a developer with a couple of decades of experience, but I've never developed for Reaper or in lua before. With enough patience I could probably write something to accomplish this goal, but I want to confirm something meeting some or all of my needs doesn't already exist.
@kilna Can I ask - do you know how to make 32bit plugins work properly? I have a 9-year old plugin but it works fine in Reaper32 bit but will no longer bridge into Reaper64 bit.

Actually it did work in Reaper64 bit but then I upgraded from Win7 to Win10 and then it stopped (just freezes up Reaper when I tried to load it up).

I wondered if its was the C++ libraries so I installed them but nothing worked.
But again, it works fine in Reaper32 bit in Win10.
Any ideas? (I tired JBridge etc...)

woodslanding
11-04-2018, 06:44 PM
Re-using a channel / slot without killing the note would trigger a Legato in a monophonic plugin that is able to do legato. That is absolutely not what might be desirable when pressing a completely unaffiliated key. That is why my plugin sends Note-off(s) in that case.

-Michael

What is the definition of 'unaffiliated'? How is either the roli or a jsfx supposed to know whether one note is affiliated with another?

If you want legato out of the roli, you need to set ch count to 1. Legato is a monophonic idea, no?

If you want several monophonic instruments controlled by a roli, that is fundamentally no different than getting a conventional keyboard to do so. You have to have some kind of keyboard split. It could be dynamic somehow, but you're basically splitting the keyboard. My plugin allows for this by limiting the midi by high and low note, so you can have one controller control 2 instruments in different parts of its range. I know there are algorithms for splitting by hand position, but I never liked them, as they can get confused easily... and I'm sure not up for coding that!

But also, the idea with MPE is that you can just DO legato, rather than IMPLYING it by your note choices. If you slide from one note to another, a new note is simply not created. Of course actual legato is still fun, but limited to monophony like any other kind of legato.

mschnell
11-04-2018, 11:36 PM
What is the definition of 'unaffiliated'?
Intended by the player to be assigned to a different instrument creating a new sound instead of to the same instrument and creating a legato transition. Of course the keyboard or any software only can guess what the player means.

Obviously this is a general/basic issue with MPE, and I suppose there are discussions about this in ROLI-forums ?!?!?
If you want legato out of the Roli, you need to set ch count to 1. Legato is a monophonic idea, no?

Now we are back to "on the fly" having the Seaboard switch the channel count (or other internal settings) to be usable for different patches/sounds/plugins, my means of being sent an appropriate command via Midi. To me this is the issue to be solved to make it decently usable for me.

But also, the idea with MPE is that you can just DO legato, rather than IMPLYING it by your note choices.
"Legato" is not (necessarily) something like pitch bend. If moving the finger on a Sax or trumpet you'll get intermediate sound (overtone structure, noise, ...) during the transition. Even though I suppose it can be done, but I don't think there (yet) are physical modeling plugins that detect the finger slide in MPE as a physical legato and not as a pitch bend. A legato on a sax or a trumpet can be done with greater distances than a semitone in a single step. What gesture in the ROLI would denote that ?

What exactly will the ROLI send when you press a "key" and slide your finger to the next (or second next or ...) ?

-Michael

gofer
11-05-2018, 12:59 AM
Intended by the player to be assigned to a different instrument creating a new sound instead of to the same instrument and creating a legato transition. Of course the keyboard or any software only can guess what the player means.

Obviously this is a general/basic issue with MPE, and I suppose there are discussions about this in ROLI-forums ?!?!?


It is only an issue if your intention is to play with multiple legato capable instruments at the same time. A single common monophonic legato instrument can be played just fine out of the box if either the instrument can be set to omni channel input (and can disregard channel information in its legato decision algo), or you reduce the channels to a single one (either in Dashboard or by processing). Single SWAM instruments and any of the legato instruments in Kontakt I tried play without any further ado (Kontakt instruments need to be set to omni input, if you don't reduce channels beforehand, obviously).


Now we are back to "on the fly" having the Seaboard switch the channel count (or other internal settings) to be usable for different patches/sounds/plugins, my means tof being sent an appropriate command via Midi. To me this is the issue to be solved to make it decently usable for me.

As said, for Rise there seems to be MIDI commands which do that, just badly documented (maybe if one does a serious search there is better documentation, eg somewhere at JUCE related sites). Reducing to a singe channel is pretty trivial to do with in-line processing, the biggest problem being competing pitch bend, pressure and CC74 messages happening while notes overlap. You want to deal with that in the reduction process in a way that outputs the least value jumps. IMHO, Blocks are not particularly good at this, I prefer my own plugin - don't know about Rise.

A legato on a sax or a trumpet can be done with greater distances than a semitone in a single step. What gesture in the ROLI would denote that ?

An overlap of notes, just like on an ordinary keyboard. Again, there only is an issue here when you try to control multiple legato instruments with two (or more) channels from the ROLI as done in the 2-celli-video.

What exactly will the ROLI send when you press a "key" and slide your finger to the next (or second next or ...) ?

It will send the initial note (preceeded by pitch bend, pressure and CC74 reset messages) and then pitch bend messages following your finger movement -all of course on the same channel as the note itself. One exception: if you set the Glide (= pitch bend) resolution to minimum, then it will stop the original note and send a note-on for the next one as soon as your finger gets into the realm of a new note, creating a glissando. I think (not sure) the new note's velocity is dependent on pressure when it does that. Gliding on the lower strip (the flat area without "keywaves") does the glissando on "white keys", gliding on the upper strip plays all semitones along the way.

gofer
11-05-2018, 01:49 AM
Reducing to a singe channel is pretty trivial to do with in-line processing, the biggest problem being competing pitch bend, pressure and CC74 messages happening while notes overlap. You want to deal with that in the reduction process in a way that outputs the least value jumps. IMHO, Blocks are not particularly good at this, I prefer my own plugin - don't know about Rise.

Regarding this, for Pressure and Slide (the vertical gesture sending CC74) I am very happy with my routine which looks up the highest current value and filters all messages below that. The only occasion I get jumps is when one note has a considerably higher Slide value than the other note(s) and I stop playing the high-value-note. I could probably introduce some smoothing intermediate extra messages for that case, but didn't care as of yet. It just isn't disturbing me enough for the time being. That's no problem with pressure (even when you lift your finger real quick, there will be some values sent that lower the value smooth enough).
In monophonic instruments like SWAM I don't even hear/feel a problem in the first place even without filtering, it only becomes obvious when I try to play single channel polyphonic instruments, emulating an ordinary keyboard.

Pitch is more of a hassle for this use case (emulating an ordinary keyboard). At the moment I simply ditch the pitchbend messages of all channels but the global channel and control pitch bend the old school way, using either the pitch wheel of my other controller or the "virtual pitch wheel" I programmed for my Lightpad Block. I assume that using the same logic as for Press/Glide could yield good enough results, but didn't yet think it through, as I am pretty happy with what I have.

mschnell
11-05-2018, 07:42 AM
It is only an issue if your intention is to play with multiple legato capable instruments at the same time.
It was a conclusion from the original post in this thread. And from that it began a life of it's own :)

...

In fact I think I am decently inclined to try the ROLI, even if doing multiple mono instruments in parallel is not perfectly possible. I supposedly would set it up to full MPE mode and merge all channels to a single one by a JSFX, while supposedly always sending the current average value (of some kind) for the per-key controllers. That should work as well for the usual mono instruments (such as SWAM) (including decent legato detection), as for standard polyphonic instruments (such as Hammond).

Of course multi-phonic (semi-)MPE instruments (like cello, bass or Guitar, or dedicated brass sections) might be more restricted then necessary.

-Michael

mschnell
11-05-2018, 08:22 AM
One exception: if you set the Glide (= pitch bend) resolution to minimum, ...
Is this done by one of the three sliders on the left side the Rise ?

-Michael

mschnell
11-05-2018, 08:23 AM
More elaborated rant:

There is no such thing like “simply doing the legato”.

Physical instruments feature multiple articulations, that are triggered by the player, who on the fly learns to handle these when learning to play the instrument. Legato is just one of those articulation options.

As an example consider a Cello or a fretless bass. Regarding the transition from on note to another (say 3 semitones higher) the player can choose to (1) slide his finger on the string (repeated: extreme vibrato), (2) tap another finger on the same string (repeated: trill), (3) start a new tone on the same string by pressing and plucking it or (4) start a new tone on another string by pressing and plucking it while the previous note continues playing. A composer even could (5) make a second Cello play that note. (1) would be called “slide” or “pitch bend”, (2) would be called “legato”.

Now we want to create the feeling evoked by these articulations while controlling the sound by a completely different tool such as a keyboard (optionally with wheels or a breath controller) or a Seaboard. To make this decently playable, predefined doable gestures on the x-board and controllers need to be translated (and simplified/automated/randomized) to viable sound variations (“articulations”) as provided by the appropriate plugin.

As an example other than legato, with my current hard keyboard I e.g. use a simple but nice Upright-Bass sound (from the NI “Factory selection” for Kontakt, that I got for free when buying their Audio 6 USB interface). Here a slap articulation is simply reproduced when the keyboard sends high velocity Note-On messages. Nice and easily playable.

Another example: for vibrato depth, on a keyboard, it feels rather natural and is easy to learn, to use aftertouch. The Seaboard allows for wiggling your finger for vibrato which is even more natural, but supposedly lass easy to learn. Now with e.g. a physical Cello, a bass, or a guitar the player does exactly this wiggling and creates a kind of pitch-bend vibrato, while with a sax a pitch-bend vibrato is possible to do with modulating the reed (lip) pressure, but the preferred “vibrato” (technically better to be called “tremolo”) is the “diaphragm vibrato”. Same would theoretically be possible by a breath controller (expression), but I seem to be unable to learn to do that. Hence I use aftertouch, which obviously lacks the control of the vibrato speed, which I now control by head tilting left/right via the TEC BBC v2 breath controller. This works nicely for Flute (Tremolo), Trumpet (“shaking”), and Cello (vibrato). Regarding the seaboard for e.g. Flute, it might be viable to use the wiggling as an expression modulation rather than a pitch bend modulation, in case “finger pressing tremolo” is harder to do.

A legato example: The SWAM Flute and Cello instruments feature multiple versions of note transitions, including “legato”. These are automatically detected from the Midi data stream and work very convincingly with a hard keyboard. They are dynamically denoted in the instrument’s GUI when playing. (I need to ask the SWAM team how exactly they do this as well with their “keyboard-” as with their “seaboard-” default settings.) With the Flute and “The Trumpet”, using my hard keyboard and Breath Controller this produces very realistic note transitions without any pitch gliding sound between them. (This indeed is what I need to reproduce with the Seaboard.) On top of that, you can set the software to do a portamento (gliding) between legato notes, with the portamento speed proportional to the velocity of the target note. This feels very natural (easy to learn) and is perfectly usable while controlling the dynamics (expression) with a breath controller.

There are wonderful videos in the Net showing elaborated usage of the Seaboard with very realistic reproductions of the feeling of many different physical instruments, which includes articulations and note transitions that seemingly are easily managed by the (obviously exceptionally talented and well trained) players (such as Marco Parisi and Jordan Rudess): Bass, solo sax, split between a bass and a set of saxes (I especially love this one: -> https://www.youtube.com/watch?v=krlQIHD1YmE), E-Guitar, acoustic Guitar, Cello, two Celli, violin, …

I understand that there are certain settings (channel count, keyboard split, … ), that need to be prepared in the Seaboard itself to allow it to be used for any of such advanced performances.

-Michael

gofer
11-05-2018, 11:25 AM
Is this done by one of the three sliders on the left side the Rise ?

-Michael

Yes.

...the “diaphragm vibrato”. Same would theoretically be possible by a breath controller (expression)...

On a Seaboard you will most often like to control the expression parameter with pressure, eg the ROLI presets that come with SWAM instruments will be set up like that. So you can do tremolo as well as pitch vibrato with ease and have control of the rate. In fact, doing pitch vibrato will inevitably (at least for me) induce a certain amount of pressure changes at the same rate, which I find yields a nice result in combination.

There's nothing stopping you to use your breath controller or expression pedal etc together with a Seaboard, btw. Just have it on the global channel, or if you control a bunch of non-MPE instruments (1 per voice), multiply it onto the channels as needed.

I am pretty confident that SWAM will interpret Seaboard data just as nicely as conventional keyboard data to translate into its note transitions.


As of that Parisi/YolanDa Brown video, we're fully back at square 1... in the comments ROLI say it is SWAM Saxophones, but he plays those polyphonic stabs and chords while the legato seems to work fine. I have no idea what's going on there :eek:.

mschnell
11-05-2018, 11:33 AM
As of that Parisi/YolanDa Brown video, we're fully back at square 1... in the comments ROLI say it is SWAM Saxophones, but he plays those polyphonic stabs and chords while the legato seems to work fine. I have no idea what's going on there :eek:.
Do you have an idea how the keyboard split is done ? (in the ROLI or by some processing). OK, the 49 is a lot "shorter" than the "Grand" :( .

Anyway my far-off target is to do something similar to that video. In fact I do have a (female) saxophonist in my band :) :) :)

Off to the shop...... :) :) :) :) :)

-Michael

gofer
11-05-2018, 12:12 PM
I can't know, of course, but would assume that the split is done via Dashboard.

My far-off target would be to play anything that only remotely resembles what Parisi and the likes show off in vids, but that won't ever happen in my lifetime. Going slow is also extremely enjoyable on the "squishies", so I'm cool with that :D.

Seaboards have the advantage that their touch is kind of addictive, so I have been learning more in the last few month than in 30 years of owning-but-not-really-playing keyboards.

mschnell
11-05-2018, 10:51 PM
I asked Roli support and got this answer:

The Glide dimension of touch allows for smooth legato playing through intelligent Glide tracking and the ability to have different notes occurring on separate MIDI notes. You can find more information on using the Seaboard RISE & GRAND with SWAM Engine here.

They provided these links:
dimension of touch -> https://support.roli.com/support/solutions/articles/36000019157-what-is-5d-touch-
ROLI & SWAM -> You can find more information on using the Seaboard RISE & GRAND with SWAM Engine here.

Seemingly the Seaboard in fact does use a player's intention detecting algorithm called"intelligent Glide tracking". I guess a gesture such as a short glide in the appropriate direction followed by a key hit same pointed to and not too far might be used to detect a non-portamento legato (even tough the link below simply states: "Glide is transmitted as MIDI pitch bend" , which is not "intelligent" at all).
I'll investigate ....

I also asked about how to remote control the Seaboard parameters via Midi, but no answer yet,

-Michael

gofer
11-06-2018, 09:28 AM
I think you're reading far too much into a buzzword there. I can say with confidence that the Blocks don't do anything like you describe and doubt that Rise will. Glide is translated to pitch pretty much directly, except that with Glide sensitivity less than maximum it will correct the pitch when it "thinks" that you stop the Glide movement, it sort of bends it to the nearest straight semitone.

mschnell
11-06-2018, 02:56 PM
Hmmm. Obviously, some magic needs to be going on making legato with multiple voices possible, as we do see in several videos.

I also asked in the SWAM (Audio Modeling) forum, as they do support Rise out of the box by providing a default "Seaboard" parameter setting that can be loaded.

They say it works nice, but legato is a lot less easy to do than with a hard keyboard and needs some dedicated playing practice, and doing trills is really challenging. But the problem, they describe is about Expression (Mapped from Channel Pressure). Here of course finding the right pressure with the target key is not easy. I'll ask more about the latency detection.

-Michael

gofer
11-06-2018, 10:40 PM
I am not certain we see multi-voice legato lines in the saxophone video. Without having listened again, I remember that multiple voices always come in chords and legato as a single line. They might use some time based processing, where notes that come in simultaneously (enough) are distributed to channels per note and when there is more time between notes they all go to the same channel. It is for sure not available in the box with Blocks, and very likely not with Rise, too. If that is what's happening, then by some additional in-line processing.

Re the pressure problem: Out of the box pressure will always ramp up from zero as you hit a new note. I don't find it that problematic with SWAM, but with some Kontakt instruments expression ramps up much more noticeably, so that the attack phase is suppressed far too much. maybe these instruments use a smoothing algorithm for expression that additionally slows down the ramp?
In my script I use a parameter to alter the slope of the pressure values, pivoting around value 127. It basically raises the minimum pressure value, so that I can make pressure not start at zero. I control the parameter with an expression pedal.
Not only does it make the problematic instruments much more playable and may ease playing thrills with SWAM, but it's also nice to have the additional control with Equator and the like.

mschnell
11-09-2018, 12:25 PM
Did you check "PolyThru" -> https://www.strumentimusicali.net/manuali/2018/06/11/21/roli-seaboardgrandstage-en.pdf

Roli seems to provide some kind of pluging that leverages MPE for use with non MPE plugins.

-Michael

gofer
11-09-2018, 02:42 PM
I am using Windows. Also, I can't find any recent info on that program at all. Did it ever get out of beta?

mschnell
11-09-2018, 04:22 PM
I can't find any recent info on that program at all. Neither could I. That is why I asked. In fact I already did a JSFX that leverages MPE to a single channel and averages the three continuous per-key controls (Pitchbend, Channel-Pressure, CC74-Slide) for all "running" channels, to make standard polyphonic sound engines work nicely on MPE streams. I suppose this is what "PolyThru" would do.

Unfortunately I can't test it before I get a Seaboard :( .

-Michael

gofer
11-10-2018, 01:02 AM
If PolyThru isn't mentioned in a recent Rise manual I think we can safely say it has been put on the back burner, or discontinued.
Any info I could find hints at PolyThru being a sort of Vst host which automatically holds multiple instances of the instrument you choose and links their parameters, so it's enough to tweak only one of the instances. Basically what the OP is about. I can't find any hint towards channel reduction and handling of control data for single channel usage.

Re your JSFX:
While I can imagine taking the average may be good for Press and Slide data, I think it's not ideal for Glide. It's a Seaboard paradigm that the keywave you glide to determins the target pitch. When using average pitch you'd always have to glide all active notes to get this behavior. If you for example have two notes running and glide only one of them, then the pitch bend will amount to half of the distance you are gliding, which I'd probably find unintuitive (glide two semitones up on the board amounts to pitch only raising a single semitone).

I'd suppose taking the maximum current pitch value would be better. That way you'd also benefit from the "quantization" of the target pitch that happens on Seaboards.
Thinking about it, the "quantization" may have an unfavourable effect on averaged pitch data, too.

mschnell
11-10-2018, 02:04 AM
Of course the JSFX is configurable on which controls are averaged (up to three: of any CC, Pitch-Bend, and Channel-Pressure).

Making max / min / average configurable seems like a good idea ! I will implement this. (But it might trigger involuntarily harsher jumps than average.)

Regarding slide: if you play a chord and move a finger just very slightly, this value will be the last and hence in a not preprocessed channel merger will be used for all pressed notes. This will force crazy jumps. I don't think that is decently playable. But as said not processing a control already can be configured.

What do you mean by quantization ?

-Michael

gofer
11-10-2018, 02:37 AM
Of course the JSFX is configurable on which controls are averaged (up to three: of any CC, Pitch-Bend, and Channel-Pressure).

Making max / min / average configurable seems like a good idea ! I will implement this. (But it might trigger involuntarily harsher jumps than average.)

Regarding slide: if you play a chord and move a finger just very slightly, this value will be the last and hence in a not preprocessed channel merger will be used for all pressed notes. This will force crazy jumps. I don't think that is decently playable. But as said not processing a control already can be configured.

Seaboard sends Slide reset messages in front of every new note you play (on the same tick, but before the note-on message). I am using max in my script and it plays nicely. As I mentioned before, the only situation I get any considerable value jump is when I play multiple notes and one of them has a considerably higher Slide value than all the others and I stop playing that particular note. In that case the output value will jump back to the value the other notes are using.

No value jumping in that situation with Press, because lifting the finger off a key will gradually lower the pressure value towards zero.


Coming to think of it, I actually have a hunch that the Slide reset messages will cause jumps when taking the average value, while they are filtered when taking max (until all notes are stopped and a new one is coming in). If you choose to take min, then evey new note will make the Slide value jump down to zero. Similar weirdness will probably occur with pressure (it is also reset with new note).

What do you mean by quantization ?

-Michael

When you set the Glide sensitivity to lower than maximum, Seaboard will round the pitch value towards a straight - properly pitched - semitone when it "thinks" that your Glide gesture is coming to an end. The upside is that it's easy to glide to a straight target note. The downside is, that with low glide sensitivity slow glides can sound a bit "wavey", when the rounding happens faster than the actual Glide gesture.



Sorry for the rather heavy editing of this post... It's hard to put my thoughts into words.

mschnell
11-25-2018, 10:32 AM
Finally, I did order a Rise 49, so next week I will know more...
-Michael

Tiggerdyret
11-29-2018, 08:40 AM
Finally, I did order a Rise 49, so next week I will know more...
-Michael

I hope you like it. It's awesome that dedicated people like you guys are into MPE instruments as I'll surely benefit from your ideas too :)

You mentioned earlier in this thread that you already made a plugin to force MPE to a single channel. Where can I get it? I considered doing something similar with a few plugins, but an all in one solution would be welcomed.

I just got an Artiphon, which also has some cool MPE capabilities. It's really sweet, but takes some getting used to. And I also had to reset my exceptions of what I wanted it to be and what it is, but then it turned out to be even better than I'd hoped for.

mschnell
11-29-2018, 02:42 PM
You mentioned earlier in this thread that you already made a plugin to force MPE to a single channel. Where can I get it? I considered doing something similar with a few plugins, but an all in one solution would be welcomed.
Let me check out the Rise (and the plugin) during the weekend...

-Michael

Tiggerdyret
11-30-2018, 10:24 AM
Cool, thanks.

mschnell
12-02-2018, 07:19 AM
Seems to work. Please test and let me know what you find -> http://schnellphoto.de/MPE_2_1

(ReaPack compatible Description in the beginning of the code.)

-Michael

Tiggerdyret
12-03-2018, 04:59 AM
So far it works like a charm. I'll post if issues arise.

Thanks :)

mschnell
12-04-2018, 06:24 AM
Do you want me to add or modify anything, of should I commit it to ReaPack the way it is right now ?

Thanks,
-Michael

Tiggerdyret
12-04-2018, 09:08 AM
It seems to work just like my midi controller does in Single Channel mode. But I haven't tested it thoroughly... I think it's good enough to upload.

What could be nice would be another plugin that sends midi channel 1 cc messages for mod Wheel, sustain pedal, breath, brightness and maybe a few other parameters to all other, bBasically all parameters that affect all voices at the same time. This would make all multi-channel software like Omnisphere or Kontakt MPE-compatible and still have the mod wheel affect all voices. And even if it isn't you could make separate tracks and make it MPE that way.

Roli might have this feature already, but Artiphon I1 doesn't. I did it myself by using "JS: Midi Note Filter" and then "JS: Midi CC Channel Router" on a separate track with a send to my instrument track. I could do without the extra track plus one plugin is better than two, and it could be a bit easier to setup :)

Edit: Here is my thread about the subject. Solger helped me out with the solution: https://forum.cockos.com/showthread.php?t=213960

mschnell
12-08-2018, 01:47 AM
Please find "MIDI MPE to single Channel" in ReaPack !

-Michael

Tiggerdyret
12-08-2018, 03:05 AM
Yes, it was added to Reapack and works :)

babyjaws
01-09-2019, 05:02 AM
you guys ROCK, thanks for this! its great to be able to even monitor what the roli is outputting, and being able to taka an average etc is fantastic, thanks for the work.
do you think somehow being able to convert the non cc values like aftertouch and lift velocity to a usable CC could be incorporated into this? could be the all in one solution for ROLI REAPER heads!
anyway cheers!

mschnell
01-09-2019, 06:38 AM
do you think somehow being able to convert the non cc values like aftertouch and lift velocity to a usable CC could be incorporated into this? could be the all in one solution for ROLI REAPER heads!
anyway cheers!

"Midi convert to CC" also is available in ReaPack. (Bug: the second "Midi Message" selection of "Note On Velocity" should read "Note Off Velocity" :( )

[Edit: Bug fixed ! ]

Reaper Rocks !!!
-Michael

mschnell
01-09-2019, 06:55 AM
BTW.: Regarding Glide:

Now that I do have a Rise 49, and use it in standard configuration (no tweaking by the Dashboard):

Hitting the Keywaves-pad anywhere always creates a not shifted semitone (PitchBend zero).

Hitting a second spot does a glide when it is within a semitone distance, otherwise it starts a new note. Hence doing a decent trill is not possible in this setting even with the current version of "MIDI MPE to single Channel". I supposedly will try to enhance "MIDI MPE to single Channel" to detect a semitone hopping PitchBend and convert this to a note-on in "Mono" mode.

To do a glide of any width you can instead use a "natural" gesture with a single finger, but for a keyboarder that is rather uncommon and it's hampered by the "keywave" structure.

Alternatively I am still considering to try to send a "Dashboard" SysEx configuration message to the Rise when initiating a Patch change.

-Michael

mschnell
01-10-2019, 06:54 AM
Edit:


Astonishingly, with some of the Equator stock sounds you can hit two adjacent semitones and get both notes (which would be good for trills).

I need to research if/how Equator sends this configuration change to the Rise.

-Michael

mschnell
01-16-2019, 11:36 AM
Edit again:

I found that the said behavior (glide instead of new note-on when pressing a semitone distance "key") occurs exactly when the "<>" slider is at maximum.

Now Equator seems to send a Midi Message to the Rise and moves this slider when changing to a new patch.

Now we need to find out the Midi messages that are at work here.

-Michael

mschnell
01-16-2019, 02:38 PM
Now we need to find out the Midi messages that are at work here.
Hmmm.

The Equator VST does not seem to generate any Midi (hence the Rise's faders stay put when Equator changes a patch, and the ReaControlMidi log does not show any messages).

The stand alone Equator software does have a menu to select the Midi source if there are more than just the Rise, but does not say anything about the Midi target.


-Michael

mschnell
01-16-2019, 03:02 PM
Edit:

(Using LoopMidi and Reaper) I found that with a some patch change Equator (stand-alone) sends a SysEx:

F0 00 21 10 78 3d 17 XX F7

with e.g. XX = 32, 7B, 7C, or 7F.

It seems like XX is the position of the "<>" slider of the Rise. Supposedly 7F meaning "full" -> Semitone glide.

This does seem rather easy to support ...

-Michael

mschnell
01-16-2019, 04:11 PM
Question:

Do the Grand and the Blocks also adhere to this parameter if sent as a SysEx, even though they don't feature a visible slider for it ?


Another question:

How is the setting visible/doable in an Equator patch ?

-Michael

gofer
01-17-2019, 09:31 AM
Red, a mod at Roli's support forum said this about controlling Rise via MIDI:

Red on Roli support forum


Here are the main MIDI messages used to configure the Seaboard RISE.


Note 1: if you send the RISE a message that corresponds with a different (unpublished) message, it is possible to change the settings so as to make it temporarily unusable, in which case you may need to manually reinstall the firmware. Sending these messages is not officially supported, and so you do so at your own risk.

Note 2: BLOCKS use the BLOCKS API rather than these messages, and it's not currently feasible to control BLOCKS remotely outside of using the BLOCKS API. For details on developing with BLOCKS, please see https://juce.com/blocks

Helpful hint: you may use a MIDI monitor application like SNoize's MIDI Monitor to "spy" on the communication between ROLI Dashboard and the Seaboard RISE. You'll see these messages correspond to the changes you make within ROLI Dashboard.

And now to the RISE's configuration MIDI messages:

SysEx messages
8: Pedal CC (0–119)
14: Use global channel? (0–1)
20: Left MIDI Touch Fader position (0–127)
21: Middle MIDI Touch Fader position (0–127)
22: Right MIDI Touch Fader position (0–127)
23: Glide sensitivity (0–127)
24: Slide sensitivity (0–127)
25: Press sensitivity (0–127)
26: Strike sensitivity (0–127)
27: Lift sensitivity (0–127)
28: Left Touch Fader MIDI CC (0–127)
29: Middle MIDI Touch Fader CC (0–127)
30: Right MIDI Touch Fader CC (0–127)
35: XY Touchpad X CC (0–127)
36: XY Touchpad Y CC (0–127)
RPN
0: Pitch bend range (1–96)
6: Zone start channel (sent on the desired zone start channel)
6: Zone end channel
6: Zone global channel
NRPN
0: Glide/Slide tracking mode (0–4)
2: Pitch octave (0–8); 4 is default
3: Pitch semitone transposition (53–75); 64 is default
4: Press tracking mode (0–4)


https://support.roli.com/support/discussions/topics/36000005031

These are decimal values, in the SysEx cases you probably need to put them (converted to hex) at the place before XX and keep the rest of the header (17 in your example message translates neatly to 23 mentioned by Red as Glide sensitivity)

Apparently Blocks are not supported :(, not sure about the Grand.

mschnell
01-18-2019, 07:23 AM
Match ! -> 23 decimal = 17 Hex is "Glide sensitivity". :)

I'll do a littkle JSFX that converts Midi CCs to SysEx. I'll of course upload it to ReaPack.

-Michael

gofer
01-19-2019, 05:52 AM
It will be interesting whether that same header works for all Rises, or whether you'll have to change a device identifier byte in the SysEx header to address a different Rise.
In any case I think you should post the SysEx header you found works in that Roli forum thread, seeing that Red didn't mention it and that the parameter number without header is of little use for interested folk.

Red also didn't fully specify RPN/NRPN (is the address he mentions MSB or LSB?). A little detective work will reveil them, I'm sure ;).

mschnell
01-20-2019, 12:26 AM
Using this (including the "Midi CC to SysEX" JSFX), I was able to do a (three track) Reaper project for Live playing the Rise with the Equator VST, while using my XTouch Compact to change the patches in Equator.

My original JSFX "Live Rack with XTouch" infrastructure (in one track) sends out lots of CC messages with any patch change due to pressing a button. These now are converted to send a Program Change message to Equator to change it's patch and at the same time "Midi CC to SysEX" sends three SysEx messages to the Seaboard to set it's Glide-, Slide-, and Press- sensitivity according to my taste for the appropriate patch. (This perfectly solves the "Semitone to Glide or to second note" problem, which otherwise would prevent doing trills and similar sound engine based note transitions features.)

Next tasks:
- Integrate this in the "Life Rack" project used with the other keyboards and VSTs.
- Allow for using other VSTs to be played with the Rise (by means of the "MPE to single channel" JSFX).
- Allow for VSTs to be controlled by Rise and TC BBCv2 "Dimensions" at the same time.
- Drop the second "hard" keyboard in my live setup :) .
- Can I remotely switch the Rise "Faders" between "Dimension Control" and "CC" mode ?
- Allow for live tweaking Equator parameters by the XTouch controlled knobs/faders/presets and/or the BBCv2. (Does Equator receive any CCs or would always DAW parameters need to be used ? )

-Michael

mschnell
01-20-2019, 12:32 AM
Red also didn't fully specify RPN/NRPN
What exactly is RPN/NRPN after all ?

-Michael

gofer
01-20-2019, 11:31 AM
In a nutshell, RPN and NRPN are a clutchy way to make more parameters controllable with the 128 possible CC numbers. Done by interpreting a combination of CC numbers as an address, the value of which is then changed by another combination of CC numbers.

- CC101 = RPN MSB
- CC100 = RPN LSB

- CC 99 = NRPN MSB
- CC 98 = NRPN lSB

both adresses share the same CC for the value change
- CC6 = Data Entry MSB
- CC38 = Data Entry LSB (optionally, if the value range extends 128)

That means, you can have either one RPN or one NRPN address listen to data entry at any given time (but can rather rapidly switch between them).
It also means that once you have specified a valid RPN or NRPN address, any spurious CC6 or CC38 will change that parameter. To clear the assigned address you can send
CC101 = 127
CC100 = 127
CC99 = 127
CC98 =127

RPN (registered parameter numbers) are defined in the MIDI specs to have specific tasks, for example for setting the pitch bend range. That's similar to how CC10 is agreed to be MIDI channel pan. NRPN are open for developers to do what they want with.

To do a pitch bend range change on a compatible device you send:
- CC101 (RPN MSB) value 0
- CC100 (RPN LSB) value 0 (these two set the parameter address)
- CC6 (Data Entry MSB) value n (n = semitones)This sets the value for the latest assigned address

and optionally, to leave the place neat and clean:
- CC101 127
- CC100 127
all on the channel you want the pitch bend range be changed on.

Red doesn't mention the channel on which it should be sent for an MPE device, but I'd try the global channel first. Maybe it's even per zone?

All RPNs in the MIDI specs have MSB = 0, so I assume that RPN 6 which sets the Zones in Red's post means the LSB is 6 and you send those messages on the channel you want to assign?

The NRPN parameters look interesting, too. A patch change in your setup could for example also change the octave setting of the Rise to your liking. Red doesn't specify the channel, nor whether his address number is MSB or LSB but a little experiment should give you an answer.

Too bad I can't do all that stuff with Blocks :(

mschnell
01-22-2019, 01:54 PM
Uploaded "Midi CC to SysEX" to Reapack...

-Michael