View Full Version : Could a spreadsheet action script be made?
pipelineaudio
02-07-2018, 04:02 PM
I would love to see a script like this.
The second column, "Action to activate row" should be learnable,ideally, but assigning it would be ok.
Hopefully cells' contents could be copy and pastable.
Unfilled cells in columns 3 and 4 would be ignored
Cells in column 4 would be triggered when any other row is selected (might have to think about this last a bit, as you may want to use it to toggle on and off signal paths, but for now this should be good)
Oops, should probably have a column for name and comments
https://i.imgur.com/clPzklI.png
X-Raym
02-07-2018, 06:18 PM
That is a very specific request, I dont see it that usable in the long run.
Anyway, what you can do is to use the Web Interface API, an HTML interactive table, and some JavaScript to wrap all that.
If you are patient, it may worth it. ^^
pipelineaudio
02-07-2018, 06:44 PM
Trying to reduce the number of crazy macros it takes to make complicated switching setups in SWS Live Configs.
jico27
02-08-2018, 05:01 PM
I like the idea! +1
pipelineaudio
02-17-2018, 08:08 PM
Would this really have to be an extension instead?
mschnell
02-18-2018, 01:27 AM
Supposedly an extension could be made (similar to LiveConfigs) that fires actions as a result of a single Reaper Action or Midi message received.
Unfortunately LiveConfigs can perform multiple activities but only fire a single action when entering and leaving a state (line).
Hence this extension at best could be an extended version of LiveConfigs.
I am considering to do a JSFX that works a bit like LiveConfigs, in that it is supposed to receive a Midi message to enter a "state" (similar to a line of a Spreadsheet) and sends out a bunch of Midi messages that are defined in that line when entering / leaving a stage.
Some of those Midi messages can now be routed down to the Control Path by MidiToReaControlPath and then be learned to Actions.
-Michael
pipelineaudio
02-18-2018, 02:17 AM
Where exactly are the live configs files? Are they a dll or something?
mschnell
02-18-2018, 04:22 AM
AFAI understand, LiveConfigs is an integral part of the SWS extension (supposedly residing in reaper_sws64.dll (or reaper_sws.dll) ) .
In fact I would be inclined to take on the task of being a maintainer for LiveConfigs (ands with that would be able to do an update as you requested), but as I can't just try to install the sources and compile test and release LiveConfigs, but need to install, compile, test and release the complete SWS extension, I don't dare to start with that.
-Michael
pipelineaudio
02-18-2018, 02:08 PM
Man that sounds brutal!
I’m going to see if I can look inside a smaller extension and see just how insane they are
pipelineaudio
02-19-2018, 11:03 PM
So this should really be an extension and not a script right?
mschnell
02-20-2018, 07:49 AM
While of course an extension would provide the most desigh freedom (e.g. creating an editable "Spreadsheet view" like LiveConfig does, I suppose that for the purpose we have in mind, doing a JSFX that is configurable (e.g. by having it read a text file) and sends out Midi events and (via MidiToReaConptrolPath) have events learn those is a lot more easily doable.
-Michael
pipelineaudio
02-20-2018, 12:21 PM
Jsfx can do that? It wouldn’t be as convenient as clicking in it and being able to pick commands from the command window though right? Or maybe you could copy command ids from the action window and paste them in...the assignment is part of the big deal to me, being able to tell it what action or cc you want to use to make it fire that row
mschnell
02-20-2018, 01:28 PM
I suppose, as a proof of concept, tomorrow I'll try to draft a JSFX that reads "something" that denotes an Action a file and converts it to a CC to be sent down to trigger that action, when that CC reads some Midi messages or similar.
I understand that an Action can be learned to a CC# (and hopefully Midi channel, but not to the CC value). Am I right.
OTOH, I found that the action that triggers a "config" in LiveConfigs obviously comes with a "value",that denotes the row to be activated.
Does anybody know what happens to the CC value when an action is triggered by a CC # ? Is this value available in a script that is started by that action ?
-Michael
pipelineaudio
02-20-2018, 01:45 PM
I understand that an Action can be learned to a CC# (and hopefully Midi channel, but not to the CC value). Am I right.
I think this is true, I tried to confirm last night by assigning actions to different values of the same CC# and it said it was already mapped to another and couldn't.
mschnell
02-20-2018, 02:05 PM
I think this is true, I tried to confirm last night by assigning actions to different values of the same CC# and it said it was already mapped to another and couldn't.
So where does the CC value go ??!!?? I don't believe it is just ignored.
-Michael
pipelineaudio
02-20-2018, 02:43 PM
So where does the CC value go ??!!?? I don't believe it is just ignored.
-Michael
I dont think it is either, since the same cc can both mute and unmute things for instance. I keep hammering Justin about it, but maybe we need to make a coherent, clean, specific thread in the feature request about it.
I would love to see something basically like this (though more "REAPERish" of course)
https://i.imgur.com/AQwpWB0.jpg?1
karbomusic
02-20-2018, 03:21 PM
I think this is true, I tried to confirm last night by assigning actions to different values of the same CC# and it said it was already mapped to another and couldn't.
If you guys remember from the other thread where I mentioned there are scenarios where it will not warn - I'd have to look at my reply to remember how that happens.
pipelineaudio
02-20-2018, 04:45 PM
Which thread? THis is all so exciting and so confusing at the same time
briandress
02-20-2018, 05:11 PM
So where does the CC value go ??!!?? I don't believe it is just ignored.
-Michael
so as far as i am aware CC comes in a specific format. I learned this from writing the arduino program for my midi controller.
when we write usbSendMidi command there are three values. CC control, CC Value, and Midi Channel
So reaper has 16 midi channels. and then there are 127 cc controls and each cc control has 127 cc values. right?
so I program the button to send the code. usbSendMidi (0,64,1) so this sends Midi Control Code 0 Value 64 on Midi Channel 1.
I think it is up to the specific software to decide which portion of that data it uses for its triggering.
briandress
02-20-2018, 05:15 PM
I think this is true, I tried to confirm last night by assigning actions to different values of the same CC# and it said it was already mapped to another and couldn't.
This means that whatever is doing the mapping is only using the D1 value of the CC code. There is Data 1 and Data 2 in CC Data 1 is the control Code, which was mapped with your first value. You tried the same D1 but changed D2 and it wouldnt map because it was already taken.
pipelineaudio
02-20-2018, 06:08 PM
its affected by the third byte value, but it won't let you assign the same second byte value to two things. I think...since it allows a cc for volume faders for example and responds correctly.
What we're talking about here is the very few (or very many) cases where reaper will not let you directly assign a midi value to it, but insists on learn only, and with no further parameter control over how it behaves.
This is worlds different than say the parameter automation, which gives you all sorts of control over what midi it uses and how it behaves (though still, I don't think quite enough)
karbomusic
02-20-2018, 06:09 PM
Which thread? THis is all so exciting and so confusing at the same time
It was one of yours concerning MIDI or one you entered on the same subject.
karbomusic
02-21-2018, 08:37 AM
Which thread? THis is all so exciting and so confusing at the same time
Here it is... It's the difference between learning a CC from a VST vs learning one from an action. Via action, it will complain/overwrite a previous action using the same CC. However, when using learn for VST FX, you can learn the same CC for as many params as you wish and control them all with the single CC. There is a twist to that, if you assign a CC to an action, forget about it, then assign the same CC to a VST param via learn, it will not complain but the VST param will not work because it is being intercepted by the CC tied to the previously learned action...
https://forum.cockos.com/showpost.php?p=1949011&postcount=13
It will, but it if you also assign the same CC to an action, that will override the plugin CC but you can assign the same CC to more than one plugin control so long as there are no bound actions involved. Action or no action is the key thing to remember here.
The only thing that denies or cares about duplicates, is duplicate key or CC bindings IN the actions window. Unless my very short test was flawed it's likely that the listener for MIDI attaches any matching actions first and if there is a match it runs the action and doesn't send the CC "down the line" and the plugin never sees it.
mschnell
02-21-2018, 12:22 PM
Hmmm.
I don't even think it's an obvious or logical design decision that you can't learn a CC to multiple actions so that all of them would be fired when the CC is detected in the Control Path.
-Michael
karbomusic
02-21-2018, 12:38 PM
It makes a lot of sense to write the original code that way because it is more rare to need multiple actions with the same CC when contrasted with the confusion it would cause users who were unaware. If use cases justify it down the road (such as pipe's need now) then it makes sense to revisit - my suggestion would be to simply throw the same warning it does now with an option to duplicate, overwrite, cancel.
However, what I described above isn't about multiple actions, it's about 1 action + 1 learned VST param which is a very similar but different issue.
briandress
02-21-2018, 02:04 PM
It makes a lot of sense to write the original code that way because it is more rare to need multiple actions with the same CC when contrasted with the confusion it would cause users who were unaware. If use cases justify it down the road (such as pipe's need now) then it makes sense to revisit - my suggestion would be to simply throw the same warning it does now with an option to duplicate, overwrite, cancel.
However, what I described above isn't about multiple actions, it's about 1 action + 1 learned VST param which is a very similar but different issue.
so right now you cannot use the same CC code to turn off a VST and also have an action take place, basically?
karbomusic
02-21-2018, 02:14 PM
so right now you cannot use the same CC code to turn off a VST and also have an action take place, basically?
I don't "think". It was just something I noticed when I was designing a small DIY controller over the last couple weeks. It wasn't something I personally needed, I had just been testing and couldn't understand why the VST param I just set wouldn't work, then realized I had set it to an action earlier.
I wouldn't discourage anyone from testing/confirming further to be sure since it wasn't something I put any time in, just noticed and moved on to finishing my work with testing my controller. Repro/test...
1. Assign an action to a controller knob via MIDI learn.
2. Now assign a VST parameter/knob to that same CC using MIDI learn.
#2 may not work if #1 is set if I didn't miss something which is possible.
briandress
02-21-2018, 02:24 PM
I don't "think". It was just something I noticed when I was designing a small DIY controller over the last couple weeks. It wasn't something I personally needed, I had just been testing and couldn't understand why the VST param I just set wouldn't work, then realized I had set it to an action earlier.
I wouldn't discourage anyone from testing/confirming further to be sure since it wasn't something I put any time in, just noticed and moved on to finishing my work with testing my controller. Repro/test...
1. Assign an action to a controller knob via MIDI learn.
2. Now assign a VST parameter/knob to that same CC using MIDI learn.
#2 may not work if #1 is set if I didn't miss something which is possible.
gotcha. Im making a midi controller right now and im working with how i want the coding of the controller based on how reaper handles this switching.
The best I can come up with right now is having tracks loaded with "Presets" using Live Configs to switch them by using CC 0 values and then using the rest of CC 1-127 to switch VST parameters within individual tracks or "presets"
so the controller will default to sending banks of CC0 values but when one is selected will toggle to send CC s for VST parameters.
pipelineaudio
02-21-2018, 02:39 PM
Oh yeah, shit....Karbo, meet Brian, he's making a midi controller too! Hopefully Justin lets us have a live forum section and we can really post some killer DIY's
mschnell
02-21-2018, 02:43 PM
Im making a midi controller right now and im working with how i want the coding of the controller based on how reaper handles this switching.
Not really necessary. If you know how to do it. Recoding the midi-messages that come in from the controller is not hard at all.
-Michael
karbomusic
02-21-2018, 02:55 PM
Ah nice! Welcome Brain. My small project is here, it's just a personal thing using an Arduino:
https://forum.cockos.com/showpost.php?p=1955742&postcount=61
As far as the configs thing, I'm not familiar with it enough to know the answer. I have in the past emulated amp channel switching by placing VSTs then using MIDI CC to toggle the bypass state. For example, imagine two AMP sim VSTs... I assigned toggle bypass to both but set one of them enabled and one bypassed initially - thusly hitting the MIDI controller switch toggled both, effectively resulting in the equivalent of channel switching (think clean/dirty channels).
That's entirely possible because it uses the bypass CC on the actual sim, bypassing the restriction of the same CC we have in actions if that makes any sense. In reality, it looks like from within the actions window, Justin is just checking the list to see if another of the same CC exists then warns. What I don't know is if that causes other issues and that's why it exists or he did it as a safety feature for the user. I would suspect a little of both since an action triggered via CC doesn't seem to fall through to a VST CC but that's visibility I don't have to know for sure.
briandress
02-27-2018, 12:31 PM
hows your testing going @pipelineaudio?
mschnell
02-27-2018, 02:28 PM
Hi Pipe,
I did a preview release of a a "spreadsheet" or a kind of "Configs" JSFX. It's called "Midi CC Table".
The JSFX reads a file (the filename is selectable if multiple files are present). The file(s) must have a ".txt" extension and need to be located in a directory called "cc table" that needs to be located in the "Data" directory, which is right besides Reaper's "Effects" directory.
A sample file content is given below.
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)
The JSFX shows the first relevant rows of the table in it's graphic.
You can select an input channel and CC # by "sliders" (as usual).
The current functionality is, that it sends the CCs in the appropriate row whenever it receives an appropriate CC with this row number as it's value (similar as LiveConfigs).
Right now, we don't support a "State" (the number of the latest row that had been accessed and would be "selected").
I think the final version should additionally feature a set of CCs per row to be sent out when a row is left/deselected, and should not send out anything if the already selected row is accessed again. I suppose, with this, you can get rid of LiveConfigs in your setup.
If you want to fire actions (as stated in the original request), you need to use MidiToReaControlPath to send the CCs "down" into the guts of Reaper and "learn" your actions to the appropriate CCs.
Please test and let me know what you find !
Thanks,
Have fun !
-Michael
// Author: Michael Schnell,
desc:Midi CC Table
slider1:/cc table:none:CC Table
slider2:0<0,15,1{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}>MIDI Input Channel
slider3: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,12 6,127}>CC Input
@init
//FUNCTIONS for reading .txt files
//offset = starting string number
//returns number of lines read
cols = 64;
cols3 = cols*3;
//cc_nr_i = 0*rows;
//cc_val_i = 1*rows;
ssb = 0; // Spread sheet base
function slider_file_to_numbered_strings(slidernumber,offse t)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
inChannel = slider2;
modcc = slider3;
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*cols3+ col*3;
src[0] = -1;
while (o < l) (
c = '0';
j = 0;
while ((c >= '0') && (c <= '9')) (
j *= 10;
j += c-'0';
c = str_getchar(#s, o, 'c');
o += 1;
);
c == ':' ? ( // Channel
src[0] = j-1;
// ___0 = j;
) : c == '=' ? ( // CC #
src[1] = j;
cc = j;
// ___1 = j;
) : (c == ' ') || (c == 13) || (c == '/') ? ( // Value
cc >= 0 ? (
src[2] = j;
// ___2 = j;
) : (
src[1] = j;
// ___1 = j;
src[2] = 0;
// ___2 = 0;
);
col += 1;
cc = -1;
src = ssb + row*cols3+ col*3;
src[0] = -1;
);
);
row+=1;
);
@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 ? (
cj = 0;
coli = ci * cols3;
src = ssb + coli /*+ cj*3*/;
while (src[0] >= 0) (
midisend(offset, $xB0+src[0], src[1], src[2]);
cj += 1;
// src = ssb + coli + cj*3;
src += 3;
);
);
);
);
);
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, Ariel,18);
gfx_r=1;gfx_g=gfx_b=1;
xx=10;
yy=10;
gfx_x=xx;gfx_y=yy;
i=0;
loop ( row,
#t = sprintf(#, "%d >> ", i);
j = 0;
srb = ssb + i*cols3 /*+ j*3*/;
while (srb[0] >= 0) (
#s = sprintf(#, "%d:%d=%d ", srb[0]+1, srb[1], srb[2]);
#t += #s;
j += 1;
// srb = ssb + i*cols3 + j*3;
srb += 3;
);
ssb[i*cols3 /* + 0*3 + 0 */ ] >= 0 ? (
gfx_drawstr(#t);
gfx_x=xx;
gfx_y+=gfx_texth+3;
);
i+=1;
);
1:1=1 1:1=2 // CC # 0
2:2=2
// CC #2 empty
3:3=1 3:3=2 3:3=3 3:3=4
7:7=1 7:7=2 7:7=3 7:7=4 7:7=5 7:7=6 7:7=7 7:7=8
pipelineaudio
02-27-2018, 02:48 PM
allll right!
I'll be trying this today as time allows, awesome!
pipelineaudio
02-27-2018, 08:09 PM
I'm not exactly sure how to fill out the lines
mschnell
02-27-2018, 10:42 PM
I'm not exactly sure what you are asking.
I suppose you are able to use a text editor to create an appropriate file :) .
Have you been able to make the JSFX show the content of the example file ?
Do you mean the syntax ?
The example shows how to define the elements in a line. e.g. the two elements in the first line mean:
When a CC (with correct input channel and CC #) with value 0 is detected, send out CC #1 with value 1 on channel 1, and then CC#1 on channel 1 with value 2.
Of you just want to trigger actions, (AFAIK) the CC value is ignored by "learn", and hence not necessary to be written in the fileThe JSFX will assume 0 in that case.. Syntax just 3:4 -> CC# 4 on channel 3 with value 0.
Or do you mean the purpose / usage ?
I am not fluent with "learning" actions. Maybe you need to do second file that just sends out single CCs for dong the "learning" of different CC#s to dedicated actions.
Once that done, you have a list of CC#s with associated actions and from this you can construct a file that sends out multiple CCs per "row" and hence will trigger multiple actions when receiving a single CC message.
-Michael
pipelineaudio
02-28-2018, 12:10 AM
Just the syntax, I'll try it again, I think I understand it better now
mschnell
02-28-2018, 12:48 AM
I improved the messages above...
-Michael
mschnell
02-28-2018, 10:39 AM
New version.
You now can select either the "Map" or the "Configs" mode.
In "Map" mode the CCs denoted in a row are sent out whenever a CC that points to that row is received.
In "Configs" mode an incoming CC selects a row. The sected Row is highlighted in the graph. Only if the selection is changed the JSFX will send out the appropriate "activate" CCs of the newly selected row. Moreover before that, it will send out the "deactivate" CCs for the formerly selected row. (This works similar as SWS LiveConfigs.)
To support the "Configs" Mode, an additional key-character is introduced in the table file: "<" as a seperatopr (instead of blank) starts the definition of "deactivate" CCs.
An example file see below.
-Michael
// 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,12 6,127}>CC Input
@init
//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,offse t)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;
while (o < l) (
c = '0';
j = 0;
while ((c >= '0') && (c <= '9')) (
j *= 10;
j += c-'0';
c = str_getchar(#s, o, 'c');
o += 1;
);
c == ':' ? ( // Channel
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;
);
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, Ariel,18);
gfx_r=1;gfx_g=gfx_b=1;
xx=10;
yy=10;
gfx_x=xx;gfx_y=yy;
i=0;
loop ( row,
#t = sprintf(#, "%d >> ", i);
j = 0;
srb = ssb + i*cols23 /*+ j*3*/;
while ((srb[0] >= 0) && (j < cols)) (
#s = sprintf(#, "%d:%d=%d ", srb[0]+1, srb[1], srb[2]);
#t += #s;
j += 1;
// srb = ssb + i*cols3 + j*3;
srb += 3;
);
j = 0;
srb = ssb + i*cols23 + cols3;
srb[0] >= 0 ? #t += " << ";
while ((srb[0] >= 0) && (j < cols)) (
#s = sprintf(#, "%d:%d=%d ", srb[0]+1, srb[1], srb[2]);
#t += #s;
j += 1;
// srb = ssb + i*cols3 + j*3;
srb += 3;
);
ssb[i*cols23 /* + 0*3 + 0 */ ] >= 0 ? (
i == act ? (
gfx_r=1;gfx_g=1;gfx_b=0;
) : (
gfx_r=0.7;gfx_g=0.7;gfx_b=0.7;
);
gfx_drawstr(#t);
gfx_x=xx;
gfx_y+=gfx_texth+3;
);
i+=1;
);
example table file:
1:1=1 1:1=2 // CC # 0
2:2=2
// CC #2 empty
// 4
3:3=1 3:3=2 3:3=3 3:3=4<10:11
7:7=1 7:7=2 7:7=3 7:7=4 7:7=5 7:7=6 7:7=7 7:7=8<9:9=9 10:11=127
mschnell
02-28-2018, 11:47 AM
BTW.:
If you want to learn a dedicated CC # to an action you might want to use the "Midi CC LFO Generator". If sends out an infinite series of CCs with dedicated Channel,CC#, and (if you want to) CC value.
-Michael
pipelineaudio
02-28-2018, 03:14 PM
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?
mschnell
02-28-2018, 11:11 PM
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
briandress
03-01-2018, 03:00 PM
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
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?
mschnell
03-01-2018, 10:46 PM
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
// 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
mschnell
03-02-2018, 01:40 PM
@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:
// 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,12 6,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,offse t)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;
);
briandress
03-02-2018, 02:21 PM
Ill try when I have some time. I never used Jsfx before so its all new to me.
pipelineaudio
03-02-2018, 02:47 PM
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
pipelineaudio
03-02-2018, 03:00 PM
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?
pipelineaudio
03-02-2018, 03:15 PM
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
pipelineaudio
03-02-2018, 03:42 PM
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?
pipelineaudio
03-02-2018, 10:05 PM
Wait could we call command ID's instead of CC's as well? Or is that only for scripts?
mschnell
03-02-2018, 10:50 PM
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 ?
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".
I'm looking at a strategy for building something now
Great !
-Michael
mschnell
03-02-2018, 10:54 PM
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
mschnell
03-02-2018, 11:02 PM
"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
mschnell
03-02-2018, 11:08 PM
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
mschnell
03-02-2018, 11:20 PM
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
pipelineaudio
03-03-2018, 12:24 AM
so x:y=z
x is channel
y is cc#
and z is cc value?
mschnell
03-03-2018, 02:12 AM
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.php?p=1960456&postcount=33
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
pipelineaudio
03-03-2018, 02:31 AM
So wait, what exactly launches a row? I thought it was the first 3 or 2 numbers
I am just not getting this
mschnell
03-03-2018, 06:18 AM
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
mschnell
03-03-2018, 10:31 AM
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
// 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
briandress
03-03-2018, 12:20 PM
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
pipelineaudio
03-03-2018, 01:41 PM
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
pipelineaudio
03-03-2018, 03:23 PM
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
mschnell
03-03-2018, 03:36 PM
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
mschnell
03-03-2018, 03:37 PM
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
pipelineaudio
03-03-2018, 03:46 PM
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
mschnell
03-03-2018, 03:50 PM
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
mschnell
03-03-2018, 03:51 PM
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
pipelineaudio
03-03-2018, 04:08 PM
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.
mschnell
03-03-2018, 04:27 PM
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).
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
mschnell
03-04-2018, 12:24 AM
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
mschnell
03-04-2018, 02:18 AM
This in fact seems to be possible.
see -> https://forum.cockos.com/showpost.php?p=1962299&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
pipelineaudio
03-04-2018, 01:51 PM
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
mschnell
03-04-2018, 03:35 PM
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
pipelineaudio
03-04-2018, 04:07 PM
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.
mschnell
03-04-2018, 10:36 PM
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
pipelineaudio
03-05-2018, 02:43 AM
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
mschnell
03-05-2018, 08:53 AM
(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
spk77
03-05-2018, 11:03 AM
get_action_context example:
(Toggle mute)
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)
https://stash.reaper.fm/33039/get%20action%20context.gif
mschnell
03-05-2018, 11:26 AM
Here are the tiny scripts that allow for Midi CC Table to mute and unmute tracks.
Simply learn the two scripts to two different CC # s and have Midi CC Table send out either of them for muting and unmuting with the CC val = the track number (beware that internally Reaper numbers the tracks as 0, 1, 2, 3, ...)
mute_track_X.eel :
mute = 1;
get_action_context(#filename,sectionID,cmdID,mode, resolution,val);
tr = GetTrack(0,val);
SetMediaTrackInfo_Value(tr, "B_MUTE", mute);
unmute_track_X.eel :
mute = 0;
get_action_context(#filename,sectionID,cmdID,mode, resolution,val);
tr = GetTrack(0,val);
SetMediaTrackInfo_Value(tr, "B_MUTE", mute);
I suppose for Pipe's project no other scripts should be necessary.
Have fun !
-Michael
mschnell
03-05-2018, 11:29 AM
get_action_context example:
Thanks a lot. I already had been able to find out how to do and hook ReaScripts and even found the API calls necessary here.
Thanks again !
-Michael
pipelineaudio
03-05-2018, 05:34 PM
Here's my MIDI CC Table
https://i.imgur.com/SDmek34.png
3:1 2:1=127 < 3:11 1:27=0 // macro-Select and unmute group, Fade in MIDI FadeX. fade out/ mute MIDI fade x, bypass wah
3:2 2:2=127 < 3:12 1:27=0 // macro-Select and unmute group, Fade in MIDI FadeX. fade out/ mute MIDI fade x, bypass wah
3:3 2:3=127 < 3:13 1:27=0 // macro-Select and unmute group, Fade in MIDI FadeX. fade out/ mute MIDI fade x, bypass wah
3:4 2:4=127 < 3:14 1:27=0 // macro-Select and unmute group, Fade in MIDI FadeX. fade out/ mute MIDI fade x, bypass wah
// 5 tap tempo
3:6 2:6=127 < 3:16 1:27=0 // macro-Select and unmute group, Fade in MIDI FadeX. fade out/ mute MIDI fade x, bypass wah
3:7 2:7=127 < 3:17 1:27=0 // macro-Select and unmute group, Fade in MIDI FadeX. fade out/ mute MIDI fade x, bypass wah
3:8 2:8=127 < 3:18 1:27=0 // macro-Select and unmute group, Fade in MIDI FadeX. fade out/ mute MIDI fade x, bypass wah
3:9 2:9=127 < 3:19 1:27=0 // macro-Select and unmute group, Fade in MIDI FadeX. fade out/ mute MIDI fade x, bypass wah
3:10 < 3:20 1:27=0 //
If I put ReaControl right after MIDI CC table, I can see that 2x=127 gets sent for every time its supposed to, but putting ReaControl log on the particular channel shows it only getting sent every other time its supposed to
mschnell
03-05-2018, 10:40 PM
You mean, Midi CC map does not send the stuff it should, but instead it sometimes sends certain messages twice and others not at all?
I can't imagine how that should happen.
Are you sure that the track Midi CC Map resides in is not muted ever ?
OTOH, I don't understand how you never send a 0 and a 127 to the same channel / CC# combination, as this is what (in your case) Midi Fader X is supposed to receive. And this is what Midi CC Map has been created for to begin with: Do the mute/unmute functionality (sauf CPU saving) in combination with Midi Fader X, similar as LibveConfigs, but without needing any Reaper Control Path activity. (Advanced functionality that needs the Control Path can be done on top of that using especially simple - not project specific - Actions and ReaScripts. )
My request to you is: please set up a new workalike project, consisting of one track holding Midi CC Map and multiple Audio tracks, that does not (yet) mute/unmute any tracks and does not use any Reaper Actions, macros or ReaScripts, but distributes the Midi messages from Midi CC Map simply via standard Reaper routing to the appropriate Audio tracks, to control Kidi Fader X instances and your other plugins.
-Michael
pipelineaudio
03-06-2018, 03:32 AM
My request to you is: please set up a new workalike project, consisting of one track holding Midi CC Map and multiple Audio tracks, that does not (yet) mute/unmute any tracks and does not use any Reaper Actions, macros or ReaScripts, but distributes the Midi messages from Midi CC Map simply via standard Reaper routing to the appropriate Audio tracks, to control Kidi Fader X instances and your other plugins.
-Michael
OK, I got one like this working. https://www.dropbox.com/s/x996ml5s3lo5etj/MIDI%20CC%20Table.rpp?dl=0
Seems to be doing ok, would work great for a stompbox style setup too I bet. I'd need muting for a more complex setup
mschnell
03-06-2018, 07:01 AM
I'd need muting for a more complex setup
That is absolutely obvious.
For this purpose I did the two tiny ReaScripts "mute_track_X.eel" and "unmute_track_X.eel" described above that with the help of two appropriate actions (and MidiToReaControlPath) will receive Midi messages either from Midi CC Map (usually unmuting) or from Midi Fade X (usually muting) and mute or unmute the track given as appropriate.
Do you over mute/unmute think you will need yet some other necessarily Control-Path residing stuff that a script or action is necessary for ?
(As said I would like to have the thing done as straight-forward as possible. )
-Michael
pipelineaudio
03-06-2018, 01:26 PM
I can try those scripts, I need the syntax for the variables I need to change them with, hopefully an example for say track 1 and 3
mschnell
03-06-2018, 02:28 PM
I already did post the mute_track_X.eel and unmute_track_X.eel scripts some mails above (-> https://forum.cockos.com/showpost.php?p=1962876&postcount=81). I did test that they work as expected What do you want to change ?
-Michael
pipelineaudio
03-06-2018, 02:44 PM
I dont understand what to put in there to have it get the specific track
mschnell
03-06-2018, 03:14 PM
I dont understand what to put in there to have it get the specific track
I got it from the documentation of the API functions.
"get_action_context(#filename,sectionID,cmdID,mode, resolution,val);"
In val gives the CC value when the script has been fired by "it's" action, and this action is called by a Midi message with the Midi Channel and the CC , the action had been learned to. (Beware: I found that scripts are not fired by actions as long as the Script-IDE editor is open for that script.)
then
tr = GetTrack(0,val);
provides the ID of the track that features the track number val (which is the one that is labeled as No "val+1" in the GUI, as here tracks are counted 1, 2, 3, ... instead of "technically" 0, 1, 2 ...)
With this set up, you simply make Midi CC Map send a message with the Midi Channel and CC # you learned the message to and the CC val according to the Track No (subtract one) of the track you want to mute or unmute.
-Michael
pipelineaudio
03-06-2018, 03:24 PM
So do I need ten of these scripts for ten patches? I'm still trying to understand
mschnell
03-06-2018, 10:58 PM
I again totally fail to understand what causes the confusion.
With "10" patches" do you mean 10 tracks ? If yes, here the way it works:
To unmute 1 .. 10 tracks you need to install the unmute_track_X.eel script and set up an action that fires it and learn that action to - say - midi channel 12, CC # 13. From now on the script will be executed when the Control Path sees a CC message #13 on Channel 12, independent of the CC value it carries. Hence that value can be used to tell the script which channel it is to unmute.
Now you do a Midi CC Map configuration file that (among other stuff) contains the definitions (supposedly in multiple lines, together with midi messages sent to other plugins) :
12:13=0
12:13=1
12:13=2
12:13=3
12:13=4
12:13=5
12:13=6
12:13=7
12:13=8
12:13=9
Now (by example) according to the third line in the file when activating row 2, Midi CC Map will send out the Midi CC message #13 on channel 12 with value 2. Same is routed "down" through MidiToReaControlPath and will trigger the action you set up and hence the unmute_track_X script will be executed.
Same calls the get_action_context() Reaper API function and in the "val" variable is provided with the value of 2 that Midi CC Map sent out. So it knows that it is to unmute the track number 2 (seen in the GUI as track "3"). So it uses the appropriate two Reaper API calls to do that.
It with "10 patches" you mean "10 buttens to press on the pedal", this has close to nothing to do with this issue, the "10 Buttons" will activate 10 different rows in Midi CC Map and each of them can be set to do whatever is can be done via Midi CCs, including (but not necessarily) mute or unmute any of the audio tracks.
To avoid confusion keep in mind that I (since the beginning of all discussion) strongly suggest to deactivate the "control" checkbox of any Midi device, so that a script or action never is accessed directly but always via Midi CC Map, and hence in the control file you can define / see what is going on for each "patch", including any track muting/unmuting. Of course the midi events from the pedal buttons also should not be routed to the audio tracks, but only drive Midi CC Mapper.
-Michael
pipelineaudio
03-07-2018, 01:25 PM
So it looks like for ten tracks' mute/unmte control, I don't need ten of these scripts, just one on the MIDI input channel after MIDI CC table right?
pipelineaudio
03-07-2018, 01:36 PM
OK, so like the other action i tried, it only works every other time we press a pedal. The same actions in live configs work every time. Maybe you were right about it needing some wait time.
I can't get midi fade x to respond after having its track unmuted, so it goes like this
press pedal 1: track unmutes, but midi fade x stays faded out
press pedal 2: track unmutes, but midi fade x stays faded out
press pedal 1 again: midi fade x fades in properly
press pedal 2 again: midi fade x fades in properly
pipelineaudio
03-07-2018, 01:39 PM
If this ends up working, I MUCH MUCH MUCH prefer doing it this way, on the main midi channel, VERY convenient!
Is it possible that MIDI Fade X could be made into a script? It could even include these two mute scripts possibly!
mschnell
03-07-2018, 02:59 PM
So it looks like for ten tracks' mute/unmte control, I don't need ten of these scripts, just one on the MIDI input channel after MIDI CC table right?
While I don't understand what you mean by "MIDI input channel after MIDI CC table", Yep. you only need a single script and a single Action for unmuting (and another pair of those for muting).
-Michael
mschnell
03-07-2018, 03:12 PM
If this ends up working, I MUCH MUCH MUCH prefer doing it this way, on the main midi channel, VERY convenient!
GREAT ! (How did you manage to get rid of the nasty "every other time" effect ??? )
This is what I was up to with all this discussion (and thanks for your support): do the most convenient example of a Live setup just as yours to allow Reaper to be be easily used as an extremely versatile virtual effect rack.
Hopefully we some day get a "Reaper Live" subforum so that we can provide such solutions publicly in a prominent location.
Is it possible that MIDI Fade X could be made into a script? It could even include these two mute scripts possibly!
MIDI Fade X is a script. Do you mean a ReaScript ? No ! ReaScripts reside in the Reaper Control Path and there is no Audio but just control signals. It would be possible to do a VST that is done similar to MidiToReaControlPath and instead of forwarding the Midi signals, directly would do the muting/unmuting. While this would be perfect (IMHO: getting rid of needing to do anything "obvious" in the Control Path at all), I don't (yet) have the really advanced art of doing combined VSTs / Reaper extensions in C++.
While we stay with scripts, more stuff in ReaScripts: this is exactly what I don't want.
As close to everything necessary for such a setup is doable not in the control path, for maximum clearness, I want to keep the stuff in the Control Path (i.e. ReaScripts) as simple and "standard" (i.e. not project specific) as possible. Hence just two very small scripts and two actions is close to the most I would admit. (I even try to reduce this to just a single ReaScript and a single action, but did not yet find a perfect way to do so, see other thread in this forum.)
-Michael
pipelineaudio
03-07-2018, 04:47 PM
I havent got rid of the every other time thing yet, but I'm trying different ways to do the muting/unmuting
Its weird that the same custom actions will work in the Live configs version but not this one...I swear I remember having the same issue with Live Configs, trying to remember how I fixed it
pipelineaudio
03-07-2018, 08:51 PM
So it looks like The mute notifications from MIDI Fade X will always be value 0, not sure how to mute by using the mute script. I should be able to mute with an action, but I don't think that's what we want
mschnell
03-07-2018, 11:09 PM
So it looks like The mute notifications from MIDI Fade X will always be value 0, not sure how to mute by using the mute script
You are perfectly right. Silly me did not think that Midi Fader X has this limitation, and hence is not directly usable with the mute_track_X.eel script. I'll of course will do add a slider for the CC value ASAP. This is really easy, but I'll have time to do this only later this day :(
Thanks for pointing this out !
-Michael
pipelineaudio
03-07-2018, 11:13 PM
Its crazy how many possibilities there are.
It can be any sort of pedalboard, from patch style to stomp style to a hybrid like digitech could do
mschnell
03-08-2018, 02:18 PM
Here the Midi Fader X code with additional Muting Notification CC Value slider.
Please test and have fun !
-Michael
desc:Midi Fade X
author: Michael Schnell (mschnell@bschnell.de)
version: 2.1
changelog: Added Muting Notification CC value slider
donation: United Nations Foundation http://www.unfoundation.org/
about:
## Description
The midi CC values 0 ... 127 are mapped to an "amplifier" curve that consists of a linear and an exponential part
in a way, that with CC = 0 the amplification is 0 (-inf dB) and with CC = 127 the amplification is 1 (0db).
A slider defines the amount (in dB), the amplification is reduced with each CC step.
According to that, the breakpoint between the exponential and the linear part is set so that
at this point the value and the slope of the curves match.
Below the breakpoint, a linear curve is used so that with CC = 0 the amplification is Zero (-infinity dB).
Two sliders defines the maximum fade-in (up) and fade-out (down) speed the amplification is modulated. This is set in dB per modulation step. Moreover the maximum speed used is reaching a new defined level in as many steps a samples in a block.
The slider "start fade in" defines the starting point of the upwards move of the amplification. Same is given as the equivalent of an input CC value (1 ... 31)
The "Muting Notification" sets a CC # which is sent out with a value of "Muting Notification CC value", when the amplification drops below the mute level (equivalent to an input CC value of one tenth of that defined for "start fade in").
The "send CC = 127" setting defines whether this CC is sent with value 127, when the amplification rises above the mute level or when it reaches 0 dB.
A graph shows as well the curve (linear, Amplification vs. CC steps), as the dynamic movement of the input CC and the amplification level.
Moreover, the fade in start and - if appropriate - the mute level is shown.
If the "Muting Notification CC" is set, the mute state is visualized by a green rectangle.
## Limitations
As due the the description above, the modulation speed is limited to reaching the target level in a timespan at least
as the duration of a sample block, the current version of this plugin is not suitable for synth-like application that
intend to implement a VCA.
// License: LGPL - http://www.gnu.org/licenses/lgpl.html
slider1:0<0,15,1{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}>MIDI Input Channel
slider2: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,12 6,127}>CC Input
slider3:-0.3<-0.6,-0.08,0.01>Attenuation per CC step
slider4:0.003<0.0005, 0.01, 0.0001>max step fade in(dB)
slider5:0.003<0.0005, 0.01, 0.0001>max step fade out(dB)
slider6:1<1,31,1>start fade-in (CC Value)
//slider7:0<0,1,0.01>Factor (Test)
slider8:0<0,127,1{None,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,12 6,127}>Muting Notification CC #
slider9:0<0,127,1)>Muting Notification CC value
slider10:0<0,2,1{Never,-inf db,0 dB}>send CC = 127
@init
modval = 0;
// prelevel = 0;
maxCCvalue = 127;
r4 = log(10)/20;
outval = 0;
function f (x) (
x < limit ? (
x*r3;
) : (
exp((maxCCvalue-x) * r5);
);
)
@slider
inChannel = slider1;
modcc = slider2;
dbperstep = slider3;
db20perstep = dbperstep/20;
p1 = 1 / log(10) / db20perstep;
p2 = 1 / maxCCvalue;
p3 = p1 + p2;
limit = (-p3+0.5) |0;
r1 = (maxCCvalue-limit) * dbperstep;
r2 = exp(log(10)*r1/20);
r3 = r2 / limit;
r5 = dbperstep*r4;
s1 = exp(log(10)*slider4/20);
s2 = exp(log(10)*slider5/20);
s2 = 1 / s2;
finstart = slider6;
f1 = f(finstart);
f01 = f(finstart/10);
outcc = slider8-1;
outccval = slider9;
sendcc = slider10;
str1 = sprintf(#, "fade in start -> %.0f dB", log(f1)/r4);;
str01 = sprintf(#, "mute level -> %.0f dB", log(f01)/r4);;
@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?
modval = msg3;
modval ? (
low ? (
outlevel < f1 ? outlevel = f1;
);
) : (
low = 1;
);
modval >= finstart ? (
low = 0;;
);
modlevel = f(modval);
// slider7 = modlevel; // test
);
);
);
midisend(offset, msg1, msg2, msg3); // pass through
);
modval ? (
low ? (
modstep = 1;
) : (
modstep = exp( log(modlevel / outlevel) / samplesblock);
);
modstep == 1 ? (
stepping = 0;
) : (
modstep > s1 ? (
modstep = s1;
) : modstep < s2 ? (
modstep = s2;
);
stepping = 1;
);
) : (
modstep = s2;
);
outcc >= 0 ? (
outlevel <= f01 ? (
outval ? (
outval = 0;
midisend(offset, inChannel+$xB0, outcc, outccval);
);
) : outlevel == 1 ? (
!outval ? (
sendcc == 2 ? (
outval = 127;
midisend(offset, inChannel+$xB0, outcc, outval);
);
)
) : (
!outval ? (
sendcc != 2 ? (
outval = 127;
sendcc ? (
midisend(offset, inChannel+$xB0, outcc, outval);
);
);
);
);
);
@sample
outlevel *= modstep;
spl0*=outlevel;
spl1*=outlevel;
@gfx 640 400
gfx_r=gfx_g=gfx_b=0; gfx_a=1;
gfx_x=gfx_y=0;
gfx_rectto(gfx_w,gfx_h);
outcc >= 0 ? (
outval ? (
gfx_r = 0; gfx_g = 0.5; gfx_b = 0;
gfx_x = 0;
gfx_y = 0;
gfx_rectto(gfx_w, gfx_h/2);
);
);
q1 = (gfx_w-3) / maxCCvalue;
q2 = gfx_h-2;
//gfx_line();
gfx_r=gfx_g=gfx_b=1;
gfx_y = 0;
gfx_x = 0;
x = 0;
while (x<=maxCCvalue) (
a = x*q1;
b = gfx_h - f(x)*q2;
gfx_lineto(a, b, 1);
x = x+1;
);
gfx_x = 0;
gfx_y = gfx_h -f(finstart)*q2;
gfx_lineto(gfx_w, gfx_y);
findisplay = gfx_y;
gfx_y = 0;
gfx_x = modval*q1 + 1;
gfx_r=1; gfx_g=1; gfx_b=0;
gfx_rectto(gfx_x+3, gfx_h);
gfx_x = 0;
gfx_y = gfx_h-outlevel*q2-2;
gfx_r=1; gfx_g=1; gfx_b=0;
gfx_rectto(gfx_w, gfx_y+3);
gfx_x = 10;
gfx_r=1; gfx_g=0; gfx_b=0;
gfx_y = findisplay-20;
gfx_drawstr(str1);
outcc >= 0 ? (
gfx_x = 10;
gfx_y = gfx_h-12;
gfx_drawstr(str01);
);
pipelineaudio
03-08-2018, 07:23 PM
Awesome! GOing to try it in a second. I've been in and out sick, but I did get a chance to test MIDI CC Table with Daniel Perry's track mute and fade script, and it seriously works REALLY REALLY simply well with MIDI CC table! incredible even...Gonna try the new MIDI Fade X now
pipelineaudio
03-08-2018, 07:30 PM
New mute is working as it should! Still getting the every other time thing, but I'm convinced that's down to the unmuting part and I'm still working out how to handle that
pipelineaudio
03-08-2018, 07:32 PM
Justin was saying that instead of muting tracks, I should be bypassing plugins, it seems like a script or action could do this as well, but I want to be a lot more sure of why and exactly what he means, as right now, muting is working so well for this
mschnell
03-08-2018, 10:53 PM
...I'm still working out how to handle that
Let me know if I can help in any way...
Michael
mschnell
03-08-2018, 11:00 PM
Justin was saying that instead of muting tracks, I should be bypassing plugins, it seems like a script or action could do this as well, but I want to be a lot more sure of why and exactly what he means, as right now, muting is working so well for this
The muting/unmtting idea was stolen from LiveConfigs.
I don't see that there is a great difference between muting a track (with the "save CPU" option set) and bypassing all plugins in that track. And of course Midi Fader X would need to stay active, so that the audio is muted.
I suppose a ReaScript can be done that gets the track number and then cycles through all plugins that are loaded in that track and mutes them. But to do this would need some advanced Rea-Scripting skills.
When I do experimenting with my sounds I often try out plugins and bypass them when I (maybe temporarily) don't want them. This obviously gets in the way with automatic muting, but of course I could deactivate them instead of bypassing them.
-Michael
pipelineaudio
03-09-2018, 01:01 AM
So my simple test text looks like this:
"12:13=0 12:1=127 < 12:1=0
12:13=1 12:2=127 < 12:2=0"
12:13 is the unmute script you made
12:1=127 fades in MIDI Fade X
12:1=0 fades out MIDI Fade X. Midi Fade X sends out Channel 12 CC 14 for mute_track_x.eel
I'm going to run some more tests to see which messages get where on every and every other press
pipelineaudio
03-09-2018, 01:10 AM
Ok, for sure, every other press, coming when the track is muted, no midi at all is reaching the track. I wonder why its different using SWS Live configs for the same actions, for some reason, the actions still run on that.
I wonder if MIDI Fade X could be run on the sends, or better yet on the audio input track, and have it run on the sends on that. Not really sure where to go from here
mschnell
03-09-2018, 07:41 AM
I wonder if MIDI Fade X could be run on the sends, or better yet on the audio input track, and have it run on the sends on that.
I don't understand :(
My "default" intention was:
Use one track for Midi input and Midi CC Map.
Use one track for Audio input, holding commonly used plugins such as a Noise Gate.
Use multiple other tracks for different sounds, each holding Midi Fade X in the end to smoothly mute them.
Route Midi from the Midi CC Map track to the effect tracks and with MidiToreaControlPath to the Control Path.
Route audio from the audio input track to all other audio tracks,
Have Midi CC Map control effect plugins, all Midi Fader X plugins and track unmuting.
Have the Midi Fader X plugins control muting of their respective track (either via MidiToReaControlPath in any Effect track or by routing the Midi to some central track).
This written, I suppose the the "every other press" problem might be the following:
Midi Fader X mutes its own track and hence is not able to react to a Midi message it then receives.
Later, Midi CC Map sends a track activate message and a Fader message at the same time. Supposedly the Fader message arrives too early at Midi Fader X and is discarded while the track i still muted.
Hence I suppose I need to enhance Midi CC Map in a way that it can delay some messages in a row, so the track activation happens first and the controlling of Midi Fader X (and other plugins that might reside in that track) a short time later.
I suppose LiveConfigs does handle this problem automatically, by first doing the activation and after a short delay any other stiff that is denoted in that row.
-Michael
pipelineaudio
03-09-2018, 02:16 PM
My setup is about exactly the way you describe.
I wonder if something similar to MIDI Fade X could bemade for the audio input track and work on the sends. I guess it would have to be some crazy multi channel JSFX, but JSFX can indeed do that, not sure what else might be in the way
mschnell
03-09-2018, 03:26 PM
You can use multiple instances of Midi Fade X and send their outputs to different channels via pin routing. Now you can route the channels to other tracks with standard Reaper means.
-Michael
pipelineaudio
03-09-2018, 06:00 PM
You can use multiple instances of Midi Fade X and send their outputs to different channels via pin routing. Now you can route the channels to other tracks with standard Reaper means.
-Michael
Big huge DUH on me! You are exactly right! About to make an octopus frankestein audio input track and test it!
pipelineaudio
03-10-2018, 01:15 AM
Ok, this is showing some promise.
mschnell
03-10-2018, 01:34 AM
Big huge DUH on me!
?? -> https://en.wikipedia.org/wiki/Duh
-Michael (NANS = "Not A Native Speaker")
pipelineaudio
03-10-2018, 01:52 AM
It means I should have seen that option.
This is working really really well, just trying to get the crossfades right now, since now this fade is at the input instead of the output of the track and that can make some strangeness on the nonlinear fx like distortion
mschnell
03-10-2018, 04:00 AM
If you want to install the input fading just for avoiding the "Midi message arrives to Midi Fader X when track is still muted" - problem, this of course can be done in the output, as well, avoiding FX spilling problems.
Either do a multi-channel output track with multiple Midi Fader X plugins and route the audio effect tracks to dedicated channel.
Or do a second never-muted track for any Audio FX track just holding Midi Fader FX.
But anyway, in the end I'd like to see something that is easily configured even for "newbies". And this does not seem to apply for a multi-channel Octopus nor for duplicating the tracks.
Sp I think, I'll do a Midi CC Map version that sends all messages that are no track-unmutes after some delay.
-Michael
pipelineaudio
03-10-2018, 04:32 AM
I got a pretty good one working right now, and about to try a multichannel master output track that I could put 10 MIDI Fade X's on so that it would be the output getting faded out.
mschnell
03-10-2018, 05:11 AM
Happy experimenting ! :)
-Michael
BenK-msx
03-10-2018, 02:25 PM
Once settled please shows results from this torture of learning so that we all may benefit!
pipelineaudio
03-10-2018, 02:37 PM
Once settled please shows results from this torture of learning so that we all may benefit!
I keep meaning to post a zip file with all the actions and scripts and settings and an rpp....and then I say "just one more tweak", lather rinse repeat
One of these days
mschnell
03-10-2018, 02:46 PM
Once settled please shows results from this torture of learning so that we all may benefit!
My goal is to promote Reaper as a tool for live musicians, and if possible provide the most easy tools to set this up.
As you see, Pipe and I are working on finding the most easy to use solution, even while Pipe already has succeeded in doing a decently working setup (as shown in his videos). We do think that this is worth the torture.
This aims as well to guitarists, as to keyboarders, as to those wanting to do "live loop programming" (even though I don't have any idea whatsoever of this third issue). But of course it's necessary to find a whole group of supporters for these ideas to make it viable.
That is why supposedly at first we need to find a decent place where to discuss that stuff. At best this would be a dedicated "Reaper Live" subforum here. If that happens, you hopefully will find a toolbox that fits your needs there, including documentation and the necessary support to get it going.
-Michael
pipelineaudio
03-10-2018, 02:52 PM
hahah!!!!!!!! Bypass the wah with Midi Fade X's mute output signal! Simple elegant solution to a really vexxing timing problem
pipelineaudio
03-12-2018, 12:57 AM
I got one working kind of ok with the new stuff, but still having the problem of needing to step through all the pedals several times to get everything to work upon project load.
With the SWS version running MIDI Fade X, I was able to make a startup action that ran thru everything, I suppose I could try the same thing with MIDI CC's instead, but man its frustrating
BenK-msx
03-12-2018, 05:30 AM
My goal is to promote Reaper as a tool for live musicians, and if possible provide the most easy tools to set this up.
As you see, Pipe and I are working on finding the most easy to use solution, even while Pipe already has succeeded in doing a decently working setup (as shown in his videos). We do think that this is worth the torture.
This aims as well to guitarists, as to keyboarders, as to those wanting to do "live loop programming" (even though I don't have any idea whatsoever of this third issue). But of course it's necessary to find a whole group of supporters for these ideas to make it viable.
That is why supposedly at first we need to find a decent place where to discuss that stuff. At best this would be a dedicated "Reaper Live" subforum here. If that happens, you hopefully will find a toolbox that fits your needs there, including documentation and the necessary support to get it going.
-Michael
No rush guys, just showing interest in getting my head around it once you are happy with your endeavours -
mschnell
03-12-2018, 08:00 AM
I got one working kind of ok with the new stuff, but still having the problem of needing to step through all the pedals several times to get everything to work upon project load.
Later this day I suppose I can do a Midi Map with delay.
Please stay tuned and test same before we do the next step.
-Michael
pipelineaudio
03-12-2018, 03:03 PM
I tell you what: this sticking all of the MIDI Fade X's on one track is seriously awesome.
Is it beyond the realm of possibilities to make all ten of them into one JSFX plugin?
I'll stick the RPP I'm using right now so you can get an idea of what I'm looking at
Its all happening on track 11 "Switching Matrix"
https://www.dropbox.com/s/wwffzmzlm92u0le/MFX%20MCT%20Output%20Matrix%20Template%20with%20Sp illover%20pitchproof%20hornet%20Wah%205153m.rpp?dl =0
mschnell
03-12-2018, 10:24 PM
Is it beyond the realm of possibilities to make all ten of them into one JSFX plugin?
Of course it would be possible, but why not three or thirty of them in one ?
IMHO this does not make much sense.
-Michael
mschnell
03-13-2018, 01:52 PM
I have not yet been able to do a decently working version of Midi CC Table with delay :( .
As a compensation, here is a small JSFX that can be used as a virtual Mid Pedalboard for testing:
desc: Trigger CC
slider1:0<0,15,1{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}>MIDI Channel
slider2: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,12 6,127}>CC
slider3:0<0,127,1)>CC Val 0
slider4:1<0,127,1)>CC Val 1
slider5:2<0,127,1)>CC Val 2
slider6:3<0,127,1)>CC Val 3
slider7:4<0,127,1)>CC Val 4
slider8:5<0,127,1)>CC Val 5
slider9:6<0,127,1)>CC Val 6
slider10:7<0,127,1)>CC Val 7
slider11:8<0,127,1)>CC Val 8
slider12:9<0,127,1)>CC Val 9
@slider
msg1 = 0xB0 + slider1;
msg2 = slider2;
@block
t = trigger;
t ? (
x = 0;
loop (10,
t & (1<<x) ? (
msg3 = slider(x+3);
midisend(0, msg1, msg2, msg3);
);
x += 1;
);
);
pipelineaudio
03-13-2018, 03:03 PM
THAT is handy!!!!
For the multi input fade x thing, I was thinking it would simplify things. If you don't think so, no problem, as once this is done, the track that does it can easily be shared as a track template
mschnell
03-13-2018, 10:46 PM
"trigger" is a very hidden feature of the eel2 language :) . I just happened to find this easter-egg.
-Michael
mschnell
03-14-2018, 01:35 PM
Here "Midi CC Table" with delay.
You can set a delay time, and a channel that is not to be delayed.
So you can have the tracks unmuted and after a short time the messages to the plugins that reside in the channel are sent.
Please test !
After that please let me know what you think causes the problem that you need to press any buttons to get the system started decently, so that we can think about a decent startup procedure.
-Michael
// 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,12 6,127}>CC Input
slider5:0<0,15,1{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}>No Delay Channel
slider6:0<0,1000,1>Delay (msec)
@init
//#font = "Courier New";
//#font = "Liberation Mono";
#font = ""; // Default
q_size = 32;
cols = 32;
cols3 = cols*3;
cols23 = cols3*2;
//cc_nr_i = 0*rows;
//cc_val_i = 1*rows;
ssb = q_size; // Spread sheet base
q_ = 0;
q_wr = 0;
q_rd = 0;
function slider_file_to_numbered_strings(slidernumber,offse t)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;
);
function queue_wr(inval) (
q_wr += 1;
q_wr >= q_size ? q_wr = 0;
q_[q_wr] = inval;
);
function queue_rd() local (n) (
n = q_wr-q_rd;
n ? (
q_rd +=1;
q_rd >= q_size ? q_rd = 0;
q_[q_rd];
) : (
-1;
);
);
function do_message(inval, nodelay, delay) local (ci, cj_p, cj_a, coli_p, coli_a, src_p, src_a, ch_p, ch_a, _ch_p, _ch_a) (
ci = inval;
ci < row ? (
act = ci;
act != pre ? (
conf && (pre>=0) ? ( // off messages of previous row
cj_p = 0;
coli_p = pre * cols23 + cols3;
src_p = ssb + coli_p /*+ cj*3*/;
while (src_p[0] >= 0) (
ch_p = src_p[0];
nodelay ? (
_ch_p = delay_ch == ch_p;
) : delay ? (
_ch_p = delay_ch != ch_p;
) : (
_ch_p = 0;
);
_ch_p ? midisend(offset, $xB0+src_p[0], src_p[1], src_p[2]);
cj_p += 1;
src_p += 3;
);
);
cj_a = 0;
coli_a = ci * cols23; // on messages of new row
src_a = ssb + coli_a /*+ cj*3*/;
while (src_a[0] >= 0) (
ch_a = src_a[0];
nodelay ? (
_ch_a = delay_ch == ch_a;
) : delay ? (
_ch_a = delay_ch != ch_a;
) : (
_ch_a = 0;
);
_ch_a ? midisend(offset, $xB0+src_a[0], src_a[1], src_a[2]);
cj_a += 1;
src_a += 3;
);
);
delay && conf ? pre = act;
);
);
@slider
conf = slider2;
inChannel = slider3;
modcc = slider4;
delay_ch = slider5;
delay = slider6 / 1000;;
!delay ? delay_ch = -1;
dd = 0;
act = -2;
pre = -1;
q_wr = 0;
q_rd = 0;
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;
);
act = -1;
pre = -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)) (
midisend(offset, msg1, msg2, msg3); // pass through
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?
queue_wr(msg3);
do_message(msg3, 1, 0);
dd =srate / samplesblock * delay;
dd = floor(dd) + 1;
);
);
);
);
dd > 0 ? (
dd -= 1;
!dd ? (
msg = queue_rd();
while (msg >= 0) (
do_message(msg, 0, 1);
msg = queue_rd();
);
);
);
@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;
lines ? (
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;
gfx_r=0.7;gfx_g=0.7;gfx_b=0.7;
loop(rm,
gfx_x = xx + (6+9*j)*textw -3;
gfx_y = 0;
gfx_lineto (gfx_x, yy;);
j += 1;
);
) : (
gfx_drawstr("No appropriate *.txt file in >>>> .../REAPER/Data/CC table <<<<");
);
mschnell
03-15-2018, 11:07 PM
Pipe, are you still here ?
-Michael
pipelineaudio
03-19-2018, 01:31 AM
Yup, sorry, our new group ukulele class has taken SERIOUS time out of my schedule, I will be testing this ASAP
mschnell
03-19-2018, 10:17 AM
Great ! Thanks !
-Michael
pipelineaudio
03-19-2018, 10:59 PM
Well, it definitely works. Where exactly does the delay happen? I can see where to set it, but not sure where or I guess when the delay would happen
mschnell
03-20-2018, 06:45 AM
When a message is received by Midi CC Table (appropriately configured) it will send out a bunch of messages - if appropriate as well on behalf of the "deselected" as on behalf of the "newly selected" row.
Each of the messages of course has a Midi channel (as defined in the configuration file) .
Now only the messages that feature the "Non Delay" channel are sent at once.
The messages that feature other channels are sent after a delay as specified by the "Delay" slider.
(A remark: if a new message arrives before the delayed messages are sent, they are not lost, but delayed further and sent together with those delayed messages that result from the last message received.)
(... If everything works correctly...)
-Michael
briandress
03-20-2018, 12:39 PM
When a message is received by Midi CC Table (appropriately configured) it will send out a bunch of messages - if appropriate as well on behalf of the "deselected" as on behalf of the "newly selected" row.
Each of the messages of course has a Midi channel (as defined in the configuration file) .
Now only the messages that feature the "Non Delay" channel are sent at once.
The messages that feature other channels are sent after a delay as specified by the "Delay" slider.
(A remark: if a new message arrives before the delayed messages are sent, they are not lost, but delayed further and sent together with those delayed messages that result from the last message received.)
(... If everything works correctly...)
-Michael
so essentially youre allowing trails for a signal by hardcoding a delay for the midi switch to be sent out right?
pipelineaudio
03-20-2018, 01:23 PM
Its also to allow muted tracks to be unmuted before sending messages to that track, which was a concern for some of the ways I was routing this
briandress
03-20-2018, 01:25 PM
Its also to allow muted tracks to be unmuted before sending messages to that track, which was a concern for some of the ways I was routing this
unmute before the changes is beneficial for a certain scenario im sure. can you tell me about an example?
mschnell
03-21-2018, 12:37 AM
Its also to allow muted tracks to be unmuted before sending messages to that track, which was a concern for some of the ways I was routing this
That is exactly the purpose the delay feature has been added for.
I suppose it's more than beneficial, but just necessary.
Does it work for you as expected ?
-Michael
pipelineaudio
03-21-2018, 10:40 AM
unmute before the changes is beneficial for a certain scenario im sure. can you tell me about an example?
Say a volume control message sent to a muted channel. It will be ignored.
I haven’t had a chance to test fully yet, but this new build should allow the volume control commands to be sent to midi fade x to wait until after the channel is unmuted
mschnell
03-21-2018, 12:55 PM
Once you confirm it works, I'll upload the collection of utilities to ReaPack.
After that we need to write a kind of comprehensive documentation ....
(Still no decent place to discuss this stuff :( .)
-Michael
pipelineaudio
03-23-2018, 01:02 AM
so I would want to put the unmute script on say channel 12 and the mute script to channel 13?
Not sure how to do this, MIDI fade X would want the same channel for both the volume control and the mute send
What I think I'm supposed to be doing is having it wait 50msec after the unmute command before the volume fade up command happens
mschnell
03-23-2018, 05:46 AM
I don't see the issue you suggest here.
The messages sent by Fade X are only supposed to trigger a mute, while the messages that are supposed to trigger an unmute are only sent directly by Midi CC Table.
So, yes, supposedly it does make sense to use different channels for those.
Can that be the cause of any problems ?
50 mSec seems like a viable delay value.
-Michael
mschnell
03-26-2018, 09:22 PM
@Pipe:
Do you think I can publish this ?
-Michael
pipelineaudio
03-26-2018, 09:53 PM
Most definitely! These tools are all EXTREMELY useful. I dont have an easy to use example reference starter project yet as I'm still experimenting, but these things all work and do what they are supposed to do, so I'm thinking releasing these into the wild will get people much smarter than I to begin making templates
mschnell
03-26-2018, 11:23 PM
OK,
So I will upload the tools to ReaPack later this day.
Perhaps at some point in time there might be a decent location (e.g. a subforum here) to publish the stuff in a more easily findable way, including example projects you might want to prepare.
-Michael
briandress
03-28-2018, 09:31 AM
so im actually hoping you guys can help me work with this plugin Helix Native.
It allows for snapshots of your signal chain within each preset so would work great for me.
You are able to select Snapshot Index from the FX Parameter menu and it adds this little subtrack called snapshot index under the track with the plugin.
Wondering if you guys know what i would do with that lol. I assume its some kind of automation track?
pipelineaudio
03-28-2018, 11:10 PM
If you can assign MIDI to the snapshot recall system, the table will do it for you.
briandress
03-29-2018, 08:38 AM
If you can assign MIDI to the snapshot recall system, the table will do it for you.
you cant. The mechanism to switch snapshots is an Automation Envelope. The slider on the envelope changes the active snapshot but I need be able to do it with switches
pipelineaudio
03-29-2018, 02:53 PM
I wonder if the action to CC script could be used to do it.
Honestly though, I don't want the lag of the snapshot recall, I'd just stick it in different tracks with the settings already loaded.
mschnell
03-29-2018, 03:33 PM
you cant. The mechanism to switch snapshots is an Automation Envelope. The slider on the envelope changes the active snapshot but I need be able to do it with switches
A plugin does not know about DAW "envelopes", it just communicates VST parameters with the DAW host.
In Reaper, any VST parameter can be modulated from Midi in a complex way. See PARAM -> FX Parameter List -> Parameter Modulation/Midi Link -> ...
Here you can either directly tie a parameter to a Midi CC that is sent to that track (e.g. from another track) or tie it to ReaControlMidi to do an even more sophisticated modulation.
-Michael
briandress
03-30-2018, 09:41 AM
I wonder if the action to CC script could be used to do it.
Honestly though, I don't want the lag of the snapshot recall, I'd just stick it in different tracks with the settings already loaded.
the term snapshot in this case refers to the snapshot function within Helix Native where your patch signal chain can have 8 different snapshots.
I think you can have something like 64 parameters and 10 different switches or something stored per snapshot and its instant recall for that patch.
so snapshot 3 has your drive delay and reverb enabled and snapshot 1 has the gain on the amp lower and just the drive on etc.
its kind of like the spreadsheet but within the plugin ecosystem itself/
I did find it can be controlled with CC values.
mschnell
03-30-2018, 11:30 AM
I did find it can be controlled with CC values.Great !
-Michael
pipelineaudio
03-31-2018, 11:30 AM
I may be getting a windows tablet today, which will make all of this a lot more real and a lot less academic
mschnell
04-04-2018, 07:32 AM
Finally all these tools are available on ReaPack (including a hopefully useful description).
Please test.
-Michael
briandress
04-05-2018, 11:00 PM
Finally all these tools are available on ReaPack (including a hopefully useful description).
Please test.
-Michael
not sure where to begin using this though the concept makes sense in yours and pipes posts
briandress
04-05-2018, 11:14 PM
learned much today. Installed Reapack and MIdi CC Table. now learning to use it is key. have to make the table file
mschnell
04-06-2018, 06:28 AM
Let me know it you can get on with the description that is displayed by ReaPack for this plugins and scripts.
I'd be happy to modify it according to your suggestions.
-Michael
pipelineaudio
04-08-2018, 12:59 PM
I'm really pushing hard on this now that I've got a live performance laptop to test with. I can get everything working great with a MOTU, but I really want to get it working well with lesser, regular grade drivers
mschnell
04-08-2018, 01:24 PM
For Live playing, I use an NI Audio 6. Same is especially offered for this purpose (robust, low latency).
-Michael
pipelineaudio
04-10-2018, 04:06 AM
Trying to make a simple template using all free fx and putting amplitube in somehow messes up Midi Fade X on some tracks but not others...Ill be looking at the log to try and get to the bottom of it. Its doing the works every other time thing
pipelineaudio
04-10-2018, 04:19 AM
Looking at the reacontrol midi log, every other time the troublesome track with amplitube on it is switched to, it gets no midi message. I onder if its to do with the 250ish sample delay amplitube adds
pipelineaudio
04-12-2018, 03:12 PM
Alright, this is getting usable and shareable, until we can get a live forum, not sure where to put this
http://pipelineaudio.net/2018/04/12/the-reaper-live-pedalboard-project/
mschnell
04-12-2018, 09:43 PM
Great ! Thanks !
It would be great to find a permanent place for this within the realm of Reaper, so that I could update the the ReaPack "about:" description of the JSFXes and ReaScripts to contain a link.
It's really time to have a "Reaper live" forum installed, now that there are several content providers waiting for it, and lot's of appropriate questions of new users are found in many other forums.
-Michael
pipelineaudio
04-12-2018, 10:26 PM
I asked Justin again, you should send him a pm
pipelineaudio
04-14-2018, 06:43 PM
As good as this is working, there's still some clicks and pops I'd like to see dead. Even the basic SWS Live version is so damn close by itself
briandress
04-15-2018, 04:21 PM
As good as this is working, there's still some clicks and pops I'd like to see dead. Even the basic SWS Live version is so damn close by itself
hows it all workin for you? im trying now to figure out a good scheme for a table.
anyway to make the midi tble genertion built into the gui? that way someone wont make mistakes on making a table file?
briandress
04-15-2018, 04:48 PM
Its crazy how many possibilities there are.
It can be any sort of pedalboard, from patch style to stomp style to a hybrid like digitech could do
this sounds amazing. i am still trying to figure out how to use it. any hopes of a tutorial of sorts?
briandress
04-15-2018, 05:09 PM
made a sample text file from the one you posted Michael. I saved it in Program Files > Reaper > InstallData> Date >(made new folder)CC Table >switches.txt
midi CC table says no file
briandress
04-15-2018, 05:15 PM
sorted that out.
had to put it in C://users>brian>appdata>roaming>Reaper>Data
i wonder why it doesnt use the main reaper folder
briandress
04-15-2018, 05:26 PM
this is really fun to learn.
As an absolute beginner to midi and reaper and vst in general I think a live section in the forum would be very beneficial.
I have made it to having Midi CC table recognize the file that I have created. The issue now is learning how to have the codes that Midi CC Table sends out be learned to certain things. I was planning a simple test of turning vsts on and off and but realized I had no way to actually assign the code to the vst parameter. How would I go about doing that if I do not have a controller to actually fire that code...in this case 2:2=1
mschnell
04-15-2018, 09:37 PM
anyway to make the midi tble genertion built into the gui?
That is how SWS LiveConfigs works: it comprises certain parts of a setup using MidiTable in a single component, but this obviously features certain some ambiguities and restrictions.
Doing a complex GUI with JSFX is not that easy to do. Maybe an independent program for managing the table file might be doable.
-Michael
mschnell
04-15-2018, 09:39 PM
i wonder why it doesnt use the main reaper folderThat is how the JSFX infrastructure works. Obviously allowing for multiple users on a system to have their own configuration directories.
-Michael
mschnell
04-15-2018, 09:49 PM
... sends out be learned to certain things.
Beware that "learn Midi messages" has a certain meaning in Reaper and handling same was one of the motivations for the MidiTable JSFX.
Only Midi messages in the realm of the Reaper Control Path (instead of in the tracks) can be "learned". Having Midi Messages be received by plugins in tracks is something else.
LiveConfigs sends messages to the Control Path, and so they can be used to be learned, but can't be used by plugins (VST/JSFX) in tracks, but only by Reaper functionalities allowing "learning", And LiveConfigs can "lean" Midi messages· but not (directly) those that are present in tracks.
OTOH MidiTable completely resides in the realm of the tracks. So it's messages can be received by plugins (that are configured appropriately and where the messages are routed by standard Reaper means), but not be "learned". To have MidiTable messages be learned, you need to route them to the Control Path by the MidiToReaCointrolPath VST.
MidiTable messages can obviously directly be received by VSTs that provide receiving Midi to modify their behavior.
If you need to use them to modify "VST parameters" (technical term = VST states Reaper can store and re-establish), you e.g. can use ReaControlMidi (instantiated in the same Track's FX chain) to assign the CC to one of it's "CC sliders" and then use the plugin's parameter modulation menu to assign the parameter to the ReaMidiControl "Slider". Hence avoiding the Complexity of the "Reaper Control Path" (i.e. "learn") altogether.
But you do need the Raper Control Path when e.g. automating the muting of tracks by MidiTable (see "Mute unmute Track X").
-Michael
pipelineaudio
04-16-2018, 12:11 AM
this sounds amazing. i am still trying to figure out how to use it. any hopes of a tutorial of sorts?
I'd grab the one from my website, I can flesh it out more if people really start grabbing this stuff
http://pipelineaudio.net/2018/04/12/the-reaper-live-pedalboard-project/
briandress
04-16-2018, 08:55 PM
I'd grab the one from my website, I can flesh it out more if people really start grabbing this stuff
http://pipelineaudio.net/2018/04/12/the-reaper-live-pedalboard-project/
i saw that. thanks for sharing. the difficulty for me is understanding how to implement the work.
I have the file made and Midi CC Table shows the graphic. I grasp the concept of writing the tables for activate vs deactivate messages. i understand about assigning one specifi Midi Channel to the predelay codes.
im trying right now to figure out how to actually assign codes to the vst controlls or the reaper unmute script things
briandress
04-16-2018, 09:01 PM
I'd grab the one from my website, I can flesh it out more if people really start grabbing this stuff
http://pipelineaudio.net/2018/04/12/the-reaper-live-pedalboard-project/
i cant really test your spillover stuff that patch is all full of bias fx
mschnell
04-16-2018, 09:40 PM
im trying right now to figure out how to actually assign codes to the vst controlls or the reaper unmute script things
I suppose by "codes" you mean "midi messages". What do you mean by "vst controlls" ? If that is something the dedicated VST you intend to use provides (e.g. shows in it's GUI) it is very possible, that that VST (by configuring same) allows to make that control follow Midi CC messages it directly receives. Other parameters (and/or these controls as well) of a VST might be accessible by "VST parameters" it directly communicates with Reaper via the "VST API". The "PARAM" menu offers the "Parameter Modulation / Midi Link" option for this. Here either direct access or (for more complex control) ReaMidiControl is a way to make use of those via MIDI.
Controlling Reaper internal stuff (such as track muting (or "learn") ) needs MidiToReaControlPath.
-Michael
pipelineaudio
04-16-2018, 11:34 PM
i cant really test your spillover stuff that patch is all full of bias fx
I'll try and make an all freeware version tomorrow at work
briandress
04-17-2018, 06:48 PM
I suppose by "codes" you mean "midi messages". What do you mean by "vst controlls" ? If that is something the dedicated VST you intend to use provides (e.g. shows in it's GUI) it is very possible, that that VST (by configuring same) allows to make that control follow Midi CC messages it directly receives. Other parameters (and/or these controls as well) of a VST might be accessible by "VST parameters" it directly communicates with Reaper via the "VST API". The "PARAM" menu offers the "Parameter Modulation / Midi Link" option for this. Here either direct access or (for more complex control) ReaMidiControl is a way to make use of those via MIDI.
Controlling Reaper internal stuff (such as track muting (or "learn") ) needs MidiToReaControlPath.
-Michael
Ok I will have to learn how to actually do it, it makes sense to read it but to actually build the tracks and route everything properly is a different story lol
briandress
04-17-2018, 09:47 PM
I suppose by "codes" you mean "midi messages". What do you mean by "vst controlls" ? If that is something the dedicated VST you intend to use provides (e.g. shows in it's GUI) it is very possible, that that VST (by configuring same) allows to make that control follow Midi CC messages it directly receives. Other parameters (and/or these controls as well) of a VST might be accessible by "VST parameters" it directly communicates with Reaper via the "VST API". The "PARAM" menu offers the "Parameter Modulation / Midi Link" option for this. Here either direct access or (for more complex control) ReaMidiControl is a way to make use of those via MIDI.
Controlling Reaper internal stuff (such as track muting (or "learn") ) needs MidiToReaControlPath.
-Michael
Ok so I have a track that has plugins midi cc table followed by reacontrolmidi.
My controller sends cc 21 values from the switches. So I set midi cc table "cc input" slider to 21
The table shows below the cc table sliders showing me the values that will be sent out
I have reacontrolmidi following midicctable with the log open to see what's coming through and it doesn't see anything coming
mschnell
04-17-2018, 10:18 PM
to actually build the tracks and route everything properly is a different story lol
Yep. The Reaper User Guide will help !
-Michael
pipelineaudio
04-18-2018, 11:19 AM
Little sketchy things are still making this a bit tricky to make stuff to share for others as templates.
Often times Sws startup action won’t perform as expected, with no rhyme or reason, sometimes it works fine upon loading a new project and sometimes it doesn’t.
Clicks and pops. Even with midi fade x we can still get some of these....I suspect because of muting, Ive been ask8ng Justin if there’s a way to flush whatever is in a track after muting it, not sure if that can be done
A really frustrating one is Amplitube....it has so much to offer a setup like this, but nearly always prevents Sws startup action from running correctly. Worse, it has some sort of buffer of 7 or so samples (showing in the reaper fx window) that cause clicks and pops and other weirdness
Also Amplitube for some reason can’t respond to midi pc messages anymore. It’s an ongoing topic at the IK forums.
So much of my troubles stem from the fact that unused tracks have to be muted to save cpu (or more specifically, keep RT Longest Block time low enough. I wonder if I couldn’t just do mor with routing so that nothing ever needs to be muted
briandress
04-19-2018, 10:13 AM
Little sketchy things are still making this a bit tricky to make stuff to share for others as templates.
Often times Sws startup action won’t perform as expected, with no rhyme or reason, sometimes it works fine upon loading a new project and sometimes it doesn’t.
Clicks and pops. Even with midi fade x we can still get some of these....I suspect because of muting, Ive been ask8ng Justin if there’s a way to flush whatever is in a track after muting it, not sure if that can be done
A really frustrating one is Amplitube....it has so much to offer a setup like this, but nearly always prevents Sws startup action from running correctly. Worse, it has some sort of buffer of 7 or so samples (showing in the reaper fx window) that cause clicks and pops and other weirdness
Also Amplitube for some reason can’t respond to midi pc messages anymore. It’s an ongoing topic at the IK forums.
So much of my troubles stem from the fact that unused tracks have to be muted to save cpu (or more specifically, keep RT Longest Block time low enough. I wonder if I couldn’t just do mor with routing so that nothing ever needs to be muted
I was just thinking the same thing in regards to just having everything in one track. I'm using kazrog now so it would be no big thing to just have three different amps loaded and assign their bypass parameters to cc codes sent from midi cc table. I don't know how your wah deal would work but the CPU savings are there if you put a vst in bypass vs on a separate muted track right?
briandress
04-19-2018, 10:18 AM
My idea would be setting it up for one song I have in mind. This song could just be track 1. I could put two different distortion plugs, two different amp sims, two different nadir instances for cabs, two different reverb plugins etc and then have midi cc table just switch between the groups based the table right? I could still use live configs or cc table unmute/mute between songs. So I'd just have each song on its own track?
larryJ
04-19-2018, 10:37 AM
I did create a web interface for REAPER that I use for Theater that uses a state table to jump to numbered markers (for engagement of envelope settable settings) and to mute and unmute named tracks...all together based on a tab delimited state table that would be built in Excel. For details, see the REAPER tab on my web site ... www.WorkWebs.com You can download the HTML and other sample stuff from there.
pipelineaudio
04-19-2018, 02:47 PM
I was just thinking the same thing in regards to just having everything in one track. I'm using kazrog now so it would be no big thing to just have three different amps loaded and assign their bypass parameters to cc codes sent from midi cc table. I don't know how your wah deal would work but the CPU savings are there if you put a vst in bypass vs on a separate muted track right?
That would be a way that MIDI CC table could go HUGE
Some of these plugs have parallel paths so you could get two completely different chains that way, but some things, like parameter reset would still be weird
briandress
04-19-2018, 10:05 PM
That would be a way that MIDI CC table could go HUGE
Some of these plugs have parallel paths so you could get two completely different chains that way, but some things, like parameter reset would still be weird
What do you mean by parameter reset?
pipelineaudio
04-20-2018, 10:43 AM
say its a patch that you could turn delays and choruses on and off. In some cases you'd like that stuff to be on when you returned to that patch and sometimes off.
briandress
04-20-2018, 04:44 PM
say its a patch that you could turn delays and choruses on and off. In some cases you'd like that stuff to be on when you returned to that patch and sometimes off.
I think I can understand that but you could just have a specific setup for that. Because you can have multiple instances of midi cc table just one for each track right?
So on one track you can have your midi cc table to send out whatever config you need up to however many switches you have. you could set those effects to their own switch even if you want to for just that specific midi table. Or you could have a button that turns on all 4 or just 1 3 and 4. It's totally flexible depending on what you write into the table
In the next track you can have an entirely new midi cc table sheet for the plugins you need in that track. Then you just use tracks for your songs. You don't need to unmute anything really. Just get creative in how you bypass/unbypass your plugs
briandress
04-20-2018, 04:48 PM
My problem is that I don't know how to set the actual plugins to whatever is coming out of the cc table
mschnell
04-20-2018, 10:32 PM
multiple instances of midi cc table just one for each track
I would not recommend using multiple instances of Midi CC Table.
Routing Midi streams between tracks is easily doable and very flexible with Reaper. Please see the Reaper User Guide.
-Michael
mschnell
04-20-2018, 10:35 PM
My problem is that I don't know how to set the actual plugins to whatever is coming out of the cc table
This obviously depends on the Midi Features the "actual plugin" provides. (e.g. Kontakt can switch internal patches (instruments) by Midi Program Change Messages, and assign (internally "learn" by right-click) Midi CC messages to close to all Parameters of the instruments loaded in same. I understand the same is true for Effects (by Native Instruments) such as "Guitar Rick".)
-Michael
briandress
04-21-2018, 03:25 PM
This obviously depends on the Midi Features the "actual plugin" provides. (e.g. Kontakt can switch internal patches (instruments) by Midi Program Change Messages, and assign (internally "learn" by right-click) Midi CC messages to close to all Parameters of the instruments loaded in same. I understand the same is true for Effects (by Native Instruments) such as "Guitar Rick".)
-Michael
ok so just doing a little digging I found the Link Parameter to Midi section on the plugins. I assigned all my plugins bypass parameter to a separate CC Here is my Midi Table
I have midi cc table input set to channel 1 CC 1 which is what my controller is sending. I have Amps Delay and Distortion bypasses set to CC 3 4 5 and 6 offset 0 and Scale 100% for each. I cant seem to get it working though. Any advice on where to start checking is appreciated
mschnell
04-21-2018, 11:15 PM
Parameter link is only necessary if the plugin itself is not able to receive Midi to control the appropriate function.
7:7=1 7:7=2 7:7=3 7:7=4 7:7=5 7:7=6 7:7=7 7:7=8
This does not seem to make much sense.
It will send multiple values to the same controller, right one after the other in a single shot within no time at all. Close to any receiver will only use the last value.
I don't get what are you trying to accomplish by that.
-Michael
briandress
04-22-2018, 09:13 AM
Parameter link is only necessary if the plugin itself is not able to receive Midi to control the appropriate function.
This does not seem to make much sense.
It will send multiple values to the same controller, right one after the other in a single shot within no time at all. Close to any receiver will only use the last value.
I don't get what are you trying to accomplish by that.
-Michael
youre right. it does make no sense. I was just filling stuff in just to see if the plugin would detect the data in the text file and populate it in the plugin GUI.
I have attached a new one that is meant to manipulate 4 different plugins based on which switch I press either 1 or 2.
I have attached my reaper project here as well. maybe i messed it up.
briandress
04-22-2018, 10:27 PM
i did get this working and it is working quite amazingly i might add.It is quite interesting having the ability to send out so many different combinations. I really need no muting at all. I can have 5 amp sims, 5 tube screamers, 5 impulse responses, 5 delays, all set up how i want for one switch. That switch will turn on its own configuration and when leaving will deactivte its config allowing the next switch to enable its config.
briandress
04-22-2018, 10:37 PM
so I got this to work and wow is this impressive. Holy cow.
I was able to take two amp sims and toggle between the two of them using bypass on and off. I was also able to take one amp sim and set up three different lines of the table to send out the codes to switch channels on the amp from clean to crunch to lead. so crazy. i can at the same time that I am switching the channels switch the amount of gain.
pipelineaudio
04-23-2018, 11:11 AM
This was the point, to give us at the very least, the type of control we had back in the stone aged 1980's.
You can really just about come up with any combination you want and switch it, including setting custom fade in and fade out times
pipelineaudio
04-23-2018, 04:17 PM
How can i get MIDI CC's to the master fader so I can set up a volume pedal o nthe output?
mschnell
04-23-2018, 09:15 PM
While this should be possible by a ReaScript, maybe you also could use Midi Fade in the Master effect chain (I did not try to find out how to route Midi Messages to the Master Effect Chain, though.)
-Michael
briandress
04-27-2018, 11:11 PM
So I just had an idea right now when sorting out how I would work spillover and the fact that I’m trying to avoid muting and unmuting. Is there a way that we can have multiple delay channels? That way we can just set up different timers for how long we want the delay to keep going when we switch
mschnell
04-27-2018, 11:39 PM
trying to avoid muting and unmuting
With a setup based on Midi Table and Midi Fade X, the only point in using mutin / unmuting channels is saving CPU for unused channels, as the audio of same is muted by Midi Fader X, anyway.
So "avoid" is the "native" stage, while "doing" gets on top of the setup, to be more secure from clicks and dropouts due to CPU overload.
-Michael
pipelineaudio
04-28-2018, 11:24 AM
I would love a way to switch routing, it would work for what you are looking for and also for instances where I want the same basic track, but want it router or not to different tracks
You could almost do it from sws live's input track, but that only works for one basic track
mschnell
04-28-2018, 02:47 PM
Sorry, but I have no idea what you mean here, and what you are referring to.
-Michael
pipelineaudio
04-30-2018, 12:29 PM
I think I could actually do it with MIDI CC Table
Most of my patches use the same basic sound, so I'd like to say have three basic tones
1. clean
2. distorted
3. REALLY distorted
The variations after that would be individual effects that run in series or parallel with one of these three sounds. What I'd like to do is first be able to pick which of these 3 I'd like to send to first, and then switch routings to various channels with FX on them, without switching away from the basic sound that its already on
SWS Live doesnt seem to be able to do this, but I think I can find a way to do it with MIDI CC table, I'll give it a try today
mschnell
04-30-2018, 12:44 PM
I think I can find a way to do it with MIDI CC table,
I'm rather sure you can.
Enough instances of Midi Fade X will prevent any need for switching of routing.
-Michael
pipelineaudio
05-10-2018, 12:59 AM
It just occurred to me that MIDI CC Table could be used to create snapshots like on the helix
pipelineaudio
05-10-2018, 01:36 AM
I need to switch in and out a parallel path, I could do it on the same channel or a different channel, and I'll need to switch VSTs in and out, what do you think a safe way to do that would be?
pipelineaudio
05-10-2018, 10:50 AM
Did the wah auto engage ever make it to reapack? I cant find it
mschnell
05-13-2018, 03:44 PM
Yep. It's called "Midi Auto Engage"
-Michael
briandress
05-29-2018, 11:35 PM
It just occurred to me that MIDI CC Table could be used to create snapshots like on the helix
That’s pretty much exactly what I’m doing. You can map any parameter to a cc. So dividing the parameter value into 127 you can set any parameter at one cc command. One let’s change the tonestack controls, power amp gain, preamp gain, reverb mix and noise gate threshold all at the same time with one footswitch click. Lmfao the power of this plugin is amazing. The only thing I’m fiddling with now is configuring reverb/delay tails
briandress
05-29-2018, 11:43 PM
At this point I’m trying to decide if I need the flexibility to turn off individual plugins independently of midi cc table or if I can make do by just presenting 10 snapshots and using my guitar vol knob
pipelineaudio
05-30-2018, 12:03 AM
Combine it with LBX Stripper and you can have both
vBulletin® v3.8.11, Copyright ©2000-2025, vBulletin Solutions Inc.