Merge branch 'master' of https://github.com/sugarcubes/SugarCubes
authorgreena1re <alexandergreen22@gmail.com>
Thu, 27 Feb 2014 10:36:36 +0000 (02:36 -0800)
committergreena1re <alexandergreen22@gmail.com>
Thu, 27 Feb 2014 10:36:36 +0000 (02:36 -0800)
1  2 
AlexGreen.pde

diff --combined AlexGreen.pde
index 0c6dcc6efd55e0a65437f9ac0bb9215f2c969ddd,f049c299455d6d3ddb2e469638acbbdf1a007b95..54af5c04b14f40f24a35f963760afb4f793148f3
@@@ -11,15 -11,15 +11,15 @@@ class SineSphere extends APat 
    public BasicParameter widthparameter= new BasicParameter("Width", 20, 1, 60);
    public BasicParameter vibration_magnitude = new BasicParameter("Vmag", 20, 2, modelrad/2);
    public BasicParameter scale = new BasicParameter("Scale", 1, .1, 5);
 -  private int pitch = 0; 
 -  private int channel = 0; 
 -  private int velocity = 0; 
 -  private int cur = 0; 
 -  public final LXProjection sinespin; 
 +  private int pitch = 0;
 +  private int channel = 0;
 +  private int velocity = 0;
 +  private int cur = 0;
 +  public final LXProjection sinespin;
    public final LXProjection sinespin2;
    public final LXProjection sinespin3;
   
 -  Pick Galaxy, STime; 
 +  Pick Galaxy, STime;
  
    public BasicParameter rotationx = new BasicParameter("rotx", 0, 0, 1 );
    public BasicParameter rotationy = new BasicParameter("roty", 1, 0, 1);
@@@ -29,8 -29,8 +29,8 @@@
  
    class Sphery {
    float f1xcenter, f1ycenter, f1zcenter, f2xcenter , f2ycenter, f2zcenter; //second three are for an ellipse with two foci
 -  private  SinLFO vibration; 
 -  private  SinLFO surfacewave;
 +  private SinLFO vibration;
 +  private SinLFO surfacewave;
  
    private SinLFO xbounce;
    public SinLFO ybounce;
    public BasicParameter vibrationrate;
    public final PVector circlecenter;
   
 -  public Sphery(float f1xcenter, float f1ycenter, float f1zcenter, float radius, float vibration_magnitude , float vperiod) 
 +  public Sphery(float f1xcenter, float f1ycenter, float f1zcenter, float radius, float vibration_magnitude , float vperiod)
    {
     this.f1xcenter = f1xcenter;
     this.f1ycenter = f1ycenter;
     this.f1zcenter = f1zcenter;
 -   this.radius = radius; 
 +   this.radius = radius;
     this.circlecenter= new PVector(f1xcenter,f1ycenter,f1zcenter);
  
     this.vibration_magnitude = vibration_magnitude;
     
     this.vperiod = vperiod;
     //addParameter(bounceamp = new BasicParameter("Amp", .5));
 -   //addParameter(bouncerate = new BasicParameter("Rate", .5));  //ybounce.modulateDurationBy(bouncerate);
 +   //addParameter(bouncerate = new BasicParameter("Rate", .5)); //ybounce.modulateDurationBy(bouncerate);
     //addParameter(vibrationrate = new BasicParameter("vibration", 1000, 10000));
      //addParameter(widthparameter = new BasicParameter("Width", .2));
 -     //addModulator(xbounce = new SinLFO(model.xMax/3, 2*model.yMax/3, 2000)).trigger(); 
 +     //addModulator(xbounce = new SinLFO(model.xMax/3, 2*model.yMax/3, 2000)).trigger();
     addModulator(ybounce= new SinLFO(model.yMax/3, 2*model.yMax/3, 240000)).trigger(); //bounce.modulateDurationBy
      
     //addModulator(bounceamp); //ybounce.setMagnitude(bouncerate);
        
    }
  
 -  //  public Sphery(float f1xcenter, float f1ycenter, float f1zcenter, float vibration_magnitude, float vperiod) 
 +  // public Sphery(float f1xcenter, float f1ycenter, float f1zcenter, float vibration_magnitude, float vperiod)
    // {
 -  //  this.f1xcenter = f1xcenter;
 -  //  this.f1ycenter = f1ycenter;
 -  //  this.f1zcenter = f1zcenter;
 -  //  this.vibration_magnitude = vibration_magnitude;
 +  // this.f1xcenter = f1xcenter;
 +  // this.f1ycenter = f1ycenter;
 +  // this.f1zcenter = f1zcenter;
 +  // this.vibration_magnitude = vibration_magnitude;
    // this.vperiod = vperiod;
 -  //  addModulator(ybounce= new SinLFO(model.yMax/3, 2*model.yMax/3, 240000)).trigger(); //bounce.modulateDurationBy
 -  //   addModulator( vibration = new SinLFO( modelrad/10 - vibration_magnitude , modelrad/10 + vibration_magnitude, vperiod)).trigger(); //vibration.setPeriod(240000/lx.tempo.bpm());
 +  // addModulator(ybounce= new SinLFO(model.yMax/3, 2*model.yMax/3, 240000)).trigger(); //bounce.modulateDurationBy
 +  // addModulator( vibration = new SinLFO( modelrad/10 - vibration_magnitude , modelrad/10 + vibration_magnitude, vperiod)).trigger(); //vibration.setPeriod(240000/lx.tempo.bpm());
        
    // }
  
    //for an ellipse
 -//  public Sphery(float f1xcenter, float f1ycenter, float f1zcenter, float f2xcenter, float f2ycenter, float f2zcenter, 
 -//   float vibration_min, float vibration_max, float vperiod)  
 +// public Sphery(float f1xcenter, float f1ycenter, float f1zcenter, float f2xcenter, float f2ycenter, float f2zcenter,
 +// float vibration_min, float vibration_max, float vperiod)
   
 -//  {
 -//     this.f1xcenter = f1xcenter;
 -//    this.f1ycenter = f1ycenter;
 -//    this.f1zcenter = f1zcenter;
 -//    this.f2xcenter = f2xcenter;
 -//    this.f2ycenter = f2ycenter;
 -//    this.f2zcenter = f2zcenter;
 -//    this.vibration_min = vibration_min;
 -//    this.vibration_max = vibration_max;
 -//    this.vperiod = vperiod;
 -//    //addModulator(xbounce = new SinLFO(model.xMax/3, 2*model.yMax/3, 2000)).trigger(); 
 -//    addModulator(ybounce).trigger(); 
 -//    addModulator( vibration = new SinLFO(vibration_min , vibration_max, lx.tempo.rampf())).trigger(); //vibration.modulateDurationBy(vx);
 -//    addParameter(widthparameter = new BasicParameter("Width", .1));
 -//    //addParameter(huespread = new BasicParameter("bonk", .2));
 +// {
 +// this.f1xcenter = f1xcenter;
 +// this.f1ycenter = f1ycenter;
 +// this.f1zcenter = f1zcenter;
 +// this.f2xcenter = f2xcenter;
 +// this.f2ycenter = f2ycenter;
 +// this.f2zcenter = f2zcenter;
 +// this.vibration_min = vibration_min;
 +// this.vibration_max = vibration_max;
 +// this.vperiod = vperiod;
 +// //addModulator(xbounce = new SinLFO(model.xMax/3, 2*model.yMax/3, 2000)).trigger();
 +// addModulator(ybounce).trigger();
 +// addModulator( vibration = new SinLFO(vibration_min , vibration_max, lx.tempo.rampf())).trigger(); //vibration.modulateDurationBy(vx);
 +// addParameter(widthparameter = new BasicParameter("Width", .1));
 +// //addParameter(huespread = new BasicParameter("bonk", .2));
    
  // }
   
 -public int     c1c    (float a)              { return round(100*constrain(a,0,1));               }
 +public int c1c (float a) { return round(100*constrain(a,0,1)); }
  
  void setVibrationPeriod(double period){
 -// to-do:  make this conditional upon time signature
 +// to-do: make this conditional upon time signature
  
  this.vibration.setPeriod(period);
  }
@@@ -116,33 -116,33 +116,33 @@@ this.vibration.setRange(-mag,mag)
  }
  
  
 -float distfromcirclecenter(float px, float py, float pz, float f1x, float f1y, float f1z) 
 +float distfromcirclecenter(float px, float py, float pz, float f1x, float f1y, float f1z)
  {
     return dist(px, py, pz, f1x, f1y, f1z);
      }
   //void updatespherey(deltaMs, )
  
   float quadrant(PVector q) {
 -   float qtheta = atan2(  (q.x-f1xcenter) , (q.z - f1zcenter) ); 
 -   float qphi = acos( (q.z-f1zcenter)/(PVector.dist(q,circlecenter)) );  
 +   float qtheta = atan2( (q.x-f1xcenter) , (q.z - f1zcenter) );
 +   float qphi = acos( (q.z-f1zcenter)/(PVector.dist(q,circlecenter)) );
  
  
      return map(qtheta, -PI/2, PI/2, 200-huespread.getValuef(), 240+huespread.getValuef());
    //if (q.x > f1xcenter ) {return 140 ;}
 -    //else  {return 250;}  
 +    //else {return 250;}
   }
  
   // float noisesat(PVector q) {
     
  
 - //  return noise()
 + // return noise()
  
   // }
   color spheryvalue (PVector p) {
 -   circlecenter.set(this.f1xcenter, this.f1ycenter, this.f1zcenter); 
 +   circlecenter.set(this.f1xcenter, this.f1ycenter, this.f1zcenter);
  
    
 -//switch(sShpape.cur() ) {}  
 +//switch(sShpape.cur() ) {}
  
     float b = max(0, 100 - widthparameter.getValuef()*abs(p.dist(circlecenter)
        - vibration.getValuef()) );
       // constrain(100*noise(quadrant(p)), 0, 100),
       100,
        b
 -   ); 
 +   );
   }
   color ellipsevalue(float px, float py, float pz , float f1xc, float f1yc, float f1zc, float f2xc, float f2yc, float f2zc)
    {
 -//switch(sShpape.cur() ) {}  
 -   return lx.hsb(huespread.getValuef()*5*px, dist(model.xMax-px, model.yMax-py, model.zMax-pz, f1xc, f1yc, f1zc) , 
 +//switch(sShpape.cur() ) {}
 +   return lx.hsb(huespread.getValuef()*5*px, dist(model.xMax-px, model.yMax-py, model.zMax-pz, f1xc, f1yc, f1zc) ,
      max(0, 100 - 100*widthparameter.getValuef() *
 -      abs( (dist(px, py, pz, f1xc, ybounce.getValuef(), f1zc) + 
 -        (dist(px, py , pz, f2xc, ybounce.getValuef(), f2zc) ) )/2  
 -      - 1.2*vibration.getValuef() ) ) ) ; 
 +      abs( (dist(px, py, pz, f1xc, ybounce.getValuef(), f1zc) +
 +        (dist(px, py , pz, f2xc, ybounce.getValuef(), f2zc) ) )/2
 +      - 1.2*vibration.getValuef() ) ) ) ;
    }
  
    
 -}  
 +}
  
  boolean noteOn(Note note) {
      int row = note.getPitch(), col = note.getChannel();
 -  //  if (row == 57) {KeyPressed = col; return true; }
 +  // if (row == 57) {KeyPressed = col; return true; }
      return super.noteOn(note);
    }
  
  
 -// public boolean noteOn(Note note)  {
 -// pitch= note.getPitch();  
 +// public boolean noteOn(Note note) {
 +// pitch= note.getPitch();
  // velocity=note.getVelocity();
  // channel=note.getChannel();
  // return true;
  // }
  
  // public boolean gridPressed(int row, int col) {
 -//  pitch = row; channel = col; 
 -//  cur = NumApcCols*(pitch-53)+col; 
 -// //setState(row, col, 0 ? 1 : 0); 
 +// pitch = row; channel = col;
 +// cur = NumApcCols*(pitch-53)+col;
 +// //setState(row, col, 0 ? 1 : 0);
  // return true;
  // }
  
  //public grid
  final Sphery[] spherys;
   
 -  SineSphere(LX lx) 
 +  SineSphere(LX lx)
    {
      super(lx);
 -    println("modelrad  " + modelrad);   
 +    println("modelrad " + modelrad);
      sinespin = new LXProjection(model);
      sinespin2 = new LXProjection(model);
      sinespin3= new LXProjection(model);
      addParameter(vibration_magnitude);
      addParameter(scale);
      addModulator(yrot).trigger();
 -    addModulator(yrot2).trigger(); 
 +    addModulator(yrot2).trigger();
      addModulator(yrot3).trigger();
      //Galaxy = addPick("Galaxy", 1, 3, new String[] {"home", "vertical","single","aquarium"});
      STime =addPick("Time", 1, 4, new String[]{"half", "triplet", "beat", "2x", "3x" });
      spherys = new Sphery[] {
      new Sphery(model.xMax/4, model.yMax/2, model.zMax/2, modelrad/12, modelrad/25, 3000),
      new Sphery(.75*model.xMax, model.yMax/2, model.zMax/2, modelrad/14, modelrad/28, 2000),
 -    new Sphery(model.cx, model.cy, model.cz,  modelrad/5, modelrad/15, 2300),
 +    new Sphery(model.cx, model.cy, model.cz, modelrad/5, modelrad/15, 2300),
      new Sphery(.7*model.xMax, .65*model.yMax, .5*model.zMax, modelrad/11, modelrad/25, 3500),
      new Sphery(.75*model.xMax, .8*model.yMax, .7*model.zMax, modelrad/12, modelrad/30, 2000)
      
 -            
 -
 -
 -
 -      // new Sphery(model.xMax/4, model.yMax/2, model.zMax/2, modelrad/16, modelrad/8, 3000),
 -      // new Sphery(.75*model.xMax, model.yMax/2, model.zMax/2, modelrad/20, modelrad/10, 2000),
 -      // new Sphery(model.xMax/2, model.yMax/2, model.zMax/2,  modelrad/4, modelrad/8, 2300),
 -
 -      // new Sphery(.7*model.xMax, .65*model.yMax, .5*model.zMax, modelrad/14, modelrad/7, 3500),
 -      // new Sphery(.75*model.xMax, .8*model.yMax, .7*model.zMax, modelrad/20, modelrad/10, 2000),
 -      // new Sphery(model.xMax/2, model.yMax/2, model.zMax/2,  modelrad/4, modelrad/8, 2300),
 -      
 -    };  
 +          
 +    };
    }
  
  // public void onParameterChanged(LXParameter parameter)
  // {
  
  
 -//     for (Sphery s : spherys) {
 -//       if (s == null) continue;
 -//       double bampv = s.bounceamp.getValue();
 -//       double brv = s.bouncerate.getValue();
 -//       double tempobounce = lx.tempo.bpm();
 -//       if (parameter == s.bounceamp) 
 -//       {
 -//         s.ybounce.setRange(bampv*model.yMax/3 , bampv*2*model.yMax/3, brv);
 -//       }
 -//       else if ( parameter == s.bouncerate )   
 -//       {
 -//         s.ybounce.setDuration(120000./tempobounce);
 -//       }
 -//     }
 -//   }
 +// for (Sphery s : spherys) {
 +// if (s == null) continue;
 +// double bampv = s.bounceamp.getValue();
 +// double brv = s.bouncerate.getValue();
 +// double tempobounce = lx.tempo.bpm();
 +// if (parameter == s.bounceamp)
 +// {
 +// s.ybounce.setRange(bampv*model.yMax/3 , bampv*2*model.yMax/3, brv);
 +// }
 +// else if ( parameter == s.bouncerate )
 +// {
 +// s.ybounce.setDuration(120000./tempobounce);
 +// }
 +// }
 +// }
  
      public void run( double deltaMs) {
 -     float  t = lx.tempo.rampf();
 +     float t = lx.tempo.rampf();
       float bpm = lx.tempo.bpmf();
       float scalevalue = scale.getValuef();
       int spherytime= STime.Cur();
       
       switch (spherytime) {
  
 -     case 0: t = map(.5*t ,0,.5, 0,1);   bpm = .5*bpm;  break;
 +     case 0: t = map(.5*t ,0,.5, 0,1); bpm = .5*bpm; break;
  
 -     case 1: t = t;   bpm = bpm;   break;
 +     case 1: t = t; bpm = bpm; break;
  
 -     case 2: t = map(2*t,0,2,0,1);  bpm = 2*bpm; break;
 +     case 2: t = map(2*t,0,2,0,1); bpm = 2*bpm; break;
  
 -     default: t= t;   bpm = bpm; 
 +     default: t= t; bpm = bpm;
       }
  
       //switch(sphery.colorscheme)
          
        for ( Sphery s: spherys){
 -      
 -      //s.vibration.setBasis(t);
        s.setVibrationPeriod(vibrationrate.getValuef());
 -    //  s.setVibrationMagnitude(vibration_magnitude.getValuef());
 +    // s.setVibrationMagnitude(vibration_magnitude.getValuef());
       
         }
        
  
        sinespin.reset()
 -      // Translate so the center of the car is the origin, offset 
 +      // Translate so the center of the car is the origin, offset
        .center()
         .scale(scalevalue, scalevalue, scalevalue)
        // Rotate around the origin (now the center of the car) about an y-vector
     .translate(model.cx,model.cy,model.cz);
  
      for (LXVector p: sinespin2)
 -    {   color c = 0;
 +    { color c = 0;
        // PVector P = new PVector(p.x, p.y, p.z);
          P.set(p.x, p.y, p.z);
          c = blendIfColor(c, spherys[3].spheryvalue(P),ADD);
           
          colors[p.index] = blendIfColor(colors[p.index], c , ADD);
  
 -    }  
 +    }
      sinespin3.reset()
      .center()
      .scale(scalevalue,scalevalue,scalevalue)
      .rotate(yrot3.getValuef(),-1 + rotationx.getValuef(), rotationy.getValuef(), rotationz.getValuef())
      .translate(model.cx, model.cy, model.cz);
     for (LXVector p: sinespin3)
 -    {   color c = 0;
 +    { color c = 0;
        // PVector P = new PVector(p.x, p.y, p.z);
          P.set(p.x, p.y, p.z);
          c = blendIfColor(c, spherys[4].spheryvalue(P),ADD);
    }
    
  
 -      //   color c = 0;
 -      //   c = blendColor(c, spherys[3].ellipsevalue(Px.x, Px.y, Px.z, model.xMax/4, model.yMax/4, model.zMax/4, 3*model.xMax/4, 3*model.yMax/4, 3*model.zMax/4),ADD);
 -      //   return c; 
 +      // color c = 0;
 +      // c = blendColor(c, spherys[3].ellipsevalue(Px.x, Px.y, Px.z, model.xMax/4, model.yMax/4, model.zMax/4, 3*model.xMax/4, 3*model.yMax/4, 3*model.zMax/4),ADD);
 +      // return c;
        // }
        // return lx.hsb(0,0,0);
 -      //  // else if(spheremode ==2)
 +      // // else if(spheremode ==2)
         // { color c = 0;
 -       //   return lx.hsb(CalcCone( (xyz by = new xyz(0,spherys[2].ybounce.getValuef(),0) ), Px, mid) );
 +       // return lx.hsb(CalcCone( (xyz by = new xyz(0,spherys[2].ybounce.getValuef(),0) ), Px, mid) );
  
         // }
  
    
 -       //   } 
 +       // }
          
    }
  /*This just takes all of Dan Horwitz's code that I want to inherit and leaves the rest behind.
 - A work in progress. */
 +A work in progress. */
  
  public class APat extends SCPattern
  
  
  {
 -  ArrayList<Pick>   picks  = new ArrayList<Pick>  ();
 -  ArrayList<DBool>  bools  = new ArrayList<DBool> ();
 -
 -  PVector   mMax, mCtr, mHalf;
 -
 -  MidiOutput  APCOut;
 -  int     nMaxRow   = 53;
 -  float   LastJog = -1;
 -  float[]   xWaveNz, yWaveNz;
 -  int     nPoint  , nPoints;
 -  PVector   xyzJog = new PVector(), modmin;
 -
 -  float     NoiseMove = random(10000);
 -  BasicParameter  pSpark, pWave, pRotX, pRotY, pRotZ, pSpin, pTransX, pTransY;
 -  DBool     pXsym, pYsym, pRsym, pXdup, pXtrip, pJog, pGrey;
 -
 -  float   lxh   ()                  { return lx.getBaseHuef();                      }
 -  int     c1c    (float a)              { return round(100*constrain(a,0,1));               }
 -  float     interpWv(float i, float[] vals)       { return interp(i-floor(i), vals[floor(i)], vals[ceil(i)]);     }
 -  void    setNorm (PVector vec)           { vec.set(vec.x/mMax.x, vec.y/mMax.y, vec.z/mMax.z);        }
 -  void    setRand (PVector vec)           { vec.set(random(mMax.x), random(mMax.y), random(mMax.z));      }
 -  void    setVec  (PVector vec, LXPoint p)        { vec.set(p.x, p.y, p.z);                       }
 -  void    interpolate(float i, PVector a, PVector b)  { a.set(interp(i,a.x,b.x), interp(i,a.y,b.y), interp(i,a.z,b.z));   }
 -  //void      StartRun(double deltaMs)          { }
 -  float     val   (BasicParameter p)          { return p.getValuef();                       }
 -  //color   CalcPoint(PVector p)            { return lx.hsb(0,0,0);                       }
 -  color   blend3(color c1, color c2, color c3)    { return blendColor(c1,blendColor(c2,c3,ADD),ADD);          }
 -
 -  void  rotateZ (PVector p, PVector o, float nSin, float nCos) { p.set(    nCos*(p.x-o.x) - nSin*(p.y-o.y) + o.x    , nSin*(p.x-o.x) + nCos*(p.y-o.y) + o.y,p.z); }
 -  void  rotateX (PVector p, PVector o, float nSin, float nCos) { p.set(p.x,nCos*(p.y-o.y) - nSin*(p.z-o.z) + o.y    , nSin*(p.y-o.y) + nCos*(p.z-o.z) + o.z    ); }
 -  void  rotateY (PVector p, PVector o, float nSin, float nCos) { p.set(    nSin*(p.z-o.z) + nCos*(p.x-o.x) + o.x,p.y, nCos*(p.z-o.z) - nSin*(p.x-o.x) + o.z    ); }
 -
 -  BasicParameter  addParam(String label, double value)  { BasicParameter p = new BasicParameter(label, value); addParameter(p); return p; }
 -
 -  PVector   vT1 = new PVector(), vT2 = new PVector();
 -  float     calcCone (PVector v1, PVector v2, PVector c)  { vT1.set(v1); vT2.set(v2); vT1.sub(c); vT2.sub(c);
 +  ArrayList<Pick> picks = new ArrayList<Pick> ();
 +  ArrayList<DBool> bools = new ArrayList<DBool> ();
 +
 +  PVector mMax, mCtr, mHalf;
 +
 +  MidiOutput APCOut;
 +  int nMaxRow = 53;
 +  float LastJog = -1;
 +  float[] xWaveNz, yWaveNz;
 +  int nPoint , nPoints;
 +  PVector xyzJog = new PVector(), modmin;
 +
 +  float NoiseMove = random(10000);
 +  BasicParameter pSpark, pWave, pRotX, pRotY, pRotZ, pSpin, pTransX, pTransY;
 +  DBool pXsym, pYsym, pRsym, pXdup, pXtrip, pJog, pGrey;
 +
 +  float lxh () { return lx.getBaseHuef(); }
 +  int c1c (float a) { return round(100*constrain(a,0,1)); }
 +  float interpWv(float i, float[] vals) { return interp(i-floor(i), vals[floor(i)], vals[ceil(i)]); }
 +  void setNorm (PVector vec) { vec.set(vec.x/mMax.x, vec.y/mMax.y, vec.z/mMax.z); }
 +  void setRand (PVector vec) { vec.set(random(mMax.x), random(mMax.y), random(mMax.z)); }
 +  void setVec (PVector vec, LXPoint p) { vec.set(p.x, p.y, p.z); }
 +  void interpolate(float i, PVector a, PVector b) { a.set(interp(i,a.x,b.x), interp(i,a.y,b.y), interp(i,a.z,b.z)); }
 +  void StartRun(double deltaMs) { }
 +  float val (BasicParameter p) { return p.getValuef(); }
 +  color CalcPoint(PVector p) { return lx.hsb(0,0,0); }
 +  color blend3(color c1, color c2, color c3) { return blendColor(c1,blendColor(c2,c3,ADD),ADD); }
 +
 +  void rotateZ (PVector p, PVector o, float nSin, float nCos) { p.set( nCos*(p.x-o.x) - nSin*(p.y-o.y) + o.x , nSin*(p.x-o.x) + nCos*(p.y-o.y) + o.y,p.z); }
 +  void rotateX (PVector p, PVector o, float nSin, float nCos) { p.set(p.x,nCos*(p.y-o.y) - nSin*(p.z-o.z) + o.y , nSin*(p.y-o.y) + nCos*(p.z-o.z) + o.z ); }
 +  void rotateY (PVector p, PVector o, float nSin, float nCos) { p.set( nSin*(p.z-o.z) + nCos*(p.x-o.x) + o.x,p.y, nCos*(p.z-o.z) - nSin*(p.x-o.x) + o.z ); }
 +
 +  BasicParameter addParam(String label, double value) { BasicParameter p = new BasicParameter(label, value); addParameter(p); return p; }
 +
 +  PVector vT1 = new PVector(), vT2 = new PVector();
 +  float calcCone (PVector v1, PVector v2, PVector c) { vT1.set(v1); vT2.set(v2); vT1.sub(c); vT2.sub(c);
                                    return degrees(PVector.angleBetween(vT1,vT2)); }
  
 -  Pick    addPick(String name, int def, int _max, String[] desc) {
 -    Pick P    = new Pick(name, def, _max+1, nMaxRow, desc); 
 -    nMaxRow   = P.EndRow + 1;
 +  Pick addPick(String name, int def, int _max, String[] desc) {
 +    Pick P = new Pick(name, def, _max+1, nMaxRow, desc);
 +    nMaxRow = P.EndRow + 1;
      picks.add(P);
      return P;
    }
  
 -    boolean   noteOff(Note note) {
 +    boolean noteOff(Note note) {
      int row = note.getPitch(), col = note.getChannel();
      for (int i=0; i<bools.size(); i++) if (bools.get(i).set(row, col, false)) { presetManager.dirty(this); return true; }
      updateLights(); return false;
    }
  
 -    boolean   noteOn(Note note) {
 +    boolean noteOn(Note note) {
      int row = note.getPitch(), col = note.getChannel();
 -    for (int i=0; i<picks.size(); i++) if (picks.get(i).set(row, col))        { presetManager.dirty(this); return true; }
 -    for (int i=0; i<bools.size(); i++) if (bools.get(i).set(row, col, true))  { presetManager.dirty(this); return true; }
 -    println("row: " + row + "  col:   " + col); return false;
 +    for (int i=0; i<picks.size(); i++) if (picks.get(i).set(row, col)) { presetManager.dirty(this); return true; }
 +    for (int i=0; i<bools.size(); i++) if (bools.get(i).set(row, col, true)) { presetManager.dirty(this); return true; }
 +    println("row: " + row + " col: " + col); return false;
    }
  
 -  void    onInactive()      { uiDebugText.setText(""); }
 -  void    onReset()         {
 +  void onInactive() { uiDebugText.setText(""); }
 +  void onReset() {
      for (int i=0; i<bools .size(); i++) bools.get(i).reset();
      for (int i=0; i<picks .size(); i++) picks.get(i).reset();
 -    presetManager.dirty(this); 
 -    updateLights(); 
 +    presetManager.dirty(this);
 +    updateLights();
    }
  
    APat(LX lx) {
  
      
  
 -    nPoints   = model.points.size();
 -    pXsym     = new DBool("X-SYM", false, 48, 0); bools.add(pXsym );
 -    pYsym     = new DBool("Y-SYM", false, 48, 1); bools.add(pYsym );
 -    pRsym     = new DBool("R-SYM", false, 48, 2); bools.add(pRsym );
 -    pXdup   = new DBool("X-DUP", false, 48, 3); bools.add(pXdup );
 -    pJog    = new DBool("JOG"  , false, 48, 4); bools.add(pJog  );
 -    pGrey   = new DBool("GREY" , false, 48, 5); bools.add(pGrey );
 -
 -    modmin    = new PVector(model.xMin, model.yMin, model.zMin);
 -    mMax    =   new PVector(model.xMax, model.yMax, model.zMax); mMax.sub(modmin);
 -    mCtr    =   new PVector(); mCtr.set(mMax); mCtr.mult(.5);
 -    mHalf   =   new PVector(.5,.5,.5);
 -    xWaveNz   = new float[ceil(mMax.y)+1];
 -    yWaveNz   = new float[ceil(mMax.x)+1];
 -
 -    //println (model.xMin + " " + model.yMin + " " +  model.zMin);
 -    //println (model.xMax + " " + model.yMax + " " +  model.zMax);
 +    nPoints = model.points.size();
 +    pXsym = new DBool("X-SYM", false, 48, 0); bools.add(pXsym );
 +    pYsym = new DBool("Y-SYM", false, 48, 1); bools.add(pYsym );
 +    pRsym = new DBool("R-SYM", false, 48, 2); bools.add(pRsym );
 +    pXdup = new DBool("X-DUP", false, 48, 3); bools.add(pXdup );
 +    pJog = new DBool("JOG" , false, 48, 4); bools.add(pJog );
 +    pGrey = new DBool("GREY" , false, 48, 5); bools.add(pGrey );
 +
 +    modmin = new PVector(model.xMin, model.yMin, model.zMin);
 +    mMax = new PVector(model.xMax, model.yMax, model.zMax); mMax.sub(modmin);
 +    mCtr = new PVector(); mCtr.set(mMax); mCtr.mult(.5);
 +    mHalf = new PVector(.5,.5,.5);
 +    xWaveNz = new float[ceil(mMax.y)+1];
 +    yWaveNz = new float[ceil(mMax.x)+1];
 +
 +    //println (model.xMin + " " + model.yMin + " " + model.zMin);
 +    //println (model.xMax + " " + model.yMax + " " + model.zMax);
      //for (MidiOutputDevice o: RWMidi.getOutputDevices()) { if (o.toString().contains("APC")) { APCOut = o.createOutput(); break;}}
    }
  
    }
  
    void updateLights() { if (APCOut == null) return;
 -      for (int i = 0; i < NumApcRows; ++i) 
 -        for (int j = 0; j < 8; ++j)     APCOut.sendNoteOn(j, 53+i,  0);
 -    for (int i=0; i<picks .size(); i++)   APCOut.sendNoteOn(picks.get(i).CurCol, picks.get(i).CurRow, 3);
 -    for (int i=0; i<bools .size(); i++)   if (bools.get(i).b)   APCOut.sendNoteOn (bools.get(i).col, bools.get(i).row, 1);
 -                        else          APCOut.sendNoteOff  (bools.get(i).col, bools.get(i).row, 0);
 +      for (int i = 0; i < NumApcRows; ++i)
 +        for (int j = 0; j < 8; ++j) APCOut.sendNoteOn(j, 53+i, 0);
 +    for (int i=0; i<picks .size(); i++) APCOut.sendNoteOn(picks.get(i).CurCol, picks.get(i).CurRow, 3);
 +    for (int i=0; i<bools .size(); i++) if (bools.get(i).b) APCOut.sendNoteOn (bools.get(i).col, bools.get(i).row, 1);
 +                        else APCOut.sendNoteOff (bools.get(i).col, bools.get(i).row, 0);
    }
  
    void run(double deltaMs)
  
      if (this == midiEngine.getFocusedDeck().getActivePattern()) {
        String Text1="", Text2="";
 -      for (int i=0; i<bools.size(); i++) if (bools.get(i).b) Text1 += " " + bools.get(i).tag       + "   ";
 -      for (int i=0; i<picks.size(); i++) Text1 += picks.get(i).tag + ": " + picks.get(i).CurDesc() + "   ";
 +      for (int i=0; i<bools.size(); i++) if (bools.get(i).b) Text1 += " " + bools.get(i).tag + " ";
 +      for (int i=0; i<picks.size(); i++) Text1 += picks.get(i).tag + ": " + picks.get(i).CurDesc() + " ";
        uiDebugText.setText(Text1, Text2);
      }
  
 -    
 +   NoiseMove += deltaMs; NoiseMove = NoiseMove % 1e7;
 +    StartRun (deltaMs);
 +    PVector P = new PVector(), tP = new PVector(), pSave = new PVector();
 +    PVector pTrans = new PVector(val(pTransX)*200-100, val(pTransY)*100-50,0);
 +    nPoint = 0;
 +
 +    if (pJog.b) {
 +      float tRamp = (lx.tempo.rampf() % .25);
 +      if (tRamp < LastJog) xyzJog.set(randctr(mMax.x*.2), randctr(mMax.y*.2), randctr(mMax.z*.2));
 +      LastJog = tRamp;
 +    }
 +
 +    // precalculate this stuff
 +    float wvAmp = val(pWave), sprk = val(pSpark);
 +    if (wvAmp > 0) {
 +      for (int i=0; i<ceil(mMax.x)+1; i++)
 +        yWaveNz[i] = wvAmp * (noise(i/(mMax.x*.3)-(2e3+NoiseMove)/1500.) - .5) * (mMax.y/2.);
 +
 +      for (int i=0; i<ceil(mMax.y)+1; i++)
 +        xWaveNz[i] = wvAmp * (noise(i/(mMax.y*.3)-(1e3+NoiseMove)/1500.) - .5) * (mMax.x/2.);
 +    }
 +
 +    for (LXPoint p : model.points) { nPoint++;
 +      setVec(P,p);
 +      P.sub(modmin);
 +      P.sub(pTrans);
 +      if (sprk > 0) {P.y += sprk*randctr(50); P.x += sprk*randctr(50); P.z += sprk*randctr(50); }
 +      if (wvAmp > 0) P.y += interpWv(p.x-modmin.x, yWaveNz);
 +      if (wvAmp > 0) P.x += interpWv(p.y-modmin.y, xWaveNz);
 +      if (pJog.b) P.add(xyzJog);
 +
 +
 +      color cNew, cOld = colors[p.index];
 +              { tP.set(P); cNew = CalcPoint(tP); }
 +      if (pXsym.b) { tP.set(mMax.x-P.x,P.y,P.z); cNew = blendColor(cNew, CalcPoint(tP), ADD); }
 +      if (pYsym.b) { tP.set(P.x,mMax.y-P.y,P.z); cNew = blendColor(cNew, CalcPoint(tP), ADD); }
 +      if (pRsym.b) { tP.set(mMax.x-P.x,mMax.y-P.y,mMax.z-P.z); cNew = blendColor(cNew, CalcPoint(tP), ADD); }
 +      if (pXdup.b) { tP.set((P.x+mMax.x*.5)%mMax.x,P.y,P.z); cNew = blendColor(cNew, CalcPoint(tP), ADD); }
 +      if (pGrey.b) { cNew = lx.hsb(0, 0, lx.b(cNew)); }
 +      colors[p.index] = cNew;
 +    }
    }
  }
  
@@@ -544,7 -517,7 +544,7 @@@ class CubeCurl extends SCPattern
  float CH, CW, diag;
  ArrayList<PVector> cubeorigin = new ArrayList<PVector>();
  ArrayList<PVector> centerlist = new ArrayList<PVector>();
 -private SinLFO curl = new SinLFO(0, Cube.EDGE_HEIGHT, 5000 ); 
 +private SinLFO curl = new SinLFO(0, Cube.EDGE_HEIGHT, 5000 );
  
  private SinLFO bg = new SinLFO(180, 220, 3000);
  
@@@ -563,11 -536,11 +563,11 @@@ for (int i = 0; i < model.cubes.size()
    cubeorigin.add(new PVector(a.x, a.y, a.z));
    centerlist.add(new PVector(a.cx, a.cy, a.cz) );
    
 -} 
 +}
  
  }
  //there is definitely a better way of doing this!
 -PVector centerofcube(int i) { 
 +PVector centerofcube(int i) {
  Cube c = model.cubes.get(i);
  PVector cubecenter = new PVector(c.cx, c.cy, c.cz);
  
@@@ -576,36 -549,36 +576,36 @@@ return cubecenter
  
  
  void run(double deltaMs){
 -for (int i =0; i < model.cubes.size(); i++)  {
 +for (int i =0; i < model.cubes.size(); i++) {
  Cube c = model.cubes.get(i);
  float cfloor = c.y;
 -
 +    
  // if (i%3 == 0){
  
  // for (LXPoint p : c.points ){
 -//  // colors[p.index]=color(0,0,0);
 -//   //float dif = (p.y - c.y);
 -//   //colors[p.index] = color( bg.getValuef() , 80 , dif < curl.getValuef() ? 80 : 0, ADD);
 -//    }
 -//  }
 +// // colors[p.index]=color(0,0,0);
 +// //float dif = (p.y - c.y);
 +// //colors[p.index] = color( bg.getValuef() , 80 , dif < curl.getValuef() ? 80 : 0, ADD);
 +// }
 +// }
  
  // else if (i%3 == 1) {
    
 -//  for (LXPoint p: c.points){
 -//   colors[p.index]=color(0,0,0);
 -//   float dif = (p.y - c.y);
 -//   // colors[p.index] = 
 -//   // color(bg.getValuef(),
 -//   //   map(curl.getValuef(), 0, Cube.EDGE_HEIGHT, 20, 100), 
 -//   //   100 - 10*abs(dif - curl.getValuef()), ADD );
 -//      }
 -//     }
 +// for (LXPoint p: c.points){
 +// colors[p.index]=color(0,0,0);
 +// float dif = (p.y - c.y);
 +// // colors[p.index] =
 +// // color(bg.getValuef(),
 +// // map(curl.getValuef(), 0, Cube.EDGE_HEIGHT, 20, 100),
 +// // 100 - 10*abs(dif - curl.getValuef()), ADD );
 +// }
 +// }
  // else if (i%3 == 2){
   // centerlist[i].sub(cubeorigin(i);
     for (LXPoint p: c.points) {
      PVector pv = new PVector(p.x, p.y, p.z);
 -     colors[p.index] =color( constrain(4* pv.dist(centerlist.get(i)), 0, 360)  , 50, 100 );
 -   // colors[p.index] =color(constrain(centerlist[i].x, 0, 360), constrain(centerlist[i].y, 0, 100),  );
 +     colors[p.index] =color( constrain(4* pv.dist(centerlist.get(i)), 0, 360) , 50, 100 );
 +   // colors[p.index] =color(constrain(centerlist[i].x, 0, 360), constrain(centerlist[i].y, 0, 100), );
  
  
      }
     }
    }
   }
+   JGraphAdapterDemo graph1; 
+   
+ // class SpinningCube extends SCPattern{
+ // LXProjection spin1, spin2, spin3; 
+ // SawLFO 
+ //}
  
 +
 +class PixelGraph implements EdgeFactory<dPixel, dVertex> {
 +
 +dPixel p0; dPixel p1; dVertex v0;
 +
 +public dVertex createEdge(dPixel p0, dPixel p1) {
 +
 +  return v0;
 +
 +}
 +
 +
 +}
 +
 + class GraphTest extends SCPattern {
 +  JGraphAdapterDemo graph1;
 +  
 +GraphTest( LX lx) {super(lx); JGraphAdapterDemo graph1 = new JGraphAdapterDemo();}
 + 
 +  void run(double deltaMs){
 +  }
 +}
 +
 +class SpinningCube extends SCPattern{
 + 
 + LXProjection spin1, spin2, spin3;
 + SawLFO spinx, spiny, spinz;
 + SinLFO spinx1, spiny1, spinz1, cubesize;
 + BasicParameter xoff = new BasicParameter("xoff", 10, 0, 100);
 + BasicParameter toff = new BasicParameter("toff", 10,0,1000);
 + BasicParameter huev = new BasicParameter("hue", 200, 0, 360);
 + BasicParameter density = new BasicParameter("density", 0, 0, 1);
 + BasicParameter Vsize = new BasicParameter("size", model.xMax/3,0, model.xMax);
 + VirtualCube V1, V2, V3;
 + PVector P = new PVector();
 + float noisetime=0.;
 +  class VirtualCube {
 +  float x,y,z,d;
 +  PVector center;
 +
 +  VirtualCube(float x, float y, float z, float d) {
 +    this.x=x;
 +    this.y= y;
 +    this.z=z;
 +    this.d=d;
 +    this.center=new PVector(x,y,z);
 +      }
 +    
 +    color getcolor(LXVector q) {
 +     if ( q.x > this.x + d/2 || q.x < this.x - d/2 || q.y > this.y + d/2 || q.y < this.y - d/2 || q.z > this.z + d/2 || q.z < this.z - d/2 )
 +     {return 0;}
 +      else {
 +      return lx.hsb(huev.getValuef()*noise(xoff.getValuef()*.001*noisetime ) , constrain(100*noise(xoff.getValuef()*.001*q.x*noisetime), 0, 100), max(100*(noise(xoff.getValuef()*.001*q.x*noisetime)-density.getValuef()), 0) );
 +      }
 +    }
 +    void setcenter(float x, float y, float z) {this.x=x; this.y = y; this.z=z; }
 +    void setsize(float din){ this.d=din ; }
 +
 +    }
 +
 +SpinningCube(LX lx) {
 +  super(lx);
 +  addParameter(xoff);
 +  addParameter(toff);
 +  addParameter(Vsize);
 +  addParameter(huev);
 +  addParameter(density);
 +  //addModulator()
 +  V1 = new VirtualCube(model.cx, model.cy, model.cz, model.xMax/2);
 +  spinx= new SawLFO(0, TWO_PI, 8000);
 +  spin1 = new LXProjection(model);
 +   
 +}
 +
 +
 +void run(double deltaMs) {
 +  
 +  noisetime+= deltaMs*.0001*toff.getValuef();
 +
 +spin1.reset()
 +.center()
 +//.scale ()
 +.rotate(spinx.getValuef(),0, 1, 0)
 +.translate(model.cx, model.cy, model.cz);
 +
 +for (LXVector p: spin1) {
 +  P.set(p.x, p.y, p.z);
 +
 + colors[p.index] = V1.getcolor(p);
 +
 +}
 +
 +V1.setsize(Vsize.getValuef());
 +
 +
 +};
 +
 +
 +}
 +
 +
 +
 +
 +
 +
   class HueTestHSB extends SCPattern{
    BasicParameter HueT = new BasicParameter("Hue", .5);
    BasicParameter SatT = new BasicParameter("Sat", .5);
@@@ -743,7 -622,7 +754,7 @@@ HueTestHSB(LX lx) 
     int now= millis();
     if (now % 1000 <= 20)
     {
 -   println("Hue: " + 360*HueT.getValuef() + "Sat: " + 100*SatT.getValuef() + "Bright:  " + 100*BriT.getValuef());
 +   println("Hue: " + 360*HueT.getValuef() + "Sat: " + 100*SatT.getValuef() + "Bright: " + 100*BriT.getValuef());
     }
    }