Go Back   Cockos Incorporated Forums > REAPER Forums > REAPER for Live Use

Reply
 
Thread Tools Display Modes
Old 10-31-2018, 03:09 AM   #41
gofer
-blänk-
 
gofer's Avatar
 
Join Date: Jun 2008
Posts: 11,359
Default

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.
gofer is offline   Reply With Quote
Old 10-31-2018, 07:34 AM   #42
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
Default

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
mschnell is online now   Reply With Quote
Old 10-31-2018, 09:24 AM   #43
woodslanding
Human being with feelings
 
woodslanding's Avatar
 
Join Date: Mar 2007
Location: Denver, CO
Posts: 633
Default

Quote:
Originally Posted by mschnell View Post
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?
__________________
eric moon
Very Stable Genius
https://gogolab.com/
woodslanding is offline   Reply With Quote
Old 10-31-2018, 11:36 AM   #44
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
Default

Quote:
Originally Posted by woodslanding View Post
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.

Quote:
Originally Posted by woodslanding View Post
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

Last edited by mschnell; 10-31-2018 at 11:49 AM.
mschnell is online now   Reply With Quote
Old 10-31-2018, 12:29 PM   #45
gofer
-blänk-
 
gofer's Avatar
 
Join Date: Jun 2008
Posts: 11,359
Default

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 is offline   Reply With Quote
Old 10-31-2018, 01:04 PM   #46
gofer
-blänk-
 
gofer's Avatar
 
Join Date: Jun 2008
Posts: 11,359
Default

Quote:
Originally Posted by mschnell View Post
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.
gofer is offline   Reply With Quote
Old 10-31-2018, 02:09 PM   #47
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
Default

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.
mschnell is online now   Reply With Quote
Old 10-31-2018, 02:13 PM   #48
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
Default

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);      
    );
  );
);
mschnell is online now   Reply With Quote
Old 10-31-2018, 02:14 PM   #49
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
Default

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);
*/
mschnell is online now   Reply With Quote
Old 10-31-2018, 02:38 PM   #50
gofer
-blänk-
 
gofer's Avatar
 
Join Date: Jun 2008
Posts: 11,359
Default

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.
gofer is offline   Reply With Quote
Old 10-31-2018, 03:33 PM   #51
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
Default

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
mschnell is online now   Reply With Quote
Old 10-31-2018, 03:54 PM   #52
gofer
-blänk-
 
gofer's Avatar
 
Join Date: Jun 2008
Posts: 11,359
Default

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...
gofer is offline   Reply With Quote
Old 10-31-2018, 04:00 PM   #53
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
Default

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
mschnell is online now   Reply With Quote
Old 10-31-2018, 04:15 PM   #54
gofer
-blänk-
 
gofer's Avatar
 
Join Date: Jun 2008
Posts: 11,359
Default

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.
gofer is offline   Reply With Quote
Old 10-31-2018, 05:11 PM   #55
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
Default

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.
mschnell is online now   Reply With Quote
Old 10-31-2018, 05:15 PM   #56
gofer
-blänk-
 
gofer's Avatar
 
Join Date: Jun 2008
Posts: 11,359
Default

Quote:
Originally Posted by mschnell View Post
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 is offline   Reply With Quote
Old 10-31-2018, 05:40 PM   #57
gofer
-blänk-
 
gofer's Avatar
 
Join Date: Jun 2008
Posts: 11,359
Default

Quote:
Originally Posted by mschnell View Post
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.
gofer is offline   Reply With Quote
Old 11-01-2018, 01:43 AM   #58
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
Default

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.
mschnell is online now   Reply With Quote
Old 11-01-2018, 01:49 AM   #59
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
Default

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.
mschnell is online now   Reply With Quote
Old 11-02-2018, 11:33 PM   #60
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
Default

Any further thoughts ?

-Michael
mschnell is online now   Reply With Quote
Old 11-03-2018, 03:20 AM   #61
gofer
-blänk-
 
gofer's Avatar
 
Join Date: Jun 2008
Posts: 11,359
Default

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.
gofer is offline   Reply With Quote
Old 11-03-2018, 04:13 AM   #62
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
Default

Quote:
Originally Posted by gofer View Post
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.

Quote:
Originally Posted by gofer View Post
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. )

Quote:
Originally Posted by gofer View Post
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.

Quote:
Originally Posted by gofer View Post
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.


Quote:
Originally Posted by gofer View Post
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.


Quote:
Originally Posted by gofer View Post
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

Last edited by mschnell; 11-03-2018 at 04:22 AM.
mschnell is online now   Reply With Quote
Old 11-03-2018, 05:03 AM   #63
gofer
-blänk-
 
gofer's Avatar
 
Join Date: Jun 2008
Posts: 11,359
Default

Quote:
Originally Posted by mschnell View Post

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).


Quote:
Originally Posted by mschnell View Post
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???

Quote:
Originally Posted by mschnell View Post
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?

Quote:
Originally Posted by mschnell View Post
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 . 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
gofer is offline   Reply With Quote
Old 11-03-2018, 12:05 PM   #64
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
Default

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.
mschnell is online now   Reply With Quote
Old 11-03-2018, 10:07 PM   #65
woodslanding
Human being with feelings
 
woodslanding's Avatar
 
Join Date: Mar 2007
Location: Denver, CO
Posts: 633
Default

Quote:
Originally Posted by mschnell View Post
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
__________________
eric moon
Very Stable Genius
https://gogolab.com/
woodslanding is offline   Reply With Quote
Old 11-03-2018, 10:55 PM   #66
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
Default

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.
mschnell is online now   Reply With Quote
Old 11-04-2018, 10:16 AM   #67
gofer
-blänk-
 
gofer's Avatar
 
Join Date: Jun 2008
Posts: 11,359
Default

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.
gofer is offline   Reply With Quote
Old 11-04-2018, 11:18 AM   #68
gofer
-blänk-
 
gofer's Avatar
 
Join Date: Jun 2008
Posts: 11,359
Default

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).
Attached Files
File Type: mid MPE test legato two lines.MID (2.3 KB, 131 views)
gofer is offline   Reply With Quote
Old 11-04-2018, 03:30 PM   #69
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
Default

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
mschnell is online now   Reply With Quote
Old 11-04-2018, 05:18 PM   #70
Bansaw
Human being with feelings
 
Bansaw's Avatar
 
Join Date: May 2016
Posts: 430
Default

Quote:
Originally Posted by kilna View Post
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...)
Bansaw is offline   Reply With Quote
Old 11-04-2018, 06:44 PM   #71
woodslanding
Human being with feelings
 
woodslanding's Avatar
 
Join Date: Mar 2007
Location: Denver, CO
Posts: 633
Default

Quote:
Originally Posted by mschnell View Post
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.
__________________
eric moon
Very Stable Genius
https://gogolab.com/
woodslanding is offline   Reply With Quote
Old 11-04-2018, 11:36 PM   #72
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
Default

Quote:
Originally Posted by woodslanding View Post
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 ?!?!?
Quote:
Originally Posted by woodslanding View Post
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.

Quote:
Originally Posted by woodslanding View Post
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

Last edited by mschnell; 11-05-2018 at 07:44 AM.
mschnell is online now   Reply With Quote
Old 11-05-2018, 12:59 AM   #73
gofer
-blänk-
 
gofer's Avatar
 
Join Date: Jun 2008
Posts: 11,359
Default

Quote:
Originally Posted by mschnell View Post
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).


Quote:
Originally Posted by mschnell View Post
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.

Quote:
Originally Posted by mschnell View Post
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.

Quote:
Originally Posted by mschnell View Post
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.

Last edited by gofer; 11-05-2018 at 01:12 AM.
gofer is offline   Reply With Quote
Old 11-05-2018, 01:49 AM   #74
gofer
-blänk-
 
gofer's Avatar
 
Join Date: Jun 2008
Posts: 11,359
Default

Quote:
Originally Posted by gofer View Post
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.

Last edited by gofer; 11-05-2018 at 02:04 AM.
gofer is offline   Reply With Quote
Old 11-05-2018, 07:42 AM   #75
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
Default

Quote:
Originally Posted by gofer View Post
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

Last edited by mschnell; 11-05-2018 at 08:25 AM.
mschnell is online now   Reply With Quote
Old 11-05-2018, 08:22 AM   #76
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
Default

Quote:
Originally Posted by gofer View Post
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 is online now   Reply With Quote
Old 11-05-2018, 08:23 AM   #77
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
Default

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.
mschnell is online now   Reply With Quote
Old 11-05-2018, 11:25 AM   #78
gofer
-blänk-
 
gofer's Avatar
 
Join Date: Jun 2008
Posts: 11,359
Default

Quote:
Originally Posted by mschnell View Post
Is this done by one of the three sliders on the left side the Rise ?

-Michael
Yes.

Quote:
Originally Posted by mschnell View Post
...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 .
gofer is offline   Reply With Quote
Old 11-05-2018, 11:33 AM   #79
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
Default

Quote:
Originally Posted by gofer View Post
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 .
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
mschnell is online now   Reply With Quote
Old 11-05-2018, 12:12 PM   #80
gofer
-blänk-
 
gofer's Avatar
 
Join Date: Jun 2008
Posts: 11,359
Default

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.
gofer is offline   Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -7. The time now is 03:51 PM.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2024, vBulletin Solutions Inc.