View Single Post
Old 02-09-2018, 11:56 AM   #58
mschnell
Human being with feelings
 
mschnell's Avatar
 
Join Date: Jun 2013
Location: Krefeld, Germany
Posts: 14,686
Default

Quote:
Originally Posted by pipelineaudio View Post
I’m going to try to figure out some crossfading tricks....too bad there’s no action for “fade in sends”
Did you try the "Tiny Fade on Config Switch" setting with LiveConfigs ?
Did you happen to find out what this exactly does ? (I seem to remember I always used the default setting.)

Anyway:
here is the "Midi Crossfade" JSFX.
It performs a crossfade between channels (1 and 2) vs (3 and 4) mixing down to (1 and 2). The balance is controlled by a CC. The fading speed is limited according to a slider setting. Hence it will smoothly crossfade when teh CC jumps between 0 and 127. You can watch the fading in the graphics (supposedly self-explaining)

-Michael

Code:
desc:Midi Crossfade
author: Michael Schnell (mschnell@bschnell.de)
version: 1.0
changelog: initial release
donation: United Nations Foundation http://www.unfoundation.org/
about:
  ## Description

  Pipe
 
  ## Limitations

  Pipe




// Author: Michael Schnell, based on a work of Time Waster (M. Smith)
// 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,126,127}>CC Input
slider3:-0.3<-1,-0.1,0.01>Attenuation per CC step
slider4:0.01<0.0005, 0.01, 0.0001>max step(dB)
//slider5:0<0,1,0.01>Factor a (Test)
//slider6:0<0,1,0.01>Factor b (Test)

@init
  modval      = 0;
//  prelevel    = 0;
  maxCCvalue  = 127;
  r4          = log(10)/20;
  
  function fca(x) (
    x < limit  ? (
      x*r3;
     ) : (
      exp((maxCCvalue-x) * r5);
    );
  );

  function fcb(x) (
    fca(maxCCvalue-x);
  );


@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;
  s1a         = exp(log(10)*slider4/20);
  s1b         = exp(log(10)*slider4/20);
  s2a         = 1 / s1a;
  s2b         = 1 / s1b;
  fa          = fca(1);
  fb          = fcb(126);
  
@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 ? (
            outlevela < fa ? outlevela = fa;
          );
          modval != 127 ? (  
            outlevelb < fb ? outlevelb = fb;
          );  
          modlevela = fca(modval);
          modlevelb = fcb(modval);
        );
      );
    );
    midisend(offset, msg1, msg2, msg3); // pass through
  );    
  
  modval ? (
    modstepa  = exp( log(modlevela / outlevela) / samplesblock);
    modstepa == 1 ? (
      steppinga = 0;
     ) : (
      modstepa > s1a ? (
        modstepa = s1a;
       ) : modstepa < s2a ? ( 
        modstepa = s2a;
      );  
      steppinga = 1;
    );  
   ) : ( 
    modstepa = s2a;
 );    

  modval != 127 ? (
    modstepb  = exp( log(modlevelb / outlevelb) / samplesblock);
    modstepb == 1 ? (
      steppingb = 0;
     ) : (
      modstepb > s1b ? (
        modstepb = s1b;
       ) : modstepb < s2b ? ( 
        modstepb = s2b;
      );  
      steppingb = 1;
    );  
   ) : ( 
    modstepb = s2b;
 );    

//slider5 = modlevela;                        // test
//slider5 = modlevelb;                        // test
 
  
@sample
  outlevela *= modstepa;
  outlevelb *= modstepb;
  spl0 = spl0 * outlevela + spl2 * outlevelb;
  spl1 = spl1 * outlevela + spl3 * outlevelb;  
  
  
@gfx 640 400

gfx_r=gfx_g=gfx_b=0; gfx_a=1;
gfx_x=gfx_y=0;
gfx_rectto(gfx_w,gfx_h);

q1 = gfx_w / maxCCvalue;
q2 = gfx_h;


gfx_r= 1; gfx_g=0; gfx_b=0;
gfx_y = 0;
gfx_x = 0;
x = 0;
while (x<=maxCCvalue) (
  a = x*q1;
  b = gfx_h - fca(x)*q2;
  gfx_lineto(a, b, 1);
  x = x+1;
);

gfx_r= 0; gfx_g=1; gfx_b=0;
gfx_y = 0;
gfx_x = 0;
x = 0;
while (x<=maxCCvalue) (
  a = x*q1;
  b = gfx_h - fcb(x)*q2;
  gfx_lineto(a, b, 1);
  x = x+1;
);

gfx_r=gfx_g=gfx_b=1;
gfx_y = 0;
gfx_x = modval*q1;
gfx_lineto(gfx_x, gfx_h);

gfx_r= 1; gfx_g=0; gfx_b=0;
gfx_x = 0;
gfx_y = gfx_h-outlevela*q2;   
gfx_lineto(gfx_w, gfx_y);

gfx_r= 0; gfx_g=1; gfx_b=0;
gfx_x = 0;
gfx_y = gfx_h-outlevelb*q2;   
gfx_lineto(gfx_w, gfx_y);

Last edited by mschnell; 02-09-2018 at 12:27 PM.
mschnell is offline   Reply With Quote