aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Johnson <jinx6568@sover.net>2018-09-03 16:35:36 -0400
committerChris Johnson <jinx6568@sover.net>2018-09-03 16:35:36 -0400
commit3dd30d920a374ba31994f784fadd5ee130752247 (patch)
tree4a8350099d829390fc1e75234875ff76a82ec9e9
parentb4f55328448d087a68e6f658638fb3d38d86be12 (diff)
downloadairwindows-lv2-port-3dd30d920a374ba31994f784fadd5ee130752247.tar.gz
airwindows-lv2-port-3dd30d920a374ba31994f784fadd5ee130752247.tar.bz2
airwindows-lv2-port-3dd30d920a374ba31994f784fadd5ee130752247.zip
Ditherbox update
-rwxr-xr-xplugins/LinuxVST/src/Ditherbox/Ditherbox.cpp62
-rwxr-xr-xplugins/LinuxVST/src/Ditherbox/Ditherbox.h2
-rwxr-xr-xplugins/LinuxVST/src/Ditherbox/DitherboxProc.cpp295
-rwxr-xr-xplugins/MacAU/Distance2/Ditherbox/Ditherbox.cpp832
-rwxr-xr-xplugins/MacAU/Distance2/Ditherbox/Ditherbox.exp1
-rwxr-xr-xplugins/MacAU/Distance2/Ditherbox/Ditherbox.h224
-rwxr-xr-xplugins/MacAU/Distance2/Ditherbox/Ditherbox.r61
-rwxr-xr-xplugins/MacAU/Distance2/Ditherbox/Ditherbox.xcodeproj/christopherjohnson.mode1v31391
-rwxr-xr-xplugins/MacAU/Distance2/Ditherbox/Ditherbox.xcodeproj/christopherjohnson.pbxuser153
-rwxr-xr-xplugins/MacAU/Distance2/Ditherbox/Ditherbox.xcodeproj/christopherjohnson.perspectivev31482
-rwxr-xr-xplugins/MacAU/Distance2/Ditherbox/Ditherbox.xcodeproj/project.pbxproj490
-rwxr-xr-xplugins/MacAU/Distance2/Ditherbox/DitherboxVersion.h68
-rwxr-xr-xplugins/MacAU/Distance2/Ditherbox/Ditherbox_Prefix.pch5
-rwxr-xr-xplugins/MacAU/Distance2/Ditherbox/English.lproj/InfoPlist.stringsbin0 -> 380 bytes
-rwxr-xr-xplugins/MacAU/Distance2/Ditherbox/Info.plist28
-rwxr-xr-xplugins/MacAU/Distance2/Ditherbox/version.plist16
-rwxr-xr-xplugins/MacAU/Ditherbox/Ditherbox.cpp118
-rwxr-xr-xplugins/MacAU/Ditherbox/Ditherbox.h48
-rwxr-xr-xplugins/MacAU/Ditherbox/Ditherbox.xcodeproj/christopherjohnson.pbxuser62
-rwxr-xr-xplugins/MacAU/Ditherbox/Ditherbox.xcodeproj/christopherjohnson.perspectivev341
-rwxr-xr-xplugins/MacVST/Ditherbox/Ditherbox.xcodeproj/christopherjohnson.pbxuser61
-rwxr-xr-xplugins/MacVST/Ditherbox/Ditherbox.xcodeproj/christopherjohnson.perspectivev337
-rwxr-xr-xplugins/MacVST/Ditherbox/source/Ditherbox.cpp62
-rwxr-xr-xplugins/MacVST/Ditherbox/source/Ditherbox.h2
-rwxr-xr-xplugins/MacVST/Ditherbox/source/DitherboxProc.cpp295
-rwxr-xr-xplugins/WinVST/Ditherbox/.vs/VSTProject/v14/.suobin23040 -> 22528 bytes
-rwxr-xr-xplugins/WinVST/Ditherbox/Ditherbox.cpp62
-rwxr-xr-xplugins/WinVST/Ditherbox/Ditherbox.h2
-rwxr-xr-xplugins/WinVST/Ditherbox/DitherboxProc.cpp295
29 files changed, 5923 insertions, 272 deletions
diff --git a/plugins/LinuxVST/src/Ditherbox/Ditherbox.cpp b/plugins/LinuxVST/src/Ditherbox/Ditherbox.cpp
index 7e57c49..0d3822f 100755
--- a/plugins/LinuxVST/src/Ditherbox/Ditherbox.cpp
+++ b/plugins/LinuxVST/src/Ditherbox/Ditherbox.cpp
@@ -12,11 +12,13 @@ AudioEffect* createEffectInstance(audioMasterCallback audioMaster) {return new D
Ditherbox::Ditherbox(audioMasterCallback audioMaster) :
AudioEffectX(audioMaster, kNumPrograms, kNumParameters)
{
- A = 0.825;
+ A = 0.86;
Position = 99999999;
contingentErrL = 0.0;
contingentErrR = 0.0;
+ currentDitherL = 0.0;
+ currentDitherR = 0.0;
bynL[0] = 1000;
bynL[1] = 301;
bynL[2] = 176;
@@ -211,27 +213,33 @@ void Ditherbox::getParameterName(VstInt32 index, char *text) {
void Ditherbox::getParameterDisplay(VstInt32 index, char *text) {
switch (index) {
- case kParamA: switch((VstInt32)( A * 19.999 )) //0 to almost edge of # of params
+ case kParamA: switch((VstInt32)( A * 24.999 )) //0 to almost edge of # of params
{
case 0: vst_strncpy (text, "Trunc", kVstMaxParamStrLen); break;
case 1: vst_strncpy (text, "Flat", kVstMaxParamStrLen); break;
case 2: vst_strncpy (text, "TPDF", kVstMaxParamStrLen); break;
- case 4: vst_strncpy (text, "HiGloss", kVstMaxParamStrLen); break;
- case 5: vst_strncpy (text, "Vinyl", kVstMaxParamStrLen); break;
- case 6: vst_strncpy (text, "Spatial", kVstMaxParamStrLen); break;
- case 7: vst_strncpy (text, "Natural", kVstMaxParamStrLen); break;
- case 8: vst_strncpy (text, "NJAD", kVstMaxParamStrLen); break;
- case 9: vst_strncpy (text, "Trunc", kVstMaxParamStrLen); break;
- case 10: vst_strncpy (text, "Flat", kVstMaxParamStrLen); break;
- case 11: vst_strncpy (text, "TPDF", kVstMaxParamStrLen); break;
- case 12: vst_strncpy (text, "HiGloss", kVstMaxParamStrLen); break;
- case 13: vst_strncpy (text, "Vinyl", kVstMaxParamStrLen); break;
- case 14: vst_strncpy (text, "Spatial", kVstMaxParamStrLen); break;
- case 15: vst_strncpy (text, "Natural", kVstMaxParamStrLen); break;
- case 16: vst_strncpy (text, "NJAD", kVstMaxParamStrLen); break;
- case 17: vst_strncpy (text, "SlewOnl", kVstMaxParamStrLen); break;
- case 18: vst_strncpy (text, "SubsOnl", kVstMaxParamStrLen); break;
- case 19: vst_strncpy (text, "Silhoue", kVstMaxParamStrLen); break;
+ case 3: vst_strncpy (text, "Paul", kVstMaxParamStrLen); break;
+ case 4: vst_strncpy (text, "DbPaul", kVstMaxParamStrLen); break;
+ case 5: vst_strncpy (text, "Tape", kVstMaxParamStrLen); break;
+ case 6: vst_strncpy (text, "HiGloss", kVstMaxParamStrLen); break;
+ case 7: vst_strncpy (text, "Vinyl", kVstMaxParamStrLen); break;
+ case 8: vst_strncpy (text, "Spatial", kVstMaxParamStrLen); break;
+ case 9: vst_strncpy (text, "Natural", kVstMaxParamStrLen); break;
+ case 10: vst_strncpy (text, "NJAD", kVstMaxParamStrLen); break;
+ case 11: vst_strncpy (text, "Trunc", kVstMaxParamStrLen); break;
+ case 12: vst_strncpy (text, "Flat", kVstMaxParamStrLen); break;
+ case 13: vst_strncpy (text, "TPDF", kVstMaxParamStrLen); break;
+ case 14: vst_strncpy (text, "Paul", kVstMaxParamStrLen); break;
+ case 15: vst_strncpy (text, "DbPaul", kVstMaxParamStrLen); break;
+ case 16: vst_strncpy (text, "Tape", kVstMaxParamStrLen); break;
+ case 17: vst_strncpy (text, "HiGloss", kVstMaxParamStrLen); break;
+ case 18: vst_strncpy (text, "Vinyl", kVstMaxParamStrLen); break;
+ case 19: vst_strncpy (text, "Spatial", kVstMaxParamStrLen); break;
+ case 20: vst_strncpy (text, "Natural", kVstMaxParamStrLen); break;
+ case 21: vst_strncpy (text, "NJAD", kVstMaxParamStrLen); break;
+ case 22: vst_strncpy (text, "SlewOnl", kVstMaxParamStrLen); break;
+ case 23: vst_strncpy (text, "SubsOnl", kVstMaxParamStrLen); break;
+ case 24: vst_strncpy (text, "Silhoue", kVstMaxParamStrLen); break;
default: break; // unknown parameter, shouldn't happen!
} break;
default: break; // unknown parameter, shouldn't happen!
@@ -240,27 +248,33 @@ void Ditherbox::getParameterDisplay(VstInt32 index, char *text) {
void Ditherbox::getParameterLabel(VstInt32 index, char *text) {
switch (index) {
- case kParamA: switch((VstInt32)( A * 19.999 )) //0 to almost edge of # of params
+ case kParamA: switch((VstInt32)( A * 24.999 )) //0 to almost edge of # of params
{
case 0: vst_strncpy (text, "16", kVstMaxParamStrLen); break;
case 1: vst_strncpy (text, "16", kVstMaxParamStrLen); break;
case 2: vst_strncpy (text, "16", kVstMaxParamStrLen); break;
+ case 3: vst_strncpy (text, "16", kVstMaxParamStrLen); break;
case 4: vst_strncpy (text, "16", kVstMaxParamStrLen); break;
case 5: vst_strncpy (text, "16", kVstMaxParamStrLen); break;
case 6: vst_strncpy (text, "16", kVstMaxParamStrLen); break;
case 7: vst_strncpy (text, "16", kVstMaxParamStrLen); break;
case 8: vst_strncpy (text, "16", kVstMaxParamStrLen); break;
- case 9: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
- case 10: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
+ case 9: vst_strncpy (text, "16", kVstMaxParamStrLen); break;
+ case 10: vst_strncpy (text, "16", kVstMaxParamStrLen); break;
case 11: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
case 12: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
case 13: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
case 14: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
case 15: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
case 16: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
- case 17: vst_strncpy (text, "y", kVstMaxParamStrLen); break;
- case 18: vst_strncpy (text, "y", kVstMaxParamStrLen); break;
- case 19: vst_strncpy (text, "tte", kVstMaxParamStrLen); break;
+ case 17: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
+ case 18: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
+ case 19: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
+ case 20: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
+ case 21: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
+ case 22: vst_strncpy (text, "y", kVstMaxParamStrLen); break;
+ case 23: vst_strncpy (text, "y", kVstMaxParamStrLen); break;
+ case 24: vst_strncpy (text, "tte", kVstMaxParamStrLen); break;
default: break; // unknown parameter, shouldn't happen!
} break;
default: break; // unknown parameter, shouldn't happen!
diff --git a/plugins/LinuxVST/src/Ditherbox/Ditherbox.h b/plugins/LinuxVST/src/Ditherbox/Ditherbox.h
index baf5bb1..fa54082 100755
--- a/plugins/LinuxVST/src/Ditherbox/Ditherbox.h
+++ b/plugins/LinuxVST/src/Ditherbox/Ditherbox.h
@@ -58,6 +58,8 @@ private:
long double noiseShapingR;
double contingentErrL;
double contingentErrR;
+ double currentDitherL;
+ double currentDitherR;
int Position;
bool flip;
double NSOddL;
diff --git a/plugins/LinuxVST/src/Ditherbox/DitherboxProc.cpp b/plugins/LinuxVST/src/Ditherbox/DitherboxProc.cpp
index feb5874..4115687 100755
--- a/plugins/LinuxVST/src/Ditherbox/DitherboxProc.cpp
+++ b/plugins/LinuxVST/src/Ditherbox/DitherboxProc.cpp
@@ -14,7 +14,7 @@ void Ditherbox::processReplacing(float **inputs, float **outputs, VstInt32 sampl
float* out1 = outputs[0];
float* out2 = outputs[1];
- int dtype = (int)(A * 19.999); // +1 for Reaper bug workaround
+ int dtype = (int)(A * 24.999)+1; // +1 for Reaper bug workaround
long double overallscale = 1.0;
overallscale /= 44100.0;
overallscale *= getSampleRate();
@@ -42,14 +42,52 @@ void Ditherbox::processReplacing(float **inputs, float **outputs, VstInt32 sampl
long double trim = 2.302585092994045684017991; //natural logarithm of 10
bool highRes = false;
bool dithering = true;
- if (dtype > 8){highRes = true; dtype -= 8;}
- if (dtype > 8){dithering = false; highRes = false;}
+ if (dtype > 11){highRes = true; dtype -= 11;}
+ if (dtype > 11){dithering = false; highRes = false;}
//follow up by switching high res back off for the monitoring
while (--sampleFrames >= 0)
{
long double inputSampleL = *in1;
long double inputSampleR = *in2;
+ if (inputSampleL<1.2e-38 && -inputSampleL<1.2e-38) {
+ static int noisesource = 0;
+ //this declares a variable before anything else is compiled. It won't keep assigning
+ //it to 0 for every sample, it's as if the declaration doesn't exist in this context,
+ //but it lets me add this denormalization fix in a single place rather than updating
+ //it in three different locations. The variable isn't thread-safe but this is only
+ //a random seed and we can share it with whatever.
+ noisesource = noisesource % 1700021; noisesource++;
+ int residue = noisesource * noisesource;
+ residue = residue % 170003; residue *= residue;
+ residue = residue % 17011; residue *= residue;
+ residue = residue % 1709; residue *= residue;
+ residue = residue % 173; residue *= residue;
+ residue = residue % 17;
+ double applyresidue = residue;
+ applyresidue *= 0.00000001;
+ applyresidue *= 0.00000001;
+ inputSampleL = applyresidue;
+ }
+ if (inputSampleR<1.2e-38 && -inputSampleR<1.2e-38) {
+ static int noisesource = 0;
+ noisesource = noisesource % 1700021; noisesource++;
+ int residue = noisesource * noisesource;
+ residue = residue % 170003; residue *= residue;
+ residue = residue % 17011; residue *= residue;
+ residue = residue % 1709; residue *= residue;
+ residue = residue % 173; residue *= residue;
+ residue = residue % 17;
+ double applyresidue = residue;
+ applyresidue *= 0.00000001;
+ applyresidue *= 0.00000001;
+ inputSampleR = applyresidue;
+ //this denormalization routine produces a white noise at -300 dB which the noise
+ //shaping will interact with to produce a bipolar output, but the noise is actually
+ //all positive. That should stop any variables from going denormal, and the routine
+ //only kicks in if digital black is input. As a final touch, if you save to 24-bit
+ //the silence will return to being digital black again.
+ }
float drySampleL = inputSampleL;
float drySampleR = inputSampleR;
@@ -89,7 +127,95 @@ void Ditherbox::processReplacing(float **inputs, float **outputs, VstInt32 sampl
//TPDF dither
break;
- case 4:
+ case 4:
+ currentDitherL = (rand()/(double)RAND_MAX);
+ inputSampleL += currentDitherL;
+ inputSampleL -= lastSampleL;
+ inputSampleL = floor(inputSampleL);
+ lastSampleL = currentDitherL;
+ currentDitherR = (rand()/(double)RAND_MAX);
+ inputSampleR += currentDitherR;
+ inputSampleR -= lastSampleR;
+ inputSampleR = floor(inputSampleR);
+ lastSampleR = currentDitherR;
+ //Paul dither
+ break;
+
+ case 5:
+ nsL[9] = nsL[8]; nsL[8] = nsL[7]; nsL[7] = nsL[6]; nsL[6] = nsL[5];
+ nsL[5] = nsL[4]; nsL[4] = nsL[3]; nsL[3] = nsL[2]; nsL[2] = nsL[1];
+ nsL[1] = nsL[0]; nsL[0] = (rand()/(double)RAND_MAX);
+
+ currentDitherL = (nsL[0] * 0.061);
+ currentDitherL -= (nsL[1] * 0.11);
+ currentDitherL += (nsL[8] * 0.126);
+ currentDitherL -= (nsL[7] * 0.23);
+ currentDitherL += (nsL[2] * 0.25);
+ currentDitherL -= (nsL[3] * 0.43);
+ currentDitherL += (nsL[6] * 0.5);
+ currentDitherL -= nsL[5];
+ currentDitherL += nsL[4];
+ //this sounds different from doing it in order of sample position
+ //cumulative tiny errors seem to build up even at this buss depth
+ //considerably more pronounced at 32 bit float.
+ //Therefore we add the most significant components LAST.
+ //trying to keep values on like exponents of the floating point value.
+ inputSampleL += currentDitherL;
+
+ inputSampleL = floor(inputSampleL);
+ //done with L
+
+ nsR[9] = nsR[8]; nsR[8] = nsR[7]; nsR[7] = nsR[6]; nsR[6] = nsR[5];
+ nsR[5] = nsR[4]; nsR[4] = nsR[3]; nsR[3] = nsR[2]; nsR[2] = nsR[1];
+ nsR[1] = nsR[0]; nsR[0] = (rand()/(double)RAND_MAX);
+
+ currentDitherR = (nsR[0] * 0.061);
+ currentDitherR -= (nsR[1] * 0.11);
+ currentDitherR += (nsR[8] * 0.126);
+ currentDitherR -= (nsR[7] * 0.23);
+ currentDitherR += (nsR[2] * 0.25);
+ currentDitherR -= (nsR[3] * 0.43);
+ currentDitherR += (nsR[6] * 0.5);
+ currentDitherR -= nsR[5];
+ currentDitherR += nsR[4];
+ //this sounds different from doing it in order of sample position
+ //cumulative tiny errors seem to build up even at this buss depth
+ //considerably more pronounced at 32 bit float.
+ //Therefore we add the most significant components LAST.
+ //trying to keep values on like exponents of the floating point value.
+ inputSampleR += currentDitherR;
+
+ inputSampleR = floor(inputSampleR);
+ //done with R
+
+ //DoublePaul dither
+ break;
+
+ case 6:
+ currentDitherL = (rand()/(double)RAND_MAX);
+ currentDitherR = (rand()/(double)RAND_MAX);
+
+ inputSampleL += currentDitherL;
+ inputSampleR += currentDitherR;
+ inputSampleL -= nsL[4];
+ inputSampleR -= nsR[4];
+
+ inputSampleL = floor(inputSampleL);
+ inputSampleR = floor(inputSampleR);
+
+ nsL[4] = nsL[3];
+ nsL[3] = nsL[2];
+ nsL[2] = nsL[1];
+ nsL[1] = currentDitherL;
+
+ nsR[4] = nsR[3];
+ nsR[3] = nsR[2];
+ nsR[2] = nsR[1];
+ nsR[1] = currentDitherR;
+ //Tape dither
+ break;
+
+ case 7:
Position += 1;
//Note- uses integer overflow as a 'mod' operator
hotbinA = Position * Position;
@@ -111,7 +237,7 @@ void Ditherbox::processReplacing(float **inputs, float **outputs, VstInt32 sampl
//Quadratic dither
break;
- case 5:
+ case 8:
absSample = ((rand()/(double)RAND_MAX) - 0.5);
nsL[0] += absSample; nsL[0] /= 2; absSample -= nsL[0];
absSample += ((rand()/(double)RAND_MAX) - 0.5);
@@ -206,7 +332,7 @@ void Ditherbox::processReplacing(float **inputs, float **outputs, VstInt32 sampl
//TenNines dither R
break;
- case 6:
+ case 9:
if (inputSampleL > 0) inputSampleL += 0.383;
if (inputSampleL < 0) inputSampleL -= 0.383;
if (inputSampleR > 0) inputSampleR += 0.383;
@@ -246,7 +372,7 @@ void Ditherbox::processReplacing(float **inputs, float **outputs, VstInt32 sampl
//and does a teeny parallel-compression thing when almost at digital black.
break;
- case 7: //this one is the original Naturalize
+ case 10: //this one is the original Naturalize
if (inputSampleL > 0) inputSampleL += (0.3333333333);
if (inputSampleL < 0) inputSampleL -= (0.3333333333);
inputSampleL += (rand()/(double)RAND_MAX)*0.6666666666;
@@ -406,7 +532,7 @@ void Ditherbox::processReplacing(float **inputs, float **outputs, VstInt32 sampl
//end R
break;
- case 8: //this one is the Not Just Another Dither
+ case 11: //this one is the Not Just Another Dither
//begin L
benfordize = floor(inputSampleL);
@@ -571,7 +697,7 @@ void Ditherbox::processReplacing(float **inputs, float **outputs, VstInt32 sampl
//end R
break;
- case 9:
+ case 12:
//slew only
outputSampleL = (inputSampleL - lastSampleL)*trim;
outputSampleR = (inputSampleR - lastSampleR)*trim;
@@ -585,7 +711,7 @@ void Ditherbox::processReplacing(float **inputs, float **outputs, VstInt32 sampl
inputSampleR = outputSampleR;
break;
- case 10:
+ case 13:
//subs only
gain = gaintarget;
@@ -801,7 +927,7 @@ void Ditherbox::processReplacing(float **inputs, float **outputs, VstInt32 sampl
if (inputSampleR < -1.0) inputSampleR = -1.0;
break;
- case 11:
+ case 14:
//silhouette
//begin L
bridgerectifier = fabs(inputSampleL)*1.57079633;
@@ -893,7 +1019,7 @@ void Ditherbox::processDoubleReplacing(double **inputs, double **outputs, VstInt
double* out1 = outputs[0];
double* out2 = outputs[1];
- int dtype = (int)(A * 19.999); // +1 for Reaper bug workaround
+ int dtype = (int)(A * 24.999)+1; // +1 for Reaper bug workaround
long double overallscale = 1.0;
overallscale /= 44100.0;
overallscale *= getSampleRate();
@@ -921,14 +1047,52 @@ void Ditherbox::processDoubleReplacing(double **inputs, double **outputs, VstInt
long double trim = 2.302585092994045684017991; //natural logarithm of 10
bool highRes = false;
bool dithering = true;
- if (dtype > 8){highRes = true; dtype -= 8;}
- if (dtype > 8){dithering = false; highRes = false;}
+ if (dtype > 11){highRes = true; dtype -= 11;}
+ if (dtype > 11){dithering = false; highRes = false;}
//follow up by switching high res back off for the monitoring
while (--sampleFrames >= 0)
{
long double inputSampleL = *in1;
long double inputSampleR = *in2;
+ if (inputSampleL<1.2e-38 && -inputSampleL<1.2e-38) {
+ static int noisesource = 0;
+ //this declares a variable before anything else is compiled. It won't keep assigning
+ //it to 0 for every sample, it's as if the declaration doesn't exist in this context,
+ //but it lets me add this denormalization fix in a single place rather than updating
+ //it in three different locations. The variable isn't thread-safe but this is only
+ //a random seed and we can share it with whatever.
+ noisesource = noisesource % 1700021; noisesource++;
+ int residue = noisesource * noisesource;
+ residue = residue % 170003; residue *= residue;
+ residue = residue % 17011; residue *= residue;
+ residue = residue % 1709; residue *= residue;
+ residue = residue % 173; residue *= residue;
+ residue = residue % 17;
+ double applyresidue = residue;
+ applyresidue *= 0.00000001;
+ applyresidue *= 0.00000001;
+ inputSampleL = applyresidue;
+ }
+ if (inputSampleR<1.2e-38 && -inputSampleR<1.2e-38) {
+ static int noisesource = 0;
+ noisesource = noisesource % 1700021; noisesource++;
+ int residue = noisesource * noisesource;
+ residue = residue % 170003; residue *= residue;
+ residue = residue % 17011; residue *= residue;
+ residue = residue % 1709; residue *= residue;
+ residue = residue % 173; residue *= residue;
+ residue = residue % 17;
+ double applyresidue = residue;
+ applyresidue *= 0.00000001;
+ applyresidue *= 0.00000001;
+ inputSampleR = applyresidue;
+ //this denormalization routine produces a white noise at -300 dB which the noise
+ //shaping will interact with to produce a bipolar output, but the noise is actually
+ //all positive. That should stop any variables from going denormal, and the routine
+ //only kicks in if digital black is input. As a final touch, if you save to 24-bit
+ //the silence will return to being digital black again.
+ }
double drySampleL = inputSampleL;
double drySampleR = inputSampleR;
@@ -968,7 +1132,94 @@ void Ditherbox::processDoubleReplacing(double **inputs, double **outputs, VstInt
//TPDF dither
break;
- case 4:
+ case 4:
+ currentDitherL = (rand()/(double)RAND_MAX);
+ inputSampleL += currentDitherL;
+ inputSampleL -= lastSampleL;
+ inputSampleL = floor(inputSampleL);
+ lastSampleL = currentDitherL;
+ currentDitherR = (rand()/(double)RAND_MAX);
+ inputSampleR += currentDitherR;
+ inputSampleR -= lastSampleR;
+ inputSampleR = floor(inputSampleR);
+ lastSampleR = currentDitherR;
+ //Paul dither
+ break;
+
+ case 5:
+ nsL[9] = nsL[8]; nsL[8] = nsL[7]; nsL[7] = nsL[6]; nsL[6] = nsL[5];
+ nsL[5] = nsL[4]; nsL[4] = nsL[3]; nsL[3] = nsL[2]; nsL[2] = nsL[1];
+ nsL[1] = nsL[0]; nsL[0] = (rand()/(double)RAND_MAX);
+
+ currentDitherL = (nsL[0] * 0.061);
+ currentDitherL -= (nsL[1] * 0.11);
+ currentDitherL += (nsL[8] * 0.126);
+ currentDitherL -= (nsL[7] * 0.23);
+ currentDitherL += (nsL[2] * 0.25);
+ currentDitherL -= (nsL[3] * 0.43);
+ currentDitherL += (nsL[6] * 0.5);
+ currentDitherL -= nsL[5];
+ currentDitherL += nsL[4];
+ //this sounds different from doing it in order of sample position
+ //cumulative tiny errors seem to build up even at this buss depth
+ //considerably more pronounced at 32 bit float.
+ //Therefore we add the most significant components LAST.
+ //trying to keep values on like exponents of the floating point value.
+ inputSampleL += currentDitherL;
+
+ inputSampleL = floor(inputSampleL);
+ //done with L
+
+ nsR[9] = nsR[8]; nsR[8] = nsR[7]; nsR[7] = nsR[6]; nsR[6] = nsR[5];
+ nsR[5] = nsR[4]; nsR[4] = nsR[3]; nsR[3] = nsR[2]; nsR[2] = nsR[1];
+ nsR[1] = nsR[0]; nsR[0] = (rand()/(double)RAND_MAX);
+
+ currentDitherR = (nsR[0] * 0.061);
+ currentDitherR -= (nsR[1] * 0.11);
+ currentDitherR += (nsR[8] * 0.126);
+ currentDitherR -= (nsR[7] * 0.23);
+ currentDitherR += (nsR[2] * 0.25);
+ currentDitherR -= (nsR[3] * 0.43);
+ currentDitherR += (nsR[6] * 0.5);
+ currentDitherR -= nsR[5];
+ currentDitherR += nsR[4];
+ //this sounds different from doing it in order of sample position
+ //cumulative tiny errors seem to build up even at this buss depth
+ //considerably more pronounced at 32 bit float.
+ //Therefore we add the most significant components LAST.
+ //trying to keep values on like exponents of the floating point value.
+ inputSampleR += currentDitherR;
+
+ inputSampleR = floor(inputSampleR);
+ //done with R
+ //DoublePaul dither
+ break;
+
+ case 6:
+ currentDitherL = (rand()/(double)RAND_MAX);
+ currentDitherR = (rand()/(double)RAND_MAX);
+
+ inputSampleL += currentDitherL;
+ inputSampleR += currentDitherR;
+ inputSampleL -= nsL[4];
+ inputSampleR -= nsR[4];
+
+ inputSampleL = floor(inputSampleL);
+ inputSampleR = floor(inputSampleR);
+
+ nsL[4] = nsL[3];
+ nsL[3] = nsL[2];
+ nsL[2] = nsL[1];
+ nsL[1] = currentDitherL;
+
+ nsR[4] = nsR[3];
+ nsR[3] = nsR[2];
+ nsR[2] = nsR[1];
+ nsR[1] = currentDitherR;
+ //Tape dither
+ break;
+
+ case 7:
Position += 1;
//Note- uses integer overflow as a 'mod' operator
hotbinA = Position * Position;
@@ -990,7 +1241,7 @@ void Ditherbox::processDoubleReplacing(double **inputs, double **outputs, VstInt
//Quadratic dither
break;
- case 5:
+ case 8:
absSample = ((rand()/(double)RAND_MAX) - 0.5);
nsL[0] += absSample; nsL[0] /= 2; absSample -= nsL[0];
absSample += ((rand()/(double)RAND_MAX) - 0.5);
@@ -1085,7 +1336,7 @@ void Ditherbox::processDoubleReplacing(double **inputs, double **outputs, VstInt
//TenNines dither R
break;
- case 6:
+ case 9:
if (inputSampleL > 0) inputSampleL += 0.383;
if (inputSampleL < 0) inputSampleL -= 0.383;
if (inputSampleR > 0) inputSampleR += 0.383;
@@ -1125,7 +1376,7 @@ void Ditherbox::processDoubleReplacing(double **inputs, double **outputs, VstInt
//and does a teeny parallel-compression thing when almost at digital black.
break;
- case 7: //this one is the original Naturalize
+ case 10: //this one is the original Naturalize
if (inputSampleL > 0) inputSampleL += (0.3333333333);
if (inputSampleL < 0) inputSampleL -= (0.3333333333);
inputSampleL += (rand()/(double)RAND_MAX)*0.6666666666;
@@ -1285,7 +1536,7 @@ void Ditherbox::processDoubleReplacing(double **inputs, double **outputs, VstInt
//end R
break;
- case 8: //this one is the Not Just Another Dither
+ case 11: //this one is the Not Just Another Dither
//begin L
benfordize = floor(inputSampleL);
@@ -1450,7 +1701,7 @@ void Ditherbox::processDoubleReplacing(double **inputs, double **outputs, VstInt
//end R
break;
- case 9:
+ case 12:
//slew only
outputSampleL = (inputSampleL - lastSampleL)*trim;
outputSampleR = (inputSampleR - lastSampleR)*trim;
@@ -1464,7 +1715,7 @@ void Ditherbox::processDoubleReplacing(double **inputs, double **outputs, VstInt
inputSampleR = outputSampleR;
break;
- case 10:
+ case 13:
//subs only
gain = gaintarget;
@@ -1680,7 +1931,7 @@ void Ditherbox::processDoubleReplacing(double **inputs, double **outputs, VstInt
if (inputSampleR < -1.0) inputSampleR = -1.0;
break;
- case 11:
+ case 14:
//silhouette
//begin L
bridgerectifier = fabs(inputSampleL)*1.57079633;
diff --git a/plugins/MacAU/Distance2/Ditherbox/Ditherbox.cpp b/plugins/MacAU/Distance2/Ditherbox/Ditherbox.cpp
new file mode 100755
index 0000000..a4b1edf
--- /dev/null
+++ b/plugins/MacAU/Distance2/Ditherbox/Ditherbox.cpp
@@ -0,0 +1,832 @@
+/*
+* File: Ditherbox.cpp
+*
+* Version: 1.0
+*
+* Created: 1/1/09
+*
+* Copyright: Copyright © 2009 Airwindows, All Rights Reserved
+*
+* Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. ("Apple") in
+* consideration of your agreement to the following terms, and your use, installation, modification
+* or redistribution of this Apple software constitutes acceptance of these terms. If you do
+* not agree with these terms, please do not use, install, modify or redistribute this Apple
+* software.
+*
+* In consideration of your agreement to abide by the following terms, and subject to these terms,
+* Apple grants you a personal, non-exclusive license, under Apple's copyrights in this
+* original Apple software (the "Apple Software"), to use, reproduce, modify and redistribute the
+* Apple Software, with or without modifications, in source and/or binary forms; provided that if you
+* redistribute the Apple Software in its entirety and without modifications, you must retain this
+* notice and the following text and disclaimers in all such redistributions of the Apple Software.
+* Neither the name, trademarks, service marks or logos of Apple Computer, Inc. may be used to
+* endorse or promote products derived from the Apple Software without specific prior written
+* permission from Apple. Except as expressly stated in this notice, no other rights or
+* licenses, express or implied, are granted by Apple herein, including but not limited to any
+* patent rights that may be infringed by your derivative works or by other works in which the
+* Apple Software may be incorporated.
+*
+* The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO WARRANTIES, EXPRESS OR
+* IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY
+* AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE
+* OR IN COMBINATION WITH YOUR PRODUCTS.
+*
+* IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR CONSEQUENTIAL
+* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE,
+* REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER
+* UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN
+* IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*
+*/
+/*=============================================================================
+ Ditherbox.h
+
+=============================================================================*/
+#include "Ditherbox.h"
+
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+COMPONENT_ENTRY(Ditherbox)
+
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Ditherbox::Ditherbox
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Ditherbox::Ditherbox(AudioUnit component)
+ : AUEffectBase(component)
+{
+ CreateElements();
+ Globals()->UseIndexedParameters(kNumberOfParameters);
+ SetParameter(kParam_One, kDefaultValue_ParamOne );
+
+#if AU_DEBUG_DISPATCHER
+ mDebugDispatcher = new AUDebugDispatcher (this);
+#endif
+
+}
+
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Ditherbox::GetParameterValueStrings
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ComponentResult Ditherbox::GetParameterValueStrings(AudioUnitScope inScope,
+ AudioUnitParameterID inParameterID,
+ CFArrayRef * outStrings)
+{
+ if ((inScope == kAudioUnitScope_Global) && (inParameterID == kParam_One)) //ID must be actual name of parameter identifier, not number
+ {
+ if (outStrings == NULL) return noErr;
+ CFStringRef strings [] =
+ {
+ kMenuItem_Truncate,
+ kMenuItem_Flat,
+ kMenuItem_TPDF,
+ kMenuItem_Paul,
+ kMenuItem_DoublePaul,
+ kMenuItem_Tape,
+ kMenuItem_Quadratic,
+ kMenuItem_TenNines,
+ kMenuItem_Contingent,
+ kMenuItem_Naturalize,
+ kMenuItem_NJAD,
+ kMenuItem_TruncateHR,
+ kMenuItem_FlatHR,
+ kMenuItem_TPDFHR,
+ kMenuItem_PaulHR,
+ kMenuItem_DoublePaulHR,
+ kMenuItem_TapeHR,
+ kMenuItem_QuadraticHR,
+ kMenuItem_TenNinesHR,
+ kMenuItem_ContingentHR,
+ kMenuItem_NaturalizeHR,
+ kMenuItem_NJADHR,
+ kMenuItem_SlewOnly,
+ kMenuItem_SubsOnly,
+ kMenuItem_Silhouette,
+ };
+ *outStrings = CFArrayCreate (
+ NULL,
+ (const void **) strings,
+ (sizeof (strings) / sizeof (strings [0])),
+ NULL
+ );
+ return noErr;
+ }
+ return kAudioUnitErr_InvalidProperty;
+}
+
+
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Ditherbox::GetParameterInfo
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ComponentResult Ditherbox::GetParameterInfo(AudioUnitScope inScope,
+ AudioUnitParameterID inParameterID,
+ AudioUnitParameterInfo &outParameterInfo )
+{
+ ComponentResult result = noErr;
+
+ outParameterInfo.flags = kAudioUnitParameterFlag_IsWritable
+ | kAudioUnitParameterFlag_IsReadable;
+
+ if (inScope == kAudioUnitScope_Global) {
+ switch(inParameterID)
+ {
+ case kParam_One:
+ AUBase::FillInParameterName (outParameterInfo, kParameterOneName, false);
+ outParameterInfo.unit = kAudioUnitParameterUnit_Indexed;
+ outParameterInfo.minValue = kTruncate;
+ outParameterInfo.maxValue = kSilhouette;
+ outParameterInfo.defaultValue = kDefaultValue_ParamOne;
+ break;
+ default:
+ result = kAudioUnitErr_InvalidParameter;
+ break;
+ }
+ } else {
+ result = kAudioUnitErr_InvalidParameter;
+ }
+
+
+
+ return result;
+}
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Ditherbox::GetPropertyInfo
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ComponentResult Ditherbox::GetPropertyInfo (AudioUnitPropertyID inID,
+ AudioUnitScope inScope,
+ AudioUnitElement inElement,
+ UInt32 & outDataSize,
+ Boolean & outWritable)
+{
+ return AUEffectBase::GetPropertyInfo (inID, inScope, inElement, outDataSize, outWritable);
+}
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Ditherbox::GetProperty
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ComponentResult Ditherbox::GetProperty( AudioUnitPropertyID inID,
+ AudioUnitScope inScope,
+ AudioUnitElement inElement,
+ void * outData )
+{
+ return AUEffectBase::GetProperty (inID, inScope, inElement, outData);
+}
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Ditherbox::Initialize
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ComponentResult Ditherbox::Initialize()
+{
+ ComponentResult result = AUEffectBase::Initialize();
+ if (result == noErr)
+ Reset(kAudioUnitScope_Global, 0);
+ return result;
+}
+
+#pragma mark ____DitherboxEffectKernel
+
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Ditherbox::DitherboxKernel::Reset()
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+void Ditherbox::DitherboxKernel::Reset()
+{
+ Position = 99999999;
+ contingentErr = 0.0;
+ byn[0] = 1000;
+ byn[1] = 301;
+ byn[2] = 176;
+ byn[3] = 125;
+ byn[4] = 97;
+ byn[5] = 79;
+ byn[6] = 67;
+ byn[7] = 58;
+ byn[8] = 51;
+ byn[9] = 46;
+ byn[10] = 1000;
+ noiseShaping = 0.0;
+ NSOdd = 0.0;
+ NSEven = 0.0;
+ prev = 0.0;
+ ns[0] = 0;
+ ns[1] = 0;
+ ns[2] = 0;
+ ns[3] = 0;
+ ns[4] = 0;
+ ns[5] = 0;
+ ns[6] = 0;
+ ns[7] = 0;
+ ns[8] = 0;
+ ns[9] = 0;
+ ns[10] = 0;
+ ns[11] = 0;
+ ns[12] = 0;
+ ns[13] = 0;
+ ns[14] = 0;
+ ns[15] = 0;
+ lastSample = 0.0;
+ outSample = 0.0;
+ iirSampleA = 0.0;
+ iirSampleB = 0.0;
+ iirSampleC = 0.0;
+ iirSampleD = 0.0;
+ iirSampleE = 0.0;
+ iirSampleF = 0.0;
+ iirSampleG = 0.0;
+ iirSampleH = 0.0;
+ iirSampleI = 0.0;
+ iirSampleJ = 0.0;
+ iirSampleK = 0.0;
+ iirSampleL = 0.0;
+ iirSampleM = 0.0;
+ iirSampleN = 0.0;
+ iirSampleO = 0.0;
+ iirSampleP = 0.0;
+ iirSampleQ = 0.0;
+ iirSampleR = 0.0;
+ iirSampleS = 0.0;
+ iirSampleT = 0.0;
+ iirSampleU = 0.0;
+ iirSampleV = 0.0;
+ iirSampleW = 0.0;
+ iirSampleX = 0.0;
+ iirSampleY = 0.0;
+ iirSampleZ = 0.0;
+}
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Ditherbox::DitherboxKernel::Process
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+void Ditherbox::DitherboxKernel::Process( const Float32 *inSourceP,
+ Float32 *inDestP,
+ UInt32 inFramesToProcess,
+ UInt32 inNumChannels, // for version 2 AudioUnits inNumChannels is always 1
+ bool &ioSilence )
+{
+
+
+ UInt32 nSampleFrames = inFramesToProcess;
+ const Float32 *sourceP = inSourceP;
+ Float32 *destP = inDestP;
+ long double contingentRnd;
+ long double absSample;
+ long double contingent;
+ long double overallscale = 1.0;
+ overallscale /= 44100.0;
+ overallscale *= GetSampleRate();
+ long double iirAmount = 2250/44100.0;
+ long double gaintarget = 1.42;
+ long double gain;
+ iirAmount /= overallscale;
+ long double altAmount = 1.0 - iirAmount;
+ long double inputSample;
+ long double outputSample;
+ long double silhouette;
+ long double smoother;
+ long double bridgerectifier;
+ long double benfordize;
+ int hotbinA;
+ int hotbinB;
+ long double totalA;
+ long double totalB;
+ long double randyConstant = 1.61803398874989484820458683436563811772030917980576;
+ long double omegaConstant = 0.56714329040978387299996866221035554975381578718651;
+ long double expConstant = 0.06598803584531253707679018759684642493857704825279;
+ long double trim = 2.302585092994045684017991; //natural logarithm of 10
+ int dtype = (int) GetParameter( kParam_One ); // +1 for Reaper bug workaround
+ bool highRes = false;
+ bool dithering = true;
+
+ Float32 drySample; //should be the same as what the native DAW buss is
+
+ if (dtype > 11){highRes = true; dtype -= 11;}
+
+ if (dtype > 11){dithering = false; highRes = false;}
+ //follow up by switching high res back off for the monitoring
+
+ while (nSampleFrames-- > 0) {
+ inputSample = *sourceP;
+ if (inputSample<1.2e-38 && -inputSample<1.2e-38) {
+ static int noisesource = 0;
+ //this declares a variable before anything else is compiled. It won't keep assigning
+ //it to 0 for every sample, it's as if the declaration doesn't exist in this context,
+ //but it lets me add this denormalization fix in a single place rather than updating
+ //it in three different locations. The variable isn't thread-safe but this is only
+ //a random seed and we can share it with whatever.
+ noisesource = noisesource % 1700021; noisesource++;
+ int residue = noisesource * noisesource;
+ residue = residue % 170003; residue *= residue;
+ residue = residue % 17011; residue *= residue;
+ residue = residue % 1709; residue *= residue;
+ residue = residue % 173; residue *= residue;
+ residue = residue % 17;
+ double applyresidue = residue;
+ applyresidue *= 0.00000001;
+ applyresidue *= 0.00000001;
+ inputSample = applyresidue;
+ //this denormalization routine produces a white noise at -300 dB which the noise
+ //shaping will interact with to produce a bipolar output, but the noise is actually
+ //all positive. That should stop any variables from going denormal, and the routine
+ //only kicks in if digital black is input. As a final touch, if you save to 24-bit
+ //the silence will return to being digital black again.
+ }
+ drySample = inputSample;
+
+ sourceP += inNumChannels;
+
+ if (dtype == 8) inputSample -= noiseShaping;
+
+ if (dithering) inputSample *= 32768.0;
+ //denormalizing as way of controlling insane detail boosting
+ if (highRes) inputSample *= 256.0; //256 for 16/24 version
+
+ switch (dtype)
+ {
+ case 1:
+ inputSample = floor(inputSample);
+ //truncate
+ break;
+
+ case 2:
+ inputSample += (rand()/(double)RAND_MAX);
+ inputSample -= 0.5;
+ inputSample = floor(inputSample);
+ //flat dither
+ break;
+
+ case 3:
+ inputSample += (rand()/(double)RAND_MAX);
+ inputSample += (rand()/(double)RAND_MAX);
+ inputSample -= 1.0;
+ inputSample = floor(inputSample);
+ //TPDF dither
+ break;
+
+ case 4:
+ currentDither = (rand()/(double)RAND_MAX);
+ inputSample += currentDither;
+ inputSample -= lastSample;
+ inputSample = floor(inputSample);
+ lastSample = currentDither;
+ //Paul dither
+ break;
+
+ case 5:
+ ns[9] = ns[8]; ns[8] = ns[7]; ns[7] = ns[6]; ns[6] = ns[5];
+ ns[5] = ns[4]; ns[4] = ns[3]; ns[3] = ns[2]; ns[2] = ns[1];
+ ns[1] = ns[0]; ns[0] = (rand()/(double)RAND_MAX);
+
+ currentDither = (ns[0] * 0.061);
+ currentDither -= (ns[1] * 0.11);
+ currentDither += (ns[8] * 0.126);
+ currentDither -= (ns[7] * 0.23);
+ currentDither += (ns[2] * 0.25);
+ currentDither -= (ns[3] * 0.43);
+ currentDither += (ns[6] * 0.5);
+ currentDither -= ns[5];
+ currentDither += ns[4];
+ //this sounds different from doing it in order of sample position
+ //cumulative tiny errors seem to build up even at this buss depth
+ //considerably more pronounced at 32 bit float.
+ //Therefore we add the most significant components LAST.
+ //trying to keep values on like exponents of the floating point value.
+ inputSample += currentDither;
+
+ inputSample = floor(inputSample);
+ //DoublePaul dither
+ break;
+
+ case 6:
+ currentDither = (rand()/(double)RAND_MAX);
+ inputSample += currentDither;
+ inputSample -= ns[4];
+ inputSample = floor(inputSample);
+ ns[4] = ns[3];
+ ns[3] = ns[2];
+ ns[2] = ns[1];
+ ns[1] = currentDither;
+ //Tape dither
+ break;
+
+
+ case 7:
+ Position += 1;
+ //Note- uses integer overflow as a 'mod' operator
+ hotbinA = Position * Position;
+ hotbinA = hotbinA % 170003; //% is C++ mod operator
+ hotbinA *= hotbinA;
+ hotbinA = hotbinA % 17011; //% is C++ mod operator
+ hotbinA *= hotbinA;
+ hotbinA = hotbinA % 1709; //% is C++ mod operator
+ hotbinA *= hotbinA;
+ hotbinA = hotbinA % 173; //% is C++ mod operator
+ hotbinA *= hotbinA;
+ hotbinA = hotbinA % 17;
+ hotbinA *= 0.0635;
+ if (flip) hotbinA = -hotbinA;
+ inputSample += hotbinA;
+ inputSample = floor(inputSample);
+ //Quadratic dither
+ break;
+
+ case 8:
+ absSample = ((rand()/(double)RAND_MAX) - 0.5);
+ ns[0] += absSample; ns[0] /= 2; absSample -= ns[0];
+ absSample += ((rand()/(double)RAND_MAX) - 0.5);
+ ns[1] += absSample; ns[1] /= 2; absSample -= ns[1];
+ absSample += ((rand()/(double)RAND_MAX) - 0.5);
+ ns[2] += absSample; ns[2] /= 2; absSample -= ns[2];
+ absSample += ((rand()/(double)RAND_MAX) - 0.5);
+ ns[3] += absSample; ns[3] /= 2; absSample -= ns[3];
+ absSample += ((rand()/(double)RAND_MAX) - 0.5);
+ ns[4] += absSample; ns[4] /= 2; absSample -= ns[4];
+ absSample += ((rand()/(double)RAND_MAX) - 0.5);
+ ns[5] += absSample; ns[5] /= 2; absSample -= ns[5];
+ absSample += ((rand()/(double)RAND_MAX) - 0.5);
+ ns[6] += absSample; ns[6] /= 2; absSample -= ns[6];
+ absSample += ((rand()/(double)RAND_MAX) - 0.5);
+ ns[7] += absSample; ns[7] /= 2; absSample -= ns[7];
+ absSample += ((rand()/(double)RAND_MAX) - 0.5);
+ ns[8] += absSample; ns[8] /= 2; absSample -= ns[8];
+ absSample += ((rand()/(double)RAND_MAX) - 0.5);
+ ns[9] += absSample; ns[9] /= 2; absSample -= ns[9];
+ absSample += ((rand()/(double)RAND_MAX) - 0.5);
+ ns[10] += absSample; ns[10] /= 2; absSample -= ns[10];
+ absSample += ((rand()/(double)RAND_MAX) - 0.5);
+ ns[11] += absSample; ns[11] /= 2; absSample -= ns[11];
+ absSample += ((rand()/(double)RAND_MAX) - 0.5);
+ ns[12] += absSample; ns[12] /= 2; absSample -= ns[12];
+ absSample += ((rand()/(double)RAND_MAX) - 0.5);
+ ns[13] += absSample; ns[13] /= 2; absSample -= ns[13];
+ absSample += ((rand()/(double)RAND_MAX) - 0.5);
+ ns[14] += absSample; ns[14] /= 2; absSample -= ns[14];
+ absSample += ((rand()/(double)RAND_MAX) - 0.5);
+ ns[15] += absSample; ns[15] /= 2; absSample -= ns[15];
+ //install noise and then shape it
+ absSample += inputSample;
+
+ //NSOdd /= 1.0001; //NSDensity
+
+ if (NSOdd > 0) NSOdd -= 0.97;
+ if (NSOdd < 0) NSOdd += 0.97;
+
+ NSOdd -= (NSOdd * NSOdd * NSOdd * 0.475);
+
+ NSOdd += prev;
+ absSample += (NSOdd*0.475);
+ prev = floor(absSample) - inputSample;
+ inputSample = floor(absSample);
+ //TenNines dither
+ break;
+
+ case 9:
+ if (inputSample > 0) inputSample += 0.383;
+ if (inputSample < 0) inputSample -= 0.383;
+ //adjusting to permit more information drug outta the noisefloor
+ contingentRnd = (((rand()/(double)RAND_MAX)+(rand()/(double)RAND_MAX))-1.0) * randyConstant; //produce TPDF dist, scale
+ contingentRnd -= contingentErr*omegaConstant; //include err
+ absSample = fabs(inputSample);
+ contingentErr = absSample - floor(absSample); //get next err
+ contingent = contingentErr * 2.0; //scale of quantization levels
+ if (contingent > 1.0) contingent = ((-contingent+2.0)*omegaConstant) + expConstant;
+ else contingent = (contingent * omegaConstant) + expConstant;
+ //zero is next to a quantization level, one is exactly between them
+ if (flip) contingentRnd = (contingentRnd * (1.0-contingent)) + contingent + 0.5;
+ else contingentRnd = (contingentRnd * (1.0-contingent)) - contingent + 0.5;
+ inputSample += (contingentRnd * contingent);
+ //Contingent Dither
+ inputSample = floor(inputSample);
+ //note: this does not dither for values exactly the same as 16 bit values-
+ //which forces the dither to gate at 0.0. It goes to digital black,
+ //and does a teeny parallel-compression thing when almost at digital black.
+ break;
+
+ case 10:
+ if (inputSample > 0) inputSample += (0.3333333333);
+ if (inputSample < 0) inputSample -= (0.3333333333);
+
+ inputSample += (rand()/(double)RAND_MAX)*0.6666666666;
+
+ benfordize = floor(inputSample);
+ while (benfordize >= 1.0) {benfordize /= 10;}
+ if (benfordize < 1.0) {benfordize *= 10;}
+ if (benfordize < 1.0) {benfordize *= 10;}
+ hotbinA = floor(benfordize);
+ //hotbin becomes the Benford bin value for this number floored
+ totalA = 0;
+ if ((hotbinA > 0) && (hotbinA < 10))
+ {
+ byn[hotbinA] += 1;
+ totalA += (301-byn[1]);
+ totalA += (176-byn[2]);
+ totalA += (125-byn[3]);
+ totalA += (97-byn[4]);
+ totalA += (79-byn[5]);
+ totalA += (67-byn[6]);
+ totalA += (58-byn[7]);
+ totalA += (51-byn[8]);
+ totalA += (46-byn[9]);
+ byn[hotbinA] -= 1;
+ } else {hotbinA = 10;}
+ //produce total number- smaller is closer to Benford real
+
+ benfordize = ceil(inputSample);
+ while (benfordize >= 1.0) {benfordize /= 10;}
+ if (benfordize < 1.0) {benfordize *= 10;}
+ if (benfordize < 1.0) {benfordize *= 10;}
+ hotbinB = floor(benfordize);
+ //hotbin becomes the Benford bin value for this number ceiled
+ totalB = 0;
+ if ((hotbinB > 0) && (hotbinB < 10))
+ {
+ byn[hotbinB] += 1;
+ totalB += (301-byn[1]);
+ totalB += (176-byn[2]);
+ totalB += (125-byn[3]);
+ totalB += (97-byn[4]);
+ totalB += (79-byn[5]);
+ totalB += (67-byn[6]);
+ totalB += (58-byn[7]);
+ totalB += (51-byn[8]);
+ totalB += (46-byn[9]);
+ byn[hotbinB] -= 1;
+ } else {hotbinB = 10;}
+ //produce total number- smaller is closer to Benford real
+
+ if (totalA < totalB)
+ {
+ byn[hotbinA] += 1;
+ inputSample = floor(inputSample);
+ }
+ else
+ {
+ byn[hotbinB] += 1;
+ inputSample = ceil(inputSample);
+ }
+ //assign the relevant one to the delay line
+ //and floor/ceil signal accordingly
+
+ totalA = byn[1] + byn[2] + byn[3] + byn[4] + byn[5] + byn[6] + byn[7] + byn[8] + byn[9];
+ totalA /= 1000;
+ if (totalA = 0) totalA = 1;
+ byn[1] /= totalA;
+ byn[2] /= totalA;
+ byn[3] /= totalA;
+ byn[4] /= totalA;
+ byn[5] /= totalA;
+ byn[6] /= totalA;
+ byn[7] /= totalA;
+ byn[8] /= totalA;
+ byn[9] /= totalA;
+ byn[10] /= 2; //catchall for garbage data
+ break;
+
+ case 11: //this one is the Not Just Another Dither
+
+ benfordize = floor(inputSample);
+ while (benfordize >= 1.0) {benfordize /= 10;}
+ if (benfordize < 1.0) {benfordize *= 10;}
+ if (benfordize < 1.0) {benfordize *= 10;}
+ if (benfordize < 1.0) {benfordize *= 10;}
+ if (benfordize < 1.0) {benfordize *= 10;}
+ if (benfordize < 1.0) {benfordize *= 10;}
+ hotbinA = floor(benfordize);
+ //hotbin becomes the Benford bin value for this number floored
+ totalA = 0;
+ if ((hotbinA > 0) && (hotbinA < 10))
+ {
+ byn[hotbinA] += 1;
+ totalA += (301-byn[1]);
+ totalA += (176-byn[2]);
+ totalA += (125-byn[3]);
+ totalA += (97-byn[4]);
+ totalA += (79-byn[5]);
+ totalA += (67-byn[6]);
+ totalA += (58-byn[7]);
+ totalA += (51-byn[8]);
+ totalA += (46-byn[9]);
+ byn[hotbinA] -= 1;
+ } else {hotbinA = 10;}
+ //produce total number- smaller is closer to Benford real
+
+ benfordize = ceil(inputSample);
+ while (benfordize >= 1.0) {benfordize /= 10;}
+ if (benfordize < 1.0) {benfordize *= 10;}
+ if (benfordize < 1.0) {benfordize *= 10;}
+ if (benfordize < 1.0) {benfordize *= 10;}
+ if (benfordize < 1.0) {benfordize *= 10;}
+ if (benfordize < 1.0) {benfordize *= 10;}
+ hotbinB = floor(benfordize);
+ //hotbin becomes the Benford bin value for this number ceiled
+ totalB = 0;
+ if ((hotbinB > 0) && (hotbinB < 10))
+ {
+ byn[hotbinB] += 1;
+ totalB += (301-byn[1]);
+ totalB += (176-byn[2]);
+ totalB += (125-byn[3]);
+ totalB += (97-byn[4]);
+ totalB += (79-byn[5]);
+ totalB += (67-byn[6]);
+ totalB += (58-byn[7]);
+ totalB += (51-byn[8]);
+ totalB += (46-byn[9]);
+ byn[hotbinB] -= 1;
+ } else {hotbinB = 10;}
+ //produce total number- smaller is closer to Benford real
+
+ if (totalA < totalB)
+ {
+ byn[hotbinA] += 1;
+ inputSample = floor(inputSample);
+ }
+ else
+ {
+ byn[hotbinB] += 1;
+ inputSample = ceil(inputSample);
+ }
+ //assign the relevant one to the delay line
+ //and floor/ceil signal accordingly
+
+ totalA = byn[1] + byn[2] + byn[3] + byn[4] + byn[5] + byn[6] + byn[7] + byn[8] + byn[9];
+ totalA /= 1000;
+ if (totalA = 0) totalA = 1;
+ byn[1] /= totalA;
+ byn[2] /= totalA;
+ byn[3] /= totalA;
+ byn[4] /= totalA;
+ byn[5] /= totalA;
+ byn[6] /= totalA;
+ byn[7] /= totalA;
+ byn[8] /= totalA;
+ byn[9] /= totalA;
+ byn[10] /= 2; //catchall for garbage data
+ break;
+
+ case 12:
+ //slew only
+ outputSample = (inputSample - lastSample)*trim;
+ lastSample = inputSample;
+ if (outputSample > 1.0) outputSample = 1.0;
+ if (outputSample < -1.0) outputSample = -1.0;
+ inputSample = outputSample;
+ break;
+
+ case 13:
+ //subs only
+ gain = gaintarget;
+ inputSample *= gain; gain = ((gain-1)*0.75)+1;
+ iirSampleA = (iirSampleA * altAmount) + (inputSample * iirAmount); inputSample = iirSampleA;
+ inputSample *= gain; gain = ((gain-1)*0.75)+1;
+ if (inputSample > 1.0) inputSample = 1.0;
+ if (inputSample < -1.0) inputSample = -1.0;
+ iirSampleB = (iirSampleB * altAmount) + (inputSample * iirAmount); inputSample = iirSampleB;
+ inputSample *= gain; gain = ((gain-1)*0.75)+1;
+ if (inputSample > 1.0) inputSample = 1.0;
+ if (inputSample < -1.0) inputSample = -1.0;
+ iirSampleC = (iirSampleC * altAmount) + (inputSample * iirAmount); inputSample = iirSampleC;
+ inputSample *= gain; gain = ((gain-1)*0.75)+1;
+ if (inputSample > 1.0) inputSample = 1.0;
+ if (inputSample < -1.0) inputSample = -1.0;
+ iirSampleD = (iirSampleD * altAmount) + (inputSample * iirAmount); inputSample = iirSampleD;
+ inputSample *= gain; gain = ((gain-1)*0.75)+1;
+ if (inputSample > 1.0) inputSample = 1.0;
+ if (inputSample < -1.0) inputSample = -1.0;
+ iirSampleE = (iirSampleE * altAmount) + (inputSample * iirAmount); inputSample = iirSampleE;
+ inputSample *= gain; gain = ((gain-1)*0.75)+1;
+ if (inputSample > 1.0) inputSample = 1.0;
+ if (inputSample < -1.0) inputSample = -1.0;
+ iirSampleF = (iirSampleF * altAmount) + (inputSample * iirAmount); inputSample = iirSampleF;
+ inputSample *= gain; gain = ((gain-1)*0.75)+1;
+ if (inputSample > 1.0) inputSample = 1.0;
+ if (inputSample < -1.0) inputSample = -1.0;
+ iirSampleG = (iirSampleG * altAmount) + (inputSample * iirAmount); inputSample = iirSampleG;
+ inputSample *= gain; gain = ((gain-1)*0.75)+1;
+ if (inputSample > 1.0) inputSample = 1.0;
+ if (inputSample < -1.0) inputSample = -1.0;
+ iirSampleH = (iirSampleH * altAmount) + (inputSample * iirAmount); inputSample = iirSampleH;
+ inputSample *= gain; gain = ((gain-1)*0.75)+1;
+ if (inputSample > 1.0) inputSample = 1.0;
+ if (inputSample < -1.0) inputSample = -1.0;
+ iirSampleI = (iirSampleI * altAmount) + (inputSample * iirAmount); inputSample = iirSampleI;
+ inputSample *= gain; gain = ((gain-1)*0.75)+1;
+ if (inputSample > 1.0) inputSample = 1.0;
+ if (inputSample < -1.0) inputSample = -1.0;
+ iirSampleJ = (iirSampleJ * altAmount) + (inputSample * iirAmount); inputSample = iirSampleJ;
+ inputSample *= gain; gain = ((gain-1)*0.75)+1;
+ if (inputSample > 1.0) inputSample = 1.0;
+ if (inputSample < -1.0) inputSample = -1.0;
+ iirSampleK = (iirSampleK * altAmount) + (inputSample * iirAmount); inputSample = iirSampleK;
+ inputSample *= gain; gain = ((gain-1)*0.75)+1;
+ if (inputSample > 1.0) inputSample = 1.0;
+ if (inputSample < -1.0) inputSample = -1.0;
+ iirSampleL = (iirSampleL * altAmount) + (inputSample * iirAmount); inputSample = iirSampleL;
+ inputSample *= gain; gain = ((gain-1)*0.75)+1;
+ if (inputSample > 1.0) inputSample = 1.0;
+ if (inputSample < -1.0) inputSample = -1.0;
+ iirSampleM = (iirSampleM * altAmount) + (inputSample * iirAmount); inputSample = iirSampleM;
+ inputSample *= gain; gain = ((gain-1)*0.75)+1;
+ if (inputSample > 1.0) inputSample = 1.0;
+ if (inputSample < -1.0) inputSample = -1.0;
+ iirSampleN = (iirSampleN * altAmount) + (inputSample * iirAmount); inputSample = iirSampleN;
+ inputSample *= gain; gain = ((gain-1)*0.75)+1;
+ if (inputSample > 1.0) inputSample = 1.0;
+ if (inputSample < -1.0) inputSample = -1.0;
+ iirSampleO = (iirSampleO * altAmount) + (inputSample * iirAmount); inputSample = iirSampleO;
+ inputSample *= gain; gain = ((gain-1)*0.75)+1;
+ if (inputSample > 1.0) inputSample = 1.0;
+ if (inputSample < -1.0) inputSample = -1.0;
+ iirSampleP = (iirSampleP * altAmount) + (inputSample * iirAmount); inputSample = iirSampleP;
+ inputSample *= gain; gain = ((gain-1)*0.75)+1;
+ if (inputSample > 1.0) inputSample = 1.0;
+ if (inputSample < -1.0) inputSample = -1.0;
+ iirSampleQ = (iirSampleQ * altAmount) + (inputSample * iirAmount); inputSample = iirSampleQ;
+ inputSample *= gain; gain = ((gain-1)*0.75)+1;
+ if (inputSample > 1.0) inputSample = 1.0;
+ if (inputSample < -1.0) inputSample = -1.0;
+ iirSampleR = (iirSampleR * altAmount) + (inputSample * iirAmount); inputSample = iirSampleR;
+ inputSample *= gain; gain = ((gain-1)*0.75)+1;
+ if (inputSample > 1.0) inputSample = 1.0;
+ if (inputSample < -1.0) inputSample = -1.0;
+ iirSampleS = (iirSampleS * altAmount) + (inputSample * iirAmount); inputSample = iirSampleS;
+ inputSample *= gain; gain = ((gain-1)*0.75)+1;
+ if (inputSample > 1.0) inputSample = 1.0;
+ if (inputSample < -1.0) inputSample = -1.0;
+ iirSampleT = (iirSampleT * altAmount) + (inputSample * iirAmount); inputSample = iirSampleT;
+ inputSample *= gain; gain = ((gain-1)*0.75)+1;
+ if (inputSample > 1.0) inputSample = 1.0;
+ if (inputSample < -1.0) inputSample = -1.0;
+ iirSampleU = (iirSampleU * altAmount) + (inputSample * iirAmount); inputSample = iirSampleU;
+ inputSample *= gain; gain = ((gain-1)*0.75)+1;
+ if (inputSample > 1.0) inputSample = 1.0;
+ if (inputSample < -1.0) inputSample = -1.0;
+ iirSampleV = (iirSampleV * altAmount) + (inputSample * iirAmount); inputSample = iirSampleV;
+ inputSample *= gain; gain = ((gain-1)*0.75)+1;
+ if (inputSample > 1.0) inputSample = 1.0;
+ if (inputSample < -1.0) inputSample = -1.0;
+ iirSampleW = (iirSampleW * altAmount) + (inputSample * iirAmount); inputSample = iirSampleW;
+ inputSample *= gain; gain = ((gain-1)*0.75)+1;
+ if (inputSample > 1.0) inputSample = 1.0;
+ if (inputSample < -1.0) inputSample = -1.0;
+ iirSampleX = (iirSampleX * altAmount) + (inputSample * iirAmount); inputSample = iirSampleX;
+ inputSample *= gain; gain = ((gain-1)*0.75)+1;
+ if (inputSample > 1.0) inputSample = 1.0;
+ if (inputSample < -1.0) inputSample = -1.0;
+ iirSampleY = (iirSampleY * altAmount) + (inputSample * iirAmount); inputSample = iirSampleY;
+ inputSample *= gain; gain = ((gain-1)*0.75)+1;
+ if (inputSample > 1.0) inputSample = 1.0;
+ if (inputSample < -1.0) inputSample = -1.0;
+ iirSampleZ = (iirSampleZ * altAmount) + (inputSample * iirAmount); inputSample = iirSampleZ;
+ if (inputSample > 1.0) inputSample = 1.0;
+ if (inputSample < -1.0) inputSample = -1.0;
+ break;
+
+ case 14:
+ //silhouette
+ bridgerectifier = fabs(inputSample)*1.57079633;
+ if (bridgerectifier > 1.57079633) bridgerectifier = 1.57079633;
+ bridgerectifier = 1.0-cos(bridgerectifier);
+ if (inputSample > 0.0) inputSample = bridgerectifier;
+ else inputSample = -bridgerectifier;
+
+ silhouette = rand()/(double)RAND_MAX;
+ silhouette -= 0.5;
+ silhouette *= 2.0;
+ silhouette *= fabs(inputSample);
+
+ smoother = rand()/(double)RAND_MAX;
+ smoother -= 0.5;
+ smoother *= 2.0;
+ smoother *= fabs(lastSample);
+ lastSample = inputSample;
+
+ silhouette += smoother;
+
+ bridgerectifier = fabs(silhouette)*1.57079633;
+ if (bridgerectifier > 1.57079633) bridgerectifier = 1.57079633;
+ bridgerectifier = sin(bridgerectifier);
+ if (silhouette > 0.0) silhouette = bridgerectifier;
+ else silhouette = -bridgerectifier;
+
+ inputSample = (silhouette + outSample) / 2.0;
+ outSample = silhouette;
+ break;
+ }
+
+ flip = !flip;
+ //several dithers use this
+ if (highRes) inputSample /= 256.0; //256 for 16/24 version
+ if (dithering) inputSample /= 32768.0;
+
+ if (dtype == 8) noiseShaping += inputSample - drySample;
+
+ *destP = inputSample;
+ destP += inNumChannels;
+ }
+}
+
diff --git a/plugins/MacAU/Distance2/Ditherbox/Ditherbox.exp b/plugins/MacAU/Distance2/Ditherbox/Ditherbox.exp
new file mode 100755
index 0000000..f717bb8
--- /dev/null
+++ b/plugins/MacAU/Distance2/Ditherbox/Ditherbox.exp
@@ -0,0 +1 @@
+_DitherboxEntry
diff --git a/plugins/MacAU/Distance2/Ditherbox/Ditherbox.h b/plugins/MacAU/Distance2/Ditherbox/Ditherbox.h
new file mode 100755
index 0000000..1e22c4d
--- /dev/null
+++ b/plugins/MacAU/Distance2/Ditherbox/Ditherbox.h
@@ -0,0 +1,224 @@
+/*
+* File: Ditherbox.h
+*
+* Version: 1.0
+*
+* Created: 1/1/09
+*
+* Copyright: Copyright © 2009 Airwindows, All Rights Reserved
+*
+* Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. ("Apple") in
+* consideration of your agreement to the following terms, and your use, installation, modification
+* or redistribution of this Apple software constitutes acceptance of these terms. If you do
+* not agree with these terms, please do not use, install, modify or redistribute this Apple
+* software.
+*
+* In consideration of your agreement to abide by the following terms, and subject to these terms,
+* Apple grants you a personal, non-exclusive license, under Apple's copyrights in this
+* original Apple software (the "Apple Software"), to use, reproduce, modify and redistribute the
+* Apple Software, with or without modifications, in source and/or binary forms; provided that if you
+* redistribute the Apple Software in its entirety and without modifications, you must retain this
+* notice and the following text and disclaimers in all such redistributions of the Apple Software.
+* Neither the name, trademarks, service marks or logos of Apple Computer, Inc. may be used to
+* endorse or promote products derived from the Apple Software without specific prior written
+* permission from Apple. Except as expressly stated in this notice, no other rights or
+* licenses, express or implied, are granted by Apple herein, including but not limited to any
+* patent rights that may be infringed by your derivative works or by other works in which the
+* Apple Software may be incorporated.
+*
+* The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO WARRANTIES, EXPRESS OR
+* IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY
+* AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE
+* OR IN COMBINATION WITH YOUR PRODUCTS.
+*
+* IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR CONSEQUENTIAL
+* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE,
+* REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER
+* UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN
+* IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*
+*/
+#include "AUEffectBase.h"
+#include "DitherboxVersion.h"
+
+#if AU_DEBUG_DISPATCHER
+ #include "AUDebugDispatcher.h"
+#endif
+
+
+#ifndef __Ditherbox_h__
+#define __Ditherbox_h__
+
+
+#pragma mark ____Ditherbox Parameters
+
+// parameters
+static CFStringRef kParameterOneName = CFSTR("Dither Type");
+static const int kTruncate = 1;
+static const int kFlat = 2;
+static const int kTPDF = 3;
+static const int kPaul = 4;
+static const int kDoublePaul = 5;
+static const int kTape = 6;
+static const int kQuadratic = 7;
+static const int kTenNines = 8;
+static const int kContingent = 9;
+static const int kNaturalize = 10;
+static const int kNJAD = 11;
+static const int kTruncateHR = 12;
+static const int kFlatHR = 13;
+static const int kTPDFHR = 14;
+static const int kPaulHR = 15;
+static const int kDoublePaulHR = 16;
+static const int kTapeHR = 17;
+static const int kQuadraticHR = 18;
+static const int kTenNinesHR = 19;
+static const int kContingentHR = 20;
+static const int kNaturalizeHR = 21;
+static const int kNJADHR = 22;
+static const int kSlewOnly = 23;
+static const int kSubsOnly = 24;
+static const int kSilhouette = 25;
+static const int kDefaultValue_ParamOne = 22;
+
+
+static CFStringRef kMenuItem_Truncate = CFSTR ("16 Bit Truncation");
+static CFStringRef kMenuItem_Flat = CFSTR ("16 bit Flat Dither");
+static CFStringRef kMenuItem_TPDF = CFSTR ("16 bit TPDF Dither");
+static CFStringRef kMenuItem_Paul = CFSTR ("16 bit Paul Dither");
+static CFStringRef kMenuItem_DoublePaul = CFSTR ("16 bit DoublePaul Dither");
+static CFStringRef kMenuItem_Tape = CFSTR ("16 bit Tape Dither");
+static CFStringRef kMenuItem_Quadratic = CFSTR ("16 bit High Gloss Dither");
+static CFStringRef kMenuItem_TenNines = CFSTR ("16 bit Vinyl Dither");
+static CFStringRef kMenuItem_Contingent = CFSTR ("16 bit Spatialize Dither");
+static CFStringRef kMenuItem_Naturalize = CFSTR ("16 bit Naturalize Dither");
+static CFStringRef kMenuItem_NJAD = CFSTR ("16 bit Not Just Another Dither");
+static CFStringRef kMenuItem_TruncateHR = CFSTR ("24 bit Truncation");
+static CFStringRef kMenuItem_FlatHR = CFSTR ("24 bit Flat Dither");
+static CFStringRef kMenuItem_TPDFHR = CFSTR ("24 bit TPDF Dither");
+static CFStringRef kMenuItem_PaulHR = CFSTR ("24 bit Paul Dither");
+static CFStringRef kMenuItem_DoublePaulHR = CFSTR ("24 bit DoublePaul Dither");
+static CFStringRef kMenuItem_TapeHR = CFSTR ("24 bit Tape Dither");
+static CFStringRef kMenuItem_QuadraticHR = CFSTR ("24 bit High Gloss Dither");
+static CFStringRef kMenuItem_TenNinesHR = CFSTR ("24 bit Vinyl Dither");
+static CFStringRef kMenuItem_ContingentHR = CFSTR ("24 bit Spatialize Dither");
+static CFStringRef kMenuItem_NaturalizeHR = CFSTR ("24 bit Naturalize Dither");
+static CFStringRef kMenuItem_NJADHR = CFSTR ("24 bit Not Just Another Dither");
+static CFStringRef kMenuItem_SlewOnly = CFSTR ("Slew Only Monitoring");
+static CFStringRef kMenuItem_SubsOnly = CFSTR ("Subs Only Monitoring");
+static CFStringRef kMenuItem_Silhouette = CFSTR ("Noise Silhouette Monitoring");
+
+
+enum {
+ kParam_One = 0,
+ //Add your parameters here...
+ kNumberOfParameters=1
+};
+
+#pragma mark ____Ditherbox
+class Ditherbox : public AUEffectBase
+{
+public:
+ Ditherbox(AudioUnit component);
+#if AU_DEBUG_DISPATCHER
+ virtual ~Ditherbox () { delete mDebugDispatcher; }
+#endif
+
+ virtual AUKernelBase * NewKernel() { return new DitherboxKernel(this); }
+
+ virtual ComponentResult GetParameterValueStrings(AudioUnitScope inScope,
+ AudioUnitParameterID inParameterID,
+ CFArrayRef * outStrings);
+
+ virtual ComponentResult GetParameterInfo(AudioUnitScope inScope,
+ AudioUnitParameterID inParameterID,
+ AudioUnitParameterInfo &outParameterInfo);
+
+ virtual ComponentResult GetPropertyInfo(AudioUnitPropertyID inID,
+ AudioUnitScope inScope,
+ AudioUnitElement inElement,
+ UInt32 & outDataSize,
+ Boolean & outWritable );
+
+ virtual ComponentResult GetProperty(AudioUnitPropertyID inID,
+ AudioUnitScope inScope,
+ AudioUnitElement inElement,
+ void * outData);
+
+ virtual ComponentResult Initialize();
+ virtual bool SupportsTail () { return true; }
+ virtual Float64 GetTailTime() {return 1.0/GetSampleRate()*1.0;}
+ virtual Float64 GetLatency() {return 0.0;}
+
+ /*! @method Version */
+ virtual ComponentResult Version() { return kDitherboxVersion; }
+
+
+
+protected:
+ class DitherboxKernel : public AUKernelBase // most of the real work happens here
+ {
+public:
+ DitherboxKernel(AUEffectBase *inAudioUnit )
+ : AUKernelBase(inAudioUnit)
+ {
+ }
+
+ // *Required* overides for the process method for this effect
+ // processes one channel of interleaved samples
+ virtual void Process( const Float32 *inSourceP,
+ Float32 *inDestP,
+ UInt32 inFramesToProcess,
+ UInt32 inNumChannels,
+ bool &ioSilence);
+
+ virtual void Reset();
+
+ private:
+ long double byn[13];
+ long double noiseShaping;
+ long double contingentErr;
+ double currentDither;
+ long double NSOdd;
+ long double NSEven;
+ long double prev;
+ long double ns[16];
+ int Position;
+ bool flip;
+ long double lastSample;
+ long double outSample;
+ long double iirSampleA;
+ long double iirSampleB;
+ long double iirSampleC;
+ long double iirSampleD;
+ long double iirSampleE;
+ long double iirSampleF;
+ long double iirSampleG;
+ long double iirSampleH;
+ long double iirSampleI;
+ long double iirSampleJ;
+ long double iirSampleK;
+ long double iirSampleL;
+ long double iirSampleM;
+ long double iirSampleN;
+ long double iirSampleO;
+ long double iirSampleP;
+ long double iirSampleQ;
+ long double iirSampleR;
+ long double iirSampleS;
+ long double iirSampleT;
+ long double iirSampleU;
+ long double iirSampleV;
+ long double iirSampleW;
+ long double iirSampleX;
+ long double iirSampleY;
+ long double iirSampleZ;
+
+ };
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+#endif \ No newline at end of file
diff --git a/plugins/MacAU/Distance2/Ditherbox/Ditherbox.r b/plugins/MacAU/Distance2/Ditherbox/Ditherbox.r
new file mode 100755
index 0000000..9658772
--- /dev/null
+++ b/plugins/MacAU/Distance2/Ditherbox/Ditherbox.r
@@ -0,0 +1,61 @@
+/*
+* File: Ditherbox.r
+*
+* Version: 1.0
+*
+* Created: 1/1/09
+*
+* Copyright: Copyright © 2009 Airwindows, All Rights Reserved
+*
+* Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. ("Apple") in
+* consideration of your agreement to the following terms, and your use, installation, modification
+* or redistribution of this Apple software constitutes acceptance of these terms. If you do
+* not agree with these terms, please do not use, install, modify or redistribute this Apple
+* software.
+*
+* In consideration of your agreement to abide by the following terms, and subject to these terms,
+* Apple grants you a personal, non-exclusive license, under Apple's copyrights in this
+* original Apple software (the "Apple Software"), to use, reproduce, modify and redistribute the
+* Apple Software, with or without modifications, in source and/or binary forms; provided that if you
+* redistribute the Apple Software in its entirety and without modifications, you must retain this
+* notice and the following text and disclaimers in all such redistributions of the Apple Software.
+* Neither the name, trademarks, service marks or logos of Apple Computer, Inc. may be used to
+* endorse or promote products derived from the Apple Software without specific prior written
+* permission from Apple. Except as expressly stated in this notice, no other rights or
+* licenses, express or implied, are granted by Apple herein, including but not limited to any
+* patent rights that may be infringed by your derivative works or by other works in which the
+* Apple Software may be incorporated.
+*
+* The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO WARRANTIES, EXPRESS OR
+* IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY
+* AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE
+* OR IN COMBINATION WITH YOUR PRODUCTS.
+*
+* IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR CONSEQUENTIAL
+* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE,
+* REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER
+* UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN
+* IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*
+*/
+#include <AudioUnit/AudioUnit.r>
+
+#include "DitherboxVersion.h"
+
+// Note that resource IDs must be spaced 2 apart for the 'STR ' name and description
+#define kAudioUnitResID_Ditherbox 1000
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Ditherbox~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+#define RES_ID kAudioUnitResID_Ditherbox
+#define COMP_TYPE kAudioUnitType_Effect
+#define COMP_SUBTYPE Ditherbox_COMP_SUBTYPE
+#define COMP_MANUF Ditherbox_COMP_MANF
+
+#define VERSION kDitherboxVersion
+#define NAME "Airwindows: Ditherbox"
+#define DESCRIPTION "Ditherbox AU"
+#define ENTRY_POINT "DitherboxEntry"
+
+#include "AUResources.r" \ No newline at end of file
diff --git a/plugins/MacAU/Distance2/Ditherbox/Ditherbox.xcodeproj/christopherjohnson.mode1v3 b/plugins/MacAU/Distance2/Ditherbox/Ditherbox.xcodeproj/christopherjohnson.mode1v3
new file mode 100755
index 0000000..fd47c22
--- /dev/null
+++ b/plugins/MacAU/Distance2/Ditherbox/Ditherbox.xcodeproj/christopherjohnson.mode1v3
@@ -0,0 +1,1391 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>ActivePerspectiveName</key>
+ <string>Project</string>
+ <key>AllowedModules</key>
+ <array>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>PBXSmartGroupTreeModule</string>
+ <key>Name</key>
+ <string>Groups and Files Outline View</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>PBXNavigatorGroup</string>
+ <key>Name</key>
+ <string>Editor</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>XCTaskListModule</string>
+ <key>Name</key>
+ <string>Task List</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>XCDetailModule</string>
+ <key>Name</key>
+ <string>File and Smart Group Detail Viewer</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>1</string>
+ <key>Module</key>
+ <string>PBXBuildResultsModule</string>
+ <key>Name</key>
+ <string>Detailed Build Results Viewer</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>1</string>
+ <key>Module</key>
+ <string>PBXProjectFindModule</string>
+ <key>Name</key>
+ <string>Project Batch Find Tool</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>XCProjectFormatConflictsModule</string>
+ <key>Name</key>
+ <string>Project Format Conflicts List</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>PBXBookmarksModule</string>
+ <key>Name</key>
+ <string>Bookmarks Tool</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>PBXClassBrowserModule</string>
+ <key>Name</key>
+ <string>Class Browser</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>PBXCVSModule</string>
+ <key>Name</key>
+ <string>Source Code Control Tool</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>PBXDebugBreakpointsModule</string>
+ <key>Name</key>
+ <string>Debug Breakpoints Tool</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>XCDockableInspector</string>
+ <key>Name</key>
+ <string>Inspector</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>PBXOpenQuicklyModule</string>
+ <key>Name</key>
+ <string>Open Quickly Tool</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>1</string>
+ <key>Module</key>
+ <string>PBXDebugSessionModule</string>
+ <key>Name</key>
+ <string>Debugger</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>1</string>
+ <key>Module</key>
+ <string>PBXDebugCLIModule</string>
+ <key>Name</key>
+ <string>Debug Console</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>XCSnapshotModule</string>
+ <key>Name</key>
+ <string>Snapshots Tool</string>
+ </dict>
+ </array>
+ <key>BundlePath</key>
+ <string>/Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources</string>
+ <key>Description</key>
+ <string>DefaultDescriptionKey</string>
+ <key>DockingSystemVisible</key>
+ <false/>
+ <key>Extension</key>
+ <string>mode1v3</string>
+ <key>FavBarConfig</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>8BD3CCBC148831C90062E48C</string>
+ <key>XCBarModuleItemNames</key>
+ <dict/>
+ <key>XCBarModuleItems</key>
+ <array/>
+ </dict>
+ <key>FirstTimeWindowDisplayed</key>
+ <false/>
+ <key>Identifier</key>
+ <string>com.apple.perspectives.project.mode1v3</string>
+ <key>MajorVersion</key>
+ <integer>33</integer>
+ <key>MinorVersion</key>
+ <integer>0</integer>
+ <key>Name</key>
+ <string>Default</string>
+ <key>Notifications</key>
+ <array/>
+ <key>OpenEditors</key>
+ <array/>
+ <key>PerspectiveWidths</key>
+ <array>
+ <integer>-1</integer>
+ <integer>-1</integer>
+ </array>
+ <key>Perspectives</key>
+ <array>
+ <dict>
+ <key>ChosenToolbarItems</key>
+ <array>
+ <string>active-combo-popup</string>
+ <string>action</string>
+ <string>build</string>
+ <string>debugger-enable-breakpoints</string>
+ <string>get-info</string>
+ <string>com.apple.pbx.toolbar.searchfield</string>
+ </array>
+ <key>ControllerClassBaseName</key>
+ <string></string>
+ <key>IconName</key>
+ <string>WindowOfProjectWithEditor</string>
+ <key>Identifier</key>
+ <string>perspective.project</string>
+ <key>IsVertical</key>
+ <false/>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXBottomSmartGroupGIDs</key>
+ <array>
+ <string>1C37FBAC04509CD000000102</string>
+ <string>1C37FAAC04509CD000000102</string>
+ <string>1C37FABC05509CD000000102</string>
+ <string>1C37FABC05539CD112110102</string>
+ <string>E2644B35053B69B200211256</string>
+ <string>1C37FABC04509CD000100104</string>
+ <string>1CC0EA4004350EF90044410B</string>
+ <string>1CC0EA4004350EF90041110B</string>
+ </array>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CE0B1FE06471DED0097A5F4</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Files</string>
+ <key>PBXProjectStructureProvided</key>
+ <string>yes</string>
+ <key>PBXSmartGroupTreeModuleColumnData</key>
+ <dict>
+ <key>PBXSmartGroupTreeModuleColumnWidthsKey</key>
+ <array>
+ <real>186</real>
+ </array>
+ <key>PBXSmartGroupTreeModuleColumnsKey_v4</key>
+ <array>
+ <string>MainColumn</string>
+ </array>
+ </dict>
+ <key>PBXSmartGroupTreeModuleOutlineStateKey_v7</key>
+ <dict>
+ <key>PBXSmartGroupTreeModuleOutlineStateExpansionKey</key>
+ <array>
+ <string>089C166AFE841209C02AAC07</string>
+ <string>08FB77ADFE841716C02AAC07</string>
+ <string>8BA05A56072072A900365D66</string>
+ <string>1C37FBAC04509CD000000102</string>
+ <string>1C37FABC05509CD000000102</string>
+ </array>
+ <key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>
+ <array>
+ <array>
+ <integer>3</integer>
+ <integer>2</integer>
+ <integer>1</integer>
+ <integer>0</integer>
+ </array>
+ </array>
+ <key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key>
+ <string>{{0, 0}, {186, 445}}</string>
+ </dict>
+ <key>PBXTopSmartGroupGIDs</key>
+ <array/>
+ <key>XCIncludePerspectivesSwitch</key>
+ <true/>
+ <key>XCSharingToken</key>
+ <string>com.apple.Xcode.GFSharingToken</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 0}, {203, 463}}</string>
+ <key>GroupTreeTableConfiguration</key>
+ <array>
+ <string>MainColumn</string>
+ <real>186</real>
+ </array>
+ <key>RubberWindowFrame</key>
+ <string>21 337 788 504 0 0 1440 878 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXSmartGroupTreeModule</string>
+ <key>Proportion</key>
+ <string>203pt</string>
+ </dict>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CE0B20306471E060097A5F4</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Ditherbox.cpp</string>
+ <key>PBXSplitModuleInNavigatorKey</key>
+ <dict>
+ <key>Split0</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CE0B20406471E060097A5F4</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Ditherbox.cpp</string>
+ <key>_historyCapacity</key>
+ <integer>0</integer>
+ <key>bookmark</key>
+ <string>8B10BA501AF3F9220006BC2C</string>
+ <key>history</key>
+ <array>
+ <string>8B0EB0001A3A5BF700186949</string>
+ <string>8B10BA4F1AF3F9220006BC2C</string>
+ </array>
+ </dict>
+ <key>SplitCount</key>
+ <string>1</string>
+ </dict>
+ <key>StatusBarVisibility</key>
+ <true/>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 0}, {580, 188}}</string>
+ <key>RubberWindowFrame</key>
+ <string>21 337 788 504 0 0 1440 878 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXNavigatorGroup</string>
+ <key>Proportion</key>
+ <string>188pt</string>
+ </dict>
+ <dict>
+ <key>BecomeActive</key>
+ <true/>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CE0B20506471E060097A5F4</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Detail</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 193}, {580, 270}}</string>
+ <key>RubberWindowFrame</key>
+ <string>21 337 788 504 0 0 1440 878 </string>
+ </dict>
+ <key>Module</key>
+ <string>XCDetailModule</string>
+ <key>Proportion</key>
+ <string>270pt</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>580pt</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Project</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>XCModuleDock</string>
+ <string>PBXSmartGroupTreeModule</string>
+ <string>XCModuleDock</string>
+ <string>PBXNavigatorGroup</string>
+ <string>XCDetailModule</string>
+ </array>
+ <key>TableOfContents</key>
+ <array>
+ <string>8B10BA511AF3F9220006BC2C</string>
+ <string>1CE0B1FE06471DED0097A5F4</string>
+ <string>8B10BA521AF3F9220006BC2C</string>
+ <string>1CE0B20306471E060097A5F4</string>
+ <string>1CE0B20506471E060097A5F4</string>
+ </array>
+ <key>ToolbarConfigUserDefaultsMinorVersion</key>
+ <string>2</string>
+ <key>ToolbarConfiguration</key>
+ <string>xcode.toolbar.config.defaultV3</string>
+ </dict>
+ <dict>
+ <key>ControllerClassBaseName</key>
+ <string></string>
+ <key>IconName</key>
+ <string>WindowOfProject</string>
+ <key>Identifier</key>
+ <string>perspective.morph</string>
+ <key>IsVertical</key>
+ <integer>0</integer>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>BecomeActive</key>
+ <integer>1</integer>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXBottomSmartGroupGIDs</key>
+ <array>
+ <string>1C37FBAC04509CD000000102</string>
+ <string>1C37FAAC04509CD000000102</string>
+ <string>1C08E77C0454961000C914BD</string>
+ <string>1C37FABC05509CD000000102</string>
+ <string>1C37FABC05539CD112110102</string>
+ <string>E2644B35053B69B200211256</string>
+ <string>1C37FABC04509CD000100104</string>
+ <string>1CC0EA4004350EF90044410B</string>
+ <string>1CC0EA4004350EF90041110B</string>
+ </array>
+ <key>PBXProjectModuleGUID</key>
+ <string>11E0B1FE06471DED0097A5F4</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Files</string>
+ <key>PBXProjectStructureProvided</key>
+ <string>yes</string>
+ <key>PBXSmartGroupTreeModuleColumnData</key>
+ <dict>
+ <key>PBXSmartGroupTreeModuleColumnWidthsKey</key>
+ <array>
+ <real>186</real>
+ </array>
+ <key>PBXSmartGroupTreeModuleColumnsKey_v4</key>
+ <array>
+ <string>MainColumn</string>
+ </array>
+ </dict>
+ <key>PBXSmartGroupTreeModuleOutlineStateKey_v7</key>
+ <dict>
+ <key>PBXSmartGroupTreeModuleOutlineStateExpansionKey</key>
+ <array>
+ <string>29B97314FDCFA39411CA2CEA</string>
+ <string>1C37FABC05509CD000000102</string>
+ </array>
+ <key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>
+ <array>
+ <array>
+ <integer>0</integer>
+ </array>
+ </array>
+ <key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key>
+ <string>{{0, 0}, {186, 337}}</string>
+ </dict>
+ <key>PBXTopSmartGroupGIDs</key>
+ <array/>
+ <key>XCIncludePerspectivesSwitch</key>
+ <integer>1</integer>
+ <key>XCSharingToken</key>
+ <string>com.apple.Xcode.GFSharingToken</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 0}, {203, 355}}</string>
+ <key>GroupTreeTableConfiguration</key>
+ <array>
+ <string>MainColumn</string>
+ <real>186</real>
+ </array>
+ <key>RubberWindowFrame</key>
+ <string>373 269 690 397 0 0 1440 878 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXSmartGroupTreeModule</string>
+ <key>Proportion</key>
+ <string>100%</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Morph</string>
+ <key>PreferredWidth</key>
+ <integer>300</integer>
+ <key>ServiceClasses</key>
+ <array>
+ <string>XCModuleDock</string>
+ <string>PBXSmartGroupTreeModule</string>
+ </array>
+ <key>TableOfContents</key>
+ <array>
+ <string>11E0B1FE06471DED0097A5F4</string>
+ </array>
+ <key>ToolbarConfiguration</key>
+ <string>xcode.toolbar.config.default.shortV3</string>
+ </dict>
+ </array>
+ <key>PerspectivesBarVisible</key>
+ <false/>
+ <key>ShelfIsVisible</key>
+ <false/>
+ <key>SourceDescription</key>
+ <string>file at '/Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources/XCPerspectivesSpecificationMode1.xcperspec'</string>
+ <key>StatusbarIsVisible</key>
+ <true/>
+ <key>TimeStamp</key>
+ <real>0.0</real>
+ <key>ToolbarConfigUserDefaultsMinorVersion</key>
+ <string>2</string>
+ <key>ToolbarDisplayMode</key>
+ <integer>1</integer>
+ <key>ToolbarIsVisible</key>
+ <true/>
+ <key>ToolbarSizeMode</key>
+ <integer>2</integer>
+ <key>Type</key>
+ <string>Perspectives</string>
+ <key>UpdateMessage</key>
+ <string>The Default Workspace in this version of Xcode now includes support to hide and show the detail view (what has been referred to as the "Metro-Morph" feature). You must discard your current Default Workspace settings and update to the latest Default Workspace in order to gain this feature. Do you wish to update to the latest Workspace defaults for project '%@'?</string>
+ <key>WindowJustification</key>
+ <integer>5</integer>
+ <key>WindowOrderList</key>
+ <array>
+ <string>8BD3CCBD148831C90062E48C</string>
+ <string>/Users/christopherjohnson/Desktop/Dropbox/AU/Ditherbox/Ditherbox.xcodeproj</string>
+ </array>
+ <key>WindowString</key>
+ <string>21 337 788 504 0 0 1440 878 </string>
+ <key>WindowToolsV3</key>
+ <array>
+ <dict>
+ <key>FirstTimeWindowDisplayed</key>
+ <false/>
+ <key>Identifier</key>
+ <string>windowTool.build</string>
+ <key>IsVertical</key>
+ <true/>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CD0528F0623707200166675</string>
+ <key>PBXProjectModuleLabel</key>
+ <string></string>
+ <key>StatusBarVisibility</key>
+ <true/>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 0}, {500, 218}}</string>
+ <key>RubberWindowFrame</key>
+ <string>668 222 500 500 0 0 1440 878 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXNavigatorGroup</string>
+ <key>Proportion</key>
+ <string>218pt</string>
+ </dict>
+ <dict>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>XCMainBuildResultsModuleGUID</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Build Results</string>
+ <key>XCBuildResultsTrigger_Collapse</key>
+ <integer>1021</integer>
+ <key>XCBuildResultsTrigger_Open</key>
+ <integer>1011</integer>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 223}, {500, 236}}</string>
+ <key>RubberWindowFrame</key>
+ <string>668 222 500 500 0 0 1440 878 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXBuildResultsModule</string>
+ <key>Proportion</key>
+ <string>236pt</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>459pt</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Build Results</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>PBXBuildResultsModule</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <true/>
+ <key>TableOfContents</key>
+ <array>
+ <string>8BD3CCBD148831C90062E48C</string>
+ <string>8B10BA531AF3F9220006BC2C</string>
+ <string>1CD0528F0623707200166675</string>
+ <string>XCMainBuildResultsModuleGUID</string>
+ </array>
+ <key>ToolbarConfiguration</key>
+ <string>xcode.toolbar.config.buildV3</string>
+ <key>WindowContentMinSize</key>
+ <string>486 300</string>
+ <key>WindowString</key>
+ <string>668 222 500 500 0 0 1440 878 </string>
+ <key>WindowToolGUID</key>
+ <string>8BD3CCBD148831C90062E48C</string>
+ <key>WindowToolIsVisible</key>
+ <false/>
+ </dict>
+ <dict>
+ <key>FirstTimeWindowDisplayed</key>
+ <false/>
+ <key>Identifier</key>
+ <string>windowTool.debugger</string>
+ <key>IsVertical</key>
+ <true/>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>Debugger</key>
+ <dict>
+ <key>HorizontalSplitView</key>
+ <dict>
+ <key>_collapsingFrameDimension</key>
+ <real>0.0</real>
+ <key>_indexOfCollapsedView</key>
+ <integer>0</integer>
+ <key>_percentageOfCollapsedView</key>
+ <real>0.0</real>
+ <key>isCollapsed</key>
+ <string>yes</string>
+ <key>sizes</key>
+ <array>
+ <string>{{0, 0}, {316, 185}}</string>
+ <string>{{316, 0}, {378, 185}}</string>
+ </array>
+ </dict>
+ <key>VerticalSplitView</key>
+ <dict>
+ <key>_collapsingFrameDimension</key>
+ <real>0.0</real>
+ <key>_indexOfCollapsedView</key>
+ <integer>0</integer>
+ <key>_percentageOfCollapsedView</key>
+ <real>0.0</real>
+ <key>isCollapsed</key>
+ <string>yes</string>
+ <key>sizes</key>
+ <array>
+ <string>{{0, 0}, {694, 185}}</string>
+ <string>{{0, 185}, {694, 196}}</string>
+ </array>
+ </dict>
+ </dict>
+ <key>LauncherConfigVersion</key>
+ <string>8</string>
+ <key>PBXProjectModuleGUID</key>
+ <string>1C162984064C10D400B95A72</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Debug - GLUTExamples (Underwater)</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>DebugConsoleVisible</key>
+ <string>None</string>
+ <key>DebugConsoleWindowFrame</key>
+ <string>{{200, 200}, {500, 300}}</string>
+ <key>DebugSTDIOWindowFrame</key>
+ <string>{{200, 200}, {500, 300}}</string>
+ <key>Frame</key>
+ <string>{{0, 0}, {694, 381}}</string>
+ <key>PBXDebugSessionStackFrameViewKey</key>
+ <dict>
+ <key>DebugVariablesTableConfiguration</key>
+ <array>
+ <string>Name</string>
+ <real>120</real>
+ <string>Value</string>
+ <real>85</real>
+ <string>Summary</string>
+ <real>148</real>
+ </array>
+ <key>Frame</key>
+ <string>{{316, 0}, {378, 185}}</string>
+ <key>RubberWindowFrame</key>
+ <string>314 433 694 422 0 0 1440 878 </string>
+ </dict>
+ <key>RubberWindowFrame</key>
+ <string>314 433 694 422 0 0 1440 878 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXDebugSessionModule</string>
+ <key>Proportion</key>
+ <string>381pt</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>381pt</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Debugger</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>PBXDebugSessionModule</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <true/>
+ <key>TableOfContents</key>
+ <array>
+ <string>1CD10A99069EF8BA00B06720</string>
+ <string>8BBB957D18E43740006673D8</string>
+ <string>1C162984064C10D400B95A72</string>
+ <string>8BBB957E18E43740006673D8</string>
+ <string>8BBB957F18E43740006673D8</string>
+ <string>8BBB958018E43740006673D8</string>
+ <string>8BBB958118E43740006673D8</string>
+ <string>8BBB958218E43740006673D8</string>
+ </array>
+ <key>ToolbarConfiguration</key>
+ <string>xcode.toolbar.config.debugV3</string>
+ <key>WindowString</key>
+ <string>314 433 694 422 0 0 1440 878 </string>
+ <key>WindowToolGUID</key>
+ <string>1CD10A99069EF8BA00B06720</string>
+ <key>WindowToolIsVisible</key>
+ <false/>
+ </dict>
+ <dict>
+ <key>Identifier</key>
+ <string>windowTool.find</string>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CDD528C0622207200134675</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>&lt;No Editor&gt;</string>
+ <key>PBXSplitModuleInNavigatorKey</key>
+ <dict>
+ <key>Split0</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CD0528D0623707200166675</string>
+ </dict>
+ <key>SplitCount</key>
+ <string>1</string>
+ </dict>
+ <key>StatusBarVisibility</key>
+ <integer>1</integer>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 0}, {781, 167}}</string>
+ <key>RubberWindowFrame</key>
+ <string>62 385 781 470 0 0 1440 878 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXNavigatorGroup</string>
+ <key>Proportion</key>
+ <string>781pt</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>50%</string>
+ </dict>
+ <dict>
+ <key>BecomeActive</key>
+ <integer>1</integer>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CD0528E0623707200166675</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Project Find</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{8, 0}, {773, 254}}</string>
+ <key>RubberWindowFrame</key>
+ <string>62 385 781 470 0 0 1440 878 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXProjectFindModule</string>
+ <key>Proportion</key>
+ <string>50%</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>428pt</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Project Find</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>PBXProjectFindModule</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <integer>1</integer>
+ <key>TableOfContents</key>
+ <array>
+ <string>1C530D57069F1CE1000CFCEE</string>
+ <string>1C530D58069F1CE1000CFCEE</string>
+ <string>1C530D59069F1CE1000CFCEE</string>
+ <string>1CDD528C0622207200134675</string>
+ <string>1C530D5A069F1CE1000CFCEE</string>
+ <string>1CE0B1FE06471DED0097A5F4</string>
+ <string>1CD0528E0623707200166675</string>
+ </array>
+ <key>WindowString</key>
+ <string>62 385 781 470 0 0 1440 878 </string>
+ <key>WindowToolGUID</key>
+ <string>1C530D57069F1CE1000CFCEE</string>
+ <key>WindowToolIsVisible</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>Identifier</key>
+ <string>MENUSEPARATOR</string>
+ </dict>
+ <dict>
+ <key>Identifier</key>
+ <string>windowTool.debuggerConsole</string>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>BecomeActive</key>
+ <integer>1</integer>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1C78EAAC065D492600B07095</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Debugger Console</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 0}, {650, 250}}</string>
+ <key>RubberWindowFrame</key>
+ <string>516 632 650 250 0 0 1680 1027 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXDebugCLIModule</string>
+ <key>Proportion</key>
+ <string>209pt</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>209pt</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Debugger Console</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>PBXDebugCLIModule</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <integer>1</integer>
+ <key>TableOfContents</key>
+ <array>
+ <string>1C78EAAD065D492600B07095</string>
+ <string>1C78EAAE065D492600B07095</string>
+ <string>1C78EAAC065D492600B07095</string>
+ </array>
+ <key>ToolbarConfiguration</key>
+ <string>xcode.toolbar.config.consoleV3</string>
+ <key>WindowString</key>
+ <string>650 41 650 250 0 0 1280 1002 </string>
+ <key>WindowToolGUID</key>
+ <string>1C78EAAD065D492600B07095</string>
+ <key>WindowToolIsVisible</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>Identifier</key>
+ <string>windowTool.snapshots</string>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>Module</key>
+ <string>XCSnapshotModule</string>
+ <key>Proportion</key>
+ <string>100%</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>100%</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Snapshots</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>XCSnapshotModule</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <string>Yes</string>
+ <key>ToolbarConfiguration</key>
+ <string>xcode.toolbar.config.snapshots</string>
+ <key>WindowString</key>
+ <string>315 824 300 550 0 0 1440 878 </string>
+ <key>WindowToolIsVisible</key>
+ <string>Yes</string>
+ </dict>
+ <dict>
+ <key>Identifier</key>
+ <string>windowTool.scm</string>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1C78EAB2065D492600B07095</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>&lt;No Editor&gt;</string>
+ <key>PBXSplitModuleInNavigatorKey</key>
+ <dict>
+ <key>Split0</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1C78EAB3065D492600B07095</string>
+ </dict>
+ <key>SplitCount</key>
+ <string>1</string>
+ </dict>
+ <key>StatusBarVisibility</key>
+ <integer>1</integer>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 0}, {452, 0}}</string>
+ <key>RubberWindowFrame</key>
+ <string>743 379 452 308 0 0 1280 1002 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXNavigatorGroup</string>
+ <key>Proportion</key>
+ <string>0pt</string>
+ </dict>
+ <dict>
+ <key>BecomeActive</key>
+ <integer>1</integer>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CD052920623707200166675</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>SCM</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>ConsoleFrame</key>
+ <string>{{0, 259}, {452, 0}}</string>
+ <key>Frame</key>
+ <string>{{0, 7}, {452, 259}}</string>
+ <key>RubberWindowFrame</key>
+ <string>743 379 452 308 0 0 1280 1002 </string>
+ <key>TableConfiguration</key>
+ <array>
+ <string>Status</string>
+ <real>30</real>
+ <string>FileName</string>
+ <real>199</real>
+ <string>Path</string>
+ <real>197.0950012207031</real>
+ </array>
+ <key>TableFrame</key>
+ <string>{{0, 0}, {452, 250}}</string>
+ </dict>
+ <key>Module</key>
+ <string>PBXCVSModule</string>
+ <key>Proportion</key>
+ <string>262pt</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>266pt</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>SCM</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>PBXCVSModule</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <integer>1</integer>
+ <key>TableOfContents</key>
+ <array>
+ <string>1C78EAB4065D492600B07095</string>
+ <string>1C78EAB5065D492600B07095</string>
+ <string>1C78EAB2065D492600B07095</string>
+ <string>1CD052920623707200166675</string>
+ </array>
+ <key>ToolbarConfiguration</key>
+ <string>xcode.toolbar.config.scm</string>
+ <key>WindowString</key>
+ <string>743 379 452 308 0 0 1280 1002 </string>
+ </dict>
+ <dict>
+ <key>Identifier</key>
+ <string>windowTool.breakpoints</string>
+ <key>IsVertical</key>
+ <integer>0</integer>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>BecomeActive</key>
+ <integer>1</integer>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXBottomSmartGroupGIDs</key>
+ <array>
+ <string>1C77FABC04509CD000000102</string>
+ </array>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CE0B1FE06471DED0097A5F4</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Files</string>
+ <key>PBXProjectStructureProvided</key>
+ <string>no</string>
+ <key>PBXSmartGroupTreeModuleColumnData</key>
+ <dict>
+ <key>PBXSmartGroupTreeModuleColumnWidthsKey</key>
+ <array>
+ <real>168</real>
+ </array>
+ <key>PBXSmartGroupTreeModuleColumnsKey_v4</key>
+ <array>
+ <string>MainColumn</string>
+ </array>
+ </dict>
+ <key>PBXSmartGroupTreeModuleOutlineStateKey_v7</key>
+ <dict>
+ <key>PBXSmartGroupTreeModuleOutlineStateExpansionKey</key>
+ <array>
+ <string>1C77FABC04509CD000000102</string>
+ </array>
+ <key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>
+ <array>
+ <array>
+ <integer>0</integer>
+ </array>
+ </array>
+ <key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key>
+ <string>{{0, 0}, {168, 350}}</string>
+ </dict>
+ <key>PBXTopSmartGroupGIDs</key>
+ <array/>
+ <key>XCIncludePerspectivesSwitch</key>
+ <integer>0</integer>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 0}, {185, 368}}</string>
+ <key>GroupTreeTableConfiguration</key>
+ <array>
+ <string>MainColumn</string>
+ <real>168</real>
+ </array>
+ <key>RubberWindowFrame</key>
+ <string>315 424 744 409 0 0 1440 878 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXSmartGroupTreeModule</string>
+ <key>Proportion</key>
+ <string>185pt</string>
+ </dict>
+ <dict>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CA1AED706398EBD00589147</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Detail</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{190, 0}, {554, 368}}</string>
+ <key>RubberWindowFrame</key>
+ <string>315 424 744 409 0 0 1440 878 </string>
+ </dict>
+ <key>Module</key>
+ <string>XCDetailModule</string>
+ <key>Proportion</key>
+ <string>554pt</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>368pt</string>
+ </dict>
+ </array>
+ <key>MajorVersion</key>
+ <integer>3</integer>
+ <key>MinorVersion</key>
+ <integer>0</integer>
+ <key>Name</key>
+ <string>Breakpoints</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>PBXSmartGroupTreeModule</string>
+ <string>XCDetailModule</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <integer>1</integer>
+ <key>TableOfContents</key>
+ <array>
+ <string>1CDDB66807F98D9800BB5817</string>
+ <string>1CDDB66907F98D9800BB5817</string>
+ <string>1CE0B1FE06471DED0097A5F4</string>
+ <string>1CA1AED706398EBD00589147</string>
+ </array>
+ <key>ToolbarConfiguration</key>
+ <string>xcode.toolbar.config.breakpointsV3</string>
+ <key>WindowString</key>
+ <string>315 424 744 409 0 0 1440 878 </string>
+ <key>WindowToolGUID</key>
+ <string>1CDDB66807F98D9800BB5817</string>
+ <key>WindowToolIsVisible</key>
+ <integer>1</integer>
+ </dict>
+ <dict>
+ <key>Identifier</key>
+ <string>windowTool.debugAnimator</string>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>Module</key>
+ <string>PBXNavigatorGroup</string>
+ <key>Proportion</key>
+ <string>100%</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>100%</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Debug Visualizer</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>PBXNavigatorGroup</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <integer>1</integer>
+ <key>ToolbarConfiguration</key>
+ <string>xcode.toolbar.config.debugAnimatorV3</string>
+ <key>WindowString</key>
+ <string>100 100 700 500 0 0 1280 1002 </string>
+ </dict>
+ <dict>
+ <key>Identifier</key>
+ <string>windowTool.bookmarks</string>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>Module</key>
+ <string>PBXBookmarksModule</string>
+ <key>Proportion</key>
+ <string>100%</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>100%</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Bookmarks</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>PBXBookmarksModule</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <integer>0</integer>
+ <key>WindowString</key>
+ <string>538 42 401 187 0 0 1280 1002 </string>
+ </dict>
+ <dict>
+ <key>Identifier</key>
+ <string>windowTool.projectFormatConflicts</string>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>Module</key>
+ <string>XCProjectFormatConflictsModule</string>
+ <key>Proportion</key>
+ <string>100%</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>100%</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Project Format Conflicts</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>XCProjectFormatConflictsModule</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <integer>0</integer>
+ <key>WindowContentMinSize</key>
+ <string>450 300</string>
+ <key>WindowString</key>
+ <string>50 850 472 307 0 0 1440 877</string>
+ </dict>
+ <dict>
+ <key>Identifier</key>
+ <string>windowTool.classBrowser</string>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>BecomeActive</key>
+ <integer>1</integer>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>OptionsSetName</key>
+ <string>Hierarchy, all classes</string>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CA6456E063B45B4001379D8</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Class Browser - NSObject</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>ClassesFrame</key>
+ <string>{{0, 0}, {374, 96}}</string>
+ <key>ClassesTreeTableConfiguration</key>
+ <array>
+ <string>PBXClassNameColumnIdentifier</string>
+ <real>208</real>
+ <string>PBXClassBookColumnIdentifier</string>
+ <real>22</real>
+ </array>
+ <key>Frame</key>
+ <string>{{0, 0}, {630, 331}}</string>
+ <key>MembersFrame</key>
+ <string>{{0, 105}, {374, 395}}</string>
+ <key>MembersTreeTableConfiguration</key>
+ <array>
+ <string>PBXMemberTypeIconColumnIdentifier</string>
+ <real>22</real>
+ <string>PBXMemberNameColumnIdentifier</string>
+ <real>216</real>
+ <string>PBXMemberTypeColumnIdentifier</string>
+ <real>97</real>
+ <string>PBXMemberBookColumnIdentifier</string>
+ <real>22</real>
+ </array>
+ <key>PBXModuleWindowStatusBarHidden2</key>
+ <integer>1</integer>
+ <key>RubberWindowFrame</key>
+ <string>385 179 630 352 0 0 1440 878 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXClassBrowserModule</string>
+ <key>Proportion</key>
+ <string>332pt</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>332pt</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Class Browser</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>PBXClassBrowserModule</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <integer>0</integer>
+ <key>TableOfContents</key>
+ <array>
+ <string>1C0AD2AF069F1E9B00FABCE6</string>
+ <string>1C0AD2B0069F1E9B00FABCE6</string>
+ <string>1CA6456E063B45B4001379D8</string>
+ </array>
+ <key>ToolbarConfiguration</key>
+ <string>xcode.toolbar.config.classbrowser</string>
+ <key>WindowString</key>
+ <string>385 179 630 352 0 0 1440 878 </string>
+ <key>WindowToolGUID</key>
+ <string>1C0AD2AF069F1E9B00FABCE6</string>
+ <key>WindowToolIsVisible</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>Identifier</key>
+ <string>windowTool.refactoring</string>
+ <key>IncludeInToolsMenu</key>
+ <integer>0</integer>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>BecomeActive</key>
+ <integer>1</integer>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{0, 0}, {500, 335}</string>
+ <key>RubberWindowFrame</key>
+ <string>{0, 0}, {500, 335}</string>
+ </dict>
+ <key>Module</key>
+ <string>XCRefactoringModule</string>
+ <key>Proportion</key>
+ <string>100%</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>100%</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Refactoring</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>XCRefactoringModule</string>
+ </array>
+ <key>WindowString</key>
+ <string>200 200 500 356 0 0 1920 1200 </string>
+ </dict>
+ </array>
+</dict>
+</plist>
diff --git a/plugins/MacAU/Distance2/Ditherbox/Ditherbox.xcodeproj/christopherjohnson.pbxuser b/plugins/MacAU/Distance2/Ditherbox/Ditherbox.xcodeproj/christopherjohnson.pbxuser
new file mode 100755
index 0000000..3c31d7a
--- /dev/null
+++ b/plugins/MacAU/Distance2/Ditherbox/Ditherbox.xcodeproj/christopherjohnson.pbxuser
@@ -0,0 +1,153 @@
+// !$*UTF8*$!
+{
+ 089C1669FE841209C02AAC07 /* Project object */ = {
+ activeBuildConfigurationName = Release;
+ activeTarget = 8D01CCC60486CAD60068D4B7 /* Ditherbox */;
+ breakpoints = (
+ );
+ codeSenseManager = 8BD3CCB9148830B20062E48C /* Code sense */;
+ perUserDictionary = {
+ PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = {
+ PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
+ PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID;
+ PBXFileTableDataSourceColumnWidthsKey = (
+ 20,
+ 364,
+ 20,
+ 48,
+ 43,
+ 43,
+ 20,
+ );
+ PBXFileTableDataSourceColumnsKey = (
+ PBXFileDataSource_FiletypeID,
+ PBXFileDataSource_Filename_ColumnID,
+ PBXFileDataSource_Built_ColumnID,
+ PBXFileDataSource_ObjectSize_ColumnID,
+ PBXFileDataSource_Errors_ColumnID,
+ PBXFileDataSource_Warnings_ColumnID,
+ PBXFileDataSource_Target_ColumnID,
+ );
+ };
+ PBXConfiguration.PBXTargetDataSource.PBXTargetDataSource = {
+ PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
+ PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID;
+ PBXFileTableDataSourceColumnWidthsKey = (
+ 20,
+ 301,
+ 60,
+ 20,
+ 48,
+ 43,
+ 43,
+ );
+ PBXFileTableDataSourceColumnsKey = (
+ PBXFileDataSource_FiletypeID,
+ PBXFileDataSource_Filename_ColumnID,
+ PBXTargetDataSource_PrimaryAttribute,
+ PBXFileDataSource_Built_ColumnID,
+ PBXFileDataSource_ObjectSize_ColumnID,
+ PBXFileDataSource_Errors_ColumnID,
+ PBXFileDataSource_Warnings_ColumnID,
+ );
+ };
+ PBXPerProjectTemplateStateSaveDate = 557696136;
+ PBXWorkspaceStateSaveDate = 557696136;
+ };
+ perUserProjectItems = {
+ 8B913FA3213DBD2F00BA6EEC /* PBXTextBookmark */ = 8B913FA3213DBD2F00BA6EEC /* PBXTextBookmark */;
+ 8B913FE1213DC54C00BA6EEC /* PBXTextBookmark */ = 8B913FE1213DC54C00BA6EEC /* PBXTextBookmark */;
+ 8B913FEB213DC5A500BA6EEC /* PBXTextBookmark */ = 8B913FEB213DC5A500BA6EEC /* PBXTextBookmark */;
+ };
+ sourceControlManager = 8BD3CCB8148830B20062E48C /* Source Control */;
+ userBuildSettings = {
+ };
+ };
+ 8B913FA3213DBD2F00BA6EEC /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = 8BA05A660720730100365D66 /* Ditherbox.cpp */;
+ name = "Ditherbox.cpp: 302";
+ rLen = 79;
+ rLoc = 10835;
+ rType = 0;
+ vrLen = 342;
+ vrLoc = 10516;
+ };
+ 8B913FE1213DC54C00BA6EEC /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = 8BC6025B073B072D006C4272 /* Ditherbox.h */;
+ name = "Ditherbox.h: 216";
+ rLen = 0;
+ rLoc = 8486;
+ rType = 0;
+ vrLen = 209;
+ vrLoc = 129;
+ };
+ 8B913FEB213DC5A500BA6EEC /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = 8BC6025B073B072D006C4272 /* Ditherbox.h */;
+ name = "Ditherbox.h: 216";
+ rLen = 0;
+ rLoc = 8486;
+ rType = 0;
+ vrLen = 209;
+ vrLoc = 129;
+ };
+ 8BA05A660720730100365D66 /* Ditherbox.cpp */ = {
+ uiCtxt = {
+ sepNavIntBoundsRect = "{{0, 0}, {978, 11076}}";
+ sepNavSelRange = "{11237, 0}";
+ sepNavVisRange = "{1680, 2418}";
+ sepNavWindowFrame = "{{471, 45}, {816, 833}}";
+ };
+ };
+ 8BA05A670720730100365D66 /* Ditherbox.exp */ = {
+ uiCtxt = {
+ sepNavIntBoundsRect = "{{0, 0}, {729, 706}}";
+ sepNavSelRange = "{16, 0}";
+ sepNavVisRange = "{0, 16}";
+ sepNavWindowFrame = "{{15, 39}, {776, 834}}";
+ };
+ };
+ 8BA05A680720730100365D66 /* Ditherbox.r */ = {
+ uiCtxt = {
+ sepNavIntBoundsRect = "{{0, 0}, {962, 672}}";
+ sepNavSelRange = "{0, 0}";
+ sepNavVisRange = "{0, 3224}";
+ sepNavWindowFrame = "{{15, 73}, {1021, 800}}";
+ };
+ };
+ 8BA05A690720730100365D66 /* DitherboxVersion.h */ = {
+ uiCtxt = {
+ sepNavIntBoundsRect = "{{0, 0}, {974, 897}}";
+ sepNavSelRange = "{0, 0}";
+ sepNavVisRange = "{748, 2738}";
+ sepNavWindowFrame = "{{404, 78}, {1021, 800}}";
+ };
+ };
+ 8BC6025B073B072D006C4272 /* Ditherbox.h */ = {
+ uiCtxt = {
+ sepNavIntBoundsRect = "{{0, 0}, {803, 3003}}";
+ sepNavSelRange = "{8486, 0}";
+ sepNavVisRange = "{129, 209}";
+ sepNavWindowFrame = "{{419, 78}, {1021, 800}}";
+ };
+ };
+ 8BD3CCB8148830B20062E48C /* Source Control */ = {
+ isa = PBXSourceControlManager;
+ fallbackIsa = XCSourceControlManager;
+ isSCMEnabled = 0;
+ scmConfiguration = {
+ repositoryNamesForRoots = {
+ "" = "";
+ };
+ };
+ };
+ 8BD3CCB9148830B20062E48C /* Code sense */ = {
+ isa = PBXCodeSenseManager;
+ indexTemplatePath = "";
+ };
+ 8D01CCC60486CAD60068D4B7 /* Ditherbox */ = {
+ activeExec = 0;
+ };
+}
diff --git a/plugins/MacAU/Distance2/Ditherbox/Ditherbox.xcodeproj/christopherjohnson.perspectivev3 b/plugins/MacAU/Distance2/Ditherbox/Ditherbox.xcodeproj/christopherjohnson.perspectivev3
new file mode 100755
index 0000000..efe3540
--- /dev/null
+++ b/plugins/MacAU/Distance2/Ditherbox/Ditherbox.xcodeproj/christopherjohnson.perspectivev3
@@ -0,0 +1,1482 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>ActivePerspectiveName</key>
+ <string>Project</string>
+ <key>AllowedModules</key>
+ <array>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>PBXSmartGroupTreeModule</string>
+ <key>Name</key>
+ <string>Groups and Files Outline View</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>PBXNavigatorGroup</string>
+ <key>Name</key>
+ <string>Editor</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>XCTaskListModule</string>
+ <key>Name</key>
+ <string>Task List</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>XCDetailModule</string>
+ <key>Name</key>
+ <string>File and Smart Group Detail Viewer</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>1</string>
+ <key>Module</key>
+ <string>PBXBuildResultsModule</string>
+ <key>Name</key>
+ <string>Detailed Build Results Viewer</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>1</string>
+ <key>Module</key>
+ <string>PBXProjectFindModule</string>
+ <key>Name</key>
+ <string>Project Batch Find Tool</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>XCProjectFormatConflictsModule</string>
+ <key>Name</key>
+ <string>Project Format Conflicts List</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>PBXBookmarksModule</string>
+ <key>Name</key>
+ <string>Bookmarks Tool</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>PBXClassBrowserModule</string>
+ <key>Name</key>
+ <string>Class Browser</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>PBXCVSModule</string>
+ <key>Name</key>
+ <string>Source Code Control Tool</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>PBXDebugBreakpointsModule</string>
+ <key>Name</key>
+ <string>Debug Breakpoints Tool</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>XCDockableInspector</string>
+ <key>Name</key>
+ <string>Inspector</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>PBXOpenQuicklyModule</string>
+ <key>Name</key>
+ <string>Open Quickly Tool</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>1</string>
+ <key>Module</key>
+ <string>PBXDebugSessionModule</string>
+ <key>Name</key>
+ <string>Debugger</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>1</string>
+ <key>Module</key>
+ <string>PBXDebugCLIModule</string>
+ <key>Name</key>
+ <string>Debug Console</string>
+ </dict>
+ <dict>
+ <key>BundleLoadPath</key>
+ <string></string>
+ <key>MaxInstances</key>
+ <string>n</string>
+ <key>Module</key>
+ <string>XCSnapshotModule</string>
+ <key>Name</key>
+ <string>Snapshots Tool</string>
+ </dict>
+ </array>
+ <key>BundlePath</key>
+ <string>/Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources</string>
+ <key>Description</key>
+ <string>AIODescriptionKey</string>
+ <key>DockingSystemVisible</key>
+ <false/>
+ <key>Extension</key>
+ <string>perspectivev3</string>
+ <key>FavBarConfig</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>8B9E7EED1DDE28AC006035FA</string>
+ <key>XCBarModuleItemNames</key>
+ <dict/>
+ <key>XCBarModuleItems</key>
+ <array/>
+ </dict>
+ <key>FirstTimeWindowDisplayed</key>
+ <false/>
+ <key>Identifier</key>
+ <string>com.apple.perspectives.project.defaultV3</string>
+ <key>MajorVersion</key>
+ <integer>34</integer>
+ <key>MinorVersion</key>
+ <integer>0</integer>
+ <key>Name</key>
+ <string>All-In-One</string>
+ <key>Notifications</key>
+ <array>
+ <dict>
+ <key>XCObserverAutoDisconnectKey</key>
+ <true/>
+ <key>XCObserverDefintionKey</key>
+ <dict>
+ <key>PBXStatusErrorsKey</key>
+ <integer>0</integer>
+ </dict>
+ <key>XCObserverFactoryKey</key>
+ <string>XCPerspectivesSpecificationIdentifier</string>
+ <key>XCObserverGUIDKey</key>
+ <string>XCObserverProjectIdentifier</string>
+ <key>XCObserverNotificationKey</key>
+ <string>PBXStatusBuildStateMessageNotification</string>
+ <key>XCObserverTargetKey</key>
+ <string>XCMainBuildResultsModuleGUID</string>
+ <key>XCObserverTriggerKey</key>
+ <string>awakenModuleWithObserver:</string>
+ <key>XCObserverValidationKey</key>
+ <dict>
+ <key>PBXStatusErrorsKey</key>
+ <integer>2</integer>
+ </dict>
+ </dict>
+ </array>
+ <key>OpenEditors</key>
+ <array/>
+ <key>PerspectiveWidths</key>
+ <array>
+ <integer>810</integer>
+ <integer>810</integer>
+ </array>
+ <key>Perspectives</key>
+ <array>
+ <dict>
+ <key>ChosenToolbarItems</key>
+ <array>
+ <string>XCToolbarPerspectiveControl</string>
+ <string>NSToolbarSeparatorItem</string>
+ <string>active-combo-popup</string>
+ <string>action</string>
+ <string>NSToolbarFlexibleSpaceItem</string>
+ <string>debugger-enable-breakpoints</string>
+ <string>build-and-go</string>
+ <string>com.apple.ide.PBXToolbarStopButton</string>
+ <string>get-info</string>
+ <string>NSToolbarFlexibleSpaceItem</string>
+ <string>com.apple.pbx.toolbar.searchfield</string>
+ </array>
+ <key>ControllerClassBaseName</key>
+ <string></string>
+ <key>IconName</key>
+ <string>WindowOfProject</string>
+ <key>Identifier</key>
+ <string>perspective.project</string>
+ <key>IsVertical</key>
+ <false/>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXBottomSmartGroupGIDs</key>
+ <array>
+ <string>1C37FBAC04509CD000000102</string>
+ <string>1C37FAAC04509CD000000102</string>
+ <string>1C37FABC05509CD000000102</string>
+ <string>1C37FABC05539CD112110102</string>
+ <string>E2644B35053B69B200211256</string>
+ <string>1C37FABC04509CD000100104</string>
+ <string>1CC0EA4004350EF90044410B</string>
+ <string>1CC0EA4004350EF90041110B</string>
+ <string>1C77FABC04509CD000000102</string>
+ </array>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CA23ED40692098700951B8B</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Files</string>
+ <key>PBXProjectStructureProvided</key>
+ <string>yes</string>
+ <key>PBXSmartGroupTreeModuleColumnData</key>
+ <dict>
+ <key>PBXSmartGroupTreeModuleColumnWidthsKey</key>
+ <array>
+ <real>185</real>
+ </array>
+ <key>PBXSmartGroupTreeModuleColumnsKey_v4</key>
+ <array>
+ <string>MainColumn</string>
+ </array>
+ </dict>
+ <key>PBXSmartGroupTreeModuleOutlineStateKey_v7</key>
+ <dict>
+ <key>PBXSmartGroupTreeModuleOutlineStateExpansionKey</key>
+ <array>
+ <string>089C166AFE841209C02AAC07</string>
+ <string>08FB77ADFE841716C02AAC07</string>
+ <string>8BA05A56072072A900365D66</string>
+ </array>
+ <key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>
+ <array>
+ <array>
+ <integer>4</integer>
+ <integer>2</integer>
+ <integer>1</integer>
+ <integer>0</integer>
+ </array>
+ </array>
+ <key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key>
+ <string>{{0, 0}, {185, 428}}</string>
+ </dict>
+ <key>PBXTopSmartGroupGIDs</key>
+ <array/>
+ <key>XCIncludePerspectivesSwitch</key>
+ <false/>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 0}, {202, 446}}</string>
+ <key>GroupTreeTableConfiguration</key>
+ <array>
+ <string>MainColumn</string>
+ <real>185</real>
+ </array>
+ <key>RubberWindowFrame</key>
+ <string>468 237 810 487 0 0 1440 878 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXSmartGroupTreeModule</string>
+ <key>Proportion</key>
+ <string>202pt</string>
+ </dict>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>8B9E7EE61DDE28AC006035FA</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Ditherbox.h</string>
+ <key>PBXSplitModuleInNavigatorKey</key>
+ <dict>
+ <key>Split0</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>8B9E7EE71DDE28AC006035FA</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Ditherbox.h</string>
+ <key>_historyCapacity</key>
+ <integer>0</integer>
+ <key>bookmark</key>
+ <string>8B913FEB213DC5A500BA6EEC</string>
+ <key>history</key>
+ <array>
+ <string>8B913FA3213DBD2F00BA6EEC</string>
+ <string>8B913FE1213DC54C00BA6EEC</string>
+ </array>
+ </dict>
+ <key>SplitCount</key>
+ <string>1</string>
+ </dict>
+ <key>StatusBarVisibility</key>
+ <true/>
+ <key>XCSharingToken</key>
+ <string>com.apple.Xcode.CommonNavigatorGroupSharingToken</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 0}, {603, 69}}</string>
+ <key>RubberWindowFrame</key>
+ <string>468 237 810 487 0 0 1440 878 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXNavigatorGroup</string>
+ <key>Proportion</key>
+ <string>69pt</string>
+ </dict>
+ <dict>
+ <key>Proportion</key>
+ <string>372pt</string>
+ <key>Tabs</key>
+ <array>
+ <dict>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CA23EDF0692099D00951B8B</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Detail</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{10, 27}, {603, 345}}</string>
+ </dict>
+ <key>Module</key>
+ <string>XCDetailModule</string>
+ </dict>
+ <dict>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CA23EE00692099D00951B8B</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Project Find</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{10, 31}, {603, 297}}</string>
+ </dict>
+ <key>Module</key>
+ <string>PBXProjectFindModule</string>
+ </dict>
+ <dict>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXCVSModuleFilterTypeKey</key>
+ <integer>1032</integer>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CA23EE10692099D00951B8B</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>SCM Results</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{10, 31}, {603, 297}}</string>
+ </dict>
+ <key>Module</key>
+ <string>PBXCVSModule</string>
+ </dict>
+ <dict>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>XCMainBuildResultsModuleGUID</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Build Results</string>
+ <key>XCBuildResultsTrigger_Collapse</key>
+ <integer>1023</integer>
+ <key>XCBuildResultsTrigger_Open</key>
+ <integer>1012</integer>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{10, 27}, {603, 345}}</string>
+ <key>RubberWindowFrame</key>
+ <string>468 237 810 487 0 0 1440 878 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXBuildResultsModule</string>
+ </dict>
+ </array>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>603pt</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Project</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>XCModuleDock</string>
+ <string>PBXSmartGroupTreeModule</string>
+ <string>XCModuleDock</string>
+ <string>PBXNavigatorGroup</string>
+ <string>XCDockableTabModule</string>
+ <string>XCDetailModule</string>
+ <string>PBXProjectFindModule</string>
+ <string>PBXCVSModule</string>
+ <string>PBXBuildResultsModule</string>
+ </array>
+ <key>TableOfContents</key>
+ <array>
+ <string>8B913FB1213DC48A00BA6EEC</string>
+ <string>1CA23ED40692098700951B8B</string>
+ <string>8B913FB2213DC48A00BA6EEC</string>
+ <string>8B9E7EE61DDE28AC006035FA</string>
+ <string>8B913FB3213DC48A00BA6EEC</string>
+ <string>1CA23EDF0692099D00951B8B</string>
+ <string>1CA23EE00692099D00951B8B</string>
+ <string>1CA23EE10692099D00951B8B</string>
+ <string>XCMainBuildResultsModuleGUID</string>
+ </array>
+ <key>ToolbarConfigUserDefaultsMinorVersion</key>
+ <string>2</string>
+ <key>ToolbarConfiguration</key>
+ <string>xcode.toolbar.config.defaultV3</string>
+ </dict>
+ <dict>
+ <key>ChosenToolbarItems</key>
+ <array>
+ <string>XCToolbarPerspectiveControl</string>
+ <string>NSToolbarSeparatorItem</string>
+ <string>active-combo-popup</string>
+ <string>NSToolbarFlexibleSpaceItem</string>
+ <string>debugger-enable-breakpoints</string>
+ <string>build-and-go</string>
+ <string>com.apple.ide.PBXToolbarStopButton</string>
+ <string>debugger-restart-executable</string>
+ <string>debugger-pause</string>
+ <string>debugger-step-over</string>
+ <string>debugger-step-into</string>
+ <string>debugger-step-out</string>
+ <string>NSToolbarFlexibleSpaceItem</string>
+ <string>servicesModulebreakpoints</string>
+ <string>debugger-show-console-window</string>
+ </array>
+ <key>ControllerClassBaseName</key>
+ <string>PBXDebugSessionModule</string>
+ <key>IconName</key>
+ <string>DebugTabIcon</string>
+ <key>Identifier</key>
+ <string>perspective.debug</string>
+ <key>IsVertical</key>
+ <integer>1</integer>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CCC7628064C1048000F2A68</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Debugger Console</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 0}, {810, 0}}</string>
+ </dict>
+ <key>Module</key>
+ <string>PBXDebugCLIModule</string>
+ <key>Proportion</key>
+ <string>0%</string>
+ </dict>
+ <dict>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>Debugger</key>
+ <dict>
+ <key>HorizontalSplitView</key>
+ <dict>
+ <key>_collapsingFrameDimension</key>
+ <real>0.0</real>
+ <key>_indexOfCollapsedView</key>
+ <integer>0</integer>
+ <key>_percentageOfCollapsedView</key>
+ <real>0.0</real>
+ <key>isCollapsed</key>
+ <string>yes</string>
+ <key>sizes</key>
+ <array>
+ <string>{{0, 0}, {395, 213}}</string>
+ <string>{{395, 0}, {415, 213}}</string>
+ </array>
+ </dict>
+ <key>VerticalSplitView</key>
+ <dict>
+ <key>_collapsingFrameDimension</key>
+ <real>0.0</real>
+ <key>_indexOfCollapsedView</key>
+ <integer>0</integer>
+ <key>_percentageOfCollapsedView</key>
+ <real>0.0</real>
+ <key>isCollapsed</key>
+ <string>yes</string>
+ <key>sizes</key>
+ <array>
+ <string>{{0, 0}, {810, 213}}</string>
+ <string>{{0, 213}, {810, 225}}</string>
+ </array>
+ </dict>
+ </dict>
+ <key>LauncherConfigVersion</key>
+ <string>8</string>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CCC7629064C1048000F2A68</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Debug</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>DebugConsoleDrawerSize</key>
+ <string>{100, 120}</string>
+ <key>DebugConsoleVisible</key>
+ <string>None</string>
+ <key>DebugConsoleWindowFrame</key>
+ <string>{{200, 200}, {500, 300}}</string>
+ <key>DebugSTDIOWindowFrame</key>
+ <string>{{200, 200}, {500, 300}}</string>
+ <key>Frame</key>
+ <string>{{0, 7}, {810, 438}}</string>
+ </dict>
+ <key>Module</key>
+ <string>PBXDebugSessionModule</string>
+ <key>Proportion</key>
+ <string>443pt</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Debug</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>XCModuleDock</string>
+ <string>XCModuleDock</string>
+ <string>PBXDebugCLIModule</string>
+ <string>PBXDebugSessionModule</string>
+ <string>XCConsole</string>
+ </array>
+ <key>TableOfContents</key>
+ <array>
+ <string>1CC8E6A5069209BD00BB180A</string>
+ <string>1CC8E6A6069209BD00BB180A</string>
+ <string>1CCC7628064C1048000F2A68</string>
+ <string>1CCC7629064C1048000F2A68</string>
+ <string>1CC8E6A7069209BD00BB180A</string>
+ </array>
+ <key>ToolbarConfiguration</key>
+ <string>xcode.toolbar.config.debugV3</string>
+ </dict>
+ </array>
+ <key>PerspectivesBarVisible</key>
+ <true/>
+ <key>ShelfIsVisible</key>
+ <false/>
+ <key>SourceDescription</key>
+ <string>file at '/Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources/XCPerspectivesSpecification.xcperspec'</string>
+ <key>StatusbarIsVisible</key>
+ <true/>
+ <key>TimeStamp</key>
+ <real>557696421.06510198</real>
+ <key>ToolbarConfigUserDefaultsMinorVersion</key>
+ <string>2</string>
+ <key>ToolbarDisplayMode</key>
+ <integer>1</integer>
+ <key>ToolbarIsVisible</key>
+ <true/>
+ <key>ToolbarSizeMode</key>
+ <integer>2</integer>
+ <key>Type</key>
+ <string>Perspectives</string>
+ <key>UpdateMessage</key>
+ <string></string>
+ <key>WindowJustification</key>
+ <integer>5</integer>
+ <key>WindowOrderList</key>
+ <array>
+ <string>/Users/christopherjohnson/Desktop/MacAU/Ditherbox/Ditherbox.xcodeproj</string>
+ </array>
+ <key>WindowString</key>
+ <string>468 237 810 487 0 0 1440 878 </string>
+ <key>WindowToolsV3</key>
+ <array>
+ <dict>
+ <key>Identifier</key>
+ <string>windowTool.debugger</string>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>Debugger</key>
+ <dict>
+ <key>HorizontalSplitView</key>
+ <dict>
+ <key>_collapsingFrameDimension</key>
+ <real>0.0</real>
+ <key>_indexOfCollapsedView</key>
+ <integer>0</integer>
+ <key>_percentageOfCollapsedView</key>
+ <real>0.0</real>
+ <key>isCollapsed</key>
+ <string>yes</string>
+ <key>sizes</key>
+ <array>
+ <string>{{0, 0}, {317, 164}}</string>
+ <string>{{317, 0}, {377, 164}}</string>
+ </array>
+ </dict>
+ <key>VerticalSplitView</key>
+ <dict>
+ <key>_collapsingFrameDimension</key>
+ <real>0.0</real>
+ <key>_indexOfCollapsedView</key>
+ <integer>0</integer>
+ <key>_percentageOfCollapsedView</key>
+ <real>0.0</real>
+ <key>isCollapsed</key>
+ <string>yes</string>
+ <key>sizes</key>
+ <array>
+ <string>{{0, 0}, {694, 164}}</string>
+ <string>{{0, 164}, {694, 216}}</string>
+ </array>
+ </dict>
+ </dict>
+ <key>LauncherConfigVersion</key>
+ <string>8</string>
+ <key>PBXProjectModuleGUID</key>
+ <string>1C162984064C10D400B95A72</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Debug - GLUTExamples (Underwater)</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>DebugConsoleDrawerSize</key>
+ <string>{100, 120}</string>
+ <key>DebugConsoleVisible</key>
+ <string>None</string>
+ <key>DebugConsoleWindowFrame</key>
+ <string>{{200, 200}, {500, 300}}</string>
+ <key>DebugSTDIOWindowFrame</key>
+ <string>{{200, 200}, {500, 300}}</string>
+ <key>Frame</key>
+ <string>{{0, 0}, {694, 380}}</string>
+ <key>RubberWindowFrame</key>
+ <string>321 238 694 422 0 0 1440 878 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXDebugSessionModule</string>
+ <key>Proportion</key>
+ <string>100%</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>100%</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Debugger</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>PBXDebugSessionModule</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <integer>1</integer>
+ <key>TableOfContents</key>
+ <array>
+ <string>1CD10A99069EF8BA00B06720</string>
+ <string>1C0AD2AB069F1E9B00FABCE6</string>
+ <string>1C162984064C10D400B95A72</string>
+ <string>1C0AD2AC069F1E9B00FABCE6</string>
+ </array>
+ <key>ToolbarConfiguration</key>
+ <string>xcode.toolbar.config.debugV3</string>
+ <key>WindowString</key>
+ <string>321 238 694 422 0 0 1440 878 </string>
+ <key>WindowToolGUID</key>
+ <string>1CD10A99069EF8BA00B06720</string>
+ <key>WindowToolIsVisible</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>Identifier</key>
+ <string>windowTool.build</string>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CD0528F0623707200166675</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>&lt;No Editor&gt;</string>
+ <key>PBXSplitModuleInNavigatorKey</key>
+ <dict>
+ <key>Split0</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CD052900623707200166675</string>
+ </dict>
+ <key>SplitCount</key>
+ <string>1</string>
+ </dict>
+ <key>StatusBarVisibility</key>
+ <integer>1</integer>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 0}, {500, 215}}</string>
+ <key>RubberWindowFrame</key>
+ <string>192 257 500 500 0 0 1280 1002 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXNavigatorGroup</string>
+ <key>Proportion</key>
+ <string>218pt</string>
+ </dict>
+ <dict>
+ <key>BecomeActive</key>
+ <integer>1</integer>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>XCMainBuildResultsModuleGUID</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Build Results</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 222}, {500, 236}}</string>
+ <key>RubberWindowFrame</key>
+ <string>192 257 500 500 0 0 1280 1002 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXBuildResultsModule</string>
+ <key>Proportion</key>
+ <string>236pt</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>458pt</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Build Results</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>PBXBuildResultsModule</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <integer>1</integer>
+ <key>TableOfContents</key>
+ <array>
+ <string>1C78EAA5065D492600B07095</string>
+ <string>1C78EAA6065D492600B07095</string>
+ <string>1CD0528F0623707200166675</string>
+ <string>XCMainBuildResultsModuleGUID</string>
+ </array>
+ <key>ToolbarConfiguration</key>
+ <string>xcode.toolbar.config.buildV3</string>
+ <key>WindowString</key>
+ <string>192 257 500 500 0 0 1280 1002 </string>
+ </dict>
+ <dict>
+ <key>Identifier</key>
+ <string>windowTool.find</string>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CDD528C0622207200134675</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>&lt;No Editor&gt;</string>
+ <key>PBXSplitModuleInNavigatorKey</key>
+ <dict>
+ <key>Split0</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CD0528D0623707200166675</string>
+ </dict>
+ <key>SplitCount</key>
+ <string>1</string>
+ </dict>
+ <key>StatusBarVisibility</key>
+ <integer>1</integer>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 0}, {781, 167}}</string>
+ <key>RubberWindowFrame</key>
+ <string>62 385 781 470 0 0 1440 878 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXNavigatorGroup</string>
+ <key>Proportion</key>
+ <string>781pt</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>50%</string>
+ </dict>
+ <dict>
+ <key>BecomeActive</key>
+ <integer>1</integer>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CD0528E0623707200166675</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Project Find</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{8, 0}, {773, 254}}</string>
+ <key>RubberWindowFrame</key>
+ <string>62 385 781 470 0 0 1440 878 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXProjectFindModule</string>
+ <key>Proportion</key>
+ <string>50%</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>428pt</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Project Find</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>PBXProjectFindModule</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <integer>1</integer>
+ <key>TableOfContents</key>
+ <array>
+ <string>1C530D57069F1CE1000CFCEE</string>
+ <string>1C530D58069F1CE1000CFCEE</string>
+ <string>1C530D59069F1CE1000CFCEE</string>
+ <string>1CDD528C0622207200134675</string>
+ <string>1C530D5A069F1CE1000CFCEE</string>
+ <string>1CE0B1FE06471DED0097A5F4</string>
+ <string>1CD0528E0623707200166675</string>
+ </array>
+ <key>WindowString</key>
+ <string>62 385 781 470 0 0 1440 878 </string>
+ <key>WindowToolGUID</key>
+ <string>1C530D57069F1CE1000CFCEE</string>
+ <key>WindowToolIsVisible</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>Identifier</key>
+ <string>windowTool.snapshots</string>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>Module</key>
+ <string>XCSnapshotModule</string>
+ <key>Proportion</key>
+ <string>100%</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>100%</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Snapshots</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>XCSnapshotModule</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <string>Yes</string>
+ <key>ToolbarConfiguration</key>
+ <string>xcode.toolbar.config.snapshots</string>
+ <key>WindowString</key>
+ <string>315 824 300 550 0 0 1440 878 </string>
+ <key>WindowToolIsVisible</key>
+ <string>Yes</string>
+ </dict>
+ <dict>
+ <key>Identifier</key>
+ <string>windowTool.debuggerConsole</string>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>BecomeActive</key>
+ <integer>1</integer>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1C78EAAC065D492600B07095</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Debugger Console</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 0}, {700, 358}}</string>
+ <key>RubberWindowFrame</key>
+ <string>149 87 700 400 0 0 1440 878 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXDebugCLIModule</string>
+ <key>Proportion</key>
+ <string>358pt</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>358pt</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Debugger Console</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>PBXDebugCLIModule</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <integer>1</integer>
+ <key>TableOfContents</key>
+ <array>
+ <string>1C530D5B069F1CE1000CFCEE</string>
+ <string>1C530D5C069F1CE1000CFCEE</string>
+ <string>1C78EAAC065D492600B07095</string>
+ </array>
+ <key>ToolbarConfiguration</key>
+ <string>xcode.toolbar.config.consoleV3</string>
+ <key>WindowString</key>
+ <string>149 87 440 400 0 0 1440 878 </string>
+ <key>WindowToolGUID</key>
+ <string>1C530D5B069F1CE1000CFCEE</string>
+ <key>WindowToolIsVisible</key>
+ <integer>0</integer>
+ </dict>
+ <dict>
+ <key>Identifier</key>
+ <string>windowTool.scm</string>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1C78EAB2065D492600B07095</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>&lt;No Editor&gt;</string>
+ <key>PBXSplitModuleInNavigatorKey</key>
+ <dict>
+ <key>Split0</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1C78EAB3065D492600B07095</string>
+ </dict>
+ <key>SplitCount</key>
+ <string>1</string>
+ </dict>
+ <key>StatusBarVisibility</key>
+ <integer>1</integer>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 0}, {452, 0}}</string>
+ <key>RubberWindowFrame</key>
+ <string>743 379 452 308 0 0 1280 1002 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXNavigatorGroup</string>
+ <key>Proportion</key>
+ <string>0pt</string>
+ </dict>
+ <dict>
+ <key>BecomeActive</key>
+ <integer>1</integer>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CD052920623707200166675</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>SCM</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>ConsoleFrame</key>
+ <string>{{0, 259}, {452, 0}}</string>
+ <key>Frame</key>
+ <string>{{0, 7}, {452, 259}}</string>
+ <key>RubberWindowFrame</key>
+ <string>743 379 452 308 0 0 1280 1002 </string>
+ <key>TableConfiguration</key>
+ <array>
+ <string>Status</string>
+ <real>30</real>
+ <string>FileName</string>
+ <real>199</real>
+ <string>Path</string>
+ <real>197.09500122070312</real>
+ </array>
+ <key>TableFrame</key>
+ <string>{{0, 0}, {452, 250}}</string>
+ </dict>
+ <key>Module</key>
+ <string>PBXCVSModule</string>
+ <key>Proportion</key>
+ <string>262pt</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>266pt</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>SCM</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>PBXCVSModule</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <integer>1</integer>
+ <key>TableOfContents</key>
+ <array>
+ <string>1C78EAB4065D492600B07095</string>
+ <string>1C78EAB5065D492600B07095</string>
+ <string>1C78EAB2065D492600B07095</string>
+ <string>1CD052920623707200166675</string>
+ </array>
+ <key>ToolbarConfiguration</key>
+ <string>xcode.toolbar.config.scmV3</string>
+ <key>WindowString</key>
+ <string>743 379 452 308 0 0 1280 1002 </string>
+ </dict>
+ <dict>
+ <key>Identifier</key>
+ <string>windowTool.breakpoints</string>
+ <key>IsVertical</key>
+ <integer>0</integer>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>BecomeActive</key>
+ <integer>1</integer>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXBottomSmartGroupGIDs</key>
+ <array>
+ <string>1C77FABC04509CD000000102</string>
+ </array>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CE0B1FE06471DED0097A5F4</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Files</string>
+ <key>PBXProjectStructureProvided</key>
+ <string>no</string>
+ <key>PBXSmartGroupTreeModuleColumnData</key>
+ <dict>
+ <key>PBXSmartGroupTreeModuleColumnWidthsKey</key>
+ <array>
+ <real>168</real>
+ </array>
+ <key>PBXSmartGroupTreeModuleColumnsKey_v4</key>
+ <array>
+ <string>MainColumn</string>
+ </array>
+ </dict>
+ <key>PBXSmartGroupTreeModuleOutlineStateKey_v7</key>
+ <dict>
+ <key>PBXSmartGroupTreeModuleOutlineStateExpansionKey</key>
+ <array>
+ <string>1C77FABC04509CD000000102</string>
+ </array>
+ <key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>
+ <array>
+ <array>
+ <integer>0</integer>
+ </array>
+ </array>
+ <key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key>
+ <string>{{0, 0}, {168, 350}}</string>
+ </dict>
+ <key>PBXTopSmartGroupGIDs</key>
+ <array/>
+ <key>XCIncludePerspectivesSwitch</key>
+ <integer>0</integer>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{0, 0}, {185, 368}}</string>
+ <key>GroupTreeTableConfiguration</key>
+ <array>
+ <string>MainColumn</string>
+ <real>168</real>
+ </array>
+ <key>RubberWindowFrame</key>
+ <string>315 424 744 409 0 0 1440 878 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXSmartGroupTreeModule</string>
+ <key>Proportion</key>
+ <string>185pt</string>
+ </dict>
+ <dict>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CA1AED706398EBD00589147</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Detail</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{{190, 0}, {554, 368}}</string>
+ <key>RubberWindowFrame</key>
+ <string>315 424 744 409 0 0 1440 878 </string>
+ </dict>
+ <key>Module</key>
+ <string>XCDetailModule</string>
+ <key>Proportion</key>
+ <string>554pt</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>368pt</string>
+ </dict>
+ </array>
+ <key>MajorVersion</key>
+ <integer>3</integer>
+ <key>MinorVersion</key>
+ <integer>0</integer>
+ <key>Name</key>
+ <string>Breakpoints</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>PBXSmartGroupTreeModule</string>
+ <string>XCDetailModule</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <integer>1</integer>
+ <key>TableOfContents</key>
+ <array>
+ <string>1CDDB66807F98D9800BB5817</string>
+ <string>1CDDB66907F98D9800BB5817</string>
+ <string>1CE0B1FE06471DED0097A5F4</string>
+ <string>1CA1AED706398EBD00589147</string>
+ </array>
+ <key>ToolbarConfiguration</key>
+ <string>xcode.toolbar.config.breakpointsV3</string>
+ <key>WindowString</key>
+ <string>315 424 744 409 0 0 1440 878 </string>
+ <key>WindowToolGUID</key>
+ <string>1CDDB66807F98D9800BB5817</string>
+ <key>WindowToolIsVisible</key>
+ <integer>1</integer>
+ </dict>
+ <dict>
+ <key>Identifier</key>
+ <string>windowTool.debugAnimator</string>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>Module</key>
+ <string>PBXNavigatorGroup</string>
+ <key>Proportion</key>
+ <string>100%</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>100%</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Debug Visualizer</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>PBXNavigatorGroup</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <integer>1</integer>
+ <key>ToolbarConfiguration</key>
+ <string>xcode.toolbar.config.debugAnimatorV3</string>
+ <key>WindowString</key>
+ <string>100 100 700 500 0 0 1280 1002 </string>
+ </dict>
+ <dict>
+ <key>Identifier</key>
+ <string>windowTool.bookmarks</string>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>Module</key>
+ <string>PBXBookmarksModule</string>
+ <key>Proportion</key>
+ <string>166pt</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>166pt</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Bookmarks</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>PBXBookmarksModule</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <integer>0</integer>
+ <key>WindowString</key>
+ <string>538 42 401 187 0 0 1280 1002 </string>
+ </dict>
+ <dict>
+ <key>Identifier</key>
+ <string>windowTool.projectFormatConflicts</string>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>Module</key>
+ <string>XCProjectFormatConflictsModule</string>
+ <key>Proportion</key>
+ <string>100%</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>100%</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Project Format Conflicts</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>XCProjectFormatConflictsModule</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <integer>0</integer>
+ <key>WindowContentMinSize</key>
+ <string>450 300</string>
+ <key>WindowString</key>
+ <string>50 850 472 307 0 0 1440 877</string>
+ </dict>
+ <dict>
+ <key>Identifier</key>
+ <string>windowTool.classBrowser</string>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>BecomeActive</key>
+ <integer>1</integer>
+ <key>ContentConfiguration</key>
+ <dict>
+ <key>OptionsSetName</key>
+ <string>Hierarchy, all classes</string>
+ <key>PBXProjectModuleGUID</key>
+ <string>1CA6456E063B45B4001379D8</string>
+ <key>PBXProjectModuleLabel</key>
+ <string>Class Browser - NSObject</string>
+ </dict>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>ClassesFrame</key>
+ <string>{{0, 0}, {369, 96}}</string>
+ <key>ClassesTreeTableConfiguration</key>
+ <array>
+ <string>PBXClassNameColumnIdentifier</string>
+ <real>208</real>
+ <string>PBXClassBookColumnIdentifier</string>
+ <real>22</real>
+ </array>
+ <key>Frame</key>
+ <string>{{0, 0}, {616, 353}}</string>
+ <key>MembersFrame</key>
+ <string>{{0, 105}, {369, 395}}</string>
+ <key>MembersTreeTableConfiguration</key>
+ <array>
+ <string>PBXMemberTypeIconColumnIdentifier</string>
+ <real>22</real>
+ <string>PBXMemberNameColumnIdentifier</string>
+ <real>216</real>
+ <string>PBXMemberTypeColumnIdentifier</string>
+ <real>94</real>
+ <string>PBXMemberBookColumnIdentifier</string>
+ <real>22</real>
+ </array>
+ <key>PBXModuleWindowStatusBarHidden2</key>
+ <integer>1</integer>
+ <key>RubberWindowFrame</key>
+ <string>597 125 616 374 0 0 1280 1002 </string>
+ </dict>
+ <key>Module</key>
+ <string>PBXClassBrowserModule</string>
+ <key>Proportion</key>
+ <string>354pt</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>354pt</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Class Browser</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>PBXClassBrowserModule</string>
+ </array>
+ <key>StatusbarIsVisible</key>
+ <integer>0</integer>
+ <key>TableOfContents</key>
+ <array>
+ <string>1C78EABA065D492600B07095</string>
+ <string>1C78EABB065D492600B07095</string>
+ <string>1CA6456E063B45B4001379D8</string>
+ </array>
+ <key>ToolbarConfiguration</key>
+ <string>xcode.toolbar.config.classbrowser</string>
+ <key>WindowString</key>
+ <string>597 125 616 374 0 0 1280 1002 </string>
+ </dict>
+ <dict>
+ <key>Identifier</key>
+ <string>windowTool.refactoring</string>
+ <key>IncludeInToolsMenu</key>
+ <integer>0</integer>
+ <key>Layout</key>
+ <array>
+ <dict>
+ <key>Dock</key>
+ <array>
+ <dict>
+ <key>BecomeActive</key>
+ <integer>1</integer>
+ <key>GeometryConfiguration</key>
+ <dict>
+ <key>Frame</key>
+ <string>{0, 0}, {500, 335}</string>
+ <key>RubberWindowFrame</key>
+ <string>{0, 0}, {500, 335}</string>
+ </dict>
+ <key>Module</key>
+ <string>XCRefactoringModule</string>
+ <key>Proportion</key>
+ <string>100%</string>
+ </dict>
+ </array>
+ <key>Proportion</key>
+ <string>100%</string>
+ </dict>
+ </array>
+ <key>Name</key>
+ <string>Refactoring</string>
+ <key>ServiceClasses</key>
+ <array>
+ <string>XCRefactoringModule</string>
+ </array>
+ <key>WindowString</key>
+ <string>200 200 500 356 0 0 1920 1200 </string>
+ </dict>
+ </array>
+</dict>
+</plist>
diff --git a/plugins/MacAU/Distance2/Ditherbox/Ditherbox.xcodeproj/project.pbxproj b/plugins/MacAU/Distance2/Ditherbox/Ditherbox.xcodeproj/project.pbxproj
new file mode 100755
index 0000000..ec1b96c
--- /dev/null
+++ b/plugins/MacAU/Distance2/Ditherbox/Ditherbox.xcodeproj/project.pbxproj
@@ -0,0 +1,490 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 45;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 3EEA126E089847F5002C6BFC /* CAVectorUnit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3EEA126B089847F5002C6BFC /* CAVectorUnit.cpp */; };
+ 3EEA126F089847F5002C6BFC /* CAVectorUnit.h in Headers */ = {isa = PBXBuildFile; fileRef = 3EEA126C089847F5002C6BFC /* CAVectorUnit.h */; };
+ 3EEA1270089847F5002C6BFC /* CAVectorUnitTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = 3EEA126D089847F5002C6BFC /* CAVectorUnitTypes.h */; };
+ 8B4119B70749654200361ABE /* Ditherbox.r in Rez */ = {isa = PBXBuildFile; fileRef = 8BA05A680720730100365D66 /* Ditherbox.r */; };
+ 8BA05A6B0720730100365D66 /* Ditherbox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8BA05A660720730100365D66 /* Ditherbox.cpp */; };
+ 8BA05A6E0720730100365D66 /* DitherboxVersion.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BA05A690720730100365D66 /* DitherboxVersion.h */; };
+ 8BA05AAE072073D300365D66 /* AUBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8BA05A7F072073D200365D66 /* AUBase.cpp */; };
+ 8BA05AAF072073D300365D66 /* AUBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BA05A80072073D200365D66 /* AUBase.h */; };
+ 8BA05AB0072073D300365D66 /* AUDispatch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8BA05A81072073D200365D66 /* AUDispatch.cpp */; };
+ 8BA05AB1072073D300365D66 /* AUDispatch.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BA05A82072073D200365D66 /* AUDispatch.h */; };
+ 8BA05AB2072073D300365D66 /* AUInputElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8BA05A83072073D200365D66 /* AUInputElement.cpp */; };
+ 8BA05AB3072073D300365D66 /* AUInputElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BA05A84072073D200365D66 /* AUInputElement.h */; };
+ 8BA05AB4072073D300365D66 /* AUOutputElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8BA05A85072073D200365D66 /* AUOutputElement.cpp */; };
+ 8BA05AB5072073D300365D66 /* AUOutputElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BA05A86072073D200365D66 /* AUOutputElement.h */; };
+ 8BA05AB7072073D300365D66 /* AUScopeElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8BA05A88072073D200365D66 /* AUScopeElement.cpp */; };
+ 8BA05AB8072073D300365D66 /* AUScopeElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BA05A89072073D200365D66 /* AUScopeElement.h */; };
+ 8BA05AB9072073D300365D66 /* ComponentBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8BA05A8A072073D200365D66 /* ComponentBase.cpp */; };
+ 8BA05ABA072073D300365D66 /* ComponentBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BA05A8B072073D200365D66 /* ComponentBase.h */; };
+ 8BA05AC6072073D300365D66 /* AUEffectBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8BA05A9A072073D200365D66 /* AUEffectBase.cpp */; };
+ 8BA05AC7072073D300365D66 /* AUEffectBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BA05A9B072073D200365D66 /* AUEffectBase.h */; };
+ 8BA05AD2072073D300365D66 /* AUBuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8BA05AA7072073D200365D66 /* AUBuffer.cpp */; };
+ 8BA05AD3072073D300365D66 /* AUBuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BA05AA8072073D200365D66 /* AUBuffer.h */; };
+ 8BA05AD4072073D300365D66 /* AUDebugDispatcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8BA05AA9072073D200365D66 /* AUDebugDispatcher.cpp */; };
+ 8BA05AD5072073D300365D66 /* AUDebugDispatcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BA05AAA072073D200365D66 /* AUDebugDispatcher.h */; };
+ 8BA05AD6072073D300365D66 /* AUInputFormatConverter.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BA05AAB072073D200365D66 /* AUInputFormatConverter.h */; };
+ 8BA05AD7072073D300365D66 /* AUSilentTimeout.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BA05AAC072073D200365D66 /* AUSilentTimeout.h */; };
+ 8BA05AD8072073D300365D66 /* AUTimestampGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BA05AAD072073D200365D66 /* AUTimestampGenerator.h */; };
+ 8BA05AE50720742100365D66 /* CAAudioChannelLayout.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8BA05ADF0720742100365D66 /* CAAudioChannelLayout.cpp */; };
+ 8BA05AE60720742100365D66 /* CAAudioChannelLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BA05AE00720742100365D66 /* CAAudioChannelLayout.h */; };
+ 8BA05AE70720742100365D66 /* CAMutex.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8BA05AE10720742100365D66 /* CAMutex.cpp */; };
+ 8BA05AE80720742100365D66 /* CAMutex.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BA05AE20720742100365D66 /* CAMutex.h */; };
+ 8BA05AE90720742100365D66 /* CAStreamBasicDescription.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8BA05AE30720742100365D66 /* CAStreamBasicDescription.cpp */; };
+ 8BA05AEA0720742100365D66 /* CAStreamBasicDescription.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BA05AE40720742100365D66 /* CAStreamBasicDescription.h */; };
+ 8BA05AFC072074E100365D66 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BA05AF9072074E100365D66 /* AudioToolbox.framework */; };
+ 8BA05AFD072074E100365D66 /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BA05AFA072074E100365D66 /* AudioUnit.framework */; };
+ 8BA05B02072074F900365D66 /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BA05B01072074F900365D66 /* CoreServices.framework */; };
+ 8BA05B070720754400365D66 /* CAAUParameter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8BA05B050720754400365D66 /* CAAUParameter.cpp */; };
+ 8BA05B080720754400365D66 /* CAAUParameter.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BA05B060720754400365D66 /* CAAUParameter.h */; };
+ 8BC6025C073B072D006C4272 /* Ditherbox.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BC6025B073B072D006C4272 /* Ditherbox.h */; };
+ 8D01CCCA0486CAD60068D4B7 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C167DFE841241C02AAC07 /* InfoPlist.strings */; };
+ F7C347F00ECE5AF8008ADFB6 /* AUBaseHelper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F7C347EE0ECE5AF8008ADFB6 /* AUBaseHelper.cpp */; };
+ F7C347F10ECE5AF8008ADFB6 /* AUBaseHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = F7C347EF0ECE5AF8008ADFB6 /* AUBaseHelper.h */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ 089C167EFE841241C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+ 3EEA126B089847F5002C6BFC /* CAVectorUnit.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = CAVectorUnit.cpp; sourceTree = "<group>"; };
+ 3EEA126C089847F5002C6BFC /* CAVectorUnit.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CAVectorUnit.h; sourceTree = "<group>"; };
+ 3EEA126D089847F5002C6BFC /* CAVectorUnitTypes.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CAVectorUnitTypes.h; sourceTree = "<group>"; };
+ 8B5C7FBF076FB2C200A15F61 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = /System/Library/Frameworks/CoreAudio.framework; sourceTree = "<absolute>"; };
+ 8BA05A660720730100365D66 /* Ditherbox.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = Ditherbox.cpp; sourceTree = "<group>"; };
+ 8BA05A670720730100365D66 /* Ditherbox.exp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.exports; path = Ditherbox.exp; sourceTree = "<group>"; };
+ 8BA05A680720730100365D66 /* Ditherbox.r */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.rez; path = Ditherbox.r; sourceTree = "<group>"; };
+ 8BA05A690720730100365D66 /* DitherboxVersion.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = DitherboxVersion.h; sourceTree = "<group>"; };
+ 8BA05A7F072073D200365D66 /* AUBase.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = AUBase.cpp; sourceTree = "<group>"; };
+ 8BA05A80072073D200365D66 /* AUBase.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AUBase.h; sourceTree = "<group>"; };
+ 8BA05A81072073D200365D66 /* AUDispatch.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = AUDispatch.cpp; sourceTree = "<group>"; };
+ 8BA05A82072073D200365D66 /* AUDispatch.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AUDispatch.h; sourceTree = "<group>"; };
+ 8BA05A83072073D200365D66 /* AUInputElement.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = AUInputElement.cpp; sourceTree = "<group>"; };
+ 8BA05A84072073D200365D66 /* AUInputElement.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AUInputElement.h; sourceTree = "<group>"; };
+ 8BA05A85072073D200365D66 /* AUOutputElement.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = AUOutputElement.cpp; sourceTree = "<group>"; };
+ 8BA05A86072073D200365D66 /* AUOutputElement.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AUOutputElement.h; sourceTree = "<group>"; };
+ 8BA05A87072073D200365D66 /* AUResources.r */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.rez; path = AUResources.r; sourceTree = "<group>"; };
+ 8BA05A88072073D200365D66 /* AUScopeElement.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = AUScopeElement.cpp; sourceTree = "<group>"; };
+ 8BA05A89072073D200365D66 /* AUScopeElement.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AUScopeElement.h; sourceTree = "<group>"; };
+ 8BA05A8A072073D200365D66 /* ComponentBase.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = ComponentBase.cpp; sourceTree = "<group>"; };
+ 8BA05A8B072073D200365D66 /* ComponentBase.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ComponentBase.h; sourceTree = "<group>"; };
+ 8BA05A9A072073D200365D66 /* AUEffectBase.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = AUEffectBase.cpp; sourceTree = "<group>"; };
+ 8BA05A9B072073D200365D66 /* AUEffectBase.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AUEffectBase.h; sourceTree = "<group>"; };
+ 8BA05AA7072073D200365D66 /* AUBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = AUBuffer.cpp; sourceTree = "<group>"; };
+ 8BA05AA8072073D200365D66 /* AUBuffer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AUBuffer.h; sourceTree = "<group>"; };
+ 8BA05AA9072073D200365D66 /* AUDebugDispatcher.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = AUDebugDispatcher.cpp; sourceTree = "<group>"; };
+ 8BA05AAA072073D200365D66 /* AUDebugDispatcher.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AUDebugDispatcher.h; sourceTree = "<group>"; };
+ 8BA05AAB072073D200365D66 /* AUInputFormatConverter.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AUInputFormatConverter.h; sourceTree = "<group>"; };
+ 8BA05AAC072073D200365D66 /* AUSilentTimeout.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AUSilentTimeout.h; sourceTree = "<group>"; };
+ 8BA05AAD072073D200365D66 /* AUTimestampGenerator.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AUTimestampGenerator.h; sourceTree = "<group>"; };
+ 8BA05ADF0720742100365D66 /* CAAudioChannelLayout.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = CAAudioChannelLayout.cpp; sourceTree = "<group>"; };
+ 8BA05AE00720742100365D66 /* CAAudioChannelLayout.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CAAudioChannelLayout.h; sourceTree = "<group>"; };
+ 8BA05AE10720742100365D66 /* CAMutex.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = CAMutex.cpp; sourceTree = "<group>"; };
+ 8BA05AE20720742100365D66 /* CAMutex.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CAMutex.h; sourceTree = "<group>"; };
+ 8BA05AE30720742100365D66 /* CAStreamBasicDescription.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = CAStreamBasicDescription.cpp; sourceTree = "<group>"; };
+ 8BA05AE40720742100365D66 /* CAStreamBasicDescription.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CAStreamBasicDescription.h; sourceTree = "<group>"; };
+ 8BA05AF9072074E100365D66 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = /System/Library/Frameworks/AudioToolbox.framework; sourceTree = "<absolute>"; };
+ 8BA05AFA072074E100365D66 /* AudioUnit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = /System/Library/Frameworks/AudioUnit.framework; sourceTree = "<absolute>"; };
+ 8BA05B01072074F900365D66 /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = /System/Library/Frameworks/CoreServices.framework; sourceTree = "<absolute>"; };
+ 8BA05B050720754400365D66 /* CAAUParameter.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = CAAUParameter.cpp; sourceTree = "<group>"; };
+ 8BA05B060720754400365D66 /* CAAUParameter.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CAAUParameter.h; sourceTree = "<group>"; };
+ 8BC6025B073B072D006C4272 /* Ditherbox.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = Ditherbox.h; sourceTree = "<group>"; };
+ 8D01CCD10486CAD60068D4B7 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
+ 8D01CCD20486CAD60068D4B7 /* Ditherbox.component */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Ditherbox.component; sourceTree = BUILT_PRODUCTS_DIR; };
+ F7C347EE0ECE5AF8008ADFB6 /* AUBaseHelper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AUBaseHelper.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/Utility/AUBaseHelper.cpp; sourceTree = SYSTEM_DEVELOPER_DIR; };
+ F7C347EF0ECE5AF8008ADFB6 /* AUBaseHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AUBaseHelper.h; path = Extras/CoreAudio/AudioUnits/AUPublic/Utility/AUBaseHelper.h; sourceTree = SYSTEM_DEVELOPER_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 8D01CCCD0486CAD60068D4B7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 8BA05AFC072074E100365D66 /* AudioToolbox.framework in Frameworks */,
+ 8BA05AFD072074E100365D66 /* AudioUnit.framework in Frameworks */,
+ 8BA05B02072074F900365D66 /* CoreServices.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 089C166AFE841209C02AAC07 /* Ditherbox */ = {
+ isa = PBXGroup;
+ children = (
+ 08FB77ADFE841716C02AAC07 /* Source */,
+ 089C167CFE841241C02AAC07 /* Resources */,
+ 089C1671FE841209C02AAC07 /* External Frameworks and Libraries */,
+ 19C28FB4FE9D528D11CA2CBB /* Products */,
+ );
+ name = Ditherbox;
+ sourceTree = "<group>";
+ };
+ 089C1671FE841209C02AAC07 /* External Frameworks and Libraries */ = {
+ isa = PBXGroup;
+ children = (
+ 8B5C7FBF076FB2C200A15F61 /* CoreAudio.framework */,
+ 8BA05B01072074F900365D66 /* CoreServices.framework */,
+ 8BA05AF9072074E100365D66 /* AudioToolbox.framework */,
+ 8BA05AFA072074E100365D66 /* AudioUnit.framework */,
+ );
+ name = "External Frameworks and Libraries";
+ sourceTree = "<group>";
+ };
+ 089C167CFE841241C02AAC07 /* Resources */ = {
+ isa = PBXGroup;
+ children = (
+ 8D01CCD10486CAD60068D4B7 /* Info.plist */,
+ 089C167DFE841241C02AAC07 /* InfoPlist.strings */,
+ );
+ name = Resources;
+ sourceTree = "<group>";
+ };
+ 08FB77ADFE841716C02AAC07 /* Source */ = {
+ isa = PBXGroup;
+ children = (
+ 8BA05A56072072A900365D66 /* AU Source */,
+ 8BA05AEB0720742700365D66 /* PublicUtility */,
+ 8BA05A7D072073D200365D66 /* AUPublic */,
+ );
+ name = Source;
+ sourceTree = "<group>";
+ };
+ 19C28FB4FE9D528D11CA2CBB /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 8D01CCD20486CAD60068D4B7 /* Ditherbox.component */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 8BA05A56072072A900365D66 /* AU Source */ = {
+ isa = PBXGroup;
+ children = (
+ 8BC6025B073B072D006C4272 /* Ditherbox.h */,
+ 8BA05A660720730100365D66 /* Ditherbox.cpp */,
+ 8BA05A670720730100365D66 /* Ditherbox.exp */,
+ 8BA05A680720730100365D66 /* Ditherbox.r */,
+ 8BA05A690720730100365D66 /* DitherboxVersion.h */,
+ );
+ name = "AU Source";
+ sourceTree = "<group>";
+ };
+ 8BA05A7D072073D200365D66 /* AUPublic */ = {
+ isa = PBXGroup;
+ children = (
+ 8BA05A7E072073D200365D66 /* AUBase */,
+ 8BA05A99072073D200365D66 /* OtherBases */,
+ 8BA05AA6072073D200365D66 /* Utility */,
+ );
+ name = AUPublic;
+ path = Extras/CoreAudio/AudioUnits/AUPublic;
+ sourceTree = SYSTEM_DEVELOPER_DIR;
+ };
+ 8BA05A7E072073D200365D66 /* AUBase */ = {
+ isa = PBXGroup;
+ children = (
+ 8BA05A7F072073D200365D66 /* AUBase.cpp */,
+ 8BA05A80072073D200365D66 /* AUBase.h */,
+ 8BA05A81072073D200365D66 /* AUDispatch.cpp */,
+ 8BA05A82072073D200365D66 /* AUDispatch.h */,
+ 8BA05A83072073D200365D66 /* AUInputElement.cpp */,
+ 8BA05A84072073D200365D66 /* AUInputElement.h */,
+ 8BA05A85072073D200365D66 /* AUOutputElement.cpp */,
+ 8BA05A86072073D200365D66 /* AUOutputElement.h */,
+ 8BA05A87072073D200365D66 /* AUResources.r */,
+ 8BA05A88072073D200365D66 /* AUScopeElement.cpp */,
+ 8BA05A89072073D200365D66 /* AUScopeElement.h */,
+ 8BA05A8A072073D200365D66 /* ComponentBase.cpp */,
+ 8BA05A8B072073D200365D66 /* ComponentBase.h */,
+ );
+ path = AUBase;
+ sourceTree = "<group>";
+ };
+ 8BA05A99072073D200365D66 /* OtherBases */ = {
+ isa = PBXGroup;
+ children = (
+ 8BA05A9A072073D200365D66 /* AUEffectBase.cpp */,
+ 8BA05A9B072073D200365D66 /* AUEffectBase.h */,
+ );
+ path = OtherBases;
+ sourceTree = "<group>";
+ };
+ 8BA05AA6072073D200365D66 /* Utility */ = {
+ isa = PBXGroup;
+ children = (
+ F7C347EE0ECE5AF8008ADFB6 /* AUBaseHelper.cpp */,
+ F7C347EF0ECE5AF8008ADFB6 /* AUBaseHelper.h */,
+ 8BA05AA7072073D200365D66 /* AUBuffer.cpp */,
+ 8BA05AA8072073D200365D66 /* AUBuffer.h */,
+ 8BA05AA9072073D200365D66 /* AUDebugDispatcher.cpp */,
+ 8BA05AAA072073D200365D66 /* AUDebugDispatcher.h */,
+ 8BA05AAB072073D200365D66 /* AUInputFormatConverter.h */,
+ 8BA05AAC072073D200365D66 /* AUSilentTimeout.h */,
+ 8BA05AAD072073D200365D66 /* AUTimestampGenerator.h */,
+ );
+ path = Utility;
+ sourceTree = "<group>";
+ };
+ 8BA05AEB0720742700365D66 /* PublicUtility */ = {
+ isa = PBXGroup;
+ children = (
+ 8BA05B050720754400365D66 /* CAAUParameter.cpp */,
+ 8BA05B060720754400365D66 /* CAAUParameter.h */,
+ 8BA05ADF0720742100365D66 /* CAAudioChannelLayout.cpp */,
+ 8BA05AE00720742100365D66 /* CAAudioChannelLayout.h */,
+ 8BA05AE10720742100365D66 /* CAMutex.cpp */,
+ 8BA05AE20720742100365D66 /* CAMutex.h */,
+ 8BA05AE30720742100365D66 /* CAStreamBasicDescription.cpp */,
+ 8BA05AE40720742100365D66 /* CAStreamBasicDescription.h */,
+ 3EEA126D089847F5002C6BFC /* CAVectorUnitTypes.h */,
+ 3EEA126B089847F5002C6BFC /* CAVectorUnit.cpp */,
+ 3EEA126C089847F5002C6BFC /* CAVectorUnit.h */,
+ );
+ name = PublicUtility;
+ path = Extras/CoreAudio/PublicUtility;
+ sourceTree = SYSTEM_DEVELOPER_DIR;
+ };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+ 8D01CCC70486CAD60068D4B7 /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 8BA05A6E0720730100365D66 /* DitherboxVersion.h in Headers */,
+ 8BA05AAF072073D300365D66 /* AUBase.h in Headers */,
+ 8BA05AB1072073D300365D66 /* AUDispatch.h in Headers */,
+ 8BA05AB3072073D300365D66 /* AUInputElement.h in Headers */,
+ 8BA05AB5072073D300365D66 /* AUOutputElement.h in Headers */,
+ 8BA05AB8072073D300365D66 /* AUScopeElement.h in Headers */,
+ 8BA05ABA072073D300365D66 /* ComponentBase.h in Headers */,
+ 8BA05AC7072073D300365D66 /* AUEffectBase.h in Headers */,
+ 8BA05AD3072073D300365D66 /* AUBuffer.h in Headers */,
+ 8BA05AD5072073D300365D66 /* AUDebugDispatcher.h in Headers */,
+ 8BA05AD6072073D300365D66 /* AUInputFormatConverter.h in Headers */,
+ 8BA05AD7072073D300365D66 /* AUSilentTimeout.h in Headers */,
+ 8BA05AD8072073D300365D66 /* AUTimestampGenerator.h in Headers */,
+ 8BA05AE60720742100365D66 /* CAAudioChannelLayout.h in Headers */,
+ 8BA05AE80720742100365D66 /* CAMutex.h in Headers */,
+ 8BA05AEA0720742100365D66 /* CAStreamBasicDescription.h in Headers */,
+ 8BA05B080720754400365D66 /* CAAUParameter.h in Headers */,
+ 8BC6025C073B072D006C4272 /* Ditherbox.h in Headers */,
+ 3EEA126F089847F5002C6BFC /* CAVectorUnit.h in Headers */,
+ 3EEA1270089847F5002C6BFC /* CAVectorUnitTypes.h in Headers */,
+ F7C347F10ECE5AF8008ADFB6 /* AUBaseHelper.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+ 8D01CCC60486CAD60068D4B7 /* Ditherbox */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 3E4BA243089833B7007656EC /* Build configuration list for PBXNativeTarget "Ditherbox" */;
+ buildPhases = (
+ 8D01CCC70486CAD60068D4B7 /* Headers */,
+ 8D01CCC90486CAD60068D4B7 /* Resources */,
+ 8D01CCCB0486CAD60068D4B7 /* Sources */,
+ 8D01CCCD0486CAD60068D4B7 /* Frameworks */,
+ 8D01CCCF0486CAD60068D4B7 /* Rez */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = Ditherbox;
+ productInstallPath = "$(HOME)/Library/Bundles";
+ productName = Ditherbox;
+ productReference = 8D01CCD20486CAD60068D4B7 /* Ditherbox.component */;
+ productType = "com.apple.product-type.bundle";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 089C1669FE841209C02AAC07 /* Project object */ = {
+ isa = PBXProject;
+ buildConfigurationList = 3E4BA247089833B7007656EC /* Build configuration list for PBXProject "Ditherbox" */;
+ compatibilityVersion = "Xcode 3.1";
+ developmentRegion = English;
+ hasScannedForEncodings = 1;
+ knownRegions = (
+ English,
+ Japanese,
+ French,
+ German,
+ );
+ mainGroup = 089C166AFE841209C02AAC07 /* Ditherbox */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 8D01CCC60486CAD60068D4B7 /* Ditherbox */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 8D01CCC90486CAD60068D4B7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 8D01CCCA0486CAD60068D4B7 /* InfoPlist.strings in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXRezBuildPhase section */
+ 8D01CCCF0486CAD60068D4B7 /* Rez */ = {
+ isa = PBXRezBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 8B4119B70749654200361ABE /* Ditherbox.r in Rez */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXRezBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 8D01CCCB0486CAD60068D4B7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 8BA05A6B0720730100365D66 /* Ditherbox.cpp in Sources */,
+ 8BA05AAE072073D300365D66 /* AUBase.cpp in Sources */,
+ 8BA05AB0072073D300365D66 /* AUDispatch.cpp in Sources */,
+ 8BA05AB2072073D300365D66 /* AUInputElement.cpp in Sources */,
+ 8BA05AB4072073D300365D66 /* AUOutputElement.cpp in Sources */,
+ 8BA05AB7072073D300365D66 /* AUScopeElement.cpp in Sources */,
+ 8BA05AB9072073D300365D66 /* ComponentBase.cpp in Sources */,
+ 8BA05AC6072073D300365D66 /* AUEffectBase.cpp in Sources */,
+ 8BA05AD2072073D300365D66 /* AUBuffer.cpp in Sources */,
+ 8BA05AD4072073D300365D66 /* AUDebugDispatcher.cpp in Sources */,
+ 8BA05AE50720742100365D66 /* CAAudioChannelLayout.cpp in Sources */,
+ 8BA05AE70720742100365D66 /* CAMutex.cpp in Sources */,
+ 8BA05AE90720742100365D66 /* CAStreamBasicDescription.cpp in Sources */,
+ 8BA05B070720754400365D66 /* CAAUParameter.cpp in Sources */,
+ 3EEA126E089847F5002C6BFC /* CAVectorUnit.cpp in Sources */,
+ F7C347F00ECE5AF8008ADFB6 /* AUBaseHelper.cpp in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+ 089C167DFE841241C02AAC07 /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 089C167EFE841241C02AAC07 /* English */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "<group>";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 3E4BA244089833B7007656EC /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ EXPORTED_SYMBOLS_FILE = Ditherbox.exp;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GENERATE_PKGINFO_FILE = YES;
+ INFOPLIST_FILE = Info.plist;
+ INSTALL_PATH = "$(HOME)/Library/Audio/Plug-Ins/Components/";
+ LIBRARY_STYLE = Bundle;
+ OTHER_LDFLAGS = "-bundle";
+ OTHER_REZFLAGS = "-d ppc_$ppc -d i386_$i386 -d ppc64_$ppc64 -d x86_64_$x86_64 -I /System/Library/Frameworks/CoreServices.framework/Frameworks/CarbonCore.framework/Versions/A/Headers -I \"$(DEVELOPER_DIR)/Examples/CoreAudio/AudioUnits/AUPublic/AUBase\"";
+ PRODUCT_NAME = Ditherbox;
+ WRAPPER_EXTENSION = component;
+ };
+ name = Debug;
+ };
+ 3E4BA245089833B7007656EC /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = (
+ ppc,
+ i386,
+ x86_64,
+ );
+ EXPORTED_SYMBOLS_FILE = Ditherbox.exp;
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+ GENERATE_PKGINFO_FILE = YES;
+ INFOPLIST_FILE = Info.plist;
+ INSTALL_PATH = "$(HOME)/Library/Audio/Plug-Ins/Components/";
+ LIBRARY_STYLE = Bundle;
+ MACOSX_DEPLOYMENT_TARGET = 10.4;
+ OTHER_LDFLAGS = "-bundle";
+ OTHER_REZFLAGS = "-d ppc_$ppc -d i386_$i386 -d x86_64_$x86_64 -I /System/Library/Frameworks/CoreServices.framework/Frameworks/CarbonCore.framework/Versions/A/Headers -I \"$(DEVELOPER_DIR)/Examples/CoreAudio/AudioUnits/AUPublic/AUBase\"";
+ PRODUCT_NAME = Ditherbox;
+ SDKROOT = macosx10.5;
+ STRIP_INSTALLED_PRODUCT = YES;
+ STRIP_STYLE = all;
+ WRAPPER_EXTENSION = component;
+ };
+ name = Release;
+ };
+ 3E4BA248089833B7007656EC /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_C_LANGUAGE_STANDARD = c99;
+ SDKROOT = macosx10.6;
+ WARNING_CFLAGS = (
+ "-Wmost",
+ "-Wno-four-char-constants",
+ "-Wno-unknown-pragmas",
+ );
+ };
+ name = Debug;
+ };
+ 3E4BA249089833B7007656EC /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_C_LANGUAGE_STANDARD = c99;
+ SDKROOT = macosx10.6;
+ WARNING_CFLAGS = (
+ "-Wmost",
+ "-Wno-four-char-constants",
+ "-Wno-unknown-pragmas",
+ );
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 3E4BA243089833B7007656EC /* Build configuration list for PBXNativeTarget "Ditherbox" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 3E4BA244089833B7007656EC /* Debug */,
+ 3E4BA245089833B7007656EC /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Debug;
+ };
+ 3E4BA247089833B7007656EC /* Build configuration list for PBXProject "Ditherbox" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 3E4BA248089833B7007656EC /* Debug */,
+ 3E4BA249089833B7007656EC /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Debug;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 089C1669FE841209C02AAC07 /* Project object */;
+}
diff --git a/plugins/MacAU/Distance2/Ditherbox/DitherboxVersion.h b/plugins/MacAU/Distance2/Ditherbox/DitherboxVersion.h
new file mode 100755
index 0000000..d310373
--- /dev/null
+++ b/plugins/MacAU/Distance2/Ditherbox/DitherboxVersion.h
@@ -0,0 +1,68 @@
+/*
+* File: DitherboxVersion.h
+*
+* Version: 1.0
+*
+* Created: 1/1/09
+*
+* Copyright: Copyright © 2009 Airwindows, All Rights Reserved
+*
+* Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc. ("Apple") in
+* consideration of your agreement to the following terms, and your use, installation, modification
+* or redistribution of this Apple software constitutes acceptance of these terms. If you do
+* not agree with these terms, please do not use, install, modify or redistribute this Apple
+* software.
+*
+* In consideration of your agreement to abide by the following terms, and subject to these terms,
+* Apple grants you a personal, non-exclusive license, under Apple's copyrights in this
+* original Apple software (the "Apple Software"), to use, reproduce, modify and redistribute the
+* Apple Software, with or without modifications, in source and/or binary forms; provided that if you
+* redistribute the Apple Software in its entirety and without modifications, you must retain this
+* notice and the following text and disclaimers in all such redistributions of the Apple Software.
+* Neither the name, trademarks, service marks or logos of Apple Computer, Inc. may be used to
+* endorse or promote products derived from the Apple Software without specific prior written
+* permission from Apple. Except as expressly stated in this notice, no other rights or
+* licenses, express or implied, are granted by Apple herein, including but not limited to any
+* patent rights that may be infringed by your derivative works or by other works in which the
+* Apple Software may be incorporated.
+*
+* The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO WARRANTIES, EXPRESS OR
+* IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY
+* AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE
+* OR IN COMBINATION WITH YOUR PRODUCTS.
+*
+* IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR CONSEQUENTIAL
+* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE,
+* REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER
+* UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN
+* IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*
+*/
+#ifndef __DitherboxVersion_h__
+#define __DitherboxVersion_h__
+
+
+#ifdef DEBUG
+ #define kDitherboxVersion 0xFFFFFFFF
+#else
+ #define kDitherboxVersion 0x00010000
+#endif
+
+//#error A unique component subtype needs to be defined
+// Mac OS X identifies your plug-in (components) through its signature, a unique four-character sequence.
+// Registering your creator code with Apple helps ensure that your creator code is unique and
+// will not conflict with the signature of any other application or plug-in.
+// Please visit http://developer.apple.com/datatype/creatorcode.html to register your creator code.
+
+//~~~~~~~~~~~~~~ Change to your creator code ~~~~~~~~~~~~~~~~~~~~~//
+#define Ditherbox_COMP_MANF 'Dthr'
+
+//~~~~~~~~~~~~~~ Specify the subtype of Ditherbox~~~~~~~~~~~~~~~~~~~~~//
+#define Ditherbox_COMP_SUBTYPE 'dith'
+
+//This will be a unique identifier within the host
+
+
+#endif
+
diff --git a/plugins/MacAU/Distance2/Ditherbox/Ditherbox_Prefix.pch b/plugins/MacAU/Distance2/Ditherbox/Ditherbox_Prefix.pch
new file mode 100755
index 0000000..10e9d59
--- /dev/null
+++ b/plugins/MacAU/Distance2/Ditherbox/Ditherbox_Prefix.pch
@@ -0,0 +1,5 @@
+//
+// Prefix header for all source files of the 'Ditherbox' target in the 'Ditherbox' project.
+//
+
+#include <CoreServices/CoreServices.h>
diff --git a/plugins/MacAU/Distance2/Ditherbox/English.lproj/InfoPlist.strings b/plugins/MacAU/Distance2/Ditherbox/English.lproj/InfoPlist.strings
new file mode 100755
index 0000000..35f3285
--- /dev/null
+++ b/plugins/MacAU/Distance2/Ditherbox/English.lproj/InfoPlist.strings
Binary files differ
diff --git a/plugins/MacAU/Distance2/Ditherbox/Info.plist b/plugins/MacAU/Distance2/Ditherbox/Info.plist
new file mode 100755
index 0000000..12f0517
--- /dev/null
+++ b/plugins/MacAU/Distance2/Ditherbox/Info.plist
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIconFile</key>
+ <string></string>
+ <key>CFBundleIdentifier</key>
+ <string>com.airwindows.audiounit.${PRODUCT_NAME:identifier}</string>
+ <key>CFBundleName</key>
+ <string>${PROJECTNAMEASIDENTIFIER}</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundlePackageType</key>
+ <string>BNDL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.0</string>
+ <key>CFBundleSignature</key>
+ <string>Dthr</string>
+ <key>CFBundleVersion</key>
+ <string>1.0</string>
+ <key>CSResourcesFileMapped</key>
+ <true/>
+</dict>
+</plist>
diff --git a/plugins/MacAU/Distance2/Ditherbox/version.plist b/plugins/MacAU/Distance2/Ditherbox/version.plist
new file mode 100755
index 0000000..11edf8a
--- /dev/null
+++ b/plugins/MacAU/Distance2/Ditherbox/version.plist
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>BuildVersion</key>
+ <string>3</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.0</string>
+ <key>CFBundleVersion</key>
+ <string>1.0</string>
+ <key>ProjectName</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>SourceVersion</key>
+ <string>590000</string>
+</dict>
+</plist>
diff --git a/plugins/MacAU/Ditherbox/Ditherbox.cpp b/plugins/MacAU/Ditherbox/Ditherbox.cpp
index 6cd002b..a4b1edf 100755
--- a/plugins/MacAU/Ditherbox/Ditherbox.cpp
+++ b/plugins/MacAU/Ditherbox/Ditherbox.cpp
@@ -83,6 +83,9 @@ ComponentResult Ditherbox::GetParameterValueStrings(AudioUnitScope inScope,
kMenuItem_Truncate,
kMenuItem_Flat,
kMenuItem_TPDF,
+ kMenuItem_Paul,
+ kMenuItem_DoublePaul,
+ kMenuItem_Tape,
kMenuItem_Quadratic,
kMenuItem_TenNines,
kMenuItem_Contingent,
@@ -91,6 +94,9 @@ ComponentResult Ditherbox::GetParameterValueStrings(AudioUnitScope inScope,
kMenuItem_TruncateHR,
kMenuItem_FlatHR,
kMenuItem_TPDFHR,
+ kMenuItem_PaulHR,
+ kMenuItem_DoublePaulHR,
+ kMenuItem_TapeHR,
kMenuItem_QuadraticHR,
kMenuItem_TenNinesHR,
kMenuItem_ContingentHR,
@@ -298,13 +304,39 @@ void Ditherbox::DitherboxKernel::Process( const Float32 *inSourceP,
Float32 drySample; //should be the same as what the native DAW buss is
- if (dtype > 8){highRes = true; dtype -= 8;}
+ if (dtype > 11){highRes = true; dtype -= 11;}
- if (dtype > 8){dithering = false; highRes = false;}
+ if (dtype > 11){dithering = false; highRes = false;}
//follow up by switching high res back off for the monitoring
while (nSampleFrames-- > 0) {
- drySample = inputSample = *sourceP;
+ inputSample = *sourceP;
+ if (inputSample<1.2e-38 && -inputSample<1.2e-38) {
+ static int noisesource = 0;
+ //this declares a variable before anything else is compiled. It won't keep assigning
+ //it to 0 for every sample, it's as if the declaration doesn't exist in this context,
+ //but it lets me add this denormalization fix in a single place rather than updating
+ //it in three different locations. The variable isn't thread-safe but this is only
+ //a random seed and we can share it with whatever.
+ noisesource = noisesource % 1700021; noisesource++;
+ int residue = noisesource * noisesource;
+ residue = residue % 170003; residue *= residue;
+ residue = residue % 17011; residue *= residue;
+ residue = residue % 1709; residue *= residue;
+ residue = residue % 173; residue *= residue;
+ residue = residue % 17;
+ double applyresidue = residue;
+ applyresidue *= 0.00000001;
+ applyresidue *= 0.00000001;
+ inputSample = applyresidue;
+ //this denormalization routine produces a white noise at -300 dB which the noise
+ //shaping will interact with to produce a bipolar output, but the noise is actually
+ //all positive. That should stop any variables from going denormal, and the routine
+ //only kicks in if digital black is input. As a final touch, if you save to 24-bit
+ //the silence will return to being digital black again.
+ }
+ drySample = inputSample;
+
sourceP += inNumChannels;
if (dtype == 8) inputSample -= noiseShaping;
@@ -327,16 +359,62 @@ void Ditherbox::DitherboxKernel::Process( const Float32 *inSourceP,
//flat dither
break;
- case 3:
- inputSample += (rand()/(double)RAND_MAX);
- inputSample += (rand()/(double)RAND_MAX);
- inputSample -= 1.0;
- inputSample = floor(inputSample);
- //TPDF dither
- break;
-
-
- case 4:
+ case 3:
+ inputSample += (rand()/(double)RAND_MAX);
+ inputSample += (rand()/(double)RAND_MAX);
+ inputSample -= 1.0;
+ inputSample = floor(inputSample);
+ //TPDF dither
+ break;
+
+ case 4:
+ currentDither = (rand()/(double)RAND_MAX);
+ inputSample += currentDither;
+ inputSample -= lastSample;
+ inputSample = floor(inputSample);
+ lastSample = currentDither;
+ //Paul dither
+ break;
+
+ case 5:
+ ns[9] = ns[8]; ns[8] = ns[7]; ns[7] = ns[6]; ns[6] = ns[5];
+ ns[5] = ns[4]; ns[4] = ns[3]; ns[3] = ns[2]; ns[2] = ns[1];
+ ns[1] = ns[0]; ns[0] = (rand()/(double)RAND_MAX);
+
+ currentDither = (ns[0] * 0.061);
+ currentDither -= (ns[1] * 0.11);
+ currentDither += (ns[8] * 0.126);
+ currentDither -= (ns[7] * 0.23);
+ currentDither += (ns[2] * 0.25);
+ currentDither -= (ns[3] * 0.43);
+ currentDither += (ns[6] * 0.5);
+ currentDither -= ns[5];
+ currentDither += ns[4];
+ //this sounds different from doing it in order of sample position
+ //cumulative tiny errors seem to build up even at this buss depth
+ //considerably more pronounced at 32 bit float.
+ //Therefore we add the most significant components LAST.
+ //trying to keep values on like exponents of the floating point value.
+ inputSample += currentDither;
+
+ inputSample = floor(inputSample);
+ //DoublePaul dither
+ break;
+
+ case 6:
+ currentDither = (rand()/(double)RAND_MAX);
+ inputSample += currentDither;
+ inputSample -= ns[4];
+ inputSample = floor(inputSample);
+ ns[4] = ns[3];
+ ns[3] = ns[2];
+ ns[2] = ns[1];
+ ns[1] = currentDither;
+ //Tape dither
+ break;
+
+
+ case 7:
Position += 1;
//Note- uses integer overflow as a 'mod' operator
hotbinA = Position * Position;
@@ -356,7 +434,7 @@ void Ditherbox::DitherboxKernel::Process( const Float32 *inSourceP,
//Quadratic dither
break;
- case 5:
+ case 8:
absSample = ((rand()/(double)RAND_MAX) - 0.5);
ns[0] += absSample; ns[0] /= 2; absSample -= ns[0];
absSample += ((rand()/(double)RAND_MAX) - 0.5);
@@ -406,7 +484,7 @@ void Ditherbox::DitherboxKernel::Process( const Float32 *inSourceP,
//TenNines dither
break;
- case 6:
+ case 9:
if (inputSample > 0) inputSample += 0.383;
if (inputSample < 0) inputSample -= 0.383;
//adjusting to permit more information drug outta the noisefloor
@@ -428,7 +506,7 @@ void Ditherbox::DitherboxKernel::Process( const Float32 *inSourceP,
//and does a teeny parallel-compression thing when almost at digital black.
break;
- case 7:
+ case 10:
if (inputSample > 0) inputSample += (0.3333333333);
if (inputSample < 0) inputSample -= (0.3333333333);
@@ -508,7 +586,7 @@ void Ditherbox::DitherboxKernel::Process( const Float32 *inSourceP,
byn[10] /= 2; //catchall for garbage data
break;
- case 8: //this one is the Not Just Another Dither
+ case 11: //this one is the Not Just Another Dither
benfordize = floor(inputSample);
while (benfordize >= 1.0) {benfordize /= 10;}
@@ -590,7 +668,7 @@ void Ditherbox::DitherboxKernel::Process( const Float32 *inSourceP,
byn[10] /= 2; //catchall for garbage data
break;
- case 9:
+ case 12:
//slew only
outputSample = (inputSample - lastSample)*trim;
lastSample = inputSample;
@@ -599,7 +677,7 @@ void Ditherbox::DitherboxKernel::Process( const Float32 *inSourceP,
inputSample = outputSample;
break;
- case 10:
+ case 13:
//subs only
gain = gaintarget;
inputSample *= gain; gain = ((gain-1)*0.75)+1;
@@ -708,7 +786,7 @@ void Ditherbox::DitherboxKernel::Process( const Float32 *inSourceP,
if (inputSample < -1.0) inputSample = -1.0;
break;
- case 11:
+ case 14:
//silhouette
bridgerectifier = fabs(inputSample)*1.57079633;
if (bridgerectifier > 1.57079633) bridgerectifier = 1.57079633;
diff --git a/plugins/MacAU/Ditherbox/Ditherbox.h b/plugins/MacAU/Ditherbox/Ditherbox.h
index a45a8e3..1e22c4d 100755
--- a/plugins/MacAU/Ditherbox/Ditherbox.h
+++ b/plugins/MacAU/Ditherbox/Ditherbox.h
@@ -58,28 +58,37 @@ static CFStringRef kParameterOneName = CFSTR("Dither Type");
static const int kTruncate = 1;
static const int kFlat = 2;
static const int kTPDF = 3;
-static const int kQuadratic = 4;
-static const int kTenNines = 5;
-static const int kContingent = 6;
-static const int kNaturalize = 7;
-static const int kNJAD = 8;
-static const int kTruncateHR = 9;
-static const int kFlatHR = 10;
-static const int kTPDFHR = 11;
-static const int kQuadraticHR = 12;
-static const int kTenNinesHR = 13;
-static const int kContingentHR = 14;
-static const int kNaturalizeHR = 15;
-static const int kNJADHR = 16;
-static const int kSlewOnly = 17;
-static const int kSubsOnly = 18;
-static const int kSilhouette = 19;
-static const int kDefaultValue_ParamOne = 16;
+static const int kPaul = 4;
+static const int kDoublePaul = 5;
+static const int kTape = 6;
+static const int kQuadratic = 7;
+static const int kTenNines = 8;
+static const int kContingent = 9;
+static const int kNaturalize = 10;
+static const int kNJAD = 11;
+static const int kTruncateHR = 12;
+static const int kFlatHR = 13;
+static const int kTPDFHR = 14;
+static const int kPaulHR = 15;
+static const int kDoublePaulHR = 16;
+static const int kTapeHR = 17;
+static const int kQuadraticHR = 18;
+static const int kTenNinesHR = 19;
+static const int kContingentHR = 20;
+static const int kNaturalizeHR = 21;
+static const int kNJADHR = 22;
+static const int kSlewOnly = 23;
+static const int kSubsOnly = 24;
+static const int kSilhouette = 25;
+static const int kDefaultValue_ParamOne = 22;
static CFStringRef kMenuItem_Truncate = CFSTR ("16 Bit Truncation");
static CFStringRef kMenuItem_Flat = CFSTR ("16 bit Flat Dither");
static CFStringRef kMenuItem_TPDF = CFSTR ("16 bit TPDF Dither");
+static CFStringRef kMenuItem_Paul = CFSTR ("16 bit Paul Dither");
+static CFStringRef kMenuItem_DoublePaul = CFSTR ("16 bit DoublePaul Dither");
+static CFStringRef kMenuItem_Tape = CFSTR ("16 bit Tape Dither");
static CFStringRef kMenuItem_Quadratic = CFSTR ("16 bit High Gloss Dither");
static CFStringRef kMenuItem_TenNines = CFSTR ("16 bit Vinyl Dither");
static CFStringRef kMenuItem_Contingent = CFSTR ("16 bit Spatialize Dither");
@@ -88,6 +97,9 @@ static CFStringRef kMenuItem_NJAD = CFSTR ("16 bit Not Just Another Dither");
static CFStringRef kMenuItem_TruncateHR = CFSTR ("24 bit Truncation");
static CFStringRef kMenuItem_FlatHR = CFSTR ("24 bit Flat Dither");
static CFStringRef kMenuItem_TPDFHR = CFSTR ("24 bit TPDF Dither");
+static CFStringRef kMenuItem_PaulHR = CFSTR ("24 bit Paul Dither");
+static CFStringRef kMenuItem_DoublePaulHR = CFSTR ("24 bit DoublePaul Dither");
+static CFStringRef kMenuItem_TapeHR = CFSTR ("24 bit Tape Dither");
static CFStringRef kMenuItem_QuadraticHR = CFSTR ("24 bit High Gloss Dither");
static CFStringRef kMenuItem_TenNinesHR = CFSTR ("24 bit Vinyl Dither");
static CFStringRef kMenuItem_ContingentHR = CFSTR ("24 bit Spatialize Dither");
@@ -167,6 +179,7 @@ public:
long double byn[13];
long double noiseShaping;
long double contingentErr;
+ double currentDither;
long double NSOdd;
long double NSEven;
long double prev;
@@ -202,7 +215,6 @@ public:
long double iirSampleY;
long double iirSampleZ;
-
};
};
diff --git a/plugins/MacAU/Ditherbox/Ditherbox.xcodeproj/christopherjohnson.pbxuser b/plugins/MacAU/Ditherbox/Ditherbox.xcodeproj/christopherjohnson.pbxuser
index a27e362..3c31d7a 100755
--- a/plugins/MacAU/Ditherbox/Ditherbox.xcodeproj/christopherjohnson.pbxuser
+++ b/plugins/MacAU/Ditherbox/Ditherbox.xcodeproj/christopherjohnson.pbxuser
@@ -51,54 +51,54 @@
PBXFileDataSource_Warnings_ColumnID,
);
};
- PBXPerProjectTemplateStateSaveDate = 557542996;
- PBXWorkspaceStateSaveDate = 557542996;
+ PBXPerProjectTemplateStateSaveDate = 557696136;
+ PBXWorkspaceStateSaveDate = 557696136;
};
perUserProjectItems = {
- 8B39A1A7213B713300112CCA /* PBXTextBookmark */ = 8B39A1A7213B713300112CCA /* PBXTextBookmark */;
- 8B6DBA05213B3F1800E44739 /* PBXTextBookmark */ = 8B6DBA05213B3F1800E44739 /* PBXTextBookmark */;
- 8B6DBA3D213B4F3600E44739 /* PBXTextBookmark */ = 8B6DBA3D213B4F3600E44739 /* PBXTextBookmark */;
+ 8B913FA3213DBD2F00BA6EEC /* PBXTextBookmark */ = 8B913FA3213DBD2F00BA6EEC /* PBXTextBookmark */;
+ 8B913FE1213DC54C00BA6EEC /* PBXTextBookmark */ = 8B913FE1213DC54C00BA6EEC /* PBXTextBookmark */;
+ 8B913FEB213DC5A500BA6EEC /* PBXTextBookmark */ = 8B913FEB213DC5A500BA6EEC /* PBXTextBookmark */;
};
sourceControlManager = 8BD3CCB8148830B20062E48C /* Source Control */;
userBuildSettings = {
};
};
- 8B39A1A7213B713300112CCA /* PBXTextBookmark */ = {
+ 8B913FA3213DBD2F00BA6EEC /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 8BA05A660720730100365D66 /* Ditherbox.cpp */;
- name = "Ditherbox.cpp: 295";
+ name = "Ditherbox.cpp: 302";
rLen = 79;
- rLoc = 10697;
+ rLoc = 10835;
rType = 0;
- vrLen = 355;
- vrLoc = 10542;
+ vrLen = 342;
+ vrLoc = 10516;
};
- 8B6DBA05213B3F1800E44739 /* PBXTextBookmark */ = {
+ 8B913FE1213DC54C00BA6EEC /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 8BC6025B073B072D006C4272 /* Ditherbox.h */;
- name = "Ditherbox.h: 167";
- rLen = 921;
- rLoc = 6924;
+ name = "Ditherbox.h: 216";
+ rLen = 0;
+ rLoc = 8486;
rType = 0;
- vrLen = 304;
- vrLoc = 3;
+ vrLen = 209;
+ vrLoc = 129;
};
- 8B6DBA3D213B4F3600E44739 /* PBXTextBookmark */ = {
+ 8B913FEB213DC5A500BA6EEC /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
- fRef = 8BA05A660720730100365D66 /* Ditherbox.cpp */;
- name = "Ditherbox.cpp: 295";
- rLen = 79;
- rLoc = 10697;
+ fRef = 8BC6025B073B072D006C4272 /* Ditherbox.h */;
+ name = "Ditherbox.h: 216";
+ rLen = 0;
+ rLoc = 8486;
rType = 0;
- vrLen = 355;
- vrLoc = 10542;
+ vrLen = 209;
+ vrLoc = 129;
};
8BA05A660720730100365D66 /* Ditherbox.cpp */ = {
uiCtxt = {
- sepNavIntBoundsRect = "{{0, 0}, {607, 9711}}";
- sepNavSelRange = "{10697, 79}";
- sepNavVisRange = "{10542, 355}";
- sepNavWindowFrame = "{{644, -12}, {816, 833}}";
+ sepNavIntBoundsRect = "{{0, 0}, {978, 11076}}";
+ sepNavSelRange = "{11237, 0}";
+ sepNavVisRange = "{1680, 2418}";
+ sepNavWindowFrame = "{{471, 45}, {816, 833}}";
};
};
8BA05A670720730100365D66 /* Ditherbox.exp */ = {
@@ -127,10 +127,10 @@
};
8BC6025B073B072D006C4272 /* Ditherbox.h */ = {
uiCtxt = {
- sepNavIntBoundsRect = "{{0, 0}, {974, 2756}}";
- sepNavSelRange = "{6924, 921}";
- sepNavVisRange = "{3099, 2208}";
- sepNavWindowFrame = "{{802, 68}, {1021, 800}}";
+ sepNavIntBoundsRect = "{{0, 0}, {803, 3003}}";
+ sepNavSelRange = "{8486, 0}";
+ sepNavVisRange = "{129, 209}";
+ sepNavWindowFrame = "{{419, 78}, {1021, 800}}";
};
};
8BD3CCB8148830B20062E48C /* Source Control */ = {
diff --git a/plugins/MacAU/Ditherbox/Ditherbox.xcodeproj/christopherjohnson.perspectivev3 b/plugins/MacAU/Ditherbox/Ditherbox.xcodeproj/christopherjohnson.perspectivev3
index f9417a5..efe3540 100755
--- a/plugins/MacAU/Ditherbox/Ditherbox.xcodeproj/christopherjohnson.perspectivev3
+++ b/plugins/MacAU/Ditherbox/Ditherbox.xcodeproj/christopherjohnson.perspectivev3
@@ -256,8 +256,6 @@
<key>Layout</key>
<array>
<dict>
- <key>BecomeActive</key>
- <true/>
<key>ContentConfiguration</key>
<dict>
<key>PBXBottomSmartGroupGIDs</key>
@@ -324,7 +322,7 @@
<real>185</real>
</array>
<key>RubberWindowFrame</key>
- <string>617 355 810 487 0 0 1440 878 </string>
+ <string>468 237 810 487 0 0 1440 878 </string>
</dict>
<key>Module</key>
<string>PBXSmartGroupTreeModule</string>
@@ -340,7 +338,7 @@
<key>PBXProjectModuleGUID</key>
<string>8B9E7EE61DDE28AC006035FA</string>
<key>PBXProjectModuleLabel</key>
- <string>Ditherbox.cpp</string>
+ <string>Ditherbox.h</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict>
<key>Split0</key>
@@ -348,15 +346,15 @@
<key>PBXProjectModuleGUID</key>
<string>8B9E7EE71DDE28AC006035FA</string>
<key>PBXProjectModuleLabel</key>
- <string>Ditherbox.cpp</string>
+ <string>Ditherbox.h</string>
<key>_historyCapacity</key>
<integer>0</integer>
<key>bookmark</key>
- <string>8B39A1A7213B713300112CCA</string>
+ <string>8B913FEB213DC5A500BA6EEC</string>
<key>history</key>
<array>
- <string>8B6DBA05213B3F1800E44739</string>
- <string>8B6DBA3D213B4F3600E44739</string>
+ <string>8B913FA3213DBD2F00BA6EEC</string>
+ <string>8B913FE1213DC54C00BA6EEC</string>
</array>
</dict>
<key>SplitCount</key>
@@ -370,18 +368,18 @@
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
- <string>{{0, 0}, {603, 102}}</string>
+ <string>{{0, 0}, {603, 69}}</string>
<key>RubberWindowFrame</key>
- <string>617 355 810 487 0 0 1440 878 </string>
+ <string>468 237 810 487 0 0 1440 878 </string>
</dict>
<key>Module</key>
<string>PBXNavigatorGroup</string>
<key>Proportion</key>
- <string>102pt</string>
+ <string>69pt</string>
</dict>
<dict>
<key>Proportion</key>
- <string>339pt</string>
+ <string>372pt</string>
<key>Tabs</key>
<array>
<dict>
@@ -395,9 +393,7 @@
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
- <string>{{10, 27}, {603, 312}}</string>
- <key>RubberWindowFrame</key>
- <string>617 355 810 487 0 0 1440 878 </string>
+ <string>{{10, 27}, {603, 345}}</string>
</dict>
<key>Module</key>
<string>XCDetailModule</string>
@@ -451,7 +447,9 @@
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
- <string>{{10, 27}, {603, 401}}</string>
+ <string>{{10, 27}, {603, 345}}</string>
+ <key>RubberWindowFrame</key>
+ <string>468 237 810 487 0 0 1440 878 </string>
</dict>
<key>Module</key>
<string>PBXBuildResultsModule</string>
@@ -479,11 +477,11 @@
</array>
<key>TableOfContents</key>
<array>
- <string>8B39A1A8213B713300112CCA</string>
+ <string>8B913FB1213DC48A00BA6EEC</string>
<string>1CA23ED40692098700951B8B</string>
- <string>8B39A1A9213B713300112CCA</string>
+ <string>8B913FB2213DC48A00BA6EEC</string>
<string>8B9E7EE61DDE28AC006035FA</string>
- <string>8B39A1AA213B713300112CCA</string>
+ <string>8B913FB3213DC48A00BA6EEC</string>
<string>1CA23EDF0692099D00951B8B</string>
<string>1CA23EE00692099D00951B8B</string>
<string>1CA23EE10692099D00951B8B</string>
@@ -636,7 +634,7 @@
<key>StatusbarIsVisible</key>
<true/>
<key>TimeStamp</key>
- <real>557543731.48686099</real>
+ <real>557696421.06510198</real>
<key>ToolbarConfigUserDefaultsMinorVersion</key>
<string>2</string>
<key>ToolbarDisplayMode</key>
@@ -653,11 +651,10 @@
<integer>5</integer>
<key>WindowOrderList</key>
<array>
- <string>8B39A1AB213B713300112CCA</string>
<string>/Users/christopherjohnson/Desktop/MacAU/Ditherbox/Ditherbox.xcodeproj</string>
</array>
<key>WindowString</key>
- <string>617 355 810 487 0 0 1440 878 </string>
+ <string>468 237 810 487 0 0 1440 878 </string>
<key>WindowToolsV3</key>
<array>
<dict>
diff --git a/plugins/MacVST/Ditherbox/Ditherbox.xcodeproj/christopherjohnson.pbxuser b/plugins/MacVST/Ditherbox/Ditherbox.xcodeproj/christopherjohnson.pbxuser
index b36856e..fafb484 100755
--- a/plugins/MacVST/Ditherbox/Ditherbox.xcodeproj/christopherjohnson.pbxuser
+++ b/plugins/MacVST/Ditherbox/Ditherbox.xcodeproj/christopherjohnson.pbxuser
@@ -49,12 +49,13 @@
PBXFileDataSource_Warnings_ColumnID,
);
};
- PBXPerProjectTemplateStateSaveDate = 557543533;
- PBXWorkspaceStateSaveDate = 557543533;
+ PBXPerProjectTemplateStateSaveDate = 557697507;
+ PBXWorkspaceStateSaveDate = 557697507;
};
perUserProjectItems = {
- 8B39A1A1213B713000112CCA /* PBXTextBookmark */ = 8B39A1A1213B713000112CCA /* PBXTextBookmark */;
- 8B39A1A2213B713000112CCA /* PBXTextBookmark */ = 8B39A1A2213B713000112CCA /* PBXTextBookmark */;
+ 8B913F89213DBC2200BA6EEC /* PBXTextBookmark */ = 8B913F89213DBC2200BA6EEC /* PBXTextBookmark */;
+ 8B914093213DCA1600BA6EEC /* PBXTextBookmark */ = 8B914093213DCA1600BA6EEC /* PBXTextBookmark */;
+ 8B914094213DCA1600BA6EEC /* PBXTextBookmark */ = 8B914094213DCA1600BA6EEC /* PBXTextBookmark */;
};
sourceControlManager = 8B02375E1D42B1C400E1E8C8 /* Source Control */;
userBuildSettings = {
@@ -62,17 +63,17 @@
};
2407DEB6089929BA00EB68BF /* Ditherbox.cpp */ = {
uiCtxt = {
- sepNavIntBoundsRect = "{{0, 0}, {733, 3107}}";
- sepNavSelRange = "{5938, 0}";
- sepNavVisRange = "{6518, 428}";
+ sepNavIntBoundsRect = "{{0, 0}, {558, 3757}}";
+ sepNavSelRange = "{6184, 0}";
+ sepNavVisRange = "{6556, 137}";
sepNavWindowFrame = "{{13, 47}, {895, 831}}";
};
};
245463B80991757100464AD3 /* Ditherbox.h */ = {
uiCtxt = {
- sepNavIntBoundsRect = "{{0, 0}, {866, 1716}}";
- sepNavSelRange = "{2755, 0}";
- sepNavVisRange = "{1597, 1663}";
+ sepNavIntBoundsRect = "{{0, 0}, {866, 1573}}";
+ sepNavSelRange = "{2576, 0}";
+ sepNavVisRange = "{1102, 2059}";
sepNavWindowFrame = "{{17, 44}, {895, 831}}";
};
};
@@ -86,10 +87,10 @@
};
24D8286F09A914000093AEF8 /* DitherboxProc.cpp */ = {
uiCtxt = {
- sepNavIntBoundsRect = "{{0, 0}, {848, 23439}}";
- sepNavSelRange = "{72139, 0}";
- sepNavVisRange = "{37029, 1848}";
- sepNavWindowFrame = "{{32, 38}, {895, 831}}";
+ sepNavIntBoundsRect = "{{0, 0}, {565, 26065}}";
+ sepNavSelRange = "{81896, 0}";
+ sepNavVisRange = "{39186, 42}";
+ sepNavWindowFrame = "{{516, 47}, {895, 831}}";
};
};
8B02375E1D42B1C400E1E8C8 /* Source Control */ = {
@@ -106,25 +107,35 @@
isa = PBXCodeSenseManager;
indexTemplatePath = "";
};
- 8B39A1A1213B713000112CCA /* PBXTextBookmark */ = {
+ 8B913F89213DBC2200BA6EEC /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
- fRef = 2407DEB6089929BA00EB68BF /* Ditherbox.cpp */;
- name = "Ditherbox.cpp: 223";
+ fRef = 24D8286F09A914000093AEF8 /* DitherboxProc.cpp */;
+ name = "DitherboxProc.cpp: 1829";
rLen = 0;
- rLoc = 5938;
+ rLoc = 81896;
rType = 0;
- vrLen = 428;
- vrLoc = 6518;
+ vrLen = 246;
+ vrLoc = 38973;
};
- 8B39A1A2213B713000112CCA /* PBXTextBookmark */ = {
+ 8B914093213DCA1600BA6EEC /* PBXTextBookmark */ = {
isa = PBXTextBookmark;
fRef = 2407DEB6089929BA00EB68BF /* Ditherbox.cpp */;
- name = "Ditherbox.cpp: 223";
+ name = "Ditherbox.cpp: 228";
+ rLen = 0;
+ rLoc = 6184;
+ rType = 0;
+ vrLen = 137;
+ vrLoc = 6556;
+ };
+ 8B914094213DCA1600BA6EEC /* PBXTextBookmark */ = {
+ isa = PBXTextBookmark;
+ fRef = 24D8286F09A914000093AEF8 /* DitherboxProc.cpp */;
+ name = "DitherboxProc.cpp: 2008";
rLen = 0;
- rLoc = 5938;
+ rLoc = 81896;
rType = 0;
- vrLen = 428;
- vrLoc = 6518;
+ vrLen = 42;
+ vrLoc = 39186;
};
8D01CCC60486CAD60068D4B7 /* Ditherbox */ = {
activeExec = 0;
diff --git a/plugins/MacVST/Ditherbox/Ditherbox.xcodeproj/christopherjohnson.perspectivev3 b/plugins/MacVST/Ditherbox/Ditherbox.xcodeproj/christopherjohnson.perspectivev3
index 4c6b162..b9f897f 100755
--- a/plugins/MacVST/Ditherbox/Ditherbox.xcodeproj/christopherjohnson.perspectivev3
+++ b/plugins/MacVST/Ditherbox/Ditherbox.xcodeproj/christopherjohnson.perspectivev3
@@ -323,7 +323,7 @@
<real>185</real>
</array>
<key>RubberWindowFrame</key>
- <string>44 351 810 487 0 0 1440 878 </string>
+ <string>34 315 810 487 0 0 1440 878 </string>
</dict>
<key>Module</key>
<string>PBXSmartGroupTreeModule</string>
@@ -339,7 +339,7 @@
<key>PBXProjectModuleGUID</key>
<string>8B0237581D42B1C400E1E8C8</string>
<key>PBXProjectModuleLabel</key>
- <string>Ditherbox.cpp</string>
+ <string>DitherboxProc.cpp</string>
<key>PBXSplitModuleInNavigatorKey</key>
<dict>
<key>Split0</key>
@@ -347,14 +347,15 @@
<key>PBXProjectModuleGUID</key>
<string>8B0237591D42B1C400E1E8C8</string>
<key>PBXProjectModuleLabel</key>
- <string>Ditherbox.cpp</string>
+ <string>DitherboxProc.cpp</string>
<key>_historyCapacity</key>
<integer>0</integer>
<key>bookmark</key>
- <string>8B39A1A2213B713000112CCA</string>
+ <string>8B914094213DCA1600BA6EEC</string>
<key>history</key>
<array>
- <string>8B39A1A1213B713000112CCA</string>
+ <string>8B914093213DCA1600BA6EEC</string>
+ <string>8B913F89213DBC2200BA6EEC</string>
</array>
</dict>
<key>SplitCount</key>
@@ -368,18 +369,18 @@
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
- <string>{{0, 0}, {603, 132}}</string>
+ <string>{{0, 0}, {603, 51}}</string>
<key>RubberWindowFrame</key>
- <string>44 351 810 487 0 0 1440 878 </string>
+ <string>34 315 810 487 0 0 1440 878 </string>
</dict>
<key>Module</key>
<string>PBXNavigatorGroup</string>
<key>Proportion</key>
- <string>132pt</string>
+ <string>51pt</string>
</dict>
<dict>
<key>Proportion</key>
- <string>309pt</string>
+ <string>390pt</string>
<key>Tabs</key>
<array>
<dict>
@@ -393,9 +394,9 @@
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
- <string>{{10, 27}, {603, 282}}</string>
+ <string>{{10, 27}, {603, 363}}</string>
<key>RubberWindowFrame</key>
- <string>44 351 810 487 0 0 1440 878 </string>
+ <string>34 315 810 487 0 0 1440 878 </string>
</dict>
<key>Module</key>
<string>XCDetailModule</string>
@@ -449,7 +450,7 @@
<key>GeometryConfiguration</key>
<dict>
<key>Frame</key>
- <string>{{10, 27}, {603, 414}}</string>
+ <string>{{10, 27}, {603, 297}}</string>
</dict>
<key>Module</key>
<string>PBXBuildResultsModule</string>
@@ -477,11 +478,11 @@
</array>
<key>TableOfContents</key>
<array>
- <string>8B39A1A3213B713000112CCA</string>
+ <string>8B914095213DCA1600BA6EEC</string>
<string>1CA23ED40692098700951B8B</string>
- <string>8B39A1A4213B713000112CCA</string>
+ <string>8B914096213DCA1600BA6EEC</string>
<string>8B0237581D42B1C400E1E8C8</string>
- <string>8B39A1A5213B713000112CCA</string>
+ <string>8B914097213DCA1600BA6EEC</string>
<string>1CA23EDF0692099D00951B8B</string>
<string>1CA23EE00692099D00951B8B</string>
<string>1CA23EE10692099D00951B8B</string>
@@ -634,7 +635,7 @@
<key>StatusbarIsVisible</key>
<true/>
<key>TimeStamp</key>
- <real>557543728.63115299</real>
+ <real>557697558.29189706</real>
<key>ToolbarConfigUserDefaultsMinorVersion</key>
<string>2</string>
<key>ToolbarDisplayMode</key>
@@ -651,11 +652,11 @@
<integer>5</integer>
<key>WindowOrderList</key>
<array>
- <string>8B39A1A6213B713000112CCA</string>
+ <string>8B914098213DCA1600BA6EEC</string>
<string>/Users/christopherjohnson/Desktop/MacVST/Ditherbox/Ditherbox.xcodeproj</string>
</array>
<key>WindowString</key>
- <string>44 351 810 487 0 0 1440 878 </string>
+ <string>34 315 810 487 0 0 1440 878 </string>
<key>WindowToolsV3</key>
<array>
<dict>
diff --git a/plugins/MacVST/Ditherbox/source/Ditherbox.cpp b/plugins/MacVST/Ditherbox/source/Ditherbox.cpp
index 7e57c49..0d3822f 100755
--- a/plugins/MacVST/Ditherbox/source/Ditherbox.cpp
+++ b/plugins/MacVST/Ditherbox/source/Ditherbox.cpp
@@ -12,11 +12,13 @@ AudioEffect* createEffectInstance(audioMasterCallback audioMaster) {return new D
Ditherbox::Ditherbox(audioMasterCallback audioMaster) :
AudioEffectX(audioMaster, kNumPrograms, kNumParameters)
{
- A = 0.825;
+ A = 0.86;
Position = 99999999;
contingentErrL = 0.0;
contingentErrR = 0.0;
+ currentDitherL = 0.0;
+ currentDitherR = 0.0;
bynL[0] = 1000;
bynL[1] = 301;
bynL[2] = 176;
@@ -211,27 +213,33 @@ void Ditherbox::getParameterName(VstInt32 index, char *text) {
void Ditherbox::getParameterDisplay(VstInt32 index, char *text) {
switch (index) {
- case kParamA: switch((VstInt32)( A * 19.999 )) //0 to almost edge of # of params
+ case kParamA: switch((VstInt32)( A * 24.999 )) //0 to almost edge of # of params
{
case 0: vst_strncpy (text, "Trunc", kVstMaxParamStrLen); break;
case 1: vst_strncpy (text, "Flat", kVstMaxParamStrLen); break;
case 2: vst_strncpy (text, "TPDF", kVstMaxParamStrLen); break;
- case 4: vst_strncpy (text, "HiGloss", kVstMaxParamStrLen); break;
- case 5: vst_strncpy (text, "Vinyl", kVstMaxParamStrLen); break;
- case 6: vst_strncpy (text, "Spatial", kVstMaxParamStrLen); break;
- case 7: vst_strncpy (text, "Natural", kVstMaxParamStrLen); break;
- case 8: vst_strncpy (text, "NJAD", kVstMaxParamStrLen); break;
- case 9: vst_strncpy (text, "Trunc", kVstMaxParamStrLen); break;
- case 10: vst_strncpy (text, "Flat", kVstMaxParamStrLen); break;
- case 11: vst_strncpy (text, "TPDF", kVstMaxParamStrLen); break;
- case 12: vst_strncpy (text, "HiGloss", kVstMaxParamStrLen); break;
- case 13: vst_strncpy (text, "Vinyl", kVstMaxParamStrLen); break;
- case 14: vst_strncpy (text, "Spatial", kVstMaxParamStrLen); break;
- case 15: vst_strncpy (text, "Natural", kVstMaxParamStrLen); break;
- case 16: vst_strncpy (text, "NJAD", kVstMaxParamStrLen); break;
- case 17: vst_strncpy (text, "SlewOnl", kVstMaxParamStrLen); break;
- case 18: vst_strncpy (text, "SubsOnl", kVstMaxParamStrLen); break;
- case 19: vst_strncpy (text, "Silhoue", kVstMaxParamStrLen); break;
+ case 3: vst_strncpy (text, "Paul", kVstMaxParamStrLen); break;
+ case 4: vst_strncpy (text, "DbPaul", kVstMaxParamStrLen); break;
+ case 5: vst_strncpy (text, "Tape", kVstMaxParamStrLen); break;
+ case 6: vst_strncpy (text, "HiGloss", kVstMaxParamStrLen); break;
+ case 7: vst_strncpy (text, "Vinyl", kVstMaxParamStrLen); break;
+ case 8: vst_strncpy (text, "Spatial", kVstMaxParamStrLen); break;
+ case 9: vst_strncpy (text, "Natural", kVstMaxParamStrLen); break;
+ case 10: vst_strncpy (text, "NJAD", kVstMaxParamStrLen); break;
+ case 11: vst_strncpy (text, "Trunc", kVstMaxParamStrLen); break;
+ case 12: vst_strncpy (text, "Flat", kVstMaxParamStrLen); break;
+ case 13: vst_strncpy (text, "TPDF", kVstMaxParamStrLen); break;
+ case 14: vst_strncpy (text, "Paul", kVstMaxParamStrLen); break;
+ case 15: vst_strncpy (text, "DbPaul", kVstMaxParamStrLen); break;
+ case 16: vst_strncpy (text, "Tape", kVstMaxParamStrLen); break;
+ case 17: vst_strncpy (text, "HiGloss", kVstMaxParamStrLen); break;
+ case 18: vst_strncpy (text, "Vinyl", kVstMaxParamStrLen); break;
+ case 19: vst_strncpy (text, "Spatial", kVstMaxParamStrLen); break;
+ case 20: vst_strncpy (text, "Natural", kVstMaxParamStrLen); break;
+ case 21: vst_strncpy (text, "NJAD", kVstMaxParamStrLen); break;
+ case 22: vst_strncpy (text, "SlewOnl", kVstMaxParamStrLen); break;
+ case 23: vst_strncpy (text, "SubsOnl", kVstMaxParamStrLen); break;
+ case 24: vst_strncpy (text, "Silhoue", kVstMaxParamStrLen); break;
default: break; // unknown parameter, shouldn't happen!
} break;
default: break; // unknown parameter, shouldn't happen!
@@ -240,27 +248,33 @@ void Ditherbox::getParameterDisplay(VstInt32 index, char *text) {
void Ditherbox::getParameterLabel(VstInt32 index, char *text) {
switch (index) {
- case kParamA: switch((VstInt32)( A * 19.999 )) //0 to almost edge of # of params
+ case kParamA: switch((VstInt32)( A * 24.999 )) //0 to almost edge of # of params
{
case 0: vst_strncpy (text, "16", kVstMaxParamStrLen); break;
case 1: vst_strncpy (text, "16", kVstMaxParamStrLen); break;
case 2: vst_strncpy (text, "16", kVstMaxParamStrLen); break;
+ case 3: vst_strncpy (text, "16", kVstMaxParamStrLen); break;
case 4: vst_strncpy (text, "16", kVstMaxParamStrLen); break;
case 5: vst_strncpy (text, "16", kVstMaxParamStrLen); break;
case 6: vst_strncpy (text, "16", kVstMaxParamStrLen); break;
case 7: vst_strncpy (text, "16", kVstMaxParamStrLen); break;
case 8: vst_strncpy (text, "16", kVstMaxParamStrLen); break;
- case 9: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
- case 10: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
+ case 9: vst_strncpy (text, "16", kVstMaxParamStrLen); break;
+ case 10: vst_strncpy (text, "16", kVstMaxParamStrLen); break;
case 11: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
case 12: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
case 13: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
case 14: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
case 15: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
case 16: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
- case 17: vst_strncpy (text, "y", kVstMaxParamStrLen); break;
- case 18: vst_strncpy (text, "y", kVstMaxParamStrLen); break;
- case 19: vst_strncpy (text, "tte", kVstMaxParamStrLen); break;
+ case 17: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
+ case 18: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
+ case 19: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
+ case 20: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
+ case 21: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
+ case 22: vst_strncpy (text, "y", kVstMaxParamStrLen); break;
+ case 23: vst_strncpy (text, "y", kVstMaxParamStrLen); break;
+ case 24: vst_strncpy (text, "tte", kVstMaxParamStrLen); break;
default: break; // unknown parameter, shouldn't happen!
} break;
default: break; // unknown parameter, shouldn't happen!
diff --git a/plugins/MacVST/Ditherbox/source/Ditherbox.h b/plugins/MacVST/Ditherbox/source/Ditherbox.h
index baf5bb1..fa54082 100755
--- a/plugins/MacVST/Ditherbox/source/Ditherbox.h
+++ b/plugins/MacVST/Ditherbox/source/Ditherbox.h
@@ -58,6 +58,8 @@ private:
long double noiseShapingR;
double contingentErrL;
double contingentErrR;
+ double currentDitherL;
+ double currentDitherR;
int Position;
bool flip;
double NSOddL;
diff --git a/plugins/MacVST/Ditherbox/source/DitherboxProc.cpp b/plugins/MacVST/Ditherbox/source/DitherboxProc.cpp
index feb5874..4115687 100755
--- a/plugins/MacVST/Ditherbox/source/DitherboxProc.cpp
+++ b/plugins/MacVST/Ditherbox/source/DitherboxProc.cpp
@@ -14,7 +14,7 @@ void Ditherbox::processReplacing(float **inputs, float **outputs, VstInt32 sampl
float* out1 = outputs[0];
float* out2 = outputs[1];
- int dtype = (int)(A * 19.999); // +1 for Reaper bug workaround
+ int dtype = (int)(A * 24.999)+1; // +1 for Reaper bug workaround
long double overallscale = 1.0;
overallscale /= 44100.0;
overallscale *= getSampleRate();
@@ -42,14 +42,52 @@ void Ditherbox::processReplacing(float **inputs, float **outputs, VstInt32 sampl
long double trim = 2.302585092994045684017991; //natural logarithm of 10
bool highRes = false;
bool dithering = true;
- if (dtype > 8){highRes = true; dtype -= 8;}
- if (dtype > 8){dithering = false; highRes = false;}
+ if (dtype > 11){highRes = true; dtype -= 11;}
+ if (dtype > 11){dithering = false; highRes = false;}
//follow up by switching high res back off for the monitoring
while (--sampleFrames >= 0)
{
long double inputSampleL = *in1;
long double inputSampleR = *in2;
+ if (inputSampleL<1.2e-38 && -inputSampleL<1.2e-38) {
+ static int noisesource = 0;
+ //this declares a variable before anything else is compiled. It won't keep assigning
+ //it to 0 for every sample, it's as if the declaration doesn't exist in this context,
+ //but it lets me add this denormalization fix in a single place rather than updating
+ //it in three different locations. The variable isn't thread-safe but this is only
+ //a random seed and we can share it with whatever.
+ noisesource = noisesource % 1700021; noisesource++;
+ int residue = noisesource * noisesource;
+ residue = residue % 170003; residue *= residue;
+ residue = residue % 17011; residue *= residue;
+ residue = residue % 1709; residue *= residue;
+ residue = residue % 173; residue *= residue;
+ residue = residue % 17;
+ double applyresidue = residue;
+ applyresidue *= 0.00000001;
+ applyresidue *= 0.00000001;
+ inputSampleL = applyresidue;
+ }
+ if (inputSampleR<1.2e-38 && -inputSampleR<1.2e-38) {
+ static int noisesource = 0;
+ noisesource = noisesource % 1700021; noisesource++;
+ int residue = noisesource * noisesource;
+ residue = residue % 170003; residue *= residue;
+ residue = residue % 17011; residue *= residue;
+ residue = residue % 1709; residue *= residue;
+ residue = residue % 173; residue *= residue;
+ residue = residue % 17;
+ double applyresidue = residue;
+ applyresidue *= 0.00000001;
+ applyresidue *= 0.00000001;
+ inputSampleR = applyresidue;
+ //this denormalization routine produces a white noise at -300 dB which the noise
+ //shaping will interact with to produce a bipolar output, but the noise is actually
+ //all positive. That should stop any variables from going denormal, and the routine
+ //only kicks in if digital black is input. As a final touch, if you save to 24-bit
+ //the silence will return to being digital black again.
+ }
float drySampleL = inputSampleL;
float drySampleR = inputSampleR;
@@ -89,7 +127,95 @@ void Ditherbox::processReplacing(float **inputs, float **outputs, VstInt32 sampl
//TPDF dither
break;
- case 4:
+ case 4:
+ currentDitherL = (rand()/(double)RAND_MAX);
+ inputSampleL += currentDitherL;
+ inputSampleL -= lastSampleL;
+ inputSampleL = floor(inputSampleL);
+ lastSampleL = currentDitherL;
+ currentDitherR = (rand()/(double)RAND_MAX);
+ inputSampleR += currentDitherR;
+ inputSampleR -= lastSampleR;
+ inputSampleR = floor(inputSampleR);
+ lastSampleR = currentDitherR;
+ //Paul dither
+ break;
+
+ case 5:
+ nsL[9] = nsL[8]; nsL[8] = nsL[7]; nsL[7] = nsL[6]; nsL[6] = nsL[5];
+ nsL[5] = nsL[4]; nsL[4] = nsL[3]; nsL[3] = nsL[2]; nsL[2] = nsL[1];
+ nsL[1] = nsL[0]; nsL[0] = (rand()/(double)RAND_MAX);
+
+ currentDitherL = (nsL[0] * 0.061);
+ currentDitherL -= (nsL[1] * 0.11);
+ currentDitherL += (nsL[8] * 0.126);
+ currentDitherL -= (nsL[7] * 0.23);
+ currentDitherL += (nsL[2] * 0.25);
+ currentDitherL -= (nsL[3] * 0.43);
+ currentDitherL += (nsL[6] * 0.5);
+ currentDitherL -= nsL[5];
+ currentDitherL += nsL[4];
+ //this sounds different from doing it in order of sample position
+ //cumulative tiny errors seem to build up even at this buss depth
+ //considerably more pronounced at 32 bit float.
+ //Therefore we add the most significant components LAST.
+ //trying to keep values on like exponents of the floating point value.
+ inputSampleL += currentDitherL;
+
+ inputSampleL = floor(inputSampleL);
+ //done with L
+
+ nsR[9] = nsR[8]; nsR[8] = nsR[7]; nsR[7] = nsR[6]; nsR[6] = nsR[5];
+ nsR[5] = nsR[4]; nsR[4] = nsR[3]; nsR[3] = nsR[2]; nsR[2] = nsR[1];
+ nsR[1] = nsR[0]; nsR[0] = (rand()/(double)RAND_MAX);
+
+ currentDitherR = (nsR[0] * 0.061);
+ currentDitherR -= (nsR[1] * 0.11);
+ currentDitherR += (nsR[8] * 0.126);
+ currentDitherR -= (nsR[7] * 0.23);
+ currentDitherR += (nsR[2] * 0.25);
+ currentDitherR -= (nsR[3] * 0.43);
+ currentDitherR += (nsR[6] * 0.5);
+ currentDitherR -= nsR[5];
+ currentDitherR += nsR[4];
+ //this sounds different from doing it in order of sample position
+ //cumulative tiny errors seem to build up even at this buss depth
+ //considerably more pronounced at 32 bit float.
+ //Therefore we add the most significant components LAST.
+ //trying to keep values on like exponents of the floating point value.
+ inputSampleR += currentDitherR;
+
+ inputSampleR = floor(inputSampleR);
+ //done with R
+
+ //DoublePaul dither
+ break;
+
+ case 6:
+ currentDitherL = (rand()/(double)RAND_MAX);
+ currentDitherR = (rand()/(double)RAND_MAX);
+
+ inputSampleL += currentDitherL;
+ inputSampleR += currentDitherR;
+ inputSampleL -= nsL[4];
+ inputSampleR -= nsR[4];
+
+ inputSampleL = floor(inputSampleL);
+ inputSampleR = floor(inputSampleR);
+
+ nsL[4] = nsL[3];
+ nsL[3] = nsL[2];
+ nsL[2] = nsL[1];
+ nsL[1] = currentDitherL;
+
+ nsR[4] = nsR[3];
+ nsR[3] = nsR[2];
+ nsR[2] = nsR[1];
+ nsR[1] = currentDitherR;
+ //Tape dither
+ break;
+
+ case 7:
Position += 1;
//Note- uses integer overflow as a 'mod' operator
hotbinA = Position * Position;
@@ -111,7 +237,7 @@ void Ditherbox::processReplacing(float **inputs, float **outputs, VstInt32 sampl
//Quadratic dither
break;
- case 5:
+ case 8:
absSample = ((rand()/(double)RAND_MAX) - 0.5);
nsL[0] += absSample; nsL[0] /= 2; absSample -= nsL[0];
absSample += ((rand()/(double)RAND_MAX) - 0.5);
@@ -206,7 +332,7 @@ void Ditherbox::processReplacing(float **inputs, float **outputs, VstInt32 sampl
//TenNines dither R
break;
- case 6:
+ case 9:
if (inputSampleL > 0) inputSampleL += 0.383;
if (inputSampleL < 0) inputSampleL -= 0.383;
if (inputSampleR > 0) inputSampleR += 0.383;
@@ -246,7 +372,7 @@ void Ditherbox::processReplacing(float **inputs, float **outputs, VstInt32 sampl
//and does a teeny parallel-compression thing when almost at digital black.
break;
- case 7: //this one is the original Naturalize
+ case 10: //this one is the original Naturalize
if (inputSampleL > 0) inputSampleL += (0.3333333333);
if (inputSampleL < 0) inputSampleL -= (0.3333333333);
inputSampleL += (rand()/(double)RAND_MAX)*0.6666666666;
@@ -406,7 +532,7 @@ void Ditherbox::processReplacing(float **inputs, float **outputs, VstInt32 sampl
//end R
break;
- case 8: //this one is the Not Just Another Dither
+ case 11: //this one is the Not Just Another Dither
//begin L
benfordize = floor(inputSampleL);
@@ -571,7 +697,7 @@ void Ditherbox::processReplacing(float **inputs, float **outputs, VstInt32 sampl
//end R
break;
- case 9:
+ case 12:
//slew only
outputSampleL = (inputSampleL - lastSampleL)*trim;
outputSampleR = (inputSampleR - lastSampleR)*trim;
@@ -585,7 +711,7 @@ void Ditherbox::processReplacing(float **inputs, float **outputs, VstInt32 sampl
inputSampleR = outputSampleR;
break;
- case 10:
+ case 13:
//subs only
gain = gaintarget;
@@ -801,7 +927,7 @@ void Ditherbox::processReplacing(float **inputs, float **outputs, VstInt32 sampl
if (inputSampleR < -1.0) inputSampleR = -1.0;
break;
- case 11:
+ case 14:
//silhouette
//begin L
bridgerectifier = fabs(inputSampleL)*1.57079633;
@@ -893,7 +1019,7 @@ void Ditherbox::processDoubleReplacing(double **inputs, double **outputs, VstInt
double* out1 = outputs[0];
double* out2 = outputs[1];
- int dtype = (int)(A * 19.999); // +1 for Reaper bug workaround
+ int dtype = (int)(A * 24.999)+1; // +1 for Reaper bug workaround
long double overallscale = 1.0;
overallscale /= 44100.0;
overallscale *= getSampleRate();
@@ -921,14 +1047,52 @@ void Ditherbox::processDoubleReplacing(double **inputs, double **outputs, VstInt
long double trim = 2.302585092994045684017991; //natural logarithm of 10
bool highRes = false;
bool dithering = true;
- if (dtype > 8){highRes = true; dtype -= 8;}
- if (dtype > 8){dithering = false; highRes = false;}
+ if (dtype > 11){highRes = true; dtype -= 11;}
+ if (dtype > 11){dithering = false; highRes = false;}
//follow up by switching high res back off for the monitoring
while (--sampleFrames >= 0)
{
long double inputSampleL = *in1;
long double inputSampleR = *in2;
+ if (inputSampleL<1.2e-38 && -inputSampleL<1.2e-38) {
+ static int noisesource = 0;
+ //this declares a variable before anything else is compiled. It won't keep assigning
+ //it to 0 for every sample, it's as if the declaration doesn't exist in this context,
+ //but it lets me add this denormalization fix in a single place rather than updating
+ //it in three different locations. The variable isn't thread-safe but this is only
+ //a random seed and we can share it with whatever.
+ noisesource = noisesource % 1700021; noisesource++;
+ int residue = noisesource * noisesource;
+ residue = residue % 170003; residue *= residue;
+ residue = residue % 17011; residue *= residue;
+ residue = residue % 1709; residue *= residue;
+ residue = residue % 173; residue *= residue;
+ residue = residue % 17;
+ double applyresidue = residue;
+ applyresidue *= 0.00000001;
+ applyresidue *= 0.00000001;
+ inputSampleL = applyresidue;
+ }
+ if (inputSampleR<1.2e-38 && -inputSampleR<1.2e-38) {
+ static int noisesource = 0;
+ noisesource = noisesource % 1700021; noisesource++;
+ int residue = noisesource * noisesource;
+ residue = residue % 170003; residue *= residue;
+ residue = residue % 17011; residue *= residue;
+ residue = residue % 1709; residue *= residue;
+ residue = residue % 173; residue *= residue;
+ residue = residue % 17;
+ double applyresidue = residue;
+ applyresidue *= 0.00000001;
+ applyresidue *= 0.00000001;
+ inputSampleR = applyresidue;
+ //this denormalization routine produces a white noise at -300 dB which the noise
+ //shaping will interact with to produce a bipolar output, but the noise is actually
+ //all positive. That should stop any variables from going denormal, and the routine
+ //only kicks in if digital black is input. As a final touch, if you save to 24-bit
+ //the silence will return to being digital black again.
+ }
double drySampleL = inputSampleL;
double drySampleR = inputSampleR;
@@ -968,7 +1132,94 @@ void Ditherbox::processDoubleReplacing(double **inputs, double **outputs, VstInt
//TPDF dither
break;
- case 4:
+ case 4:
+ currentDitherL = (rand()/(double)RAND_MAX);
+ inputSampleL += currentDitherL;
+ inputSampleL -= lastSampleL;
+ inputSampleL = floor(inputSampleL);
+ lastSampleL = currentDitherL;
+ currentDitherR = (rand()/(double)RAND_MAX);
+ inputSampleR += currentDitherR;
+ inputSampleR -= lastSampleR;
+ inputSampleR = floor(inputSampleR);
+ lastSampleR = currentDitherR;
+ //Paul dither
+ break;
+
+ case 5:
+ nsL[9] = nsL[8]; nsL[8] = nsL[7]; nsL[7] = nsL[6]; nsL[6] = nsL[5];
+ nsL[5] = nsL[4]; nsL[4] = nsL[3]; nsL[3] = nsL[2]; nsL[2] = nsL[1];
+ nsL[1] = nsL[0]; nsL[0] = (rand()/(double)RAND_MAX);
+
+ currentDitherL = (nsL[0] * 0.061);
+ currentDitherL -= (nsL[1] * 0.11);
+ currentDitherL += (nsL[8] * 0.126);
+ currentDitherL -= (nsL[7] * 0.23);
+ currentDitherL += (nsL[2] * 0.25);
+ currentDitherL -= (nsL[3] * 0.43);
+ currentDitherL += (nsL[6] * 0.5);
+ currentDitherL -= nsL[5];
+ currentDitherL += nsL[4];
+ //this sounds different from doing it in order of sample position
+ //cumulative tiny errors seem to build up even at this buss depth
+ //considerably more pronounced at 32 bit float.
+ //Therefore we add the most significant components LAST.
+ //trying to keep values on like exponents of the floating point value.
+ inputSampleL += currentDitherL;
+
+ inputSampleL = floor(inputSampleL);
+ //done with L
+
+ nsR[9] = nsR[8]; nsR[8] = nsR[7]; nsR[7] = nsR[6]; nsR[6] = nsR[5];
+ nsR[5] = nsR[4]; nsR[4] = nsR[3]; nsR[3] = nsR[2]; nsR[2] = nsR[1];
+ nsR[1] = nsR[0]; nsR[0] = (rand()/(double)RAND_MAX);
+
+ currentDitherR = (nsR[0] * 0.061);
+ currentDitherR -= (nsR[1] * 0.11);
+ currentDitherR += (nsR[8] * 0.126);
+ currentDitherR -= (nsR[7] * 0.23);
+ currentDitherR += (nsR[2] * 0.25);
+ currentDitherR -= (nsR[3] * 0.43);
+ currentDitherR += (nsR[6] * 0.5);
+ currentDitherR -= nsR[5];
+ currentDitherR += nsR[4];
+ //this sounds different from doing it in order of sample position
+ //cumulative tiny errors seem to build up even at this buss depth
+ //considerably more pronounced at 32 bit float.
+ //Therefore we add the most significant components LAST.
+ //trying to keep values on like exponents of the floating point value.
+ inputSampleR += currentDitherR;
+
+ inputSampleR = floor(inputSampleR);
+ //done with R
+ //DoublePaul dither
+ break;
+
+ case 6:
+ currentDitherL = (rand()/(double)RAND_MAX);
+ currentDitherR = (rand()/(double)RAND_MAX);
+
+ inputSampleL += currentDitherL;
+ inputSampleR += currentDitherR;
+ inputSampleL -= nsL[4];
+ inputSampleR -= nsR[4];
+
+ inputSampleL = floor(inputSampleL);
+ inputSampleR = floor(inputSampleR);
+
+ nsL[4] = nsL[3];
+ nsL[3] = nsL[2];
+ nsL[2] = nsL[1];
+ nsL[1] = currentDitherL;
+
+ nsR[4] = nsR[3];
+ nsR[3] = nsR[2];
+ nsR[2] = nsR[1];
+ nsR[1] = currentDitherR;
+ //Tape dither
+ break;
+
+ case 7:
Position += 1;
//Note- uses integer overflow as a 'mod' operator
hotbinA = Position * Position;
@@ -990,7 +1241,7 @@ void Ditherbox::processDoubleReplacing(double **inputs, double **outputs, VstInt
//Quadratic dither
break;
- case 5:
+ case 8:
absSample = ((rand()/(double)RAND_MAX) - 0.5);
nsL[0] += absSample; nsL[0] /= 2; absSample -= nsL[0];
absSample += ((rand()/(double)RAND_MAX) - 0.5);
@@ -1085,7 +1336,7 @@ void Ditherbox::processDoubleReplacing(double **inputs, double **outputs, VstInt
//TenNines dither R
break;
- case 6:
+ case 9:
if (inputSampleL > 0) inputSampleL += 0.383;
if (inputSampleL < 0) inputSampleL -= 0.383;
if (inputSampleR > 0) inputSampleR += 0.383;
@@ -1125,7 +1376,7 @@ void Ditherbox::processDoubleReplacing(double **inputs, double **outputs, VstInt
//and does a teeny parallel-compression thing when almost at digital black.
break;
- case 7: //this one is the original Naturalize
+ case 10: //this one is the original Naturalize
if (inputSampleL > 0) inputSampleL += (0.3333333333);
if (inputSampleL < 0) inputSampleL -= (0.3333333333);
inputSampleL += (rand()/(double)RAND_MAX)*0.6666666666;
@@ -1285,7 +1536,7 @@ void Ditherbox::processDoubleReplacing(double **inputs, double **outputs, VstInt
//end R
break;
- case 8: //this one is the Not Just Another Dither
+ case 11: //this one is the Not Just Another Dither
//begin L
benfordize = floor(inputSampleL);
@@ -1450,7 +1701,7 @@ void Ditherbox::processDoubleReplacing(double **inputs, double **outputs, VstInt
//end R
break;
- case 9:
+ case 12:
//slew only
outputSampleL = (inputSampleL - lastSampleL)*trim;
outputSampleR = (inputSampleR - lastSampleR)*trim;
@@ -1464,7 +1715,7 @@ void Ditherbox::processDoubleReplacing(double **inputs, double **outputs, VstInt
inputSampleR = outputSampleR;
break;
- case 10:
+ case 13:
//subs only
gain = gaintarget;
@@ -1680,7 +1931,7 @@ void Ditherbox::processDoubleReplacing(double **inputs, double **outputs, VstInt
if (inputSampleR < -1.0) inputSampleR = -1.0;
break;
- case 11:
+ case 14:
//silhouette
//begin L
bridgerectifier = fabs(inputSampleL)*1.57079633;
diff --git a/plugins/WinVST/Ditherbox/.vs/VSTProject/v14/.suo b/plugins/WinVST/Ditherbox/.vs/VSTProject/v14/.suo
index ded61ca..b6e8ada 100755
--- a/plugins/WinVST/Ditherbox/.vs/VSTProject/v14/.suo
+++ b/plugins/WinVST/Ditherbox/.vs/VSTProject/v14/.suo
Binary files differ
diff --git a/plugins/WinVST/Ditherbox/Ditherbox.cpp b/plugins/WinVST/Ditherbox/Ditherbox.cpp
index 7e57c49..0d3822f 100755
--- a/plugins/WinVST/Ditherbox/Ditherbox.cpp
+++ b/plugins/WinVST/Ditherbox/Ditherbox.cpp
@@ -12,11 +12,13 @@ AudioEffect* createEffectInstance(audioMasterCallback audioMaster) {return new D
Ditherbox::Ditherbox(audioMasterCallback audioMaster) :
AudioEffectX(audioMaster, kNumPrograms, kNumParameters)
{
- A = 0.825;
+ A = 0.86;
Position = 99999999;
contingentErrL = 0.0;
contingentErrR = 0.0;
+ currentDitherL = 0.0;
+ currentDitherR = 0.0;
bynL[0] = 1000;
bynL[1] = 301;
bynL[2] = 176;
@@ -211,27 +213,33 @@ void Ditherbox::getParameterName(VstInt32 index, char *text) {
void Ditherbox::getParameterDisplay(VstInt32 index, char *text) {
switch (index) {
- case kParamA: switch((VstInt32)( A * 19.999 )) //0 to almost edge of # of params
+ case kParamA: switch((VstInt32)( A * 24.999 )) //0 to almost edge of # of params
{
case 0: vst_strncpy (text, "Trunc", kVstMaxParamStrLen); break;
case 1: vst_strncpy (text, "Flat", kVstMaxParamStrLen); break;
case 2: vst_strncpy (text, "TPDF", kVstMaxParamStrLen); break;
- case 4: vst_strncpy (text, "HiGloss", kVstMaxParamStrLen); break;
- case 5: vst_strncpy (text, "Vinyl", kVstMaxParamStrLen); break;
- case 6: vst_strncpy (text, "Spatial", kVstMaxParamStrLen); break;
- case 7: vst_strncpy (text, "Natural", kVstMaxParamStrLen); break;
- case 8: vst_strncpy (text, "NJAD", kVstMaxParamStrLen); break;
- case 9: vst_strncpy (text, "Trunc", kVstMaxParamStrLen); break;
- case 10: vst_strncpy (text, "Flat", kVstMaxParamStrLen); break;
- case 11: vst_strncpy (text, "TPDF", kVstMaxParamStrLen); break;
- case 12: vst_strncpy (text, "HiGloss", kVstMaxParamStrLen); break;
- case 13: vst_strncpy (text, "Vinyl", kVstMaxParamStrLen); break;
- case 14: vst_strncpy (text, "Spatial", kVstMaxParamStrLen); break;
- case 15: vst_strncpy (text, "Natural", kVstMaxParamStrLen); break;
- case 16: vst_strncpy (text, "NJAD", kVstMaxParamStrLen); break;
- case 17: vst_strncpy (text, "SlewOnl", kVstMaxParamStrLen); break;
- case 18: vst_strncpy (text, "SubsOnl", kVstMaxParamStrLen); break;
- case 19: vst_strncpy (text, "Silhoue", kVstMaxParamStrLen); break;
+ case 3: vst_strncpy (text, "Paul", kVstMaxParamStrLen); break;
+ case 4: vst_strncpy (text, "DbPaul", kVstMaxParamStrLen); break;
+ case 5: vst_strncpy (text, "Tape", kVstMaxParamStrLen); break;
+ case 6: vst_strncpy (text, "HiGloss", kVstMaxParamStrLen); break;
+ case 7: vst_strncpy (text, "Vinyl", kVstMaxParamStrLen); break;
+ case 8: vst_strncpy (text, "Spatial", kVstMaxParamStrLen); break;
+ case 9: vst_strncpy (text, "Natural", kVstMaxParamStrLen); break;
+ case 10: vst_strncpy (text, "NJAD", kVstMaxParamStrLen); break;
+ case 11: vst_strncpy (text, "Trunc", kVstMaxParamStrLen); break;
+ case 12: vst_strncpy (text, "Flat", kVstMaxParamStrLen); break;
+ case 13: vst_strncpy (text, "TPDF", kVstMaxParamStrLen); break;
+ case 14: vst_strncpy (text, "Paul", kVstMaxParamStrLen); break;
+ case 15: vst_strncpy (text, "DbPaul", kVstMaxParamStrLen); break;
+ case 16: vst_strncpy (text, "Tape", kVstMaxParamStrLen); break;
+ case 17: vst_strncpy (text, "HiGloss", kVstMaxParamStrLen); break;
+ case 18: vst_strncpy (text, "Vinyl", kVstMaxParamStrLen); break;
+ case 19: vst_strncpy (text, "Spatial", kVstMaxParamStrLen); break;
+ case 20: vst_strncpy (text, "Natural", kVstMaxParamStrLen); break;
+ case 21: vst_strncpy (text, "NJAD", kVstMaxParamStrLen); break;
+ case 22: vst_strncpy (text, "SlewOnl", kVstMaxParamStrLen); break;
+ case 23: vst_strncpy (text, "SubsOnl", kVstMaxParamStrLen); break;
+ case 24: vst_strncpy (text, "Silhoue", kVstMaxParamStrLen); break;
default: break; // unknown parameter, shouldn't happen!
} break;
default: break; // unknown parameter, shouldn't happen!
@@ -240,27 +248,33 @@ void Ditherbox::getParameterDisplay(VstInt32 index, char *text) {
void Ditherbox::getParameterLabel(VstInt32 index, char *text) {
switch (index) {
- case kParamA: switch((VstInt32)( A * 19.999 )) //0 to almost edge of # of params
+ case kParamA: switch((VstInt32)( A * 24.999 )) //0 to almost edge of # of params
{
case 0: vst_strncpy (text, "16", kVstMaxParamStrLen); break;
case 1: vst_strncpy (text, "16", kVstMaxParamStrLen); break;
case 2: vst_strncpy (text, "16", kVstMaxParamStrLen); break;
+ case 3: vst_strncpy (text, "16", kVstMaxParamStrLen); break;
case 4: vst_strncpy (text, "16", kVstMaxParamStrLen); break;
case 5: vst_strncpy (text, "16", kVstMaxParamStrLen); break;
case 6: vst_strncpy (text, "16", kVstMaxParamStrLen); break;
case 7: vst_strncpy (text, "16", kVstMaxParamStrLen); break;
case 8: vst_strncpy (text, "16", kVstMaxParamStrLen); break;
- case 9: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
- case 10: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
+ case 9: vst_strncpy (text, "16", kVstMaxParamStrLen); break;
+ case 10: vst_strncpy (text, "16", kVstMaxParamStrLen); break;
case 11: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
case 12: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
case 13: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
case 14: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
case 15: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
case 16: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
- case 17: vst_strncpy (text, "y", kVstMaxParamStrLen); break;
- case 18: vst_strncpy (text, "y", kVstMaxParamStrLen); break;
- case 19: vst_strncpy (text, "tte", kVstMaxParamStrLen); break;
+ case 17: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
+ case 18: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
+ case 19: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
+ case 20: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
+ case 21: vst_strncpy (text, "24", kVstMaxParamStrLen); break;
+ case 22: vst_strncpy (text, "y", kVstMaxParamStrLen); break;
+ case 23: vst_strncpy (text, "y", kVstMaxParamStrLen); break;
+ case 24: vst_strncpy (text, "tte", kVstMaxParamStrLen); break;
default: break; // unknown parameter, shouldn't happen!
} break;
default: break; // unknown parameter, shouldn't happen!
diff --git a/plugins/WinVST/Ditherbox/Ditherbox.h b/plugins/WinVST/Ditherbox/Ditherbox.h
index baf5bb1..fa54082 100755
--- a/plugins/WinVST/Ditherbox/Ditherbox.h
+++ b/plugins/WinVST/Ditherbox/Ditherbox.h
@@ -58,6 +58,8 @@ private:
long double noiseShapingR;
double contingentErrL;
double contingentErrR;
+ double currentDitherL;
+ double currentDitherR;
int Position;
bool flip;
double NSOddL;
diff --git a/plugins/WinVST/Ditherbox/DitherboxProc.cpp b/plugins/WinVST/Ditherbox/DitherboxProc.cpp
index feb5874..4115687 100755
--- a/plugins/WinVST/Ditherbox/DitherboxProc.cpp
+++ b/plugins/WinVST/Ditherbox/DitherboxProc.cpp
@@ -14,7 +14,7 @@ void Ditherbox::processReplacing(float **inputs, float **outputs, VstInt32 sampl
float* out1 = outputs[0];
float* out2 = outputs[1];
- int dtype = (int)(A * 19.999); // +1 for Reaper bug workaround
+ int dtype = (int)(A * 24.999)+1; // +1 for Reaper bug workaround
long double overallscale = 1.0;
overallscale /= 44100.0;
overallscale *= getSampleRate();
@@ -42,14 +42,52 @@ void Ditherbox::processReplacing(float **inputs, float **outputs, VstInt32 sampl
long double trim = 2.302585092994045684017991; //natural logarithm of 10
bool highRes = false;
bool dithering = true;
- if (dtype > 8){highRes = true; dtype -= 8;}
- if (dtype > 8){dithering = false; highRes = false;}
+ if (dtype > 11){highRes = true; dtype -= 11;}
+ if (dtype > 11){dithering = false; highRes = false;}
//follow up by switching high res back off for the monitoring
while (--sampleFrames >= 0)
{
long double inputSampleL = *in1;
long double inputSampleR = *in2;
+ if (inputSampleL<1.2e-38 && -inputSampleL<1.2e-38) {
+ static int noisesource = 0;
+ //this declares a variable before anything else is compiled. It won't keep assigning
+ //it to 0 for every sample, it's as if the declaration doesn't exist in this context,
+ //but it lets me add this denormalization fix in a single place rather than updating
+ //it in three different locations. The variable isn't thread-safe but this is only
+ //a random seed and we can share it with whatever.
+ noisesource = noisesource % 1700021; noisesource++;
+ int residue = noisesource * noisesource;
+ residue = residue % 170003; residue *= residue;
+ residue = residue % 17011; residue *= residue;
+ residue = residue % 1709; residue *= residue;
+ residue = residue % 173; residue *= residue;
+ residue = residue % 17;
+ double applyresidue = residue;
+ applyresidue *= 0.00000001;
+ applyresidue *= 0.00000001;
+ inputSampleL = applyresidue;
+ }
+ if (inputSampleR<1.2e-38 && -inputSampleR<1.2e-38) {
+ static int noisesource = 0;
+ noisesource = noisesource % 1700021; noisesource++;
+ int residue = noisesource * noisesource;
+ residue = residue % 170003; residue *= residue;
+ residue = residue % 17011; residue *= residue;
+ residue = residue % 1709; residue *= residue;
+ residue = residue % 173; residue *= residue;
+ residue = residue % 17;
+ double applyresidue = residue;
+ applyresidue *= 0.00000001;
+ applyresidue *= 0.00000001;
+ inputSampleR = applyresidue;
+ //this denormalization routine produces a white noise at -300 dB which the noise
+ //shaping will interact with to produce a bipolar output, but the noise is actually
+ //all positive. That should stop any variables from going denormal, and the routine
+ //only kicks in if digital black is input. As a final touch, if you save to 24-bit
+ //the silence will return to being digital black again.
+ }
float drySampleL = inputSampleL;
float drySampleR = inputSampleR;
@@ -89,7 +127,95 @@ void Ditherbox::processReplacing(float **inputs, float **outputs, VstInt32 sampl
//TPDF dither
break;
- case 4:
+ case 4:
+ currentDitherL = (rand()/(double)RAND_MAX);
+ inputSampleL += currentDitherL;
+ inputSampleL -= lastSampleL;
+ inputSampleL = floor(inputSampleL);
+ lastSampleL = currentDitherL;
+ currentDitherR = (rand()/(double)RAND_MAX);
+ inputSampleR += currentDitherR;
+ inputSampleR -= lastSampleR;
+ inputSampleR = floor(inputSampleR);
+ lastSampleR = currentDitherR;
+ //Paul dither
+ break;
+
+ case 5:
+ nsL[9] = nsL[8]; nsL[8] = nsL[7]; nsL[7] = nsL[6]; nsL[6] = nsL[5];
+ nsL[5] = nsL[4]; nsL[4] = nsL[3]; nsL[3] = nsL[2]; nsL[2] = nsL[1];
+ nsL[1] = nsL[0]; nsL[0] = (rand()/(double)RAND_MAX);
+
+ currentDitherL = (nsL[0] * 0.061);
+ currentDitherL -= (nsL[1] * 0.11);
+ currentDitherL += (nsL[8] * 0.126);
+ currentDitherL -= (nsL[7] * 0.23);
+ currentDitherL += (nsL[2] * 0.25);
+ currentDitherL -= (nsL[3] * 0.43);
+ currentDitherL += (nsL[6] * 0.5);
+ currentDitherL -= nsL[5];
+ currentDitherL += nsL[4];
+ //this sounds different from doing it in order of sample position
+ //cumulative tiny errors seem to build up even at this buss depth
+ //considerably more pronounced at 32 bit float.
+ //Therefore we add the most significant components LAST.
+ //trying to keep values on like exponents of the floating point value.
+ inputSampleL += currentDitherL;
+
+ inputSampleL = floor(inputSampleL);
+ //done with L
+
+ nsR[9] = nsR[8]; nsR[8] = nsR[7]; nsR[7] = nsR[6]; nsR[6] = nsR[5];
+ nsR[5] = nsR[4]; nsR[4] = nsR[3]; nsR[3] = nsR[2]; nsR[2] = nsR[1];
+ nsR[1] = nsR[0]; nsR[0] = (rand()/(double)RAND_MAX);
+
+ currentDitherR = (nsR[0] * 0.061);
+ currentDitherR -= (nsR[1] * 0.11);
+ currentDitherR += (nsR[8] * 0.126);
+ currentDitherR -= (nsR[7] * 0.23);
+ currentDitherR += (nsR[2] * 0.25);
+ currentDitherR -= (nsR[3] * 0.43);
+ currentDitherR += (nsR[6] * 0.5);
+ currentDitherR -= nsR[5];
+ currentDitherR += nsR[4];
+ //this sounds different from doing it in order of sample position
+ //cumulative tiny errors seem to build up even at this buss depth
+ //considerably more pronounced at 32 bit float.
+ //Therefore we add the most significant components LAST.
+ //trying to keep values on like exponents of the floating point value.
+ inputSampleR += currentDitherR;
+
+ inputSampleR = floor(inputSampleR);
+ //done with R
+
+ //DoublePaul dither
+ break;
+
+ case 6:
+ currentDitherL = (rand()/(double)RAND_MAX);
+ currentDitherR = (rand()/(double)RAND_MAX);
+
+ inputSampleL += currentDitherL;
+ inputSampleR += currentDitherR;
+ inputSampleL -= nsL[4];
+ inputSampleR -= nsR[4];
+
+ inputSampleL = floor(inputSampleL);
+ inputSampleR = floor(inputSampleR);
+
+ nsL[4] = nsL[3];
+ nsL[3] = nsL[2];
+ nsL[2] = nsL[1];
+ nsL[1] = currentDitherL;
+
+ nsR[4] = nsR[3];
+ nsR[3] = nsR[2];
+ nsR[2] = nsR[1];
+ nsR[1] = currentDitherR;
+ //Tape dither
+ break;
+
+ case 7:
Position += 1;
//Note- uses integer overflow as a 'mod' operator
hotbinA = Position * Position;
@@ -111,7 +237,7 @@ void Ditherbox::processReplacing(float **inputs, float **outputs, VstInt32 sampl
//Quadratic dither
break;
- case 5:
+ case 8:
absSample = ((rand()/(double)RAND_MAX) - 0.5);
nsL[0] += absSample; nsL[0] /= 2; absSample -= nsL[0];
absSample += ((rand()/(double)RAND_MAX) - 0.5);
@@ -206,7 +332,7 @@ void Ditherbox::processReplacing(float **inputs, float **outputs, VstInt32 sampl
//TenNines dither R
break;
- case 6:
+ case 9:
if (inputSampleL > 0) inputSampleL += 0.383;
if (inputSampleL < 0) inputSampleL -= 0.383;
if (inputSampleR > 0) inputSampleR += 0.383;
@@ -246,7 +372,7 @@ void Ditherbox::processReplacing(float **inputs, float **outputs, VstInt32 sampl
//and does a teeny parallel-compression thing when almost at digital black.
break;
- case 7: //this one is the original Naturalize
+ case 10: //this one is the original Naturalize
if (inputSampleL > 0) inputSampleL += (0.3333333333);
if (inputSampleL < 0) inputSampleL -= (0.3333333333);
inputSampleL += (rand()/(double)RAND_MAX)*0.6666666666;
@@ -406,7 +532,7 @@ void Ditherbox::processReplacing(float **inputs, float **outputs, VstInt32 sampl
//end R
break;
- case 8: //this one is the Not Just Another Dither
+ case 11: //this one is the Not Just Another Dither
//begin L
benfordize = floor(inputSampleL);
@@ -571,7 +697,7 @@ void Ditherbox::processReplacing(float **inputs, float **outputs, VstInt32 sampl
//end R
break;
- case 9:
+ case 12:
//slew only
outputSampleL = (inputSampleL - lastSampleL)*trim;
outputSampleR = (inputSampleR - lastSampleR)*trim;
@@ -585,7 +711,7 @@ void Ditherbox::processReplacing(float **inputs, float **outputs, VstInt32 sampl
inputSampleR = outputSampleR;
break;
- case 10:
+ case 13:
//subs only
gain = gaintarget;
@@ -801,7 +927,7 @@ void Ditherbox::processReplacing(float **inputs, float **outputs, VstInt32 sampl
if (inputSampleR < -1.0) inputSampleR = -1.0;
break;
- case 11:
+ case 14:
//silhouette
//begin L
bridgerectifier = fabs(inputSampleL)*1.57079633;
@@ -893,7 +1019,7 @@ void Ditherbox::processDoubleReplacing(double **inputs, double **outputs, VstInt
double* out1 = outputs[0];
double* out2 = outputs[1];
- int dtype = (int)(A * 19.999); // +1 for Reaper bug workaround
+ int dtype = (int)(A * 24.999)+1; // +1 for Reaper bug workaround
long double overallscale = 1.0;
overallscale /= 44100.0;
overallscale *= getSampleRate();
@@ -921,14 +1047,52 @@ void Ditherbox::processDoubleReplacing(double **inputs, double **outputs, VstInt
long double trim = 2.302585092994045684017991; //natural logarithm of 10
bool highRes = false;
bool dithering = true;
- if (dtype > 8){highRes = true; dtype -= 8;}
- if (dtype > 8){dithering = false; highRes = false;}
+ if (dtype > 11){highRes = true; dtype -= 11;}
+ if (dtype > 11){dithering = false; highRes = false;}
//follow up by switching high res back off for the monitoring
while (--sampleFrames >= 0)
{
long double inputSampleL = *in1;
long double inputSampleR = *in2;
+ if (inputSampleL<1.2e-38 && -inputSampleL<1.2e-38) {
+ static int noisesource = 0;
+ //this declares a variable before anything else is compiled. It won't keep assigning
+ //it to 0 for every sample, it's as if the declaration doesn't exist in this context,
+ //but it lets me add this denormalization fix in a single place rather than updating
+ //it in three different locations. The variable isn't thread-safe but this is only
+ //a random seed and we can share it with whatever.
+ noisesource = noisesource % 1700021; noisesource++;
+ int residue = noisesource * noisesource;
+ residue = residue % 170003; residue *= residue;
+ residue = residue % 17011; residue *= residue;
+ residue = residue % 1709; residue *= residue;
+ residue = residue % 173; residue *= residue;
+ residue = residue % 17;
+ double applyresidue = residue;
+ applyresidue *= 0.00000001;
+ applyresidue *= 0.00000001;
+ inputSampleL = applyresidue;
+ }
+ if (inputSampleR<1.2e-38 && -inputSampleR<1.2e-38) {
+ static int noisesource = 0;
+ noisesource = noisesource % 1700021; noisesource++;
+ int residue = noisesource * noisesource;
+ residue = residue % 170003; residue *= residue;
+ residue = residue % 17011; residue *= residue;
+ residue = residue % 1709; residue *= residue;
+ residue = residue % 173; residue *= residue;
+ residue = residue % 17;
+ double applyresidue = residue;
+ applyresidue *= 0.00000001;
+ applyresidue *= 0.00000001;
+ inputSampleR = applyresidue;
+ //this denormalization routine produces a white noise at -300 dB which the noise
+ //shaping will interact with to produce a bipolar output, but the noise is actually
+ //all positive. That should stop any variables from going denormal, and the routine
+ //only kicks in if digital black is input. As a final touch, if you save to 24-bit
+ //the silence will return to being digital black again.
+ }
double drySampleL = inputSampleL;
double drySampleR = inputSampleR;
@@ -968,7 +1132,94 @@ void Ditherbox::processDoubleReplacing(double **inputs, double **outputs, VstInt
//TPDF dither
break;
- case 4:
+ case 4:
+ currentDitherL = (rand()/(double)RAND_MAX);
+ inputSampleL += currentDitherL;
+ inputSampleL -= lastSampleL;
+ inputSampleL = floor(inputSampleL);
+ lastSampleL = currentDitherL;
+ currentDitherR = (rand()/(double)RAND_MAX);
+ inputSampleR += currentDitherR;
+ inputSampleR -= lastSampleR;
+ inputSampleR = floor(inputSampleR);
+ lastSampleR = currentDitherR;
+ //Paul dither
+ break;
+
+ case 5:
+ nsL[9] = nsL[8]; nsL[8] = nsL[7]; nsL[7] = nsL[6]; nsL[6] = nsL[5];
+ nsL[5] = nsL[4]; nsL[4] = nsL[3]; nsL[3] = nsL[2]; nsL[2] = nsL[1];
+ nsL[1] = nsL[0]; nsL[0] = (rand()/(double)RAND_MAX);
+
+ currentDitherL = (nsL[0] * 0.061);
+ currentDitherL -= (nsL[1] * 0.11);
+ currentDitherL += (nsL[8] * 0.126);
+ currentDitherL -= (nsL[7] * 0.23);
+ currentDitherL += (nsL[2] * 0.25);
+ currentDitherL -= (nsL[3] * 0.43);
+ currentDitherL += (nsL[6] * 0.5);
+ currentDitherL -= nsL[5];
+ currentDitherL += nsL[4];
+ //this sounds different from doing it in order of sample position
+ //cumulative tiny errors seem to build up even at this buss depth
+ //considerably more pronounced at 32 bit float.
+ //Therefore we add the most significant components LAST.
+ //trying to keep values on like exponents of the floating point value.
+ inputSampleL += currentDitherL;
+
+ inputSampleL = floor(inputSampleL);
+ //done with L
+
+ nsR[9] = nsR[8]; nsR[8] = nsR[7]; nsR[7] = nsR[6]; nsR[6] = nsR[5];
+ nsR[5] = nsR[4]; nsR[4] = nsR[3]; nsR[3] = nsR[2]; nsR[2] = nsR[1];
+ nsR[1] = nsR[0]; nsR[0] = (rand()/(double)RAND_MAX);
+
+ currentDitherR = (nsR[0] * 0.061);
+ currentDitherR -= (nsR[1] * 0.11);
+ currentDitherR += (nsR[8] * 0.126);
+ currentDitherR -= (nsR[7] * 0.23);
+ currentDitherR += (nsR[2] * 0.25);
+ currentDitherR -= (nsR[3] * 0.43);
+ currentDitherR += (nsR[6] * 0.5);
+ currentDitherR -= nsR[5];
+ currentDitherR += nsR[4];
+ //this sounds different from doing it in order of sample position
+ //cumulative tiny errors seem to build up even at this buss depth
+ //considerably more pronounced at 32 bit float.
+ //Therefore we add the most significant components LAST.
+ //trying to keep values on like exponents of the floating point value.
+ inputSampleR += currentDitherR;
+
+ inputSampleR = floor(inputSampleR);
+ //done with R
+ //DoublePaul dither
+ break;
+
+ case 6:
+ currentDitherL = (rand()/(double)RAND_MAX);
+ currentDitherR = (rand()/(double)RAND_MAX);
+
+ inputSampleL += currentDitherL;
+ inputSampleR += currentDitherR;
+ inputSampleL -= nsL[4];
+ inputSampleR -= nsR[4];
+
+ inputSampleL = floor(inputSampleL);
+ inputSampleR = floor(inputSampleR);
+
+ nsL[4] = nsL[3];
+ nsL[3] = nsL[2];
+ nsL[2] = nsL[1];
+ nsL[1] = currentDitherL;
+
+ nsR[4] = nsR[3];
+ nsR[3] = nsR[2];
+ nsR[2] = nsR[1];
+ nsR[1] = currentDitherR;
+ //Tape dither
+ break;
+
+ case 7:
Position += 1;
//Note- uses integer overflow as a 'mod' operator
hotbinA = Position * Position;
@@ -990,7 +1241,7 @@ void Ditherbox::processDoubleReplacing(double **inputs, double **outputs, VstInt
//Quadratic dither
break;
- case 5:
+ case 8:
absSample = ((rand()/(double)RAND_MAX) - 0.5);
nsL[0] += absSample; nsL[0] /= 2; absSample -= nsL[0];
absSample += ((rand()/(double)RAND_MAX) - 0.5);
@@ -1085,7 +1336,7 @@ void Ditherbox::processDoubleReplacing(double **inputs, double **outputs, VstInt
//TenNines dither R
break;
- case 6:
+ case 9:
if (inputSampleL > 0) inputSampleL += 0.383;
if (inputSampleL < 0) inputSampleL -= 0.383;
if (inputSampleR > 0) inputSampleR += 0.383;
@@ -1125,7 +1376,7 @@ void Ditherbox::processDoubleReplacing(double **inputs, double **outputs, VstInt
//and does a teeny parallel-compression thing when almost at digital black.
break;
- case 7: //this one is the original Naturalize
+ case 10: //this one is the original Naturalize
if (inputSampleL > 0) inputSampleL += (0.3333333333);
if (inputSampleL < 0) inputSampleL -= (0.3333333333);
inputSampleL += (rand()/(double)RAND_MAX)*0.6666666666;
@@ -1285,7 +1536,7 @@ void Ditherbox::processDoubleReplacing(double **inputs, double **outputs, VstInt
//end R
break;
- case 8: //this one is the Not Just Another Dither
+ case 11: //this one is the Not Just Another Dither
//begin L
benfordize = floor(inputSampleL);
@@ -1450,7 +1701,7 @@ void Ditherbox::processDoubleReplacing(double **inputs, double **outputs, VstInt
//end R
break;
- case 9:
+ case 12:
//slew only
outputSampleL = (inputSampleL - lastSampleL)*trim;
outputSampleR = (inputSampleR - lastSampleR)*trim;
@@ -1464,7 +1715,7 @@ void Ditherbox::processDoubleReplacing(double **inputs, double **outputs, VstInt
inputSampleR = outputSampleR;
break;
- case 10:
+ case 13:
//subs only
gain = gaintarget;
@@ -1680,7 +1931,7 @@ void Ditherbox::processDoubleReplacing(double **inputs, double **outputs, VstInt
if (inputSampleR < -1.0) inputSampleR = -1.0;
break;
- case 11:
+ case 14:
//silhouette
//begin L
bridgerectifier = fabs(inputSampleL)*1.57079633;