02-28-2018, 03:14 PM | #41 |
Mortal
Join Date: Jan 2006
Location: Wickenburg, Arizona
Posts: 14,047
|
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? |
02-28-2018, 11:11 PM | #42 |
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
|
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 |
03-01-2018, 03:00 PM | #43 |
Human being with feelings
Join Date: Dec 2016
Posts: 96
|
so each line of the "config" file corresponds to a CC number.
when the CC corresponding to that line comes in then it sends the codes on that line. so for Code:
1:64 1:65 // CC # 0 1:66 1:67 < 1:64 1:65 // CC#1 // CC #2 empty This will send out 64 and 65 when 0 comes in will send 66 and 67 when 1 comes in and also turn off 64 and 65 right? |
03-01-2018, 10:46 PM | #44 | |
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
|
Quote:
So the second line defines: When a CC value of 1 is received (with the Midi channel and CC number defined by the "in" sliders), it will send out "CC 66" on channel 1 with value 0, and "CC 67" on channel 1 with value 0. Additionally, when "Configs" Mode is set, and the last CC received had value 1 and hence row "1" is active, when a CC with some other value is received to select another row, it will send out CC number 64 and CC number 65 both on channel 1 and with value 0. If you intend to use this to fire dedicated On and Off actions, this seems appropriate (learning the "On" actions to the CCs 64 and 65, and the "Off" to the CCs 66 and 67. If you want to toggle an on/off switch in a plugin, that supposedly will use the CC values on a dedicated CC message you will do Code:
// CC #0: no definition 1:64=127 1:65=127<1:64=0 1:65=0 // CC#1 := "on" any other: "off" -Michael |
|
03-02-2018, 01:40 PM | #45 |
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
|
@Pipe and briandress:
To me, the syntax seems extremely simple and straight forward (of course, I did invent it ). I'd be really happy if I would get testing results form you ! Do you see the "spreadsheet" in the JSFX ? Here an updated version. 1) multiple blanks are allowed to be inserted between the definitions, also before and after the "<" 2) The graphic has been improved and now really looks like a spreadsheet. here you are: Code:
// Author: Michael Schnell, desc:Midi CC Table slider1:/cc table:none:CC Table slider2:0<0,1,1{Map,Configs}>Function slider3:0<0,15,1{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}>MIDI Input Channel slider4:1<0,127,1{0 Bank Sel M,1 Mod Wheel M,2 Breath M,3,4 Foot P M,5 Porta M,6 Data Entry M,7 Vol M,8 Balance M,9,10 Pan M,11 Expression M,12 Ctrl 1 M,13 Ctrl 2 M,14,15,16 GP Slider 1,17 GP Slider 2,18 GP Slider 3,19 GP Slider 4,20,21,22,23,24,25,26,27,28,29,30,31,32 Bank Sel L,33 Mod Wheel L,34 Breath L,35,36 Foot P L,37 Porta L,38 Data Entry L,39 Vol L,40 Balance L,41,42 Pan L,43 Expression L,44 Ctrl 1 L,45 Ctrl 2 L,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64 Hold P sw,65 Porta sw,66 Sustenuto sw,67 Soft P sw,68 Legato P sw,69 Hold 2 P sw,70 S.Variation,71 S.Timbre,72 S.Release,73 S.Attack,74 S.Brightness,75 S.Ctrl 6,76 S.Ctrl 7,77 S.Ctrl 8,78 S.Ctrl 9,79 S.Ctrl 10,80 GP B.1 sw,81 GP B.2 sw,82 GP B.3 sw,83 GP B.4 sw,84,85,86,87,88,89,90,91 Effects Lv,92 Trem Lv,93 Chorus Lv,94 Celeste Lv,95 Phaser Lv,96 Data B. Inc,97 Data B. Dec,98 NRP L,99 NRP M,100 RP L,101 RP M,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127}>CC Input @init //#font = "Courier New"; //#font = "Liberation Mono"; #font = ""; // Default //FUNCTIONS for reading .txt files //offset = starting string number //returns number of lines read cols = 32; cols3 = cols*3; cols23 = cols3*2; //cc_nr_i = 0*rows; //cc_val_i = 1*rows; ssb = 0; // Spread sheet base function slider_file_to_numbered_strings(slidernumber,offset)local(handle,lastvalue,lines) //USE ONLY THE NUMBER OF THE SLIDER FOR "slidernumber" - do not use "sliderx" ( slider(slidernumber) != lastvalue ? reload=0; !reload ? ( handle=file_open(slider(slidernumber)); file_string(handle,offset); while( strlen(offset) && offset < 1023 ) ( offset+=1; file_string(handle,offset); ); file_close(file); lines=offset; lastvalue=slider(slidernumber); reload=1; ); lines; ); @slider conf = slider2; inChannel = slider3; modcc = slider4; act = -1; pre = -1; lines = slider_file_to_numbered_strings(1, 0); row = 0; loop(lines, #s = strcpy(#, row); o = 0; col = 0; cc = -1; l = strlen(#s); src = ssb + row*cols23 + col*3; src[0] = -1; src[cols3] = -1; digit = 0; while (o < l) ( c = '0'; j = 0; while ((c >= '0') && (c <= '9')) ( digit = 1; j *= 10; j += c-'0'; c = str_getchar(#s, o, 'c'); o += 1; ); c == ':' ? ( // Channel digit ? src[0] = j-1; // ___0 = j; ) : c == '=' ? ( // CC # src[1] = j; cc = j; // ___1 = j; ) : (c == ' ') || (c == 13) || (c == '<') || (c == '/' || (o > l) )? ( // Value cc >= 0 ? ( src[2] = j; // ___2 = j; ) : ( src[1] = j; // ___1 = j; src[2] = 0; // ___2 = 0; ); src[0] >= 0 ? col += 1; cc = -1; src = ssb + row*cols23 + col*3; // ___s = src; src[0] = -1; c == '/' ? o = 999; // abort line c == '<' ? ( col = cols; // go on in this row src = ssb + row*cols23 + col*3; // ___s1 = src; // c = '0'; // j = 0; // src[0] = -1; ); ); ); row+=1; ); // ___n = 5*cols23; // ___x = ssb[___n]; // ___n1 = 5*cols23 + cols3; // ___x1 = ssb[___n1]; // ___n2 = 5*cols23 + cols3 + 1; // ___x2 = ssb[___n2]; @block while (midirecv(offset, msg1, msg2, msg3)) ( status = msg1 & $xF0; // Extract message type channel = msg1 & $x0F; channel == inChannel ? ( // Is it on our channel? status == $xB0 ? ( // Is it a controller event? msg2 == modcc ? ( // Is it the right CC? ci = msg3; ci < row ? ( conf ? ( act = ci; ); act != pre ? ( conf ? ( cj = 0; coli = pre * cols23 + cols3; src = ssb + coli /*+ cj*3*/; while (src[0] >= 0) ( midisend(offset, $xB0+src[0], src[1], src[2]); cj += 1; src += 3; ); ); cj = 0; coli = ci * cols23; src = ssb + coli /*+ cj*3*/; while (src[0] >= 0) ( midisend(offset, $xB0+src[0], src[1], src[2]); cj += 1; src += 3; ); pre = act; ); ); ); ); ); midisend(offset, msg1, msg2, msg3); // pass through ); @gfx 650 450 //display file gfx_r=gfx_g=gfx_b=0; gfx_a=1; gfx_x=gfx_y=0; gfx_rectto(gfx_w,gfx_h); gfx_setfont(2,#font,18); textw = gfx_texth * 0.6; gfx_r=1;gfx_g=gfx_b=1; xx = 10; yy =10; gfx_x=xx;gfx_y=yy; i = 0; rm = 0; loop ( row, i == act ? ( gfx_r=1;gfx_g=1;gfx_b=0; ) : ( gfx_r=0.7;gfx_g=0.7;gfx_b=0.7; ); ssb[i*cols23 /* + 0*3 + 0 */ ] >= 0 ? ( gfx_x=xx; #t = sprintf(#, "%d", i); gfx_drawstr(#t); gfx_x = xx + 3*textw; gfx_drawstr(">>"); j = 0; srb = ssb + i*cols23; while ((srb[0] >= 0) && (j < cols)) ( #t = sprintf(#, "%d:%d=%d ", srb[0]+1, srb[1], srb[2]); gfx_x = xx + (6+9*j)*textw; gfx_drawstr(#t); j += 1; srb += 3; ); gfx_y+=gfx_texth; rm < j ? rm = j; ); ssb[i*cols23 + cols3 /* + 0*3 + 0 */ ] >= 0 ? ( gfx_x=xx; #t = sprintf(#, "%d", i); gfx_drawstr(#t); gfx_x = xx + 3*textw; gfx_drawstr("<<"); j = 0; srb = ssb + i*cols23 + cols3; while ((srb[0] >= 0) && (j < cols)) ( #t1 = sprintf(#, "%d:%d=%d ", srb[0]+1, srb[1], srb[2]); gfx_x = xx + (6+9*j)*textw; gfx_drawstr(#t1); j += 1; srb += 3; ); gfx_y+=gfx_texth; rm < j ? rm = j; ); (ssb[i*cols23] >= 0) || (ssb[i*cols23+cols3 ] >= 0) ? ( gfx_x = 0; gfx_r=0.7;gfx_g=0.7;gfx_b=0.7; gfx_y += 5; gfx_lineto(gfx_w, gfx_y); gfx_y += 5; ); i+=1; ); yy = gfx_y - 5;; j = 0; loop(rm, gfx_x = xx + (6+9*j)*textw -3; gfx_y = 0; gfx_lineto (gfx_x, yy;); j += 1; ); |
03-02-2018, 02:21 PM | #46 |
Human being with feelings
Join Date: Dec 2016
Posts: 96
|
Ill try when I have some time. I never used Jsfx before so its all new to me.
|
03-02-2018, 02:47 PM | #47 |
Mortal
Join Date: Jan 2006
Location: Wickenburg, Arizona
Posts: 14,047
|
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 |
03-02-2018, 03:00 PM | #48 |
Mortal
Join Date: Jan 2006
Location: Wickenburg, Arizona
Posts: 14,047
|
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?
|
03-02-2018, 03:15 PM | #49 |
Mortal
Join Date: Jan 2006
Location: Wickenburg, Arizona
Posts: 14,047
|
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
|
03-02-2018, 03:42 PM | #50 |
Mortal
Join Date: Jan 2006
Location: Wickenburg, Arizona
Posts: 14,047
|
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?
|
03-02-2018, 10:05 PM | #51 |
Mortal
Join Date: Jan 2006
Location: Wickenburg, Arizona
Posts: 14,047
|
Wait could we call command ID's instead of CC's as well? Or is that only for scripts?
|
03-02-2018, 10:50 PM | #52 | |
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
|
To do a "learn" in Reaper You need to route the CC "down" to the Control Path by MitdiToReaControlPath to make it usable for a "learned" functionality.
To do the "learn" itself, this JSFX is not very usable, as it is made to send out multiple different CCs at a time. Here you should temporarily place a "Midi LFO Generator" plugin right behind it and set same to send the CC # and Midi channel in question. Now "learn" and deactivate the Midi LFO Generator. Maybe it would make sense to add some "send out CC for learning" function ? Quote:
Great ! -Michael Last edited by mschnell; 03-02-2018 at 11:41 PM. |
|
03-02-2018, 10:54 PM | #53 | |
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
|
Quote:
"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 Last edited by mschnell; 03-02-2018 at 11:43 PM. |
|
03-02-2018, 11:02 PM | #54 | |
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
|
Quote:
- 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 |
|
03-02-2018, 11:08 PM | #55 | |
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
|
Quote:
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 |
|
03-02-2018, 11:20 PM | #56 | |
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
|
Quote:
(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 Last edited by mschnell; 03-02-2018 at 11:48 PM. |
|
03-03-2018, 12:24 AM | #57 |
Mortal
Join Date: Jan 2006
Location: Wickenburg, Arizona
Posts: 14,047
|
so x:y=z
x is channel y is cc# and z is cc value? |
03-03-2018, 02:12 AM | #58 | |
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
|
Yep.
And just x:y simply means the CC value is 0. This might be useful when triggering actions (as initially requested), as the learning seemingly ignores the CC value. See above -> https://forum.cockos.com/showpost.ph...6&postcount=33 Quote:
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 Last edited by mschnell; 03-03-2018 at 02:24 AM. |
|
03-03-2018, 02:31 AM | #59 |
Mortal
Join Date: Jan 2006
Location: Wickenburg, Arizona
Posts: 14,047
|
So wait, what exactly launches a row? I thought it was the first 3 or 2 numbers
I am just not getting this |
03-03-2018, 06:18 AM | #60 |
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
|
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 |
03-03-2018, 10:31 AM | #61 |
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
|
Ah, I see that the comment in the example file was misleading. It should not contain a # !!!
Maybe I should add yet another more instructive example. If you want Midi CC Table to react on a Midi CC message on channel 3, CC # 4, value 5 by sending out a Midi CC message on channel 6 , CC # 7, value 8 plus a Midi CC message on channel 9, CC # 10, value 11, and if afterwards a Midi CC message again on channel 3 again with CC # 4 is received, but now with some other value but 5, you want it to issue a Midi CC message on channel 11 with CC # 12, value 13 plus a Midi CC message on channel 14, CC # 15, value 17 you would: - set the input channel slider to 3 - set the input CC # slider to 4 - set Mode to "Configs" - provide a file that containse these lines Code:
// this line is dummy as receiving CC value 0 provides nothing special // this line is dummy as receiving CC value 1 provides nothing special // this line is dummy as receiving CC value 2 provides nothing special // this line is dummy as receiving CC value 3 provides nothing special // this line is dummy as receiving CC value 4 provides nothing special 6:7=8 9:10=11 < 12:13=14 15:16=17 // definition for receiving CC value 5 // this line is dummy and not necessary to exist as receiving CC value 6 provides nothing special Last edited by mschnell; 03-03-2018 at 10:36 AM. |
03-03-2018, 12:20 PM | #62 | |
Human being with feelings
Join Date: Dec 2016
Posts: 96
|
Quote:
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 |
|
03-03-2018, 01:41 PM | #63 |
Mortal
Join Date: Jan 2006
Location: Wickenburg, Arizona
Posts: 14,047
|
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
|
03-03-2018, 03:23 PM | #64 |
Mortal
Join Date: Jan 2006
Location: Wickenburg, Arizona
Posts: 14,047
|
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
|
03-03-2018, 03:36 PM | #65 | |
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
|
Quote:
- 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 |
|
03-03-2018, 03:37 PM | #66 |
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
|
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 |
03-03-2018, 03:46 PM | #67 |
Mortal
Join Date: Jan 2006
Location: Wickenburg, Arizona
Posts: 14,047
|
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
|
03-03-2018, 03:50 PM | #68 |
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
|
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 Last edited by mschnell; 03-03-2018 at 03:56 PM. |
03-03-2018, 03:51 PM | #69 |
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
|
So you think I should include such functionality within Midi CC Map ?
I'll do some reasoning about this... -Michael |
03-03-2018, 04:08 PM | #70 |
Mortal
Join Date: Jan 2006
Location: Wickenburg, Arizona
Posts: 14,047
|
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. |
03-03-2018, 04:27 PM | #71 | ||
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
|
Quote:
To make Midi Fade X do it's stuff you make Midi CC Table send a different CC (on another channel!) with value 0 or 127, and (having ReaToMidiControlPath ignore this channel) route it (this channel) to another track (via the [ROUTE] button in the track header) where Midi Fade X resides. I don't know what exactly "bypass the wah" means. This might be done by Midi Fade X or by some parameter of the Wah plugin itself. Both can be controlled vie Track FX Midi and hence do not involve MidiToReaControlPath / Actions / Macros (see the paragraph above). Quote:
-Michael |
||
03-04-2018, 12:24 AM | #72 |
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
|
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 |
03-04-2018, 02:18 AM | #73 |
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
|
This in fact seems to be possible.
see -> https://forum.cockos.com/showpost.ph...99&postcount=3 Can you post a script that mutes / unmutes a track (and tell me how to install it and hook it to a newly defined Action ) so that I can test this feature with Midi CC Map ? Thanks -Michael |
03-04-2018, 01:51 PM | #74 |
Mortal
Join Date: Jan 2006
Location: Wickenburg, Arizona
Posts: 14,047
|
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 |
03-04-2018, 03:35 PM | #75 |
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
|
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 Last edited by mschnell; 03-04-2018 at 03:41 PM. |
03-04-2018, 04:07 PM | #76 |
Mortal
Join Date: Jan 2006
Location: Wickenburg, Arizona
Posts: 14,047
|
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. |
03-04-2018, 10:36 PM | #77 | |
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
|
Quote:
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 Last edited by mschnell; 03-05-2018 at 12:57 AM. |
|
03-05-2018, 02:43 AM | #78 |
Mortal
Join Date: Jan 2006
Location: Wickenburg, Arizona
Posts: 14,047
|
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
|
03-05-2018, 08:53 AM | #79 |
Human being with feelings
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,688
|
(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 |
03-05-2018, 11:03 AM | #80 |
Human being with feelings
Join Date: Aug 2012
Location: Finland
Posts: 2,668
|
get_action_context example:
(Toggle mute) Code:
function msg(m) ( ShowConsoleMsg(sprintf(#, "%d", m)); ShowConsoleMsg("\n"); ); function run() ( get_action_context(#foo, 0, 0, mode, res, val) ? ( (tr = GetTrack(0, val)) ? ( //msg(val); SetMediaTrackInfo_Value(tr, "B_MUTE", !GetMediaTrackInfo_Value(tr, "B_MUTE")); ); ); ); defer("run()"); |
Thread Tools | |
Display Modes | |
|
|