diff --git a/Builds/VisualStudio2022/Harmonizer_SharedCode.vcxproj b/Builds/VisualStudio2022/Harmonizer_SharedCode.vcxproj
index 7efc432..8e0acd6 100644
--- a/Builds/VisualStudio2022/Harmonizer_SharedCode.vcxproj
+++ b/Builds/VisualStudio2022/Harmonizer_SharedCode.vcxproj
@@ -1,5 +1,8 @@
-
-
+
+
+
Debug
@@ -13,25 +16,29 @@
{13753206-F62C-286C-51BE-24A788A74DCC}
-
-
+
+
StaticLibrary
false
false
v143
10.0
-
+
StaticLibrary
false
true
v143
10.0
-
-
+
+
-
+
<_ProjectFileVersion>10.0.30319.1
@@ -55,13 +62,13 @@
true
true
Win32
-
+
Disabled
ProgramDatabase
..\..\..\..\..\Downloads\JUCE\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\..\Downloads\JUCE\modules;C:\Users\mickl\Downloads\juce-8.0.4-windows\JUCE\modules;%(AdditionalIncludeDirectories)
- _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_PROJUCER_VERSION=0x8000a;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_plugin_client=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_VST3_CAN_REPLACE_VST2=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_WIN_WEBVIEW2_WITH_STATIC_LINKING=1;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=1;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=1;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;JucePlugin_Enable_IAA=0;JucePlugin_Enable_ARA=0;JucePlugin_Name="Harmonizer";JucePlugin_Desc="Harmonizer";JucePlugin_Manufacturer="yourcompany";JucePlugin_ManufacturerWebsite="www.yourcompany.com";JucePlugin_ManufacturerEmail="";JucePlugin_ManufacturerCode=0x4d616e75;JucePlugin_PluginCode=0x456d6377;JucePlugin_IsSynth=0;JucePlugin_WantsMidiInput=1;JucePlugin_ProducesMidiOutput=0;JucePlugin_IsMidiEffect=0;JucePlugin_EditorRequiresKeyboardFocus=0;JucePlugin_Version=1.0.0;JucePlugin_VersionCode=0x10000;JucePlugin_VersionString="1.0.0";JucePlugin_VSTUniqueID=JucePlugin_PluginCode;JucePlugin_VSTCategory=kPlugCategEffect;JucePlugin_Vst3Category="Fx";JucePlugin_AUMainType='aufx';JucePlugin_AUSubType=JucePlugin_PluginCode;JucePlugin_AUExportPrefix=HarmonizerAU;JucePlugin_AUExportPrefixQuoted="HarmonizerAU";JucePlugin_AUManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_CFBundleIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_AAXProductId=JucePlugin_PluginCode;JucePlugin_AAXCategory=0;JucePlugin_AAXDisableBypass=0;JucePlugin_AAXDisableMultiMono=0;JucePlugin_IAAType=0x6175726d;JucePlugin_IAASubType=JucePlugin_PluginCode;JucePlugin_IAAName="yourcompany: Harmonizer";JucePlugin_VSTNumMidiInputs=16;JucePlugin_VSTNumMidiOutputs=16;JucePlugin_ARAContentTypes=0;JucePlugin_ARATransformationFlags=0;JucePlugin_ARAFactoryID="com.yourcompany.Harmonizer.factory";JucePlugin_ARADocumentArchiveID="com.yourcompany.Harmonizer.aradocumentarchive.1.0.0";JucePlugin_ARACompatibleArchiveIDs="";JUCE_STANDALONE_APPLICATION=JucePlugin_Build_Standalone;PIP_JUCE_EXAMPLES_DIRECTORY=QzpcVXNlcnNcbWlja2xcRG93bmxvYWRzXGp1Y2UtOC4wLjQtd2luZG93c1xKVUNFXGV4YW1wbGVz;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JUCE_SHARED_CODE=1;_LIB;%(PreprocessorDefinitions)
+ _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_PROJUCER_VERSION=0x8000a;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_plugin_client=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_VST3_CAN_REPLACE_VST2=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_WIN_WEBVIEW2_WITH_STATIC_LINKING=1;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=1;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=1;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;JucePlugin_Enable_IAA=0;JucePlugin_Enable_ARA=0;JucePlugin_Name="Harmonizer";JucePlugin_Desc="Harmonizer";JucePlugin_Manufacturer="yourcompany";JucePlugin_ManufacturerWebsite="www.yourcompany.com";JucePlugin_ManufacturerEmail="";JucePlugin_ManufacturerCode=0x4d616e75;JucePlugin_PluginCode=0x456d6377;JucePlugin_IsSynth=0;JucePlugin_WantsMidiInput=1;JucePlugin_ProducesMidiOutput=0;JucePlugin_IsMidiEffect=0;JucePlugin_EditorRequiresKeyboardFocus=0;JucePlugin_Version=1.0.0;JucePlugin_VersionCode=0x10000;JucePlugin_VersionString="1.0.0";JucePlugin_VSTUniqueID=JucePlugin_PluginCode;JucePlugin_VSTCategory=kPlugCategEffect;JucePlugin_Vst3Category="Fx";JucePlugin_AUMainType='aufx';JucePlugin_AUSubType=JucePlugin_PluginCode;JucePlugin_AUExportPrefix=HarmonizerAU;JucePlugin_AUExportPrefixQuoted="HarmonizerAU";JucePlugin_AUManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_CFBundleIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_AAXProductId=JucePlugin_PluginCode;JucePlugin_AAXCategory=0;JucePlugin_AAXDisableBypass=0;JucePlugin_AAXDisableMultiMono=0;JucePlugin_IAAType=0x6175726d;JucePlugin_IAASubType=JucePlugin_PluginCode;JucePlugin_IAAName="yourcompany: Harmonizer";JucePlugin_VSTNumMidiInputs=16;JucePlugin_VSTNumMidiOutputs=16;JucePlugin_ARAContentTypes=0;JucePlugin_ARATransformationFlags=0;JucePlugin_ARAFactoryID="com.yourcompany.Harmonizer.factory";JucePlugin_ARADocumentArchiveID="com.yourcompany.Harmonizer.aradocumentarchive.1.0.0";JucePlugin_ARACompatibleArchiveIDs="";JUCE_STANDALONE_APPLICATION=JucePlugin_Build_Standalone;PIP_JUCE_EXAMPLES_DIRECTORY=QzpcVXNlcnNcbWlja2xcRG93bmxvYWRzXGp1Y2UtOC4wLjQtd2luZG93c1xKVUNFXGV4YW1wbGVz;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JUCE_SHARED_CODE=1;_LIB;%(PreprocessorDefinitions)
MultiThreadedDebugDLL
true
NotUsing
@@ -75,7 +82,7 @@
..\..\..\..\..\Downloads\JUCE\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\..\Downloads\JUCE\modules;C:\Users\mickl\Downloads\juce-8.0.4-windows\JUCE\modules;%(AdditionalIncludeDirectories)
- _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_PROJUCER_VERSION=0x8000a;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_plugin_client=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_VST3_CAN_REPLACE_VST2=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_WIN_WEBVIEW2_WITH_STATIC_LINKING=1;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=1;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=1;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;JucePlugin_Enable_IAA=0;JucePlugin_Enable_ARA=0;JucePlugin_Name=\"Harmonizer\";JucePlugin_Desc=\"Harmonizer\";JucePlugin_Manufacturer=\"yourcompany\";JucePlugin_ManufacturerWebsite=\"www.yourcompany.com\";JucePlugin_ManufacturerEmail=\"\";JucePlugin_ManufacturerCode=0x4d616e75;JucePlugin_PluginCode=0x456d6377;JucePlugin_IsSynth=0;JucePlugin_WantsMidiInput=1;JucePlugin_ProducesMidiOutput=0;JucePlugin_IsMidiEffect=0;JucePlugin_EditorRequiresKeyboardFocus=0;JucePlugin_Version=1.0.0;JucePlugin_VersionCode=0x10000;JucePlugin_VersionString=\"1.0.0\";JucePlugin_VSTUniqueID=JucePlugin_PluginCode;JucePlugin_VSTCategory=kPlugCategEffect;JucePlugin_Vst3Category=\"Fx\";JucePlugin_AUMainType='aufx';JucePlugin_AUSubType=JucePlugin_PluginCode;JucePlugin_AUExportPrefix=HarmonizerAU;JucePlugin_AUExportPrefixQuoted=\"HarmonizerAU\";JucePlugin_AUManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_CFBundleIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_AAXProductId=JucePlugin_PluginCode;JucePlugin_AAXCategory=0;JucePlugin_AAXDisableBypass=0;JucePlugin_AAXDisableMultiMono=0;JucePlugin_IAAType=0x6175726d;JucePlugin_IAASubType=JucePlugin_PluginCode;JucePlugin_IAAName=\"yourcompany: Harmonizer\";JucePlugin_VSTNumMidiInputs=16;JucePlugin_VSTNumMidiOutputs=16;JucePlugin_ARAContentTypes=0;JucePlugin_ARATransformationFlags=0;JucePlugin_ARAFactoryID=\"com.yourcompany.Harmonizer.factory\";JucePlugin_ARADocumentArchiveID=\"com.yourcompany.Harmonizer.aradocumentarchive.1.0.0\";JucePlugin_ARACompatibleArchiveIDs=\"\";JUCE_STANDALONE_APPLICATION=JucePlugin_Build_Standalone;PIP_JUCE_EXAMPLES_DIRECTORY=QzpcVXNlcnNcbWlja2xcRG93bmxvYWRzXGp1Y2UtOC4wLjQtd2luZG93c1xKVUNFXGV4YW1wbGVz;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JUCE_SHARED_CODE=1;_LIB;%(PreprocessorDefinitions)
+ _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_PROJUCER_VERSION=0x8000a;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_plugin_client=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_VST3_CAN_REPLACE_VST2=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_WIN_WEBVIEW2_WITH_STATIC_LINKING=1;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=1;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=1;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;JucePlugin_Enable_IAA=0;JucePlugin_Enable_ARA=0;JucePlugin_Name=\"Harmonizer\";JucePlugin_Desc=\"Harmonizer\";JucePlugin_Manufacturer=\"yourcompany\";JucePlugin_ManufacturerWebsite=\"www.yourcompany.com\";JucePlugin_ManufacturerEmail=\"\";JucePlugin_ManufacturerCode=0x4d616e75;JucePlugin_PluginCode=0x456d6377;JucePlugin_IsSynth=0;JucePlugin_WantsMidiInput=1;JucePlugin_ProducesMidiOutput=0;JucePlugin_IsMidiEffect=0;JucePlugin_EditorRequiresKeyboardFocus=0;JucePlugin_Version=1.0.0;JucePlugin_VersionCode=0x10000;JucePlugin_VersionString=\"1.0.0\";JucePlugin_VSTUniqueID=JucePlugin_PluginCode;JucePlugin_VSTCategory=kPlugCategEffect;JucePlugin_Vst3Category=\"Fx\";JucePlugin_AUMainType='aufx';JucePlugin_AUSubType=JucePlugin_PluginCode;JucePlugin_AUExportPrefix=HarmonizerAU;JucePlugin_AUExportPrefixQuoted=\"HarmonizerAU\";JucePlugin_AUManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_CFBundleIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_AAXProductId=JucePlugin_PluginCode;JucePlugin_AAXCategory=0;JucePlugin_AAXDisableBypass=0;JucePlugin_AAXDisableMultiMono=0;JucePlugin_IAAType=0x6175726d;JucePlugin_IAASubType=JucePlugin_PluginCode;JucePlugin_IAAName=\"yourcompany: Harmonizer\";JucePlugin_VSTNumMidiInputs=16;JucePlugin_VSTNumMidiOutputs=16;JucePlugin_ARAContentTypes=0;JucePlugin_ARATransformationFlags=0;JucePlugin_ARAFactoryID=\"com.yourcompany.Harmonizer.factory\";JucePlugin_ARADocumentArchiveID=\"com.yourcompany.Harmonizer.aradocumentarchive.1.0.0\";JucePlugin_ARACompatibleArchiveIDs=\"\";JUCE_STANDALONE_APPLICATION=JucePlugin_Build_Standalone;PIP_JUCE_EXAMPLES_DIRECTORY=QzpcVXNlcnNcbWlja2xcRG93bmxvYWRzXGp1Y2UtOC4wLjQtd2luZG93c1xKVUNFXGV4YW1wbGVz;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JUCE_SHARED_CODE=1;_LIB;%(PreprocessorDefinitions)
$(OutDir)\Harmonizer.lib
@@ -97,13 +104,13 @@
true
true
Win32
-
+
Full
ProgramDatabase
..\..\..\..\..\Downloads\JUCE\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\..\Downloads\JUCE\modules;C:\Users\mickl\Downloads\juce-8.0.4-windows\JUCE\modules;%(AdditionalIncludeDirectories)
- _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_PROJUCER_VERSION=0x8000a;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_plugin_client=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_VST3_CAN_REPLACE_VST2=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_WIN_WEBVIEW2_WITH_STATIC_LINKING=1;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=1;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=1;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;JucePlugin_Enable_IAA=0;JucePlugin_Enable_ARA=0;JucePlugin_Name="Harmonizer";JucePlugin_Desc="Harmonizer";JucePlugin_Manufacturer="yourcompany";JucePlugin_ManufacturerWebsite="www.yourcompany.com";JucePlugin_ManufacturerEmail="";JucePlugin_ManufacturerCode=0x4d616e75;JucePlugin_PluginCode=0x456d6377;JucePlugin_IsSynth=0;JucePlugin_WantsMidiInput=1;JucePlugin_ProducesMidiOutput=0;JucePlugin_IsMidiEffect=0;JucePlugin_EditorRequiresKeyboardFocus=0;JucePlugin_Version=1.0.0;JucePlugin_VersionCode=0x10000;JucePlugin_VersionString="1.0.0";JucePlugin_VSTUniqueID=JucePlugin_PluginCode;JucePlugin_VSTCategory=kPlugCategEffect;JucePlugin_Vst3Category="Fx";JucePlugin_AUMainType='aufx';JucePlugin_AUSubType=JucePlugin_PluginCode;JucePlugin_AUExportPrefix=HarmonizerAU;JucePlugin_AUExportPrefixQuoted="HarmonizerAU";JucePlugin_AUManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_CFBundleIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_AAXProductId=JucePlugin_PluginCode;JucePlugin_AAXCategory=0;JucePlugin_AAXDisableBypass=0;JucePlugin_AAXDisableMultiMono=0;JucePlugin_IAAType=0x6175726d;JucePlugin_IAASubType=JucePlugin_PluginCode;JucePlugin_IAAName="yourcompany: Harmonizer";JucePlugin_VSTNumMidiInputs=16;JucePlugin_VSTNumMidiOutputs=16;JucePlugin_ARAContentTypes=0;JucePlugin_ARATransformationFlags=0;JucePlugin_ARAFactoryID="com.yourcompany.Harmonizer.factory";JucePlugin_ARADocumentArchiveID="com.yourcompany.Harmonizer.aradocumentarchive.1.0.0";JucePlugin_ARACompatibleArchiveIDs="";JUCE_STANDALONE_APPLICATION=JucePlugin_Build_Standalone;PIP_JUCE_EXAMPLES_DIRECTORY=QzpcVXNlcnNcbWlja2xcRG93bmxvYWRzXGp1Y2UtOC4wLjQtd2luZG93c1xKVUNFXGV4YW1wbGVz;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JUCE_SHARED_CODE=1;_LIB;%(PreprocessorDefinitions)
+ _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_PROJUCER_VERSION=0x8000a;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_plugin_client=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_VST3_CAN_REPLACE_VST2=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_WIN_WEBVIEW2_WITH_STATIC_LINKING=1;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=1;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=1;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;JucePlugin_Enable_IAA=0;JucePlugin_Enable_ARA=0;JucePlugin_Name="Harmonizer";JucePlugin_Desc="Harmonizer";JucePlugin_Manufacturer="yourcompany";JucePlugin_ManufacturerWebsite="www.yourcompany.com";JucePlugin_ManufacturerEmail="";JucePlugin_ManufacturerCode=0x4d616e75;JucePlugin_PluginCode=0x456d6377;JucePlugin_IsSynth=0;JucePlugin_WantsMidiInput=1;JucePlugin_ProducesMidiOutput=0;JucePlugin_IsMidiEffect=0;JucePlugin_EditorRequiresKeyboardFocus=0;JucePlugin_Version=1.0.0;JucePlugin_VersionCode=0x10000;JucePlugin_VersionString="1.0.0";JucePlugin_VSTUniqueID=JucePlugin_PluginCode;JucePlugin_VSTCategory=kPlugCategEffect;JucePlugin_Vst3Category="Fx";JucePlugin_AUMainType='aufx';JucePlugin_AUSubType=JucePlugin_PluginCode;JucePlugin_AUExportPrefix=HarmonizerAU;JucePlugin_AUExportPrefixQuoted="HarmonizerAU";JucePlugin_AUManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_CFBundleIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_AAXProductId=JucePlugin_PluginCode;JucePlugin_AAXCategory=0;JucePlugin_AAXDisableBypass=0;JucePlugin_AAXDisableMultiMono=0;JucePlugin_IAAType=0x6175726d;JucePlugin_IAASubType=JucePlugin_PluginCode;JucePlugin_IAAName="yourcompany: Harmonizer";JucePlugin_VSTNumMidiInputs=16;JucePlugin_VSTNumMidiOutputs=16;JucePlugin_ARAContentTypes=0;JucePlugin_ARATransformationFlags=0;JucePlugin_ARAFactoryID="com.yourcompany.Harmonizer.factory";JucePlugin_ARADocumentArchiveID="com.yourcompany.Harmonizer.aradocumentarchive.1.0.0";JucePlugin_ARACompatibleArchiveIDs="";JUCE_STANDALONE_APPLICATION=JucePlugin_Build_Standalone;PIP_JUCE_EXAMPLES_DIRECTORY=QzpcVXNlcnNcbWlja2xcRG93bmxvYWRzXGp1Y2UtOC4wLjQtd2luZG93c1xKVUNFXGV4YW1wbGVz;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JUCE_SHARED_CODE=1;_LIB;%(PreprocessorDefinitions)
MultiThreadedDLL
true
NotUsing
@@ -117,7 +124,7 @@
..\..\..\..\..\Downloads\JUCE\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\..\Downloads\JUCE\modules;C:\Users\mickl\Downloads\juce-8.0.4-windows\JUCE\modules;%(AdditionalIncludeDirectories)
- _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_PROJUCER_VERSION=0x8000a;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_plugin_client=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_VST3_CAN_REPLACE_VST2=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_WIN_WEBVIEW2_WITH_STATIC_LINKING=1;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=1;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=1;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;JucePlugin_Enable_IAA=0;JucePlugin_Enable_ARA=0;JucePlugin_Name=\"Harmonizer\";JucePlugin_Desc=\"Harmonizer\";JucePlugin_Manufacturer=\"yourcompany\";JucePlugin_ManufacturerWebsite=\"www.yourcompany.com\";JucePlugin_ManufacturerEmail=\"\";JucePlugin_ManufacturerCode=0x4d616e75;JucePlugin_PluginCode=0x456d6377;JucePlugin_IsSynth=0;JucePlugin_WantsMidiInput=1;JucePlugin_ProducesMidiOutput=0;JucePlugin_IsMidiEffect=0;JucePlugin_EditorRequiresKeyboardFocus=0;JucePlugin_Version=1.0.0;JucePlugin_VersionCode=0x10000;JucePlugin_VersionString=\"1.0.0\";JucePlugin_VSTUniqueID=JucePlugin_PluginCode;JucePlugin_VSTCategory=kPlugCategEffect;JucePlugin_Vst3Category=\"Fx\";JucePlugin_AUMainType='aufx';JucePlugin_AUSubType=JucePlugin_PluginCode;JucePlugin_AUExportPrefix=HarmonizerAU;JucePlugin_AUExportPrefixQuoted=\"HarmonizerAU\";JucePlugin_AUManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_CFBundleIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_AAXProductId=JucePlugin_PluginCode;JucePlugin_AAXCategory=0;JucePlugin_AAXDisableBypass=0;JucePlugin_AAXDisableMultiMono=0;JucePlugin_IAAType=0x6175726d;JucePlugin_IAASubType=JucePlugin_PluginCode;JucePlugin_IAAName=\"yourcompany: Harmonizer\";JucePlugin_VSTNumMidiInputs=16;JucePlugin_VSTNumMidiOutputs=16;JucePlugin_ARAContentTypes=0;JucePlugin_ARATransformationFlags=0;JucePlugin_ARAFactoryID=\"com.yourcompany.Harmonizer.factory\";JucePlugin_ARADocumentArchiveID=\"com.yourcompany.Harmonizer.aradocumentarchive.1.0.0\";JucePlugin_ARACompatibleArchiveIDs=\"\";JUCE_STANDALONE_APPLICATION=JucePlugin_Build_Standalone;PIP_JUCE_EXAMPLES_DIRECTORY=QzpcVXNlcnNcbWlja2xcRG93bmxvYWRzXGp1Y2UtOC4wLjQtd2luZG93c1xKVUNFXGV4YW1wbGVz;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JUCE_SHARED_CODE=1;_LIB;%(PreprocessorDefinitions)
+ _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_PROJUCER_VERSION=0x8000a;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_plugin_client=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_VST3_CAN_REPLACE_VST2=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_WIN_WEBVIEW2_WITH_STATIC_LINKING=1;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=1;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=1;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;JucePlugin_Enable_IAA=0;JucePlugin_Enable_ARA=0;JucePlugin_Name=\"Harmonizer\";JucePlugin_Desc=\"Harmonizer\";JucePlugin_Manufacturer=\"yourcompany\";JucePlugin_ManufacturerWebsite=\"www.yourcompany.com\";JucePlugin_ManufacturerEmail=\"\";JucePlugin_ManufacturerCode=0x4d616e75;JucePlugin_PluginCode=0x456d6377;JucePlugin_IsSynth=0;JucePlugin_WantsMidiInput=1;JucePlugin_ProducesMidiOutput=0;JucePlugin_IsMidiEffect=0;JucePlugin_EditorRequiresKeyboardFocus=0;JucePlugin_Version=1.0.0;JucePlugin_VersionCode=0x10000;JucePlugin_VersionString=\"1.0.0\";JucePlugin_VSTUniqueID=JucePlugin_PluginCode;JucePlugin_VSTCategory=kPlugCategEffect;JucePlugin_Vst3Category=\"Fx\";JucePlugin_AUMainType='aufx';JucePlugin_AUSubType=JucePlugin_PluginCode;JucePlugin_AUExportPrefix=HarmonizerAU;JucePlugin_AUExportPrefixQuoted=\"HarmonizerAU\";JucePlugin_AUManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_CFBundleIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXIdentifier=com.yourcompany.Harmonizer;JucePlugin_AAXManufacturerCode=JucePlugin_ManufacturerCode;JucePlugin_AAXProductId=JucePlugin_PluginCode;JucePlugin_AAXCategory=0;JucePlugin_AAXDisableBypass=0;JucePlugin_AAXDisableMultiMono=0;JucePlugin_IAAType=0x6175726d;JucePlugin_IAASubType=JucePlugin_PluginCode;JucePlugin_IAAName=\"yourcompany: Harmonizer\";JucePlugin_VSTNumMidiInputs=16;JucePlugin_VSTNumMidiOutputs=16;JucePlugin_ARAContentTypes=0;JucePlugin_ARATransformationFlags=0;JucePlugin_ARAFactoryID=\"com.yourcompany.Harmonizer.factory\";JucePlugin_ARADocumentArchiveID=\"com.yourcompany.Harmonizer.aradocumentarchive.1.0.0\";JucePlugin_ARACompatibleArchiveIDs=\"\";JUCE_STANDALONE_APPLICATION=JucePlugin_Build_Standalone;PIP_JUCE_EXAMPLES_DIRECTORY=QzpcVXNlcnNcbWlja2xcRG93bmxvYWRzXGp1Y2UtOC4wLjQtd2luZG93c1xKVUNFXGV4YW1wbGVz;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JUCE_SHARED_CODE=1;_LIB;%(PreprocessorDefinitions)
$(OutDir)\Harmonizer.lib
@@ -137,10 +144,13 @@
-
-
-
-
+
+
+
+
+
+
+
true
@@ -2916,1429 +2926,1431 @@
true
-
-
-
-
-
+
+
+
+
+
/bigobj %(AdditionalOptions)
-
-
-
+
+
+
/bigobj %(AdditionalOptions)
-
-
-
-
+
+
+
+
/bigobj %(AdditionalOptions)
-
-
+
+
/bigobj %(AdditionalOptions)
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
Static
-
\ No newline at end of file
+
diff --git a/Builds/VisualStudio2022/Harmonizer_SharedCode.vcxproj.filters b/Builds/VisualStudio2022/Harmonizer_SharedCode.vcxproj.filters
index 3e2da83..ef34919 100644
--- a/Builds/VisualStudio2022/Harmonizer_SharedCode.vcxproj.filters
+++ b/Builds/VisualStudio2022/Harmonizer_SharedCode.vcxproj.filters
@@ -1,4 +1,5 @@
-
+
+
@@ -684,6 +685,15 @@
+
+ Harmonizer\Source
+
+
+ Harmonizer\Source
+
+
+ Harmonizer\Source
+
Harmonizer\Source
@@ -828,6 +838,9 @@
JUCE Modules\juce_audio_basics
+
+ JUCE Modules\juce_audio_basics
+
JUCE Modules\juce_audio_devices\audio_io
@@ -1053,6 +1066,9 @@
JUCE Modules\juce_audio_devices\native
+
+ JUCE Modules\juce_audio_devices\native
+
JUCE Modules\juce_audio_devices\native
@@ -1086,6 +1102,9 @@
JUCE Modules\juce_audio_devices
+
+ JUCE Modules\juce_audio_devices
+
JUCE Modules\juce_audio_formats\codecs\flac\libFLAC\deduplication
@@ -1272,6 +1291,9 @@
JUCE Modules\juce_audio_formats
+
+ JUCE Modules\juce_audio_formats
+
JUCE Modules\juce_audio_plugin_client
@@ -1455,6 +1477,9 @@
JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting
+
+ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting
+
JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\vst\hosting
@@ -1500,6 +1525,9 @@
JUCE Modules\juce_audio_processors\format_types
+
+ JUCE Modules\juce_audio_processors\format_types
+
JUCE Modules\juce_audio_processors\format_types
@@ -1620,6 +1648,9 @@
JUCE Modules\juce_audio_processors
+
+ JUCE Modules\juce_audio_processors
+
JUCE Modules\juce_audio_processors
@@ -1653,21 +1684,33 @@
JUCE Modules\juce_audio_utils\gui
+
+ JUCE Modules\juce_audio_utils\native
+
JUCE Modules\juce_audio_utils\native
JUCE Modules\juce_audio_utils\native
+
+ JUCE Modules\juce_audio_utils\native
+
JUCE Modules\juce_audio_utils\native
JUCE Modules\juce_audio_utils\native
+
+ JUCE Modules\juce_audio_utils\native
+
JUCE Modules\juce_audio_utils\native
+
+ JUCE Modules\juce_audio_utils\native
+
JUCE Modules\juce_audio_utils\native
@@ -1680,6 +1723,9 @@
JUCE Modules\juce_audio_utils
+
+ JUCE Modules\juce_audio_utils
+
JUCE Modules\juce_core\containers
@@ -1818,6 +1864,9 @@
JUCE Modules\juce_core\native
+
+ JUCE Modules\juce_core\native
+
JUCE Modules\juce_core\native
@@ -1839,27 +1888,42 @@
JUCE Modules\juce_core\native
+
+ JUCE Modules\juce_core\native
+
JUCE Modules\juce_core\native
+
+ JUCE Modules\juce_core\native
+
JUCE Modules\juce_core\native
JUCE Modules\juce_core\native
+
+ JUCE Modules\juce_core\native
+
JUCE Modules\juce_core\native
JUCE Modules\juce_core\native
+
+ JUCE Modules\juce_core\native
+
JUCE Modules\juce_core\native
JUCE Modules\juce_core\native
+
+ JUCE Modules\juce_core\native
+
JUCE Modules\juce_core\native
@@ -1872,6 +1936,9 @@
JUCE Modules\juce_core\native
+
+ JUCE Modules\juce_core\native
+
JUCE Modules\juce_core\native
@@ -2040,6 +2107,9 @@
JUCE Modules\juce_core
+
+ JUCE Modules\juce_core
+
JUCE Modules\juce_core
@@ -2073,6 +2143,9 @@
JUCE Modules\juce_data_structures
+
+ JUCE Modules\juce_data_structures
+
JUCE Modules\juce_dsp\containers
@@ -2178,6 +2251,9 @@
JUCE Modules\juce_dsp
+
+ JUCE Modules\juce_dsp
+
JUCE Modules\juce_events\broadcasters
@@ -2217,6 +2293,12 @@
JUCE Modules\juce_events\messages
+
+ JUCE Modules\juce_events\native
+
+
+ JUCE Modules\juce_events\native
+
JUCE Modules\juce_events\native
@@ -2241,6 +2323,9 @@
JUCE Modules\juce_events
+
+ JUCE Modules\juce_events
+
JUCE Modules\juce_graphics\colour
@@ -2763,6 +2848,9 @@
JUCE Modules\juce_graphics\images
+
+ JUCE Modules\juce_graphics\native
+
JUCE Modules\juce_graphics\native
@@ -2793,6 +2881,9 @@
JUCE Modules\juce_graphics\native
+
+ JUCE Modules\juce_graphics\native
+
JUCE Modules\juce_graphics\native
@@ -2892,6 +2983,9 @@
JUCE Modules\juce_graphics
+
+ JUCE Modules\juce_graphics
+
JUCE Modules\juce_graphics
@@ -3168,12 +3262,21 @@
JUCE Modules\juce_gui_basics\native\accessibility
+
+ JUCE Modules\juce_gui_basics\native\accessibility
+
+
+ JUCE Modules\juce_gui_basics\native\accessibility
+
JUCE Modules\juce_gui_basics\native\accessibility
JUCE Modules\juce_gui_basics\native\accessibility
+
+ JUCE Modules\juce_gui_basics\native\accessibility
+
JUCE Modules\juce_gui_basics\native\accessibility
@@ -3195,33 +3298,63 @@
JUCE Modules\juce_gui_basics\native
+
+ JUCE Modules\juce_gui_basics\native
+
JUCE Modules\juce_gui_basics\native
+
+ JUCE Modules\juce_gui_basics\native
+
JUCE Modules\juce_gui_basics\native
+
+ JUCE Modules\juce_gui_basics\native
+
+
+ JUCE Modules\juce_gui_basics\native
+
JUCE Modules\juce_gui_basics\native
+
+ JUCE Modules\juce_gui_basics\native
+
JUCE Modules\juce_gui_basics\native
+
+ JUCE Modules\juce_gui_basics\native
+
JUCE Modules\juce_gui_basics\native
+
+ JUCE Modules\juce_gui_basics\native
+
JUCE Modules\juce_gui_basics\native
+
+ JUCE Modules\juce_gui_basics\native
+
JUCE Modules\juce_gui_basics\native
JUCE Modules\juce_gui_basics\native
+
+ JUCE Modules\juce_gui_basics\native
+
JUCE Modules\juce_gui_basics\native
+
+ JUCE Modules\juce_gui_basics\native
+
JUCE Modules\juce_gui_basics\native
@@ -3231,9 +3364,15 @@
JUCE Modules\juce_gui_basics\native
+
+ JUCE Modules\juce_gui_basics\native
+
JUCE Modules\juce_gui_basics\native
+
+ JUCE Modules\juce_gui_basics\native
+
JUCE Modules\juce_gui_basics\native
@@ -3375,6 +3514,9 @@
JUCE Modules\juce_gui_basics
+
+ JUCE Modules\juce_gui_basics
+
JUCE Modules\juce_gui_extra\code_editor
@@ -3435,9 +3577,15 @@
JUCE Modules\juce_gui_extra\native
+
+ JUCE Modules\juce_gui_extra\native
+
JUCE Modules\juce_gui_extra\native
+
+ JUCE Modules\juce_gui_extra\native
+
JUCE Modules\juce_gui_extra\native
@@ -3456,12 +3604,18 @@
JUCE Modules\juce_gui_extra\native
+
+ JUCE Modules\juce_gui_extra\native
+
JUCE Modules\juce_gui_extra\native
JUCE Modules\juce_gui_extra\native
+
+ JUCE Modules\juce_gui_extra\native
+
JUCE Modules\juce_gui_extra\native
@@ -3471,6 +3625,9 @@
JUCE Modules\juce_gui_extra
+
+ JUCE Modules\juce_gui_extra
+
JUCE Library Code
@@ -3533,6 +3690,15 @@
Harmonizer\Assets
+
+ Harmonizer\Source
+
+
+ Harmonizer\Source
+
+
+ Harmonizer\Source
+
Harmonizer\Source
@@ -7592,7 +7758,7 @@
JUCE Modules\juce_gui_extra\native
-
+
JUCE Modules\juce_gui_extra
@@ -7681,6 +7847,6 @@
JUCE Modules\juce_graphics\unicode\sheenbidi
-
+
-
\ No newline at end of file
+
diff --git a/Harmonizer.jucer b/Harmonizer.jucer
index 634993a..f78cda7 100644
--- a/Harmonizer.jucer
+++ b/Harmonizer.jucer
@@ -10,6 +10,13 @@
resource="1" file="Assets/webviewplugin-gui-fallback.html"/>
+
+
+
+
+
+
diff --git a/Source/Shifter.cpp b/Source/Shifter.cpp
index f2651dd..2286994 100644
--- a/Source/Shifter.cpp
+++ b/Source/Shifter.cpp
@@ -20,9 +20,9 @@ void Shifter::Init()
volume = 1;
helm.setframesize(1024);
helm.setoverlap(1);
- for (int i = 0; i < MAX_VOICES + 1; ++i)
+ for (int i = 0; i < MAX_VOICES; ++i)
{
- out_midi[i] = -1;
+ voices[i].Init(48000);
}
for (int i = 0; i < BUFFER_SIZE; ++i)
{
@@ -33,7 +33,6 @@ void Shifter::Init()
for (int i = 0; i < 8192; ++i) {
cos_lookup[i] = cos(2 * PI_F * i / 8192.0);
}
- out_panning[MAX_VOICES] = 0.5f;
}
void Shifter::Process(const float* const* in,
@@ -104,22 +103,25 @@ void Shifter::DetectPitch(const float* const* in, float** out, size_t size)
if (midi != last_autotune_midi) {
last_autotune_midi = midi;
- out_periods[MAX_VOICES] = in_period;
+ out_period = in_period;
}
- float error = target_out_period - out_periods[MAX_VOICES];
+ float error = target_out_period - out_period;
float adjustment = error * out_period_filter_amount;
//target_out_period = in_period * out_period_filter_amount + target_out_period * (1 - out_period_filter_amount);
- out_midi[MAX_VOICES] = midi;
- out_periods[MAX_VOICES] += adjustment;
+ out_midi = midi;
+ out_period += adjustment;
}
void Shifter::SetRates() {}
float Shifter::GetOutputEnvelopePeriod(int out_voice) {
+ if (out_voice >= MAX_VOICES) {
+ return in_period * formant_preserve + out_period *(1.0 - formant_preserve);
+ }
//TODO add something so that low pitch ratios end up reducing formant_preservation
- return in_period * formant_preserve + out_periods[out_voice] * (1.0 - formant_preserve);
+ return in_period * formant_preserve + voices[out_voice].CurrentPeriod() * (1.0 - formant_preserve);
}
int Shifter::GetPeakIndex() {
@@ -198,8 +200,16 @@ void Shifter::AddInterpolatedFrame(int voice, int max_index, float resampling_pe
float interp = f_index - (int)f_index;
mult = .5 * (1 - cos_lookup[(int)((float)j / (resampling_period * 2.0) * 8191.0)]);
float value = ((1 - interp) * in_buffer[(int)f_index] + (interp)*in_buffer[(int)(f_index + 1) % 8192]) * mult;
- out_buffer[0][out_index] += value * (1 - out_panning[voice]);
- out_buffer[1][out_index] += value * out_panning[voice];
+ if(voice >= MAX_VOICES) {
+ //value *= volume;
+ out_buffer[0][out_index] += value;
+ out_buffer[1][out_index] += value;
+ } else {
+ value *= voices[voice].CurrentAmplitude() * volume;
+ out_buffer[0][out_index] += value * voices[voice].GetPanning(0);
+ out_buffer[1][out_index] += value * voices[voice].GetPanning(1);
+ }
+
f_index += period_ratio;
@@ -220,13 +230,12 @@ void Shifter::GetSamples(float** output, const float* input, size_t size)
{
//add new samples if necessary
- for (int out_p = 0; out_p < MAX_VOICES + 1; ++out_p)
+ for (int out_p = 0; out_p < MAX_VOICES; ++out_p)
{
- if (out_midi[out_p] == -1) continue;
- if (out_period_counters[out_p] > out_periods[out_p])
+ if (!voices[out_p].IsActive()) continue;
+ voices[out_p].Process();
+ if (voices[out_p].PeriodOverflow())
{
- out_period_counters[out_p] -= out_periods[out_p];
-
float resampling_period = GetOutputEnvelopePeriod(out_p);
@@ -237,6 +246,19 @@ void Shifter::GetSamples(float** output, const float* input, size_t size)
AddInterpolatedFrame(out_p, max_index, resampling_period);
}
}
+ if (out_period_counter > out_period)
+ {
+ out_period_counter -= out_period;
+ float resampling_period = GetOutputEnvelopePeriod(MAX_VOICES);
+
+
+
+ //find the start index
+ int max_index = GetPeakIndex();
+
+ //add samples centered on that max
+ AddInterpolatedFrame(MAX_VOICES, max_index, resampling_period);
+ }
//add input samples
in_buffer[in_playhead] = input[i];
@@ -256,27 +278,20 @@ void Shifter::GetSamples(float** output, const float* input, size_t size)
{
out_playhead -= BUFFER_SIZE;
}
- for (int out_p = 0; out_p < MAX_VOICES + 1; ++out_p)
- {
- if (out_midi[out_p] == -1) continue;
- out_period_counters[out_p] += 1;
- }
+ out_period_counter++;
}
}
void Shifter::AddMidiNote(int note) {
for (int i = 0; i < MAX_VOICES; ++i) {
- if (out_midi[i] == note) {
+ if (voices[i].IsActive() && voices[i].GetMidiNote() == note) {
return;
}
}
for (int i = 0; i < MAX_VOICES; ++i) {
- if (out_midi[i] == -1) {
- out_midi[i] = note;
- out_periods[i] = 48000.0f / mtof(note);
- out_period_counters[i] = 0;
- out_panning[i] = rand() / (float)RAND_MAX;
+ if (!voices[i].IsActive()) {
+ voices[i].Trigger(note);
return;
}
}
@@ -285,8 +300,8 @@ void Shifter::AddMidiNote(int note) {
void Shifter::RemoveMidiNote(int note) {
for (int i = 0; i < MAX_VOICES; ++i) {
- if (out_midi[i] == note) {
- out_midi[i] = -1;
+ if (voices[i].IsActive() && voices[i].GetMidiNote() == note) {
+ voices[i].Release();
return;
}
}
diff --git a/Source/Shifter.h b/Source/Shifter.h
index 2feb368..b8f840a 100644
--- a/Source/Shifter.h
+++ b/Source/Shifter.h
@@ -2,6 +2,7 @@
#define SHIFTER_H
#include "Helmholtz.h"
+#include "shifter_voice.h"
#define BUFFER_SIZE 8192
#define MAX_VOICES 12
@@ -84,7 +85,7 @@ public:
void SetFormantPreserve(float val) { formant_preserve = val; }
void SetAutoTuneSpeed(float val) { out_period_filter_amount = 1 - val; }
- int out_midi[MAX_VOICES + 1] = { -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 };
+ int out_midi = -1;
private:
void DetectPitch(const float* const* in, float** out, size_t size);
@@ -133,11 +134,12 @@ private:
int last_autotune_midi = -1;
float out_period_filter_amount = 0.7f; // You can expose this as a parameter
+
+ ShifterVoice voices[MAX_VOICES];
- float out_periods[MAX_VOICES + 1] = { 0,0,0,0,0,0,0,0,0,0,0,0 }; //C3
- float out_panning[MAX_VOICES + 1] = { 0,0,0,0,0,0,0,0,0,0,0,.5 }; //C3
+ float out_period = 0; //C3
float in_period = 366.936;
- float out_period_counters[MAX_VOICES + 1] = { 0,0,0,0,0,0,0,0,0,0,0,0 };
+ float out_period_counter = 0;
float cos_lookup[8192];
};
#endif
\ No newline at end of file
diff --git a/Source/WebViewPluginDemo.h b/Source/WebViewPluginDemo.h
index 4ad796d..459973f 100644
--- a/Source/WebViewPluginDemo.h
+++ b/Source/WebViewPluginDemo.h
@@ -288,7 +288,7 @@ WebViewPluginAudioProcessor::WebViewPluginAudioProcessor(AudioProcessorValueTree
void WebViewPluginAudioProcessor::prepareToPlay(double sampleRate, int samplesPerBlock)
{
const auto channels = std::max(getTotalNumInputChannels(), getTotalNumOutputChannels());
-
+ shifter.Init();
if (channels == 0)
return;
@@ -335,7 +335,7 @@ void WebViewPluginAudioProcessor::processBlock(juce::AudioBuffer& buffer,
{
//DBG(shifter.out_midi[MAX_VOICES]);
//push midi note
- spectralBars.push(shifter.out_midi[MAX_VOICES]);
+ //spectralBars.push(shifter.out_midi[MAX_VOICES]);
const SpinLock::ScopedTryLockType lock(spectrumDataLock);
if (!lock.isLocked())
diff --git a/Source/adsr.cpp b/Source/adsr.cpp
new file mode 100644
index 0000000..708c232
--- /dev/null
+++ b/Source/adsr.cpp
@@ -0,0 +1,148 @@
+/*
+ ==============================================================================
+
+ adsr.cpp
+ Created: 25 Oct 2025 2:09:32pm
+ Author: mickl
+
+ ==============================================================================
+*/
+
+#include "adsr.h"
+#include "math.h"
+
+#ifndef M_E
+#define M_E 2.71828182845904523536
+#endif
+
+
+void Adsr::Init(float sample_rate, int blockSize)
+{
+ sample_rate_ = sample_rate / blockSize;
+ attackShape_ = -1.f;
+ attackTarget_ = 0.0f;
+ attackTime_ = -1.f;
+ decayTime_ = -1.f;
+ releaseTime_ = -1.f;
+ sus_level_ = 0.7f;
+ x_ = 0.0f;
+ gate_ = false;
+ mode_ = ADSR_SEG_IDLE;
+
+ SetTime(ADSR_SEG_ATTACK, 0.1f);
+ SetTime(ADSR_SEG_DECAY, 0.1f);
+ SetTime(ADSR_SEG_RELEASE, 0.1f);
+}
+
+void Adsr::Retrigger(bool hard)
+{
+ mode_ = ADSR_SEG_ATTACK;
+ if (hard)
+ x_ = 0.f;
+}
+
+void Adsr::SetTime(int seg, float time)
+{
+ switch (seg)
+ {
+ case ADSR_SEG_ATTACK: SetAttackTime(time, 0.0f); break;
+ case ADSR_SEG_DECAY:
+ {
+ SetTimeConstant(time, decayTime_, decayD0_);
+ }
+ break;
+ case ADSR_SEG_RELEASE:
+ {
+ SetTimeConstant(time, releaseTime_, releaseD0_);
+ }
+ break;
+ default: return;
+ }
+}
+
+void Adsr::SetAttackTime(float timeInS, float shape)
+{
+ if ((timeInS != attackTime_) || (shape != attackShape_))
+ {
+ attackTime_ = timeInS;
+ attackShape_ = shape;
+ if (timeInS > 0.f)
+ {
+ float x = shape;
+ float target = 9.f * powf(x, 10.f) + 0.3f * x + 1.01f;
+ attackTarget_ = target;
+ float logTarget = logf(1.f - (1.f / target)); // -1 for decay
+ attackD0_ = 1.f - expf(logTarget / (timeInS * sample_rate_));
+ }
+ else
+ attackD0_ = 1.f; // instant change
+ }
+}
+void Adsr::SetDecayTime(float timeInS)
+{
+ SetTimeConstant(timeInS, decayTime_, decayD0_);
+}
+void Adsr::SetReleaseTime(float timeInS)
+{
+ SetTimeConstant(timeInS, releaseTime_, releaseD0_);
+}
+
+
+void Adsr::SetTimeConstant(float timeInS, float& time, float& coeff)
+{
+ if (timeInS != time)
+ {
+ time = timeInS;
+ if (time > 0.f)
+ {
+ const float target = logf(1. / M_E);
+ coeff = 1.f - expf(target / (time * sample_rate_));
+ }
+ else
+ coeff = 1.f; // instant change
+ }
+}
+
+
+float Adsr::Process(bool gate)
+{
+ float out = 0.0f;
+
+ if (gate && !gate_) // rising edge
+ mode_ = ADSR_SEG_ATTACK;
+ else if (!gate && gate_) // falling edge
+ mode_ = ADSR_SEG_RELEASE;
+ gate_ = gate;
+
+ float D0(attackD0_);
+ if (mode_ == ADSR_SEG_DECAY)
+ D0 = decayD0_;
+ else if (mode_ == ADSR_SEG_RELEASE)
+ D0 = releaseD0_;
+
+ float target = mode_ == ADSR_SEG_DECAY ? sus_level_ : -0.01f;
+ switch (mode_)
+ {
+ case ADSR_SEG_IDLE: out = 0.0f; break;
+ case ADSR_SEG_ATTACK:
+ x_ += D0 * (attackTarget_ - x_);
+ out = x_;
+ if (out > 1.f)
+ {
+ x_ = out = 1.f;
+ mode_ = ADSR_SEG_DECAY;
+ }
+ break;
+ case ADSR_SEG_DECAY:
+ case ADSR_SEG_RELEASE:
+ x_ += D0 * (target - x_);
+ out = x_;
+ if (out < 0.0f)
+ {
+ x_ = out = 0.f;
+ mode_ = ADSR_SEG_IDLE;
+ }
+ default: break;
+ }
+ return out;
+}
\ No newline at end of file
diff --git a/Source/adsr.h b/Source/adsr.h
new file mode 100644
index 0000000..2d86967
--- /dev/null
+++ b/Source/adsr.h
@@ -0,0 +1,98 @@
+/*
+ ==============================================================================
+
+ adsr.h
+ Created: 25 Oct 2025 2:09:32pm
+ Author: mickl
+
+ ==============================================================================
+*/
+
+#pragma once
+#include
+/** Distinct stages that the phase of the envelope can be located in.
+- IDLE = located at phase location 0, and not currently running
+- ATTACK = First segment of envelope where phase moves from 0 to 1
+- DECAY = Second segment of envelope where phase moves from 1 to SUSTAIN value
+- RELEASE = Fourth segment of envelop where phase moves from SUSTAIN to 0
+*/
+enum
+{
+ ADSR_SEG_IDLE = 0,
+ ADSR_SEG_ATTACK = 1,
+ ADSR_SEG_DECAY = 2,
+ ADSR_SEG_RELEASE = 4
+};
+
+
+/** adsr envelope module
+
+Original author(s) : Paul Batchelor
+
+Ported from Soundpipe by Ben Sergentanis, May 2020
+
+Remake by Steffan DIedrichsen, May 2021
+*/
+class Adsr
+{
+public:
+ Adsr() {}
+ ~Adsr() {}
+ /** Initializes the Adsr module.
+ \param sample_rate - The sample rate of the audio engine being run.
+ */
+ void Init(float sample_rate, int blockSize = 1);
+ /**
+ \function Retrigger forces the envelope back to attack phase
+ \param hard resets the history to zero, results in a click.
+ */
+ void Retrigger(bool hard);
+ /** Processes one sample through the filter and returns one sample.
+ \param gate - trigger the envelope, hold it to sustain
+ */
+ float Process(bool gate);
+ /** Sets time
+ Set time per segment in seconds
+ */
+ void SetTime(int seg, float time);
+ void SetAttackTime(float timeInS, float shape = 0.0f);
+ void SetDecayTime(float timeInS);
+ void SetReleaseTime(float timeInS);
+
+private:
+ void SetTimeConstant(float timeInS, float& time, float& coeff);
+
+public:
+ /** Sustain level
+ \param sus_level - sets sustain level, 0...1.0
+ */
+ inline void SetSustainLevel(float sus_level)
+ {
+ sus_level = (sus_level <= 0.f) ? -0.01f // forces envelope into idle
+ : (sus_level > 1.f) ? 1.f : sus_level;
+ sus_level_ = sus_level;
+ }
+ /** get the current envelope segment
+ \return the segment of the envelope that the phase is currently located in.
+ */
+ inline uint8_t GetCurrentSegment() { return mode_; }
+ /** Tells whether envelope is active
+ \return true if the envelope is currently in any stage apart from idle.
+ */
+ inline bool IsRunning() const { return mode_ != ADSR_SEG_IDLE; }
+
+private:
+ float sus_level_{ 0.f };
+ float x_{ 0.f };
+ float attackShape_{ -1.f };
+ float attackTarget_{ 0.0f };
+ float attackTime_{ -1.0f };
+ float decayTime_{ -1.0f };
+ float releaseTime_{ -1.0f };
+ float attackD0_{ 0.f };
+ float decayD0_{ 0.f };
+ float releaseD0_{ 0.f };
+ int sample_rate_;
+ uint8_t mode_{ ADSR_SEG_IDLE };
+ bool gate_{ false };
+};
\ No newline at end of file
diff --git a/Source/port.cpp b/Source/port.cpp
new file mode 100644
index 0000000..7d700e0
--- /dev/null
+++ b/Source/port.cpp
@@ -0,0 +1,34 @@
+/*
+ ==============================================================================
+
+ port.cpp
+ Created: 25 Oct 2025 2:09:16pm
+ Author: mickl
+
+ ==============================================================================
+*/
+
+#include "port.h"
+#include "math.h"
+
+void Port::Init(float sample_rate, float htime)
+{
+ yt1_ = 0;
+ prvhtim_ = -100.0;
+ htime_ = htime;
+
+ sample_rate_ = sample_rate;
+ onedsr_ = 1.0 / sample_rate_;
+}
+
+float Port::Process(float in)
+{
+ if (prvhtim_ != htime_)
+ {
+ c2_ = powf(0.5, onedsr_ / htime_);
+ c1_ = 1.0 - c2_;
+ prvhtim_ = htime_;
+ }
+
+ return yt1_ = c1_ * in + c2_ * yt1_;
+}
\ No newline at end of file
diff --git a/Source/port.h b/Source/port.h
new file mode 100644
index 0000000..6f9f379
--- /dev/null
+++ b/Source/port.h
@@ -0,0 +1,42 @@
+/*
+ ==============================================================================
+
+ port.h
+ Created: 25 Oct 2025 2:09:16pm
+ Author: mickl
+
+ ==============================================================================
+*/
+
+#pragma once
+class Port
+{
+public:
+ Port() {}
+ ~Port() {}
+ /** Initializes Port module
+
+ \param sample_rate: sample rate of audio engine
+ \param htime: half-time of the function, in seconds.
+ */
+
+ void Init(float sample_rate, float htime);
+
+ /** Applies portamento to input signal and returns processed signal.
+ \return slewed output signal
+ */
+ float Process(float in);
+
+
+ /** Sets htime
+ */
+ inline void SetHtime(float htime) { htime_ = htime; }
+ /** returns current value of htime
+ */
+ inline float GetHtime() { return htime_; }
+
+private:
+ float htime_;
+ float c1_, c2_, yt1_, prvhtim_;
+ float sample_rate_, onedsr_;
+};
\ No newline at end of file
diff --git a/Source/shifter_voice.cpp b/Source/shifter_voice.cpp
new file mode 100644
index 0000000..4991a35
--- /dev/null
+++ b/Source/shifter_voice.cpp
@@ -0,0 +1,91 @@
+/*
+ ==============================================================================
+
+ shifter_voice.cpp
+ Created: 25 Oct 2025 2:09:42pm
+ Author: mickl
+
+ ==============================================================================
+*/
+
+#include "shifter_voice.h"
+
+
+static inline float mtof(float m)
+{
+ return powf(2, (m - 69.0f) / 12.0f) * 440.0f;
+}
+
+
+void ShifterVoice::Init(float sample_rate) {
+ portamento_.Init(sample_rate, 0.05f); //default portamento time
+ amplitude_envelope_.Init(sample_rate);
+ amplitude_envelope_.SetAttackTime(0.2f);
+ amplitude_envelope_.SetDecayTime(0.2f);
+ amplitude_envelope_.SetReleaseTime(1.0f);
+ onoff_ = false;
+ overflow_ = false;
+ current_midi = 60;
+ current_period_ = 48000.0f / mtof((float)current_midi);
+ current_amplitude = 0.0f;
+ period_counter = 0.0f;
+ panning = 0.5f;
+}
+
+
+bool ShifterVoice::IsActive() { return amplitude_envelope_.IsRunning(); }
+
+void ShifterVoice::Trigger(int midi_note) {
+ current_midi = midi_note;
+ // Retrigger envelope
+ amplitude_envelope_.Retrigger(false);
+ onoff_ = true;
+ panning = rand() / (float)RAND_MAX;
+}
+
+void ShifterVoice::Release() {
+ onoff_ = false;
+}
+
+void ShifterVoice::Process() {
+ current_amplitude = amplitude_envelope_.Process(onoff_);
+ current_period_ = 48000.0f / mtof(portamento_.Process((float)current_midi));
+ period_counter++;
+ overflow_ = period_counter >= current_period_;
+ if (overflow_) {
+ period_counter -= current_period_;
+ }
+}
+
+float ShifterVoice::CurrentAmplitude() {
+ return current_amplitude;
+}
+
+float ShifterVoice::CurrentPeriod() {
+ return current_period_;
+}
+
+bool ShifterVoice::PeriodOverflow() {
+ return overflow_;
+}
+
+void ShifterVoice::SetPortamentoTime(float time) {
+ portamento_.SetHtime(time);
+}
+
+void ShifterVoice::SetAdsrTimes(float attack, float decay, float release) {
+ amplitude_envelope_.SetAttackTime(attack);
+ amplitude_envelope_.SetDecayTime(decay);
+ amplitude_envelope_.SetReleaseTime(release);
+ amplitude_envelope_.SetSustainLevel(1.0);
+}
+
+float ShifterVoice::GetPanning(int channel) const {
+ switch (channel) {
+ default:
+ case 0:
+ return panning < .5 ? 1.0 : 2.0f - (panning * 2.0f);
+ case 1:
+ return panning > .5 ? 1.0 : panning * 2.0f;
+ }
+}
\ No newline at end of file
diff --git a/Source/shifter_voice.h b/Source/shifter_voice.h
new file mode 100644
index 0000000..029b945
--- /dev/null
+++ b/Source/shifter_voice.h
@@ -0,0 +1,46 @@
+/*
+ ==============================================================================
+
+ shifter_voice.h
+ Created: 25 Oct 2025 2:09:42pm
+ Author: mickl
+
+ ==============================================================================
+*/
+
+#pragma once
+
+#include "adsr.h"
+#include "port.h"
+#include "math.h"
+#include
+#include
+
+class ShifterVoice {
+public:
+ ShifterVoice() {}
+ ~ShifterVoice() {}
+ void Init(float sample_rate);
+ bool IsActive();
+ void Trigger(int midi_note);
+ void Release();
+ void Process();
+ float CurrentAmplitude();
+ float CurrentPeriod();
+ bool PeriodOverflow();
+ void SetPortamentoTime(float time);
+ void SetAdsrTimes(float attack, float decay, float release);
+ float GetPanning(int channel) const;
+ int GetMidiNote() const { return current_midi; }
+
+private:
+ Port portamento_;
+ Adsr amplitude_envelope_;
+ bool onoff_;
+ bool overflow_;
+ int current_midi;
+ float current_period_;
+ float current_amplitude;
+ float period_counter;
+ float panning;
+};
\ No newline at end of file