#defaults=no #patchname=no 0.0) { if (r <= cp) { // If delta is to be taken from value's min/max range... if (dt == DELTA_FROM_RANGE) { // Calculate the lo/hi values using the change bias if (cb > 0.0) { // Positive bias lo = (vmin - v) - ((vmin - v) * cb); hi = vmax - v; } else { // Negative bias lo = vmin - v; hi = (vmax - v) + ((vmax - v) * cb); } // Else the delta is based on lo/hi percentages } else { // Calculate the lo/hi values using the change bias if (cb > 0.0) { // Positive bias lo = -1.0 + cb; hi = 1.0; } else { // Negative bias lo = -1.0; hi = 1.0 + cb; } } // Generate a random scaled change amount r = rand(lo, hi) * sc; // If the change amount should be rounded to a multiple if (cm > 0.0) { if (r < 0.0) { h = -0.5; } else { h = 0.5; } // Scale by cm, round, and type cast to int yi = ((r / cm) + h); // Type cast back to float yf = yi; // Unscale back by cm r = yf * cm; } // If delta is from value's min/max range if (dt == DELTA_FROM_RANGE) { // Add change amount to v x = v + r; // Else delta is a percentage of current value } else { // Add change amount percentage of current value x = v + (v * r); } // If the final result should be rounded to a multiple if (fm > 0.0) { if (x < 0.0) { h = -0.5; } else { h = 0.5; } // Scale by fm, round, and type cast to int yi = ((x / fm) + h); // Type cast back to float yf = yi; // Unscale back by fm x = yf * fm; } // Although Zebra will attempt to do limits, sometimes it gets wonky, so do it here too if (x < vmin) { x = vmin; } if (x > vmax) { x = vmax; } } } return x; } // Default scaling float s = 0.1; // General purpose counting int i; for ( i = 1; i <= 4; i++ ) { if (Env[i].active) { Env[i].Attack = delta(Env[i].Attack, Env[i].Attack.min, Env[i].Attack.max, DELTA_FROM_RANGE, 1.0, 0.85, s, 0.0, 0.0); Env[i].Decay = delta(Env[i].Decay, Env[i].Decay.min, Env[i].Decay.max, DELTA_FROM_RANGE, 0.5, 0.75, s, 0.0, 0.0); Env[i].Release = delta(Env[i].Release, Env[i].Release.min, Env[i].Release.max, DELTA_FROM_RANGE, 0.5, 0.5, s, 0.0, 0.0); } } for ( i = 1; i <= 4; i++ ) { if (MSEG[i].active) { MSEG[i].Attack = delta(MSEG[i].Attack, MSEG[i].Attack.min, MSEG[i].Attack.max, DELTA_FROM_RANGE, 0.5, -0.75, s, 0.0, 0.0); MSEG[i].Release = delta(MSEG[i].Release, MSEG[i].Release.min, MSEG[i].Release.max, DELTA_FROM_RANGE, 0.5, -0.75, s, 0.0, 0.0); } } ?>