From c653c8b38fdc79f61ee191052901ac2012d476b4 Mon Sep 17 00:00:00 2001 From: Chris Johnson Date: Sun, 5 Jul 2020 22:01:06 -0400 Subject: DeRez Dither Updates (Beam, Dark, NJAD) --- .../Beam/Beam.xcodeproj/christopherjohnson.pbxuser | 58 +-- .../christopherjohnson.perspectivev3 | 33 +- plugins/MacVST/Beam/source/BeamProc.cpp | 16 +- .../Dark/Dark.xcodeproj/christopherjohnson.pbxuser | 80 +-- .../christopherjohnson.perspectivev3 | 38 +- plugins/MacVST/Dark/source/Dark.cpp | 2 +- plugins/MacVST/Dark/source/DarkProc.cpp | 20 +- .../christopherjohnson.pbxuser | 71 ++- .../christopherjohnson.perspectivev3 | 37 +- .../source/NotJustAnotherDither.cpp | 56 ++- .../source/NotJustAnotherDither.h | 10 +- .../source/NotJustAnotherDitherProc.cpp | 556 +++++++-------------- 12 files changed, 423 insertions(+), 554 deletions(-) (limited to 'plugins/MacVST') diff --git a/plugins/MacVST/Beam/Beam.xcodeproj/christopherjohnson.pbxuser b/plugins/MacVST/Beam/Beam.xcodeproj/christopherjohnson.pbxuser index bf949c7..ab6dc93 100755 --- a/plugins/MacVST/Beam/Beam.xcodeproj/christopherjohnson.pbxuser +++ b/plugins/MacVST/Beam/Beam.xcodeproj/christopherjohnson.pbxuser @@ -49,14 +49,14 @@ PBXFileDataSource_Warnings_ColumnID, ); }; - PBXPerProjectTemplateStateSaveDate = 613785702; - PBXWorkspaceStateSaveDate = 613785702; + PBXPerProjectTemplateStateSaveDate = 615684221; + PBXWorkspaceStateSaveDate = 615684221; }; perUserProjectItems = { + 8BB9A54324B296EC00CD76A8 /* PBXTextBookmark */ = 8BB9A54324B296EC00CD76A8 /* PBXTextBookmark */; + 8BB9A5B624B2988F00CD76A8 /* PBXTextBookmark */ = 8BB9A5B624B2988F00CD76A8 /* PBXTextBookmark */; 8BD150EB24956DE000B025B9 /* PBXTextBookmark */ = 8BD150EB24956DE000B025B9 /* PBXTextBookmark */; 8BD150EC24956DE000B025B9 /* PBXTextBookmark */ = 8BD150EC24956DE000B025B9 /* PBXTextBookmark */; - 8BD151822495B14D00B025B9 /* PBXTextBookmark */ = 8BD151822495B14D00B025B9 /* PBXTextBookmark */; - 8BD151892495B18A00B025B9 /* PBXTextBookmark */ = 8BD151892495B18A00B025B9 /* PBXTextBookmark */; }; sourceControlManager = 8B02375E1D42B1C400E1E8C8 /* Source Control */; userBuildSettings = { @@ -64,9 +64,9 @@ }; 2407DEB6089929BA00EB68BF /* Beam.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {740, 1859}}"; + sepNavIntBoundsRect = "{{0, 0}, {848, 1859}}"; sepNavSelRange = "{4202, 0}"; - sepNavVisRange = "{1092, 1054}"; + sepNavVisRange = "{0, 1908}"; sepNavWindowFrame = "{{530, 57}, {895, 821}}"; }; }; @@ -88,9 +88,9 @@ }; 24D8286F09A914000093AEF8 /* BeamProc.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {691, 3536}}"; - sepNavSelRange = "{5480, 0}"; - sepNavVisRange = "{5165, 926}"; + sepNavIntBoundsRect = "{{0, 0}, {691, 3471}}"; + sepNavSelRange = "{5619, 0}"; + sepNavVisRange = "{8812, 565}"; sepNavWindowFrame = "{{543, 57}, {895, 821}}"; }; }; @@ -108,6 +108,26 @@ isa = PBXCodeSenseManager; indexTemplatePath = ""; }; + 8BB9A54324B296EC00CD76A8 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 24D8286F09A914000093AEF8 /* BeamProc.cpp */; + name = "BeamProc.cpp: 164"; + rLen = 0; + rLoc = 5619; + rType = 0; + vrLen = 766; + vrLoc = 295; + }; + 8BB9A5B624B2988F00CD76A8 /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 24D8286F09A914000093AEF8 /* BeamProc.cpp */; + name = "BeamProc.cpp: 164"; + rLen = 0; + rLoc = 5619; + rType = 0; + vrLen = 565; + vrLoc = 8812; + }; 8BD150EB24956DE000B025B9 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 245463B80991757100464AD3 /* Beam.h */; @@ -128,26 +148,6 @@ vrLen = 1054; vrLoc = 1092; }; - 8BD151822495B14D00B025B9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 24D8286F09A914000093AEF8 /* BeamProc.cpp */; - name = "BeamProc.cpp: 159"; - rLen = 0; - rLoc = 5480; - rType = 0; - vrLen = 926; - vrLoc = 5161; - }; - 8BD151892495B18A00B025B9 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 24D8286F09A914000093AEF8 /* BeamProc.cpp */; - name = "BeamProc.cpp: 159"; - rLen = 0; - rLoc = 5480; - rType = 0; - vrLen = 926; - vrLoc = 5165; - }; 8D01CCC60486CAD60068D4B7 /* Beam */ = { activeExec = 0; }; diff --git a/plugins/MacVST/Beam/Beam.xcodeproj/christopherjohnson.perspectivev3 b/plugins/MacVST/Beam/Beam.xcodeproj/christopherjohnson.perspectivev3 index cc1d5e4..69d60a1 100755 --- a/plugins/MacVST/Beam/Beam.xcodeproj/christopherjohnson.perspectivev3 +++ b/plugins/MacVST/Beam/Beam.xcodeproj/christopherjohnson.perspectivev3 @@ -256,6 +256,8 @@ Layout + BecomeActive + ContentConfiguration PBXBottomSmartGroupGIDs @@ -321,7 +323,7 @@ 185 RubberWindowFrame - 621 354 810 487 0 0 1440 878 + 584 368 810 487 0 0 1440 878 Module PBXSmartGroupTreeModule @@ -349,12 +351,12 @@ _historyCapacity 0 bookmark - 8BD151892495B18A00B025B9 + 8BB9A5B624B2988F00CD76A8 history 8BD150EB24956DE000B025B9 8BD150EC24956DE000B025B9 - 8BD151822495B14D00B025B9 + 8BB9A54324B296EC00CD76A8 SplitCount @@ -368,18 +370,18 @@ GeometryConfiguration Frame - {{0, 0}, {603, 358}} + {{0, 0}, {603, 346}} RubberWindowFrame - 621 354 810 487 0 0 1440 878 + 584 368 810 487 0 0 1440 878 Module PBXNavigatorGroup Proportion - 358pt + 346pt Proportion - 83pt + 95pt Tabs @@ -393,7 +395,9 @@ GeometryConfiguration Frame - {{10, 27}, {603, 56}} + {{10, 27}, {603, 68}} + RubberWindowFrame + 584 368 810 487 0 0 1440 878 Module XCDetailModule @@ -448,8 +452,6 @@ Frame {{10, 27}, {603, 56}} - RubberWindowFrame - 621 354 810 487 0 0 1440 878 Module PBXBuildResultsModule @@ -477,11 +479,11 @@ TableOfContents - 8BD1518A2495B18A00B025B9 + 8BB9A5B724B2988F00CD76A8 1CA23ED40692098700951B8B - 8BD1518B2495B18A00B025B9 + 8BB9A5B824B2988F00CD76A8 8B0237581D42B1C400E1E8C8 - 8BD1518C2495B18A00B025B9 + 8BB9A5B924B2988F00CD76A8 1CA23EDF0692099D00951B8B 1CA23EE00692099D00951B8B 1CA23EE10692099D00951B8B @@ -634,7 +636,7 @@ StatusbarIsVisible TimeStamp - 613790090.00095999 + 615684239.58308196 ToolbarConfigUserDefaultsMinorVersion 2 ToolbarDisplayMode @@ -651,11 +653,10 @@ 5 WindowOrderList - 8BD1518D2495B18A00B025B9 /Users/christopherjohnson/Desktop/Dithers/MacVST/Beam/Beam.xcodeproj WindowString - 621 354 810 487 0 0 1440 878 + 584 368 810 487 0 0 1440 878 WindowToolsV3 diff --git a/plugins/MacVST/Beam/source/BeamProc.cpp b/plugins/MacVST/Beam/source/BeamProc.cpp index 920f5b4..5871eb5 100755 --- a/plugins/MacVST/Beam/source/BeamProc.cpp +++ b/plugins/MacVST/Beam/source/BeamProc.cpp @@ -30,6 +30,8 @@ void Beam::processReplacing(float **inputs, float **outputs, VstInt32 sampleFram float derez = C; if (derez > 0.0) scaleFactor *= pow(1.0-derez,6); if (scaleFactor < 0.0001) scaleFactor = 0.0001; + float outScale = scaleFactor; + if (outScale < 8.0) outScale = 8.0; while (--sampleFrames >= 0) { @@ -121,8 +123,8 @@ void Beam::processReplacing(float **inputs, float **outputs, VstInt32 sampleFram lastSampleR[0] = inputSampleR; //end right - inputSampleL /= scaleFactor; - inputSampleR /= scaleFactor; + inputSampleL /= outScale; + inputSampleR /= outScale; *out1 = inputSampleL; *out2 = inputSampleR; @@ -156,8 +158,10 @@ void Beam::processDoubleReplacing(double **inputs, double **outputs, VstInt32 sa else scaleFactor = 32768.0; float derez = C; if (derez > 0.0) scaleFactor *= pow(1.0-derez,6); - if (scaleFactor < 1.0) scaleFactor = 1.0; - + if (scaleFactor < 0.0001) scaleFactor = 0.0001; + float outScale = scaleFactor; + if (outScale < 8.0) outScale = 8.0; + while (--sampleFrames >= 0) { long double inputSampleL = *in1; @@ -248,8 +252,8 @@ void Beam::processDoubleReplacing(double **inputs, double **outputs, VstInt32 sa lastSampleR[0] = inputSampleR; //end right - inputSampleL /= scaleFactor; - inputSampleR /= scaleFactor; + inputSampleL /= outScale; + inputSampleR /= outScale; *out1 = inputSampleL; *out2 = inputSampleR; diff --git a/plugins/MacVST/Dark/Dark.xcodeproj/christopherjohnson.pbxuser b/plugins/MacVST/Dark/Dark.xcodeproj/christopherjohnson.pbxuser index ab4e77f..fade19f 100755 --- a/plugins/MacVST/Dark/Dark.xcodeproj/christopherjohnson.pbxuser +++ b/plugins/MacVST/Dark/Dark.xcodeproj/christopherjohnson.pbxuser @@ -10,7 +10,7 @@ PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID; PBXFileTableDataSourceColumnWidthsKey = ( 20, - 364, + 433, 20, 48, 43, @@ -49,14 +49,14 @@ PBXFileDataSource_Warnings_ColumnID, ); }; - PBXPerProjectTemplateStateSaveDate = 613785687; - PBXWorkspaceStateSaveDate = 613785687; + PBXPerProjectTemplateStateSaveDate = 615684199; + PBXWorkspaceStateSaveDate = 615684199; }; perUserProjectItems = { - 8BD150E724956DDF00B025B9 /* PBXTextBookmark */ = 8BD150E724956DDF00B025B9 /* PBXTextBookmark */; - 8BD150E824956DDF00B025B9 /* PBXTextBookmark */ = 8BD150E824956DDF00B025B9 /* PBXTextBookmark */; - 8BD150EA24956DDF00B025B9 /* PBXTextBookmark */ = 8BD150EA24956DDF00B025B9 /* PBXTextBookmark */; - 8BD151602495A6F400B025B9 /* PBXTextBookmark */ = 8BD151602495A6F400B025B9 /* PBXTextBookmark */; + 8BB07C2224B14991000F894A /* PBXTextBookmark */ = 8BB07C2224B14991000F894A /* PBXTextBookmark */; + 8BB07C8D24B14CB2000F894A /* PBXTextBookmark */ = 8BB07C8D24B14CB2000F894A /* PBXTextBookmark */; + 8BB9A52024B2969B00CD76A8 /* PBXTextBookmark */ = 8BB9A52024B2969B00CD76A8 /* PBXTextBookmark */; + 8BB9A59624B2987700CD76A8 /* PBXTextBookmark */ = 8BB9A59624B2987700CD76A8 /* PBXTextBookmark */; }; sourceControlManager = 8B02375E1D42B1C400E1E8C8 /* Source Control */; userBuildSettings = { @@ -64,18 +64,18 @@ }; 2407DEB6089929BA00EB68BF /* Dark.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {740, 1807}}"; - sepNavSelRange = "{4061, 0}"; - sepNavVisRange = "{1333, 920}"; - sepNavWindowFrame = "{{559, 57}, {895, 821}}"; + sepNavIntBoundsRect = "{{0, 0}, {656, 1768}}"; + sepNavSelRange = "{4121, 231}"; + sepNavVisRange = "{3916, 978}"; + sepNavWindowFrame = "{{545, 57}, {895, 821}}"; }; }; 245463B80991757100464AD3 /* Dark.h */ = { uiCtxt = { sepNavIntBoundsRect = "{{0, 0}, {866, 858}}"; - sepNavSelRange = "{2475, 0}"; - sepNavVisRange = "{204, 390}"; - sepNavWindowFrame = "{{545, 57}, {895, 821}}"; + sepNavSelRange = "{2418, 59}"; + sepNavVisRange = "{0, 580}"; + sepNavWindowFrame = "{{888, -91}, {895, 821}}"; }; }; 24A2FFDB0F90D1DD003BB5A7 /* audioeffectx.cpp */ = { @@ -88,9 +88,9 @@ }; 24D8286F09A914000093AEF8 /* DarkProc.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {656, 3146}}"; - sepNavSelRange = "{4768, 0}"; - sepNavVisRange = "{4380, 807}"; + sepNavIntBoundsRect = "{{0, 0}, {656, 3107}}"; + sepNavSelRange = "{4793, 117}"; + sepNavVisRange = "{4314, 1529}"; sepNavWindowFrame = "{{531, 57}, {895, 821}}"; }; }; @@ -108,45 +108,45 @@ isa = PBXCodeSenseManager; indexTemplatePath = ""; }; - 8BD150E724956DDF00B025B9 /* PBXTextBookmark */ = { + 8BB07C2224B14991000F894A /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 245463B80991757100464AD3 /* Dark.h */; - name = "Dark.h: 62"; - rLen = 0; - rLoc = 2475; + name = "Dark.h: 58"; + rLen = 59; + rLoc = 2418; rType = 0; - vrLen = 390; - vrLoc = 204; + vrLen = 580; + vrLoc = 0; }; - 8BD150E824956DDF00B025B9 /* PBXTextBookmark */ = { + 8BB07C8D24B14CB2000F894A /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 2407DEB6089929BA00EB68BF /* Dark.cpp */; - name = "Dark.cpp: 110"; - rLen = 0; - rLoc = 4061; + name = "Dark.cpp: 112"; + rLen = 231; + rLoc = 4121; rType = 0; - vrLen = 920; - vrLoc = 1333; + vrLen = 978; + vrLoc = 3916; }; - 8BD150EA24956DDF00B025B9 /* PBXTextBookmark */ = { + 8BB9A52024B2969B00CD76A8 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 24D8286F09A914000093AEF8 /* DarkProc.cpp */; - name = "DarkProc.cpp: 143"; + name = "DarkProc.cpp: 227"; rLen = 0; - rLoc = 4770; + rLoc = 7947; rType = 0; - vrLen = 881; - vrLoc = 642; + vrLen = 1334; + vrLoc = 6717; }; - 8BD151602495A6F400B025B9 /* PBXTextBookmark */ = { + 8BB9A59624B2987700CD76A8 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 24D8286F09A914000093AEF8 /* DarkProc.cpp */; - name = "DarkProc.cpp: 142"; - rLen = 0; - rLoc = 4768; + name = "DarkProc.cpp: 146"; + rLen = 117; + rLoc = 4793; rType = 0; - vrLen = 807; - vrLoc = 4380; + vrLen = 1529; + vrLoc = 4314; }; 8D01CCC60486CAD60068D4B7 /* Dark */ = { activeExec = 0; diff --git a/plugins/MacVST/Dark/Dark.xcodeproj/christopherjohnson.perspectivev3 b/plugins/MacVST/Dark/Dark.xcodeproj/christopherjohnson.perspectivev3 index 0626f1d..9acdef6 100755 --- a/plugins/MacVST/Dark/Dark.xcodeproj/christopherjohnson.perspectivev3 +++ b/plugins/MacVST/Dark/Dark.xcodeproj/christopherjohnson.perspectivev3 @@ -304,7 +304,7 @@ PBXSmartGroupTreeModuleOutlineStateVisibleRectKey - {{0, 0}, {185, 428}} + {{0, 0}, {185, 695}} PBXTopSmartGroupGIDs @@ -314,14 +314,14 @@ GeometryConfiguration Frame - {{0, 0}, {202, 446}} + {{0, 0}, {202, 713}} GroupTreeTableConfiguration MainColumn 185 RubberWindowFrame - 625 378 810 487 0 0 1440 878 + 493 122 879 754 0 0 1440 878 Module PBXSmartGroupTreeModule @@ -351,12 +351,12 @@ _historyCapacity 0 bookmark - 8BD151602495A6F400B025B9 + 8BB9A59624B2987700CD76A8 history - 8BD150E724956DDF00B025B9 - 8BD150E824956DDF00B025B9 - 8BD150EA24956DDF00B025B9 + 8BB07C2224B14991000F894A + 8BB07C8D24B14CB2000F894A + 8BB9A52024B2969B00CD76A8 SplitCount @@ -370,18 +370,18 @@ GeometryConfiguration Frame - {{0, 0}, {603, 334}} + {{0, 0}, {672, 593}} RubberWindowFrame - 625 378 810 487 0 0 1440 878 + 493 122 879 754 0 0 1440 878 Module PBXNavigatorGroup Proportion - 334pt + 593pt Proportion - 107pt + 115pt Tabs @@ -395,9 +395,9 @@ GeometryConfiguration Frame - {{10, 27}, {603, 80}} + {{10, 27}, {672, 88}} RubberWindowFrame - 625 378 810 487 0 0 1440 878 + 493 122 879 754 0 0 1440 878 Module XCDetailModule @@ -460,7 +460,7 @@ Proportion - 603pt + 672pt Name @@ -479,11 +479,11 @@ TableOfContents - 8BD151612495A6F400B025B9 + 8BB9A59724B2987700CD76A8 1CA23ED40692098700951B8B - 8BD151622495A6F400B025B9 + 8BB9A59824B2987700CD76A8 8B0237581D42B1C400E1E8C8 - 8BD151632495A6F400B025B9 + 8BB9A59924B2987700CD76A8 1CA23EDF0692099D00951B8B 1CA23EE00692099D00951B8B 1CA23EE10692099D00951B8B @@ -636,7 +636,7 @@ StatusbarIsVisible TimeStamp - 613787380.50059402 + 615684215.23886502 ToolbarConfigUserDefaultsMinorVersion 2 ToolbarDisplayMode @@ -656,7 +656,7 @@ /Users/christopherjohnson/Desktop/Dithers/MacVST/Dark/Dark.xcodeproj WindowString - 625 378 810 487 0 0 1440 878 + 493 122 879 754 0 0 1440 878 WindowToolsV3 diff --git a/plugins/MacVST/Dark/source/Dark.cpp b/plugins/MacVST/Dark/source/Dark.cpp index bae0428..f652aa4 100755 --- a/plugins/MacVST/Dark/source/Dark.cpp +++ b/plugins/MacVST/Dark/source/Dark.cpp @@ -14,11 +14,11 @@ Dark::Dark(audioMasterCallback audioMaster) : { A = 1.0; B = 0.0; + fpd = 17; for(int count = 0; count < 99; count++) { lastSampleL[count] = 0; lastSampleR[count] = 0; } - fpd = 17; //this is reset: values being initialized only once. Startup values, whatever they are. _canDo.insert("plugAsChannelInsert"); // plug-in can be used as a channel insert effect. diff --git a/plugins/MacVST/Dark/source/DarkProc.cpp b/plugins/MacVST/Dark/source/DarkProc.cpp index 2aa85c4..955a53f 100755 --- a/plugins/MacVST/Dark/source/DarkProc.cpp +++ b/plugins/MacVST/Dark/source/DarkProc.cpp @@ -13,13 +13,14 @@ void Dark::processReplacing(float **inputs, float **outputs, VstInt32 sampleFram float* in2 = inputs[1]; float* out1 = outputs[0]; float* out2 = outputs[1]; - int processing = (VstInt32)( A * 1.999 ); double overallscale = 1.0; overallscale /= 44100.0; overallscale *= getSampleRate(); int depth = (int)(17.0*overallscale); if (depth < 3) depth = 3; if (depth > 98) depth = 98; + + int processing = (VstInt32)( A * 1.999 ); bool highres = false; if (processing == 1) highres = true; float scaleFactor; @@ -28,6 +29,8 @@ void Dark::processReplacing(float **inputs, float **outputs, VstInt32 sampleFram float derez = B; if (derez > 0.0) scaleFactor *= pow(1.0-derez,6); if (scaleFactor < 0.0001) scaleFactor = 0.0001; + float outScale = scaleFactor; + if (outScale < 8.0) outScale = 8.0; while (--sampleFrames >= 0) { @@ -105,8 +108,8 @@ void Dark::processReplacing(float **inputs, float **outputs, VstInt32 sampleFram lastSampleR[0] = inputSampleR; //end right - inputSampleL /= scaleFactor; - inputSampleR /= scaleFactor; + inputSampleL /= outScale; + inputSampleR /= outScale; *out1 = inputSampleL; *out2 = inputSampleR; @@ -125,13 +128,14 @@ void Dark::processDoubleReplacing(double **inputs, double **outputs, VstInt32 sa double* out1 = outputs[0]; double* out2 = outputs[1]; - int processing = (VstInt32)( A * 1.999 ); double overallscale = 1.0; overallscale /= 44100.0; overallscale *= getSampleRate(); int depth = (int)(17.0*overallscale); if (depth < 3) depth = 3; if (depth > 98) depth = 98; + + int processing = (VstInt32)( A * 1.999 ); bool highres = false; if (processing == 1) highres = true; float scaleFactor; @@ -139,7 +143,9 @@ void Dark::processDoubleReplacing(double **inputs, double **outputs, VstInt32 sa else scaleFactor = 32768.0; float derez = B; if (derez > 0.0) scaleFactor *= pow(1.0-derez,6); - if (scaleFactor < 1.0) scaleFactor = 1.0; + if (scaleFactor < 0.0001) scaleFactor = 0.0001; + float outScale = scaleFactor; + if (outScale < 8.0) outScale = 8.0; while (--sampleFrames >= 0) { @@ -217,8 +223,8 @@ void Dark::processDoubleReplacing(double **inputs, double **outputs, VstInt32 sa lastSampleR[0] = inputSampleR; //end right - inputSampleL /= scaleFactor; - inputSampleR /= scaleFactor; + inputSampleL /= outScale; + inputSampleR /= outScale; *out1 = inputSampleL; *out2 = inputSampleR; diff --git a/plugins/MacVST/NotJustAnotherDither/NotJustAnotherDither.xcodeproj/christopherjohnson.pbxuser b/plugins/MacVST/NotJustAnotherDither/NotJustAnotherDither.xcodeproj/christopherjohnson.pbxuser index baca580..0c7cd53 100755 --- a/plugins/MacVST/NotJustAnotherDither/NotJustAnotherDither.xcodeproj/christopherjohnson.pbxuser +++ b/plugins/MacVST/NotJustAnotherDither/NotJustAnotherDither.xcodeproj/christopherjohnson.pbxuser @@ -49,14 +49,13 @@ PBXFileDataSource_Warnings_ColumnID, ); }; - PBXPerProjectTemplateStateSaveDate = 557696448; - PBXWorkspaceStateSaveDate = 557696448; + PBXPerProjectTemplateStateSaveDate = 615684254; + PBXWorkspaceStateSaveDate = 615684254; }; perUserProjectItems = { - 8B7E3DCF20A6735C00482CB5 /* PBXTextBookmark */ = 8B7E3DCF20A6735C00482CB5 /* PBXTextBookmark */; - 8B7E3DD020A6735C00482CB5 /* PBXTextBookmark */ = 8B7E3DD020A6735C00482CB5 /* PBXTextBookmark */; - 8B91401D213DC60B00BA6EEC /* PBXTextBookmark */ = 8B91401D213DC60B00BA6EEC /* PBXTextBookmark */; - 8B91401E213DC60B00BA6EEC /* PBXTextBookmark */ = 8B91401E213DC60B00BA6EEC /* PBXTextBookmark */; + 8BB9A42324B28A6700CD76A8 /* PBXTextBookmark */ = 8BB9A42324B28A6700CD76A8 /* PBXTextBookmark */; + 8BB9A50B24B2963800CD76A8 /* PBXTextBookmark */ = 8BB9A50B24B2963800CD76A8 /* PBXTextBookmark */; + 8BB9A5D724B298B700CD76A8 /* PBXTextBookmark */ = 8BB9A5D724B298B700CD76A8 /* PBXTextBookmark */; }; sourceControlManager = 8B02375E1D42B1C400E1E8C8 /* Source Control */; userBuildSettings = { @@ -64,34 +63,34 @@ }; 2407DEB6089929BA00EB68BF /* NotJustAnotherDither.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {810, 1352}}"; - sepNavSelRange = "{528, 392}"; - sepNavVisRange = "{1431, 451}"; - sepNavWindowFrame = "{{12, 47}, {895, 831}}"; + sepNavIntBoundsRect = "{{0, 0}, {848, 2028}}"; + sepNavSelRange = "{4950, 0}"; + sepNavVisRange = "{3151, 2322}"; + sepNavWindowFrame = "{{12, 57}, {895, 821}}"; }; }; 245463B80991757100464AD3 /* NotJustAnotherDither.h */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {481, 832}}"; + sepNavIntBoundsRect = "{{0, 0}, {481, 897}}"; sepNavSelRange = "{0, 0}"; - sepNavVisRange = "{0, 331}"; - sepNavWindowFrame = "{{20, 47}, {895, 831}}"; + sepNavVisRange = "{0, 237}"; + sepNavWindowFrame = "{{20, 57}, {895, 821}}"; }; }; 24A2FFDB0F90D1DD003BB5A7 /* audioeffectx.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {838, 19838}}"; + sepNavIntBoundsRect = "{{0, 0}, {838, 19890}}"; sepNavSelRange = "{10616, 0}"; - sepNavVisRange = "{10613, 123}"; + sepNavVisRange = "{10459, 280}"; sepNavWindowFrame = "{{15, 42}, {895, 831}}"; }; }; 24D8286F09A914000093AEF8 /* NotJustAnotherDitherProc.cpp */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {677, 6474}}"; - sepNavSelRange = "{2713, 0}"; - sepNavVisRange = "{1671, 272}"; - sepNavWindowFrame = "{{545, 47}, {895, 831}}"; + sepNavIntBoundsRect = "{{0, 0}, {768, 4147}}"; + sepNavSelRange = "{6513, 0}"; + sepNavVisRange = "{6511, 68}"; + sepNavWindowFrame = "{{24, 57}, {895, 821}}"; }; }; 8B02375E1D42B1C400E1E8C8 /* Source Control */ = { @@ -108,45 +107,35 @@ isa = PBXCodeSenseManager; indexTemplatePath = ""; }; - 8B7E3DCF20A6735C00482CB5 /* PBXTextBookmark */ = { + 8BB9A42324B28A6700CD76A8 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 245463B80991757100464AD3 /* NotJustAnotherDither.h */; name = "NotJustAnotherDither.h: 1"; rLen = 0; rLoc = 0; rType = 0; - vrLen = 331; + vrLen = 237; vrLoc = 0; }; - 8B7E3DD020A6735C00482CB5 /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 2407DEB6089929BA00EB68BF /* NotJustAnotherDither.cpp */; - name = "NotJustAnotherDither.cpp: 15"; - rLen = 392; - rLoc = 528; - rType = 0; - vrLen = 451; - vrLoc = 1431; - }; - 8B91401D213DC60B00BA6EEC /* PBXTextBookmark */ = { + 8BB9A50B24B2963800CD76A8 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 24D8286F09A914000093AEF8 /* NotJustAnotherDitherProc.cpp */; - name = "NotJustAnotherDitherProc.cpp: 73"; + name = "NotJustAnotherDitherProc.cpp: 171"; rLen = 0; - rLoc = 2713; + rLoc = 6513; rType = 0; - vrLen = 272; - vrLoc = 1671; + vrLen = 130; + vrLoc = 6449; }; - 8B91401E213DC60B00BA6EEC /* PBXTextBookmark */ = { + 8BB9A5D724B298B700CD76A8 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 24D8286F09A914000093AEF8 /* NotJustAnotherDitherProc.cpp */; - name = "NotJustAnotherDitherProc.cpp: 73"; + name = "NotJustAnotherDitherProc.cpp: 171"; rLen = 0; - rLoc = 2713; + rLoc = 6513; rType = 0; - vrLen = 272; - vrLoc = 1671; + vrLen = 68; + vrLoc = 6511; }; 8D01CCC60486CAD60068D4B7 /* NotJustAnotherDither */ = { activeExec = 0; diff --git a/plugins/MacVST/NotJustAnotherDither/NotJustAnotherDither.xcodeproj/christopherjohnson.perspectivev3 b/plugins/MacVST/NotJustAnotherDither/NotJustAnotherDither.xcodeproj/christopherjohnson.perspectivev3 index 0bb2bde..42e7114 100755 --- a/plugins/MacVST/NotJustAnotherDither/NotJustAnotherDither.xcodeproj/christopherjohnson.perspectivev3 +++ b/plugins/MacVST/NotJustAnotherDither/NotJustAnotherDither.xcodeproj/christopherjohnson.perspectivev3 @@ -323,7 +323,7 @@ 258 RubberWindowFrame - 630 259 810 487 0 0 1440 878 + 17 360 810 487 0 0 1440 878 Module PBXSmartGroupTreeModule @@ -351,12 +351,11 @@ _historyCapacity 0 bookmark - 8B91401E213DC60B00BA6EEC + 8BB9A5D724B298B700CD76A8 history - 8B7E3DCF20A6735C00482CB5 - 8B7E3DD020A6735C00482CB5 - 8B91401D213DC60B00BA6EEC + 8BB9A42324B28A6700CD76A8 + 8BB9A50B24B2963800CD76A8 SplitCount @@ -370,18 +369,18 @@ GeometryConfiguration Frame - {{0, 0}, {530, 117}} + {{0, 0}, {530, 69}} RubberWindowFrame - 630 259 810 487 0 0 1440 878 + 17 360 810 487 0 0 1440 878 Module PBXNavigatorGroup Proportion - 117pt + 69pt Proportion - 324pt + 372pt Tabs @@ -395,9 +394,9 @@ GeometryConfiguration Frame - {{10, 27}, {530, 297}} + {{10, 27}, {530, 345}} RubberWindowFrame - 630 259 810 487 0 0 1440 878 + 17 360 810 487 0 0 1440 878 Module XCDetailModule @@ -451,7 +450,7 @@ GeometryConfiguration Frame - {{10, 27}, {603, 345}} + {{10, 27}, {530, 282}} Module PBXBuildResultsModule @@ -479,11 +478,11 @@ TableOfContents - 8B91401F213DC60B00BA6EEC + 8BB9A5D824B298B700CD76A8 1CA23ED40692098700951B8B - 8B914020213DC60B00BA6EEC + 8BB9A5D924B298B700CD76A8 8B0237581D42B1C400E1E8C8 - 8B914021213DC60B00BA6EEC + 8BB9A5DA24B298B700CD76A8 1CA23EDF0692099D00951B8B 1CA23EE00692099D00951B8B 1CA23EE10692099D00951B8B @@ -636,7 +635,7 @@ StatusbarIsVisible TimeStamp - 557696523.36446095 + 615684279.64847696 ToolbarConfigUserDefaultsMinorVersion 2 ToolbarDisplayMode @@ -653,11 +652,11 @@ 5 WindowOrderList - 8B914022213DC60B00BA6EEC - /Users/christopherjohnson/Desktop/MacVST/NotJustAnotherDither/NotJustAnotherDither.xcodeproj + 8BB9A5DB24B298B700CD76A8 + /Users/christopherjohnson/Desktop/NotJustAnotherDither/NotJustAnotherDither.xcodeproj WindowString - 630 259 810 487 0 0 1440 878 + 17 360 810 487 0 0 1440 878 WindowToolsV3 diff --git a/plugins/MacVST/NotJustAnotherDither/source/NotJustAnotherDither.cpp b/plugins/MacVST/NotJustAnotherDither/source/NotJustAnotherDither.cpp index 22a3cc7..7727b50 100755 --- a/plugins/MacVST/NotJustAnotherDither/source/NotJustAnotherDither.cpp +++ b/plugins/MacVST/NotJustAnotherDither/source/NotJustAnotherDither.cpp @@ -12,6 +12,9 @@ AudioEffect* createEffectInstance(audioMasterCallback audioMaster) {return new N NotJustAnotherDither::NotJustAnotherDither(audioMasterCallback audioMaster) : AudioEffectX(audioMaster, kNumPrograms, kNumParameters) { + A = 1.0; + B = 0.0; + fpd = 17; bynL[0] = 1000; bynL[1] = 301; bynL[2] = 176; @@ -58,31 +61,80 @@ void NotJustAnotherDither::getProgramName(char *name) {vst_strncpy (name, _progr //airwindows likes to ignore this stuff. Make your own programs, and make a different plugin rather than //trying to do versioning and preventing people from using older versions. Maybe they like the old one! +static float pinParameter(float data) +{ + if (data < 0.0f) return 0.0f; + if (data > 1.0f) return 1.0f; + return data; +} VstInt32 NotJustAnotherDither::getChunk (void** data, bool isPreset) { + float *chunkData = (float *)calloc(kNumParameters, sizeof(float)); + chunkData[0] = A; + chunkData[1] = B; + /* Note: The way this is set up, it will break if you manage to save settings on an Intel + machine and load them on a PPC Mac. However, it's fine if you stick to the machine you + started with. */ + + *data = chunkData; return kNumParameters * sizeof(float); } VstInt32 NotJustAnotherDither::setChunk (void* data, VstInt32 byteSize, bool isPreset) { + float *chunkData = (float *)data; + A = pinParameter(chunkData[0]); + B = pinParameter(chunkData[1]); + /* We're ignoring byteSize as we found it to be a filthy liar */ + + /* calculate any other fields you need here - you could copy in + code from setParameter() here. */ return 0; } void NotJustAnotherDither::setParameter(VstInt32 index, float value) { - } + switch (index) { + case kParamA: A = value; break; + case kParamB: B = value; break; + default: throw; // unknown parameter, shouldn't happen! + } +} float NotJustAnotherDither::getParameter(VstInt32 index) { - return 0.0; //we only need to update the relevant name, this is simple to manage + switch (index) { + case kParamA: return A; break; + case kParamB: return B; break; + default: break; // unknown parameter, shouldn't happen! + } return 0.0; //we only need to update the relevant name, this is simple to manage } void NotJustAnotherDither::getParameterName(VstInt32 index, char *text) { + switch (index) { + case kParamA: vst_strncpy (text, "Quant", kVstMaxParamStrLen); break; + case kParamB: vst_strncpy (text, "DeRez", kVstMaxParamStrLen); break; + default: break; // unknown parameter, shouldn't happen! + } //this is our labels for displaying in the VST host } void NotJustAnotherDither::getParameterDisplay(VstInt32 index, char *text) { + switch (index) { + case kParamA: switch((VstInt32)( A * 1.999 )) //0 to almost edge of # of params + { case 0: vst_strncpy (text, "CD 16", kVstMaxParamStrLen); break; + case 1: vst_strncpy (text, "HD 24", kVstMaxParamStrLen); break; + default: break; // unknown parameter, shouldn't happen! + } break; //completed consoletype 'popup' parameter, exit + case kParamB: float2string (B, text, kVstMaxParamStrLen); break; + default: break; // unknown parameter, shouldn't happen! + } //this displays the values and handles 'popups' where it's discrete choices } void NotJustAnotherDither::getParameterLabel(VstInt32 index, char *text) { + switch (index) { + case kParamA: vst_strncpy (text, "", kVstMaxParamStrLen); break; + case kParamB: vst_strncpy (text, "", kVstMaxParamStrLen); break; + default: break; // unknown parameter, shouldn't happen! + } } VstInt32 NotJustAnotherDither::canDo(char *text) diff --git a/plugins/MacVST/NotJustAnotherDither/source/NotJustAnotherDither.h b/plugins/MacVST/NotJustAnotherDither/source/NotJustAnotherDither.h index 37abf4c..5ca0c0a 100755 --- a/plugins/MacVST/NotJustAnotherDither/source/NotJustAnotherDither.h +++ b/plugins/MacVST/NotJustAnotherDither/source/NotJustAnotherDither.h @@ -16,7 +16,9 @@ #include enum { - kNumParameters = 0 + kParamA = 0, + kParamB = 1, + kNumParameters = 2 }; // const int kNumPrograms = 0; @@ -55,7 +57,11 @@ private: double bynR[13]; long double noiseShapingL; long double noiseShapingR; - + uint32_t fpd; + //default stuff + + float A; + float B; }; #endif diff --git a/plugins/MacVST/NotJustAnotherDither/source/NotJustAnotherDitherProc.cpp b/plugins/MacVST/NotJustAnotherDither/source/NotJustAnotherDitherProc.cpp index cbc6cc3..1a80711 100755 --- a/plugins/MacVST/NotJustAnotherDither/source/NotJustAnotherDitherProc.cpp +++ b/plugins/MacVST/NotJustAnotherDither/source/NotJustAnotherDitherProc.cpp @@ -14,237 +14,143 @@ void NotJustAnotherDither::processReplacing(float **inputs, float **outputs, Vst float* out1 = outputs[0]; float* out2 = outputs[1]; - long double inputSampleL; - long double inputSampleR; - - double benfordize; - int hotbinA; - int hotbinB; - double totalA; - double totalB; - float drySampleL; - float drySampleR; + int processing = (VstInt32)( A * 1.999 ); + bool highres = false; + if (processing == 1) highres = true; + float scaleFactor; + if (highres) scaleFactor = 8388608.0; + else scaleFactor = 32768.0; + float derez = B; + if (derez > 0.0) scaleFactor *= pow(1.0-derez,6); + if (scaleFactor < 0.0001) scaleFactor = 0.0001; + float outScale = scaleFactor; + if (outScale < 8.0) outScale = 8.0; + while (--sampleFrames >= 0) { - inputSampleL = *in1; - 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. - } - drySampleL = inputSampleL; - drySampleR = inputSampleR; + long double inputSampleL = *in1; + long double inputSampleR = *in2; + if (fabs(inputSampleL)<1.18e-37) inputSampleL = fpd * 1.18e-37; + fpd ^= fpd << 13; fpd ^= fpd >> 17; fpd ^= fpd << 5; + if (fabs(inputSampleR)<1.18e-37) inputSampleR = fpd * 1.18e-37; + fpd ^= fpd << 13; fpd ^= fpd >> 17; fpd ^= fpd << 5; + + inputSampleL *= scaleFactor; + inputSampleR *= scaleFactor; + //0-1 is now one bit, now we dither + //begin Not Just Another Dither + bool cutbinsL; cutbinsL = false; + bool cutbinsR; cutbinsR = false; + long double drySampleL; drySampleL = inputSampleL; + long double drySampleR; drySampleR = inputSampleR; inputSampleL -= noiseShapingL; inputSampleR -= noiseShapingR; - - inputSampleL *= 8388608.0; - inputSampleR *= 8388608.0; - //0-1 is now one bit, now we dither - - //begin L - benfordize = floor(inputSampleL); - 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); + + //NJAD L + long double benfordize; benfordize = floor(inputSampleL); + while (benfordize >= 1.0) benfordize /= 10; + while (benfordize < 1.0 && benfordize > 0.0000001) benfordize *= 10; + int hotbinA; hotbinA = floor(benfordize); //hotbin becomes the Benford bin value for this number floored - totalA = 0; + long double totalA; totalA = 0; if ((hotbinA > 0) && (hotbinA < 10)) { - bynL[hotbinA] += 1; - totalA += (301-bynL[1]); - totalA += (176-bynL[2]); - totalA += (125-bynL[3]); - totalA += (97-bynL[4]); - totalA += (79-bynL[5]); - totalA += (67-bynL[6]); - totalA += (58-bynL[7]); - totalA += (51-bynL[8]); - totalA += (46-bynL[9]); + bynL[hotbinA] += 1; if (bynL[hotbinA] > 982) cutbinsL = true; + totalA += (301-bynL[1]); totalA += (176-bynL[2]); totalA += (125-bynL[3]); + totalA += (97-bynL[4]); totalA += (79-bynL[5]); totalA += (67-bynL[6]); + totalA += (58-bynL[7]); totalA += (51-bynL[8]); totalA += (46-bynL[9]); bynL[hotbinA] -= 1; - } else {hotbinA = 10;} + } else hotbinA = 10; //produce total number- smaller is closer to Benford real benfordize = ceil(inputSampleL); - 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); + while (benfordize >= 1.0) benfordize /= 10; + while (benfordize < 1.0 && benfordize > 0.0000001) benfordize *= 10; + int hotbinB; hotbinB = floor(benfordize); //hotbin becomes the Benford bin value for this number ceiled - totalB = 0; + long double totalB; totalB = 0; if ((hotbinB > 0) && (hotbinB < 10)) { - bynL[hotbinB] += 1; - totalB += (301-bynL[1]); - totalB += (176-bynL[2]); - totalB += (125-bynL[3]); - totalB += (97-bynL[4]); - totalB += (79-bynL[5]); - totalB += (67-bynL[6]); - totalB += (58-bynL[7]); - totalB += (51-bynL[8]); - totalB += (46-bynL[9]); + bynL[hotbinB] += 1; if (bynL[hotbinB] > 982) cutbinsL = true; + totalB += (301-bynL[1]); totalB += (176-bynL[2]); totalB += (125-bynL[3]); + totalB += (97-bynL[4]); totalB += (79-bynL[5]); totalB += (67-bynL[6]); + totalB += (58-bynL[7]); totalB += (51-bynL[8]); totalB += (46-bynL[9]); bynL[hotbinB] -= 1; - } else {hotbinB = 10;} + } else hotbinB = 10; //produce total number- smaller is closer to Benford real - if (totalA < totalB) - { - bynL[hotbinA] += 1; - inputSampleL = floor(inputSampleL); - } - else - { - bynL[hotbinB] += 1; - inputSampleL = ceil(inputSampleL); - } + long double outputSample; + if (totalA < totalB) {bynL[hotbinA] += 1; outputSample = floor(inputSampleL);} + else {bynL[hotbinB] += 1; outputSample = floor(inputSampleL+1);} //assign the relevant one to the delay line //and floor/ceil signal accordingly + if (cutbinsL) { + bynL[1] *= 0.99; bynL[2] *= 0.99; bynL[3] *= 0.99; bynL[4] *= 0.99; bynL[5] *= 0.99; + bynL[6] *= 0.99; bynL[7] *= 0.99; bynL[8] *= 0.99; bynL[9] *= 0.99; bynL[10] *= 0.99; + } + noiseShapingL += outputSample - drySampleL; + if (noiseShapingL > fabs(inputSampleL)) noiseShapingL = fabs(inputSampleL); + if (noiseShapingL < -fabs(inputSampleL)) noiseShapingL = -fabs(inputSampleL); + //finished NJAD L - totalA = bynL[1] + bynL[2] + bynL[3] + bynL[4] + bynL[5] + bynL[6] + bynL[7] + bynL[8] + bynL[9]; - totalA /= 1000; - if (totalA = 0) totalA = 1; // spotted by Laserbat: this 'scaling back' code doesn't. It always divides by the fallback of 1. Old NJAD doesn't scale back the things we're comparing against. Kept to retain known behavior, use the one in StudioTan and Monitoring for a tuned-as-intended NJAD. - bynL[1] /= totalA; - bynL[2] /= totalA; - bynL[3] /= totalA; - bynL[4] /= totalA; - bynL[5] /= totalA; - bynL[6] /= totalA; - bynL[7] /= totalA; - bynL[8] /= totalA; - bynL[9] /= totalA; - bynL[10] /= 2; //catchall for garbage data - //end L - - //begin R + //NJAD R benfordize = floor(inputSampleR); - 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;} + while (benfordize >= 1.0) benfordize /= 10; + while (benfordize < 1.0 && benfordize > 0.0000001) benfordize *= 10; hotbinA = floor(benfordize); //hotbin becomes the Benford bin value for this number floored totalA = 0; if ((hotbinA > 0) && (hotbinA < 10)) { - bynR[hotbinA] += 1; - totalA += (301-bynR[1]); - totalA += (176-bynR[2]); - totalA += (125-bynR[3]); - totalA += (97-bynR[4]); - totalA += (79-bynR[5]); - totalA += (67-bynR[6]); - totalA += (58-bynR[7]); - totalA += (51-bynR[8]); - totalA += (46-bynR[9]); + bynR[hotbinA] += 1; if (bynR[hotbinA] > 982) cutbinsR = true; + totalA += (301-bynR[1]); totalA += (176-bynR[2]); totalA += (125-bynR[3]); + totalA += (97-bynR[4]); totalA += (79-bynR[5]); totalA += (67-bynR[6]); + totalA += (58-bynR[7]); totalA += (51-bynR[8]); totalA += (46-bynR[9]); bynR[hotbinA] -= 1; - } else {hotbinA = 10;} + } else hotbinA = 10; //produce total number- smaller is closer to Benford real benfordize = ceil(inputSampleR); - 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;} + while (benfordize >= 1.0) benfordize /= 10; + while (benfordize < 1.0 && benfordize > 0.0000001) benfordize *= 10; hotbinB = floor(benfordize); //hotbin becomes the Benford bin value for this number ceiled totalB = 0; if ((hotbinB > 0) && (hotbinB < 10)) { - bynR[hotbinB] += 1; - totalB += (301-bynR[1]); - totalB += (176-bynR[2]); - totalB += (125-bynR[3]); - totalB += (97-bynR[4]); - totalB += (79-bynR[5]); - totalB += (67-bynR[6]); - totalB += (58-bynR[7]); - totalB += (51-bynR[8]); - totalB += (46-bynR[9]); + bynR[hotbinB] += 1; if (bynR[hotbinB] > 982) cutbinsR = true; + totalB += (301-bynR[1]); totalB += (176-bynR[2]); totalB += (125-bynR[3]); + totalB += (97-bynR[4]); totalB += (79-bynR[5]); totalB += (67-bynR[6]); + totalB += (58-bynR[7]); totalB += (51-bynR[8]); totalB += (46-bynR[9]); bynR[hotbinB] -= 1; - } else {hotbinB = 10;} + } else hotbinB = 10; //produce total number- smaller is closer to Benford real - if (totalA < totalB) - { - bynR[hotbinA] += 1; - inputSampleR = floor(inputSampleR); - } - else - { - bynR[hotbinB] += 1; - inputSampleR = ceil(inputSampleR); - } + if (totalA < totalB) {bynR[hotbinA] += 1; outputSample = floor(inputSampleR);} + else {bynR[hotbinB] += 1; outputSample = floor(inputSampleR+1);} //assign the relevant one to the delay line //and floor/ceil signal accordingly - totalA = bynR[1] + bynR[2] + bynR[3] + bynR[4] + bynR[5] + bynR[6] + bynR[7] + bynR[8] + bynR[9]; - totalA /= 1000; - if (totalA = 0) totalA = 1; // spotted by Laserbat: this 'scaling back' code doesn't. It always divides by the fallback of 1. Old NJAD doesn't scale back the things we're comparing against. Kept to retain known behavior, use the one in StudioTan and Monitoring for a tuned-as-intended NJAD. - bynR[1] /= totalA; - bynR[2] /= totalA; - bynR[3] /= totalA; - bynR[4] /= totalA; - bynR[5] /= totalA; - bynR[6] /= totalA; - bynR[7] /= totalA; - bynR[8] /= totalA; - bynR[9] /= totalA; - bynR[10] /= 2; //catchall for garbage data - //end R + if (cutbinsR) { + bynR[1] *= 0.99; bynR[2] *= 0.99; bynR[3] *= 0.99; bynR[4] *= 0.99; bynR[5] *= 0.99; + bynR[6] *= 0.99; bynR[7] *= 0.99; bynR[8] *= 0.99; bynR[9] *= 0.99; bynR[10] *= 0.99; + } + noiseShapingR += outputSample - drySampleR; + if (noiseShapingR > fabs(inputSampleR)) noiseShapingR = fabs(inputSampleR); + if (noiseShapingR < -fabs(inputSampleR)) noiseShapingR = -fabs(inputSampleR); + //finished NJAD R + - inputSampleL /= 8388608.0; - inputSampleR /= 8388608.0; - - noiseShapingL += inputSampleL - drySampleL; - noiseShapingR += inputSampleR - drySampleR; + inputSampleL /= outScale; + inputSampleR /= outScale; + if (inputSampleL > 1.0) inputSampleL = 1.0; + if (inputSampleL < -1.0) inputSampleL = -1.0; + if (inputSampleR > 1.0) inputSampleR = 1.0; + if (inputSampleR < -1.0) inputSampleR = -1.0; + *out1 = inputSampleL; *out2 = inputSampleR; @@ -262,237 +168,143 @@ void NotJustAnotherDither::processDoubleReplacing(double **inputs, double **outp double* out1 = outputs[0]; double* out2 = outputs[1]; - - long double inputSampleL; - long double inputSampleR; - - double benfordize; - int hotbinA; - int hotbinB; - double totalA; - double totalB; - double drySampleL; - double drySampleR; + int processing = (VstInt32)( A * 1.999 ); + bool highres = false; + if (processing == 1) highres = true; + float scaleFactor; + if (highres) scaleFactor = 8388608.0; + else scaleFactor = 32768.0; + float derez = B; + if (derez > 0.0) scaleFactor *= pow(1.0-derez,6); + if (scaleFactor < 0.0001) scaleFactor = 0.0001; + float outScale = scaleFactor; + if (outScale < 8.0) outScale = 8.0; + while (--sampleFrames >= 0) { - inputSampleL = *in1; - 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. - } - drySampleL = inputSampleL; - drySampleR = inputSampleR; - - inputSampleL -= noiseShapingL; - inputSampleR -= noiseShapingR; + long double inputSampleL = *in1; + long double inputSampleR = *in2; + if (fabs(inputSampleL)<1.18e-43) inputSampleL = fpd * 1.18e-43; + fpd ^= fpd << 13; fpd ^= fpd >> 17; fpd ^= fpd << 5; + if (fabs(inputSampleR)<1.18e-43) inputSampleR = fpd * 1.18e-43; + fpd ^= fpd << 13; fpd ^= fpd >> 17; fpd ^= fpd << 5; - inputSampleL *= 8388608.0; - inputSampleR *= 8388608.0; + inputSampleL *= scaleFactor; + inputSampleR *= scaleFactor; //0-1 is now one bit, now we dither - //begin L - benfordize = floor(inputSampleL); - 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); + //begin Not Just Another Dither + bool cutbinsL; cutbinsL = false; + bool cutbinsR; cutbinsR = false; + long double drySampleL; drySampleL = inputSampleL; + long double drySampleR; drySampleR = inputSampleR; + inputSampleL -= noiseShapingL; + inputSampleR -= noiseShapingR; + + //NJAD L + long double benfordize; benfordize = floor(inputSampleL); + while (benfordize >= 1.0) benfordize /= 10; + while (benfordize < 1.0 && benfordize > 0.0000001) benfordize *= 10; + int hotbinA; hotbinA = floor(benfordize); //hotbin becomes the Benford bin value for this number floored - totalA = 0; + long double totalA; totalA = 0; if ((hotbinA > 0) && (hotbinA < 10)) { - bynL[hotbinA] += 1; - totalA += (301-bynL[1]); - totalA += (176-bynL[2]); - totalA += (125-bynL[3]); - totalA += (97-bynL[4]); - totalA += (79-bynL[5]); - totalA += (67-bynL[6]); - totalA += (58-bynL[7]); - totalA += (51-bynL[8]); - totalA += (46-bynL[9]); + bynL[hotbinA] += 1; if (bynL[hotbinA] > 982) cutbinsL = true; + totalA += (301-bynL[1]); totalA += (176-bynL[2]); totalA += (125-bynL[3]); + totalA += (97-bynL[4]); totalA += (79-bynL[5]); totalA += (67-bynL[6]); + totalA += (58-bynL[7]); totalA += (51-bynL[8]); totalA += (46-bynL[9]); bynL[hotbinA] -= 1; - } else {hotbinA = 10;} + } else hotbinA = 10; //produce total number- smaller is closer to Benford real benfordize = ceil(inputSampleL); - 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); + while (benfordize >= 1.0) benfordize /= 10; + while (benfordize < 1.0 && benfordize > 0.0000001) benfordize *= 10; + int hotbinB; hotbinB = floor(benfordize); //hotbin becomes the Benford bin value for this number ceiled - totalB = 0; + long double totalB; totalB = 0; if ((hotbinB > 0) && (hotbinB < 10)) { - bynL[hotbinB] += 1; - totalB += (301-bynL[1]); - totalB += (176-bynL[2]); - totalB += (125-bynL[3]); - totalB += (97-bynL[4]); - totalB += (79-bynL[5]); - totalB += (67-bynL[6]); - totalB += (58-bynL[7]); - totalB += (51-bynL[8]); - totalB += (46-bynL[9]); + bynL[hotbinB] += 1; if (bynL[hotbinB] > 982) cutbinsL = true; + totalB += (301-bynL[1]); totalB += (176-bynL[2]); totalB += (125-bynL[3]); + totalB += (97-bynL[4]); totalB += (79-bynL[5]); totalB += (67-bynL[6]); + totalB += (58-bynL[7]); totalB += (51-bynL[8]); totalB += (46-bynL[9]); bynL[hotbinB] -= 1; - } else {hotbinB = 10;} + } else hotbinB = 10; //produce total number- smaller is closer to Benford real - if (totalA < totalB) - { - bynL[hotbinA] += 1; - inputSampleL = floor(inputSampleL); - } - else - { - bynL[hotbinB] += 1; - inputSampleL = ceil(inputSampleL); - } + long double outputSampleL; + if (totalA < totalB) {bynL[hotbinA] += 1; outputSampleL = floor(inputSampleL);} + else {bynL[hotbinB] += 1; outputSampleL = floor(inputSampleL+1);} //assign the relevant one to the delay line //and floor/ceil signal accordingly + if (cutbinsL) { + bynL[1] *= 0.99; bynL[2] *= 0.99; bynL[3] *= 0.99; bynL[4] *= 0.99; bynL[5] *= 0.99; + bynL[6] *= 0.99; bynL[7] *= 0.99; bynL[8] *= 0.99; bynL[9] *= 0.99; bynL[10] *= 0.99; + } + noiseShapingL += outputSampleL - drySampleL; + if (noiseShapingL > fabs(inputSampleL)) noiseShapingL = fabs(inputSampleL); + if (noiseShapingL < -fabs(inputSampleL)) noiseShapingL = -fabs(inputSampleL); + //finished NJAD L - totalA = bynL[1] + bynL[2] + bynL[3] + bynL[4] + bynL[5] + bynL[6] + bynL[7] + bynL[8] + bynL[9]; - totalA /= 1000; - if (totalA = 0) totalA = 1; // spotted by Laserbat: this 'scaling back' code doesn't. It always divides by the fallback of 1. Old NJAD doesn't scale back the things we're comparing against. Kept to retain known behavior, use the one in StudioTan and Monitoring for a tuned-as-intended NJAD. - bynL[1] /= totalA; - bynL[2] /= totalA; - bynL[3] /= totalA; - bynL[4] /= totalA; - bynL[5] /= totalA; - bynL[6] /= totalA; - bynL[7] /= totalA; - bynL[8] /= totalA; - bynL[9] /= totalA; - bynL[10] /= 2; //catchall for garbage data - //end L - - //begin R + //NJAD R benfordize = floor(inputSampleR); - 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;} + while (benfordize >= 1.0) benfordize /= 10; + while (benfordize < 1.0 && benfordize > 0.0000001) benfordize *= 10; hotbinA = floor(benfordize); //hotbin becomes the Benford bin value for this number floored totalA = 0; if ((hotbinA > 0) && (hotbinA < 10)) { - bynR[hotbinA] += 1; - totalA += (301-bynR[1]); - totalA += (176-bynR[2]); - totalA += (125-bynR[3]); - totalA += (97-bynR[4]); - totalA += (79-bynR[5]); - totalA += (67-bynR[6]); - totalA += (58-bynR[7]); - totalA += (51-bynR[8]); - totalA += (46-bynR[9]); + bynR[hotbinA] += 1; if (bynR[hotbinA] > 982) cutbinsR = true; + totalA += (301-bynR[1]); totalA += (176-bynR[2]); totalA += (125-bynR[3]); + totalA += (97-bynR[4]); totalA += (79-bynR[5]); totalA += (67-bynR[6]); + totalA += (58-bynR[7]); totalA += (51-bynR[8]); totalA += (46-bynR[9]); bynR[hotbinA] -= 1; - } else {hotbinA = 10;} + } else hotbinA = 10; //produce total number- smaller is closer to Benford real benfordize = ceil(inputSampleR); - 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;} + while (benfordize >= 1.0) benfordize /= 10; + while (benfordize < 1.0 && benfordize > 0.0000001) benfordize *= 10; hotbinB = floor(benfordize); //hotbin becomes the Benford bin value for this number ceiled totalB = 0; if ((hotbinB > 0) && (hotbinB < 10)) { - bynR[hotbinB] += 1; - totalB += (301-bynR[1]); - totalB += (176-bynR[2]); - totalB += (125-bynR[3]); - totalB += (97-bynR[4]); - totalB += (79-bynR[5]); - totalB += (67-bynR[6]); - totalB += (58-bynR[7]); - totalB += (51-bynR[8]); - totalB += (46-bynR[9]); + bynR[hotbinB] += 1; if (bynR[hotbinB] > 982) cutbinsR = true; + totalB += (301-bynR[1]); totalB += (176-bynR[2]); totalB += (125-bynR[3]); + totalB += (97-bynR[4]); totalB += (79-bynR[5]); totalB += (67-bynR[6]); + totalB += (58-bynR[7]); totalB += (51-bynR[8]); totalB += (46-bynR[9]); bynR[hotbinB] -= 1; - } else {hotbinB = 10;} + } else hotbinB = 10; //produce total number- smaller is closer to Benford real - if (totalA < totalB) - { - bynR[hotbinA] += 1; - inputSampleR = floor(inputSampleR); - } - else - { - bynR[hotbinB] += 1; - inputSampleR = ceil(inputSampleR); - } + long double outputSampleR; + if (totalA < totalB) {bynR[hotbinA] += 1; outputSampleR = floor(inputSampleR);} + else {bynR[hotbinB] += 1; outputSampleR = floor(inputSampleR+1);} //assign the relevant one to the delay line //and floor/ceil signal accordingly - totalA = bynR[1] + bynR[2] + bynR[3] + bynR[4] + bynR[5] + bynR[6] + bynR[7] + bynR[8] + bynR[9]; - totalA /= 1000; - if (totalA = 0) totalA = 1; // spotted by Laserbat: this 'scaling back' code doesn't. It always divides by the fallback of 1. Old NJAD doesn't scale back the things we're comparing against. Kept to retain known behavior, use the one in StudioTan and Monitoring for a tuned-as-intended NJAD. - bynR[1] /= totalA; - bynR[2] /= totalA; - bynR[3] /= totalA; - bynR[4] /= totalA; - bynR[5] /= totalA; - bynR[6] /= totalA; - bynR[7] /= totalA; - bynR[8] /= totalA; - bynR[9] /= totalA; - bynR[10] /= 2; //catchall for garbage data - //end R + if (cutbinsR) { + bynR[1] *= 0.99; bynR[2] *= 0.99; bynR[3] *= 0.99; bynR[4] *= 0.99; bynR[5] *= 0.99; + bynR[6] *= 0.99; bynR[7] *= 0.99; bynR[8] *= 0.99; bynR[9] *= 0.99; bynR[10] *= 0.99; + } + noiseShapingR += outputSampleR - drySampleR; + if (noiseShapingR > fabs(inputSampleR)) noiseShapingR = fabs(inputSampleR); + if (noiseShapingR < -fabs(inputSampleR)) noiseShapingR = -fabs(inputSampleR); + //finished NJAD R + - inputSampleL /= 8388608.0; - inputSampleR /= 8388608.0; + inputSampleL = outputSampleL / outScale; + inputSampleR = outputSampleR / outScale; - noiseShapingL += inputSampleL - drySampleL; - noiseShapingR += inputSampleR - drySampleR; + if (inputSampleL > 1.0) inputSampleL = 1.0; + if (inputSampleL < -1.0) inputSampleL = -1.0; + if (inputSampleR > 1.0) inputSampleR = 1.0; + if (inputSampleR < -1.0) inputSampleR = -1.0; *out1 = inputSampleL; *out2 = inputSampleR; -- cgit v1.2.3