desc: Js parameter sliders & buttons, w/ sync @gmem[sync++] - v0.14alpha

import bangzero/bangzero_core.jsfx-inc
import bangzero/bangzero_gfx.jsfx-inc
import bangzero/bangzero_sl.jsfx-inc

slider1:490000<490000,1000000,10000>-sync1
slider2:0<0,100,0.1>-a1
slider3:0<0,100,0.1>-b1
slider4:0<0,100,0.1>-c1
slider5:0<0,100,0.1>-d1
slider6:0<0,100,0.1>-e1
slider7:0<0,100,0.1>-f1
slider8:0<0,1,1>-g1
slider9:0<0,1,1>-h1
slider10:0<0,1,1>-i1
slider11:0<0,1,1>-j1
slider12:0<0,1,1>-k1
slider13:0<0,1,1>-l1
slider14:490000<490000,1000000,10000>-sync2
slider15:0<0,100,0.1>-a2
slider16:0<0,100,0.1>-b2
slider17:0<0,100,0.1>-c2
slider18:0<0,100,0.1>-d2
slider19:0<0,100,0.1>-e2
slider20:0<0,100,0.1>-f2
slider21:0<0,1,1>-g2
slider22:0<0,1,1>-h2
slider23:0<0,1,1>-i2
slider24:0<0,1,1>-j2
slider25:0<0,1,1>-k2
slider26:0<0,1,1>-l2
slider27:490000<490000,1000000,10000>-sync3
slider28:0<0,100,0.1>-a3
slider29:0<0,100,0.1>-b3
slider30:0<0,100,0.1>-c3
slider31:0<0,100,0.1>-d3
slider32:0<0,100,0.1>-e3
slider33:0<0,100,0.1>-f3
slider34:0<0,1,1>-g3
slider35:0<0,1,1>-h3
slider36:0<0,1,1>-i3
slider37:0<0,1,1>-j3
slider38:0<0,1,1>-k3
slider39:0<0,1,1>-l3
slider40:0<0,16,1>-midi chan
slider41:32<32,192,32>-midi cc base

filename:0,bangzero_files/monofur.png

@init

function ctlzini( slnum1_, slcnt_, ltrch1_, numch_, syncsl_, syncoff_ )
  instance( slbase, slcnt, ltrch1, numch, slsync, syncoff, syncndx, oldsyncndx )
(
  slbase= slnum1_;
  slcnt= slcnt_;
  ltrch1= ltrch1_;
  numch= numch_;
  slsync= syncsl_;
  syncoff= syncoff_;
  slbase + slcnt;
);

function ctlzput()
  instance( slbase, slcnt, ltrch1, numch, slsync, syncoff, syncndx, oldsyncndx )
  local( ii, jj )
(
  syncndx ?(
    ii= 0; jj= slbase; loop ( slcnt,
      gmem[syncndx + ii]= sl(jj);
      ii+= 1; jj+= 1;
    );
  );
);

function ctlzget()
  instance( slbase, slcnt, ltrch1, numch, slsync, syncoff, syncndx, oldsyncndx )
  local( ii, jj )
(
  syncndx ?(
    ii= 0; jj= slbase; loop ( slcnt,
      gmem[syncndx + ii] != sl(jj) ? sl.slx(jj, gmem[syncndx + ii]);
      ii+= 1; jj+= 1;
    );
  );
);

function ctlzmunge()
  instance( slbase, slcnt, ltrch1, numch, slsync, syncoff, syncndx, oldsyncndx )
(
  sl.slx(slsync, round(sl(slsync), 10000));
  sl(slsync) == 490000 ? syncndx= 0
                       : syncndx= (sl(slsync) | 0) + syncoff;
  syncndx != oldsyncndx ?( this.ctlzget(); oldsyncndx= syncndx; )
                        : this.ctlzput();
);

function slzmidisend()
  instance( slbase, slcnt, ltrch1, numch, slsync, syncoff, syncndx, oldsyncndx )
  local( ii )
(
  midichan ?(
    ii= slbase; loop( slcnt,
      sl(ii) != sloldm.sl(ii) ?(
        lastcc= midibase+ii | ( sl(ii)/100 * (slmax.sl(ii)-slmin.sl(ii)) + slmin.sl(ii) + .5 |0 )* $x100;
        midisend(0, $xb0 + midichan - 1, lastcc );
      );
      ii+= 1;
    );
  );
);

function bnzmidisend()
  instance( slbase, slcnt, ltrch1, numch, slsync, syncoff, syncndx, oldsyncndx )
  local( ii )
(
  midichan ?(
    ii= slbase; loop( slcnt,
      sl(ii) != sloldm.sl(ii) ?(
        lastcc= midibase+ii | ( (slmin.sl(ii)?!sl(ii):sl(ii)) ? $x7f00 : 0);
        midisend(0, $xb0 + midichan - 1, lastcc );
      );
      ii+= 1;
    );
  );
);

function doctlzini( ii )
(
  ii= slz1.ctlzini(ii+1, 6, $'a', $'1', ii, 0); 
  ii= bnz1.ctlzini(ii,   6, $'g', $'1', slz1.slsync, 7);
  ii= slz2.ctlzini(ii+1, 6, $'a', $'2', ii, 0);
  ii= bnz2.ctlzini(ii,   6, $'g', $'2', slz2.slsync, 7);
  ii= slz3.ctlzini(ii+1, 6, $'a', $'3', ii, 0);
  ii= bnz3.ctlzini(ii,   6, $'g', $'3', slz3.slsync, 7);
  ii;
);

function slmunge()
  local( ii )
(
  // anything new?
  ii= sl.base; while( sl(ii) == slold.sl(ii) && (ii+= 1) < sl.base + sl.used );
  ii < sl.base + sl.used ? ii= 1 :(   
    ii= slt.base; while( slt.sl(ii) == sltold.sl(ii) && (ii+= 1) < slt.base + slt.used );
    ii= ii < slt.base + slt.used;
  );
  ii ?(
    midichan= sl(slmidichan);
    midibase= sl(slmidibase);
    midichan ?(
      ii= slz1.slbase; loop( slz1.slcnt, 
          sl.sltxtvalx(ii, sl(ii)/100 * (slmax.sl(ii)-slmin.sl(ii)) + slmin.sl(ii) + .5 |0); ii+= 1; );
      ii= slz2.slbase; loop( slz2.slcnt, 
          sl.sltxtvalx(ii, sl(ii)/100 * (slmax.sl(ii)-slmin.sl(ii)) + slmin.sl(ii) + .5 |0); ii+= 1; );
      ii= slz3.slbase; loop( slz3.slcnt, 
          sl.sltxtvalx(ii, sl(ii)/100 * (slmax.sl(ii)-slmin.sl(ii)) + slmin.sl(ii) + .5 |0); ii+= 1; );
    );
  
    slz1.ctlzmunge(); bnz1.ctlzmunge();
    slz2.ctlzmunge(); bnz2.ctlzmunge();
    slz3.ctlzmunge(); bnz3.ctlzmunge(); // if same sync gmem as sls1/2, overrides changes
  
    slt.sl(slrptlastcc) != sltold.sl(slrptlastcc) ?(
      rptlastcc= slt.sl(slrptlastcc);
      rptlastcc ? slt.slx(slopts, 0);
    );
    slt.sl(slopts) && slt.sl(slopts) != sltold.sl(slopts) ? slt.slx(slrptlastcc, rptlastcc= 0);
  
    slold.slcopy(sl.self);
    sltold.slcopy(slt.self);
    gdirty= 1;
  );
);

function doinit()
  local( ii )
(
  gfx_clear= -1;
  
  fontfile= 0; //used in gfxini();
  fontyoff= -3; //make baseline match default font; specific to font
  txth= 9; //actual 14, but squish lines

  ii= doctlzini(1);
  slmidichan= ii;
  slmidibase= ii+= 1;
  
  slused= ii;
  slmax= 64;
  slbase= 1;

  ! init1 ?(
  
    sl.slnew( slbase, slmax, slused, 1 );
    slold.slnew( slbase, slused, slused, 0 );
    sloldm.slnew( slbase, slused, slused, 0 );
    slmin.slnew( slbase, slused, slused, 0 );
    slmax.slnew( slbase, slused, slused, 0 );
    memset(slmax.self,127,slused);
    
    //non-preset controls
    slopts= 1;
    slrptlastcc= 2;
    slt.slnew( 1, 2, 2, 0 );
    sltold.slnew( 1, 2, 2, 0 );
    
    init1= 1;
  );
  
  slt.slx(slrptlastcc, rptlastcc= 0);
  //slmunge();
);
doinit();

@slider

function doslider()
(
  sl.slgetsliders(); // set backbuffer from new slider values
  slmunge(); // process changes in backbuffer
);
doslider();
  
@serialize

serialread= (file_avail(0) >= 0);
slt.slx(slrptlastcc, rptlastcc= 0);
slmin.slfile(0);
slmax.slfile(0);
serialread ? memset(slold.self, -1, slused);
slmunge();

@block

slz1.ctlzget(); bnz1.ctlzget();
slz2.ctlzget(); bnz2.ctlzget();
slz3.ctlzget(); bnz3.ctlzget();
slmunge();

slz1.slzmidisend(); bnz1.bnzmidisend();
slz2.slzmidisend(); bnz2.bnzmidisend();
slz3.slzmidisend(); bnz3.bnzmidisend();

rptlastcc ?(
  (rptlastcnt-= samplesblock) <= 0 ?(
    midisend(0, $xb0 + midichan - 1, lastcc );
    rptlastcnt= srate*.1;
  );
);

sloldm.slcopy(sl.self);

@gfx 550 95

function subch( ltrch, numch, txt )
  instance( xtxt ) local( ii )
(
  ! xtxt ? xtxt= mem(123);
  ii= 0; loop( xtxt[0]= txt[0], 
    ii+= 1; 
      txt[ii] == 1 ? xtxt[ii]= ltrch 
    : txt[ii] == 2 ? xtxt[ii]= numch 
                   : xtxt[ii]= txt[ii]; 
  );
  xtxt;
);

function dosl0( slnum, min, max, def, rnd, prec, bp, xtr, txt )
  local( vv )
(
  xtr && this.slactive(slnum) && (optdown&&cmddown&&!shiftdown) ?( min*= 8; max*= 8; );
  this.psl.pslop(slysz*.5+.5|0, slysz*.5+.5|0, 0, 0, 23, 1);
  this.psl.paneini(gxo, gyo, slxsz, slysz, min, 0, max, 1);
  this.psl.pslhit(slnum) ?(
    gfxminmax && leftdown && shiftdownx ? slmax.slx(slnum, this.psl.pmxrnd(rnd))
    : gfxminmax && leftdown && optdownx ? slmin.slx(slnum, this.psl.pmxrnd(rnd))
    :
    this.slx(slnum, 
      dblclick ? def 
      : rightdown && this.slactive(slnum) ?( 
          vv= clickval + ((mouse_x-clickx)*.25*(.005*abs(max-min)/rnd)^.5|0) * rnd; xtr ? vv : limit(vv,min,max); )
      : this.psl.pmx() //pmxrnd(rnd)
    ); 
    slmunge();
  ): this.slactive(slnum) ?( 
    this.slx(slnum, clickval); 
    slmunge(); 
  );
);
function dosl( ltrch, numch, slnum, min, max, def, rnd, prec, bp, xtr, txt )
(
  gfxminmax && leftdown && (shiftdownx || optdownx) ?( min= 0; max= 127; def= 127; rnd= 1; prec= 0; bp= 0; );
  this.dosl0( slnum, min, max, def, rnd, prec, bp, xtr, txt );
  gdirty0 ?
  gfxminmax && leftdown && shiftdownx ? this.psl.psliderbar( slmax.sl(slnum), slmax.sl(slnum), prec, bp, def, subch(ltrch, numch, txt))
  : gfxminmax && leftdown && optdownx ? this.psl.psliderbar( slmin.sl(slnum), slmin.sl(slnum), prec, bp, def, subch(ltrch, numch, txt))
  :
  this.psl.psliderbar( this.sl(slnum), this.sltxtval(slnum), prec, bp, def, subch(ltrch, numch, txt));
);
function doslz( ltrch, numch, slnum, min, max, def, rnd, prec, bp, xtr, zval, ztxt, txt )
(
  this.dosl0( slnum, min, max, def, rnd, prec, bp, xtr, txt );
  gdirty0 ?
  this.psl.psliderbarz( this.sl(slnum), this.sltxtval(slnum), prec, bp, xtr, zval, ztxt, subch(ltrch, numch, txt));
);
function doslbtn( ltrch, numch, slnum, txt )
(
  this.psl.pslop(slysz*.5+.5|0, slysz*.5+.5|0, 0, 0, 23, 1);
  this.psl.paneini(gxo, gyo, (5+txtw)*2+slysz, slysz, 0, 0, 1, 1);
  this.psl.pchit() ?( 
    this.self == slt.self && slnum == slopts && cmddownx ? slt.slx(slrptlastcc, ! rptlastcc) :(
      gfxminmax && leftdown && shiftdownx ? slmin.slx(slnum, 0)
      : gfxminmax && leftdown && optdownx ? slmin.slx(slnum, 1)
      : !(shiftdown || optdown || cmddown) ?(
        this.slx(slnum, ! this.sl(slnum)); 
      ); 
      slmunge();
    );
  );
  gdirty0 ?
  gfxminmax && leftdown && (shiftdownx || optdownx) ?   
  this.psl.pbutton( slmin.sl(slnum), ztxt.nil, ztxt.nil, subch(ltrch, numch, txt) )
  :
  this.psl.pbutton( this.sl(slnum), ztxt.nil, ztxt.nil, subch(ltrch, numch, txt) );
);
function doslbtn2( slnum, txt )
(
  this.psl.pslop(slysz*.5+.5|0, slysz*.5+.5|0, 0, 0, 23, 1);
  this.psl.paneini(gxo, gyo, slxsz, slysz, 0, 0, 1, 1);
  this.psl.pchit() ?( 
    this.slx(slnum, ! this.sl(slnum)); 
    slmunge();
  );
  gdirty0 ?
  gfxminmax && leftdown && (shiftdownx || optdownx) ?   
  this.psl.pbutton( slmin.sl(slnum), ztxt.nil, ztxt.nil, subch(ltrch, numch, txt) )
  :
  this.psl.pbutton( this.sl(slnum), ztxt.nil, ztxt.nil, subch(ltrch, numch, txt) );
);

function gfxslz()
  instance( slbase, slcnt, ltrch1, numch, slsync, syncndx, oldsyncndx )
  local( ii, jj )
(
  zhssl.hue();
  sl.doslz( 0, numch, slsync, 490000, 1000000, 490000, 10000, 0, 0, 0, 490000, ztxt.off, /*!ztxt.slsync='sync\2');*/ (!ztxt.slsync ?(ztxt.slsync=mem(7); ztxt.slsync[0]=5; ztxt.slsync[1]=($'s');ztxt.slsync[2]=($'y');ztxt.slsync[3]=($'n');ztxt.slsync[4]=($'c');ztxt.slsync[5]=(2););ztxt.slsync;));
  zhsl.hue();
  gfxminmax= 1; //midichan;
  ii= slbase; jj= 0; loop( slcnt,
    gyo+= slyspc; sl.dosl( ltrch1+jj, numch, ii, 0, 100, 0, (midichan?1:.1), (midichan?0:1), 0, 0, /*!ztxt.slz='\1\2');*/ (!ztxt.slz ?(ztxt.slz=mem(5); ztxt.slz[0]=2; ztxt.slz[1]=(1);ztxt.slz[2]=(2););ztxt.slz;));
    ii+= 1; jj+= 1;
  );
  gfxminmax= 0;
);

function gfxbnz()
  instance( slbase, slcnt, ltrch1, numch, slsync, syncndx, oldsyncndx )
  local( ii, jj )
(
  zhsl.hue();
  gfxminmax= 1; //midichan;
  ii= slbase; jj= 0; loop( slcnt,
    gyo+= slyspc; sl.doslbtn( ltrch1+jj, numch, ii, /*!ztxt.bnz='\1\2');*/ (!ztxt.bnz ?(ztxt.bnz=mem(5); ztxt.bnz[0]=2; ztxt.bnz[1]=(1);ztxt.bnz[2]=(2););ztxt.bnz;));
    ii+= 1; jj+= 1;
  );
  gfxminmax= 0;
);

gdirty= gdirty || gfx_w != gfxw0 || gfx_h != gfxh0 || anydown;
gdirty || ( mouse_x && mouse_y && mouse_x <= gfx_w && mouse_y <= gfx_h ) ?(

  gfxw0= gfx_w; gfxh0= gfx_h;

  (gdirty0= gdirty) ?(
    gdirty= 0;
    zhfxbg.hueset(.93, .93, .93, 1);
    gfx_x= 0; gfx_y= 0; 
    gfx_rectto(gfx_w+1, gfx_h+1);
  );

  mouseini();

  /*!ztxt.off='off';*/                              (!ztxt.off ?(ztxt.off=mem(4); ztxt.off[0]=3; ztxt.off[1]=($'o');ztxt.off[2]=($'f');ztxt.off[3]=($'f'););ztxt.off;);
  /*!ztxt.nil='';*/                                 (!ztxt.nil ?(ztxt.nil=mem(1); ztxt.nil[0]=0; );ztxt.nil;);

  slysz= 13; slyspc= slysz+8;
  slxspc= ((gfx_w-10)/3|0); slxsz= slxspc-(5+txtw)*2-slysz; 

  gxo= 5+slxsz+slxspc*2; gyo= 5;
  zhssl.hueset(.785,.785,.785,1);
  zhsl.hueset(.65,.65,.65,1);
  slt.doslbtn( 0, 0, slopts, /*!ztxt.slopts='++');*/ (!ztxt.slopts ?(ztxt.slopts=mem(3); ztxt.slopts[0]=2; ztxt.slopts[1]=($'+');ztxt.slopts[2]=($'+'););ztxt.slopts;));

  slt.sl(slopts) ?(
    gxo= 5+slxspc*2; gyo= 5;
    gyo+= slyspc; sl.doslz( 0, 0, slmidichan, 0, 16, 0, 1, 0, 0, 0, 0, ztxt.off, /*!ztxt.slmidichan='midi channel');*/ (!ztxt.slmidichan ?(ztxt.slmidichan=mem(13); ztxt.slmidichan[0]=12; ztxt.slmidichan[1]=($'m');ztxt.slmidichan[2]=($'i');ztxt.slmidichan[3]=($'d');ztxt.slmidichan[4]=($'i');ztxt.slmidichan[5]=($' ');ztxt.slmidichan[6]=($'c');ztxt.slmidichan[7]=($'h');ztxt.slmidichan[8]=($'a');ztxt.slmidichan[9]=($'n');ztxt.slmidichan[10]=($'n');ztxt.slmidichan[11]=($'e');ztxt.slmidichan[12]=($'l'););ztxt.slmidichan;));
    gyo+= slyspc; sl.dosl( 0, 0, slmidibase, 32, 192, 32, 32, 0, 0, 0, /*!ztxt.slmidibase='midi base cc#');*/ (!ztxt.slmidibase ?(ztxt.slmidibase=mem(14); ztxt.slmidibase[0]=13; ztxt.slmidibase[1]=($'m');ztxt.slmidibase[2]=($'i');ztxt.slmidibase[3]=($'d');ztxt.slmidibase[4]=($'i');ztxt.slmidibase[5]=($' ');ztxt.slmidibase[6]=($'b');ztxt.slmidibase[7]=($'a');ztxt.slmidibase[8]=($'s');ztxt.slmidibase[9]=($'e');ztxt.slmidibase[10]=($' ');ztxt.slmidibase[11]=($'c');ztxt.slmidibase[12]=($'c');ztxt.slmidibase[13]=($'#'););ztxt.slmidibase;));
    gyo+= slyspc; slt.doslbtn2( slrptlastcc, /*!ztxt.slrptlastcc='repeat last cc');*/ (!ztxt.slrptlastcc ?(ztxt.slrptlastcc=mem(15); ztxt.slrptlastcc[0]=14; ztxt.slrptlastcc[1]=($'r');ztxt.slrptlastcc[2]=($'e');ztxt.slrptlastcc[3]=($'p');ztxt.slrptlastcc[4]=($'e');ztxt.slrptlastcc[5]=($'a');ztxt.slrptlastcc[6]=($'t');ztxt.slrptlastcc[7]=($' ');ztxt.slrptlastcc[8]=($'l');ztxt.slrptlastcc[9]=($'a');ztxt.slrptlastcc[10]=($'s');ztxt.slrptlastcc[11]=($'t');ztxt.slrptlastcc[12]=($' ');ztxt.slrptlastcc[13]=($'c');ztxt.slrptlastcc[14]=($'c'););ztxt.slrptlastcc;));
    gxo= 5+slxsz+slxspc*2; gyo+= slyspc;
    gyo+= fonth; gxy(gxo-63*txtw, gyo); gdirty0 ? /*puts('       shift-click to set midi slider maximum or normal button');*/ (putc($' ');putc($' ');putc($' ');putc($' ');putc($' ');putc($' ');putc($' ');putc($'s');putc($'h');putc($'i');putc($'f');putc($'t');putc($'-');putc($'c');putc($'l');putc($'i');putc($'c');putc($'k');putc($' ');putc($'t');putc($'o');putc($' ');putc($'s');putc($'e');putc($'t');putc($' ');putc($'m');putc($'i');putc($'d');putc($'i');putc($' ');putc($'s');putc($'l');putc($'i');putc($'d');putc($'e');putc($'r');putc($' ');putc($'m');putc($'a');putc($'x');putc($'i');putc($'m');putc($'u');putc($'m');putc($' ');putc($'o');putc($'r');putc($' ');putc($'n');putc($'o');putc($'r');putc($'m');putc($'a');putc($'l');putc($' ');putc($'b');putc($'u');putc($'t');putc($'t');putc($'o');putc($'n'););
    gyo+= fonth; gxy(gxo-63*txtw, gyo); gdirty0 ? /*puts('option/alt-click to set midi slider minimum or inverted button');*/ (putc($'o');putc($'p');putc($'t');putc($'i');putc($'o');putc($'n');putc($'/');putc($'a');putc($'l');putc($'t');putc($'-');putc($'c');putc($'l');putc($'i');putc($'c');putc($'k');putc($' ');putc($'t');putc($'o');putc($' ');putc($'s');putc($'e');putc($'t');putc($' ');putc($'m');putc($'i');putc($'d');putc($'i');putc($' ');putc($'s');putc($'l');putc($'i');putc($'d');putc($'e');putc($'r');putc($' ');putc($'m');putc($'i');putc($'n');putc($'i');putc($'m');putc($'u');putc($'m');putc($' ');putc($'o');putc($'r');putc($' ');putc($'i');putc($'n');putc($'v');putc($'e');putc($'r');putc($'t');putc($'e');putc($'d');putc($' ');putc($'b');putc($'u');putc($'t');putc($'t');putc($'o');putc($'n'););
  ):(
    gxo= 5; gyo= gyo0= 5; //gfx_h - (7*slyspc);
    sl.psl.txthue.hueset(.09,.05,0,.55);
    slz1.gfxslz();
    gxo+= slxspc; gyo= gyo0;
    sl.psl.txthue.hueset(0,.05,.03,.6);
    slz2.gfxslz();
    gxo+= slxspc; gyo= gyo0;
    sl.psl.txthue.hueset(.05,0,.12,.55);
    slz3.gfxslz();

    gxo= 5+slxsz; gyo= gyo0;
    sl.psl.txthue.hueset(.09,.05,0,.55);
    bnz1.gfxbnz();
    gxo+= slxspc; gyo= gyo0;
    sl.psl.txthue.hueset(0,.05,.03,.6);
    bnz2.gfxbnz();
    gxo+= slxspc; gyo= gyo0;
    sl.psl.txthue.hueset(.05,0,.12,.55);
    bnz3.gfxbnz();
  );
);

//gxyo(5,fonth); gdirty0 ? putn(round(1,1),1);
