updates on dpat
authorbb3dan <gitdan@citopia.com>
Wed, 25 Sep 2013 20:20:23 +0000 (16:20 -0400)
committerbb3dan <gitdan@citopia.com>
Wed, 25 Sep 2013 20:20:29 +0000 (16:20 -0400)
more updates

DanHorwitz.pde
DanUtil.pde

index 3744086f2a9a5ab84e5eaeb1f0cc620f75cd72bd..d73b6c48191cc3580e32035e472984e5c99780dc 100755 (executable)
@@ -1,7 +1,7 @@
 //----------------------------------------------------------------------------------------------------------------------------------\r
 public class Pong extends DPat {\r
        SinLFO x,y,z,dx,dy,dz; \r
-       float cRad;     _DhP pSize;\r
+       float cRad;     DParam pSize;\r
        Pick  pChoose;\r
 \r
        Pong(GLucose glucose) {\r
@@ -49,7 +49,7 @@ public class Noise extends DPat
        int             XSym=1,YSym=2,RadSym=3;\r
        float           zTime   = random(10000), zTheta=0, zSin, zCos;\r
        float           rtime   = 0, ttime      = 0, transAdd=0;\r
-       _DhP            pSpeed , pDensity, pRotZ;\r
+       DParam          pSpeed , pDensity, pRotZ;\r
        Pick            pChoose, pSymm;\r
        int                     _ND = 4;\r
        NDat            N[] = new NDat[_ND];\r
@@ -131,8 +131,8 @@ public class Noise extends DPat
 public class Play extends DPat\r
 {\r
        int             nBeats  =       0;\r
-       _DhP    pAmp, pRad;\r
-       _DhP    pRotX, pRotY, pRotZ;\r
+       DParam  pAmp, pRad;\r
+       DParam  pRotX, pRotY, pRotZ;\r
        xyz             Theta   = new xyz();\r
        xyz             TSin    = new xyz();\r
        xyz             TCos    = new xyz();\r
@@ -147,8 +147,8 @@ public class Play extends DPat
                pRotZ           = addParam("RotZ", .5);\r
            pAmp                = addParam("Amp" , .2);\r
            pRad                = addParam("Rad"        , .1            );\r
-               pTempoMult      = addPick ("TMult"      , 0 , 6         , new String[] {"1x", "2x", "4x", "8x", "16x", "Rand"   }       );\r
-               pTimePattern= addPick ("TPat"   , 0 , 5         , new String[] {"Bounce", "Sin", "Roll", "Quant", "Accel"       }       );\r
+               pTempoMult      = addPick ("TMult"      , 5 , 6         , new String[] {"1x", "2x", "4x", "8x", "16x", "Rand"   }       );\r
+               pTimePattern= addPick ("TPat"   , 5 , 6         , new String[] {"Bounce", "Sin", "Roll", "Quant", "Accel", "Rand"       }       );\r
                pShape          = addPick ("Shape"      , 0 , 10        , new String[] {"Line", "Tap", "V", "RandV", "Pyramid",\r
                                                                                                                                        "Wings", "W2", "Sphere", "Cone", "Noise" }      );\r
                pForm           = addPick ("Form"       , 0 , 3         , new String[] {"Bar", "Volume", "Fade"                                 }       );\r
@@ -157,7 +157,7 @@ public class Play extends DPat
        float   t,a;\r
        xyz             cPrev = new xyz(), cCur = new xyz(), cMid = new xyz(), cMidNorm;\r
        float   LastBeat=3, LastMeasure=3;\r
-       int             CurRandTempo = 1;\r
+       int             CurRandTempo = 1, CurRandTPat = 1;\r
 \r
        void StartRun(double deltaMs) {\r
                t = lx.tempo.rampf();\r
@@ -167,20 +167,25 @@ public class Play extends DPat
                TSin    .set(sin(Theta.x), sin(Theta.y), sin(Theta.z));\r
                TCos    .set(cos(Theta.x), cos(Theta.y), cos(Theta.z));\r
 \r
-               if (t<LastMeasure) { CurRandTempo = int(random(4)); } LastMeasure = t;\r
+               if (t<LastMeasure) {\r
+                       if (random(2) < 1) CurRandTempo = int(random(4));\r
+                       if (random(2) < 1) CurRandTPat  = int(random(5));\r
+               } LastMeasure = t;\r
+                       \r
+               int nTempo = pTempoMult  .Cur(); if (nTempo == 5) nTempo = CurRandTempo;\r
+               int nTPat  = pTimePattern.Cur(); if (nTPat  == 5) nTPat  = CurRandTPat ;\r
 \r
-               switch (pTempoMult.Cur()) {\r
+               switch (nTempo) {\r
                        case 0:         t = t;                                                          break;\r
                        case 1:         t = (t*2. )%1.;                                         break;\r
                        case 2:         t = (t*4. )%1.;                                         break;\r
                        case 3:         t = (t*8. )%1.;                                         break;\r
                        case 4:         t = (t*16.)%1.;                                         break;\r
-                       case 5:         t = (t*pow(2,CurRandTempo))%1.;         break;\r
                }\r
 \r
                if (t<LastBeat) { cPrev = cCur; cCur = cCur.setRand(); } LastBeat = t;\r
 \r
-               switch (pTimePattern.Cur()) {\r
+               switch (nTPat) {\r
                        case 0:         t = sin(PI*t);                                          break;\r
                        case 1:         t = norm(sin(2*PI*(t+PI/2)),-1,1);      break;\r
                        case 2:         t = t;                                                          break;\r
index 08d2bc469739b687aa73e8ebdf1a6ab068ea53bd..e9c36630ae5cbf1ad935b7d817637edb361be50e 100644 (file)
@@ -7,16 +7,36 @@ boolean btwn  (int            a,int    b,int          c)              { return a >= b && a <= c;      }
 boolean btwn  (double  a,double b,double       c)              { return a >= b && a <= c;      }
 
 public class Pick {
-       Pick    (String label, int _Def, int _Max,      String d[])     { NumPicks=_Max; Default = _Def; tag=label; Desc = d; }
-       int             Cur()                                                           { return (CurRow-StartRow)*NumApcCols + CurCol;         }
-       int     NumPicks, Default, CurRow, CurCol, StartRow, EndRow;
-       String  Desc[]  ;       
-       String  tag             ;
+       int             Cur()                                                                   { return (CurRow-StartRow)*NumApcCols + CurCol;                                 }
+       String  CurDesc()                                                               { return Desc[Cur()]; }
+       void    reset()                                                                 { CurCol = Default % NumApcCols; CurRow = StartRow + Default / NumApcCols; }
+
+       int     NumPicks, Default       ,
+                       CurRow  , CurCol        ,
+                       StartRow, EndRow        ;
+       String  tag             , Desc[]        ;
+       
+       Pick    (String label, int _Def, int _Max,      int nStart, String d[]) {
+               NumPicks        = _Max;         Default = _Def; 
+               StartRow        = nStart;       EndRow  = StartRow + int((NumPicks-1) / NumApcCols);
+               tag                     = label;        Desc    = d;
+               reset();
+       }
 }
-//----------------------------------------------------------------------------------------------------------------------------------
-public class _DhP extends BasicParameter {
+
+public class DBool {
+       boolean def, b;
+       String  tag;
+       int             row, col;
+       void    reset() { b = def; }
+       DBool(String _tag, boolean _def, int _row, int _col) {
+               def = _def; b = _def; tag = _tag; row = _row; col = _col;
+       }
+}
+
+public class DParam extends BasicParameter {
        double  dflt;
-       _DhP    (String label, double value)            { super(label,value); dflt=value;               }
+       DParam  (String label, double value)            { super(label,value); dflt=value;               }
        void    Set                     (double value)                  { super.setValue(value);                                }
        void    reset           ()                                              { super.setValue(dflt);                                 }
        float   Val                     ()                                              { return getValuef();                                   }
@@ -31,11 +51,8 @@ public class xyz {   float x,y,z;
        float   distance(xyz b)                                 {return dist(x,y,z,b.x,b.y,b.z);                }
        float   dot     (xyz b)                                 {return x*b.x + y*b.y + z*b.z;                  }
        xyz             minus   (xyz b)                                 {return new xyz(x-b.x,y-b.y,z-b.z);     }
-       xyz             plus    (xyz b)                                 {return new xyz(x+b.x,y+b.y,z+b.z);     }
-       xyz             plus    (float b)                               {return new xyz(x+b  ,y+b  ,z+b  );     }
-       xyz             over    (xyz b)                                 {return new xyz(x/b.x,y/b.y,z/b.z);     }
-       xyz             times   (float b)                               {return new xyz(x*b  ,y*b  ,z*b  );     }
-       boolean isZero  ()                                              {return x==0 && y==0 && z==0;                   }
+       void    add             (xyz b)                                 {x += b.x; y += b.y; z += b.z;                  }
+       void    add             (float b)                               {x += b  ; y += b  ; z += b  ;                  }
 
        void    RotateZ   (xyz o, float nSin, float nCos) {
                float nX = nCos*(x-o.x) - nSin*(y-o.y) + o.x;
@@ -66,91 +83,74 @@ public class DGlobals {
        boolean         bInit                   = false;
        MidiOutput      APCOut                  = null;
        MidiInput       APCIn                   = null,         OxygenIn                = null;
-       DPat            CurPat                  = null;//       NextPat                 = null;
-       boolean         _XSym                   = false,        _YSym                   = false,
-                               _ZSym                   = false,        _RSym                   = false;
-       String          Text1                   = "",           Text2                   = "";
+       DPat            CurPat                  = null;
 
-       float           Sliders[]               = new float[] {0,0,0,0,0,0,0,0};
-       String          SliderText[]    = new String[] {"Trails", "Dim", "Saturate", "SpinHue", "Hue", "NoiseHue", "Spark", "Wiggle"};
+       float           Sliders[]               = new float [] {1,0,0,0,0,0,0,0};
+       String          SliderText[]    = new String[] {"Level", "SpinHue", "Spark", "Wiggle", "Trails", "??", "??", "??"};
 
        int     mapRow   (int a)                                        { return btwn(a,53,57) ? a-53 : a;                      }
        int     unmapRow (int a)                                        { return btwn(a,0 , 4) ? a+53 : a;                      }
 
        void    SetLight (int row, int col, int clr){ if (APCOut != null) APCOut.sendNoteOn(col, unmapRow(row), clr); }
-       void    SetKnob  (int cc , int chan,int val){ if (APCOut != null) APCOut.sendController(cc , chan                 , val); }
+       void    SetKnob  (int cc , int c  , int v  ){ if (APCOut != null) APCOut.sendController(cc , c, v); }
 
-       float   _Trails         ()                                              { return Sliders[0]; }
-       float   _Dim            ()                                              { return Sliders[1]; }
-       float   _Saturate       ()                                              { return Sliders[2]; }
-       float   _SpinHue        ()                                              { return Sliders[3]; }
-       float   _ModHue         ()                                              { return Sliders[4]; }
-       float   _NoiseHue       ()                                              { return Sliders[5]; }
-       float   _Spark          ()                                              { return Sliders[6]; }
-       float   _Wiggle         ()                                              { return Sliders[7]; }
+       DBool   GetBool (int i)                                         { return (DBool)CurPat.bools .get(i); }
+       Pick    GetPick (int i)                                         { return (Pick) CurPat.picks .get(i); }
+       DParam  GetParam(int i)                                         { return (DParam) CurPat.params.get(i); }
+
+       float   _Dim            ()                                              { return Sliders[0]; }
+       float   _SpinHue        ()                                              { return Sliders[1]; }
+       float   _Spark          ()                                              { return Sliders[2]; }
+       float   _Wiggle         ()                                              { return Sliders[3]; }
+       float   _Trails         ()                                              { return Sliders[4]; }
 
        void    Init            () {
                if (bInit) return; bInit=true;
-           for (MidiOutputDevice output : RWMidi.getOutputDevices()) { if (APCOut == null && output.toString().contains("APC")) APCOut = output.createOutput(); }
-               for (MidiInputDevice  input  : RWMidi.getInputDevices ()) { if (input.toString().contains("APC")) input.createInput (this); }
+           for (MidiOutputDevice o: RWMidi.getOutputDevices()) { if (o.toString().contains("APC")) { APCOut = o.createOutput(); break;}}
+               for (MidiInputDevice  i: RWMidi.getInputDevices ()) { if (i.toString().contains("APC")) { i.createInput (this);          break;}}
        }
-
-       void SetText()
-       {
-               if (!isFocused()) return;
-               Text1 = ""; Text2 = "";
-               Text1  += " XSym:  " + (_XSym ? "ON" : "OFF") + "    ";
-               Text1  += " YSym:  " + (_YSym ? "ON" : "OFF") + "    ";
-               Text1  += " ZSym:  " + (_ZSym ? "ON" : "OFF") + "    ";
-               Text1  += " RSym:  " + (_RSym ? "ON" : "OFF") + "    ";
-               for (int i=0; i<CurPat.picks.size(); i++) {
-                       Pick P = (Pick)CurPat.picks.get(i); Text1 += P.tag + ": " + P.Desc[P.Cur()] + "    ";
-               }
-
-               Text2  = "SLIDERS: ";
-               for (int i=0; i<8; i++) if (SliderText[i] != "") {
-                       Text2 += SliderText[i] + ": " + int(100*Sliders[i]) + "     "; }
-
-               uiDebugText.setText(Text1, Text2);
-       }
-
-       boolean isFocused  ()           { return CurPat != null && CurPat == midiEngine.getFocusedDeck().getActivePattern();                            }       
-       void    Deactivate (DPat p) { if (p != CurPat) return; uiDebugText.setText(""); CurPat = null;                          }
+       
+       boolean isFocused  ()           { return CurPat != null && CurPat == midiEngine.getFocusedDeck().getActivePattern(); }
+       void    Deactivate (DPat p) { if (p != CurPat) return; uiDebugText.setText(""); CurPat = null;                                   }
        void    Activate   (DPat p) {
                CurPat = p;
                while (lx.tempo.bpm() > 40) lx.tempo.setBpm(lx.tempo.bpm()/2);
-               for (int i=0; i<p.paramlist.size(); i++) ((_DhP)p.paramlist.get(i)).reset();
+               for (int i=0; i<p.params.size(); i++) GetParam(i).reset();
+               for (int i=0; i<p.bools .size(); i++) GetBool (i).reset();
+               for (int i=0; i<p.picks .size(); i++) GetPick (i).reset();
                UpdateLights();
        }
 
+       void SetText() {
+               if (!isFocused()) return;
+               String Text1="", Text2="";
+               for (int i=0; i<CurPat.bools.size(); i++) if (GetBool(i).b) Text1 += " " + GetBool(i).tag       + "   ";
+               for (int i=0; i<CurPat.picks.size(); i++) Text1 += GetPick(i).tag + ": " + GetPick(i).CurDesc() + "   ";
+               for (int i=0; i<5; i++)                                   Text2 += SliderText[i]  + ": " + int(100*Sliders[i])  + "   ";
+               uiDebugText.setText(Text1, Text2);
+       }
+
        void    UpdateLights() {
+               if (!isFocused()) return;
                for (int i=0; i<NumApcRows      ; i++) for (int j=0; j<NumApcCols; j++) SetLight(i, j, 0);
                for (int i=48;i< 56             ; i++) SetKnob(0, i, 0);
                for (int i=16;i< 20             ; i++) SetKnob(0, i, 0);
-               for (int i=0; i<CurPat.picks.size()     ; i++) {
-                       Pick P = (Pick)CurPat.picks.get(i); SetLight(P.CurRow, P.CurCol, 3);
-               }
-               SetLight(82, 0, _XSym ? 3 : 0);
-               SetLight(83, 0, _YSym ? 3 : 0);
-               SetLight(84, 0, _ZSym ? 3 : 0);
-               SetLight(85, 0, _RSym ? 3 : 0);
-               
-               for (int i=0; i<CurPat.paramlist.size(); i++) {
-                       _DhP Param = (_DhP)CurPat.paramlist.get(i);
-                       SetKnob ( 0, i<=55 ? 48+i : 16 + i - 8, int(Param.Val()*127) );
-               }
+
+               for (int i=0; i<CurPat.picks.size()     ; i++) SetLight (GetPick(i).CurRow, GetPick(i).CurCol, 3);
+               for (int i=0; i<CurPat.bools.size()     ; i++) SetLight (GetBool(i).row, GetBool(i).col, GetBool(i).b ? 3 : 0);
+               for (int i=0; i<CurPat.params.size(); i++) SetKnob      ( 0, i<=55 ? 48+i : 16 + i - 8, int(GetParam(i).Val()*127) );
        }
        
-       double Tap1 = 0;
-       double getNow() { return millis() + 1000*second() + 60*1000*minute() + 3600*1000*hour(); }
-
        void    controllerChangeReceived(rwmidi.Controller cc) {
                if (cc.getCC() == 7 && btwn(cc.getChannel(),0,7)) { Sliders[cc.getChannel()] = 1.*cc.getValue()/127.; }
        }
 
+       double Tap1 = 0;
+       double getNow() { return millis() + 1000*second() + 60*1000*minute() + 3600*1000*hour(); }
+
        void noteOffReceived(Note note) {
                if (!isFocused()) return;
-               int row = DG.mapRow(note.getPitch()), col = note.getChannel();
+               int row = mapRow(note.getPitch()), col = note.getChannel();
 
                if (row == 50 && col == 0 && btwn(getNow() - Tap1,5000,300*1000)) {     // hackish tapping mechanism
                        double bpm = 32.*60000./(getNow()-Tap1);
@@ -166,36 +166,40 @@ public class DGlobals {
                if (!isFocused()) return;
                int row = mapRow(note.getPitch()), col = note.getChannel();
                
-                        if (row == 50 && col == 0)     { lx.tempo.trigger(); Tap1 = getNow();  }
-               else if (row == 82 && col == 0)         _XSym = !_XSym  ;
-               else if (row == 83 && col == 0)         _YSym = !_YSym  ;
-               else if (row == 84 && col == 0)         _ZSym = !_ZSym  ;
-               else if (row == 85 && col == 0)         _RSym = !_RSym  ;
-               else {
-                       for (int i=0; i<CurPat.picks.size(); i++) { Pick P = (Pick)CurPat.picks.get(i);
-                               if (!btwn(row,P.StartRow,P.EndRow)                                                      ) continue;
-                               if (!btwn(col,0,NumApcCols-1)                                                           ) continue;
-                               if (!btwn((row-P.StartRow)*NumApcCols + col,0,P.NumPicks-1)     ) continue;
-                               P.CurRow=row; P.CurCol=col; return;
-                       }
-                       //println(row + " " + col); 
+               if (row == 50 && col == 0)      { lx.tempo.trigger(); Tap1 = getNow(); return; }
+               
+               for (int i=0; i<CurPat.picks.size(); i++) { Pick P = GetPick(i);
+                       if (!btwn(row,P.StartRow,P.EndRow)                                                      ) continue;
+                       if (!btwn(col,0,NumApcCols-1)                                                           ) continue;
+                       if (!btwn((row-P.StartRow)*NumApcCols + col,0,P.NumPicks-1)     ) continue;
+                       P.CurRow=row; P.CurCol=col; return;
+               }
+               
+               for (int i=0; i<CurPat.bools.size(); i++) { DBool B = GetBool(i);
+                       if (row == GetBool(i).row && col == B.col)      { B.b = !B.b; return; }
                }
        }
+       
+       
 }
 //----------------------------------------------------------------------------------------------------------------------------------
 public class DPat extends SCPattern
 {
        ArrayList       picks           = new ArrayList();
-       ArrayList       paramlist       = new ArrayList();
+       ArrayList       params          = new ArrayList();
+       ArrayList       bools           = new ArrayList();
        int                     nMaxRow         = 0;
        float           zSpinHue        = 0;
+       float           LastQuant       = -1, LastJog = -1;
        int             nPoint  , nPoints;
        xyz                     xyzHalf         = new xyz(.5,.5,.5),
                                xyzdMax         = new xyz(),
-                               xyzMid          = new xyz();
+                               xyzMid          = new xyz(),
+                               xyzJog          = new xyz(0,0,0);
        
        float           NoiseMove       = random(10000);
-       _DhP            pSharp, pRotX, pRotY, pRotZ;
+       DParam          pSharp, pQuantize, pSaturate;
+       DBool           pXsym, pYsym, pZsym, pJog;
        float           Dist     (xyz a, xyz b)                         { return dist(a.x,a.y,a.z,b.x,b.y,b.z);         }
        int                     c1c              (float a)                                      { return int(100*constrain(a,0,1));                     }
        float           CalcCone (xyz v1, xyz v2, xyz c)        { return degrees( acos ( v1.minus(c).dot(v2.minus(c)) /
@@ -208,33 +212,37 @@ public class DPat extends SCPattern
        void            onActive  ()                                            { UpdateState(); }
        void            UpdateState()                                           { if (IsFocused() != IsActive()) { if (IsFocused()) DG.Activate(this); else DG.Deactivate(this); } }
 
-       _DhP addParam(String label, double value) {
-               _DhP P = new _DhP(label, value);                
+       DParam          addParam(String label, double value) {
+               DParam P = new DParam(label, value);
                super.addParameter(P);
-               paramlist.add(P); return P;
+               params.add(P); return P;
        }
-               
+
        Pick addPick(String name, int def, int nmax, String[] desc) {
-               Pick P          = new Pick(name, def, nmax, desc); 
-               P.StartRow      = nMaxRow;
-               P.EndRow        = P.StartRow + int((nmax-1) / NumApcCols);
+               Pick P          = new Pick(name, def, nmax, nMaxRow, desc); 
                nMaxRow         = P.EndRow + 1;
-               P.CurCol        = def % NumApcCols;
-               P.CurRow        = P.StartRow + def / NumApcCols;
                picks.add(P);
                return P;
        }
-
+       
        DPat(GLucose glucose) {
                super(glucose);
                DG.Init();
-               pSharp          =  addParam("Shrp"      ,  0);
+               pSharp          =  addParam("Shrp",  0 );
+               pQuantize       =  addParam("Qunt",  0 );
+               pSaturate       =  addParam("Sat" ,  .5);
+               
                nPoints         =  model.points.size();
                xdMax           =  model.xMax;
                ydMax           =  model.yMax;
                zdMax           =  model.zMax;
                xyzdMax         =  new xyz(xdMax,ydMax,zdMax);
                xyzMid          =  new xyz(xdMax/2, ydMax/2, zdMax/2);
+               
+               bools.add(pXsym         = new DBool("X-SYM", false, 82, 0));
+               bools.add(pYsym         = new DBool("Y-SYM", false, 83, 0));
+               bools.add(pZsym         = new DBool("Z-SYM", false, 84, 0));
+               bools.add(pJog          = new DBool("JOGGER",false, 85, 0));
        }
 
        void run(double deltaMs)
@@ -244,37 +252,51 @@ public class DPat extends SCPattern
                StartRun                (deltaMs);
                zSpinHue                += DG._SpinHue ()*deltaMs*.05;
                xyz P                   = new xyz();
-               float modhue    = DG._ModHue  ()==0 ? 0 : DG._ModHue  ()*360;
-               float fSharp    = 1/(1.01-pSharp.Val());
+               float fSharp    = 1/(1.0001-pSharp.Val());
+               float fQuant    = pQuantize.Val();
+               float fSaturate = pSaturate.Val();
+               
                DG.SetText();
                nPoint  = 0;
+               
+               if (fQuant > 0) {
+                       float tRamp     = (lx.tempo.rampf() % (1./pow(2,int((1-fQuant) * 4))));
+                       float f = LastQuant; LastQuant = tRamp; if (tRamp > f) return;
+               }
+       
+       
+               if (pJog.b) {
+                       float tRamp     = (lx.tempo.rampf() % .25);
+                       if (tRamp < LastJog) 
+                               xyzJog.set(random(xdMax*.2)-.1,
+                                                  random(ydMax*.2)-.1,
+                                                  random(zdMax*.2)-.1);
+                       LastJog = tRamp; 
+               }
+
                for (Point p : model.points)    { nPoint++;
                        P.set(p);
-                       if (DG._Spark () > 0) P.y += DG._Spark () * (noise(P.x,P.y+NoiseMove/30  ,P.z)*ydMax - ydMax/2.);
-                       if (DG._Wiggle() > 0) P.y += DG._Wiggle() * (noise(P.x/(xdMax*.3)-NoiseMove/1500.) - .5) * (ydMax/2.);
-
-                       color cOld      = colors[p.index];
+                       if (pJog.b)     P.add(xyzJog);
+                       if (DG._Spark () > 0)   P.y += DG._Spark () * (noise(P.x,P.y+NoiseMove/30  ,P.z)*ydMax - ydMax/2.);
+                       if (DG._Wiggle() > 0)   P.y += DG._Wiggle() * (noise(P.x/(xdMax*.3)-NoiseMove/1500.) - .5) * (ydMax/2.);
 
+                       color                   cOld = colors[p.index];
                        color                   cNew = CalcPoint(P);
-                       if (DG._XSym)   cNew = blendColor(cNew, CalcPoint(new xyz(xdMax-P.x,P.y,P.z)), ADD);
-                       if (DG._YSym)   cNew = blendColor(cNew, CalcPoint(new xyz(P.x,ydMax-P.y,P.z)), ADD);
-                       if (DG._ZSym)   cNew = blendColor(cNew, CalcPoint(new xyz(P.x,P.y,zdMax-P.z)), ADD);
-
-                       float b = brightness(cNew)/100.;
-                       b = b < .5 ? pow(b,fSharp) : 1-pow(1-b,fSharp);
-
-                       float noizhue = DG._NoiseHue()==0 ? 0 : DG._NoiseHue()*360*noise(
-                                                                                                       P.x/(xdMax*.3)+NoiseMove*.0003,
-                                                                                                       P.y/(ydMax*.3)+NoiseMove*.00025,
-                                                                                                       P.z/(zdMax*.3)+NoiseMove*.0002  );
-
-                       cNew = color( (hue(cNew) + modhue + zSpinHue - noizhue) % 360,
-                                               saturation(cNew) + 100*DG._Saturate(),
-                                               100 *  (DG._Trails()==0 ? b : max(b, (float) (brightness(cOld)/100. - (1-DG._Trails()) * deltaMs/200.)))
-                                                       *  (DG._Dim   ()==0 ? 1 : 1-DG._Dim())
-                                               );
-                                                  
-                       colors[p.index] = cNew;
+
+                       if (pXsym.b)    cNew = blendColor(cNew, CalcPoint(new xyz(xdMax-P.x,P.y,P.z)), ADD);
+                       if (pYsym.b)    cNew = blendColor(cNew, CalcPoint(new xyz(P.x,ydMax-P.y,P.z)), ADD);
+                       if (pZsym.b)    cNew = blendColor(cNew, CalcPoint(new xyz(P.x,P.y,zdMax-P.z)), ADD);
+
+                       float                                                           b = brightness(cNew)/100.;
+
+                       if (pSharp.Val()>0)                             b = b < .5 ? pow(b,fSharp) : 1-pow(1-b,fSharp);
+                       if (DG._Trails()>0 && fQuant == 0)      b = max(b, (float) (brightness(cOld)/100. - (1-DG._Trails()) * deltaMs/200.));
+
+                       colors[p.index] = color(
+                               (hue(cNew) + zSpinHue) % 360,
+                               saturation(cNew) + 100*(fSaturate*2-1),
+                               100 *  b * DG._Dim()
+                       );
                }
        }
 }