10-31-2018, 03:09 AM | #41 |
-blänk-
Join Date: Jun 2008
Posts: 11,359
|
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. Last edited by gofer; 10-31-2018 at 03:32 AM. |
10-31-2018, 07:34 AM | #42 |
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,784
|
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 |
10-31-2018, 09:24 AM | #43 | |
Human being with feelings
Join Date: Mar 2007
Location: Denver, CO
Posts: 633
|
Quote:
Am I missing something? Can you explain what you are trying to do in musical performance terms? |
|
10-31-2018, 11:36 AM | #44 | ||
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,784
|
Quote:
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. Quote:
- 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 Last edited by mschnell; 10-31-2018 at 11:49 AM. |
||
10-31-2018, 12:29 PM | #45 |
-blänk-
Join Date: Jun 2008
Posts: 11,359
|
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. |
10-31-2018, 01:04 PM | #46 | |
-blänk-
Join Date: Jun 2008
Posts: 11,359
|
Quote:
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. |
|
10-31-2018, 02:09 PM | #47 |
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,784
|
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 Last edited by mschnell; 10-31-2018 at 02:19 PM. |
10-31-2018, 02:13 PM | #48 |
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,784
|
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: Code:
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,15,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); ); ); ); |
10-31-2018, 02:14 PM | #49 |
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,784
|
too long or a forum message.
Part 2 (debug grapics) : Code:
@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); */ |
10-31-2018, 02:38 PM | #50 |
-blänk-
Join Date: Jun 2008
Posts: 11,359
|
I hope this link to the SysEx info works:https://support.roli.com/support/dis.../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. Last edited by gofer; 10-31-2018 at 03:13 PM. |
10-31-2018, 03:33 PM | #51 |
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,784
|
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 |
10-31-2018, 03:54 PM | #52 |
-blänk-
Join Date: Jun 2008
Posts: 11,359
|
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... |
10-31-2018, 04:00 PM | #53 |
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,784
|
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 |
10-31-2018, 04:15 PM | #54 |
-blänk-
Join Date: Jun 2008
Posts: 11,359
|
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.
|
10-31-2018, 05:11 PM | #55 |
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,784
|
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 Last edited by mschnell; 11-01-2018 at 01:30 AM. |
10-31-2018, 05:15 PM | #56 | |
-blänk-
Join Date: Jun 2008
Posts: 11,359
|
Quote:
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. |
|
10-31-2018, 05:40 PM | #57 | |
-blänk-
Join Date: Jun 2008
Posts: 11,359
|
Quote:
|
|
11-01-2018, 01:43 AM | #58 |
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,784
|
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 Last edited by mschnell; 11-01-2018 at 05:31 AM. |
11-01-2018, 01:49 AM | #59 |
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,784
|
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 Last edited by mschnell; 11-01-2018 at 05:32 AM. |
11-02-2018, 11:33 PM | #60 |
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,784
|
Any further thoughts ?
-Michael |
11-03-2018, 03:20 AM | #61 |
-blänk-
Join Date: Jun 2008
Posts: 11,359
|
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. |
11-03-2018, 04:13 AM | #62 | |||||
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,784
|
Quote:
Quote:
Quote:
Quote:
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. Quote:
Thanks for your comments, -Michael Last edited by mschnell; 11-03-2018 at 04:22 AM. |
|||||
11-03-2018, 05:03 AM | #63 | ||||
-blänk-
Join Date: Jun 2008
Posts: 11,359
|
Quote:
Quote:
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??? Quote:
Quote:
Now I really need to catch some sunlight, later |
||||
11-03-2018, 12:05 PM | #64 |
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,784
|
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 Last edited by mschnell; 11-03-2018 at 12:13 PM. |
11-03-2018, 10:07 PM | #65 | |
Human being with feelings
Join Date: Mar 2007
Location: Denver, CO
Posts: 633
|
Quote:
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 |
|
11-03-2018, 10:55 PM | #66 |
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,784
|
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 Last edited by mschnell; 11-03-2018 at 11:01 PM. |
11-04-2018, 10:16 AM | #67 |
-blänk-
Join Date: Jun 2008
Posts: 11,359
|
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... Last edited by gofer; 11-04-2018 at 11:22 AM. |
11-04-2018, 11:18 AM | #68 |
-blänk-
Join Date: Jun 2008
Posts: 11,359
|
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).
|
11-04-2018, 03:30 PM | #69 |
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,784
|
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 |
11-04-2018, 05:18 PM | #70 | |
Human being with feelings
Join Date: May 2016
Posts: 430
|
Quote:
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...) |
|
11-04-2018, 06:44 PM | #71 | |
Human being with feelings
Join Date: Mar 2007
Location: Denver, CO
Posts: 633
|
Quote:
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. |
|
11-04-2018, 11:36 PM | #72 | ||
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,784
|
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 ?!?!? Quote:
Quote:
What exactly will the ROLI send when you press a "key" and slide your finger to the next (or second next or ...) ? -Michael Last edited by mschnell; 11-05-2018 at 07:44 AM. |
||
11-05-2018, 12:59 AM | #73 | |||
-blänk-
Join Date: Jun 2008
Posts: 11,359
|
Quote:
Quote:
Quote:
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. Last edited by gofer; 11-05-2018 at 01:12 AM. |
|||
11-05-2018, 01:49 AM | #74 | |
-blänk-
Join Date: Jun 2008
Posts: 11,359
|
Quote:
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. Last edited by gofer; 11-05-2018 at 02:04 AM. |
|
11-05-2018, 07:42 AM | #75 | |
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,784
|
Quote:
... 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 Last edited by mschnell; 11-05-2018 at 08:25 AM. |
|
11-05-2018, 08:22 AM | #76 | |
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,784
|
Quote:
-Michael |
|
11-05-2018, 08:23 AM | #77 |
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,784
|
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 Last edited by mschnell; 11-05-2018 at 08:36 AM. |
11-05-2018, 11:25 AM | #78 | ||
-blänk-
Join Date: Jun 2008
Posts: 11,359
|
Quote:
Quote:
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 . |
||
11-05-2018, 11:33 AM | #79 | |
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,784
|
Quote:
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 |
|
11-05-2018, 12:12 PM | #80 |
-blänk-
Join Date: Jun 2008
Posts: 11,359
|
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 . 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. Last edited by gofer; 11-05-2018 at 12:19 PM. |
Thread Tools | |
Display Modes | |
|
|