diff --git a/JuceLibraryCode/AppConfig.h b/JuceLibraryCode/AppConfig.h index 69d73ad..8df1e7d 100644 --- a/JuceLibraryCode/AppConfig.h +++ b/JuceLibraryCode/AppConfig.h @@ -140,7 +140,7 @@ // juce_audio_plugin_client flags: #ifndef JUCE_VST3_CAN_REPLACE_VST2 - //#define JUCE_VST3_CAN_REPLACE_VST2 1 + #define JUCE_VST3_CAN_REPLACE_VST2 0 #endif #ifndef JUCE_FORCE_USE_LEGACY_PARAM_IDS diff --git a/JuceLibraryCode/BinaryData.cpp b/JuceLibraryCode/BinaryData.cpp new file mode 100644 index 0000000..eb235b7 --- /dev/null +++ b/JuceLibraryCode/BinaryData.cpp @@ -0,0 +1,513 @@ +/* ==================================== JUCER_BINARY_RESOURCE ==================================== + + This is an auto-generated file: Any edits you make may be overwritten! + +*/ + +#include + +namespace BinaryData +{ + +//================== austrianAudioLogo.svg ================== +static const unsigned char temp_binary_data_0[] = +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n"; + +const char* austrianAudioLogo_svg = (const char*) temp_binary_data_0; + +//================== bandHandleKnob.svg ================== +static const unsigned char temp_binary_data_1[] = +"\n" +"\n" +"\n" +"\n" +"\n"; + +const char* bandHandleKnob_svg = (const char*) temp_binary_data_1; + +//================== bCardioidPatternIcon.svg ================== +static const unsigned char temp_binary_data_2[] = +"\n" +"\n" +"\n"; + +const char* bCardioidPatternIcon_svg = (const char*) temp_binary_data_2; + +//================== cardioidPatternIcon.svg ================== +static const unsigned char temp_binary_data_3[] = +"\n" +"\n" +"\n"; + +const char* cardioidPatternIcon_svg = (const char*) temp_binary_data_3; + +//================== closePresetListIcon.svg ================== +static const unsigned char temp_binary_data_4[] = +"\n" +"\n" +"\n" +"\n"; + +const char* closePresetListIcon_svg = (const char*) temp_binary_data_4; + +//================== diffuseField.svg ================== +static const unsigned char temp_binary_data_5[] = +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n"; + +const char* diffuseField_svg = (const char*) temp_binary_data_5; + +//================== eightPatternIcon.svg ================== +static const unsigned char temp_binary_data_6[] = +"\n" +"\n" +"\n" +"\n"; + +const char* eightPatternIcon_svg = (const char*) temp_binary_data_6; + +//================== eqFieldCheckSign.svg ================== +static const unsigned char temp_binary_data_7[] = +"\n" +"\n" +"\n" +"\n"; + +const char* eqFieldCheckSign_svg = (const char*) temp_binary_data_7; + +//================== eyeDrop.svg ================== +static const unsigned char temp_binary_data_8[] = +"\n" +"\n" +"\n"; + +const char* eyeDrop_svg = (const char*) temp_binary_data_8; + +//================== freeField.svg ================== +static const unsigned char temp_binary_data_9[] = +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n"; + +const char* freeField_svg = (const char*) temp_binary_data_9; + +//================== hyperCardioidPatternIcon.svg ================== +static const unsigned char temp_binary_data_10[] = +"\n" +"\n" +"\n"; + +const char* hyperCardioidPatternIcon_svg = (const char*) temp_binary_data_10; + +//================== loadArrow.svg ================== +static const unsigned char temp_binary_data_11[] = +"\n" +"\n" +"\n"; + +const char* loadArrow_svg = (const char*) temp_binary_data_11; + +//================== maximizeTargetIcon.svg ================== +static const unsigned char temp_binary_data_12[] = +"\n" +"\n" +"\n" +"\n"; + +const char* maximizeTargetIcon_svg = (const char*) temp_binary_data_12; + +//================== maxTargetToSpillIcon.svg ================== +static const unsigned char temp_binary_data_13[] = +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n" +"\n"; + +const char* maxTargetToSpillIcon_svg = (const char*) temp_binary_data_13; + +//================== omniPatternIcon.svg ================== +static const unsigned char temp_binary_data_14[] = +"\n" +"\n" +"\n"; + +const char* omniPatternIcon_svg = (const char*) temp_binary_data_14; + +//================== revBCardioidPatternIcon.svg ================== +static const unsigned char temp_binary_data_15[] = +"\n" +"\n" +"\n"; + +const char* revBCardioidPatternIcon_svg = (const char*) temp_binary_data_15; + +//================== revCardioidPatternIcon.svg ================== +static const unsigned char temp_binary_data_16[] = +"\n" +"\n" +"\n"; + +const char* revCardioidPatternIcon_svg = (const char*) temp_binary_data_16; + +//================== scrollImage.png ================== +static const unsigned char temp_binary_data_17[] = +{ 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,30,0,0,0,8,8,6,0,0,0,238,191,79,36,0,0,8,205,122,84,88,116,82,97,119,32,112,114,111,102,105,108,101,32,116,121,112,101,32,101,120,105,102,0,0,120,218,173,89,107,122,99,43,14,252,207,42,102,9,8,1,130, +229,240,210,247,205,14,102,249,83,226,96,199,78,210,185,185,109,219,29,159,135,177,84,82,9,84,156,118,235,127,255,85,247,31,188,184,148,226,98,146,146,107,206,30,175,88,99,13,13,39,197,95,175,190,63,201,199,253,121,93,172,243,29,61,223,119,247,31,5,220, +98,28,249,186,172,225,220,95,184,143,115,58,215,245,140,167,219,248,187,161,155,167,134,179,244,241,69,107,231,126,127,190,223,143,193,80,62,27,58,8,152,46,207,126,158,31,28,67,28,14,162,120,93,143,131,40,215,34,79,161,205,113,60,199,115,171,124,252, +69,150,144,83,38,137,248,140,193,139,228,138,243,18,124,20,228,115,26,80,29,161,110,67,233,74,232,253,198,237,250,54,52,0,83,88,76,236,241,201,124,80,178,253,5,110,56,70,124,6,22,135,129,132,1,13,159,130,79,230,176,19,239,65,37,32,0,105,61,142,154,191, +39,243,49,55,31,57,250,195,235,55,97,121,56,81,43,135,248,192,218,253,248,169,110,238,103,159,234,38,198,231,178,185,179,86,242,25,194,207,180,250,124,63,126,123,159,210,205,208,237,11,190,251,15,143,158,203,56,103,225,249,126,157,183,66,121,172,236, +243,167,58,139,238,160,17,69,139,25,185,200,39,168,91,136,251,12,227,186,101,113,255,42,227,45,62,59,84,109,193,137,189,43,222,197,55,63,80,83,211,15,204,180,142,243,74,1,220,43,69,154,212,72,105,237,227,160,1,136,49,172,32,56,134,48,92,224,125,179,128, +164,26,6,91,49,68,123,147,6,225,202,147,11,170,100,236,26,138,28,238,88,104,187,173,219,221,160,226,167,243,147,48,52,16,140,209,46,178,191,124,187,223,14,84,181,185,68,180,167,206,53,157,128,43,236,242,197,93,2,253,118,192,48,48,66,122,146,154,118,130, +111,239,207,47,227,149,193,96,218,105,46,8,176,249,238,46,19,61,209,71,113,241,38,154,49,48,225,120,21,30,201,60,6,0,8,174,19,192,16,131,1,159,137,19,101,32,146,16,132,8,137,44,32,168,1,122,224,24,58,24,160,148,194,4,200,16,153,51,200,193,236,128,111, +252,70,104,15,13,41,92,183,177,170,114,116,156,56,99,186,22,48,212,64,86,140,9,245,35,177,160,134,90,226,20,83,74,57,73,42,169,166,150,57,219,204,203,89,178,45,207,77,88,162,36,201,34,82,156,84,105,133,75,44,169,228,34,88,197,107,105,53,84,198,242,157, +42,230,105,45,181,214,214,224,180,193,114,195,175,27,6,180,214,67,231,30,123,234,185,75,47,189,186,222,6,202,103,196,145,70,30,50,202,168,163,205,48,121,98,130,207,60,101,150,89,103,91,180,80,74,43,174,180,242,146,85,86,93,77,81,106,202,26,53,105,86, +113,90,180,106,187,179,118,104,253,242,254,23,172,209,97,45,108,166,108,160,220,89,195,93,145,155,9,178,229,36,25,103,96,44,68,2,225,2,214,192,24,10,219,56,243,133,98,12,198,156,113,134,126,132,89,145,2,64,38,35,103,146,49,6,6,227,162,144,148,238,220, +29,230,28,178,248,22,222,156,148,205,91,120,149,57,103,212,253,146,185,175,188,125,199,218,180,46,49,54,99,215,52,180,164,122,198,236,235,29,250,160,215,100,157,111,209,159,46,220,159,191,250,119,23,238,69,11,137,16,75,238,186,28,56,80,69,149,43,130, +152,96,112,237,230,173,49,79,74,202,215,79,62,93,137,226,42,41,24,83,41,186,36,45,98,117,138,194,92,93,84,35,149,25,25,246,80,37,48,58,114,241,60,181,245,197,67,169,73,153,60,80,7,184,196,220,240,179,207,174,165,74,170,104,99,165,39,70,104,177,44,46, +75,23,202,37,98,149,185,90,255,180,190,130,142,159,166,140,137,5,30,191,245,117,161,224,211,152,17,75,229,0,148,158,70,93,93,83,211,156,166,119,16,15,136,182,78,148,160,159,156,65,96,31,220,91,156,96,126,142,217,70,226,168,0,149,19,245,81,67,239,40,227, +129,87,18,28,32,240,98,101,220,206,5,75,237,138,22,138,150,184,116,100,178,243,136,84,245,106,103,133,169,34,125,165,53,86,100,162,43,21,100,200,79,105,75,208,0,71,206,54,106,133,214,221,234,199,12,241,128,21,51,19,26,234,123,155,9,203,78,74,221,102, +124,84,143,171,233,81,212,100,125,180,55,186,204,88,58,29,2,215,87,209,24,24,247,14,52,6,198,189,3,141,129,113,239,64,99,96,220,59,208,24,24,247,14,52,6,198,189,3,141,129,113,239,64,99,119,221,59,208,24,24,247,14,52,6,198,189,3,141,129,113,239,64,99, +96,220,59,208,236,100,191,3,141,129,113,239,64,99,96,220,59,208,24,24,247,14,52,6,198,189,3,141,129,113,239,64,99,96,220,63,162,97,63,161,19,230,204,156,186,134,142,46,212,83,218,246,177,199,88,9,141,118,65,24,38,55,107,29,89,168,23,59,120,134,98,241, +109,160,41,137,199,16,244,88,83,200,113,247,153,18,133,181,7,137,173,99,15,175,220,215,228,149,101,214,48,103,8,110,66,142,64,86,67,182,120,216,195,46,70,32,102,32,154,166,109,188,209,162,211,199,81,166,214,14,229,30,122,181,128,34,201,224,29,98,244, +11,172,13,24,218,151,232,231,51,100,104,29,244,78,42,23,134,213,209,4,173,157,239,96,71,185,142,138,29,148,167,185,24,150,186,250,214,153,178,227,134,158,25,175,38,217,98,220,169,181,38,239,19,218,50,186,58,140,183,133,158,204,109,52,152,109,150,34,129, +84,101,82,72,191,9,21,27,215,76,4,13,233,43,163,209,75,144,218,32,16,146,66,248,129,173,84,209,197,115,235,195,103,236,176,181,65,65,108,23,17,73,143,179,233,106,34,224,177,114,236,98,29,190,58,42,189,67,121,79,219,120,218,70,175,153,8,161,110,69,65, +19,106,103,237,176,237,47,248,118,165,128,163,64,49,100,200,18,28,111,223,162,211,82,60,100,247,1,173,210,179,36,124,83,117,103,105,8,217,143,160,130,160,34,33,122,160,30,121,27,219,0,161,22,53,94,133,25,221,128,78,178,211,186,139,13,169,15,213,52,252, +180,172,214,178,250,84,229,155,215,234,211,62,71,5,42,132,203,147,113,119,183,174,80,113,5,178,38,65,17,91,100,19,122,183,77,200,115,229,37,177,247,92,102,66,62,194,162,136,173,26,38,75,44,52,99,5,170,182,67,251,209,47,63,165,202,190,191,18,133,189,222, +220,217,129,184,66,1,110,67,67,49,93,86,204,248,26,100,21,43,52,136,112,178,44,249,171,118,134,158,146,0,183,126,218,249,205,183,201,231,109,30,190,49,105,245,139,235,207,44,109,247,55,231,15,158,247,180,62,165,235,46,247,150,108,27,84,46,58,31,220,255, +54,112,247,115,228,191,15,220,253,28,249,239,3,119,63,71,254,251,192,221,43,148,63,6,238,94,161,252,49,112,247,10,229,143,129,187,87,40,127,12,220,189,66,249,99,224,238,21,202,31,3,119,175,80,254,24,184,123,133,242,199,192,221,247,145,87,22,44,221,232, +37,35,51,118,88,88,195,176,151,238,214,196,68,20,27,43,173,210,69,50,139,204,129,126,200,61,57,105,88,203,228,202,144,47,182,182,1,86,161,221,77,42,173,120,107,221,25,235,32,118,113,65,10,58,80,71,63,232,158,250,26,162,25,59,188,40,213,205,33,181,98, +253,219,62,176,145,20,236,72,199,196,158,31,75,184,193,39,219,137,134,189,227,245,87,179,178,167,181,167,163,0,123,227,43,116,231,101,17,214,74,244,217,237,27,182,249,46,188,108,219,63,77,92,88,67,13,104,62,106,73,151,58,172,33,8,186,214,110,81,205,163, +241,46,23,125,209,199,98,251,157,255,175,238,221,223,249,255,234,222,253,228,127,118,232,21,144,129,30,124,9,29,74,144,70,187,134,248,42,19,108,191,207,228,113,109,205,14,6,161,19,210,186,10,209,119,232,161,113,149,36,122,62,18,174,104,156,187,162,177, +19,7,85,86,148,40,29,208,111,252,183,138,30,13,68,218,198,161,56,84,67,153,32,175,216,124,98,4,226,52,177,178,21,91,105,40,130,172,197,30,3,132,178,164,146,223,143,132,74,130,56,200,57,56,83,68,24,223,178,101,98,21,61,2,6,82,163,238,156,200,106,199,209, +130,42,232,215,52,74,214,24,175,113,115,181,61,14,242,56,240,65,244,199,65,15,99,250,81,143,105,210,178,155,21,250,3,122,16,66,107,198,205,206,238,245,29,234,229,74,54,196,33,234,221,144,214,43,153,246,255,45,107,61,196,110,235,197,67,244,123,210,34, +252,206,35,236,126,15,97,58,86,173,33,213,84,247,211,10,50,42,240,227,156,61,228,88,73,52,139,95,240,3,110,182,238,187,57,119,223,122,151,128,217,106,165,25,202,240,253,128,191,176,75,216,79,113,114,105,10,57,172,136,113,238,10,115,70,50,97,46,222,70, +154,38,186,101,235,140,121,30,112,76,173,245,108,202,93,245,242,186,41,119,21,254,235,166,220,92,239,49,229,110,227,94,53,229,62,242,254,154,41,247,72,225,43,166,220,115,53,252,189,41,247,185,176,254,206,20,118,71,231,193,230,126,174,137,165,200,158, +108,158,231,154,105,149,164,20,25,139,21,230,84,25,104,30,182,93,139,25,11,86,65,3,169,75,80,253,221,254,231,112,137,184,60,6,14,216,162,236,156,177,61,251,13,165,225,223,199,81,251,196,78,50,247,235,106,73,176,93,38,175,182,93,99,25,85,232,246,228,108, +47,230,125,162,87,143,223,27,162,146,174,213,70,182,215,130,13,73,108,35,60,3,189,3,214,89,177,176,253,31,202,238,59,172,165,223,41,30,0,0,1,133,105,67,67,80,73,67,67,32,112,114,111,102,105,108,101,0,0,120,156,125,145,61,72,195,64,24,134,223,254,72,69, +43,14,118,16,21,204,80,157,44,136,138,56,106,21,138,80,33,212,10,173,58,152,92,250,7,77,26,146,20,23,71,193,181,224,224,207,98,213,193,197,89,87,7,87,65,16,252,1,113,116,114,82,116,145,18,191,75,10,45,98,188,227,184,135,247,190,247,229,238,59,192,95, +47,51,213,12,142,3,170,102,25,169,68,92,200,100,87,133,208,43,130,24,68,55,205,97,137,153,250,156,40,38,225,57,190,238,225,227,251,93,140,103,121,215,253,57,122,148,156,201,0,159,64,60,203,116,195,34,222,32,158,222,180,116,206,251,196,17,86,148,20,226, +115,226,49,131,46,72,252,200,117,217,229,55,206,5,135,253,60,51,98,164,83,243,196,17,98,161,208,198,114,27,179,162,161,18,79,17,71,21,85,163,124,127,198,101,133,243,22,103,181,92,101,205,123,242,23,134,115,218,202,50,215,105,13,33,129,69,44,65,132,0, +25,85,148,80,134,133,24,237,26,41,38,82,116,30,247,240,15,56,126,145,92,50,185,74,96,228,88,64,5,42,36,199,15,254,7,191,123,107,230,39,39,220,164,112,28,232,120,177,237,143,17,32,180,11,52,106,182,253,125,108,219,141,19,32,240,12,92,105,45,127,165,14, +204,124,146,94,107,105,209,35,160,119,27,184,184,110,105,242,30,112,185,3,244,63,233,146,33,57,82,128,150,63,159,7,222,207,232,155,178,64,223,45,208,181,230,246,173,121,142,211,7,32,77,189,74,222,0,7,135,192,104,129,178,215,61,222,221,217,222,183,127, +107,154,253,251,1,65,53,114,147,234,239,254,115,0,0,13,28,105,84,88,116,88,77,76,58,99,111,109,46,97,100,111,98,101,46,120,109,112,0,0,0,0,0,60,63,120,112,97,99,107,101,116,32,98,101,103,105,110,61,34,239,187,191,34,32,105,100,61,34,87,53,77,48,77,112, +67,101,104,105,72,122,114,101,83,122,78,84,99,122,107,99,57,100,34,63,62,10,60,120,58,120,109,112,109,101,116,97,32,120,109,108,110,115,58,120,61,34,97,100,111,98,101,58,110,115,58,109,101,116,97,47,34,32,120,58,120,109,112,116,107,61,34,88,77,80,32, +67,111,114,101,32,52,46,52,46,48,45,69,120,105,118,50,34,62,10,32,60,114,100,102,58,82,68,70,32,120,109,108,110,115,58,114,100,102,61,34,104,116,116,112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,49,57,57,57,47,48,50,47,50,50,45,114,100,102,45, +115,121,110,116,97,120,45,110,115,35,34,62,10,32,32,60,114,100,102,58,68,101,115,99,114,105,112,116,105,111,110,32,114,100,102,58,97,98,111,117,116,61,34,34,10,32,32,32,32,120,109,108,110,115,58,120,109,112,77,77,61,34,104,116,116,112,58,47,47,110,115, +46,97,100,111,98,101,46,99,111,109,47,120,97,112,47,49,46,48,47,109,109,47,34,10,32,32,32,32,120,109,108,110,115,58,115,116,69,118,116,61,34,104,116,116,112,58,47,47,110,115,46,97,100,111,98,101,46,99,111,109,47,120,97,112,47,49,46,48,47,115,84,121,112, +101,47,82,101,115,111,117,114,99,101,69,118,101,110,116,35,34,10,32,32,32,32,120,109,108,110,115,58,100,99,61,34,104,116,116,112,58,47,47,112,117,114,108,46,111,114,103,47,100,99,47,101,108,101,109,101,110,116,115,47,49,46,49,47,34,10,32,32,32,32,120, +109,108,110,115,58,71,73,77,80,61,34,104,116,116,112,58,47,47,119,119,119,46,103,105,109,112,46,111,114,103,47,120,109,112,47,34,10,32,32,32,32,120,109,108,110,115,58,116,105,102,102,61,34,104,116,116,112,58,47,47,110,115,46,97,100,111,98,101,46,99,111, +109,47,116,105,102,102,47,49,46,48,47,34,10,32,32,32,32,120,109,108,110,115,58,120,109,112,61,34,104,116,116,112,58,47,47,110,115,46,97,100,111,98,101,46,99,111,109,47,120,97,112,47,49,46,48,47,34,10,32,32,32,120,109,112,77,77,58,68,111,99,117,109,101, +110,116,73,68,61,34,103,105,109,112,58,100,111,99,105,100,58,103,105,109,112,58,102,48,98,48,52,57,101,101,45,101,57,99,49,45,52,99,102,48,45,56,97,50,102,45,54,49,101,102,49,48,97,57,53,52,48,101,34,10,32,32,32,120,109,112,77,77,58,73,110,115,116,97, +110,99,101,73,68,61,34,120,109,112,46,105,105,100,58,54,97,52,100,48,98,54,102,45,97,48,48,48,45,52,99,97,99,45,97,54,101,49,45,50,97,57,54,48,101,102,51,52,52,101,50,34,10,32,32,32,120,109,112,77,77,58,79,114,105,103,105,110,97,108,68,111,99,117,109, +101,110,116,73,68,61,34,120,109,112,46,100,105,100,58,99,98,53,100,97,54,56,100,45,100,102,49,53,45,52,53,49,49,45,97,97,56,101,45,100,56,51,102,50,54,50,56,101,52,99,54,34,10,32,32,32,100,99,58,70,111,114,109,97,116,61,34,105,109,97,103,101,47,112,110, +103,34,10,32,32,32,71,73,77,80,58,65,80,73,61,34,50,46,48,34,10,32,32,32,71,73,77,80,58,80,108,97,116,102,111,114,109,61,34,77,97,99,32,79,83,34,10,32,32,32,71,73,77,80,58,84,105,109,101,83,116,97,109,112,61,34,49,54,53,49,48,53,56,50,53,50,48,50,49, +49,50,48,34,10,32,32,32,71,73,77,80,58,86,101,114,115,105,111,110,61,34,50,46,49,48,46,51,48,34,10,32,32,32,116,105,102,102,58,79,114,105,101,110,116,97,116,105,111,110,61,34,49,34,10,32,32,32,120,109,112,58,67,114,101,97,116,111,114,84,111,111,108,61, +34,71,73,77,80,32,50,46,49,48,34,62,10,32,32,32,60,120,109,112,77,77,58,72,105,115,116,111,114,121,62,10,32,32,32,32,60,114,100,102,58,83,101,113,62,10,32,32,32,32,32,60,114,100,102,58,108,105,10,32,32,32,32,32,32,115,116,69,118,116,58,97,99,116,105, +111,110,61,34,115,97,118,101,100,34,10,32,32,32,32,32,32,115,116,69,118,116,58,99,104,97,110,103,101,100,61,34,47,34,10,32,32,32,32,32,32,115,116,69,118,116,58,105,110,115,116,97,110,99,101,73,68,61,34,120,109,112,46,105,105,100,58,99,55,56,53,102,54, +48,102,45,52,51,55,101,45,52,55,98,102,45,56,102,54,101,45,102,52,98,98,100,53,102,48,50,53,55,55,34,10,32,32,32,32,32,32,115,116,69,118,116,58,115,111,102,116,119,97,114,101,65,103,101,110,116,61,34,71,105,109,112,32,50,46,49,48,32,40,77,97,99,32,79, +83,41,34,10,32,32,32,32,32,32,115,116,69,118,116,58,119,104,101,110,61,34,50,48,50,50,45,48,52,45,50,55,84,49,51,58,49,55,58,51,50,43,48,50,58,48,48,34,47,62,10,32,32,32,32,60,47,114,100,102,58,83,101,113,62,10,32,32,32,60,47,120,109,112,77,77,58,72, +105,115,116,111,114,121,62,10,32,32,60,47,114,100,102,58,68,101,115,99,114,105,112,116,105,111,110,62,10,32,60,47,114,100,102,58,82,68,70,62,10,60,47,120,58,120,109,112,109,101,116,97,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,10,60,63,120,112,97,99,107,101,116,32,101,110,100,61,34,119,34,63,62,6,228,66,153,0,0,0,6,98,75,71,68,0,0,0,0,0,0,249,67,187,127,0,0,0,9,112,72,89,115,0,0,46,35,0,0,46,35,1,120,165,63,118,0,0,0,7,116,73,77,69,7,230,4, +27,11,17,32,26,179,200,88,0,0,0,25,116,69,88,116,67,111,109,109,101,110,116,0,67,114,101,97,116,101,100,32,119,105,116,104,32,71,73,77,80,87,129,14,23,0,0,0,25,73,68,65,84,40,207,99,236,237,237,253,207,48,10,134,51,96,68,230,140,198,247,176,4,0,225,114, +5,79,189,247,50,19,0,0,0,0,73,69,78,68,174,66,96,130,0,0 }; + +const char* scrollImage_png = (const char*) temp_binary_data_17; + +//================== superCardioidPatternIcon.svg ================== +static const unsigned char temp_binary_data_18[] = +"\n" +"\n" +"\n"; + +const char* superCardioidPatternIcon_svg = (const char*) temp_binary_data_18; + +//================== terminateSpillIcon.svg ================== +static const unsigned char temp_binary_data_19[] = +"\n" +"\n" +"\n" +"\n"; + +const char* terminateSpillIcon_svg = (const char*) temp_binary_data_19; + +//================== undoPresetIcon.svg ================== +static const unsigned char temp_binary_data_20[] = +"\n" +"\n" +"\n" +"\n"; + +const char* undoPresetIcon_svg = (const char*) temp_binary_data_20; + + +const char* getNamedResource (const char* resourceNameUTF8, int& numBytes); +const char* getNamedResource (const char* resourceNameUTF8, int& numBytes) +{ + unsigned int hash = 0; + + if (resourceNameUTF8 != nullptr) + while (*resourceNameUTF8 != 0) + hash = 31 * hash + (unsigned int) *resourceNameUTF8++; + + switch (hash) + { + case 0xd7c9008d: numBytes = 19242; return austrianAudioLogo_svg; + case 0xaf268cf8: numBytes = 930; return bandHandleKnob_svg; + case 0x0a112e7b: numBytes = 509; return bCardioidPatternIcon_svg; + case 0xd7aba53d: numBytes = 563; return cardioidPatternIcon_svg; + case 0x1d7dc8f3: numBytes = 302; return closePresetListIcon_svg; + case 0x8953505d: numBytes = 1820; return diffuseField_svg; + case 0x1d3b1cbf: numBytes = 939; return eightPatternIcon_svg; + case 0xf47e50fc: numBytes = 577; return eqFieldCheckSign_svg; + case 0x9e083a65: numBytes = 2140; return eyeDrop_svg; + case 0x57650493: numBytes = 990; return freeField_svg; + case 0xac88c531: numBytes = 720; return hyperCardioidPatternIcon_svg; + case 0x06f5b2e8: numBytes = 510; return loadArrow_svg; + case 0xefecd43b: numBytes = 1625; return maximizeTargetIcon_svg; + case 0xb73e125a: numBytes = 747; return maxTargetToSpillIcon_svg; + case 0x5a81cbf5: numBytes = 166; return omniPatternIcon_svg; + case 0xb8fa123e: numBytes = 520; return revBCardioidPatternIcon_svg; + case 0xb405bd1a: numBytes = 565; return revCardioidPatternIcon_svg; + case 0x654bf4f8: numBytes = 6211; return scrollImage_png; + case 0x203fd342: numBytes = 725; return superCardioidPatternIcon_svg; + case 0x71526509: numBytes = 772; return terminateSpillIcon_svg; + case 0xb22183a1: numBytes = 752; return undoPresetIcon_svg; + default: break; + } + + numBytes = 0; + return nullptr; +} + +const char* namedResourceList[] = +{ + "austrianAudioLogo_svg", + "bandHandleKnob_svg", + "bCardioidPatternIcon_svg", + "cardioidPatternIcon_svg", + "closePresetListIcon_svg", + "diffuseField_svg", + "eightPatternIcon_svg", + "eqFieldCheckSign_svg", + "eyeDrop_svg", + "freeField_svg", + "hyperCardioidPatternIcon_svg", + "loadArrow_svg", + "maximizeTargetIcon_svg", + "maxTargetToSpillIcon_svg", + "omniPatternIcon_svg", + "revBCardioidPatternIcon_svg", + "revCardioidPatternIcon_svg", + "scrollImage_png", + "superCardioidPatternIcon_svg", + "terminateSpillIcon_svg", + "undoPresetIcon_svg" +}; + +const char* originalFilenames[] = +{ + "austrianAudioLogo.svg", + "bandHandleKnob.svg", + "bCardioidPatternIcon.svg", + "cardioidPatternIcon.svg", + "closePresetListIcon.svg", + "diffuseField.svg", + "eightPatternIcon.svg", + "eqFieldCheckSign.svg", + "eyeDrop.svg", + "freeField.svg", + "hyperCardioidPatternIcon.svg", + "loadArrow.svg", + "maximizeTargetIcon.svg", + "maxTargetToSpillIcon.svg", + "omniPatternIcon.svg", + "revBCardioidPatternIcon.svg", + "revCardioidPatternIcon.svg", + "scrollImage.png", + "superCardioidPatternIcon.svg", + "terminateSpillIcon.svg", + "undoPresetIcon.svg" +}; + +const char* getNamedResourceOriginalFilename (const char* resourceNameUTF8); +const char* getNamedResourceOriginalFilename (const char* resourceNameUTF8) +{ + for (unsigned int i = 0; i < (sizeof (namedResourceList) / sizeof (namedResourceList[0])); ++i) + if (strcmp (namedResourceList[i], resourceNameUTF8) == 0) + return originalFilenames[i]; + + return nullptr; +} + +} diff --git a/JuceLibraryCode/BinaryData.h b/JuceLibraryCode/BinaryData.h new file mode 100644 index 0000000..b5bc83c --- /dev/null +++ b/JuceLibraryCode/BinaryData.h @@ -0,0 +1,90 @@ +/* ========================================================================================= + + This is an auto-generated file: Any edits you make may be overwritten! + +*/ + +#pragma once + +namespace BinaryData +{ + extern const char* austrianAudioLogo_svg; + const int austrianAudioLogo_svgSize = 19242; + + extern const char* bandHandleKnob_svg; + const int bandHandleKnob_svgSize = 930; + + extern const char* bCardioidPatternIcon_svg; + const int bCardioidPatternIcon_svgSize = 509; + + extern const char* cardioidPatternIcon_svg; + const int cardioidPatternIcon_svgSize = 563; + + extern const char* closePresetListIcon_svg; + const int closePresetListIcon_svgSize = 302; + + extern const char* diffuseField_svg; + const int diffuseField_svgSize = 1820; + + extern const char* eightPatternIcon_svg; + const int eightPatternIcon_svgSize = 939; + + extern const char* eqFieldCheckSign_svg; + const int eqFieldCheckSign_svgSize = 577; + + extern const char* eyeDrop_svg; + const int eyeDrop_svgSize = 2140; + + extern const char* freeField_svg; + const int freeField_svgSize = 990; + + extern const char* hyperCardioidPatternIcon_svg; + const int hyperCardioidPatternIcon_svgSize = 720; + + extern const char* loadArrow_svg; + const int loadArrow_svgSize = 510; + + extern const char* maximizeTargetIcon_svg; + const int maximizeTargetIcon_svgSize = 1625; + + extern const char* maxTargetToSpillIcon_svg; + const int maxTargetToSpillIcon_svgSize = 747; + + extern const char* omniPatternIcon_svg; + const int omniPatternIcon_svgSize = 166; + + extern const char* revBCardioidPatternIcon_svg; + const int revBCardioidPatternIcon_svgSize = 520; + + extern const char* revCardioidPatternIcon_svg; + const int revCardioidPatternIcon_svgSize = 565; + + extern const char* scrollImage_png; + const int scrollImage_pngSize = 6211; + + extern const char* superCardioidPatternIcon_svg; + const int superCardioidPatternIcon_svgSize = 725; + + extern const char* terminateSpillIcon_svg; + const int terminateSpillIcon_svgSize = 772; + + extern const char* undoPresetIcon_svg; + const int undoPresetIcon_svgSize = 752; + + // Number of elements in the namedResourceList and originalFileNames arrays. + const int namedResourceListSize = 21; + + // Points to the start of a list of resource names. + extern const char* namedResourceList[]; + + // Points to the start of a list of resource filenames. + extern const char* originalFilenames[]; + + // If you provide the name of one of the binary resource variables above, this function will + // return the corresponding data and its size (or a null pointer if the name isn't found). + const char* getNamedResource (const char* resourceNameUTF8, int& dataSizeInBytes); + + // If you provide the name of one of the binary resource variables above, this function will + // return the corresponding original, non-mangled filename (or a null pointer if the name isn't found). + const char* getNamedResourceOriginalFilename (const char* resourceNameUTF8); +} diff --git a/JuceLibraryCode/JuceHeader.h b/JuceLibraryCode/JuceHeader.h index f453538..587c7ed 100644 --- a/JuceLibraryCode/JuceHeader.h +++ b/JuceLibraryCode/JuceHeader.h @@ -30,6 +30,7 @@ #include #include +#include "BinaryData.h" #if defined (JUCE_PROJUCER_VERSION) && JUCE_PROJUCER_VERSION < JUCE_VERSION /** If you've hit this error then the version of the Projucer that was used to generate this project is diff --git a/source/PluginEditor.cpp b/source/PluginEditor.cpp index 95d28e9..73a21fa 100644 --- a/source/PluginEditor.cpp +++ b/source/PluginEditor.cpp @@ -27,79 +27,164 @@ //============================================================================== PolarDesignerAudioProcessorEditor::PolarDesignerAudioProcessorEditor (PolarDesignerAudioProcessor& p, - AudioProcessorValueTreeState& vts) -: AudioProcessorEditor (&p), loadingFile(false), processor (p), valueTreeState(vts), -directivityEqualiser (p), alOverlayError(AlertOverlay::Type::errorMessage), -alOverlayDisturber(AlertOverlay::Type::disturberTracking), -alOverlaySignal(AlertOverlay::Type::signalTracking) + AudioProcessorValueTreeState& vts) + : AudioProcessorEditor (&p), loadingFile(false), + presetListVisible(false), + processor (p), + valueTreeState(vts), + directivityEqualiser (p), + showTerminatorAnimationWindow(false), + isTargetAquiring(false), + maximizeTarget(false), + showMaxToSpillWindow(false), + maxTargetToSpillFlowStarted(false), + termStage(PolarDesignerAudioProcessorEditor::terminatorStage::DISABLED) { - // openGLContext.attachTo (*getTopLevelComponent()); - + openGLContext.attachTo (*getTopLevelComponent()); + nActiveBands = processor.getNBands(); syncChannelIdx = processor.getSyncChannelIdx(); setResizable(true, true); - setSize(EDITOR_WIDTH, EDITOR_HEIGHT); - setLookAndFeel(&globalLaF); + setResizeLimits(EDITOR_MIN_WIDTH, EDITOR_MIN_HEIGHT, EDITOR_MAX_WIDTH, EDITOR_MAX_HEIGHT); + float ratio = static_cast(EDITOR_MIN_WIDTH) / static_cast(EDITOR_MIN_HEIGHT); + getConstrainer()->setFixedAspectRatio(ratio); + setSize(EDITOR_MIN_WIDTH, EDITOR_MIN_HEIGHT); + setLookAndFeel(&mainLaF); + + addAndMakeVisible(&tbLogoAA); + tbLogoAA.setButtonText("Austrian Audio Logo"); + + addAndMakeVisible(&titleCompare); + titleCompare.setTitle(String("Compare")); + titleCompare.setFont(mainLaF.normalFont); + + addAndMakeVisible(&tmbABButton); + tmbABButton.setButtonsNumber(2); + tmbABButton.setInterceptsMouseClicks(true, true); + + tmbABButton[0].setClickingTogglesState(true); + tmbABButton[0].setRadioGroupId(3344); + tmbABButton[0].setButtonText("A"); + tmbABButton[0].addListener(this); + tmbABButton[0].setToggleState(processor.abLayerState, NotificationType::dontSendNotification); + + tmbABButton[1].setClickingTogglesState(true); + tmbABButton[1].setRadioGroupId(3344); + tmbABButton[1].setButtonText("B"); + tmbABButton[1].addListener(this); + + addAndMakeVisible(&tbZeroDelay); + tbZeroDelayAtt = std::unique_ptr(new ButtonAttachment(valueTreeState, "zeroDelayMode", tbZeroDelay)); + tbZeroDelay.addListener(this); + tbZeroDelay.setButtonText("Zero latency"); + tbZeroDelay.setToggleState(processor.zeroDelayModeActive(), NotificationType::dontSendNotification); + + addAndMakeVisible(&titlePreset); + titlePreset.setTitle(String("Preset")); + titlePreset.setFont(mainLaF.normalFont); + titlePreset.setInterceptsMouseClicks(false, true); - addAndMakeVisible(&logoAA); - addAndMakeVisible (&titleAA); - addAndMakeVisible(&titlePD); - titlePD.setTitle(String("PolarDesigner")); - titlePD.setFont(globalLaF.aaRegular); - addAndMakeVisible(&titleLine); + addAndMakeVisible(&titlePresetUndoButton); + titlePresetUndoButton.setButtonText("Preset undo"); + titlePresetUndoButton.addListener(this); + + addAndMakeVisible(&tbLoad); + tbLoad.addListener(this); + tbLoad.setButtonText("Load"); + tbLoad.setToggleState(false, NotificationType::dontSendNotification); + + addAndMakeVisible(&tbSave); + tbSave.addListener(this); + tbSave.setButtonText("Save"); + tbSave.setToggleState(false, NotificationType::dontSendNotification); + + addAndMakeVisible(&tmbNrBandsButton); + tmbNrBandsButton.setButtonsNumber(maxNumberBands); + tmbNrBandsButton.setAlwaysOnTop(true); + + for (int i = 0; i < maxNumberBands; ++i) + { + tmbNrBandsButton[i].setClickingTogglesState(true); + tmbNrBandsButton[i].setRadioGroupId(34567); + + tmbNrBandsButton[i].setButtonText(String(i + 1)); + tmbNrBandsButton[i].addListener(this); + + if (i == nActiveBands - 1) tmbNrBandsButton[i].setToggleState(true, NotificationType::dontSendNotification); + } addAndMakeVisible (&footer); - - addAndMakeVisible (&alOverlayError); - alOverlayError.setVisible(false); - alOverlayError.setColour(AlertWindow::backgroundColourId, globalLaF.AAGrey); - alOverlayError.setColour(TextButton::buttonColourId, globalLaF.AARed); - - addAndMakeVisible (&alOverlayDisturber); - alOverlayDisturber.setVisible(false); - alOverlayDisturber.setColour(AlertWindow::backgroundColourId, globalLaF.AAGrey); - alOverlayDisturber.setColour(TextButton::buttonColourId , globalLaF.AARed); - alOverlayDisturber.setTitle("acquiring target!"); - alOverlayDisturber.setMessage("Make sure playback of an undesired target signal (spill) is active. Terminate to apply polar patterns with minimum spill energy. Also track a desired signal to be able to maximize the target-to-spill ratio."); - - addAndMakeVisible (&alOverlaySignal); - alOverlaySignal.setVisible(false); - alOverlaySignal.setColour(AlertWindow::backgroundColourId, globalLaF.AAGrey); - alOverlaySignal.setColour(TextButton::buttonColourId , globalLaF.AARed); - alOverlaySignal.setTitle("acquiring target!"); - alOverlaySignal.setMessage("Make sure playback of a desired target signal is active. Stop signal tracking to apply polar patterns with maximum signal energy. Also track an undesired spill target to be able to maximize the target-to-spill ratio."); - + footer.setInterceptsMouseClicks(false, true); + // groups - addAndMakeVisible (&grpEq); - grpEq.setText ("equalization control"); - grpEq.setTextLabelPosition (Justification::centredLeft); - addAndMakeVisible (&grpBands); - grpBands.setText ("band control"); - grpBands.setTextLabelPosition (Justification::centredLeft); - - addAndMakeVisible (&grpPreset); - grpPreset.setText ("preset control"); - grpPreset.setTextLabelPosition (Justification::centredLeft); - - addAndMakeVisible (&grpDstC); - grpDstC.setText ("terminator control"); - grpDstC.setTextLabelPosition (Justification::centredLeft); - - addAndMakeVisible (&grpProxComp); - grpProxComp.setText ("proximity control"); - grpProxComp.setTextLabelPosition (Justification::centredLeft); - - addAndMakeVisible (&grpSync); - grpSync.setText ("sync-channel"); - grpSync.setTextLabelPosition (Justification::centredLeft); - - eqColours[0] = Colour(0xFDBA4949); - eqColours[1] = Colour(0xFDBA6F49); - eqColours[2] = Colour(0xFDBAAF49); - eqColours[3] = Colour(0xFD8CBA49); - eqColours[4] = Colour(0xFD49BA64); + grpBands.setText ("Number of bands"); + + addAndMakeVisible(&grpEq); + grpEq.setText("Equalization control"); + + addAndMakeVisible(&ibEqCtr[0]); + ibEqCtr[0].setButtonText("Free Field"); + ibEqCtr[0].addListener(this); + + addAndMakeVisible(&ibEqCtr[1]); + ibEqCtr[1].setButtonText("Diffuse Field"); + ibEqCtr[1].addListener(this); + + addAndMakeVisible(&grpProxComp); + grpProxComp.setText("Proximity control"); + + addAndMakeVisible(&tgbProxCtr); + tgbProxCtrAtt = std::unique_ptr(new ButtonAttachment(valueTreeState, "proximityOnOff", tgbProxCtr)); + tgbProxCtr.addListener(this); + + addAndMakeVisible(&slProximity); + slProximityAtt = std::unique_ptr(new SliderAttachment(valueTreeState, "proximity", slProximity)); + slProximity.setSliderStyle(Slider::LinearHorizontal); + slProximity.setTextBoxStyle(Slider::TextBoxRight, false, 45, 15); + slProximity.setEnabled(tgbProxCtr.getToggleState()); + slProximity.addListener(this); + + addAndMakeVisible(&grpTerminatorControl); + grpTerminatorControl.setText("Terminator control"); + + addAndMakeVisible(&tbCloseTerminatorControl); + tbCloseTerminatorControl.setComponentID("5721"); + tbCloseTerminatorControl.setToggleState(false, NotificationType::dontSendNotification); + tbCloseTerminatorControl.addListener(this); + + addAndMakeVisible(processor.termControlWaveform); + processor.termControlWaveform.setColours(mainLaF.labelBackgroundColor, mainLaF.textButtonActiveRedFrameColor); + + addAndMakeVisible(&albPlaybackSpill); + + addAndMakeVisible(&albAcquiringTarget); + + addAndMakeVisible(&grpSync); + grpSync.setText("Sync group"); + + addAndMakeVisible(&tmbSyncChannelButton); + tmbSyncChannelButton.setButtonsNumber(4); + tmbSyncChannelButton.setAlwaysOnTop(true); + + for (int i = 0; i < 4; ++i) + { + tmbSyncChannelButton[i].setClickingTogglesState(true); + + tmbSyncChannelButton[i].setButtonText(String(i+1)); + tmbSyncChannelButton[i].addListener(this); + //Set ID manually for drawing colors purpose + tmbSyncChannelButton[i].setComponentID(String("552" + String(i + 1))); + + if (i == syncChannelIdx - 1) tmbSyncChannelButton[i].setToggleState(true, NotificationType::dontSendNotification); + } + + eqColours[0] = mainLaF.polarVisualizerRed; + eqColours[1] = mainLaF.polarVisualizerOrange; + eqColours[2] = mainLaF.polarVisualizerYellow; + eqColours[3] = mainLaF.polarVisualizerGreen; + eqColours[4] = mainLaF.polarVisualizerGreenDark; // directivity eq addAndMakeVisible (&directivityEqualiser); @@ -107,18 +192,18 @@ alOverlaySignal(AlertOverlay::Type::signalTracking) for (int i = 0; i < maxNumberBands; ++i) { // SOLO button - msbSolo[i].setType (MuteSoloButton::Type::solo); - addAndMakeVisible (&msbSolo[i]); - msbSoloAtt[i] = std::unique_ptr(new ButtonAttachment (valueTreeState, "solo" + String(i+1), msbSolo[i])); - msbSolo[i].addListener (this); - msbSolo[i].setAlwaysOnTop (true); + addAndMakeVisible (&tgbSolo[i]); + tgbSoloAtt[i] = std::unique_ptr(new ButtonAttachment (valueTreeState, "solo" + String(i+1), tgbSolo[i])); + tgbSolo[i].addListener (this); + tgbSolo[i].setButtonText("S"); + tgbSolo[i].setAlwaysOnTop (true); // MUTE button - msbMute[i].setType (MuteSoloButton::Type::mute); - addAndMakeVisible (&msbMute[i]); - msbMuteAtt[i] = std::unique_ptr(new ButtonAttachment (valueTreeState, "mute" + String(i+1), msbMute[i])); - msbMute[i].addListener (this); - msbMute[i].setAlwaysOnTop (true); + addAndMakeVisible (&tgbMute[i]); + tgbMuteAtt[i] = std::unique_ptr(new ButtonAttachment (valueTreeState, "mute" + String(i+1), tgbMute[i])); + tgbMute[i].addListener (this); + tgbMute[i].setButtonText("M"); + tgbMute[i].setAlwaysOnTop (true); // Direction slider addAndMakeVisible (&slDir[i]); @@ -126,25 +211,26 @@ alOverlaySignal(AlertOverlay::Type::signalTracking) slDir[i].setColour (Slider::thumbColourId, eqColours[i]); // colour of knob slDir[i].addListener (this); slDir[i].setTooltipEditable (true); + slDir[i].setInterceptsMouseClicks(false, true); // Band Gain slider addAndMakeVisible (&slBandGain[i]); - slBandGainAtt[i] = std::unique_ptr(new ReverseSlider::SliderAttachment (valueTreeState, "gain" + String(i+1), slBandGain[i])); - slBandGain[i].setSliderStyle (Slider::LinearHorizontal); - slBandGain[i].setColour (Slider::rotarySliderOutlineColourId, eqColours[i]); - slBandGain[i].setColour (Slider::thumbColourId, eqColours[i]); - slBandGain[i].setTextBoxStyle (Slider::TextBoxAbove, false, 50, 15); + slBandGainAtt[i] = std::unique_ptr(new SliderAttachment (valueTreeState, "gain" + String(i+1), slBandGain[i])); + slBandGain[i].setSliderStyle (Slider::LinearVertical); + slBandGain[i].setTextValueSuffix(" dB"); + slBandGain[i].setTextBoxStyle(Slider::TextBoxLeft, true, -1, -1); slBandGain[i].addListener (this); - + // First-Order directivity visualizer (The "O"verhead view) addAndMakeVisible (&polarPatternVisualizers[i]); polarPatternVisualizers[i].setActive(true); + polarPatternVisualizers[i].addListener(this); polarPatternVisualizers[i].setDirWeight (slDir[i].getValue()); - polarPatternVisualizers[i].setMuteSoloButtons (&msbSolo[i], &msbMute[i]); + polarPatternVisualizers[i].setMuteSoloButtons (&tgbSolo[i], &tgbMute[i]); polarPatternVisualizers[i].setColour (eqColours[i]); - + // main directivity Equaliser section - directivityEqualiser.addSliders (eqColours[i], &slDir[i], (i > 0) ? &slCrossoverPosition[i - 1] : nullptr, (i < maxNumberBands - 1) ? &slCrossoverPosition[i] : nullptr, &msbSolo[i], &msbMute[i], &slBandGain[i], &polarPatternVisualizers[i]); + directivityEqualiser.addSliders (eqColours[i], &slDir[i], (i > 0) ? &slCrossoverPosition[i - 1] : nullptr, (i < maxNumberBands - 1) ? &slCrossoverPosition[i] : nullptr, &tgbSolo[i], &tgbMute[i], &slBandGain[i], &polarPatternVisualizers[i]); if (i == maxNumberBands - 1) break; // there is one slCrossoverPosition less than bands @@ -154,317 +240,264 @@ alOverlaySignal(AlertOverlay::Type::signalTracking) slCrossoverPosition[i].setSliderStyle (Slider::RotaryHorizontalVerticalDrag); slCrossoverPosition[i].addListener(this); slCrossoverPosition[i].setVisible(false); + slCrossoverPosition[i].setInterceptsMouseClicks(false, true); } directivityEqualiser.initValueBox(); - - addAndMakeVisible (&tbLoadFile); - tbLoadFile.setButtonText ("load preset"); - tbLoadFile.addListener (this); - - addAndMakeVisible (&tbSaveFile); - tbSaveFile.setButtonText ("save preset"); - tbSaveFile.addListener (this); - - addAndMakeVisible (&tbRecordDisturber); - tbRecordDisturber.setButtonText ("terminate spill"); - tbRecordDisturber.addListener (this); - - addAndMakeVisible (&tbRecordSignal); - tbRecordSignal.setButtonText ("maximize target"); - tbRecordSignal.addListener (this); - + + addAndMakeVisible (&tbTerminateSpill); + tbTerminateSpill.setButtonText ("Terminate Spill"); + tbTerminateSpill.addListener (this); + + addAndMakeVisible (&tbMaximizeTarget); + tbMaximizeTarget.setButtonText ("Maximize Target"); + tbMaximizeTarget.addListener (this); + + addAndMakeVisible(&tbMaxTargetToSpill); + tbMaxTargetToSpill.setButtonText("Max Target-to-spill"); + tbMaxTargetToSpill.addListener(this); + + addAndMakeVisible(&terminatorLabelNr1); + terminatorLabelNr1.setButtonText("01"); + terminatorLabelNr1.setToggleState(false, NotificationType::dontSendNotification); + addAndMakeVisible(&terminatorLabelSpillMain); + terminatorLabelSpillMain.setButtonText("Terminate spill"); + addAndMakeVisible(&terminatorLabelSpillSub); + juce::String termSpillText; + termSpillText << "Click on the button below to apply polar\n"; + termSpillText << "patterns with minimum spill energy"; + terminatorLabelSpillSub.setButtonText(termSpillText); + + addAndMakeVisible(&tbBeginTerminate); + tbBeginTerminate.setButtonText("Begin Terminate"); + tbBeginTerminate.addListener(this); + + addAndMakeVisible(&terminatorLabelNr2); + terminatorLabelNr2.setButtonText("02"); + terminatorLabelNr2.setToggleState(false, NotificationType::dontSendNotification); + addAndMakeVisible(&terminatorLabelMaxMain); + terminatorLabelMaxMain.setButtonText("Maximize target"); + addAndMakeVisible(&terminatorLabelMaxSub); + juce::String termMaxText; + termMaxText << "Click on the button below to apply polar\n"; + termMaxText << "patterns with maximum signal energy"; + terminatorLabelMaxSub.setButtonText(termMaxText); + + addAndMakeVisible(&tbBeginMaximize); + tbBeginMaximize.setButtonText("Begin Maximize"); + tbBeginMaximize.addListener(this); + + addAndMakeVisible(&terminatorLabelNr3); + terminatorLabelNr3.setButtonText("03"); + terminatorLabelNr3.setToggleState(false, NotificationType::dontSendNotification); + addAndMakeVisible(&terminatorLabelMaxToSpillMain); + terminatorLabelMaxToSpillMain.setButtonText("Max Target-to-Spill"); + addAndMakeVisible(&terminatorLabelMaxToSpillSub); + juce::String termMaxToSpillText; + termMaxToSpillText << "Find best compromise between reduction\n"; + termMaxToSpillText << "of spill and maximizing target signal"; + terminatorLabelMaxToSpillSub.setButtonText(termMaxToSpillText); + + addAndMakeVisible(&tbApplyMaxTargetToSpill); + tbApplyMaxTargetToSpill.setButtonText("Apply Max Target-to-Spill"); + tbApplyMaxTargetToSpill.addListener(this); + + for (int i = 0; i < 8; i++) + { + addAndMakeVisible(&terminatorStageLine[i]); + terminatorStageLine[i].setButtonText("TermLine" + String(i)); + } + addAndMakeVisible (&tbAllowBackwardsPattern); tbAllowBackwardsPatternAtt = std::unique_ptr(new ButtonAttachment (valueTreeState, "allowBackwardsPattern", tbAllowBackwardsPattern)); tbAllowBackwardsPattern.setButtonText ("allow reverse patterns"); tbAllowBackwardsPattern.addListener (this); - - addAndMakeVisible (&tbEq[0]); - tbEq[0].addListener (this); - tbEq[0].setButtonText ("off"); - tbEq[0].setRadioGroupId(1); - - addAndMakeVisible (&tbEq[1]); - tbEq[1].addListener (this); - tbEq[1].setButtonText ("free field"); - tbEq[1].setRadioGroupId(1); - - addAndMakeVisible (&tbEq[2]); - tbEq[2].addListener (this); - tbEq[2].setButtonText ("diffuse field"); - tbEq[2].setRadioGroupId(1); - - addAndMakeVisible (&tbAbButton[0]); - tbAbButton[0].addListener (this); - tbAbButton[0].setButtonText("A"); - tbAbButton[0].setToggleState(processor.abLayerState, NotificationType::dontSendNotification); - tbAbButton[0].setClickingTogglesState(true); - tbAbButton[0].setAlpha(getABButtonAlphaFromLayerState(processor.abLayerState)); - tbAbButton[0].setRadioGroupId(2); - - addAndMakeVisible (&tbAbButton[1]); - tbAbButton[1].addListener(this); - tbAbButton[1].setButtonText("B"); - tbAbButton[1].setToggleState(!processor.abLayerState, NotificationType::dontSendNotification); - tbAbButton[1].setClickingTogglesState(true); - tbAbButton[1].setAlpha(getABButtonAlphaFromLayerState(!processor.abLayerState)); - tbAbButton[1].setRadioGroupId(2); - - -#if 0 - { - // cbSetNrBands.setLookAndFeel(&comboBoxLaF); - - addAndMakeVisible (&cbSetNrBands); - cbSetNrBandsAtt = std::unique_ptr(new ComboBoxAttachment (valueTreeState, "nrBands", cbSetNrBands)); - cbSetNrBands.setEditableText (false); - cbSetNrBands.addItemList (juce::StringArray ({"one band","two bands", - "three bands","four bands", - "five bands"}), 1); - cbSetNrBands.setJustificationType (Justification::centred); - cbSetNrBands.setSelectedId (nActiveBands); - cbSetNrBands.addListener (this); - } -#endif - - // TODO: Replace cbSetNrBands with this: - for (int i = 0; i < maxNumberBands; ++i) - { - // tbSetNrBands[i].setTitle(String (i + 1)); - addAndMakeVisible(tbSetNrBands[i]); - // tbSetNrBandsAtt[i] = std::unique_ptr(new ButtonAttachment (valueTreeState, "nrBands", tbSetNrBands[i])); - - tbSetNrBands[i].setClickingTogglesState (true); - tbSetNrBands[i].setRadioGroupId (34567); - - // tbSetNrBands[i].setColour (TextButton::textColourOffId, Colours::black); - tbSetNrBands[i].setColour (TextButton::textColourOnId, Colours::powderblue); - // tbSetNrBands[i].setColour (TextButton::buttonColourId, Colours::white); - tbSetNrBands[i].setColour (TextButton::buttonOnColourId, Colours::blueviolet.brighter()); - - tbSetNrBands[i].setConnectedEdges (((i != 0) ? Button::ConnectedOnLeft : 0) - | ((i != 3) ? Button::ConnectedOnRight : 0)); - - - tbSetNrBands[i].addListener(this); - - if (i == (nActiveBands - 1)) { - tbSetNrBands[i].setToggleState (true, NotificationType::dontSendNotification); - - } - } - -#if 0 - addAndMakeVisible (&cbSyncChannel); - cbSyncChannelAtt = std::unique_ptr(new ComboBoxAttachment (valueTreeState, "syncChannel", cbSyncChannel)); - cbSyncChannel.setEditableText (false); - cbSyncChannel.addItemList (juce::StringArray ({"none","one","two","three","four"}), 1); - cbSyncChannel.setJustificationType (Justification::centred); - cbSyncChannel.setSelectedId (syncChannelIdx); - cbSyncChannel.addListener (this); -#endif - - // TODO: Replace cbSyncChannel with this: - for (int i = 0; i < 5; ++i) - { - - // if (i == 0) { - // tbSyncChannel[i].setTitle(String ("X")); - // } - // else { - // tbSyncChannel[i].setTitle(String (i)); - // } - - addAndMakeVisible(tbSyncChannel[i]); - - tbSyncChannel[i].setClickingTogglesState (true); - tbSyncChannel[i].setRadioGroupId (76543); - - tbSyncChannel[i].setColour (TextButton::textColourOnId, Colours::powderblue); - tbSyncChannel[i].setColour (TextButton::buttonOnColourId, Colours::blueviolet.brighter()); - - tbSyncChannel[i].setConnectedEdges (((i != 0) ? Button::ConnectedOnLeft : 0) - | ((i != 3) ? Button::ConnectedOnRight : 0)); - - - tbSyncChannel[i].addListener(this); - - if (i == syncChannelIdx - 1) { - tbSyncChannel[i].setToggleState (true, NotificationType::dontSendNotification); - - } - } - - - - - - addAndMakeVisible (&slProximity); - slProximityAtt = std::unique_ptr(new ReverseSlider::SliderAttachment (valueTreeState, "proximity", slProximity)); - slProximity.setSliderStyle (Slider::LinearHorizontal); - slProximity.setColour (Slider::thumbColourId, globalLaF.AARed); - slProximity.setColour (Slider::rotarySliderOutlineColourId, globalLaF.AARed); - slProximity.setTextBoxStyle (Slider::TextBoxRight, false, 45, 15); - slProximity.addListener (this); - - addAndMakeVisible (&tbZeroDelay); - tbZeroDelayAtt = std::unique_ptr(new ButtonAttachment (valueTreeState, "zeroDelayMode", tbZeroDelay)); - tbZeroDelay.addListener (this); - tbZeroDelay.setButtonText ("zero latency"); - tbZeroDelay.setToggleState(processor.zeroDelayModeActive(), NotificationType::dontSendNotification); - - directivityEqualiser.setSoloActive (getSoloActive()); + + directivityEqualiser.setSoloActive(getSoloActive()); + directivityEqualiser.setInterceptsMouseClicks(false, true); + for (auto& vis : polarPatternVisualizers) { vis.setSoloActive (getSoloActive()); } - - - // set overlay callbacks - alOverlayError.setOnOkayCallback ([this]() { onAlOverlayErrorOkay(); }); - - alOverlayDisturber.setOnOkayCallback ([this]() { onAlOverlayApplyPattern(); }); - alOverlayDisturber.setOnCancelCallback ([this]() { onAlOverlayCancelRecord(); }); - alOverlayDisturber.setOnRatioCallback ([this]() { onAlOverlayMaxSigToDist(); }); - - alOverlaySignal.setOnOkayCallback ([this]() { onAlOverlayApplyPattern(); }); - alOverlaySignal.setOnCancelCallback ([this]() { onAlOverlayCancelRecord(); }); - alOverlaySignal.setOnRatioCallback ([this]() { onAlOverlayMaxSigToDist(); }); - + + addAndMakeVisible(&grpPresetList); + grpPresetList.setText("Preset"); + + addAndMakeVisible(&tbClosePresetList); + tbClosePresetList.addListener(this); + tbClosePresetList.setComponentID("5621"); + tbClosePresetList.setToggleState(false, NotificationType::dontSendNotification); + + addAndMakeVisible(&tbOpenFromFile); + tbOpenFromFile.setClickingTogglesState(true); + tbOpenFromFile.setButtonText("Open from file"); + tbOpenFromFile.addListener(this); + + addAndMakeVisible(&lbUserPresets); + lbUserPresets.setHeaderText("User Presets"); + lbUserPresets.addChangeListener(this); + + addAndMakeVisible(&lbFactoryPresets); + lbFactoryPresets.setHeaderText("Factory Presets"); + lbFactoryPresets.addChangeListener(this); + nActiveBandsChanged(); - - trimSlider.sliderIncremented = [this] { incrementTrim(nActiveBands); }; - trimSlider.sliderDecremented = [this] { decrementTrim(nActiveBands); }; - - addAndMakeVisible(&trimSlider); + zeroDelayModeChange(); + + trimSlider.sliderValueSet = [this] { setTrimValue(nActiveBands); }; + trimSlider.sliderReset = [this] { resetTrim(nActiveBands); }; nActiveBandsChanged(); zeroDelayModeChange(); - trimSlider.sliderIncremented = [this] { incrementTrim(this->nActiveBands); }; - trimSlider.sliderDecremented = [this] { decrementTrim(this->nActiveBands); }; + addAndMakeVisible(&trimSlider); + + addAndMakeVisible(&tbTrimSliderCenterPointer); + tbTrimSliderCenterPointer.setButtonText("Trim Slider Pointer"); + + loadSavedPresetsToList(); startTimer (30); setEqMode(); - - } // Handle the trimSlider increment/decrement calls -void PolarDesignerAudioProcessorEditor::incrementTrim(int nBands) { +void PolarDesignerAudioProcessorEditor::setTrimValue(int nBands) { + //Check if slider incrementing/decrementing + bool lockBandsOnTop = false; + for (int i = 0; i < nBands; i++) + { + if (slDir[i].getValue() == 1.f) + { + lockBandsOnTop = true; + break; + } + else if (slDir[i].getValue() == -0.5f) + { + lockBandsOnTop = false; + break; + } + } + calculateLockedBands(nBands, lockBandsOnTop); + + float currPos = trimSlider.getCurrentSliderValue() - trimSliderPrevPos; for (int i = 0; i < nBands; i++) { - slDir[i].setValue(slDir[i].getValue() + trimSlider.step); + if (slDir[i].isEnabled() && !bandLockedOnMinMax[i]) + { + slDir[i].setValue(slDir[i].getValue() + currPos); + } } + trimSliderPrevPos = trimSlider.getCurrentSliderValue(); + + directivityEqualiser.setDirSliderLastChangedByDrag(false); + directivityEqualiser.resetTooltipTexts(); } -void PolarDesignerAudioProcessorEditor::decrementTrim(int nBands) { +void PolarDesignerAudioProcessorEditor::resetTrim(int nBands) { + trimSliderPrevPos = 0.22f; for (int i = 0; i < nBands; i++) { - slDir[i].setValue(slDir[i].getValue() - trimSlider.step); + if (slDir[i].isEnabled()) + slDir[i].setValue(0.22f); } + directivityEqualiser.resetTooltipTexts(); } PolarDesignerAudioProcessorEditor::~PolarDesignerAudioProcessorEditor() { - if (alOverlayDisturber.isVisible()) - onAlOverlayCancelRecord(); - - if (alOverlaySignal.isVisible()) - onAlOverlayCancelRecord(); - setLookAndFeel (nullptr); - } //============================================================================== void PolarDesignerAudioProcessorEditor::paint (Graphics& g) { - g.fillAll (globalLaF.ClBackground); - + g.fillAll (mainLaF.mainBackground); #ifdef AA_DO_DEBUG_PATH g.strokePath (debugPath, PathStrokeType (15.0f)); #endif - } void PolarDesignerAudioProcessorEditor::resized() { + Rectangle area(getLocalBounds()); - Rectangle area (getLocalBounds()); + juce::FlexBox mainfb; + mainfb.flexDirection = FlexBox::Direction::row; + mainfb.justifyContent = juce::FlexBox::JustifyContent::center; + mainfb.alignContent = juce::FlexBox::AlignContent::center; - juce::FlexBox fb; - fb.flexDirection = FlexBox::Direction::column; - fb.justifyContent = juce::FlexBox::JustifyContent::center; - fb.alignContent = juce::FlexBox::AlignContent::center; + juce::FlexBox subfb; + subfb.flexDirection = FlexBox::Direction::column; + subfb.justifyContent = juce::FlexBox::JustifyContent::center; + subfb.alignContent = juce::FlexBox::AlignContent::center; juce::FlexBox topComponent; topComponent.flexDirection = FlexBox::Direction::row; topComponent.justifyContent = juce::FlexBox::JustifyContent::center; topComponent.alignContent = juce::FlexBox::AlignContent::center; - const float marginFlex = 0.01f; - const float topComponentTitleFlex = 0.4f; - const float topComponentButtonsFlex = 0.05f; - const float topComponentSpacingFlex = topComponentButtonsFlex/2; - const float topComponentButtonsMargin = 5; - - topComponent.items.add(juce::FlexItem().withFlex(marginFlex)); - topComponent.items.add(juce::FlexItem(logoAA).withFlex(topComponentButtonsFlex)); - topComponent.items.add(juce::FlexItem().withFlex(topComponentSpacingFlex)); - topComponent.items.add(juce::FlexItem(titleAA).withFlex(topComponentTitleFlex)); - topComponent.items.add(juce::FlexItem().withFlex(topComponentSpacingFlex)); - topComponent.items.add(juce::FlexItem(titlePD).withFlex(topComponentTitleFlex)); - topComponent.items.add(juce::FlexItem(tbAbButton[0]).withFlex(topComponentButtonsFlex).withMargin(topComponentButtonsMargin)); - topComponent.items.add(juce::FlexItem().withFlex(topComponentSpacingFlex/2)); - topComponent.items.add(juce::FlexItem(tbAbButton[1]).withFlex(topComponentButtonsFlex).withMargin(topComponentButtonsMargin)); - topComponent.items.add(juce::FlexItem().withFlex(topComponentSpacingFlex)); - topComponent.items.add(juce::FlexItem(tbZeroDelay).withFlex(topComponentButtonsFlex*3).withMargin(5)); - topComponent.items.add(juce::FlexItem().withFlex(marginFlex)); - - juce::FlexBox topComponentLine; - topComponentLine.flexDirection = FlexBox::Direction::row; - topComponentLine.justifyContent = juce::FlexBox::JustifyContent::center; - topComponentLine.alignContent = juce::FlexBox::AlignContent::center; - topComponentLine.items.add(juce::FlexItem().withFlex(marginFlex)); - topComponentLine.items.add(juce::FlexItem(titleLine).withFlex(1.f - 2 * marginFlex)); - topComponentLine.items.add(juce::FlexItem().withFlex(marginFlex)); - - const float sideComponentItemFlex = 0.05f; +// const float marginFlex = 0.022f; +// const float topComponentTitleFlex = 0.4f; +// const float topComponentButtonsFlex = 0.035f; +// const float topComponentSpacingFlex = topComponentButtonsFlex / 2; +// const float topComponentButtonsMargin = 5; +// const float radioButonsFlex = 0.18f; +// const float radioButonsSpaceFlex = 0.025f; + + topComponent.items.add(juce::FlexItem().withFlex(0.022f)); + if (!presetListVisible) + { + topComponent.items.add(juce::FlexItem(tbLogoAA).withFlex(0.243f)); + } + + topComponent.items.add(juce::FlexItem(titleCompare).withFlex(0.063f)); + topComponent.items.add(juce::FlexItem().withFlex(0.016f)); + topComponent.items.add(juce::FlexItem(tmbABButton).withFlex(0.077f).withMargin(2)); + topComponent.items.add(juce::FlexItem().withFlex(0.042f)); + topComponent.items.add(juce::FlexItem(tbZeroDelay).withFlex(0.1f).withMargin(2)); + topComponent.items.add(juce::FlexItem().withFlex(0.1f)); + topComponent.items.add(juce::FlexItem(titlePreset).withFlex(0.11f)); + if (presetLoaded) + { + topComponent.items.add(juce::FlexItem().withFlex(0.01f)); + topComponent.items.add(juce::FlexItem(titlePresetUndoButton).withFlex(0.01f)); + } + topComponent.items.add(juce::FlexItem().withFlex(0.02f)); + topComponent.items.add(juce::FlexItem(tbLoad).withFlex(0.072f).withMargin(2)); + topComponent.items.add(juce::FlexItem().withFlex(0.01f)); + topComponent.items.add(juce::FlexItem(tbSave).withFlex(0.072f).withMargin(2)); + topComponent.items.add(juce::FlexItem().withFlex(0.034f)); + + juce::FlexBox bandNumbersComponent; + bandNumbersComponent.flexDirection = FlexBox::Direction::row; + bandNumbersComponent.justifyContent = juce::FlexBox::JustifyContent::center; + bandNumbersComponent.alignContent = juce::FlexBox::AlignContent::center; + + juce::FlexBox syncChannelComponent; + syncChannelComponent.flexDirection = FlexBox::Direction::row; + syncChannelComponent.justifyContent = juce::FlexBox::JustifyContent::center; + syncChannelComponent.alignContent = juce::FlexBox::AlignContent::center; juce::FlexBox sideComponent; sideComponent.flexDirection = FlexBox::Direction::column; sideComponent.justifyContent = juce::FlexBox::JustifyContent::center; sideComponent.alignContent = juce::FlexBox::AlignContent::center; - sideComponent.items.add(juce::FlexItem().withFlex(marginFlex)); - sideComponent.items.add(juce::FlexItem(grpBands).withFlex(sideComponentItemFlex)); - sideComponent.items.add(juce::FlexItem(cbSetNrBands).withFlex(sideComponentItemFlex)); - sideComponent.items.add(juce::FlexItem().withFlex(marginFlex)); - sideComponent.items.add(juce::FlexItem(grpPreset).withFlex(sideComponentItemFlex)); - sideComponent.items.add(juce::FlexItem(tbLoadFile).withFlex(sideComponentItemFlex)); - sideComponent.items.add(juce::FlexItem(tbSaveFile).withFlex(sideComponentItemFlex)); - sideComponent.items.add(juce::FlexItem().withFlex(marginFlex)); - sideComponent.items.add(juce::FlexItem(grpEq).withFlex(sideComponentItemFlex)); - sideComponent.items.add(juce::FlexItem(tbEq[0]).withFlex(sideComponentItemFlex)); - sideComponent.items.add(juce::FlexItem(tbEq[1]).withFlex(sideComponentItemFlex)); - sideComponent.items.add(juce::FlexItem(tbEq[2]).withFlex(sideComponentItemFlex)); - sideComponent.items.add(juce::FlexItem().withFlex(marginFlex)); - sideComponent.items.add(juce::FlexItem(grpProxComp).withFlex(sideComponentItemFlex)); - sideComponent.items.add(juce::FlexItem(slProximity).withFlex(sideComponentItemFlex)); - sideComponent.items.add(juce::FlexItem().withFlex(marginFlex)); - sideComponent.items.add(juce::FlexItem(grpDstC).withFlex(sideComponentItemFlex)); - sideComponent.items.add(juce::FlexItem(tbAllowBackwardsPattern).withFlex(sideComponentItemFlex)); - sideComponent.items.add(juce::FlexItem(tbRecordDisturber).withFlex(sideComponentItemFlex)); - sideComponent.items.add(juce::FlexItem(tbRecordSignal).withFlex(sideComponentItemFlex)); - sideComponent.items.add(juce::FlexItem().withFlex(marginFlex)); - sideComponent.items.add(juce::FlexItem(grpSync).withFlex(sideComponentItemFlex)); - sideComponent.items.add(juce::FlexItem(cbSyncChannel).withFlex(sideComponentItemFlex)); - sideComponent.items.add(juce::FlexItem().withFlex(marginFlex)); + sideComponent.items.add(juce::FlexItem(/*placeholder for grpBands*/).withFlex(0.14f)); + sideComponent.items.add(juce::FlexItem().withFlex(0.02f)); + sideComponent.items.add(juce::FlexItem(/*placeholder for grpEq*/).withFlex(0.22f)); + sideComponent.items.add(juce::FlexItem().withFlex(0.02f)); + sideComponent.items.add(juce::FlexItem(/*placeholder for grpProxComp*/).withFlex(0.14f)); + sideComponent.items.add(juce::FlexItem().withFlex(0.02f)); + sideComponent.items.add(juce::FlexItem(/*placeholder for grpTermControl*/).withFlex(0.28f)); + sideComponent.items.add(juce::FlexItem().withFlex(0.02f)); + sideComponent.items.add(juce::FlexItem(/*placeholder for grpSync*/).withFlex(0.14f)); // Margins are fixed value because DirectivityEQ component has fixed margins - const float polarVisualizersComponentLeftMargin = 33; - const float polarVisualizersComponentRightMargin = 10; + const float polarVisualizersComponentLeftMargin = directivityEqualiser.proportionOfHeight(0.13f); + const float polarVisualizersComponentRightMargin = proportionOfHeight(0.057f); juce::FlexBox polarVisualizersComponent; polarVisualizersComponent.flexDirection = FlexBox::Direction::row; @@ -478,19 +511,19 @@ void PolarDesignerAudioProcessorEditor::resized() muteSoloModule.alignContent = juce::FlexBox::AlignContent::center; muteSoloModule.items.add(juce::FlexItem().withWidth(polarVisualizersComponentLeftMargin)); - const float muteSoloComponentButtonsFlex = 0.14f; - juce::FlexBox muteSoloComponent[5]; + auto muteSoloButtonSize = area.getHeight() * 0.04f; + auto muteSoloButtonSpace = area.getHeight() * 0.025f; for (int i = 0; i < 5; i++) { muteSoloComponent[i].flexDirection = FlexBox::Direction::row; muteSoloComponent[i].justifyContent = juce::FlexBox::JustifyContent::center; muteSoloComponent[i].alignContent = juce::FlexBox::AlignContent::center; - muteSoloComponent[i].items.add(juce::FlexItem().withFlex(marginFlex)); - muteSoloComponent[i].items.add(juce::FlexItem(msbMute[i]).withFlex(muteSoloComponentButtonsFlex)); - muteSoloComponent[i].items.add(juce::FlexItem().withFlex(1.f - 2 * marginFlex - 2 * muteSoloComponentButtonsFlex)); - muteSoloComponent[i].items.add(juce::FlexItem(msbSolo[i]).withFlex(muteSoloComponentButtonsFlex)); - muteSoloComponent[i].items.add(juce::FlexItem().withFlex(marginFlex)); + muteSoloComponent[i].items.add(juce::FlexItem().withFlex(0.4f)); + muteSoloComponent[i].items.add(juce::FlexItem(tgbSolo[i]).withMinWidth(muteSoloButtonSize).withHeight(muteSoloButtonSize)); + muteSoloComponent[i].items.add(juce::FlexItem().withWidth(muteSoloButtonSpace)); + muteSoloComponent[i].items.add(juce::FlexItem(tgbMute[i]).withMinWidth(muteSoloButtonSize).withHeight(muteSoloButtonSize)); + muteSoloComponent[i].items.add(juce::FlexItem().withFlex(0.4f)); } juce::FlexBox dirSlidersComponent; @@ -503,28 +536,52 @@ void PolarDesignerAudioProcessorEditor::resized() gainBandSlidersComponent.flexDirection = FlexBox::Direction::row; gainBandSlidersComponent.justifyContent = juce::FlexBox::JustifyContent::center; gainBandSlidersComponent.alignContent = juce::FlexBox::AlignContent::center; - gainBandSlidersComponent.items.add(juce::FlexItem().withWidth(polarVisualizersComponentLeftMargin)); + + juce::FlexBox gainBandSlidersComponentWrapper; + gainBandSlidersComponentWrapper.flexDirection = FlexBox::Direction::row; + gainBandSlidersComponentWrapper.justifyContent = juce::FlexBox::JustifyContent::center; + gainBandSlidersComponentWrapper.alignContent = juce::FlexBox::AlignContent::center; + gainBandSlidersComponentWrapper.items.add(juce::FlexItem().withWidth(polarVisualizersComponentLeftMargin)); //Dynamic layout for polarVisualizers and dirSlider components - //offsetDirEQ and offsetPolVis are fixed values because DirectivityEQ component has fixed margins - const float offsetDirEQ = 42; - const float offsetPolVis = 29; + //offsetPolVis are fixed values because DirectivityEQ component has fixed margins + const float offsetPolVis = 40; - const float dirEqSize = directivityEqualiser.getWidth() - offsetDirEQ; + const float dirEqSize = directivityEqualiser.getEqWidth(); auto bandLimitWidth = getBandLimitWidthVector(dirEqSize, offsetPolVis); - //pVisflex - value used for components spacing across given area i.e 0.65 (maximum 1.0 means full space) - float pVisflex = 0; + //bandFlex - value used for components spacing across given area i.e 0.65 (maximum 1.0 means full space) + float bandFlex = 0; + float prevPolarVisFlex = 0; + float polarVisFlexSum = 0; + float prevGainSliderFlex = 0; + float gainSliderFlexSum = 0; + int polarRightMarginDiff = 31; + int gainRightMarginDiff = 15; if (nActiveBands < 2) { if (polarPatternVisualizers[0].isPvisActive()) { - pVisflex = bandLimitWidth[0] / dirEqSize; - polarVisualizersComponent.items.add(juce::FlexItem(polarPatternVisualizers[0]).withFlex(pVisflex)); - dirSlidersComponent.items.add(juce::FlexItem(slDir[0]).withFlex(pVisflex)); - muteSoloModule.items.add(juce::FlexItem(muteSoloComponent[0]).withFlex(pVisflex)); - gainBandSlidersComponent.items.add(juce::FlexItem(slBandGain[0]).withFlex(pVisflex)); + bandFlex = bandLimitWidth[0] / dirEqSize; + dirSlidersComponent.items.add(juce::FlexItem(slDir[0]).withFlex(bandFlex)); + muteSoloModule.items.add(juce::FlexItem(muteSoloComponent[0]).withFlex(bandFlex)); + + //Calculate polar visualizer position and size + auto polarVisHalfWidth = (dirEqSize * 0.135f) / 2; + float polarVisHalfWidthFlex = polarVisHalfWidth / (dirEqSize + polarRightMarginDiff); + float bandFlexRelToPolarVisComp = bandLimitWidth[0] / (dirEqSize + polarRightMarginDiff); + float polarVisFlex = bandFlexRelToPolarVisComp / 2 + polarVisHalfWidthFlex; + polarVisualizersComponent.items.add(juce::FlexItem(polarPatternVisualizers[0]).withFlex(polarVisFlex)); + polarVisualizersComponent.items.add(juce::FlexItem().withFlex(1.f - polarVisFlex)); + + //Calculate gain slider position and size + int pixe1lLine = 1.f; + auto gainSliderHalfWidth = pixe1lLine + getLookAndFeel().getSliderLayout(slBandGain[0]).sliderBounds.getWidth() / 2; + float gainSliderHalfWidthFlex = gainSliderHalfWidth / dirEqSize; + float gainSliderFlex = bandFlex / 2 + gainSliderHalfWidthFlex; + gainBandSlidersComponent.items.add(juce::FlexItem(slBandGain[0]).withFlex(gainSliderFlex)); + gainBandSlidersComponent.items.add(juce::FlexItem().withFlex(1.f - gainSliderFlex)); } } else @@ -534,192 +591,693 @@ void PolarDesignerAudioProcessorEditor::resized() if (polarPatternVisualizers[i].isPvisActive()) { //TODO: modify the function so that there is no danger of going outside the array --> i+1 - pVisflex = bandLimitWidth[i+1] / dirEqSize; - polarVisualizersComponent.items.add(juce::FlexItem(polarPatternVisualizers[i]).withFlex(pVisflex)); - dirSlidersComponent.items.add(juce::FlexItem(slDir[i]).withFlex(pVisflex)); - muteSoloModule.items.add(juce::FlexItem(muteSoloComponent[i]).withFlex(pVisflex)); - gainBandSlidersComponent.items.add(juce::FlexItem(slBandGain[i]).withFlex(pVisflex)); + bandFlex = bandLimitWidth[i+1] / dirEqSize; + dirSlidersComponent.items.add(juce::FlexItem(slDir[i]).withFlex(bandFlex)); + muteSoloModule.items.add(juce::FlexItem(muteSoloComponent[i]).withFlex(bandFlex)); + + //Calculate polar visualizers position and size + auto polarVisHalfWidth = (dirEqSize * 0.135f) / 2; + if (nActiveBands >= 4) + polarVisHalfWidth = (dirEqSize * 0.115f) / 2; + float polarVisHalfWidthFlex = polarVisHalfWidth / (dirEqSize + polarRightMarginDiff); + float bandFlexRelToPolarVisComp = bandLimitWidth[i + 1] / (dirEqSize + polarRightMarginDiff); + float polarVisFlex = bandFlexRelToPolarVisComp / 2 + prevPolarVisFlex / 2; + //Add polarVisHalfWidthFlex only on first iteration + if (i == 0) + polarVisFlex = bandFlexRelToPolarVisComp / 2 + prevPolarVisFlex / 2 + polarVisHalfWidthFlex; + polarVisualizersComponent.items.add(juce::FlexItem(polarPatternVisualizers[i]).withFlex(polarVisFlex)); + //Helpers to calculate position of next polar visualizer + polarVisFlexSum += polarVisFlex; + prevPolarVisFlex = bandFlexRelToPolarVisComp; + //Calculate of the remaining space + if (i == nActiveBands - 1) + polarVisualizersComponent.items.add(juce::FlexItem().withFlex(1 - polarVisFlexSum)); + + //Gain sliders position calculate to fit textbox when bandwidth is narrow + int pixe1lLine = 1.f; + auto gainSliderHalfWidth = getLookAndFeel().getSliderLayout(slBandGain[i]).sliderBounds.getWidth() / 2; + float gainSliderHalfWidthFlex = gainSliderHalfWidth / dirEqSize; + float gainSliderFlex = bandFlex / 2 + prevGainSliderFlex / 2; + //Add gainSliderHalfWidthFlex only on first iteration + if (i == 0) + gainSliderFlex = bandFlex / 2 + prevGainSliderFlex / 2 + pixe1lLine / dirEqSize + gainSliderHalfWidthFlex; + gainBandSlidersComponent.items.add(juce::FlexItem(slBandGain[i]).withFlex(gainSliderFlex)); + //Helpers to calculate position of next gain slider + gainSliderFlexSum += gainSliderFlex; + prevGainSliderFlex = bandFlex; + //Calculate of the remaining space + if (i == nActiveBands - 1) + gainBandSlidersComponent.items.add(juce::FlexItem().withFlex(1 - gainSliderFlexSum)); } } } - - polarVisualizersComponent.items.add(juce::FlexItem().withWidth(polarVisualizersComponentRightMargin)); + int gainRightMargin = tbTrimSliderCenterPointer.getWidth() + trimSlider.getWidth() + gainRightMarginDiff; + polarVisualizersComponent.items.add(juce::FlexItem().withWidth(gainRightMargin - polarRightMarginDiff)); dirSlidersComponent.items.add(juce::FlexItem().withWidth(polarVisualizersComponentRightMargin)); - muteSoloModule.items.add(juce::FlexItem().withWidth(polarVisualizersComponentRightMargin)); - gainBandSlidersComponent.items.add(juce::FlexItem().withWidth(polarVisualizersComponentRightMargin)); - - const float middleComponentFlex = 0.05f; + muteSoloModule.items.add(juce::FlexItem().withWidth(gainRightMargin)); + + juce::FlexBox tbTrimSliderComponent; + tbTrimSliderComponent.flexDirection = FlexBox::Direction::column; + tbTrimSliderComponent.justifyContent = juce::FlexBox::JustifyContent::center; + tbTrimSliderComponent.alignContent = juce::FlexBox::AlignContent::center; + tbTrimSliderComponent.items.add(juce::FlexItem().withFlex(0.09f)); + tbTrimSliderComponent.items.add(juce::FlexItem(trimSlider).withFlex(0.85f)); + tbTrimSliderComponent.items.add(juce::FlexItem().withFlex(0.06f)); + + juce::FlexBox tbTrimSliderCenterPointerComponent; + tbTrimSliderCenterPointerComponent.flexDirection = FlexBox::Direction::column; + tbTrimSliderCenterPointerComponent.justifyContent = juce::FlexBox::JustifyContent::center; + tbTrimSliderCenterPointerComponent.alignContent = juce::FlexBox::AlignContent::center; + tbTrimSliderCenterPointerComponent.items.add(juce::FlexItem().withFlex(0.11f)); + tbTrimSliderCenterPointerComponent.items.add(juce::FlexItem(tbTrimSliderCenterPointer).withFlex(0.85f)); + tbTrimSliderCenterPointerComponent.items.add(juce::FlexItem().withFlex(0.06f)); + + juce::FlexBox directivityEqualiserComponent; + directivityEqualiserComponent.flexDirection = FlexBox::Direction::row; + directivityEqualiserComponent.justifyContent = juce::FlexBox::JustifyContent::center; + directivityEqualiserComponent.alignContent = juce::FlexBox::AlignContent::center; + directivityEqualiserComponent.items.add(juce::FlexItem(directivityEqualiser).withFlex(0.94f)); + directivityEqualiserComponent.items.add(juce::FlexItem(tbTrimSliderCenterPointerComponent).withFlex(0.02f)); + directivityEqualiserComponent.items.add(juce::FlexItem(tbTrimSliderComponent).withFlex(0.04f)); + + gainBandSlidersComponentWrapper.items.add(juce::FlexItem(gainBandSlidersComponent).withFlex(1.f)); + gainBandSlidersComponentWrapper.items.add(juce::FlexItem().withWidth(gainRightMargin)); juce::FlexBox middleComponent; middleComponent.flexDirection = FlexBox::Direction::column; middleComponent.justifyContent = juce::FlexBox::JustifyContent::center; middleComponent.alignContent = juce::FlexBox::AlignContent::center; - middleComponent.items.add(juce::FlexItem().withFlex(marginFlex)); - middleComponent.items.add(juce::FlexItem(polarVisualizersComponent).withFlex(middleComponentFlex*4)); - middleComponent.items.add(juce::FlexItem().withFlex(marginFlex)); - middleComponent.items.add(juce::FlexItem(directivityEqualiser).withFlex(middleComponentFlex*10)); - middleComponent.items.add(juce::FlexItem().withFlex(marginFlex)); - middleComponent.items.add(juce::FlexItem(dirSlidersComponent).withFlex(middleComponentFlex)); - middleComponent.items.add(juce::FlexItem(muteSoloModule).withFlex(middleComponentFlex)); - middleComponent.items.add(juce::FlexItem(gainBandSlidersComponent).withFlex(middleComponentFlex)); - middleComponent.items.add(juce::FlexItem().withFlex(marginFlex)); - - const float trimSliderComponentFlex = 0.5f; - const float trimSliderComponentMarginOffset = 0.03f; - - juce::FlexBox trimSliderComponent; - trimSliderComponent.flexDirection = FlexBox::Direction::column; - trimSliderComponent.justifyContent = juce::FlexBox::JustifyContent::center; - trimSliderComponent.alignContent = juce::FlexBox::AlignContent::center; - trimSliderComponent.items.add(juce::FlexItem().withFlex(trimSliderComponentFlex/2 + trimSliderComponentMarginOffset)); - trimSliderComponent.items.add(juce::FlexItem(trimSlider).withFlex(trimSliderComponentFlex)); - trimSliderComponent.items.add(juce::FlexItem().withFlex(trimSliderComponentFlex/2 - trimSliderComponentMarginOffset)); - + + // With bands 4 and 5, polar visualizers need to be smaller to fit in narrow bands + if (nActiveBands >= 4) + { + middleComponent.items.add(juce::FlexItem().withFlex(0.045f)); + middleComponent.items.add(juce::FlexItem(polarVisualizersComponent).withFlex(0.15f)); + middleComponent.items.add(juce::FlexItem().withFlex(0.045f)); + middleComponent.items.add(juce::FlexItem(directivityEqualiserComponent).withFlex(0.56f)); + } + else + { + middleComponent.items.add(juce::FlexItem().withFlex(0.03f)); + middleComponent.items.add(juce::FlexItem(polarVisualizersComponent).withFlex(0.18f)); + middleComponent.items.add(juce::FlexItem().withFlex(0.03f)); + middleComponent.items.add(juce::FlexItem(directivityEqualiserComponent).withFlex(0.56f)); + } + + middleComponent.items.add(juce::FlexItem().withFlex(0.04f)); + middleComponent.items.add(juce::FlexItem(muteSoloModule).withFlex(0.07f)); + middleComponent.items.add(juce::FlexItem(gainBandSlidersComponentWrapper).withFlex(0.25f)); + middleComponent.items.add(juce::FlexItem().withFlex(0.03f)); + juce::FlexBox mainComponent; mainComponent.flexDirection = FlexBox::Direction::row; mainComponent.justifyContent = juce::FlexBox::JustifyContent::center; mainComponent.alignContent = juce::FlexBox::AlignContent::center; - mainComponent.items.add(juce::FlexItem().withFlex(marginFlex)); - mainComponent.items.add(juce::FlexItem(sideComponent).withFlex(marginFlex*15)); - mainComponent.items.add(juce::FlexItem().withFlex(marginFlex)); - mainComponent.items.add(juce::FlexItem(middleComponent).withFlex(marginFlex*75)); - mainComponent.items.add(juce::FlexItem().withFlex(marginFlex)); - mainComponent.items.add(juce::FlexItem(trimSliderComponent).withFlex(marginFlex*2)); - mainComponent.items.add(juce::FlexItem().withFlex(marginFlex)); - - fb.items.add(juce::FlexItem().withFlex(marginFlex)); - fb.items.add(juce::FlexItem(topComponent).withFlex(marginFlex*10)); - fb.items.add(juce::FlexItem().withFlex(marginFlex/2)); - fb.items.add(juce::FlexItem(topComponentLine).withFlex(marginFlex/5)); - fb.items.add(juce::FlexItem().withFlex(marginFlex)); - fb.items.add(juce::FlexItem(mainComponent).withFlex(marginFlex*75)); - fb.items.add(juce::FlexItem(footer).withFlex(marginFlex*5)); - - fb.performLayout(area); - - /* - alOverlayError.setBounds (directivityEqualiser.getX() + 120, directivityEqualiser.getY() + 50, directivityEqualiser.getWidth() - 240, directivityEqualiser.getHeight() - 100); - alOverlayDisturber.setBounds (directivityEqualiser.getX() + 120, directivityEqualiser.getY() + 50, directivityEqualiser.getWidth() - 240, directivityEqualiser.getHeight() - 100); - alOverlaySignal.setBounds (directivityEqualiser.getX() + 120, directivityEqualiser.getY() + 50, directivityEqualiser.getWidth() - 240, directivityEqualiser.getHeight() - 100); - */ + mainComponent.items.add(juce::FlexItem().withFlex(0.021f)); + if (!presetListVisible) + { + mainComponent.items.add(juce::FlexItem(sideComponent).withFlex(0.21f)); + mainComponent.items.add(juce::FlexItem().withFlex(0.027f)); + } + mainComponent.items.add(juce::FlexItem(middleComponent).withFlex(0.86f)); + mainComponent.items.add(juce::FlexItem().withFlex(0.027f)); + + subfb.items.add(juce::FlexItem().withFlex(0.03f)); + subfb.items.add(juce::FlexItem(topComponent).withFlex(0.046f)); + subfb.items.add(juce::FlexItem().withFlex(0.05f)); + subfb.items.add(juce::FlexItem(mainComponent).withFlex(0.84f)); + subfb.items.add(juce::FlexItem(footer).withFlex(0.03f)); + + if (!presetListVisible) + { + mainfb.items.add(juce::FlexItem(subfb).withFlex(1.f)); + } + else + { + mainfb.items.add(juce::FlexItem(subfb).withFlex(0.76f)); + mainfb.items.add(juce::FlexItem(/*placeholder for preset list */).withFlex(0.24f)); + } + + mainfb.performLayout(area); + + // Number of bands Group + juce::FlexBox fbNrBandsOutComp; + fbNrBandsOutComp.items.add(juce::FlexItem{ grpBands }.withFlex(1.0f)); + fbNrBandsOutComp.performLayout(sideComponent.items[0].currentBounds); + + juce::FlexBox fbNrBandsInComp; + fbNrBandsInComp.flexDirection = juce::FlexBox::Direction::column; + fbNrBandsInComp.justifyContent = juce::FlexBox::JustifyContent::center; + fbNrBandsInComp.alignContent = juce::FlexBox::AlignContent::center; + fbNrBandsInComp.items.add(juce::FlexItem{ }.withFlex(0.45f)); + fbNrBandsInComp.items.add(juce::FlexItem{ tmbNrBandsButton }.withFlex(0.4f)); + fbNrBandsInComp.items.add(juce::FlexItem{ }.withFlex(0.15f)); + + auto outerBounds = fbNrBandsOutComp.items[0].currentBounds; + auto inCompWidth = outerBounds.getWidth(); + fbNrBandsInComp.performLayout(outerBounds.reduced(inCompWidth * 0.06f, 0)); + + // Equalization control Group + juce::FlexBox fbEqCtrOutComp; + fbEqCtrOutComp.items.add(juce::FlexItem{ grpEq }.withFlex(1.0f)); + fbEqCtrOutComp.performLayout(sideComponent.items[2].currentBounds); + + juce::FlexBox fbFields; + fbFields.flexDirection = juce::FlexBox::Direction::row; + fbFields.justifyContent = juce::FlexBox::JustifyContent::center; + fbFields.alignContent = juce::FlexBox::AlignContent::center; + fbFields.items.add(juce::FlexItem{ }.withFlex(0.08f)); + fbFields.items.add(juce::FlexItem{ ibEqCtr[0] }.withFlex(0.4f)); + fbFields.items.add(juce::FlexItem{ }.withFlex(0.04f)); + fbFields.items.add(juce::FlexItem{ ibEqCtr[1] }.withFlex(0.4f)); + fbFields.items.add(juce::FlexItem{ }.withFlex(0.08f)); + + juce::FlexBox fbEqCtrInComp; + fbEqCtrInComp.flexDirection = juce::FlexBox::Direction::column; + fbEqCtrInComp.justifyContent = juce::FlexBox::JustifyContent::center; + fbEqCtrInComp.alignContent = juce::FlexBox::AlignContent::center; + fbEqCtrInComp.items.add(juce::FlexItem{ }.withFlex(0.3f)); + fbEqCtrInComp.items.add(juce::FlexItem{ fbFields }.withFlex(0.58f)); + fbEqCtrInComp.items.add(juce::FlexItem{ }.withFlex(0.12f)); + + outerBounds = fbEqCtrOutComp.items[0].currentBounds; + inCompWidth = outerBounds.getWidth(); + fbEqCtrInComp.performLayout(outerBounds); + + // Proximity control Group + juce::FlexBox fbProximityControlOutComp; + fbProximityControlOutComp.items.add(juce::FlexItem{ grpProxComp }.withFlex(1.0f)); + fbProximityControlOutComp.performLayout(sideComponent.items[4].currentBounds); + + juce::FlexBox fbProximityControlToggleButton; + fbProximityControlToggleButton.flexDirection = juce::FlexBox::Direction::row; + fbProximityControlToggleButton.justifyContent = juce::FlexBox::JustifyContent::center; + fbProximityControlToggleButton.alignContent = juce::FlexBox::AlignContent::center; + fbProximityControlToggleButton.items.add(juce::FlexItem{ }.withFlex(0.75f)); + fbProximityControlToggleButton.items.add(juce::FlexItem{ tgbProxCtr }.withFlex(0.25f)); + + juce::FlexBox fbProximityControlInComp; + fbProximityControlInComp.flexDirection = juce::FlexBox::Direction::column; + fbProximityControlInComp.justifyContent = juce::FlexBox::JustifyContent::center; + fbProximityControlInComp.alignContent = juce::FlexBox::AlignContent::center; + fbProximityControlInComp.items.add(juce::FlexItem{ fbProximityControlToggleButton }.withFlex(0.5f)); + fbProximityControlInComp.items.add(juce::FlexItem{ slProximity }.withFlex(0.45f)); + fbProximityControlInComp.items.add(juce::FlexItem{ }.withFlex(0.05f)); + + outerBounds = fbProximityControlOutComp.items[0].currentBounds; + inCompWidth = outerBounds.getWidth(); + fbProximityControlInComp.performLayout(outerBounds); + + // Terminator control Group + juce::FlexBox fbTerminatorControlOutComp; + fbTerminatorControlOutComp.items.add(juce::FlexItem{ grpTerminatorControl }.withFlex(1.0f)); + fbTerminatorControlOutComp.performLayout(sideComponent.items[6].currentBounds); + + juce::FlexBox fbTerminatorControlInComp; + fbTerminatorControlInComp.flexDirection = juce::FlexBox::Direction::column; + fbTerminatorControlInComp.justifyContent = juce::FlexBox::JustifyContent::center; + fbTerminatorControlInComp.alignContent = juce::FlexBox::AlignContent::center; + + juce::FlexBox fbTerminatorControlCloseComp; + fbTerminatorControlCloseComp.flexDirection = juce::FlexBox::Direction::row; + fbTerminatorControlCloseComp.justifyContent = juce::FlexBox::JustifyContent::center; + fbTerminatorControlCloseComp.alignContent = juce::FlexBox::AlignContent::center; + fbTerminatorControlCloseComp.items.add(juce::FlexItem{ }.withFlex(0.88f)); + fbTerminatorControlCloseComp.items.add(juce::FlexItem{ tbCloseTerminatorControl }.withFlex(0.12f)); + + //Terminator control max-to-spill flow sub flexboxes + juce::FlexBox fbTermLbSpill; + fbTermLbSpill.flexDirection = juce::FlexBox::Direction::row; + fbTermLbSpill.items.add(juce::FlexItem{ terminatorLabelNr1 }.withFlex(0.08f)); + fbTermLbSpill.items.add(juce::FlexItem{ }.withFlex(0.04f)); + fbTermLbSpill.items.add(juce::FlexItem{ terminatorLabelSpillMain }.withFlex(0.88f)); + + juce::FlexBox fbTermLbSpillDesc; + fbTermLbSpillDesc.flexDirection = juce::FlexBox::Direction::row; + fbTermLbSpillDesc.items.add(juce::FlexItem{ terminatorStageLine[0] }.withFlex(0.08f)); + fbTermLbSpillDesc.items.add(juce::FlexItem{ }.withFlex(0.04f)); + fbTermLbSpillDesc.items.add(juce::FlexItem{ terminatorLabelSpillSub }.withFlex(0.88f)); + + juce::FlexBox fbTermLbSpillBegin; + fbTermLbSpillBegin.flexDirection = juce::FlexBox::Direction::row; + fbTermLbSpillBegin.items.add(juce::FlexItem{ terminatorStageLine[1] }.withFlex(0.08f)); + fbTermLbSpillBegin.items.add(juce::FlexItem{ }.withFlex(0.04f)); + fbTermLbSpillBegin.items.add(juce::FlexItem{ tbBeginTerminate }.withFlex(0.88f)); + + juce::FlexBox fbTermLbMax; + fbTermLbMax.flexDirection = juce::FlexBox::Direction::row; + fbTermLbMax.items.add(juce::FlexItem{ terminatorLabelNr2 }.withFlex(0.08f)); + fbTermLbMax.items.add(juce::FlexItem{ }.withFlex(0.04f)); + fbTermLbMax.items.add(juce::FlexItem{ terminatorLabelMaxMain }.withFlex(0.88f)); + + juce::FlexBox fbTermLbMaxDesc; + fbTermLbMaxDesc.flexDirection = juce::FlexBox::Direction::row; + fbTermLbMaxDesc.items.add(juce::FlexItem{ terminatorStageLine[2] }.withFlex(0.08f)); + fbTermLbMaxDesc.items.add(juce::FlexItem{ }.withFlex(0.04f)); + fbTermLbMaxDesc.items.add(juce::FlexItem{ terminatorLabelMaxSub }.withFlex(0.88f)); + + juce::FlexBox fbTermLbMaxBegin; + fbTermLbMaxBegin.flexDirection = juce::FlexBox::Direction::row; + fbTermLbMaxBegin.items.add(juce::FlexItem{ terminatorStageLine[3] }.withFlex(0.08f)); + fbTermLbMaxBegin.items.add(juce::FlexItem{ }.withFlex(0.04f)); + fbTermLbMaxBegin.items.add(juce::FlexItem{ tbBeginMaximize }.withFlex(0.88f)); + + juce::FlexBox fbTermLbMaxToSpill; + fbTermLbMaxToSpill.flexDirection = juce::FlexBox::Direction::row; + fbTermLbMaxToSpill.items.add(juce::FlexItem{ terminatorLabelNr3 }.withFlex(0.08f)); + fbTermLbMaxToSpill.items.add(juce::FlexItem{ }.withFlex(0.04f)); + fbTermLbMaxToSpill.items.add(juce::FlexItem{ terminatorLabelMaxToSpillMain }.withFlex(0.88f)); + + juce::FlexBox fbTermLbMaxToSpillDesc; + fbTermLbMaxToSpillDesc.flexDirection = juce::FlexBox::Direction::row; + fbTermLbMaxToSpillDesc.items.add(juce::FlexItem{ }.withFlex(0.08f)); + fbTermLbMaxToSpillDesc.items.add(juce::FlexItem{ }.withFlex(0.04f)); + fbTermLbMaxToSpillDesc.items.add(juce::FlexItem{ terminatorLabelMaxToSpillSub }.withFlex(0.88f)); + + juce::FlexBox fbTermLbMaxToSpillApply; + fbTermLbMaxToSpillApply.flexDirection = juce::FlexBox::Direction::row; + fbTermLbMaxToSpillApply.items.add(juce::FlexItem{ }.withFlex(0.08f)); + fbTermLbMaxToSpillApply.items.add(juce::FlexItem{ }.withFlex(0.04f)); + fbTermLbMaxToSpillApply.items.add(juce::FlexItem{ tbApplyMaxTargetToSpill }.withFlex(0.88f)); + + juce::FlexBox fbEmptyLine1; + fbEmptyLine1.flexDirection = juce::FlexBox::Direction::row; + fbEmptyLine1.items.add(juce::FlexItem{ terminatorStageLine[4] }.withFlex(0.08f)); + fbEmptyLine1.items.add(juce::FlexItem{ }.withFlex(0.92f)); + + juce::FlexBox fbEmptyLine2; + fbEmptyLine2.flexDirection = juce::FlexBox::Direction::row; + fbEmptyLine2.items.add(juce::FlexItem{ terminatorStageLine[5] }.withFlex(0.08f)); + fbEmptyLine2.items.add(juce::FlexItem{ }.withFlex(0.92f)); + + juce::FlexBox fbEmptyLine3; + fbEmptyLine3.flexDirection = juce::FlexBox::Direction::row; + fbEmptyLine3.items.add(juce::FlexItem{ terminatorStageLine[6] }.withFlex(0.08f)); + fbEmptyLine3.items.add(juce::FlexItem{ }.withFlex(0.92f)); + + juce::FlexBox fbEmptyLine4; + fbEmptyLine4.flexDirection = juce::FlexBox::Direction::row; + fbEmptyLine4.items.add(juce::FlexItem{ terminatorStageLine[7] }.withFlex(0.08f)); + fbEmptyLine4.items.add(juce::FlexItem{ }.withFlex(0.92f)); + + if (showTerminatorAnimationWindow) + { + tbCloseTerminatorControl.setVisible(true); + tbCloseTerminatorControl.setVisible(true); + albPlaybackSpill.setVisible(!isTargetAquiring); + albAcquiringTarget.setVisible(isTargetAquiring); + processor.termControlWaveform.setVisible(true); + tbTerminateSpill.setVisible(false); + tbMaximizeTarget.setVisible(false); + tbMaxTargetToSpill.setVisible(false); + + fbTerminatorControlInComp.items.add(juce::FlexItem{ }.withHeight(10)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ fbTerminatorControlCloseComp }.withFlex(0.12f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ }.withFlex(0.06f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ isTargetAquiring ? albAcquiringTarget : albPlaybackSpill }.withFlex(0.22f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ processor.termControlWaveform }.withFlex(0.46f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ }.withFlex(0.06f)); + } + else + { + if (showMaxToSpillWindow) + { + tbCloseTerminatorControl.setVisible(true); + tbTerminateSpill.setVisible(false); + tbMaximizeTarget.setVisible(false); + tbMaxTargetToSpill.setVisible(false); + albPlaybackSpill.setVisible(false); + albAcquiringTarget.setVisible(false); + processor.termControlWaveform.setVisible(false); + + switch (termStage) + { + case terminatorStage::DISABLED: + break; + case terminatorStage::TERMINATE: + fbTerminatorControlInComp.items.add(juce::FlexItem{ }.withHeight(10)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ fbTerminatorControlCloseComp }.withFlex(0.12f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ }.withFlex(0.02f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ fbTermLbSpill }.withFlex(0.1f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ fbEmptyLine1 }.withFlex(0.01f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ fbTermLbSpillDesc }.withFlex(0.14f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ fbEmptyLine2 }.withFlex(0.01f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ fbTermLbSpillBegin }.withFlex(0.16f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ fbEmptyLine3 }.withFlex(0.06f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ fbTermLbMax }.withFlex(0.1f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ fbEmptyLine4 }.withFlex(0.02f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ fbTermLbMaxToSpill }.withFlex(0.1f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ }.withFlex(0.06f)); + break; + case terminatorStage::MAXIMIZE: + fbTerminatorControlInComp.items.add(juce::FlexItem{ }.withHeight(10)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ fbTerminatorControlCloseComp }.withFlex(0.12f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ }.withFlex(0.02f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ fbTermLbSpill }.withFlex(0.1f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ fbEmptyLine1 }.withFlex(0.02f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ fbTermLbMax }.withFlex(0.1f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ fbEmptyLine2 }.withFlex(0.01f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ fbTermLbMaxDesc }.withFlex(0.14f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ fbEmptyLine3 }.withFlex(0.01f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ fbTermLbMaxBegin }.withFlex(0.16f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ fbEmptyLine4 }.withFlex(0.06f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ fbTermLbMaxToSpill }.withFlex(0.1f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ }.withFlex(0.06f)); + break; + case terminatorStage::MAXTOSPILL: + fbTerminatorControlInComp.items.add(juce::FlexItem{ }.withHeight(10)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ fbTerminatorControlCloseComp }.withFlex(0.12f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ }.withFlex(0.02f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ fbTermLbSpill }.withFlex(0.1f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ fbEmptyLine1 }.withFlex(0.02f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ fbTermLbMax }.withFlex(0.1f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ fbEmptyLine2 }.withFlex(0.02f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ fbTermLbMaxToSpill }.withFlex(0.1f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ }.withFlex(0.01f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ fbTermLbMaxToSpillDesc }.withFlex(0.14f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ }.withFlex(0.01f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ fbTermLbMaxToSpillApply }.withFlex(0.16f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ }.withFlex(0.06f)); + break; + default: + break; + } + } + else + { + tbCloseTerminatorControl.setVisible(false); + albPlaybackSpill.setVisible(false); + albAcquiringTarget.setVisible(false); + processor.termControlWaveform.setVisible(false); + tbTerminateSpill.setVisible(true); + tbMaximizeTarget.setVisible(true); + tbMaxTargetToSpill.setVisible(true); + + fbTerminatorControlInComp.items.add(juce::FlexItem{ }.withFlex(0.25f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ tbTerminateSpill }.withFlex(0.22f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ }.withFlex(0.01f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ tbMaximizeTarget }.withFlex(0.22f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ }.withFlex(0.01f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ tbMaxTargetToSpill }.withFlex(0.22f)); + fbTerminatorControlInComp.items.add(juce::FlexItem{ }.withFlex(0.06f)); + } + } + + outerBounds = fbTerminatorControlOutComp.items[0].currentBounds; + inCompWidth = outerBounds.getWidth(); + fbTerminatorControlInComp.performLayout(outerBounds.reduced(inCompWidth * 0.06f, 0)); + + // Sync channel Group + juce::FlexBox fbSyncChannelOutComp; + fbSyncChannelOutComp.items.add(juce::FlexItem{ grpSync }.withFlex(1.0f)); + fbSyncChannelOutComp.performLayout(sideComponent.items[8].currentBounds); + + juce::FlexBox fbSyncChannelInComp; + fbSyncChannelInComp.flexDirection = juce::FlexBox::Direction::column; + fbSyncChannelInComp.justifyContent = juce::FlexBox::JustifyContent::center; + fbSyncChannelInComp.alignContent = juce::FlexBox::AlignContent::center; + fbSyncChannelInComp.items.add(juce::FlexItem{ }.withFlex(0.45f)); + fbSyncChannelInComp.items.add(juce::FlexItem{ tmbSyncChannelButton }.withFlex(0.4f)); + fbSyncChannelInComp.items.add(juce::FlexItem{ }.withFlex(0.15f)); + + outerBounds = fbSyncChannelOutComp.items[0].currentBounds; + inCompWidth = outerBounds.getWidth(); + fbSyncChannelInComp.performLayout(outerBounds.reduced(inCompWidth * 0.06f, 0)); + + // Preset List Group + juce::FlexBox fbPresetListOutComp; + fbPresetListOutComp.items.add(juce::FlexItem{ grpPresetList }.withFlex(1.0f)); + fbPresetListOutComp.performLayout(mainfb.items[1].currentBounds); + + juce::FlexBox fbPresetListSub1InComp; + fbPresetListSub1InComp.flexDirection = juce::FlexBox::Direction::row; + fbPresetListSub1InComp.justifyContent = juce::FlexBox::JustifyContent::center; + fbPresetListSub1InComp.items.add(juce::FlexItem{ }.withFlex(0.9f)); + fbPresetListSub1InComp.items.add(juce::FlexItem{ tbClosePresetList }.withFlex(0.1f)); + + juce::FlexBox fbPresetListInComp; + fbPresetListInComp.flexDirection = juce::FlexBox::Direction::column; + fbPresetListInComp.justifyContent = juce::FlexBox::JustifyContent::center; + fbPresetListInComp.alignContent = juce::FlexBox::AlignContent::center; + fbPresetListInComp.items.add(juce::FlexItem{ }.withFlex(0.04f)); + fbPresetListInComp.items.add(juce::FlexItem{ fbPresetListSub1InComp }.withFlex(0.03f)); + fbPresetListInComp.items.add(juce::FlexItem{ }.withFlex(0.02f)); + fbPresetListInComp.items.add(juce::FlexItem{ tbOpenFromFile }.withFlex(0.04f)); + fbPresetListInComp.items.add(juce::FlexItem{ }.withFlex(0.01f)); + fbPresetListInComp.items.add(juce::FlexItem{ lbUserPresets }.withFlex(0.41f)); + fbPresetListInComp.items.add(juce::FlexItem{ }.withFlex(0.01f)); + fbPresetListInComp.items.add(juce::FlexItem{ lbFactoryPresets }.withFlex(0.41f)); + fbPresetListInComp.items.add(juce::FlexItem{ }.withFlex(0.03f)); + + outerBounds = fbPresetListOutComp.items[0].currentBounds; + inCompWidth = outerBounds.getWidth(); + fbPresetListInComp.performLayout(outerBounds.reduced(inCompWidth * 0.06f, 0)); + + presetArea = mainfb.items[1].currentBounds; } void PolarDesignerAudioProcessorEditor::buttonStateChanged(Button* button) { - // std::cout << "button:::" << button; - } void PolarDesignerAudioProcessorEditor::buttonClicked (Button* button) { - if ((button == &tbSetNrBands[0]) && (button->getToggleState() > 0.5f)) + if (presetListVisible) + { + if (lbUserPresets.isRowDoubleClicked() || lbFactoryPresets.isRowDoubleClicked()) + { + showPresetList(false); + } + } + if ((button == &tmbNrBandsButton[0]) && (button->getToggleState() > 0.5f)) { valueTreeState.getParameter("nrBands")->setValueNotifyingHost(valueTreeState.getParameter("nrBands")->convertTo0to1((0))); } - if ((button == &tbSetNrBands[1]) && (button->getToggleState() > 0.5f)) + if ((button == &tmbNrBandsButton[1]) && (button->getToggleState() > 0.5f)) { valueTreeState.getParameter("nrBands")->setValueNotifyingHost(valueTreeState.getParameter("nrBands")->convertTo0to1((1))); } - if ((button == &tbSetNrBands[2]) && (button->getToggleState() > 0.5f)) + if ((button == &tmbNrBandsButton[2]) && (button->getToggleState() > 0.5f)) { valueTreeState.getParameter("nrBands")->setValueNotifyingHost(valueTreeState.getParameter("nrBands")->convertTo0to1((2))); } - if ((button == &tbSetNrBands[3]) && (button->getToggleState() > 0.5f)) + if ((button == &tmbNrBandsButton[3]) && (button->getToggleState() > 0.5f)) { valueTreeState.getParameter("nrBands")->setValueNotifyingHost(valueTreeState.getParameter("nrBands")->convertTo0to1((3))); } - if ((button == &tbSetNrBands[4]) && (button->getToggleState() > 0.5f)) + if ((button == &tmbNrBandsButton[4]) && (button->getToggleState() > 0.5f)) { valueTreeState.getParameter("nrBands")->setValueNotifyingHost(valueTreeState.getParameter("nrBands")->convertTo0to1((4))); } - if ((button == &tbSyncChannel[0]) && (button->getToggleState() > 0.5f)) + if ((button == &tmbSyncChannelButton[0]) && (button->getToggleState() > 0.5f)) { + tmbSyncChannelButton.disableAllButtonsApartOf(0); valueTreeState.getParameter("syncChannel")->setValueNotifyingHost(valueTreeState.getParameter("syncChannel")->convertTo0to1((1))); } - if ((button == &tbSyncChannel[1]) && (button->getToggleState() > 0.5f)) + if ((button == &tmbSyncChannelButton[1]) && (button->getToggleState() > 0.5f)) { + tmbSyncChannelButton.disableAllButtonsApartOf(1); valueTreeState.getParameter("syncChannel")->setValueNotifyingHost(valueTreeState.getParameter("syncChannel")->convertTo0to1((2))); } - if ((button == &tbSyncChannel[2]) && (button->getToggleState() > 0.5f)) + if ((button == &tmbSyncChannelButton[2]) && (button->getToggleState() > 0.5f)) { + tmbSyncChannelButton.disableAllButtonsApartOf(2); valueTreeState.getParameter("syncChannel")->setValueNotifyingHost(valueTreeState.getParameter("syncChannel")->convertTo0to1((3))); } - if ((button == &tbSyncChannel[3]) && (button->getToggleState() > 0.5f)) + if ((button == &tmbSyncChannelButton[3]) && (button->getToggleState() > 0.5f)) { + tmbSyncChannelButton.disableAllButtonsApartOf(3); valueTreeState.getParameter("syncChannel")->setValueNotifyingHost(valueTreeState.getParameter("syncChannel")->convertTo0to1((4))); } - if ((button == &tbSyncChannel[4]) && (button->getToggleState() > 0.5f)) + + if (button == &tbLoad) { - valueTreeState.getParameter("syncChannel")->setValueNotifyingHost(valueTreeState.getParameter("syncChannel")->convertTo0to1((5))); + if (!presetListVisible) + { + showPresetList(!button->getToggleState()); + } } - - - if (button == &tbLoadFile) + else if (button == &tbOpenFromFile) { loadFile(); } - else if (button == &tbSaveFile) + else if (button == &tbClosePresetList) + { + showPresetList(false); + processor.undoManager.undo(); + } + else if (button == &tbSave) { saveFile(); } - else if (button == &tbEq[0]) + else if (button == &ibEqCtr[0]) + { + ibEqCtr[0].setToggleState(!ibEqCtr[0].getToggleState(), NotificationType::dontSendNotification); + ibEqCtr[1].setToggleState(false, juce::NotificationType::dontSendNotification); + + if (!ibEqCtr[0].getToggleState() && !ibEqCtr[1].getToggleState()) + processor.setEqState(0); + else + processor.setEqState(1); + } + else if (button == &ibEqCtr[1]) + { + ibEqCtr[1].setToggleState(!ibEqCtr[1].getToggleState(), NotificationType::dontSendNotification); + ibEqCtr[0].setToggleState(false, juce::NotificationType::dontSendNotification); + + if(!ibEqCtr[0].getToggleState() && !ibEqCtr[1].getToggleState()) + processor.setEqState(0); + else + processor.setEqState(2); + } + else if (button == &tbTerminateSpill) + { + showTerminatorAnimationWindow = true; + showMaxToSpillWindow = false; + maximizeTarget = false; + showActiveTerminatorStage(terminatorStage::DISABLED); + albPlaybackSpill.startAnimation("PLAYBACK SPILL "); + resized(); + } + else if (button == &tbCloseTerminatorControl) + { + showTerminatorAnimationWindow = false; + showMaxToSpillWindow = false; + maximizeTarget = false; + maxTargetToSpillFlowStarted = false; + showActiveTerminatorStage(terminatorStage::DISABLED); + setMainAreaEnabled(true); + setSideAreaEnabled(true); + resized(); + } + else if (button == &tbMaximizeTarget) { - processor.setEqState(0); + showTerminatorAnimationWindow = true; + showMaxToSpillWindow = false; + maximizeTarget = true; + showActiveTerminatorStage(terminatorStage::DISABLED); + albPlaybackSpill.startAnimation("PLAYBACK SOURCE "); + resized(); } - else if (button == &tbEq[1]) + else if (button == &tbMaxTargetToSpill) { - processor.setEqState(1); + showTerminatorAnimationWindow = false; + showMaxToSpillWindow = true; + maxTargetToSpillFlowStarted = true; + termStage = terminatorStage::TERMINATE; + showActiveTerminatorStage(termStage); + resized(); } - else if (button == &tbEq[2]) + else if (button == &tbBeginTerminate) { - processor.setEqState(2); + showMaxToSpillWindow = false; + showTerminatorAnimationWindow = true; + termStage = terminatorStage::MAXIMIZE; + showMaxToSpillWindow = false; + showActiveTerminatorStage(terminatorStage::DISABLED); + albPlaybackSpill.startAnimation("PLAYBACK SPILL "); + resized(); } - else if (button == &tbRecordDisturber) + else if (button == &tbBeginMaximize) { - processor.startTracking(true); - alOverlayDisturber.enableRatioButton(processor.getSignalRecorded()); - alOverlayDisturber.setVisible(true); - disableMainArea(); - setSideAreaEnabled(false); + showMaxToSpillWindow = false; + termStage = terminatorStage::MAXTOSPILL; + showActiveTerminatorStage(terminatorStage::MAXIMIZE); + tbMaximizeTarget.triggerClick(); + resized(); } - else if (button == &tbRecordSignal) + else if (button == &tbApplyMaxTargetToSpill) { - processor.startTracking(false); - alOverlaySignal.enableRatioButton(processor.getDisturberRecorded()); - alOverlaySignal.setVisible(true); - disableMainArea(); - setSideAreaEnabled(false); + //TODO + showTerminatorAnimationWindow = false; + showMaxToSpillWindow = false; + maxTargetToSpillFlowStarted = false; + isTargetAquiring = false; + setSideAreaEnabled(true); + setMainAreaEnabled(true); + processor.stopTracking(2); + termStage = terminatorStage::DISABLED; + showActiveTerminatorStage(termStage); + resized(); } else if (button == &tbAllowBackwardsPattern) { return; } + else if (button == &tgbProxCtr) + { + slProximity.setEnabled(tgbProxCtr.getToggleState()); + } else if (button == &tbZeroDelay) { bool isToggled = button->getToggleState(); + button->setToggleState(!isToggled, NotificationType::dontSendNotification); } - else if (button == &tbAbButton[0]) + else if (button == &tmbABButton[0]) { bool isToggled = button->getToggleState(); if (isToggled < 0.5f) { - processor.setAbLayer(0); + processor.setAbLayer(1); button->setAlpha(getABButtonAlphaFromLayerState(isToggled)); - tbAbButton[1].setAlpha(getABButtonAlphaFromLayerState(!isToggled)); + tmbABButton[1].setAlpha(getABButtonAlphaFromLayerState(!isToggled)); } } - else if (button == &tbAbButton[1]) + else if (button == &tmbABButton[1]) { bool isToggled = button->getToggleState(); if (isToggled < 0.5f) { - processor.setAbLayer(1); + processor.setAbLayer(0); button->setAlpha(getABButtonAlphaFromLayerState(isToggled)); - tbAbButton[0].setAlpha(getABButtonAlphaFromLayerState(!isToggled)); + tmbABButton[0].setAlpha(getABButtonAlphaFromLayerState(!isToggled)); } } + else if (button == &polarPatternVisualizers[0]) + { + bool isToggled = button->getToggleState(); + setBandEnabled(0, isToggled); + button->setToggleState(!isToggled, NotificationType::dontSendNotification); + repaint(); + } + else if (button == &polarPatternVisualizers[1]) + { + bool isToggled = button->getToggleState(); + setBandEnabled(1, isToggled); + button->setToggleState(!isToggled, NotificationType::dontSendNotification); + repaint(); + } + else if (button == &polarPatternVisualizers[2]) + { + bool isToggled = button->getToggleState(); + setBandEnabled(2, isToggled); + button->setToggleState(!isToggled, NotificationType::dontSendNotification); + repaint(); + } + else if (button == &polarPatternVisualizers[3]) + { + bool isToggled = button->getToggleState(); + setBandEnabled(3, isToggled); + button->setToggleState(!isToggled, NotificationType::dontSendNotification); + repaint(); + } + else if (button == &polarPatternVisualizers[4]) + { + bool isToggled = button->getToggleState(); + setBandEnabled(4, isToggled); + button->setToggleState(!isToggled, NotificationType::dontSendNotification); + repaint(); + } + else if (button == &titlePresetUndoButton) + { + processor.undoManager.undo(); + titlePresetUndoButton.setVisible(false); + presetLoaded = false; + titlePreset.setTitle(String("Preset")); + resized(); + } else // muteSoloButton! { directivityEqualiser.setSoloActive(getSoloActive()); @@ -730,6 +1288,7 @@ void PolarDesignerAudioProcessorEditor::buttonClicked (Button* button) vis.repaint(); } } + notifyPresetLabelChange(); } float PolarDesignerAudioProcessorEditor::getABButtonAlphaFromLayerState(int layerState) @@ -744,7 +1303,7 @@ std::vector PolarDesignerAudioProcessorEditor::getBandLimitWidthVector(fl bandLimit.push_back(0); for (int i = 0; i < nActiveBands - 1; i++) { - bandLimit.push_back(directivityEqualiser.getBandlimitPathComponent(i).getX() - offsetPolVis); + bandLimit.push_back(directivityEqualiser.getBandWidth(i)); } bandLimit.push_back(dirEqSize); //Next calculate width of each band @@ -762,7 +1321,7 @@ std::vector PolarDesignerAudioProcessorEditor::getBandLimitWidthVector(fl bool PolarDesignerAudioProcessorEditor::getSoloActive() { bool active = false; - for (auto& but : msbSolo) + for (auto& but : tgbSolo) { if (but.getToggleState()) { @@ -773,55 +1332,28 @@ bool PolarDesignerAudioProcessorEditor::getSoloActive() return active; } -void PolarDesignerAudioProcessorEditor::comboBoxChanged (ComboBox* cb) -{ - if (cb == &cbSetNrBands) - { - nActiveBands = cb->getSelectedId(); - for (int i = 0; i < 5; i++) - { - if (i < nActiveBands) - { - polarPatternVisualizers[i].setActive(true); - slDir[i].setVisible(true); - msbMute[i].setVisible(true); - msbSolo[i].setVisible(true); - slBandGain[i].setVisible(true); - } - else - { - polarPatternVisualizers[i].setActive(false); - slDir[i].setVisible(false); - msbMute[i].setVisible(false); - msbSolo[i].setVisible(false); - slBandGain[i].setVisible(false); - } - } - resized(); - } -} - void PolarDesignerAudioProcessorEditor::sliderValueChanged(Slider* slider) { if (slider == &trimSlider) { return; } else - if (slider == &slCrossoverPosition[0] || slider == &slCrossoverPosition[1] || slider == &slCrossoverPosition[2] || slider == &slCrossoverPosition[3]) - { - // xOverSlider - return; - } - else + if (slider == &slCrossoverPosition[0] || slider == &slCrossoverPosition[1] || slider == &slCrossoverPosition[2] || slider == &slCrossoverPosition[3]) + { + // xOverSlider + return; + } + else + { + // dirSlider + for (int i = 0; i < 5; i++) { - // dirSlider - for (int i = 0; i < 5; i++) - { - if (slider == &slDir[i]) - polarPatternVisualizers[i].setDirWeight(slider->getValue()); - } + if (slider == &slDir[i]) + polarPatternVisualizers[i].setDirWeight(slider->getValue()); } + } directivityEqualiser.repaint(); + notifyPresetLabelChange(); } void PolarDesignerAudioProcessorEditor::loadFile() @@ -837,10 +1369,7 @@ void PolarDesignerAudioProcessorEditor::loadFile() Result result = processor.loadPreset (presetFile); if (!result.wasOk()) { errorMessage = result.getErrorMessage(); - alOverlayError.setTitle("preset load error!"); - alOverlayError.setMessage(errorMessage); - alOverlayError.setVisible(true); - disableMainArea(); + setMainAreaEnabled(false); setSideAreaEnabled(false); } else @@ -863,69 +1392,78 @@ void PolarDesignerAudioProcessorEditor::saveFile() Result result = processor.savePreset (presetFile); if (!result.wasOk()) { errorMessage = result.getErrorMessage(); - alOverlayError.setTitle("preset save error!"); - alOverlayError.setMessage(errorMessage); - alOverlayError.setVisible(true); - disableMainArea(); + setMainAreaEnabled(false); setSideAreaEnabled(false); } + else + { + lbUserPresets.AddNewPresetToList(presetFile.getFileNameWithoutExtension()); + } + } +} + +void PolarDesignerAudioProcessorEditor::loadSavedPresetsToList() +{ + File presetDir(processor.getLastDir().exists() ? processor.getLastDir() : File::getSpecialLocation(File::userHomeDirectory)); + auto presetsArray = presetDir.findChildFiles(File::findFiles, false, "*.json"); + + String jsonString; + for (File preset : presetsArray) + { + jsonString = preset.loadFileAsString(); + + if (jsonString.contains("Austrian Audio PolarDesigner")) + { + if (jsonString.contains("Factory Preset")) + { + lbFactoryPresets.AddNewPresetToList(preset.getFileNameWithoutExtension()); + } + else + { + lbUserPresets.AddNewPresetToList(preset.getFileNameWithoutExtension()); + } + } } } void PolarDesignerAudioProcessorEditor::nActiveBandsChanged() { nActiveBands = processor.getNBands(); + // Set nrbands button state when preset load + tmbNrBandsButton[nActiveBands-1].setToggleState(1, NotificationType::dontSendNotification); + for (int i = 0; i < 5; i++) { if (i < nActiveBands) { - slDir[i].setEnabled(true); - slBandGain[i].setEnabled(true); - msbSolo[i].setEnabled(true); - msbMute[i].setEnabled(true); + setBandEnabled(i, true); polarPatternVisualizers[i].setActive(true); - polarPatternVisualizers[i].setVisible(true); - + polarPatternVisualizers[i].setToggleState(false, NotificationType::dontSendNotification); + slDir[i].setVisible(true); slBandGain[i].setVisible(true); - msbSolo[i].setVisible(true); - msbMute[i].setVisible(true); - + tgbSolo[i].setVisible(true); + tgbMute[i].setVisible(true); } else { - slDir[i].setEnabled(false); - slBandGain[i].setEnabled(false); - msbSolo[i].setEnabled(false); - msbSolo[i].setToggleState(false, NotificationType::sendNotification); - msbMute[i].setEnabled(false); - msbMute[i].setToggleState(false, NotificationType::sendNotification); + setBandEnabled(i, false); + tgbSolo[i].setToggleState(false, NotificationType::sendNotification); + tgbMute[i].setToggleState(false, NotificationType::sendNotification); polarPatternVisualizers[i].setActive(false); polarPatternVisualizers[i].setVisible(false); + polarPatternVisualizers[i].setToggleState(false, NotificationType::dontSendNotification); slDir[i].setVisible(false); slBandGain[i].setVisible(false); - msbSolo[i].setVisible(false); - msbMute[i].setVisible(false); - - - } - // sync Channel - if (i <= nActiveBands) { - tbSyncChannel[i].setEnabled(true); - } - else { - tbSyncChannel[i].setEnabled(false); - + tgbSolo[i].setVisible(false); + tgbMute[i].setVisible(false); } } - - tbSyncChannel[0].setToggleState(true, NotificationType::sendNotification); - + maxIt = 0; directivityEqualiser.resetTooltipTexts(); directivityEqualiser.repaint(); - } void PolarDesignerAudioProcessorEditor::timerCallback() @@ -935,9 +1473,9 @@ void PolarDesignerAudioProcessorEditor::timerCallback() processor.repaintDEQ = false; directivityEqualiser.repaint(); } - if (processor.didNRActiveBandsChange.get()) + if (processor.activeBandsChanged.get()) { - processor.didNRActiveBandsChange = false; + processor.activeBandsChanged = false; nActiveBandsChanged(); } if (processor.zeroDelayModeChanged.get()) @@ -950,129 +1488,515 @@ void PolarDesignerAudioProcessorEditor::timerCallback() processor.ffDfEqChanged = false; setEqMode(); } + + if (showTerminatorAnimationWindow) + { + if (processor.info.isPlaying) + { + if (!isTargetAquiring) + { + isTargetAquiring = true; + setSideAreaEnabled(false); + setMainAreaEnabled(false); + processor.startTracking(maximizeTarget ? false : true); + albAcquiringTarget.startAnimation("ACQUIRING TARGET ", + maximizeTarget ? "STOP PLAYBACK WHEN READY TO MAXIMIZE " + : "STOP PLAYBACK WHEN READY TO TERMINATE "); + albPlaybackSpill.stopAnimation(); + resized(); + } + } + else + { + if (isTargetAquiring) + { + isTargetAquiring = false; + setSideAreaEnabled(true); + setMainAreaEnabled(true); + processor.stopTracking(1); + albAcquiringTarget.stopAnimation(); + albPlaybackSpill.stopAnimation(); + + if (maxTargetToSpillFlowStarted) + { + showMaxToSpillWindow = true; + showTerminatorAnimationWindow = false; + showActiveTerminatorStage(termStage); + } + else + { + showTerminatorAnimationWindow = false; + } + resized(); + } + } + } + else + { + if (isTargetAquiring) + { + isTargetAquiring = false; + setSideAreaEnabled(true); + setMainAreaEnabled(true); + processor.stopTracking(0); + albAcquiringTarget.stopAnimation(); + albPlaybackSpill.stopAnimation(); + resized(); + } + } } void PolarDesignerAudioProcessorEditor::zeroDelayModeChange() { tbZeroDelay.setToggleState(processor.zeroDelayModeActive(), NotificationType::dontSendNotification); - - // !J! TODO: replace cbSetNrBands with tbSetNrBands - nActiveBands = cbSetNrBands.getSelectedId(); - // nActiveBands = tbSetNrBands. - + + nActiveBands = processor.getNBands(); int nActive = nActiveBands; - + if (processor.zeroDelayModeActive()) + { nActive = 1; - + valueTreeState.getParameter("nrBands")->setValueNotifyingHost(valueTreeState.getParameter("nrBands")->convertTo0to1((0))); + } setSideAreaEnabled(!processor.zeroDelayModeActive()); - + for (int i = 0; i < 5; i++) { if (i < nActive) { slDir[i].setEnabled(true); slBandGain[i].setEnabled(true); - msbSolo[i].setEnabled(true); - msbMute[i].setEnabled(true); + slBandGain[i].setVisible(true); + tgbSolo[i].setEnabled(true); + tgbSolo[i].setVisible(true); + tgbMute[i].setEnabled(true); + tgbMute[i].setVisible(true); polarPatternVisualizers[i].setActive(true); + polarPatternVisualizers[i].setVisible(true); } else { slDir[i].setEnabled(false); slBandGain[i].setEnabled(false); - msbSolo[i].setEnabled(false); - msbSolo[i].setToggleState(false, NotificationType::sendNotification); - msbMute[i].setEnabled(false); - msbMute[i].setToggleState(false, NotificationType::sendNotification); + slBandGain[i].setVisible(false); + tgbSolo[i].setEnabled(false); + tgbSolo[i].setToggleState(false, NotificationType::sendNotification); + tgbSolo[i].setVisible(false); + tgbMute[i].setEnabled(false); + tgbMute[i].setToggleState(false, NotificationType::sendNotification); + tgbMute[i].setVisible(false); polarPatternVisualizers[i].setActive(false); + polarPatternVisualizers[i].setVisible(false); } } - + directivityEqualiser.resetTooltipTexts(); directivityEqualiser.repaint(); } -void PolarDesignerAudioProcessorEditor::disableMainArea() +void PolarDesignerAudioProcessorEditor::showPresetList(bool shouldShow) { - directivityEqualiser.setActive(false); - for (int i = 0; i < nActiveBands; i++) + lbUserPresets.deselectAll(); + lbFactoryPresets.deselectAll(); + presetListVisible = shouldShow; + tbLogoAA.setVisible(!shouldShow); + if(shouldShow) + processor.undoManager.beginNewTransaction("Loading preset"); + resized(); +} + +void PolarDesignerAudioProcessorEditor::setBandEnabled(int bandNr, bool enable) +{ + directivityEqualiser.getDirPathComponent(bandNr).setEnabled(enable); + slDir[bandNr].setEnabled(enable); + tgbSolo[bandNr].setEnabled(enable); + tgbMute[bandNr].setEnabled(enable); + slBandGain[bandNr].setEnabled(enable); + repaint(); +} + +void PolarDesignerAudioProcessorEditor::showActiveTerminatorStage(terminatorStage stage) +{ + if (stage == terminatorStage::DISABLED) + { + terminatorLabelNr1.setVisible(false);; + terminatorLabelSpillMain.setVisible(false); + terminatorLabelSpillSub.setVisible(false); + tbBeginTerminate.setVisible(false); + + terminatorLabelNr2.setVisible(false); + terminatorLabelMaxMain.setVisible(false); + terminatorLabelMaxSub.setVisible(false); + tbBeginMaximize.setVisible(false); + + terminatorLabelNr3.setVisible(false); + terminatorLabelMaxToSpillMain.setVisible(false); + terminatorLabelMaxToSpillSub.setVisible(false); + tbApplyMaxTargetToSpill.setVisible(false); + + for (auto &line : terminatorStageLine) + { + line.setVisible(false); + } + + terminatorLabelNr1.setToggleState(false, NotificationType::dontSendNotification); + terminatorLabelNr2.setToggleState(false, NotificationType::dontSendNotification); + terminatorLabelNr3.setToggleState(false, NotificationType::dontSendNotification); + } + else if (stage == terminatorStage::TERMINATE) + { + terminatorLabelNr1.setVisible(true);; + terminatorLabelSpillMain.setVisible(true); + terminatorLabelSpillSub.setVisible(true); + tbBeginTerminate.setVisible(true); + + terminatorLabelNr1.setEnabled(true); + terminatorLabelSpillMain.setEnabled(true); + terminatorLabelSpillSub.setEnabled(true); + tbBeginTerminate.setEnabled(true); + + terminatorLabelNr2.setVisible(true); + terminatorLabelMaxMain.setVisible(true); + terminatorLabelNr2.setEnabled(false); + terminatorLabelMaxMain.setEnabled(false); + + terminatorLabelNr3.setVisible(true); + terminatorLabelMaxToSpillMain.setVisible(true); + terminatorLabelNr3.setEnabled(false); + terminatorLabelMaxToSpillMain.setEnabled(false); + + for (auto& line : terminatorStageLine) + { + line.setVisible(true); + } + terminatorStageLine[2].setVisible(false); + terminatorStageLine[3].setVisible(false); + + terminatorLabelNr1.setToggleState(false, NotificationType::dontSendNotification); + terminatorLabelNr2.setToggleState(false, NotificationType::dontSendNotification); + terminatorLabelNr3.setToggleState(false, NotificationType::dontSendNotification); + } + else if (stage == terminatorStage::MAXIMIZE) { - slDir[i].setEnabled(false); - slBandGain[i].setEnabled(false); - msbSolo[i].setEnabled(false); - msbMute[i].setEnabled(false); - polarPatternVisualizers[i].setActive(false); + terminatorLabelNr1.setVisible(true);; + terminatorLabelSpillMain.setVisible(true); + terminatorLabelSpillSub.setVisible(false); + tbBeginTerminate.setVisible(false); + terminatorLabelNr1.setEnabled(false);; + terminatorLabelSpillMain.setEnabled(false); + + terminatorLabelNr2.setVisible(true); + terminatorLabelMaxMain.setVisible(true); + terminatorLabelMaxSub.setVisible(true); + tbBeginMaximize.setVisible(true); + terminatorLabelNr2.setEnabled(true); + terminatorLabelMaxMain.setEnabled(true); + terminatorLabelMaxSub.setEnabled(true); + tbBeginMaximize.setEnabled(true); + + terminatorLabelNr3.setVisible(true); + terminatorLabelMaxToSpillMain.setVisible(true); + terminatorLabelNr3.setEnabled(false);; + terminatorLabelMaxToSpillMain.setEnabled(false); + + for (auto& line : terminatorStageLine) + { + line.setVisible(true); + } + terminatorStageLine[0].setVisible(false); + terminatorStageLine[1].setVisible(false); + + terminatorLabelNr1.setToggleState(true, NotificationType::dontSendNotification); + terminatorLabelNr2.setToggleState(false, NotificationType::dontSendNotification); + terminatorLabelNr3.setToggleState(false, NotificationType::dontSendNotification); + } + else if (stage == terminatorStage::MAXTOSPILL) + { + terminatorLabelNr1.setVisible(true);; + terminatorLabelSpillMain.setVisible(true); + terminatorLabelSpillSub.setVisible(false); + tbBeginTerminate.setVisible(false); + terminatorLabelNr1.setEnabled(false);; + terminatorLabelSpillMain.setEnabled(false); + + terminatorLabelNr2.setVisible(true); + terminatorLabelMaxMain.setVisible(true); + terminatorLabelMaxSub.setVisible(false); + tbBeginMaximize.setVisible(false); + terminatorLabelNr2.setEnabled(false); + terminatorLabelMaxMain.setEnabled(false); + + terminatorLabelNr3.setVisible(true); + terminatorLabelMaxToSpillMain.setVisible(true); + terminatorLabelMaxToSpillSub.setVisible(true); + tbApplyMaxTargetToSpill.setVisible(true); + terminatorLabelNr3.setEnabled(true); + terminatorLabelMaxToSpillMain.setEnabled(true); + terminatorLabelMaxToSpillSub.setEnabled(true); + tbApplyMaxTargetToSpill.setEnabled(true); + + terminatorStageLine[0].setVisible(false); + terminatorStageLine[1].setVisible(false); + terminatorStageLine[2].setVisible(false); + terminatorStageLine[3].setVisible(false); + terminatorStageLine[4].setVisible(true); + terminatorStageLine[5].setVisible(true); + terminatorStageLine[6].setVisible(false); + terminatorStageLine[7].setVisible(false); + + terminatorLabelNr1.setToggleState(true, NotificationType::dontSendNotification); + terminatorLabelNr2.setToggleState(true, NotificationType::dontSendNotification); + terminatorLabelNr3.setToggleState(false, NotificationType::dontSendNotification); } - tbZeroDelay.setEnabled(false); } -void PolarDesignerAudioProcessorEditor::onAlOverlayErrorOkay() +void PolarDesignerAudioProcessorEditor::notifyPresetLabelChange() { - disableOverlay(); + if (presetLoaded) + { + titlePresetUndoButton.setVisible(false); + presetLoaded = false; + titlePreset.setTitle(titlePreset.getTitle()+"*"); + } } -void PolarDesignerAudioProcessorEditor::onAlOverlayApplyPattern() +void PolarDesignerAudioProcessorEditor::mouseDown(const MouseEvent& event) { - disableOverlay(); - processor.stopTracking(1); + //Event for hiding preset panel when clicking outside + if (presetListVisible && !presetArea.contains(event.mouseDownPosition)) + { + showPresetList(false); + processor.undoManager.undo(); + } + + for (int i = 0; i < 5; i++) + { + polarPatternVisualizers[i].setToggleState(false, NotificationType::dontSendNotification); + setBandEnabled(i, true); + } } -void PolarDesignerAudioProcessorEditor::onAlOverlayCancelRecord() +void PolarDesignerAudioProcessorEditor::changeListenerCallback(ChangeBroadcaster* source) { - disableOverlay(); - processor.stopTracking(0); + if (source == &lbUserPresets) + { + File presetDir(processor.getLastDir().exists() ? processor.getLastDir() : File::getSpecialLocation(File::userHomeDirectory)); + + auto selectedPreset = lbUserPresets.getSelectedPresetName(); + auto presetFile = presetDir.findChildFiles(File::findFiles, false, String(selectedPreset + ".json")); + + if (presetFile.size() == 1) + { + processor.loadPreset(presetFile.getFirst()); + lbFactoryPresets.deselectAll(); + if (lbUserPresets.isRowDoubleClicked()) + { + titlePreset.setTitle(String("Preset: " + selectedPreset)); + showPresetList(false); + presetLoaded = true; + titlePresetUndoButton.setVisible(true); + } + } + } + else if (source == &lbFactoryPresets) + { + File presetDir(processor.getLastDir().exists() ? processor.getLastDir() : File::getSpecialLocation(File::userHomeDirectory)); + + auto selectedPreset = lbFactoryPresets.getSelectedPresetName(); + auto presetFile = presetDir.findChildFiles(File::findFiles, false, String(selectedPreset + ".json")); + + if (presetFile.size() == 1) + { + processor.loadPreset(presetFile.getFirst()); + lbUserPresets.deselectAll(); + if (lbFactoryPresets.isRowDoubleClicked()) + { + titlePreset.setTitle(String("Preset: " + selectedPreset)); + showPresetList(false); + presetLoaded = true; + titlePresetUndoButton.setVisible(true); + } + } + } } -void PolarDesignerAudioProcessorEditor::onAlOverlayMaxSigToDist() +void PolarDesignerAudioProcessorEditor::setMainAreaEnabled(bool enable) { - disableOverlay(); - processor.stopTracking(2); + directivityEqualiser.setActive(enable); + directivityEqualiser.setEnabled(enable); + + for (int i = 0; i < nActiveBands; i++) + { + directivityEqualiser.getDirPathComponent(i).setEnabled(enable); + slDir[i].setEnabled(enable); + slBandGain[i].setEnabled(enable); + tgbSolo[i].setEnabled(enable); + tgbMute[i].setEnabled(enable); + polarPatternVisualizers[i].setEnabled(enable); + polarPatternVisualizers[i].setActive(enable); + if (polarPatternVisualizers[i].getToggleState()) + polarPatternVisualizers[i].setToggleState(false, NotificationType::dontSendNotification); + } + tbZeroDelay.setEnabled(enable); + titlePreset.setEnabled(enable); + repaint(); } void PolarDesignerAudioProcessorEditor::setSideAreaEnabled(bool set) { - tbSetNrBands[0].setEnabled(set); - tbSetNrBands[1].setEnabled(set); - tbSetNrBands[2].setEnabled(set); - tbSetNrBands[3].setEnabled(set); - tbSetNrBands[4].setEnabled(set); - tbSyncChannel[0].setEnabled(set); - tbSyncChannel[1].setEnabled(set); - tbSyncChannel[2].setEnabled(set); - tbSyncChannel[3].setEnabled(set); - tbSyncChannel[4].setEnabled(set); - tbSyncChannel[5].setEnabled(set); - - // cbSetNrBands.setEnabled(set); - // cbSyncChannel.setEnabled(set); - tbLoadFile.setEnabled(set); - tbSaveFile.setEnabled(set); - tbEq[0].setEnabled(set); - tbEq[1].setEnabled(set); - tbEq[2].setEnabled(set); + tmbNrBandsButton[0].setEnabled(set); + tmbNrBandsButton[1].setEnabled(set); + tmbNrBandsButton[2].setEnabled(set); + tmbNrBandsButton[3].setEnabled(set); + tmbNrBandsButton[4].setEnabled(set); + tmbSyncChannelButton[0].setEnabled(set); + tmbSyncChannelButton[1].setEnabled(set); + tmbSyncChannelButton[2].setEnabled(set); + tmbSyncChannelButton[3].setEnabled(set); + + tbLoad.setEnabled(set); + tbSave.setEnabled(set); + ibEqCtr[0].setEnabled(set); + ibEqCtr[1].setEnabled(set); tbAllowBackwardsPattern.setEnabled(set); - tbRecordDisturber.setEnabled(set); - tbRecordSignal.setEnabled(set); - slProximity.setEnabled(set); + tbTerminateSpill.setEnabled(set); + tbMaximizeTarget.setEnabled(set); + tbMaxTargetToSpill.setEnabled(set); + tgbProxCtr.setEnabled(set); + if (tgbProxCtr.getToggleState()) + { + slProximity.setEnabled(set); + } + grpEq.setEnabled(set); + grpPreset.setEnabled(set); + grpProxComp.setEnabled(set); + grpBands.setEnabled(set); + grpSync.setEnabled(set); + grpPresetList.setEnabled(set); + + if (processor.zeroDelayModeActive()) + grpTerminatorControl.setEnabled(set); + else + grpTerminatorControl.setEnabled(true); + + repaint(); } void PolarDesignerAudioProcessorEditor::setEqMode() { int activeIdx = processor.getEqState(); - tbEq[activeIdx].setToggleState(true, NotificationType::sendNotification); + if (activeIdx == 0) + { + ibEqCtr[0].setToggleState(false, NotificationType::dontSendNotification); + ibEqCtr[1].setToggleState(false, NotificationType::dontSendNotification); + } + else if (activeIdx == 1) + { + ibEqCtr[0].setToggleState(true, NotificationType::dontSendNotification); + ibEqCtr[1].setToggleState(false, NotificationType::dontSendNotification); + } + else if (activeIdx == 2) + { + ibEqCtr[0].setToggleState(false, NotificationType::dontSendNotification); + ibEqCtr[1].setToggleState(true, NotificationType::dontSendNotification); + } + repaint(); } - -void PolarDesignerAudioProcessorEditor::disableOverlay() +void PolarDesignerAudioProcessorEditor::calculateLockedBands(int nBands, bool trimSliderIncr) { - alOverlayError.setVisible(false); - alOverlayDisturber.setVisible(false); - alOverlaySignal.setVisible(false); - directivityEqualiser.setActive(true); - nActiveBandsChanged(); - setSideAreaEnabled(true); - tbZeroDelay.setEnabled(true); + // First check if any of the band reach min/max value + int minIt = -1; + for (int i = 0; i < nBands; i++) + { + if (slDir[i].isEnabled() && slDir[i].getValue() == (trimSliderIncr ? 1.f : -0.5f)) + { + minIt = i; + break; + } + } + // Count locked bands for future use + int counter = 0; + for (int i = 0; i < nBands; i++) + { + if (slDir[i].isEnabled() && bandLockedOnMinMax[i]) counter++; + } + // Leave maxIt band always unlocked + if (counter < 4) + { + for (int i = 0; i < nBands; i++) + { + if (trimSliderIncr) + { + if (slDir[i].isEnabled() && (slDir[i].getValue() < slDir[maxIt].getValue())) + maxIt = i; + } + else + { + if (slDir[i].isEnabled() && (slDir[i].getValue() > slDir[maxIt].getValue())) + maxIt = i; + } + } + } + for (int i = 0; i < nBands; i++) + { + if (slDir[i].isEnabled()) + { + if (slDir[i].getValue() == (trimSliderIncr ? 1.f : -0.5f) && i != maxIt) + { + bandLockedOnMinMax[i] = true; + } + else + { + bandLockedOnMinMax[i] = false; + } + } + } + // Detect change of band slider when drag only one band + if (minIt == -1 || directivityEqualiser.isDirSliderLastChangedByDrag()) + { + minBandValueDistancesSet = false; + } + // Calculate distances between min/max value and rest of bands + if (minIt != -1 && !minBandValueDistancesSet) + { + for (int i = 0; i < nBands; i++) + { + if (slDir[i].isEnabled()) + minBandValueDistances[i] = slDir[i].getValue() - slDir[minIt].getValue(); + } + minBandValueDistancesSet = true; + } + // Unlock bands that reach given distance from min.max value + if (minIt != -1 && minBandValueDistancesSet) + { + for (int i = 0; i < nBands; i++) + { + if (slDir[i].isEnabled()) + { + if (trimSliderIncr) + { + float sliderVal = (1.f - std::abs(slDir[maxIt].getValue())); + if (slDir[maxIt].getValue() < 0) + { + sliderVal = (1.f + std::abs(slDir[maxIt].getValue())); + } + if (sliderVal >= std::abs(minBandValueDistances[maxIt]) + minBandValueDistances[i]) + { + bandLockedOnMinMax[i] = false; + } + } + else + { + float sliderVal = std::abs(0.5f + slDir[maxIt].getValue()); + if (sliderVal >= minBandValueDistances[maxIt] - minBandValueDistances[i]) + { + bandLockedOnMinMax[i] = false; + } + } + } + } + } } // implement this for AAX automation shortchut @@ -1096,25 +2020,25 @@ int PolarDesignerAudioProcessorEditor::getControlParameterIndex (Component& cont return 7; else if ((&control == &slDir[4] || &control == &directivityEqualiser.getDirPathComponent(4)) && nActiveBands > 4) return 8; - else if (&control == &msbSolo[0]) + else if (&control == &tgbSolo[0]) return 9; - else if (&control == &msbSolo[1] && nActiveBands > 1) + else if (&control == &tgbSolo[1] && nActiveBands > 1) return 10; - else if (&control == &msbSolo[2] && nActiveBands > 2) + else if (&control == &tgbSolo[2] && nActiveBands > 2) return 11; - else if (&control == &msbSolo[3] && nActiveBands > 3) + else if (&control == &tgbSolo[3] && nActiveBands > 3) return 12; - else if (&control == &msbSolo[4] && nActiveBands > 4) + else if (&control == &tgbSolo[4] && nActiveBands > 4) return 13; - else if (&control == &msbMute[0]) + else if (&control == &tgbMute[0]) return 14; - else if (&control == &msbMute[1] && nActiveBands > 1) + else if (&control == &tgbMute[1] && nActiveBands > 1) return 15; - else if (&control == &msbMute[2] && nActiveBands > 2) + else if (&control == &tgbMute[2] && nActiveBands > 2) return 16; - else if (&control == &msbMute[3] && nActiveBands > 3) + else if (&control == &tgbMute[3] && nActiveBands > 3) return 17; - else if (&control == &msbMute[4] && nActiveBands > 4) + else if (&control == &tgbMute[4] && nActiveBands > 4) return 18; else if (&control == &slBandGain[0]) return 19; @@ -1128,7 +2052,7 @@ int PolarDesignerAudioProcessorEditor::getControlParameterIndex (Component& cont return 23; else if (&control == &slProximity) return 26; - + return -1; } diff --git a/source/PluginEditor.h b/source/PluginEditor.h index a3b0eb7..3b824cc 100644 --- a/source/PluginEditor.h +++ b/source/PluginEditor.h @@ -29,26 +29,28 @@ #include "../JuceLibraryCode/JuceHeader.h" #include "PluginProcessor.h" #include "../resources/lookAndFeel/AA_LaF.h" +#include "../resources/lookAndFeel/MainLookAndFeel.h" #include "../resources/customComponents/TitleBar.h" #include "../resources/customComponents/SimpleLabel.h" -#include "../resources/customComponents/MuteSoloButton.h" #include "../resources/customComponents/ReverseSlider.h" #include "../resources/customComponents/DirSlider.h" #include "../resources/customComponents/PolarPatternVisualizer.h" #include "../resources/customComponents/DirectivityEQ.h" #include "../resources/customComponents/AlertOverlay.h" #include "../resources/customComponents/EndlessSlider.h" +#include "../resources/customComponents/MultiTextButton.h" +#include "../resources/customComponents/PresetListBox.h" +#include "../resources/customComponents/AnimatedLabel.h" +#include "../resources/customComponents/GainSlider.h" typedef AudioProcessorValueTreeState::SliderAttachment SliderAttachment; typedef AudioProcessorValueTreeState::ButtonAttachment ButtonAttachment; -typedef AudioProcessorValueTreeState::ComboBoxAttachment ComboBoxAttachment; -typedef AudioProcessorValueTreeState::ButtonAttachment ButtonAttachment; //============================================================================== /** */ class PolarDesignerAudioProcessorEditor : public AudioProcessorEditor, private Button::Listener, - private ComboBox::Listener, private Slider::Listener, private Timer + private Slider::Listener, private Timer, public ChangeListener { public: PolarDesignerAudioProcessorEditor (PolarDesignerAudioProcessor&, AudioProcessorValueTreeState&); @@ -57,89 +59,128 @@ class PolarDesignerAudioProcessorEditor : public AudioProcessorEditor, private //============================================================================== void paint (Graphics&) override; void resized() override; - + void buttonStateChanged(Button* button) override; void buttonClicked (Button* button) override; - void comboBoxChanged (ComboBox* cb) override; void sliderValueChanged (Slider* slider) override; - - void onAlOverlayErrorOkay(); - void onAlOverlayApplyPattern(); - void onAlOverlayCancelRecord(); - void onAlOverlayMaxSigToDist(); + void setEqMode(); + void calculateLockedBands(int nBands, bool trimSliderIncr); float getABButtonAlphaFromLayerState(int layerState); // Helper method to calculate flex on the base of bandlimitPathComponents std::vector getBandLimitWidthVector(float sizeDirectionalEQ, float offsetPolarVisualizer); - - void incrementTrim(int nBands); - void decrementTrim(int nBands); + + //void incrementTrim(int nBands); + void setTrimValue(int nBands); + void resetTrim(int nBands); int getControlParameterIndex (Component& control) override; - + + void loadSavedPresetsToList(); + + void changeListenerCallback(ChangeBroadcaster* source) override; + private: - static const int EDITOR_WIDTH = 990; - static const int EDITOR_HEIGHT = 630; + static const int EDITOR_MIN_WIDTH = 1194; + static const int EDITOR_MIN_HEIGHT = 834; + static const int EDITOR_MAX_WIDTH = 2732; + static const int EDITOR_MAX_HEIGHT = 2048; + String presetFilename; String errorMessage; - + const int maxNumberBands = 5; int nActiveBands; int syncChannelIdx; int oldAbLayerState; - + + float trimSliderPrevPos = 0.22f; + float minBandValueDistances[5]; + bool bandLockedOnMinMax[5] = { false, false, false, false, false }; + bool minBandValueDistancesSet = false; + int maxIt = 0; + bool loadingFile; bool recordingDisturber; - + bool presetListVisible; + bool presetLoaded = false; + Colour eqColours[5]; - AALogo logoAA; - TitleBarAAText titleAA; - TitleBarPDText titlePD; - TitleLine titleLine; + TextButton tbLogoAA; + TitleBarTextLabel titleCompare, titlePreset; + TextButton titlePresetUndoButton; Footer footer; LaF globalLaF; -// LaF2 comboBoxLaF; // only for ComboBox - + MainLookAndFeel mainLaF; + PolarDesignerAudioProcessor& processor; AudioProcessorValueTreeState& valueTreeState; TooltipWindow tooltipWindow; // Groups - GroupComponent grpEq, grpPreset, grpDstC, grpProxComp, grpBands, grpSync; + GroupComponent grpEq, grpPreset, grpTerminatorControl, grpProxComp, grpBands, grpSync, grpPresetList; // Sliders - ReverseSlider slBandGain[5], slCrossoverPosition[4], slProximity; + ReverseSlider slCrossoverPosition[4]; DirSlider slDir[5]; - + Slider slProximity; + GainSlider slBandGain[5]; + // a slider to use to 'trim' the EQ's EndlessSlider trimSlider; - + // Solo Buttons - MuteSoloButton msbSolo[5], msbMute[5]; + ToggleButton tgbSolo[5], tgbMute[5]; // Text Buttons - TextButton tbLoadFile, tbSaveFile, tbRecordDisturber, tbRecordSignal, tbZeroDelay, tbAbButton[2]; + TextButton tbLoad, tbSave, tbTerminateSpill, tbMaximizeTarget, tbMaxTargetToSpill, tbZeroDelay, tbOpenFromFile; // ToggleButtons - ToggleButton tbEq[3], tbAllowBackwardsPattern; - // Combox Boxes - ComboBox cbSetNrBands, cbSyncChannel; - TextButton tbSetNrBands[5]; - TextButton tbSyncChannel[5]; - + ToggleButton tbAllowBackwardsPattern, tgbProxCtr; + // ImageButtons + TextButton ibEqCtr[2], tbClosePresetList, tbCloseTerminatorControl, tbTrimSliderCenterPointer; + + TextMultiButton tmbABButton, tmbNrBandsButton, tmbSyncChannelButton; + + PresetListBox lbUserPresets, lbFactoryPresets; + // Pointers for value tree state - std::unique_ptr slBandGainAtt[5], slCrossoverAtt[4], slProximityAtt; + std::unique_ptr slCrossoverAtt[4]; + std::unique_ptr slBandGainAtt[5]; + std::unique_ptr slProximityAtt; std::unique_ptr slDirAtt[5]; - std::unique_ptr msbSoloAtt[5], msbMuteAtt[5], tbAllowBackwardsPatternAtt, tbZeroDelayAtt; - std::unique_ptr cbSetNrBandsAtt, cbSyncChannelAtt; + std::unique_ptr tgbSoloAtt[5], tgbMuteAtt[5], tbAllowBackwardsPatternAtt, tbZeroDelayAtt, tgbProxCtrAtt; DirectivityEQ directivityEqualiser; PolarPatternVisualizer polarPatternVisualizers[5]; - AlertOverlay alOverlayError; - AlertOverlay alOverlayDisturber; - AlertOverlay alOverlaySignal; - Path sideBorderPath; - + Rectangle presetArea; + AnimatedLabel albPlaybackSpill, albAcquiringTarget; + + TextButton terminatorLabelNr1, terminatorLabelSpillMain, terminatorLabelSpillSub; + TextButton tbBeginTerminate; + + TextButton terminatorLabelNr2, terminatorLabelMaxMain, terminatorLabelMaxSub; + TextButton tbBeginMaximize; + + TextButton terminatorLabelNr3, terminatorLabelMaxToSpillMain, terminatorLabelMaxToSpillSub; + TextButton tbApplyMaxTargetToSpill; + + TextButton terminatorStageLine[8]; + + bool showTerminatorAnimationWindow; + bool isTargetAquiring; + bool maximizeTarget; + bool showMaxToSpillWindow; + bool maxTargetToSpillFlowStarted; + + enum class terminatorStage + { + DISABLED = 0, + TERMINATE = 1, + MAXIMIZE = 2, + MAXTOSPILL = 3 + } termStage; + #ifdef AA_DO_DEBUG_PATH Path debugPath; #endif @@ -150,10 +191,16 @@ class PolarDesignerAudioProcessorEditor : public AudioProcessorEditor, private void saveFile(); void timerCallback() override; bool getSoloActive(); - void disableMainArea(); + void setMainAreaEnabled(bool enable); void setSideAreaEnabled(bool set); - void disableOverlay(); void zeroDelayModeChange(); + void showPresetList(bool shouldShow); + void setBandEnabled(int bandNr, bool enable); + + void showActiveTerminatorStage(terminatorStage stage); + void notifyPresetLabelChange(); + + void mouseDown(const MouseEvent& event) override; OpenGLContext openGLContext; diff --git a/source/PluginProcessor.cpp b/source/PluginProcessor.cpp index 8320faf..c6e6587 100644 --- a/source/PluginProcessor.cpp +++ b/source/PluginProcessor.cpp @@ -25,105 +25,112 @@ #include "PluginEditor.h" //============================================================================== -PolarDesignerAudioProcessor::PolarDesignerAudioProcessor() : -AudioProcessor (BusesProperties() - .withInput ("Input", AudioChannelSet::stereo(), true) - .withOutput ("Output", AudioChannelSet::stereo(), true) - ), -layerA(nodeA), -layerB(nodeB), -saveStates(saveTree), -doEq(0), doEqA(0), doEqB(0), -nBands(5), -vtsParams(*this, nullptr, "AAPolarDesigner", - { - std::make_unique (ParameterID {"xOverF1", 1}, "Xover1", NormalisableRange(0.0f, 1.0f, 0.0001f), - hzToZeroToOne(0, INIT_XOVER_FREQS_5B[0]), "", - AudioProcessorParameter::genericParameter, - [&](float value, int maximumStringLength) {return String(std::roundf(hzFromZeroToOne(0, value))) + " Hz";}, - nullptr), - std::make_unique (ParameterID {"xOverF2", 1}, "Xover2", NormalisableRange(0.0f, 1.0f, 0.0001f), - hzToZeroToOne(1, INIT_XOVER_FREQS_5B[1]), "", - AudioProcessorParameter::genericParameter, - [&](float value, int maximumStringLength) {return String(std::roundf(hzFromZeroToOne(1, value))) + " Hz";}, - nullptr), - std::make_unique (ParameterID {"xOverF3", 1}, "Xover3", NormalisableRange(0.0f, 1.0f, 0.0001f), - hzToZeroToOne(2, INIT_XOVER_FREQS_5B[2]), "", - AudioProcessorParameter::genericParameter, - [&](float value, int maximumStringLength) {return String(std::roundf(hzFromZeroToOne(2, value))) + " Hz";}, - nullptr), - std::make_unique (ParameterID {"xOverF4", 1}, "Xover4", NormalisableRange(0.0f, 1.0f, 0.0001f), - hzToZeroToOne(3, INIT_XOVER_FREQS_5B[3]), "", - AudioProcessorParameter::genericParameter, - [&](float value, int maximumStringLength) {return String(std::roundf(hzFromZeroToOne(3, value))) + " Hz";}, - nullptr), - std::make_unique (ParameterID {"alpha1", 1}, "Polar1", NormalisableRange(-0.5f, 1.0f, 0.01f), - 0.0f, "", AudioProcessorParameter::genericParameter, - [](float value, int maximumStringLength) { return String(value, 2); }, nullptr), - std::make_unique (ParameterID {"alpha2", 1}, "Polar2", NormalisableRange(-0.5f, 1.0f, 0.01f), - 0.0f, "", AudioProcessorParameter::genericParameter, - [](float value, int maximumStringLength) { return String(value, 2); }, nullptr), - std::make_unique (ParameterID {"alpha3", 1}, "Polar3", NormalisableRange(-0.5f, 1.0f, 0.01f), - 0.0f, "", AudioProcessorParameter::genericParameter, - [](float value, int maximumStringLength) { return String(value, 2); }, nullptr), - std::make_unique (ParameterID {"alpha4", 1}, "Polar4", NormalisableRange(-0.5f, 1.0f, 0.01f), - 0.0f, "", AudioProcessorParameter::genericParameter, - [](float value, int maximumStringLength) { return String(value, 2); }, nullptr), - std::make_unique (ParameterID {"alpha5", 1}, "Polar5", NormalisableRange(-0.5f, 1.0f, 0.01f), - 0.0f, "", AudioProcessorParameter::genericParameter, - [](float value, int maximumStringLength) { return String(value, 2); }, nullptr), - std::make_unique (ParameterID {"solo1", 1}, "Solo1", false, "", - [](bool value, int maximumStringLength) {return (value) ? "on" : "off";}, nullptr), - std::make_unique (ParameterID {"solo2", 1}, "Solo2", false, "", - [](bool value, int maximumStringLength) {return (value) ? "on" : "off";}, nullptr), - std::make_unique (ParameterID {"solo3", 1}, "Solo3", false, "", - [](bool value, int maximumStringLength) {return (value) ? "on" : "off";}, nullptr), - std::make_unique (ParameterID {"solo4", 1}, "Solo4", false, "", - [](bool value, int maximumStringLength) {return (value) ? "on" : "off";}, nullptr), - std::make_unique (ParameterID {"solo5", 1}, "Solo5", false, "", - [](bool value, int maximumStringLength) {return (value) ? "on" : "off";}, nullptr), - std::make_unique (ParameterID {"mute1", 1}, "Mute1", false, "", - [](bool value, int maximumStringLength) {return (value) ? "on" : "off";}, nullptr), - std::make_unique (ParameterID {"mute2", 1}, "Mute2", false, "", - [](bool value, int maximumStringLength) {return (value) ? "on" : "off";}, nullptr), - std::make_unique (ParameterID {"mute3", 1}, "Mute3", false, "", - [](bool value, int maximumStringLength) {return (value) ? "on" : "off";}, nullptr), - std::make_unique (ParameterID {"mute4", 1}, "Mute4", false, "", - [](bool value, int maximumStringLength) {return (value) ? "on" : "off";}, nullptr), - std::make_unique (ParameterID {"mute5", 1}, "Mute5", false, "", - [](bool value, int maximumStringLength) {return (value) ? "on" : "off";}, nullptr), - std::make_unique (ParameterID {"gain1", 1}, "Gain1", NormalisableRange(-24.0f, 18.0f, 0.1f), - 0.0f, "dB", AudioProcessorParameter::genericParameter, - [](float value, int maximumStringLength) { return String(value, 1); }, nullptr), - std::make_unique (ParameterID {"gain2", 1}, "Gain2", NormalisableRange(-24.0f, 18.0f, 0.1f), - 0.0f, "dB", AudioProcessorParameter::genericParameter, - [](float value, int maximumStringLength) { return String(value, 1); }, nullptr), - std::make_unique (ParameterID {"gain3", 1}, "Gain3", NormalisableRange(-24.0f, 18.0f, 0.1f), - 0.0f, "dB", AudioProcessorParameter::genericParameter, - [](float value, int maximumStringLength) { return String(value, 1); }, nullptr), - std::make_unique (ParameterID {"gain4", 1}, "Gain4", NormalisableRange(-24.0f, 18.0f, 0.1f), - 0.0f, "dB", AudioProcessorParameter::genericParameter, - [](float value, int maximumStringLength) { return String(value, 1); }, nullptr), - std::make_unique (ParameterID {"gain5", 1}, "Gain5", NormalisableRange(-24.0f, 18.0f, 0.1f), - 0.0f, "dB", AudioProcessorParameter::genericParameter, - [](float value, int maximumStringLength) { return String(value, 1); }, nullptr), - std::make_unique (ParameterID {"nrBands", 1}, "Nr. of Bands", 0, 4, 4, "", - [](int value, int maximumStringLength) {return String(value + 1);}, nullptr), - std::make_unique (ParameterID {"allowBackwardsPattern", 1}, "Allow Reverse Patterns", false, "", - [](bool value, int maximumStringLength) {return (value) ? "on" : "off";}, nullptr), - std::make_unique (ParameterID {"proximity", 1}, "Proximity", NormalisableRange(-1.0f, 1.0f, 0.001f), - 0.0f, "", AudioProcessorParameter::genericParameter, - [](float value, int maximumStringLength) { return std::abs(value) < 0.05f ? "off" : String(value, 2); }, nullptr), - std::make_unique (ParameterID {"zeroDelayMode", 1}, "Zero Latency", false, "", - [](bool value, int maximumStringLength) {return (value) ? "on" : "off";}, nullptr), - std::make_unique (ParameterID {"syncChannel", 1}, "Sync to Channel", 0, 4, 0, "", - [](int value, int maximumStringLength) {return value == 0 ? "none" : String(value);}, nullptr) -}), -firLen(FILTER_BANK_IR_LENGTH_AT_NATIVE_SAMPLE_RATE), -dfEqOmniBuffer(1, DF_EQ_LEN), dfEqEightBuffer(1, DF_EQ_LEN), -ffEqOmniBuffer(1, FF_EQ_LEN), ffEqEightBuffer(1, FF_EQ_LEN), isBypassed(false), -soloActive(false), loadingFile(false), readingSharedParams(false), trackingActive(false), -trackingDisturber(false), disturberRecorded(false), signalRecorded(false), currentSampleRate(48000) +PolarDesignerAudioProcessor::PolarDesignerAudioProcessor() : AudioProcessor (BusesProperties() + .withInput ("Input", AudioChannelSet::stereo(), true) + .withOutput ("Output", AudioChannelSet::stereo(), true) + ), + layerA(nodeA), + layerB(nodeB), + saveStates(saveTree), + doEq(0), doEqA(0), doEqB(0), + termControlWaveform(1), + nBands(5), + vtsParams(*this, &undoManager, "AAPolarDesigner", + { + std::make_unique (ParameterID {"xOverF1", 1}, "Xover1", NormalisableRange(0.0f, 1.0f, 0.0001f), + hzToZeroToOne(0, INIT_XOVER_FREQS_5B[0]), "", + AudioProcessorParameter::genericParameter, + [&](float value, int maximumStringLength) {return String(std::roundf(hzFromZeroToOne(0, value))) + " Hz";}, + nullptr), + std::make_unique (ParameterID {"xOverF2", 1}, "Xover2", NormalisableRange(0.0f, 1.0f, 0.0001f), + hzToZeroToOne(1, INIT_XOVER_FREQS_5B[1]), "", + AudioProcessorParameter::genericParameter, + [&](float value, int maximumStringLength) {return String(std::roundf(hzFromZeroToOne(1, value))) + " Hz";}, + nullptr), + std::make_unique (ParameterID {"xOverF3", 1}, "Xover3", NormalisableRange(0.0f, 1.0f, 0.0001f), + hzToZeroToOne(2, INIT_XOVER_FREQS_5B[2]), "", + AudioProcessorParameter::genericParameter, + [&](float value, int maximumStringLength) {return String(std::roundf(hzFromZeroToOne(2, value))) + " Hz";}, + nullptr), + std::make_unique (ParameterID {"xOverF4", 1}, "Xover4", NormalisableRange(0.0f, 1.0f, 0.0001f), + hzToZeroToOne(3, INIT_XOVER_FREQS_5B[3]), "", + AudioProcessorParameter::genericParameter, + [&](float value, int maximumStringLength) {return String(std::roundf(hzFromZeroToOne(3, value))) + " Hz";}, + nullptr), + std::make_unique (ParameterID {"alpha1", 1}, "Polar1", NormalisableRange(-0.5f, 1.0f, 0.01f), + 0.0f, "", AudioProcessorParameter::genericParameter, + [](float value, int maximumStringLength) { return String(value, 2); }, nullptr), + std::make_unique (ParameterID {"alpha2", 1}, "Polar2", NormalisableRange(-0.5f, 1.0f, 0.01f), + 0.0f, "", AudioProcessorParameter::genericParameter, + [](float value, int maximumStringLength) { return String(value, 2); }, nullptr), + std::make_unique (ParameterID {"alpha3", 1}, "Polar3", NormalisableRange(-0.5f, 1.0f, 0.01f), + 0.0f, "", AudioProcessorParameter::genericParameter, + [](float value, int maximumStringLength) { return String(value, 2); }, nullptr), + std::make_unique (ParameterID {"alpha4", 1}, "Polar4", NormalisableRange(-0.5f, 1.0f, 0.01f), + 0.0f, "", AudioProcessorParameter::genericParameter, + [](float value, int maximumStringLength) { return String(value, 2); }, nullptr), + std::make_unique (ParameterID {"alpha5", 1}, "Polar5", NormalisableRange(-0.5f, 1.0f, 0.01f), + 0.0f, "", AudioProcessorParameter::genericParameter, + [](float value, int maximumStringLength) { return String(value, 2); }, nullptr), + std::make_unique (ParameterID {"solo1", 1}, "Solo1", false, "", + [](bool value, int maximumStringLength) {return (value) ? "on" : "off";}, nullptr), + std::make_unique (ParameterID {"solo2", 1}, "Solo2", false, "", + [](bool value, int maximumStringLength) {return (value) ? "on" : "off";}, nullptr), + std::make_unique (ParameterID {"solo3", 1}, "Solo3", false, "", + [](bool value, int maximumStringLength) {return (value) ? "on" : "off";}, nullptr), + std::make_unique (ParameterID {"solo4", 1}, "Solo4", false, "", + [](bool value, int maximumStringLength) {return (value) ? "on" : "off";}, nullptr), + std::make_unique (ParameterID {"solo5", 1}, "Solo5", false, "", + [](bool value, int maximumStringLength) {return (value) ? "on" : "off";}, nullptr), + std::make_unique (ParameterID {"mute1", 1}, "Mute1", false, "", + [](bool value, int maximumStringLength) {return (value) ? "on" : "off";}, nullptr), + std::make_unique (ParameterID {"mute2", 1}, "Mute2", false, "", + [](bool value, int maximumStringLength) {return (value) ? "on" : "off";}, nullptr), + std::make_unique (ParameterID {"mute3", 1}, "Mute3", false, "", + [](bool value, int maximumStringLength) {return (value) ? "on" : "off";}, nullptr), + std::make_unique (ParameterID {"mute4", 1}, "Mute4", false, "", + [](bool value, int maximumStringLength) {return (value) ? "on" : "off";}, nullptr), + std::make_unique (ParameterID {"mute5", 1}, "Mute5", false, "", + [](bool value, int maximumStringLength) {return (value) ? "on" : "off";}, nullptr), + std::make_unique (ParameterID {"gain1", 1}, "Gain1", NormalisableRange(-24.0f, 18.0f, 0.1f), + 0.0f, "dB", AudioProcessorParameter::genericParameter, + [](float value, int maximumStringLength) { return String(value, 1); }, nullptr), + std::make_unique (ParameterID {"gain2", 1}, "Gain2", NormalisableRange(-24.0f, 18.0f, 0.1f), + 0.0f, "dB", AudioProcessorParameter::genericParameter, + [](float value, int maximumStringLength) { return String(value, 1); }, nullptr), + std::make_unique (ParameterID {"gain3", 1}, "Gain3", NormalisableRange(-24.0f, 18.0f, 0.1f), + 0.0f, "dB", AudioProcessorParameter::genericParameter, + [](float value, int maximumStringLength) { return String(value, 1); }, nullptr), + std::make_unique (ParameterID {"gain4", 1}, "Gain4", NormalisableRange(-24.0f, 18.0f, 0.1f), + 0.0f, "dB", AudioProcessorParameter::genericParameter, + [](float value, int maximumStringLength) { return String(value, 1); }, nullptr), + std::make_unique (ParameterID {"gain5", 1}, "Gain5", NormalisableRange(-24.0f, 18.0f, 0.1f), + 0.0f, "dB", AudioProcessorParameter::genericParameter, + [](float value, int maximumStringLength) { return String(value, 1); }, nullptr), + std::make_unique (ParameterID {"nrBands", 1}, "Nr. of Bands", 0, 4, 4, "", + [](int value, int maximumStringLength) {return String(value + 1);}, nullptr), + std::make_unique (ParameterID {"allowBackwardsPattern", 1}, "Allow Reverse Patterns", false, "", + [](bool value, int maximumStringLength) {return (value) ? "on" : "off";}, nullptr), + std::make_unique (ParameterID {"proximity", 1}, "Proximity", NormalisableRange(-1.0f, 1.0f, 0.001f), + 0.0f, "", AudioProcessorParameter::genericParameter, + [](float value, int maximumStringLength) { return std::abs(value) < 0.05f ? "0.00" : String(value, 2); }, nullptr), + std::make_unique (ParameterID {"proximityOnOff", 1}, "ProximityOnOff", false, "", + [](bool value, int maximumStringLength) {return (value) ? "on" : "off"; }, nullptr), + std::make_unique (ParameterID {"zeroDelayMode", 1}, "Zero Latency", false, "", + [](bool value, int maximumStringLength) {return (value) ? "on" : "off";}, nullptr), + std::make_unique (ParameterID {"syncChannel", 1}, "Sync to Channel", 0, 4, 0, "", + [](int value, int maximumStringLength) {return value == 0 ? "none" : String(value);}, nullptr) + }), + firLen(FILTER_BANK_IR_LENGTH_AT_NATIVE_SAMPLE_RATE), + dfEqOmniBuffer(1, DF_EQ_LEN), dfEqEightBuffer(1, DF_EQ_LEN), + ffEqOmniBuffer(1, FF_EQ_LEN), ffEqEightBuffer(1, FF_EQ_LEN), + isBypassed(false), + soloActive(false), loadingFile(false), readingSharedParams(false), + trackingActive(false), + trackingDisturber(false), + disturberRecorded(false), + signalRecorded(false), + currentSampleRate(48000) { vtsParams.addParameterListener("xOverF1", this); @@ -154,6 +161,8 @@ trackingDisturber(false), disturberRecorded(false), signalRecorded(false), curre allowBackwardsPattern = vtsParams.getRawParameterValue("allowBackwardsPattern"); vtsParams.addParameterListener("proximity", this); proxDistance = vtsParams.getRawParameterValue("proximity"); + vtsParams.addParameterListener("proximityOnOff", this); + proxOnOff = vtsParams.getRawParameterValue("proximityOnOff"); vtsParams.addParameterListener("zeroDelayMode", this); zeroDelayMode = vtsParams.getRawParameterValue("zeroDelayMode"); vtsParams.addParameterListener("syncChannel", this); @@ -178,7 +187,10 @@ trackingDisturber(false), disturberRecorded(false), signalRecorded(false), curre delay.setDelayTime (std::ceilf(static_cast(FILTER_BANK_IR_LENGTH_AT_NATIVE_SAMPLE_RATE) / 2 - 1) / FILTER_BANK_NATIVE_SAMPLE_RATE); oldProxDistance = proxDistance->load(); - + + termControlWaveform.setRepaintRate(30); + termControlWaveform.setBufferSize(256); + startTimer(50); } @@ -290,15 +302,15 @@ void PolarDesignerAudioProcessor::prepareToPlay (double sampleRate, int samplesP dsp::ProcessSpec eqSpec2{ currentSampleRate, static_cast(currentBlockSize), 1 }; dfEqEightConv.prepare (eqSpec2); - dfEqEightConv.loadImpulseResponse(std::move(dfEqEightBuffer), EQ_SAMPLE_RATE, dsp::Convolution::Stereo::no, dsp::Convolution::Trim::no, dsp::Convolution::Normalise::no); + dfEqOmniConv.loadImpulseResponse(std::move(dfEqEightBuffer), EQ_SAMPLE_RATE, dsp::Convolution::Stereo::no, dsp::Convolution::Trim::no, dsp::Convolution::Normalise::no); dsp::ProcessSpec eqSpec3{ currentSampleRate, static_cast(currentBlockSize), 1 }; ffEqOmniConv.prepare (eqSpec3); // must be called before loading an ir - ffEqOmniConv.loadImpulseResponse(std::move(ffEqOmniBuffer), EQ_SAMPLE_RATE, dsp::Convolution::Stereo::no, dsp::Convolution::Trim::no, dsp::Convolution::Normalise::no); + dfEqOmniConv.loadImpulseResponse(std::move(ffEqOmniBuffer), EQ_SAMPLE_RATE, dsp::Convolution::Stereo::no, dsp::Convolution::Trim::no, dsp::Convolution::Normalise::no); dsp::ProcessSpec eqSpec4{ currentSampleRate, static_cast(currentBlockSize), 1 }; ffEqEightConv.prepare (eqSpec4); - ffEqEightConv.loadImpulseResponse(std::move(dfEqEightBuffer), EQ_SAMPLE_RATE, dsp::Convolution::Stereo::no, dsp::Convolution::Trim::no, dsp::Convolution::Normalise::no); + dfEqOmniConv.loadImpulseResponse(std::move(dfEqEightBuffer), EQ_SAMPLE_RATE, dsp::Convolution::Stereo::no, dsp::Convolution::Trim::no, dsp::Convolution::Normalise::no); dfEqOmniConv.reset(); dfEqEightConv.reset(); @@ -357,14 +369,15 @@ void PolarDesignerAudioProcessor::processBlock (AudioBuffer& buffer, Midi createOmniAndEightSignals (buffer); // proximity compensation filter - if (zeroDelayMode->load() < 0.5f && proxDistance->load() < -0.05) // reduce proximity effect only on figure-of-eight + auto proximity = (proxOnOff->load() == 1.f) ? proxDistance->load() : 0.f; + if (zeroDelayMode->load() < 0.5f && proximity < -0.05) // reduce proximity effect only on figure-of-eight { float* writePointerEight = omniEightBuffer.getWritePointer (1); dsp::AudioBlock eightBlock(&writePointerEight, 1, numSamples); dsp::ProcessContextReplacing contextProxEight(eightBlock); proxCompIIR.process(contextProxEight); } - else if (zeroDelayMode->load() < 0.5f && proxDistance->load() > 0.05) // apply proximity to omni + else if (zeroDelayMode->load() < 0.5f && proximity > 0.05) // apply proximity to omni { float* writePointerOmni = omniEightBuffer.getWritePointer (0); dsp::AudioBlock omniBlock(&writePointerOmni, 1, numSamples); @@ -438,7 +451,12 @@ void PolarDesignerAudioProcessor::processBlock (AudioBuffer& buffer, Midi } convolversReady = true; } - + + // !J! Deprecated: +// getPlayHead()->getCurrentPosition(info); + getPlayHead()->getPosition(); + termControlWaveform.pushBuffer(buffer); + if (trackingActive) trackSignalEnergy(); @@ -564,7 +582,7 @@ void PolarDesignerAudioProcessor::setStateInformation (const void* data, int siz } } nBands = static_cast(nBandsPtr->load()) + 1; - didNRActiveBandsChange = true; + activeBandsChanged = true; zeroDelayModeChanged = true; ffDfEqChanged = true; computeAllFilterCoefficients(); @@ -597,7 +615,7 @@ void PolarDesignerAudioProcessor::parameterChanged (const String ¶meterID, f { nBands = static_cast (nBandsPtr->load()) + 1; resetXoverFreqs(); - didNRActiveBandsChange = true; + activeBandsChanged = true; computeAllFilterCoefficients(); initAllConvolvers(); } @@ -657,6 +675,7 @@ void PolarDesignerAudioProcessor::parameterChanged (const String ¶meterID, f paramsToSync.nrActiveBands = nBandsPtr->load(); paramsToSync.proximity = proxDistance->load(); + paramsToSync.proximityOnOff = proxOnOff->load(); paramsToSync.allowBackwardsPattern = allowBackwardsPattern->load(); @@ -702,6 +721,10 @@ void PolarDesignerAudioProcessor::parameterChanged (const String ¶meterID, f { paramsToSync.proximity = proxDistance->load(); } + else if (parameterID == "proximityOnOff") + { + paramsToSync.proximityOnOff = proxOnOff->load(); + } else if (parameterID == "zeroDelayMode") { paramsToSync.zeroDelayMode = zeroDelayMode->load(); @@ -1007,12 +1030,15 @@ Result PolarDesignerAudioProcessor::loadPreset(const File& presetFile) x = parsedJson.getProperty ("proximity", parsedJson); vtsParams.getParameter ("proximity")->setValueNotifyingHost (vtsParams.getParameter("proximity")->convertTo0to1(x)); + + x = parsedJson.getProperty("proximityOnOff", parsedJson); + vtsParams.getParameter("proximityOnOff")->setValueNotifyingHost(vtsParams.getParameter("proximityOnOff")->convertTo0to1(x)); loadingFile = false; // set parameters nBands = static_cast(nBandsPtr->load()) + 1; - didNRActiveBandsChange = true; + activeBandsChanged = true; computeAllFilterCoefficients(); initAllConvolvers(); repaintDEQ = true; @@ -1055,6 +1081,7 @@ Result PolarDesignerAudioProcessor::savePreset (File destination) jsonObj->setProperty ("mute5", muteBand[4]->load()); jsonObj->setProperty ("ffDfEq", doEq); jsonObj->setProperty ("proximity", proxDistance->load()); + jsonObj->setProperty("proximityOnOff", proxOnOff->load()); String jsonString = JSON::toString (var (jsonObj), false, 2); if (destination.replaceWithText (jsonString)) @@ -1467,7 +1494,10 @@ void PolarDesignerAudioProcessor::timerCallback() if (allowBackwardsPattern->load() != paramsToSync.allowBackwardsPattern) vtsParams.getParameter ("allowBackwardsPattern")->setValueNotifyingHost (vtsParams.getParameterRange ("allowBackwardsPattern").convertTo0to1 (paramsToSync.allowBackwardsPattern)); - + + if (proxOnOff->load() != paramsToSync.proximityOnOff) + vtsParams.getParameter("proximityOnOff")->setValueNotifyingHost(vtsParams.getParameterRange("proximityOnOff").convertTo0to1(paramsToSync.proximityOnOff)); + if (paramsToSync.ffDfEq != doEq) { setEqState(paramsToSync.ffDfEq); diff --git a/source/PluginProcessor.h b/source/PluginProcessor.h index d8e92a3..0bbe61e 100644 --- a/source/PluginProcessor.h +++ b/source/PluginProcessor.h @@ -33,7 +33,7 @@ struct ParamsToSync { int nrActiveBands, ffDfEq; float xOverFreqs[4], dirFactors[5], gains[5], proximity; - bool solo[5], mute[5], allowBackwardsPattern, zeroDelayMode, abLayer; + bool solo[5], mute[5], allowBackwardsPattern, proximityOnOff, zeroDelayMode, abLayer; bool paramsValid = false; }; @@ -108,7 +108,7 @@ class PolarDesignerAudioProcessor : public AudioProcessor, public AudioProcesso float getXoverSliderRangeStart (int sliderNum); float getXoverSliderRangeEnd (int sliderNum); Atomic repaintDEQ = true; - Atomic didNRActiveBandsChange = true; + Atomic activeBandsChanged = true; Atomic zeroDelayModeChanged = true; Atomic ffDfEqChanged = true; bool getDisturberRecorded() {return disturberRecorded;} @@ -132,6 +132,10 @@ class PolarDesignerAudioProcessor : public AudioProcessor, public AudioProcesso Atomic abLayerChanged = false; bool convolversReady; + + AudioVisualiserComponent termControlWaveform; + AudioPlayHead::CurrentPositionInfo info; + UndoManager undoManager; // initial xover frequencies for several numbers of bands const float INIT_XOVER_FREQS_2B[1] = {1000.0f}; @@ -201,6 +205,7 @@ class PolarDesignerAudioProcessor : public AudioProcessor, public AudioProcesso std::atomic* allowBackwardsPattern; std::atomic* proxDistance; + std::atomic* proxOnOff; std::atomic* zeroDelayMode; std::atomic* soloBand[5]; @@ -226,7 +231,7 @@ class PolarDesignerAudioProcessor : public AudioProcessor, public AudioProcesso double currentSampleRate; int currentBlockSize; - + //============================================================================== void resetXoverFreqs(); void computeAllFilterCoefficients();