Old 02-28-2018, 03:14 PM   #41
pipelineaudio
Mortal
 
pipelineaudio's Avatar
 
Join Date: Jan 2006
Location: Wickenburg, Arizona
Posts: 12,428
Default

Let me see if I have this right:

1:1=1 1:1=2 // CC # 0

Channel 1, CC #1 value 0 selects row 1, channel 1 cc #1 value 0 sends cc #2 value 0?
__________________
REAPER Shirts are Back! - https://shop.spreadshirt.com/pipelineaudio/
pipelineaudio is offline   Reply With Quote
Old 02-28-2018, 11:11 PM   #42
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Germany
Posts: 5,693
Default

Nope.

The sliders in the GUI define which channel and CC # are used to select a row in the "Spreadsheet" (= line in the configuration file selected). (similar to what is "learned" by LiveConfigs)

The value of an incoming CC accesses the row of the appropriate number: Value 0 accesses the first row, Value 1 accesses the second row etc (similarto the working of LiveConfigs)

The term "// CC # 0" I wrote in the example file is just a comment without any functionality ("/" starts a comment until end of the line) and was written to make clear that this row / line will be activated when a CC (Channel and CC # according to the sliders) with value 0 is received.

"1:1=1 1:1=2"

means: when this line is accessed (or activated) first send out CC#1 value 1 on channel 1, then send out CC#1 value 2 on channel 1.

adding "6:7:8" as a third term (after a blank) in that line would mean: then send out CC#7 value 8 on channel 6.

etc

adding "9:10" as a forth term (after a blank) in that line would mean: then send out CC#10 value 0 on channel 9 (as providing the CC value is optional).

-Michael
__________________
www.boa-sorte.de
mschnell is offline   Reply With Quote
Old 03-01-2018, 03:00 PM   #43
briandress
Human being with feelings
 
Join Date: Dec 2016
Posts: 66
Default

so each line of the "config" file corresponds to a CC number.
when the CC corresponding to that line comes in then it sends the codes on that line.

so for
Code:
1:64 1:65   // CC # 0
1:66 1:67 < 1:64 1:65 // CC#1
// CC #2 empty

This will send out 64 and 65 when 0 comes in

will send 66 and 67 when 1 comes in and also turn off 64 and 65

right?
briandress is offline   Reply With Quote
Old 03-01-2018, 10:46 PM   #44
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Germany
Posts: 5,693
Default

Quote:
Originally Posted by briandress View Post
This will send out 64 and 65 when 0 comes in

will send 66 and 67 when 1 comes in and also turn off 64 and 65

right?
"send out 64..." is correct, but not a complete definition. Each Midi CC message holds three values: Midi channel (1..16), CC number (0..127) and Value (0..127), all of which can be defined in the file.

So the second line defines:

When a CC value of 1 is received (with the Midi channel and CC number defined by the "in" sliders), it will send out "CC 66" on channel 1 with value 0, and "CC 67" on channel 1 with value 0.

Additionally, when "Configs" Mode is set, and the last CC received had value 1 and hence row "1" is active, when a CC with some other value is received to select another row, it will send out CC number 64 and CC number 65 both on channel 1 and with value 0.

If you intend to use this to fire dedicated On and Off actions, this seems appropriate (learning the "On" actions to the CCs 64 and 65, and the "Off" to the CCs 66 and 67.

If you want to toggle an on/off switch in a plugin, that supposedly will use the CC values on a dedicated CC message you will do
Code:
// CC #0: no definition
1:64=127 1:65=127<1:64=0 1:65=0 // CC#1 := "on" any other: "off"
BTW.: Please don't surround the "<" by blanks, as in the current preliminary version this might cause an inappropriate result. Please take a look at the graphic shown by the JSFX to see what it made from the file content.

-Michael
__________________
www.boa-sorte.de
mschnell is offline   Reply With Quote
Old 03-02-2018, 01:40 PM   #45
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Germany
Posts: 5,693
Default

@Pipe and briandress:
To me, the syntax seems extremely simple and straight forward (of course, I did invent it ). I'd be really happy if I would get testing results form you !

Do you see the "spreadsheet" in the JSFX ?

Here an updated version.
1) multiple blanks are allowed to be inserted between the definitions, also before and after the "<"

2) The graphic has been improved and now really looks like a spreadsheet.

here you are:
Code:
// Author: Michael Schnell, 

desc:Midi CC Table

slider1:/cc table:none:CC Table
slider2:0<0,1,1{Map,Configs}>Function
slider3:0<0,15,1{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}>MIDI Input Channel
slider4:1<0,127,1{0 Bank Sel M,1 Mod Wheel M,2 Breath M,3,4 Foot P M,5 Porta M,6 Data Entry M,7 Vol M,8 Balance M,9,10 Pan M,11 Expression M,12 Ctrl 1 M,13 Ctrl 2 M,14,15,16 GP Slider 1,17 GP Slider 2,18 GP Slider 3,19 GP Slider 4,20,21,22,23,24,25,26,27,28,29,30,31,32 Bank Sel L,33 Mod Wheel L,34 Breath L,35,36 Foot P L,37 Porta L,38 Data Entry L,39 Vol L,40 Balance L,41,42 Pan L,43 Expression L,44 Ctrl 1 L,45 Ctrl 2 L,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64 Hold P sw,65 Porta sw,66 Sustenuto sw,67 Soft P sw,68 Legato P sw,69 Hold 2 P sw,70 S.Variation,71 S.Timbre,72 S.Release,73 S.Attack,74 S.Brightness,75 S.Ctrl 6,76 S.Ctrl 7,77 S.Ctrl 8,78 S.Ctrl 9,79 S.Ctrl 10,80 GP B.1 sw,81 GP B.2 sw,82 GP B.3 sw,83 GP B.4 sw,84,85,86,87,88,89,90,91 Effects Lv,92 Trem Lv,93 Chorus Lv,94 Celeste Lv,95 Phaser Lv,96 Data B. Inc,97 Data B. Dec,98 NRP L,99 NRP M,100 RP L,101 RP M,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127}>CC Input

@init

//#font = "Courier New";
//#font = "Liberation Mono";
#font = "";  // Default

//FUNCTIONS for reading .txt files
//offset = starting string number
//returns number of lines read

cols   = 32;
cols3  = cols*3;
cols23 = cols3*2;
//cc_nr_i  = 0*rows;
//cc_val_i = 1*rows;

ssb = 0;             // Spread sheet base


function slider_file_to_numbered_strings(slidernumber,offset)local(handle,lastvalue,lines)
//USE ONLY THE NUMBER OF THE SLIDER FOR "slidernumber"  - do not use "sliderx"
(

  slider(slidernumber) != lastvalue ? reload=0;
  
  !reload ? (
    handle=file_open(slider(slidernumber));
    file_string(handle,offset);  
    while( strlen(offset) && offset < 1023 )
      ( offset+=1;
        file_string(handle,offset);      
      );
    file_close(file);
    lines=offset;
    lastvalue=slider(slidernumber);
    reload=1;
  );
  lines;
); 
  
@slider
  conf        = slider2;
  inChannel   = slider3;
  modcc       = slider4;
  
  act = -1;
  pre = -1;

  lines = slider_file_to_numbered_strings(1, 0);

  row = 0; 
  loop(lines, 
    #s = strcpy(#, row);
    o   = 0;
    col = 0;
    cc  = -1;
    l   = strlen(#s);
    src = ssb + row*cols23 + col*3;
    src[0]     = -1;
    src[cols3] = -1;
    digit = 0;
    while (o < l) (
      c = '0';
      j = 0;
      while ((c >= '0') && (c <= '9')) (
        digit = 1;
        j *= 10;
        j += c-'0';
        c = str_getchar(#s, o, 'c');
        o += 1;
      );  
      c == ':' ? (                           // Channel
        digit ? src[0] = j-1;
//        ___0 = j;
       ) : c == '=' ? (                      // CC #
        src[1] = j;       
        cc = j;
//        ___1 = j;
       ) : (c == ' ') || (c == 13) || (c == '<') || (c == '/' || (o > l) )? (       // Value
        cc >= 0 ? (
          src[2] = j;
//          ___2 = j;
         ) : (
          src[1] = j;
//          ___1 = j;
          src[2] = 0;
//          ___2 = 0;
        );  
        src[0] >= 0 ? col += 1;
        cc = -1;
        src = ssb + row*cols23 + col*3;
//        ___s = src; 
        src[0] = -1;
        c == '/' ? o = 999;              // abort line
        c == '<' ? (
          col = cols;                    // go on in this row
          src = ssb + row*cols23 + col*3;   
//          ___s1 = src; 
//          c = '0';
//          j = 0;
//          src[0] = -1;      
        );
      );  
    );
    row+=1;
  );
//  ___n  = 5*cols23;
//  ___x  = ssb[___n];
//  ___n1 = 5*cols23 + cols3;
//  ___x1 = ssb[___n1];
//  ___n2 = 5*cols23 + cols3 + 1;
//  ___x2 = ssb[___n2];
    

@block
  while (midirecv(offset, msg1, msg2, msg3)) (
    status = msg1 & $xF0;      // Extract message type
    channel = msg1 & $x0F;
    channel == inChannel ? (   // Is it on our channel?
      status == $xB0 ? (       // Is it a controller event?
        msg2 == modcc ? (      // Is it the right CC?
          ci = msg3;
          ci < row ? (
            conf ? (
              act = ci;
            );  
            act != pre ? (
              conf ? (
                cj  = 0;
                coli = pre * cols23 + cols3;
                src = ssb + coli /*+ cj*3*/;
                while (src[0] >= 0) ( 
                  midisend(offset, $xB0+src[0],  src[1],  src[2]); 
                  cj += 1;
                  src += 3;
                );
              );  
              cj  = 0;
              coli = ci * cols23;
              src = ssb + coli /*+ cj*3*/;
              while (src[0] >= 0) ( 
                midisend(offset, $xB0+src[0],  src[1],  src[2]); 
                cj += 1;
                src += 3;
              );
              pre = act;
            );  
          );
        );
      );
    );          
    midisend(offset, msg1, msg2, msg3); // pass through
  );
  
@gfx 650 450  
  //display file
  gfx_r=gfx_g=gfx_b=0; gfx_a=1;
  gfx_x=gfx_y=0;
  gfx_rectto(gfx_w,gfx_h);
  
  gfx_setfont(2,#font,18);
  textw = gfx_texth * 0.6;
  gfx_r=1;gfx_g=gfx_b=1;
  xx = 10;
  yy =10; 
  gfx_x=xx;gfx_y=yy;
  i  = 0;
  rm = 0;
  loop ( row,
    i == act ? (
      gfx_r=1;gfx_g=1;gfx_b=0;
     ) : (
      gfx_r=0.7;gfx_g=0.7;gfx_b=0.7;
    ); 
    ssb[i*cols23 /* + 0*3 + 0 */  ] >= 0 ? (
      gfx_x=xx;
      #t = sprintf(#, "%d", i);
      gfx_drawstr(#t);
      gfx_x = xx + 3*textw;
      gfx_drawstr(">>");
      j = 0;
      srb = ssb + i*cols23;
      while ((srb[0] >= 0) && (j < cols)) ( 
        #t = sprintf(#, "%d:%d=%d  ", srb[0]+1, srb[1], srb[2]); 
        gfx_x = xx + (6+9*j)*textw;
        gfx_drawstr(#t);
        j += 1;
        srb += 3;
      );   
      gfx_y+=gfx_texth;      
      rm < j ? rm = j;
    );  

    ssb[i*cols23 + cols3 /* + 0*3 + 0 */  ] >= 0 ? (
      gfx_x=xx;
      #t = sprintf(#, "%d", i);
      gfx_drawstr(#t);
      gfx_x = xx + 3*textw;
      gfx_drawstr("<<");
      j = 0;
      srb = ssb + i*cols23 + cols3;
      while ((srb[0] >= 0) && (j < cols)) ( 
        #t1 = sprintf(#, "%d:%d=%d  ", srb[0]+1, srb[1], srb[2]); 
        gfx_x = xx + (6+9*j)*textw;
        gfx_drawstr(#t1);
        j += 1;
        srb += 3;
      );  
      gfx_y+=gfx_texth;
      rm < j ? rm = j;
    );  
    (ssb[i*cols23] >= 0) ||  (ssb[i*cols23+cols3 ] >= 0) ?  (
      gfx_x = 0;   
      gfx_r=0.7;gfx_g=0.7;gfx_b=0.7;
      gfx_y += 5;
      gfx_lineto(gfx_w, gfx_y);
      gfx_y += 5;
    );  
    i+=1;
  );
  yy = gfx_y - 5;;
  j = 0;
  loop(rm, 
    gfx_x = xx + (6+9*j)*textw -3;
    gfx_y = 0;
    gfx_lineto (gfx_x, yy;);
    j += 1;
  );
__________________
www.boa-sorte.de
mschnell is offline   Reply With Quote
Old 03-02-2018, 02:21 PM   #46
briandress
Human being with feelings
 
Join Date: Dec 2016
Posts: 66
Default

Ill try when I have some time. I never used Jsfx before so its all new to me.
briandress is offline   Reply With Quote
Old 03-02-2018, 02:47 PM   #47
pipelineaudio
Mortal
 
pipelineaudio's Avatar
 
Join Date: Jan 2006
Location: Wickenburg, Arizona
Posts: 12,428
Default

Working on it today, the new graphics look really good!

The big PITA is sending the learns to the midi stuff, but since it can send CC's directly, a lot of what i had previously had to make giant macros out of is out the window. I'm looking at a strategy for building something now
__________________
REAPER Shirts are Back! - https://shop.spreadshirt.com/pipelineaudio/
pipelineaudio is offline   Reply With Quote
Old 03-02-2018, 03:00 PM   #48
pipelineaudio
Mortal
 
pipelineaudio's Avatar
 
Join Date: Jan 2006
Location: Wickenburg, Arizona
Posts: 12,428
Default

So for something like tap tempo, because it will ignore the second press, I should program my pedalboard so it has two alternating values right?
__________________
REAPER Shirts are Back! - https://shop.spreadshirt.com/pipelineaudio/
pipelineaudio is offline   Reply With Quote
Old 03-02-2018, 03:15 PM   #49
pipelineaudio
Mortal
 
pipelineaudio's Avatar
 
Join Date: Jan 2006
Location: Wickenburg, Arizona
Posts: 12,428
Default

Ideally, later if possible, I'd love to be able to "learn" each row of the table as well, and it could be PC's or different cc's whatever
__________________
REAPER Shirts are Back! - https://shop.spreadshirt.com/pipelineaudio/
pipelineaudio is offline   Reply With Quote
Old 03-02-2018, 03:42 PM   #50
pipelineaudio
Mortal
 
pipelineaudio's Avatar
 
Join Date: Jan 2006
Location: Wickenburg, Arizona
Posts: 12,428
Default

So lets say I want channel 1 cc 1 value 0 to select row 1. I want row 1 to send Channel 2 CC 11 value 128. How do I write that?
__________________
REAPER Shirts are Back! - https://shop.spreadshirt.com/pipelineaudio/
pipelineaudio is offline   Reply With Quote
Old 03-02-2018, 10:05 PM   #51
pipelineaudio
Mortal
 
pipelineaudio's Avatar
 
Join Date: Jan 2006
Location: Wickenburg, Arizona
Posts: 12,428
Default

Wait could we call command ID's instead of CC's as well? Or is that only for scripts?
__________________
REAPER Shirts are Back! - https://shop.spreadshirt.com/pipelineaudio/
pipelineaudio is offline   Reply With Quote
Old 03-02-2018, 10:50 PM   #52
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Germany
Posts: 5,693
Default

Quote:
Originally Posted by pipelineaudio View Post
The big PITA is sending the learns to the midi stuff,
To do a "learn" in Reaper You need to route the CC "down" to the Control Path by MitdiToReaControlPath to make it usable for a "learned" functionality.

To do the "learn" itself, this JSFX is not very usable, as it is made to send out multiple different CCs at a time. Here you should temporarily place a "Midi LFO Generator" plugin right behind it and set same to send the CC # and Midi channel in question. Now "learn" and deactivate the Midi LFO Generator.

Maybe it would make sense to add some "send out CC for learning" function ?

Quote:
Originally Posted by pipelineaudio View Post
but since it can send CC's directly, a lot of what i had previously had to make giant macros out of is out the window.
That was the idea ! Don't need to involve the Control Path (i.e. LiveConfigs) for just signaling plugins like "Midi Fader".

Quote:
Originally Posted by pipelineaudio View Post
I'm looking at a strategy for building something now
Great !
-Michael
__________________
www.boa-sorte.de

Last edited by mschnell; 03-02-2018 at 11:41 PM.
mschnell is offline   Reply With Quote
Old 03-02-2018, 10:54 PM   #53
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Germany
Posts: 5,693
Default

Quote:
Originally Posted by pipelineaudio View Post
So for something like tap tempo, because it will ignore the second press,
That depends on the "Mode".

"Map" mode adheres to any CC message it gets, while "Configs" mode (like LiveConfigs) ignores a row change when the row already is selected.

I did not know about your using "something like tap tempo". If you need both kinds of functionality you can happily install two instances of "Midi CC Table".

-Michael
__________________
www.boa-sorte.de

Last edited by mschnell; 03-02-2018 at 11:43 PM.
mschnell is offline   Reply With Quote
Old 03-02-2018, 11:02 PM   #54
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Germany
Posts: 5,693
Default

Quote:
Originally Posted by pipelineaudio View Post
"learn" each row of the table as well, and it could be PC's or different cc's whatever
Seems to makes sense:
- enter "learn incoming message to row (one of 0..127) mode"
- the next incoming message (CC or PS) is associated to that row (and leaves that mode)

OTOH, maybe it would be even more versatile to do (or find) a separate JSFX for this. Same would just send out the CC that will switch the row in a subsequent "Midi CC Table"

Michael
__________________
www.boa-sorte.de
mschnell is offline   Reply With Quote
Old 03-02-2018, 11:08 PM   #55
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Germany
Posts: 5,693
Default

Quote:
Originally Posted by pipelineaudio View Post
So lets say I want channel 1 cc 1 value 0 to select row 1.
Currently this is impossible.

You would set the "Midi Input Channel" slider to 1 and the "CC input" to 1 and this will select row 0 when (as you say) value 0 is sent to the JSFX.

So you need to use row 0 to do the stuff associated with value 0. This works exactly like LiveConfigs !

Why is it you want to use some other row ? You can just define your appropriate output in the "naturally associated" row.

So you just do
2:11=128
in the first line of the file.

-Michael
__________________
www.boa-sorte.de
mschnell is offline   Reply With Quote
Old 03-02-2018, 11:20 PM   #56
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Germany
Posts: 5,693
Default

Quote:
Originally Posted by pipelineaudio View Post
could we call command ID's instead of CC's as well? Or is that only for scripts?
No.

(As discussed in the other thread) JSFXes resides in the "Midi realm" of the track FX chains, while Actions (via learn) reside in the Midi realm of the Reaper control path, and hence JSFXes know nothing at all about or have any access to Reaper "Actions". (While OTOH ReaScripts reside in the realm of the Control Path and hence can't "directly communicate" with Track plugins such as JSFXes.)

So the only way to access Actions from a JSFX is using MidiToReaControlPath.

This is the way Reaper works, and it does make sense, even if it seems to be hard to fully understand for many.

A reason might be that in the realm of tracks, Midi messages are timed by the audio blocks processed, and use the OS/CPU threads dedicated to audio processing, while in the realm of the Control Path, Midi messages are not timed, but used "on the spot" and supposedly use the OS/CPU thread dedicated for the Reaper GUI.

Of course a built-in MidiToReaControlPath functionality would make sense, but installing MidiToReaControlPath is not hard to do at all.

-Michael
__________________
www.boa-sorte.de

Last edited by mschnell; 03-02-2018 at 11:48 PM.
mschnell is offline   Reply With Quote
Old 03-03-2018, 12:24 AM   #57
pipelineaudio
Mortal
 
pipelineaudio's Avatar
 
Join Date: Jan 2006
Location: Wickenburg, Arizona
Posts: 12,428
Default

so x:y=z
x is channel
y is cc#
and z is cc value?
__________________
REAPER Shirts are Back! - https://shop.spreadshirt.com/pipelineaudio/
pipelineaudio is offline   Reply With Quote
Old 03-03-2018, 02:12 AM   #58
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Germany
Posts: 5,693
Default

Quote:
Originally Posted by pipelineaudio View Post
so x:y=z
x is channel
y is cc#
and z is cc value?
Yep.

And just
x:y
simply means the CC value is 0. This might be useful when triggering actions (as initially requested), as the learning seemingly ignores the CC value.

See above -> https://forum.cockos.com/showpost.ph...6&postcount=33

Quote:
Originally Posted by mschnell View Post
The file format is:
- Each line is associated with an incoming CC # (similar to LiveConfigs) (0, 1, 2, ...).
- Each line has up to 64 CC definitions which are separated by a blank (a "/" starts a comment up to the end of the line)
- empty lines are allowed, resulting in a nonexistent row that will not respond to it's input CC value.
- a CC definition can have two or three elements:
. - Midi Channel followed by a colon
. - CC #
. - CC value (optionally, if present separated by a "="), otherwise Zero is assumed)
This has been enhanced with later versions by allowing a ">" for CCs to be sent when a row is deselectiod in "Configs" mode, and by allowing multiple blanks instaed of a single.

The wording "Each line is associated with an incoming CC # " definitely is misleadiung, as there is a single CC # defined by a slider the pluging listens to. While the CC value of same is associated to the row number. My apologize if that caused confusion . But this is exactly like LiveCionfigs works.

-Michael
__________________
www.boa-sorte.de

Last edited by mschnell; 03-03-2018 at 02:24 AM.
mschnell is offline   Reply With Quote
Old 03-03-2018, 02:31 AM   #59
pipelineaudio
Mortal
 
pipelineaudio's Avatar
 
Join Date: Jan 2006
Location: Wickenburg, Arizona
Posts: 12,428
Default

So wait, what exactly launches a row? I thought it was the first 3 or 2 numbers

I am just not getting this
__________________
REAPER Shirts are Back! - https://shop.spreadshirt.com/pipelineaudio/
pipelineaudio is offline   Reply With Quote
Old 03-03-2018, 06:18 AM   #60
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Germany
Posts: 5,693
Default

I really don't see what causes the confusion here.

It works exactly like LifeConfigs.

You define an Input Channel and an Input CC #.

With "Midi CC Table" you do this by setting the two sliders, while with LiveConfigs you do this by "learning" the CC message before using it.

In any case it's saved as a pair of configuration values in the rpp file.

When finally using Midi CC Table or LiveConfigs, it receives such CC messages (i.e. those with fitting the configured Midi Channel and CC #) and the CC value that comes with this message is used for selecting the row (val = 0 -> first row .... val = 127 -> last row).

The content in the tables of Midi CC table and LiveConfigs is only used to define the action that is performed when the row is accessed (and does not define when is is accessed). With LiveConfigs it can do a lot of stuff (including firing an action when a row is selected and another one when a row is deselected. With Midi CC Table the sequence of the in that row denoted CCs (dedicatedly defined channel CC# and CC value) is sent out when a row is selected and another sequence of CCs (defined after the ">" is sent out when that row is deselected.

Seems very simple and straight forward to me.

To test the functionality I placed a Midi LFO Generator (set to send a CC once a second) above the Midi CC Table, and a ReaControlMidi below it and watch the messages in the log.

-Michael
__________________
www.boa-sorte.de
mschnell is offline   Reply With Quote
Old 03-03-2018, 10:31 AM   #61
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Germany
Posts: 5,693
Default

Ah, I see that the comment in the example file was misleading. It should not contain a # !!!

Maybe I should add yet another more instructive example.

If you want Midi CC Table to react on a Midi CC message on channel 3, CC # 4, value 5 by sending out a Midi CC message on channel 6 , CC # 7, value 8 plus a Midi CC message on channel 9, CC # 10, value 11, and if afterwards a Midi CC message again on channel 3 again with CC # 4 is received, but now with some other value but 5, you want it to issue a Midi CC message on channel 11 with CC # 12, value 13 plus a Midi CC message on channel 14, CC # 15, value 17 you would:

- set the input channel slider to 3
- set the input CC # slider to 4
- set Mode to "Configs"
- provide a file that containse these lines
Code:
// this line is dummy as receiving CC value 0 provides nothing special 
// this line is dummy as receiving CC value 1 provides nothing special 
// this line is dummy as receiving CC value 2 provides nothing special 
// this line is dummy as receiving CC value 3 provides nothing special 
// this line is dummy as receiving CC value 4 provides nothing special 
6:7=8 9:10=11 < 12:13=14 15:16=17 // definition for receiving CC value 5
// this line is dummy and not necessary to exist as receiving CC value 6 provides nothing special
__________________
www.boa-sorte.de

Last edited by mschnell; 03-03-2018 at 10:36 AM.
mschnell is offline   Reply With Quote
Old 03-03-2018, 12:20 PM   #62
briandress
Human being with feelings
 
Join Date: Dec 2016
Posts: 66
Default

Quote:
Originally Posted by mschnell View Post
I really don't see what causes the confusion here.

It works exactly like LifeConfigs.

You define an Input Channel and an Input CC #.

With "Midi CC Table" you do this by setting the two sliders, while with LiveConfigs you do this by "learning" the CC message before using it.

In any case it's saved as a pair of configuration values in the rpp file.

When finally using Midi CC Table or LiveConfigs, it receives such CC messages (i.e. those with fitting the configured Midi Channel and CC #) and the CC value that comes with this message is used for selecting the row (val = 0 -> first row .... val = 127 -> last row).

The content in the tables of Midi CC table and LiveConfigs is only used to define the action that is performed when the row is accessed (and does not define when is is accessed). With LiveConfigs it can do a lot of stuff (including firing an action when a row is selected and another one when a row is deselected. With Midi CC Table the sequence of the in that row denoted CCs (dedicatedly defined channel CC# and CC value) is sent out when a row is selected and another sequence of CCs (defined after the ">" is sent out when that row is deselected.

Seems very simple and straight forward to me.

To test the functionality I placed a Midi LFO Generator (set to send a CC once a second) above the Midi CC Table, and a ReaControlMidi below it and watch the messages in the log.

-Michael

what is the trigger for a Row being "activated" or "deactivated" please

Coming from having to hard code my controller to send specific messages to the pc without the benefit of GUI I would love to know exactly what I need to send into Midi CC Table
briandress is offline   Reply With Quote
Old 03-03-2018, 01:41 PM   #63
pipelineaudio
Mortal
 
pipelineaudio's Avatar
 
Join Date: Jan 2006
Location: Wickenburg, Arizona
Posts: 12,428
Default

I'm starting to get this to work, but having to learn the midi for commands is making this a nightmare. Trying to map out a way of making it make sense. The fact that we can't specify exactly which midi values will make an action perform in REAPER's midi system is making this extremely cumbersome
__________________
REAPER Shirts are Back! - https://shop.spreadshirt.com/pipelineaudio/
pipelineaudio is offline   Reply With Quote
Old 03-03-2018, 03:23 PM   #64
pipelineaudio
Mortal
 
pipelineaudio's Avatar
 
Join Date: Jan 2006
Location: Wickenburg, Arizona
Posts: 12,428
Default

It looks like I can get this working at least as well as SWS Live Configs, but I'm still having to pull lots of macros, rather than be able to do the quick, individual changes I'd like to do, still it is more flexible, as at least I dont have to replace every single thing when I want one small change
__________________
REAPER Shirts are Back! - https://shop.spreadshirt.com/pipelineaudio/
pipelineaudio is offline   Reply With Quote
Old 03-03-2018, 03:36 PM   #65
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Germany
Posts: 5,693
Default

Quote:
Originally Posted by briandress View Post
Coming from having to hard code my controller to send specific messages to the pc without the benefit of GUI I would love to know exactly what I need to send into Midi CC Table
I think the explanation is rather obvious and straigt forward:
- This (prototype) implementation needs to be sent Midi CC messages.
- You can set (by a slider) the (input) Midi channel it listens to
- You can set (by a slider) the (input) CC # it listens to
- the CC value selects the row (0 -> first row ... 127 last row (if so many rows are given in the file) ).

-Michael
__________________
www.boa-sorte.de
mschnell is offline   Reply With Quote
Old 03-03-2018, 03:37 PM   #66
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Germany
Posts: 5,693
Default

Quote:
Originally Posted by pipelineaudio View Post
learn the midi for commands
What exactly do you mean by this ?

As said above, it makes sense to use the "Midi LFO Generator" to create well defined Midi messages for the "learn" phase.

If you think this is appropriate I might include an "output Midi learn stream" functionality directly in the JSFX.

-Michael
__________________
www.boa-sorte.de
mschnell is offline   Reply With Quote
Old 03-03-2018, 03:46 PM   #67
pipelineaudio
Mortal
 
pipelineaudio's Avatar
 
Join Date: Jan 2006
Location: Wickenburg, Arizona
Posts: 12,428
Default

Im using CC injector to force learn the actions, its kind of a massive PITA, but it seems to be working. I'm getting there
__________________
REAPER Shirts are Back! - https://shop.spreadshirt.com/pipelineaudio/
pipelineaudio is offline   Reply With Quote
Old 03-03-2018, 03:50 PM   #68
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Germany
Posts: 5,693
Default

Quote:
Originally Posted by pipelineaudio View Post
I'm still having to pull lots of macros,
For exactly what purpose ?

Macros or Actions only should be necessary when you want to do some change in Reaper itself, but not when you want to do something with your plugins, as same reside in the realm of the Track FX chains, and should respond to Midi CC events, either directly or by using Param -> FX Parameter List -> Parameter Modulation / Midi Link. So no Action or Macro involved.

Of course you need an Action to mute/unmute a track (which AFAIK you already do triggered by "Midi Fade", which would stay as it is.

Of course also "Midi Fade" is in the Realm of the track FX Chains, and directly can be accessed from Midi CC Map via Midi CC messages routed appropriately using the standard Reaper Midi routing mechanism, e.g. by the "ROUTE" button in the track header (instead of running them through MidiToReaControlPath where the Actions and Macros loom).

-Michael
__________________
www.boa-sorte.de

Last edited by mschnell; 03-03-2018 at 03:56 PM.
mschnell is offline   Reply With Quote
Old 03-03-2018, 03:51 PM   #69
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Germany
Posts: 5,693
Default

Quote:
Originally Posted by pipelineaudio View Post
its kind of a massive PITA,
So you think I should include such functionality within Midi CC Map ?
I'll do some reasoning about this...

-Michael
__________________
www.boa-sorte.de
mschnell is offline   Reply With Quote
Old 03-03-2018, 04:08 PM   #70
pipelineaudio
Mortal
 
pipelineaudio's Avatar
 
Join Date: Jan 2006
Location: Wickenburg, Arizona
Posts: 12,428
Default

For instance, upon row activate, I need to unmute that channel, then run midi fade x to fade it in. Upon row deactivate, I bypass the wah, run MIDI fade X which then mutes the channel.

Thats the basic. MIDI learn to do the unmute is tricky and takes a macro no matter what as far as I can tell.
__________________
REAPER Shirts are Back! - https://shop.spreadshirt.com/pipelineaudio/
pipelineaudio is offline   Reply With Quote
Old 03-03-2018, 04:27 PM   #71
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Germany
Posts: 5,693
Default

Quote:
Originally Posted by pipelineaudio View Post
For instance, upon row activate, I need to unmute that channel, then run midi fade x to fade it in. Upon row deactivate, I bypass the wah, run MIDI fade X which then mutes the channel.
You'll need something in the ControlPath such as Action and/or Macro to mute and something similar to unmute a track. For this you make Midi CC Table create a dedicated CC and have MidiToReaControlPath send in "down".

To make Midi Fade X do it's stuff you make Midi CC Table send a different CC (on another channel!) with value 0 or 127, and (having ReaToMidiControlPath ignore this channel) route it (this channel) to another track (via the [ROUTE] button in the track header) where Midi Fade X resides.

I don't know what exactly "bypass the wah" means. This might be done by Midi Fade X or by some parameter of the Wah plugin itself. Both can be controlled vie Track FX Midi and hence do not involve MidiToReaControlPath / Actions / Macros (see the paragraph above).

Quote:
Originally Posted by pipelineaudio View Post
MIDI learn to do the unmute is tricky and takes a macro no matter what as far as I can tell.
Sorry, I have no knowlage aboiut that issue at all.

-Michael
__________________
www.boa-sorte.de
mschnell is offline   Reply With Quote
Old 03-04-2018, 12:24 AM   #72
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Germany
Posts: 5,693
Default

BTW.:

Would it be possible to do a ReaScript that is triggered by an Action that is learned to a CC with dedicated Channel and CC # and activates a track that is denoted by the CC value that comes with that Midi message ? With this I guess you would only need a single script and action (or maybe two very similar ones) for muting / unmuting your tracks.

This is similar as LiveConfigs works, but without needing any additional configuration on that site ? So obviously it can be done by a Reaper Plugin in C++, but I never did one of those and am a bit worried about the amount of tools necessary to be installed to even start with such. Moreover I am rather fluent in C and EEL and a lot more languages, but never did C++.

That is why I would prefer a ReaScript here, but I never did one of those, either.

-Michael
__________________
www.boa-sorte.de
mschnell is offline   Reply With Quote
Old 03-04-2018, 02:18 AM   #73
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Germany
Posts: 5,693
Default

This in fact seems to be possible.

see -> https://forum.cockos.com/showpost.ph...99&postcount=3

Can you post a script that mutes / unmutes a track (and tell me how to install it and hook it to a newly defined Action ) so that I can test this feature with Midi CC Map ?

Thanks
-Michael
__________________
www.boa-sorte.de
mschnell is offline   Reply With Quote
Old 03-04-2018, 01:51 PM   #74
pipelineaudio
Mortal
 
pipelineaudio's Avatar
 
Join Date: Jan 2006
Location: Wickenburg, Arizona
Posts: 12,428
Default

Ok, almost got a really good working one here now.

Just looking at the tap tempo and the tuner really.

In configs mode, if I hit another switch, it will start the deactivate actions on the channel you were last on. For the tuner, this actually works really well, as that means it automatically mutes the output. MIGHT, not entirely sure, be nice though, to have the tuner deactivate action return to the unmuted channel it was just on previously, but maybe not so important.

For tap tempo, things get tricky. I could set the tap tempo pedal to a different channel or CC#. Trying to do the least changing to pedalboard programming as possible. Is there a way to have MIDI CC table ignore certain CC values? Then I could use another instance of MIDI CC Table in mapping mode. Or maybe I should just straight assign these pedals directly to the actions
__________________
REAPER Shirts are Back! - https://shop.spreadshirt.com/pipelineaudio/
pipelineaudio is offline   Reply With Quote
Old 03-04-2018, 03:35 PM   #75
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Germany
Posts: 5,693
Default

Quote:
Originally Posted by pipelineaudio View Post
Ok, almost got a really good working one here now.
That sounds good. Dis you succeed in using Midi CC Map instead of Live Configs and get rid of most of the macros ?

But in fact I don't understand anything of what you are saying after that, as I have no idea about the implications of "tuner" and "tap tempo". But I am positive that once I might understand what you already did and what you are up to, we will find a good solution.

I feel that we are getting to a point where I might want to see this at work at my site, so that I can do some documentation and turn it in a scalable template.

Would you be able to do modify your project so that it "kind of works" with nothing but free plugins ?

I would do a simulation for a pedalboard (even if I in fact do have the FCB1010 of my Guitarist sitting in my micro-studio room next door) to be abler to try out how it works.

For my tests : Can you post a script that mutes / unmutes a track (and tell me how to install it and hook it to a newly defined Action ) so that I can test this feature with Midi CC Map ?

-Michael
__________________
www.boa-sorte.de

Last edited by mschnell; 03-04-2018 at 03:41 PM.
mschnell is offline   Reply With Quote
Old 03-04-2018, 04:07 PM   #76
pipelineaudio
Mortal
 
pipelineaudio's Avatar
 
Join Date: Jan 2006
Location: Wickenburg, Arizona
Posts: 12,428
Default

So for this, I'm using pretty much the same macros as for live configs, except that if I want to change something, I can just ad another number. I'm right now just working out exactly how I want to do the tap tempo and tuner. I'll have a better idea in a little bit here. I'll do one with all free stuff for this one, and I'll export the actions/macros and scripts

Just realized I no longer need the CC send script, I'll add it in MIDI CC table as well.
__________________
REAPER Shirts are Back! - https://shop.spreadshirt.com/pipelineaudio/
pipelineaudio is offline   Reply With Quote
Old 03-04-2018, 10:36 PM   #77
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Germany
Posts: 5,693
Default

Quote:
Originally Posted by pipelineaudio View Post
Just realized I no longer need the CC send script, I'll add it in MIDI CC table as well.
That is exactly why I did the Midi CC Table JSFX.

Regarding other ReaScripts, I found out that I can have Midi CC Table send the script the CC value to qualify what the script is supposed to do by means of "get_action_context(#filename,sectionID,cmdID,mode ,resolution,val);".

Hence I think you (Midi CC Map) could send the track number to be activated to an "Activate Track X" script and same should activate the track denoted in the CC value, which it gets in "val".

So you need just a single ReaScript to activate any track.

Once I find out who to create, install and fire a ReaScript (while nobody seems to be inclined to provide any instructions to me) I'll do that script...

-Michael
__________________
www.boa-sorte.de

Last edited by mschnell; 03-05-2018 at 12:57 AM.
mschnell is offline   Reply With Quote
Old 03-05-2018, 02:43 AM   #78
pipelineaudio
Mortal
 
pipelineaudio's Avatar
 
Join Date: Jan 2006
Location: Wickenburg, Arizona
Posts: 12,428
Default

It seems to work only on the 4th time switching between 1 and 2 for instance. I'm not sure if it has to do with the track starting being muted. First midi calls a macro that selects the track group and unmutes, then it runs fade in of midi fade x
__________________
REAPER Shirts are Back! - https://shop.spreadshirt.com/pipelineaudio/
pipelineaudio is offline   Reply With Quote
Old 03-05-2018, 08:53 AM   #79
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Germany
Posts: 5,693
Default

(As you configured this for CPU saving) a muted track will not receive midi or audio information.

Maybe indeed a predefined waiting time needs to be introduced between unmuting a track and sending some Midi to same.

IN the complex JSFX scripts I use for my keyboard setup (together with LiveConfigs) I needed to implement such delay for a maybe similar purpose.

Of course this can be implemented in Midi CC table, if necessary.

Let me know what you think...

-Michael
__________________
www.boa-sorte.de
mschnell is offline   Reply With Quote
Old 03-05-2018, 11:03 AM   #80
spk77
Human being with feelings
 
Join Date: Aug 2012
Location: Finland
Posts: 2,474
Default

get_action_context example:

(Toggle mute)
Code:
function msg(m) (
  ShowConsoleMsg(sprintf(#, "%d", m));
  ShowConsoleMsg("\n");
);

function run() (
  get_action_context(#foo, 0, 0, mode, res, val) ? (
    (tr = GetTrack(0, val)) ? (
      //msg(val);
      SetMediaTrackInfo_Value(tr, "B_MUTE", !GetMediaTrackInfo_Value(tr, "B_MUTE"));
    );
  );
);

defer("run()");
(I'm sending CC values from ReaControlMIDI because I don't have any MIDI controllers at home)
spk77 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 08:56 AM.


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