From 027035e47cb761d5ebc2faa81a68beed18db7b13 Mon Sep 17 00:00:00 2001 From: asb2m10 Date: Tue, 11 Feb 2014 21:06:08 -0500 Subject: [PATCH] Multi-cartridge save --- .../UserInterfaceState.xcuserstate | Bin 89204 -> 89533 bytes Builds/VisualStudio2012/Dexed.sln | 12 +- Builds/VisualStudio2012/Dexed.vcxproj | 1041 +++---- Builds/VisualStudio2012/Dexed.vcxproj.filters | 88 +- Builds/VisualStudio2013/Dexed.sln | 19 + Builds/VisualStudio2013/Dexed.vcxproj | 1543 ++++++++++ Builds/VisualStudio2013/Dexed.vcxproj.filters | 2657 +++++++++++++++++ Builds/VisualStudio2013/resources.rc | 30 + Dexed.jucer | 22 + README.md | 17 +- Source/DXComponents.cpp | 2 +- Source/GlobalEditor.cpp | 116 +- Source/GlobalEditor.h | 12 +- Source/PluginData.cpp | 169 +- Source/PluginData.h | 46 + Source/PluginEditor.cpp | 198 +- Source/PluginEditor.h | 13 +- Source/PluginFx.cpp | 0 Source/PluginFx.h | 0 Source/PluginParam.cpp | 5 - Source/PluginProcessor.h | 12 +- 21 files changed, 5174 insertions(+), 828 deletions(-) create mode 100644 Builds/VisualStudio2013/Dexed.sln create mode 100644 Builds/VisualStudio2013/Dexed.vcxproj create mode 100644 Builds/VisualStudio2013/Dexed.vcxproj.filters create mode 100644 Builds/VisualStudio2013/resources.rc mode change 100644 => 100755 Source/PluginData.cpp mode change 100644 => 100755 Source/PluginData.h mode change 100644 => 100755 Source/PluginFx.cpp mode change 100644 => 100755 Source/PluginFx.h diff --git a/Builds/MacOSX/Dexed.xcodeproj/project.xcworkspace/xcuserdata/asb2m10.xcuserdatad/UserInterfaceState.xcuserstate b/Builds/MacOSX/Dexed.xcodeproj/project.xcworkspace/xcuserdata/asb2m10.xcuserdatad/UserInterfaceState.xcuserstate index b2f594e4e997107de3041eb52d5aafb2a4ade47e..9957ef142f4ef9e7fe1f9b189aa7df0cae2d4cd8 100644 GIT binary patch literal 89533 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%0DDU^AE}f9mYN2lUYYAdcWTPT~w=!Cd*r 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 literal 89204 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 + + Debug Win32 - - Debug - x64 - Release Win32 - - Release - x64 - {1A9EF105-5BF5-9FB6-9634-A91A6D840866} v110 - + DynamicLibrary false MultiByte v110 - - DynamicLibrary - false - MultiByte - v110 - DynamicLibrary false @@ -42,17 +29,11 @@ true v110 - - DynamicLibrary - false - MultiByte - true - v110 - - - + + - + v110 @@ -61,14 +42,10 @@ <_ProjectFileVersion>10.0.30319.1 .\Debug\ Dexed - Dexed true - true .\Release\ Dexed - Dexed true - true v110 @@ -77,7 +54,7 @@ true true Win32 - + Disabled @@ -86,7 +63,7 @@ WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2012_78A501F=1;%(PreprocessorDefinitions) MultiThreadedDebug true - + $(IntDir)\ $(IntDir)\ $(IntDir)\ @@ -113,55 +90,13 @@ $(IntDir)\Dexed.bsc - - - _DEBUG;%(PreprocessorDefinitions) - true - true - - - - - Disabled - ProgramDatabase - ..\..\JuceLibraryCode;..\..\JuceLibraryCode\modules;C:\work\vstsdk2.4;%(AdditionalIncludeDirectories) - WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2012_78A501F=1;%(PreprocessorDefinitions) - MultiThreadedDebug - true - - - $(IntDir)\ - $(IntDir)\ - $(IntDir)\ - Level4 - true - true - - - _DEBUG;%(PreprocessorDefinitions) - - - $(OutDir)\Dexed.dll - true - libcmt.lib; msvcrt.lib;;%(IgnoreSpecificDefaultLibraries) - true - $(IntDir)\Dexed.pdb - Windows - false - true - - - true - $(IntDir)\Dexed.bsc - - NDEBUG;%(PreprocessorDefinitions) true true Win32 - + MinSpace @@ -169,7 +104,7 @@ WIN32;_WINDOWS;NDEBUG;JUCER_VS2012_78A501F=1;%(PreprocessorDefinitions) MultiThreaded true - + $(IntDir)\ $(IntDir)\ $(IntDir)\ @@ -197,67 +132,25 @@ $(IntDir)\Dexed.bsc - - - NDEBUG;%(PreprocessorDefinitions) - true - true - - - - - MinSpace - ..\..\JuceLibraryCode;..\..\JuceLibraryCode\modules;C:\work\vstsdk2.4;%(AdditionalIncludeDirectories) - WIN32;_WINDOWS;NDEBUG;JUCER_VS2012_78A501F=1;%(PreprocessorDefinitions) - MultiThreaded - true - - - $(IntDir)\ - $(IntDir)\ - $(IntDir)\ - Level4 - true - true - - - NDEBUG;%(PreprocessorDefinitions) - - - $(OutDir)\Dexed.dll - true - %(IgnoreSpecificDefaultLibraries) - false - $(IntDir)\Dexed.pdb - Windows - true - true - true - - - true - $(IntDir)\Dexed.bsc - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + true @@ -1188,20 +1081,20 @@ true - - - - - - - - - - - - - - + + + + + + + + + + + + + + StdCall @@ -1217,434 +1110,434 @@ StdCall - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + - + - - - \ No newline at end of file + + + diff --git a/Builds/VisualStudio2012/Dexed.vcxproj.filters b/Builds/VisualStudio2012/Dexed.vcxproj.filters index 2ad191a..3569e1b 100644 --- a/Builds/VisualStudio2012/Dexed.vcxproj.filters +++ b/Builds/VisualStudio2012/Dexed.vcxproj.filters @@ -1,4 +1,5 @@ - + + @@ -375,6 +376,9 @@ Juce Modules\juce_audio_basics\synthesisers + + Juce Modules\juce_audio_plugin_client\AU + Juce Modules\juce_audio_plugin_client\RTAS @@ -390,12 +394,21 @@ Juce Modules\juce_audio_plugin_client\RTAS + + Juce Modules\juce_audio_plugin_client\RTAS + Juce Modules\juce_audio_plugin_client\VST + + Juce Modules\juce_audio_plugin_client\VST + Juce Modules\juce_audio_plugin_client\AAX + + Juce Modules\juce_audio_plugin_client\AAX + Juce Modules\juce_audio_plugin_client\utility @@ -420,6 +433,9 @@ Juce Modules\juce_audio_processors\format + + Juce Modules\juce_audio_processors\format_types + Juce Modules\juce_audio_processors\format_types @@ -654,6 +670,21 @@ 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 @@ -723,9 +754,15 @@ Juce Modules\juce_events\native + + Juce Modules\juce_events\native + Juce Modules\juce_events\native + + Juce Modules\juce_events\native + Juce Modules\juce_events\native @@ -825,6 +862,12 @@ Juce Modules\juce_graphics\native + + Juce Modules\juce_graphics\native + + + Juce Modules\juce_graphics\native + Juce Modules\juce_graphics\native @@ -1179,6 +1222,12 @@ Juce Modules\juce_gui_basics\native + + Juce Modules\juce_gui_basics\native + + + Juce Modules\juce_gui_basics\native + Juce Modules\juce_gui_basics\native @@ -1188,6 +1237,21 @@ 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 @@ -1233,15 +1297,27 @@ 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 + Juce Modules\juce_gui_extra\native + + Juce Modules\juce_gui_extra\native + Juce Modules\juce_gui_extra\native @@ -1311,14 +1387,6 @@ Juce Library Code - - - - - - - - @@ -2586,4 +2654,4 @@ Juce Library Code - \ No newline at end of file + diff --git a/Builds/VisualStudio2013/Dexed.sln b/Builds/VisualStudio2013/Dexed.sln new file mode 100644 index 0000000..f589162 --- /dev/null +++ b/Builds/VisualStudio2013/Dexed.sln @@ -0,0 +1,19 @@ +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2013 +Project("{BD26B4C3-163D-4785-A63F-D3E66858BFF3}") = "Dexed", "Dexed.vcxproj", "{1A9EF105-5BF5-9FB6-9634-A91A6D840866}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {1A9EF105-5BF5-9FB6-9634-A91A6D840866}.Debug|Win32.ActiveCfg = Debug|Win32 + {1A9EF105-5BF5-9FB6-9634-A91A6D840866}.Debug|Win32.Build.0 = Debug|Win32 + {1A9EF105-5BF5-9FB6-9634-A91A6D840866}.Release|Win32.ActiveCfg = Release|Win32 + {1A9EF105-5BF5-9FB6-9634-A91A6D840866}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Builds/VisualStudio2013/Dexed.vcxproj b/Builds/VisualStudio2013/Dexed.vcxproj new file mode 100644 index 0000000..0dc5f34 --- /dev/null +++ b/Builds/VisualStudio2013/Dexed.vcxproj @@ -0,0 +1,1543 @@ + + + + + + Debug + Win32 + + + Release + Win32 + + + + {1A9EF105-5BF5-9FB6-9634-A91A6D840866} + v120 + + + + DynamicLibrary + false + MultiByte + v120 + + + DynamicLibrary + false + MultiByte + true + v120 + + + + + + + + v120 + + + <_ProjectFileVersion>10.0.30319.1 + .\Debug\ + Dexed + true + .\Release\ + Dexed + true + v120 + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + + + + Disabled + EditAndContinue + ..\..\JuceLibraryCode;..\..\JuceLibraryCode\modules;c:\SDKs\vstsdk2.4;%(AdditionalIncludeDirectories) + WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2013_78A5020=1;%(PreprocessorDefinitions) + MultiThreadedDebug + true + + $(IntDir)\ + $(IntDir)\ + $(IntDir)\ + Level4 + true + true + + + _DEBUG;%(PreprocessorDefinitions) + + + $(OutDir)\Dexed.dll + true + libcmt.lib; msvcrt.lib;;%(IgnoreSpecificDefaultLibraries) + true + $(IntDir)\Dexed.pdb + Windows + MachineX86 + false + true + + + true + $(IntDir)\Dexed.bsc + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + + + + MinSpace + ..\..\JuceLibraryCode;..\..\JuceLibraryCode\modules;c:\SDKs\vstsdk2.4;%(AdditionalIncludeDirectories) + WIN32;_WINDOWS;NDEBUG;JUCER_VS2013_78A5020=1;%(PreprocessorDefinitions) + MultiThreaded + true + + $(IntDir)\ + $(IntDir)\ + $(IntDir)\ + Level4 + true + true + + + NDEBUG;%(PreprocessorDefinitions) + + + $(OutDir)\Dexed.dll + true + %(IgnoreSpecificDefaultLibraries) + false + $(IntDir)\Dexed.pdb + Windows + MachineX86 + true + true + true + + + true + $(IntDir)\Dexed.bsc + + + + + + + + + + + + + + + + + + + + + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + true + + + + + + + + + + + + + + + + + StdCall + + + StdCall + + + StdCall + + + StdCall + + + StdCall + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Builds/VisualStudio2013/Dexed.vcxproj.filters b/Builds/VisualStudio2013/Dexed.vcxproj.filters new file mode 100644 index 0000000..ce5b2ed --- /dev/null +++ b/Builds/VisualStudio2013/Dexed.vcxproj.filters @@ -0,0 +1,2657 @@ + + + + + + {B90C76C9-07F8-4447-4E85-533FEBF85EB8} + + + {A4A2BA4F-D40D-22B2-5C99-2C2FE535C844} + + + {C5AF6998-922C-E781-8C7B-4ACFAA05FAAF} + + + {9DB0CF5F-F6E7-E40E-5CE4-E122873AC45A} + + + {422C46B7-0467-2DB0-BF3C-16DFCAFD69AC} + + + {3247ED97-A75A-F50B-8CCC-46155E895806} + + + {A33A1E1D-AC2C-6382-8681-48B0FC374C60} + + + {3FD908F5-98C8-9A61-FC03-0BAF8913CBB0} + + + {11A75801-B027-40BD-4993-023023ACCBF7} + + + {EF2CAB40-0432-429B-C517-86ADF136BB8A} + + + {8F7EC212-3168-AD81-5064-C45BA838C408} + + + {EE36D8B9-408C-AEC9-66E7-BEA9E407F27F} + + + {1ED92A41-D496-5397-A4B0-9FA52DBA9215} + + + {50F044B3-0D39-198B-CA5F-BE5E6C078D04} + + + {AF5F4789-D607-BFD8-D853-09473C27449C} + + + {F0C10808-8C36-BCD0-D25F-523774B0ADA2} + + + {EA1913F9-0E99-FEC5-0192-0C197611B8F8} + + + {0B0E7392-324B-088C-FBEB-5FE999D61782} + + + {77E2C34E-A4D6-EDB5-A107-7CB3CEF0E8EF} + + + {20254EFE-6CBD-31A7-2119-92B1E0E0E311} + + + {70796D73-6D30-8A1B-4732-7C021E47C05A} + + + {EB8DD942-E2CB-869F-D381-E02A65BA790B} + + + {B63F69FD-8A40-8E1E-E7ED-419B8DC1C12B} + + + {8167E753-09C7-5D1C-EF2B-32D297557443} + + + {AEDCB7F7-7A36-5392-8E9A-715F5BDE35CB} + + + {95CA1506-2B94-0DEE-0C8D-85EDEBBC4E88} + + + {244D11B0-2D68-3C08-A0B7-0D12469BC3AA} + + + {476C69CE-0B67-6B85-E888-45D91E37A29E} + + + {7C5AD030-F8CC-6E85-0AF6-196B3ED40AC6} + + + {0608ADE9-66EF-1A19-6D57-12D07F76EB53} + + + {05F3DB8A-499C-6ACA-282F-5BF8455A0DE1} + + + {C9F6D785-BF78-5AA1-B479-111C65397864} + + + {C8F726FC-26BF-2E6B-4ED5-55A7FE316D7D} + + + {DA0DC4AC-B511-A2D4-199A-C93454D6F114} + + + {91929C6F-7902-B87D-5260-2F6CBF8ACD93} + + + {C294408A-2005-2E9E-7AC0-8D3ABE8AC175} + + + {4634FFAE-9586-A970-364C-4FDDA635F99F} + + + {F2B2F310-F30F-7166-42A9-9BF9C230DA78} + + + {1B67A7C0-86E0-53F6-6AE3-7AD93B8DC95B} + + + {F03654BC-34D8-F975-BEA3-750CC2783D23} + + + {4927C7A1-9235-4AA1-93CD-B4E67E6F1E5F} + + + {FA891A58-9FDA-9651-43C4-714A19B5D08D} + + + {C79A4D23-7866-8F3E-AC39-BD68C52A9259} + + + {928D8FCC-5E00-174B-6538-93E8D75AB396} + + + {1988E68A-A964-64CA-0E0C-26FF9BC5176C} + + + {3DF036EA-3B80-553B-2494-3AAC835CAE75} + + + {358AEA11-3F96-36AE-7B32-71373B5C5396} + + + {F2A38F45-6E55-E147-2E52-64A89FDD9D59} + + + {6172822C-01A5-E824-12DA-FA43FA934D35} + + + {41DC3BE3-D629-8A17-C32B-F5B4008B5FAD} + + + {B098BC87-3298-7E6B-12DC-D26C09CDCAED} + + + {6322B88F-984A-C3CD-6263-38D7AA49B6EC} + + + {73C1E759-AD90-59A3-942E-2D10FAA29107} + + + {EE1AE8C3-0908-8F53-A4E5-D930C7C97C26} + + + {4926B3FF-E797-F586-857A-69D9703FA2D1} + + + {EBC65085-3AD5-280C-1A29-2B1683643AA1} + + + {413F481F-075C-2958-115C-D8268682FCB7} + + + {69E1179D-76EC-26DC-C3E6-6602ED26D783} + + + {C1A1A236-AB01-173E-96C3-0706BFF93B1E} + + + {1182303F-ECA3-166D-AC0C-92C5E762CB93} + + + {26ECA2AF-7368-C6CC-58EF-017ECD1862D0} + + + {E37D25CD-4350-4614-055B-7ABC55E67895} + + + {FFC6E1CC-C772-75E6-5087-FB5D4E016799} + + + {8E43579F-C185-266D-DD67-F8B95BD80F2F} + + + {2CB59E7C-D0E4-7D27-2ACF-C7ABADEE936D} + + + {796B7886-44A7-34CC-9B95-BF4FB2C7B6F4} + + + {A92719C7-70BE-57C4-CE9E-A9BC9DFEB757} + + + {75F1F352-251A-75E0-D941-8431588F5C1E} + + + {DB6E3D09-66DA-12DA-BAE8-A5BFFA7A14AC} + + + {7BCEAB87-62FD-0327-EB5D-679E54EDB9B1} + + + {E980FADB-6E3F-B93C-DE02-CE4271C9BA93} + + + {C3B2EB8A-1A2F-306F-AA78-3E9D1593788B} + + + {7A53E6F1-1343-33B8-4CA8-1D7B714A0E76} + + + {5A0AA36E-3957-E413-14C6-31CBE15271DF} + + + {D7E3D10F-3ED8-DFC5-6DB3-E4ACBF8678FB} + + + {F408DCA2-D5E2-0A3A-A064-A1D045889BC1} + + + {5FDBD6B1-9BBD-392F-4DA5-FEA40A9370C4} + + + {46535B56-3737-2BE8-E3A0-571BCBEB2DA4} + + + {C2B9505B-27B4-F650-12BD-F477D4BBCBAA} + + + {61712B09-5783-ADFA-2001-5A0C3D7764EB} + + + {8A80BA78-D3A8-C0F8-7FFD-61AA028CE852} + + + {8EC9572F-3CCA-E930-74B6-CB6139DE0E17} + + + {C60A6FCA-9462-922E-AD8D-69F10C9049AF} + + + {D56498EE-E354-1F00-5EEE-8CF7944BEAFB} + + + {61B2920C-494D-D8CB-C0C7-5DBF3D76D164} + + + {66C9B809-8739-A217-C78D-A15D6089B8E3} + + + {C413328B-5D81-89EE-F4F3-75752E700DE4} + + + {8B4D1BAA-6DB4-CAEC-A0FA-271F354D5C61} + + + + + Dexed\Source + + + Dexed\Source + + + Dexed\Source + + + Dexed\Source\msfa + + + Dexed\Source\msfa + + + Dexed\Source\msfa + + + Dexed\Source\msfa + + + Dexed\Source\msfa + + + Dexed\Source\msfa + + + Dexed\Source\msfa + + + Dexed\Source\msfa + + + Dexed\Source\msfa + + + Dexed\Source + + + Dexed\Source + + + Dexed\Source + + + Dexed\Source + + + Dexed\Source + + + Dexed\Source + + + Juce Modules\juce_audio_basics\buffers + + + Juce Modules\juce_audio_basics\buffers + + + Juce Modules\juce_audio_basics\buffers + + + Juce Modules\juce_audio_basics\midi + + + Juce Modules\juce_audio_basics\midi + + + Juce Modules\juce_audio_basics\midi + + + Juce Modules\juce_audio_basics\midi + + + Juce Modules\juce_audio_basics\midi + + + Juce Modules\juce_audio_basics\effects + + + Juce Modules\juce_audio_basics\effects + + + Juce Modules\juce_audio_basics\sources + + + Juce Modules\juce_audio_basics\sources + + + Juce Modules\juce_audio_basics\sources + + + Juce Modules\juce_audio_basics\sources + + + Juce Modules\juce_audio_basics\sources + + + Juce Modules\juce_audio_basics\sources + + + Juce Modules\juce_audio_basics\sources + + + Juce Modules\juce_audio_basics\synthesisers + + + Juce Modules\juce_audio_plugin_client\AU + + + Juce Modules\juce_audio_plugin_client\RTAS + + + Juce Modules\juce_audio_plugin_client\RTAS + + + Juce Modules\juce_audio_plugin_client\RTAS + + + Juce Modules\juce_audio_plugin_client\RTAS + + + Juce Modules\juce_audio_plugin_client\RTAS + + + Juce Modules\juce_audio_plugin_client\RTAS + + + Juce Modules\juce_audio_plugin_client\VST + + + Juce Modules\juce_audio_plugin_client\VST + + + Juce Modules\juce_audio_plugin_client\AAX + + + Juce Modules\juce_audio_plugin_client\AAX + + + Juce Modules\juce_audio_plugin_client\utility + + + Juce Modules\juce_audio_processors\processors + + + Juce Modules\juce_audio_processors\processors + + + Juce Modules\juce_audio_processors\processors + + + Juce Modules\juce_audio_processors\processors + + + Juce Modules\juce_audio_processors\processors + + + Juce Modules\juce_audio_processors\format + + + Juce Modules\juce_audio_processors\format + + + Juce Modules\juce_audio_processors\format_types + + + Juce Modules\juce_audio_processors\format_types + + + Juce Modules\juce_audio_processors\format_types + + + Juce Modules\juce_audio_processors\format_types + + + Juce Modules\juce_audio_processors\scanning + + + Juce Modules\juce_audio_processors\scanning + + + Juce Modules\juce_audio_processors\scanning + + + Juce Modules\juce_audio_utils\gui + + + Juce Modules\juce_audio_utils\gui + + + Juce Modules\juce_audio_utils\gui + + + Juce Modules\juce_audio_utils\gui + + + Juce Modules\juce_audio_utils\players + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\maths + + + Juce Modules\juce_core\maths + + + Juce Modules\juce_core\maths + + + Juce Modules\juce_core\memory + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\time + + + Juce Modules\juce_core\time + + + Juce Modules\juce_core\time + + + Juce Modules\juce_core\files + + + Juce Modules\juce_core\files + + + Juce Modules\juce_core\files + + + Juce Modules\juce_core\files + + + Juce Modules\juce_core\files + + + Juce Modules\juce_core\files + + + Juce Modules\juce_core\network + + + Juce Modules\juce_core\network + + + Juce Modules\juce_core\network + + + Juce Modules\juce_core\network + + + Juce Modules\juce_core\network + + + Juce Modules\juce_core\streams + + + Juce Modules\juce_core\streams + + + Juce Modules\juce_core\streams + + + Juce Modules\juce_core\streams + + + Juce Modules\juce_core\streams + + + Juce Modules\juce_core\streams + + + Juce Modules\juce_core\streams + + + Juce Modules\juce_core\logging + + + Juce Modules\juce_core\logging + + + Juce Modules\juce_core\system + + + Juce Modules\juce_core\xml + + + Juce Modules\juce_core\xml + + + Juce Modules\juce_core\javascript + + + Juce Modules\juce_core\javascript + + + Juce Modules\juce_core\zip + + + Juce Modules\juce_core\zip + + + Juce Modules\juce_core\zip + + + Juce Modules\juce_core\unit_tests + + + Juce Modules\juce_core\misc + + + Juce Modules\juce_core\misc + + + 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 + + + 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_data_structures\values + + + Juce Modules\juce_data_structures\values + + + Juce Modules\juce_data_structures\undomanager + + + Juce Modules\juce_data_structures\app_properties + + + Juce Modules\juce_data_structures\app_properties + + + Juce Modules\juce_events\messages + + + Juce Modules\juce_events\messages + + + Juce Modules\juce_events\messages + + + Juce Modules\juce_events\messages + + + Juce Modules\juce_events\timers + + + Juce Modules\juce_events\timers + + + Juce Modules\juce_events\broadcasters + + + Juce Modules\juce_events\broadcasters + + + Juce Modules\juce_events\broadcasters + + + Juce Modules\juce_events\interprocess + + + Juce Modules\juce_events\interprocess + + + Juce Modules\juce_events\native + + + Juce Modules\juce_events\native + + + Juce Modules\juce_events\native + + + Juce Modules\juce_events\native + + + Juce Modules\juce_events\native + + + Juce Modules\juce_graphics\colour + + + Juce Modules\juce_graphics\colour + + + Juce Modules\juce_graphics\colour + + + Juce Modules\juce_graphics\colour + + + Juce Modules\juce_graphics\contexts + + + Juce Modules\juce_graphics\contexts + + + Juce Modules\juce_graphics\contexts + + + Juce Modules\juce_graphics\images + + + Juce Modules\juce_graphics\images + + + Juce Modules\juce_graphics\images + + + Juce Modules\juce_graphics\images + + + Juce Modules\juce_graphics\image_formats + + + Juce Modules\juce_graphics\image_formats + + + Juce Modules\juce_graphics\image_formats + + + Juce Modules\juce_graphics\geometry + + + Juce Modules\juce_graphics\geometry + + + Juce Modules\juce_graphics\geometry + + + Juce Modules\juce_graphics\geometry + + + Juce Modules\juce_graphics\geometry + + + Juce Modules\juce_graphics\placement + + + Juce Modules\juce_graphics\fonts + + + Juce Modules\juce_graphics\fonts + + + Juce Modules\juce_graphics\fonts + + + Juce Modules\juce_graphics\fonts + + + Juce Modules\juce_graphics\fonts + + + Juce Modules\juce_graphics\fonts + + + Juce Modules\juce_graphics\effects + + + Juce Modules\juce_graphics\effects + + + Juce Modules\juce_graphics\native + + + Juce Modules\juce_graphics\native + + + Juce Modules\juce_graphics\native + + + Juce Modules\juce_graphics\native + + + Juce Modules\juce_graphics\native + + + Juce Modules\juce_graphics\native + + + Juce Modules\juce_graphics\native + + + Juce Modules\juce_graphics\native + + + Juce Modules\juce_graphics\native + + + Juce Modules\juce_graphics\native + + + Juce Modules\juce_gui_basics\components + + + Juce Modules\juce_gui_basics\components + + + Juce Modules\juce_gui_basics\components + + + Juce Modules\juce_gui_basics\components + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\keyboard + + + Juce Modules\juce_gui_basics\keyboard + + + Juce Modules\juce_gui_basics\keyboard + + + Juce Modules\juce_gui_basics\keyboard + + + Juce Modules\juce_gui_basics\keyboard + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\menus + + + Juce Modules\juce_gui_basics\menus + + + Juce Modules\juce_gui_basics\menus + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\buttons + + + Juce Modules\juce_gui_basics\buttons + + + Juce Modules\juce_gui_basics\buttons + + + Juce Modules\juce_gui_basics\buttons + + + Juce Modules\juce_gui_basics\buttons + + + Juce Modules\juce_gui_basics\buttons + + + Juce Modules\juce_gui_basics\buttons + + + Juce Modules\juce_gui_basics\buttons + + + Juce Modules\juce_gui_basics\buttons + + + Juce Modules\juce_gui_basics\positioning + + + Juce Modules\juce_gui_basics\positioning + + + Juce Modules\juce_gui_basics\positioning + + + Juce Modules\juce_gui_basics\positioning + + + Juce Modules\juce_gui_basics\positioning + + + Juce Modules\juce_gui_basics\positioning + + + Juce Modules\juce_gui_basics\positioning + + + Juce Modules\juce_gui_basics\drawables + + + Juce Modules\juce_gui_basics\drawables + + + Juce Modules\juce_gui_basics\drawables + + + Juce Modules\juce_gui_basics\drawables + + + Juce Modules\juce_gui_basics\drawables + + + Juce Modules\juce_gui_basics\drawables + + + Juce Modules\juce_gui_basics\drawables + + + Juce Modules\juce_gui_basics\drawables + + + Juce Modules\juce_gui_basics\properties + + + Juce Modules\juce_gui_basics\properties + + + Juce Modules\juce_gui_basics\properties + + + Juce Modules\juce_gui_basics\properties + + + Juce Modules\juce_gui_basics\properties + + + Juce Modules\juce_gui_basics\properties + + + Juce Modules\juce_gui_basics\properties + + + Juce Modules\juce_gui_basics\lookandfeel + + + Juce Modules\juce_gui_basics\lookandfeel + + + Juce Modules\juce_gui_basics\lookandfeel + + + Juce Modules\juce_gui_basics\lookandfeel + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\commands + + + Juce Modules\juce_gui_basics\commands + + + Juce Modules\juce_gui_basics\commands + + + Juce Modules\juce_gui_basics\commands + + + Juce Modules\juce_gui_basics\misc + + + Juce Modules\juce_gui_basics\misc + + + Juce Modules\juce_gui_basics\application + + + 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_extra\code_editor + + + Juce Modules\juce_gui_extra\code_editor + + + Juce Modules\juce_gui_extra\code_editor + + + Juce Modules\juce_gui_extra\documents + + + Juce Modules\juce_gui_extra\misc + + + Juce Modules\juce_gui_extra\misc + + + Juce Modules\juce_gui_extra\misc + + + Juce Modules\juce_gui_extra\misc + + + Juce Modules\juce_gui_extra\misc + + + Juce Modules\juce_gui_extra\misc + + + Juce Modules\juce_gui_extra\misc + + + 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 + + + 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 Library Code + + + Juce Library Code + + + Juce Library Code + + + Juce Library Code + + + Juce Library Code + + + Juce Library Code + + + Juce Library Code + + + Juce Library Code + + + Juce Library Code + + + Juce Library Code + + + Juce Library Code + + + Juce Library Code + + + Juce Library Code + + + Juce Library Code + + + Juce Library Code + + + Juce Library Code + + + Juce Library Code + + + Juce Library Code + + + Juce Library Code + + + Juce Library Code + + + + + Dexed\Source + + + Dexed\Source + + + Dexed\Source + + + Dexed\Source\msfa + + + Dexed\Source\msfa + + + Dexed\Source\msfa + + + Dexed\Source\msfa + + + Dexed\Source\msfa + + + Dexed\Source\msfa + + + Dexed\Source\msfa + + + Dexed\Source\msfa + + + Dexed\Source\msfa + + + Dexed\Source\msfa + + + Dexed\Source\msfa + + + Dexed\Source\msfa + + + Dexed\Source\msfa + + + Dexed\Source + + + Dexed\Source + + + Dexed\Source + + + Dexed\Source + + + Dexed\Source + + + Dexed\Source + + + Juce Modules\juce_audio_basics\buffers + + + Juce Modules\juce_audio_basics\buffers + + + Juce Modules\juce_audio_basics\buffers + + + Juce Modules\juce_audio_basics\midi + + + Juce Modules\juce_audio_basics\midi + + + Juce Modules\juce_audio_basics\midi + + + Juce Modules\juce_audio_basics\midi + + + Juce Modules\juce_audio_basics\midi + + + Juce Modules\juce_audio_basics\effects + + + Juce Modules\juce_audio_basics\effects + + + Juce Modules\juce_audio_basics\effects + + + Juce Modules\juce_audio_basics\effects + + + Juce Modules\juce_audio_basics\sources + + + Juce Modules\juce_audio_basics\sources + + + Juce Modules\juce_audio_basics\sources + + + Juce Modules\juce_audio_basics\sources + + + Juce Modules\juce_audio_basics\sources + + + Juce Modules\juce_audio_basics\sources + + + Juce Modules\juce_audio_basics\sources + + + Juce Modules\juce_audio_basics\sources + + + Juce Modules\juce_audio_basics\sources + + + Juce Modules\juce_audio_basics\synthesisers + + + Juce Modules\juce_audio_basics + + + Juce Modules\juce_audio_plugin_client\RTAS + + + Juce Modules\juce_audio_plugin_client\utility + + + Juce Modules\juce_audio_plugin_client\utility + + + Juce Modules\juce_audio_plugin_client\utility + + + Juce Modules\juce_audio_plugin_client\utility + + + Juce Modules\juce_audio_plugin_client\utility + + + Juce Modules\juce_audio_plugin_client\utility + + + Juce Modules\juce_audio_plugin_client + + + Juce Modules\juce_audio_processors\processors + + + Juce Modules\juce_audio_processors\processors + + + Juce Modules\juce_audio_processors\processors + + + Juce Modules\juce_audio_processors\processors + + + Juce Modules\juce_audio_processors\processors + + + Juce Modules\juce_audio_processors\processors + + + Juce Modules\juce_audio_processors\processors + + + Juce Modules\juce_audio_processors\processors + + + Juce Modules\juce_audio_processors\format + + + Juce Modules\juce_audio_processors\format + + + Juce Modules\juce_audio_processors\format_types + + + Juce Modules\juce_audio_processors\format_types + + + Juce Modules\juce_audio_processors\format_types + + + Juce Modules\juce_audio_processors\format_types + + + Juce Modules\juce_audio_processors\format_types + + + Juce Modules\juce_audio_processors\scanning + + + Juce Modules\juce_audio_processors\scanning + + + Juce Modules\juce_audio_processors\scanning + + + Juce Modules\juce_audio_processors + + + Juce Modules\juce_audio_utils\gui + + + Juce Modules\juce_audio_utils\gui + + + Juce Modules\juce_audio_utils\gui + + + Juce Modules\juce_audio_utils\gui + + + Juce Modules\juce_audio_utils\gui + + + Juce Modules\juce_audio_utils\players + + + Juce Modules\juce_audio_utils + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\text + + + Juce Modules\juce_core\maths + + + Juce Modules\juce_core\maths + + + Juce Modules\juce_core\maths + + + Juce Modules\juce_core\maths + + + Juce Modules\juce_core\maths + + + Juce Modules\juce_core\memory + + + Juce Modules\juce_core\memory + + + Juce Modules\juce_core\memory + + + Juce Modules\juce_core\memory + + + Juce Modules\juce_core\memory + + + Juce Modules\juce_core\memory + + + Juce Modules\juce_core\memory + + + Juce Modules\juce_core\memory + + + Juce Modules\juce_core\memory + + + Juce Modules\juce_core\memory + + + Juce Modules\juce_core\memory + + + Juce Modules\juce_core\memory + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\containers + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\threads + + + Juce Modules\juce_core\time + + + Juce Modules\juce_core\time + + + Juce Modules\juce_core\time + + + Juce Modules\juce_core\files + + + Juce Modules\juce_core\files + + + Juce Modules\juce_core\files + + + Juce Modules\juce_core\files + + + Juce Modules\juce_core\files + + + Juce Modules\juce_core\files + + + Juce Modules\juce_core\files + + + Juce Modules\juce_core\network + + + Juce Modules\juce_core\network + + + Juce Modules\juce_core\network + + + Juce Modules\juce_core\network + + + Juce Modules\juce_core\network + + + Juce Modules\juce_core\streams + + + Juce Modules\juce_core\streams + + + Juce Modules\juce_core\streams + + + Juce Modules\juce_core\streams + + + Juce Modules\juce_core\streams + + + Juce Modules\juce_core\streams + + + Juce Modules\juce_core\streams + + + Juce Modules\juce_core\streams + + + Juce Modules\juce_core\logging + + + Juce Modules\juce_core\logging + + + Juce Modules\juce_core\system + + + Juce Modules\juce_core\system + + + Juce Modules\juce_core\system + + + Juce Modules\juce_core\system + + + Juce Modules\juce_core\xml + + + Juce Modules\juce_core\xml + + + Juce Modules\juce_core\javascript + + + Juce Modules\juce_core\javascript + + + Juce Modules\juce_core\zip + + + Juce Modules\juce_core\zip + + + Juce Modules\juce_core\zip + + + Juce Modules\juce_core\unit_tests + + + Juce Modules\juce_core\misc + + + Juce Modules\juce_core\misc + + + Juce Modules\juce_core\misc + + + 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 + + + Juce Modules\juce_data_structures\values + + + Juce Modules\juce_data_structures\values + + + Juce Modules\juce_data_structures\undomanager + + + Juce Modules\juce_data_structures\undomanager + + + Juce Modules\juce_data_structures\app_properties + + + Juce Modules\juce_data_structures\app_properties + + + Juce Modules\juce_data_structures + + + Juce Modules\juce_events\messages + + + Juce Modules\juce_events\messages + + + Juce Modules\juce_events\messages + + + Juce Modules\juce_events\messages + + + Juce Modules\juce_events\messages + + + Juce Modules\juce_events\messages + + + Juce Modules\juce_events\messages + + + Juce Modules\juce_events\messages + + + Juce Modules\juce_events\timers + + + Juce Modules\juce_events\timers + + + Juce Modules\juce_events\broadcasters + + + Juce Modules\juce_events\broadcasters + + + Juce Modules\juce_events\broadcasters + + + Juce Modules\juce_events\broadcasters + + + Juce Modules\juce_events\broadcasters + + + Juce Modules\juce_events\broadcasters + + + Juce Modules\juce_events\interprocess + + + Juce Modules\juce_events\interprocess + + + Juce Modules\juce_events\native + + + Juce Modules\juce_events\native + + + Juce Modules\juce_events\native + + + Juce Modules\juce_events + + + Juce Modules\juce_graphics\colour + + + Juce Modules\juce_graphics\colour + + + Juce Modules\juce_graphics\colour + + + Juce Modules\juce_graphics\colour + + + Juce Modules\juce_graphics\colour + + + Juce Modules\juce_graphics\contexts + + + Juce Modules\juce_graphics\contexts + + + Juce Modules\juce_graphics\contexts + + + Juce Modules\juce_graphics\contexts + + + Juce Modules\juce_graphics\images + + + Juce Modules\juce_graphics\images + + + Juce Modules\juce_graphics\images + + + Juce Modules\juce_graphics\images + + + Juce Modules\juce_graphics\geometry + + + Juce Modules\juce_graphics\geometry + + + Juce Modules\juce_graphics\geometry + + + Juce Modules\juce_graphics\geometry + + + Juce Modules\juce_graphics\geometry + + + Juce Modules\juce_graphics\geometry + + + Juce Modules\juce_graphics\geometry + + + Juce Modules\juce_graphics\geometry + + + Juce Modules\juce_graphics\geometry + + + Juce Modules\juce_graphics\geometry + + + Juce Modules\juce_graphics\placement + + + Juce Modules\juce_graphics\placement + + + Juce Modules\juce_graphics\fonts + + + Juce Modules\juce_graphics\fonts + + + Juce Modules\juce_graphics\fonts + + + Juce Modules\juce_graphics\fonts + + + Juce Modules\juce_graphics\fonts + + + Juce Modules\juce_graphics\fonts + + + Juce Modules\juce_graphics\effects + + + Juce Modules\juce_graphics\effects + + + Juce Modules\juce_graphics\effects + + + Juce Modules\juce_graphics\native + + + Juce Modules\juce_graphics\native + + + Juce Modules\juce_graphics\native + + + Juce Modules\juce_graphics + + + Juce Modules\juce_gui_basics\components + + + Juce Modules\juce_gui_basics\components + + + Juce Modules\juce_gui_basics\components + + + Juce Modules\juce_gui_basics\components + + + Juce Modules\juce_gui_basics\components + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\mouse + + + Juce Modules\juce_gui_basics\keyboard + + + Juce Modules\juce_gui_basics\keyboard + + + Juce Modules\juce_gui_basics\keyboard + + + Juce Modules\juce_gui_basics\keyboard + + + Juce Modules\juce_gui_basics\keyboard + + + Juce Modules\juce_gui_basics\keyboard + + + Juce Modules\juce_gui_basics\keyboard + + + Juce Modules\juce_gui_basics\keyboard + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\widgets + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\windows + + + Juce Modules\juce_gui_basics\menus + + + Juce Modules\juce_gui_basics\menus + + + Juce Modules\juce_gui_basics\menus + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\layout + + + Juce Modules\juce_gui_basics\buttons + + + Juce Modules\juce_gui_basics\buttons + + + Juce Modules\juce_gui_basics\buttons + + + Juce Modules\juce_gui_basics\buttons + + + Juce Modules\juce_gui_basics\buttons + + + Juce Modules\juce_gui_basics\buttons + + + Juce Modules\juce_gui_basics\buttons + + + Juce Modules\juce_gui_basics\buttons + + + Juce Modules\juce_gui_basics\buttons + + + Juce Modules\juce_gui_basics\positioning + + + Juce Modules\juce_gui_basics\positioning + + + Juce Modules\juce_gui_basics\positioning + + + Juce Modules\juce_gui_basics\positioning + + + Juce Modules\juce_gui_basics\positioning + + + Juce Modules\juce_gui_basics\positioning + + + Juce Modules\juce_gui_basics\positioning + + + Juce Modules\juce_gui_basics\drawables + + + Juce Modules\juce_gui_basics\drawables + + + Juce Modules\juce_gui_basics\drawables + + + Juce Modules\juce_gui_basics\drawables + + + Juce Modules\juce_gui_basics\drawables + + + Juce Modules\juce_gui_basics\drawables + + + Juce Modules\juce_gui_basics\drawables + + + Juce Modules\juce_gui_basics\properties + + + Juce Modules\juce_gui_basics\properties + + + Juce Modules\juce_gui_basics\properties + + + Juce Modules\juce_gui_basics\properties + + + Juce Modules\juce_gui_basics\properties + + + Juce Modules\juce_gui_basics\properties + + + Juce Modules\juce_gui_basics\properties + + + Juce Modules\juce_gui_basics\lookandfeel + + + Juce Modules\juce_gui_basics\lookandfeel + + + Juce Modules\juce_gui_basics\lookandfeel + + + Juce Modules\juce_gui_basics\lookandfeel + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\filebrowser + + + Juce Modules\juce_gui_basics\commands + + + Juce Modules\juce_gui_basics\commands + + + Juce Modules\juce_gui_basics\commands + + + Juce Modules\juce_gui_basics\commands + + + Juce Modules\juce_gui_basics\commands + + + Juce Modules\juce_gui_basics\misc + + + Juce Modules\juce_gui_basics\misc + + + Juce Modules\juce_gui_basics\application + + + Juce Modules\juce_gui_basics\native + + + Juce Modules\juce_gui_basics + + + Juce Modules\juce_gui_extra\code_editor + + + Juce Modules\juce_gui_extra\code_editor + + + Juce Modules\juce_gui_extra\code_editor + + + Juce Modules\juce_gui_extra\code_editor + + + Juce Modules\juce_gui_extra\code_editor + + + Juce Modules\juce_gui_extra\documents + + + Juce Modules\juce_gui_extra\embedding + + + Juce Modules\juce_gui_extra\embedding + + + Juce Modules\juce_gui_extra\embedding + + + Juce Modules\juce_gui_extra\misc + + + Juce Modules\juce_gui_extra\misc + + + Juce Modules\juce_gui_extra\misc + + + Juce Modules\juce_gui_extra\misc + + + Juce Modules\juce_gui_extra\misc + + + Juce Modules\juce_gui_extra\misc + + + Juce Modules\juce_gui_extra\misc + + + Juce Modules\juce_gui_extra\misc + + + Juce Modules\juce_gui_extra\misc + + + Juce Modules\juce_gui_extra\native + + + Juce Modules\juce_gui_extra + + + Juce Library Code + + + Juce Library Code + + + Juce Library Code + + + + + Dexed\Resources + + + Juce Modules\juce_audio_basics + + + Juce Modules\juce_audio_plugin_client + + + Juce Modules\juce_audio_processors + + + Juce Modules\juce_audio_utils + + + Juce Modules\juce_core + + + Juce Modules\juce_data_structures + + + Juce Modules\juce_events + + + Juce Modules\juce_graphics + + + Juce Modules\juce_gui_basics + + + Juce Modules\juce_gui_extra + + + Juce Library Code + + + + + Juce Library Code + + + diff --git a/Builds/VisualStudio2013/resources.rc b/Builds/VisualStudio2013/resources.rc new file mode 100644 index 0000000..52f8d75 --- /dev/null +++ b/Builds/VisualStudio2013/resources.rc @@ -0,0 +1,30 @@ +#ifdef JUCE_USER_DEFINED_RC_FILE + #include JUCE_USER_DEFINED_RC_FILE +#else + +#undef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#include + +VS_VERSION_INFO VERSIONINFO +FILEVERSION 1,0,0,0 +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + BEGIN + VALUE "CompanyName", "Digital Suburban\0" + VALUE "FileDescription", "Dexed\0" + VALUE "FileVersion", "1.0.0\0" + VALUE "ProductName", "Dexed\0" + VALUE "ProductVersion", "1.0.0\0" + END + END + + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 65001 + END +END + +#endif diff --git a/Dexed.jucer b/Dexed.jucer index 9921676..5e651f5 100644 --- a/Dexed.jucer +++ b/Dexed.jucer @@ -111,6 +111,28 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/README.md b/README.md index 8cc645a..be9c40e 100644 --- a/README.md +++ b/README.md @@ -13,14 +13,14 @@ the original synth. Dexed is licensed on the GPL v2. The msfa component (acronym for music synthesizer for android, see msfa in the source folder) stays on the Apache 2.0 license to able to collaborate between projects. -Features +Features -------- * Multi platform (OS X, Windows, Linux) and multi format (VST, AU and others that I don't use); by using JUCE * The sound engine [music-synthesizer-for-android](https://code.google.com/p/music-synthesizer-for-android) is closely modeled on the original DX7 characteristics * All of the 144 DX7 parameters are available from one single panel * Fully supports DX7 input and output Sysex messages; including controller change. This means that you can use this with a native DX7/TX7 as a patch editor * Each operator have a realtime VU meter to know wich one is active -* Can load any DX7/TX7 sysex programs +* Can load/save any DX7/TX7 sysex programs. It is also possible to save a single program into a different sysex file. Binary downloads ---------------- @@ -32,19 +32,26 @@ Using as a DX7 editor This plugin can process original DX7 messages. If you change a parameter, it will send the corresponding DX7 sysex to midi out. Not all DAW supports sysex; for example Ableton Live simply discard any sysex data. Reaper does process midi out, but doesn't pass any -midi in sysex input data to the plugin. +midi in sysex input data to the plugin. Randomized programs ------------------- Dexed doesn't check the sysex checksum so you can load any type of files. If the checksum doesn't -match, it will tell you but load it anyway. This features enable a somekind of randomized DX -programs. +match, it will tell you but load it anyway. This feature act as a kind of a randomization +for DX programs. + +Credits & thanks +---------------- +Raph Levien and msfa team, markusthegeek, Jean-Marc Desprez and all the crew who made these historic +DX programs: (Dave Benson, Frank Carvalho, Tim Conrardy, Jack Deckard, Chris Dodunski, Tim Garrett, +Hitaye, Stephan Ibsen, Christian Jezreel, Narfman, Godric Wilkie) TODO - Dexed ------------ * Implement a better DX look and feel (amp, pitch, algo) * Better implementation of the LPF filter * Various code cleanup +* Standalone executable TODO - msfa ----------- diff --git a/Source/DXComponents.cpp b/Source/DXComponents.cpp index 8b3c59f..7ef1e86 100644 --- a/Source/DXComponents.cpp +++ b/Source/DXComponents.cpp @@ -33,7 +33,7 @@ static const char algoArr[][13] = { { 0, 0, 1, -4, 0, 0, 0, 2, -5, 0, 3, -6, 0 }, // 4 { 0, 1, 3, 5, 0, 0, 2, 4, -6, 0, 0, 0, 0 }, // 5 { 0, 1, 3, -5, 0, 0, 2, 4, -6, 0, 0, 0, 0 }, // 6 - { 0, 1, 3, 0, 0, 0, -2, 4, 5, 0, 0, 6, 0 }, // 7 + { 0, 1, 3, 0, 0, 0, 2, 4, 5, 0, 0, -6, 0 }, // 7 { 0, 1, 3, 0, 0, 0, 2, -4, 5, 0, 0, 6, 0 }, // 8 { 0, 1, 3, 0, 0, 0, -2, 4, 5, 0, 0, 6, 0 }, // 9 { 0, 0, 4, 1, 0, 0, 5, 6, 2, 0, 0, -3, 0 }, // 10 diff --git a/Source/GlobalEditor.cpp b/Source/GlobalEditor.cpp index 05347ec..aa300e7 100644 --- a/Source/GlobalEditor.cpp +++ b/Source/GlobalEditor.cpp @@ -29,12 +29,6 @@ //============================================================================== GlobalEditor::GlobalEditor () { - addAndMakeVisible (algo = new Slider ("algo")); - algo->setRange (1, 32, 1); - algo->setSliderStyle (Slider::Rotary); - algo->setTextBoxStyle (Slider::NoTextBox, true, 80, 20); - algo->addListener (this); - addAndMakeVisible (lfoType = new ComboBox ("new combo box")); lfoType->setEditableText (false); lfoType->setJustificationType (Justification::centredLeft); @@ -84,9 +78,6 @@ GlobalEditor::GlobalEditor () reso->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); reso->addListener (this); - addAndMakeVisible (algoDisplay = new AlgoDisplay()); - algoDisplay->setName ("algoDisplay"); - addAndMakeVisible (pitchRate2 = new Slider ("pitchRate2")); pitchRate2->setRange (0, 99, 1); pitchRate2->setSliderStyle (Slider::Rotary); @@ -135,12 +126,6 @@ GlobalEditor::GlobalEditor () pitchLevel1->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); pitchLevel1->addListener (this); - addAndMakeVisible (feedback = new Slider ("feedback")); - feedback->setRange (0, 7, 1); - feedback->setSliderStyle (Slider::Rotary); - feedback->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); - feedback->addListener (this); - addAndMakeVisible (transpose = new Slider ("transpose")); transpose->setRange (0, 49, 0); transpose->setSliderStyle (Slider::LinearVertical); @@ -162,6 +147,21 @@ GlobalEditor::GlobalEditor () addAndMakeVisible (pitchEnvDisplay = new PitchEnvDisplay()); pitchEnvDisplay->setName ("pitchEnvDisplay"); + addAndMakeVisible (algoDisplay = new AlgoDisplay()); + algoDisplay->setName ("algoDisplay"); + + addAndMakeVisible (feedback = new Slider ("feedback")); + feedback->setRange (0, 7, 1); + feedback->setSliderStyle (Slider::Rotary); + feedback->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + feedback->addListener (this); + + addAndMakeVisible (algo = new Slider ("algo")); + algo->setRange (1, 32, 1); + algo->setSliderStyle (Slider::Rotary); + algo->setTextBoxStyle (Slider::NoTextBox, true, 80, 20); + algo->addListener (this); + //[UserPreSize] //[/UserPreSize] @@ -180,7 +180,6 @@ GlobalEditor::~GlobalEditor() //[Destructor_pre]. You can add your own custom destruction code here.. //[/Destructor_pre] - algo = nullptr; lfoType = nullptr; lfoSpeed = nullptr; lfoAmDepth = nullptr; @@ -188,7 +187,6 @@ GlobalEditor::~GlobalEditor() lfoDelay = nullptr; cutoff = nullptr; reso = nullptr; - algoDisplay = nullptr; pitchRate2 = nullptr; pitchRate3 = nullptr; pitchRate4 = nullptr; @@ -197,12 +195,14 @@ GlobalEditor::~GlobalEditor() pitchLevel3 = nullptr; pitchLevel4 = nullptr; pitchLevel1 = nullptr; - feedback = nullptr; transpose = nullptr; oscSync = nullptr; pitchModSens = nullptr; lfoSync = nullptr; pitchEnvDisplay = nullptr; + algoDisplay = nullptr; + feedback = nullptr; + algo = nullptr; //[Destructor]. You can add your own custom destruction code here.. @@ -232,7 +232,6 @@ void GlobalEditor::paint (Graphics& g) void GlobalEditor::resized() { - algo->setBounds (568, 32, 24, 24); lfoType->setBounds (624, 40, 96, 16); lfoSpeed->setBounds (624, 16, 96, 16); lfoAmDepth->setBounds (696, 64, 24, 24); @@ -240,7 +239,6 @@ void GlobalEditor::resized() lfoDelay->setBounds (672, 64, 24, 24); cutoff->setBounds (8, 40, 48, 48); reso->setBounds (64, 40, 48, 48); - algoDisplay->setBounds (408, 8, 152, 74); pitchRate2->setBounds (776, 64, 32, 24); pitchRate3->setBounds (800, 64, 32, 24); pitchRate4->setBounds (824, 64, 32, 24); @@ -249,27 +247,39 @@ void GlobalEditor::resized() pitchLevel3->setBounds (800, 40, 32, 24); pitchLevel4->setBounds (824, 40, 32, 24); pitchLevel1->setBounds (752, 40, 32, 24); - feedback->setBounds (568, 56, 24, 24); transpose->setBounds (728, 0, 24, 56); oscSync->setBounds (600, 64, 24, 24); pitchModSens->setBounds (728, 64, 24, 24); lfoSync->setBounds (624, 64, 24, 24); pitchEnvDisplay->setBounds (752, 8, 96, 32); + algoDisplay->setBounds (442, 8, 152, 74); + feedback->setBounds (568, 32, 24, 24); + algo->setBounds (568, 8, 24, 24); //[UserResized] Add your own custom resize handling here.. //[/UserResized] } +void GlobalEditor::comboBoxChanged (ComboBox* comboBoxThatHasChanged) +{ + //[UsercomboBoxChanged_Pre] + //[/UsercomboBoxChanged_Pre] + + if (comboBoxThatHasChanged == lfoType) + { + //[UserComboBoxCode_lfoType] -- add your combo box handling code here.. + //[/UserComboBoxCode_lfoType] + } + + //[UsercomboBoxChanged_Post] + //[/UsercomboBoxChanged_Post] +} + void GlobalEditor::sliderValueChanged (Slider* sliderThatWasMoved) { //[UsersliderValueChanged_Pre] //[/UsersliderValueChanged_Pre] - if (sliderThatWasMoved == algo) - { - //[UserSliderCode_algo] -- add your slider handling code here.. - //[/UserSliderCode_algo] - } - else if (sliderThatWasMoved == lfoSpeed) + if (sliderThatWasMoved == lfoSpeed) { //[UserSliderCode_lfoSpeed] -- add your slider handling code here.. //[/UserSliderCode_lfoSpeed] @@ -347,11 +357,6 @@ void GlobalEditor::sliderValueChanged (Slider* sliderThatWasMoved) pitchEnvDisplay->repaint(); //[/UserSliderCode_pitchLevel1] } - else if (sliderThatWasMoved == feedback) - { - //[UserSliderCode_feedback] -- add your slider handling code here.. - //[/UserSliderCode_feedback] - } else if (sliderThatWasMoved == transpose) { //[UserSliderCode_transpose] -- add your slider handling code here.. @@ -362,24 +367,19 @@ void GlobalEditor::sliderValueChanged (Slider* sliderThatWasMoved) //[UserSliderCode_pitchModSens] -- add your slider handling code here.. //[/UserSliderCode_pitchModSens] } - - //[UsersliderValueChanged_Post] - //[/UsersliderValueChanged_Post] -} - -void GlobalEditor::comboBoxChanged (ComboBox* comboBoxThatHasChanged) -{ - //[UsercomboBoxChanged_Pre] - //[/UsercomboBoxChanged_Pre] - - if (comboBoxThatHasChanged == lfoType) + else if (sliderThatWasMoved == feedback) { - //[UserComboBoxCode_lfoType] -- add your combo box handling code here.. - //[/UserComboBoxCode_lfoType] + //[UserSliderCode_feedback] -- add your slider handling code here.. + //[/UserSliderCode_feedback] + } + else if (sliderThatWasMoved == algo) + { + //[UserSliderCode_algo] -- add your slider handling code here.. + //[/UserSliderCode_algo] } - //[UsercomboBoxChanged_Post] - //[/UsercomboBoxChanged_Post] + //[UsersliderValueChanged_Post] + //[/UsersliderValueChanged_Post] } @@ -447,10 +447,6 @@ BEGIN_JUCER_METADATA snapPixels="8" snapActive="1" snapShown="1" overlayOpacity="0.330" fixedSize="1" initialWidth="855" initialHeight="90"> - - - + + + END_JUCER_METADATA diff --git a/Source/GlobalEditor.h b/Source/GlobalEditor.h index 9689fc5..120df20 100644 --- a/Source/GlobalEditor.h +++ b/Source/GlobalEditor.h @@ -37,8 +37,8 @@ //[/Comments] */ class GlobalEditor : public Component, - public SliderListener, - public ComboBoxListener + public ComboBoxListener, + public SliderListener { public: //============================================================================== @@ -58,8 +58,8 @@ public: void paint (Graphics& g); void resized(); - void sliderValueChanged (Slider* sliderThatWasMoved); void comboBoxChanged (ComboBox* comboBoxThatHasChanged); + void sliderValueChanged (Slider* sliderThatWasMoved); @@ -69,7 +69,6 @@ private: //[/UserVariables] //============================================================================== - ScopedPointer algo; ScopedPointer lfoType; ScopedPointer lfoSpeed; ScopedPointer lfoAmDepth; @@ -77,7 +76,6 @@ private: ScopedPointer lfoDelay; ScopedPointer cutoff; ScopedPointer reso; - ScopedPointer algoDisplay; ScopedPointer pitchRate2; ScopedPointer pitchRate3; ScopedPointer pitchRate4; @@ -86,12 +84,14 @@ private: ScopedPointer pitchLevel3; ScopedPointer pitchLevel4; ScopedPointer pitchLevel1; - ScopedPointer feedback; ScopedPointer transpose; ScopedPointer oscSync; ScopedPointer pitchModSens; ScopedPointer lfoSync; ScopedPointer pitchEnvDisplay; + ScopedPointer algoDisplay; + ScopedPointer feedback; + ScopedPointer algo; //============================================================================== diff --git a/Source/PluginData.cpp b/Source/PluginData.cpp old mode 100644 new mode 100755 index 83423b2..8f29376 --- a/Source/PluginData.cpp +++ b/Source/PluginData.cpp @@ -32,7 +32,6 @@ uint8_t sysexChecksum(const char *sysex) { return ((1 << 8) - sum); } - void extractProgramNames(const char *block, StringArray &dest) { char programName[11]; @@ -66,35 +65,65 @@ void extractProgramNames(const char *block, StringArray &dest) { } } -int DexedAudioProcessor::importSysex(const char *imported) { - memcpy(sysex, imported + 6, 4096); - - uint8_t checksum = sysexChecksum(sysex); - extractProgramNames(sysex, programNames); - - if ( checksum != imported[4102] ) { - TRACE("sysex import checksum doesnt match"); - return 1; - } - - return 0; -} - -void DexedAudioProcessor::exportSysex(char *dest) { +void exportSysex(char *dest, char *src) { uint8_t header[] = { 0xF0, 0x43, 0x00, 0x09, 0x20, 0x00 }; memcpy(dest, header, 6); // copy 32 voices - memcpy(dest+6, sysex, 4096); + memcpy(dest+6, src, 4096); // make checksum for dump - uint8_t footer[] = { sysexChecksum(sysex), 0xF7 }; + uint8_t footer[] = { sysexChecksum(src), 0xF7 }; memcpy(dest+4102, footer, 2); } /** - * This function normalize data that comes from corrupted sysex data. + * Pack a program into a 32 packed sysex + */ +void packProgram(uint8_t *dest, uint8_t *src, int idx, String name) { + uint8_t *bulk = dest + (idx * 128); + + for(int op = 0; op < 6; op++) { + // eg rate and level, brk pt, depth, scaling + memcpy(bulk + op * 17, src + op * 21, 11); + int pp = op*17; + int up = op*21; + + // left curves + bulk[pp+11] = (src[up+11]&0x03) | ((src[up+12]&0x03) << 2); + bulk[pp+12] = (src[up+13]&0x07) | ((src[up+20]&0x0f) << 3); + // kvs_ams + bulk[pp+13] = (src[up+14]&0x03) | ((src[up+15]&0x07) << 2); + // output lvl + bulk[pp+14] = src[up+16]; + // fcoarse_mode + bulk[pp+15] = (src[up+17]&0x01) | ((src[up+18]&0x1f) << 1); + // fine freq + bulk[pp+16] = src[up+19]; + } + memcpy(bulk + 102, src + 126, 9); // pitch env, algo + bulk[111] = (src[135]&0x07) | ((src[136]&0x01) << 3); + memcpy(bulk + 112, src + 137, 4); // lfo + bulk[116] = (src[141]&0x01) | (((src[142]&0x07) << 1) | ((src[143]&0x07) << 4)); + bulk[117] = src[144]; + int eos = 0; + for(int i=0; i < 10; i++) { + char c = name[i]; + if ( c == 0 ) + eos = 1; + if ( eos ) { + bulk[117+i] = ' '; + continue; + } + c = c < 32 ? ' ' : c; + c = c > 127 ? ' ' : c; + bulk[117+i] = c; + } +} + +/** + * This function normalize data that comes from corrupted sysex. * It used to avoid engine crashing upon extrem values */ char normparm(char value, char max) { @@ -112,6 +141,11 @@ void DexedAudioProcessor::unpackProgram(int idx) { for (int op = 0; op < 6; op++) { // eg rate and level, brk pt, depth, scaling + + for(int i=0; i<11; i++) { + data[op * 21 + i] = normparm(bulk[op * 17 + i], 99); + } + memcpy(data + op * 21, bulk + op * 17, 11); char leftrightcurves = bulk[op * 17 + 11]; data[op * 21 + 11] = leftrightcurves & 3; @@ -128,7 +162,12 @@ void DexedAudioProcessor::unpackProgram(int idx) { data[op * 21 + 19] = bulk[op * 17 + 16]; // fine freq data[op * 21 + 20] = detune_rs >> 3; } - memcpy(data + 126, bulk + 102, 9); // pitch env, algo + + for (int i=0; i<8; i++) { + data[126+i] = normparm(bulk[102+i], 99); + } + data[134] = normparm(bulk[110], 31); + char oks_fb = bulk[111]; data[135] = oks_fb & 7; data[136] = oks_fb >> 3; @@ -146,69 +185,29 @@ void DexedAudioProcessor::unpackProgram(int idx) { data[160] = 1; } -void DexedAudioProcessor::packProgram(int idx, const char *name) { - char *bulk = sysex + (idx * 128); +int DexedAudioProcessor::importSysex(const char *imported) { + memcpy(sysex, imported + 6, 4096); - for(int op = 0; op < 6; op++) { - // eg rate and level, brk pt, depth, scaling - memcpy(bulk + op * 17, data + op * 21, 11); - int pp = op*17; - int up = op*21; - - // left curves - bulk[pp+11] = (data[up+11]&0x03) | ((data[up+12]&0x03) << 2); - bulk[pp+12] = (data[up+13]&0x07) | ((data[up+20]&0x0f) << 3); - // kvs_ams - bulk[pp+13] = (data[up+14]&0x03) | ((data[up+15]&0x07) << 2); - // output lvl - bulk[pp+14] = data[up+16]; - // fcoarse_mode - bulk[pp+15] = (data[up+17]&0x01) | ((data[up+18]&0x1f) << 1); - // fine freq - bulk[pp+16] = data[up+19]; - } - memcpy(bulk + 102, data + 126, 9); // pitch env, algo - bulk[111] = (data[135]&0x07) | ((data[136]&0x01) << 3); - memcpy(bulk + 112, data + 137, 4); // lfo - bulk[116] = (data[141]&0x01) | (((data[142]&0x07) << 1) | ((data[143]&0x07) << 4)); - bulk[117] = data[144]; - int eos = 0; - for(int i=0; i < 10; i++) { - char c = name[i]; - if ( c == 0 ) - eos = 1; - if ( eos ) { - bulk[117+i] = ' '; - continue; - } - c = c < 32 ? ' ' : c; - c = c > 127 ? ' ' : c; - bulk[117+i] = c; + uint8_t checksum = sysexChecksum(((char *) &sysex)); + extractProgramNames(sysex, programNames); + + if ( checksum != imported[4102] ) { + TRACE("sysex import checksum doesnt match"); + return 1; } - char programName[11]; - memcpy(programName, bulk+117, 10); - programName[10] = 0; - programNames.set(idx, String(programName)); + return 0; } + void DexedAudioProcessor::updateProgramFromSysex(const uint8 *rawdata) { memcpy(data, rawdata, 160); triggerAsyncUpdate(); } void DexedAudioProcessor::loadBuiltin(int idx) { - InputStream *is = builtin_pgm->createStreamForEntry(idx); - - if ( is == NULL ) { - TRACE("ENTRY IN ZIP NOT FOUND"); - return; - } - - uint8_t syx_data[4104]; - is->read(&syx_data, 4104); - delete is; - + char syx_data[4104]; + cartManager.getSysex(idx, (char *) &syx_data); importSysex((char *) &syx_data); } @@ -234,7 +233,7 @@ void DexedAudioProcessor::getStateInformation(MemoryBlock& destData) { state.version = CURRENT_PLUGINSTATE_VERSION; - exportSysex((char *)(&state.sysex)); + exportSysex((char *)(&state.sysex), (char *) sysex); memcpy(state.program, data, 161); state.cutoff = fx.uiCutoff; state.reso = fx.uiReso; @@ -291,3 +290,27 @@ void DexedAudioProcessor::setStateInformation(const void* source, int sizeInByte memcpy((void *) data, source, sizeInBytes); updateUI(); }*/ + + +CartridgeManager::CartridgeManager() { + MemoryInputStream *mis = new MemoryInputStream(BinaryData::builtin_pgm_zip, BinaryData::builtin_pgm_zipSize, false); + builtin_pgm = new ZipFile(mis, true); + builtin_pgm->sortEntriesByFilename(); + + for(int i=0;igetNumEntries();i++) { + const ZipFile::ZipEntry *e = builtin_pgm->getEntry(i); + cartNames.add(e->filename.dropLastCharacters(4)); + } +} + +void CartridgeManager::getSysex(int idx, char *dest) { + InputStream *is = builtin_pgm->createStreamForEntry(idx); + + if ( is == NULL ) { + TRACE("ENTRY IN ZIP NOT FOUND"); + return; + } + + is->read(dest, 4104); + delete is; +} diff --git a/Source/PluginData.h b/Source/PluginData.h old mode 100644 new mode 100755 index cdda13e..e3e80a6 --- a/Source/PluginData.h +++ b/Source/PluginData.h @@ -22,6 +22,52 @@ #define PLUGINDATA_H_INCLUDED #include "../JuceLibraryCode/JuceHeader.h" +#define SYSEX_SIZE 4104 +enum UpackedOffset { + egRate, + egLevel = 4, + breakpoint = 8, + lScaleDepth, + rScaleDepth, + lKeyScale, + rKeyScale, + rateScaling, + keyVelocity, + outputLevel, + mode, + fCoarse, + fFine, + oscDetune, + + // Global values + pitchEgRate = 126, + pitchEgLevel = 130, + algorythm = 134, + feedback, + oscKeySync, + lfoSpeed, + lfoDelay, + lfoPmDepth, + lfoAmDepth, + lfoKeySync, + lfoWave, + middleC, + pModeSens +}; + +void extractProgramNames(const char *block, StringArray &dest); +void exportSysex(char *dest, char *src); +void packProgram(uint8_t *dest, uint8_t *src, int idx, String name); + +class CartridgeManager { + ScopedPointer builtin_pgm; +public: + StringArray cartNames; + + CartridgeManager(); + void getSysex(int idx, char *data); +}; + #endif // PLUGINDATA_H_INCLUDED diff --git a/Source/PluginEditor.cpp b/Source/PluginEditor.cpp index 20614f3..e09e71f 100755 --- a/Source/PluginEditor.cpp +++ b/Source/PluginEditor.cpp @@ -31,40 +31,43 @@ DexedAudioProcessorEditor::DexedAudioProcessorEditor (DexedAudioProcessor* owner : AudioProcessorEditor (ownerFilter), midiKeyboard (ownerFilter->keyboardState, MidiKeyboardComponent::horizontalKeyboard) { - LookAndFeel::setDefaultLookAndFeel(&dx_lnf); setSize (865, 420); processor = ownerFilter; - - addAndMakeVisible (cartButton = new TextButton("CART")); - cartButton->setButtonText ("CART"); - cartButton->addListener (this); - cartButton->setBounds(5, 5, 50, 18); + + addAndMakeVisible(&cartridges); + cartridges.setEditableText(false); + cartridges.setJustificationType(Justification::centredLeft); + cartridges.setTextWhenNothingSelected(String::empty); + cartridges.setBounds(5, 5, 160, 18); + cartridges.addItemList(processor->cartManager.cartNames, 1); + cartridges.setSelectedItemIndex(0); + cartridges.addListener(this); addAndMakeVisible (loadButton = new TextButton("LOAD")); loadButton->setButtonText ("LOAD"); loadButton->addListener (this); - loadButton->setBounds(57, 5, 50, 18); + loadButton->setBounds(169, 5, 50, 18); addAndMakeVisible(saveButton = new TextButton("SAVE")); saveButton->setButtonText ("SAVE"); saveButton->addListener (this); - saveButton->setBounds (109, 5, 50, 18); + saveButton->setBounds (222, 5, 50, 18); - addAndMakeVisible (&presets); - presets.setEditableText (false); - presets.setJustificationType (Justification::centredLeft); - presets.setTextWhenNothingSelected (String::empty); - presets.setBounds(163, 5, 180, 18); - rebuildPresetCombobox(); - presets.addListener(this); + addAndMakeVisible (&programs); + programs.setEditableText (false); + programs.setJustificationType (Justification::centredLeft); + programs.setTextWhenNothingSelected (String::empty); + programs.setBounds(276, 5, 160, 18); + rebuildProgramCombobox(); + programs.addListener(this); addAndMakeVisible(storeButton = new TextButton("STORE")); storeButton->setButtonText ("STORE"); storeButton->addListener (this); - storeButton->setBounds (347, 5, 50, 18); + storeButton->setBounds (439, 5, 50, 18); addAndMakeVisible(aboutButton = new TextButton("ABOUT")); aboutButton->setButtonText ("ABOUT"); @@ -147,8 +150,8 @@ void DexedAudioProcessorEditor::buttonClicked(Button *buttonThatWasClicked) { fp_in.close(); processor->importSysex((char *) &syx_data); processor->setCurrentProgram(0); - rebuildPresetCombobox(); - presets.setSelectedId(processor->getCurrentProgram()+1, NotificationType::dontSendNotification); + rebuildProgramCombobox(); + programs.setSelectedId(processor->getCurrentProgram()+1, NotificationType::dontSendNotification); processor->updateHostDisplay(); } @@ -159,9 +162,9 @@ void DexedAudioProcessorEditor::buttonClicked(Button *buttonThatWasClicked) { FileChooser fc ("Export DX sysex...", File::nonexistent, "*.syx", 1); if ( fc.browseForFileToSave(true) ) { String f = fc.getResults().getReference(0).getFullPathName(); - uint8_t syx_data[4104]; + char syx_data[4104]; - processor->exportSysex((char *) syx_data); + exportSysex((char *) syx_data, (char *) &processor->sysex); ofstream fp_out(f.toRawUTF8(), ios::binary); fp_out.write((char *)syx_data, 4104); @@ -178,59 +181,21 @@ void DexedAudioProcessorEditor::buttonClicked(Button *buttonThatWasClicked) { } if (buttonThatWasClicked == storeButton) { - AlertWindow dialog(String("Store Program"), "", AlertWindow::NoIcon, this); - dialog.addTextEditor(String("Name"), processor->getProgramName(processor->getCurrentProgram()), String("Name"), false); - - StringArray programs; - - for(int i=0;i<32;i++) { - programs.add(presets.getItemText(i)); - } - - dialog.addComboBox(String("Dest"), programs); - dialog.addButton("OK", 0, KeyPress(KeyPress::returnKey)); - dialog.addButton("Cancel", 1, KeyPress(KeyPress::escapeKey)); - if ( dialog.runModalLoop() == 0 ) { - TextEditor *name = dialog.getTextEditor(String("Name")); - ComboBox *dest = dialog.getComboBoxComponent(String("Dest")); - - int programNum = dest->getSelectedItemIndex(); - const char *programName = name->getText().toRawUTF8(); - - processor->packProgram(programNum, programName); - - rebuildPresetCombobox(); - - processor->setCurrentProgram(programNum); - processor->updateHostDisplay(); - } + storeProgram(); return; } - +/* if (buttonThatWasClicked == cartButton) { - StringArray cart; - - for(int i=0;ibuiltin_pgm->getNumEntries();i++) { - const ZipFile::ZipEntry *e = processor->builtin_pgm->getEntry(i); - cart.add(e->filename.dropLastCharacters(4)); - } - AlertWindow dialog(String("Builtin cartridges"), "", AlertWindow::NoIcon, this); - dialog.addComboBox(String("cart"), cart); + dialog.addComboBox(String("cart"), processor->cartManager.cartNames); dialog.addButton("OK", 0, KeyPress(KeyPress::returnKey)); dialog.addButton("Cancel", 1, KeyPress(KeyPress::escapeKey)); if ( dialog.runModalLoop() == 0 ) { - ComboBox *select = dialog.getComboBoxComponent(String("cart")); - int idx = select->getSelectedItemIndex(); - processor->loadBuiltin(idx); - processor->setCurrentProgram(0); - rebuildPresetCombobox(); - presets.setSelectedId(processor->getCurrentProgram()+1, NotificationType::dontSendNotification); - processor->updateHostDisplay(); + } return; } - + */ if (buttonThatWasClicked == aboutButton) { AlertWindow::showMessageBoxAsync(AlertWindow::NoIcon, "DEXED - DX Emulator 0.3", "https://github.com/asb2m10/dexed\n" "(c) 2013-2014 Pascal Gauthier\nUnder the GPL v2\n\n" @@ -242,19 +207,22 @@ void DexedAudioProcessorEditor::buttonClicked(Button *buttonThatWasClicked) { } void DexedAudioProcessorEditor::comboBoxChanged (ComboBox* comboBoxThatHasChanged) { - processor->setCurrentProgram(comboBoxThatHasChanged->getSelectedId()-1); - processor->updateHostDisplay(); + if ( comboBoxThatHasChanged == &programs ) { + processor->setCurrentProgram(programs.getSelectedId()-1); + processor->updateHostDisplay(); + } else { + int idx = comboBoxThatHasChanged->getSelectedItemIndex(); + processor->loadBuiltin(idx); + processor->setCurrentProgram(0); + rebuildProgramCombobox(); + programs.setSelectedId(processor->getCurrentProgram()+1, NotificationType::dontSendNotification); + processor->updateHostDisplay(); + } } void DexedAudioProcessorEditor::timerCallback() { int32_t env[6]; - if ( processor->refreshUI ) { - if ( processor->refreshUI & DexedAudioProcessor::REFRESH_MSG ) - global.repaint(); - processor->refreshUI = 0; - } - if ( processor->peekEnvStatus(env) == false ) return; @@ -272,18 +240,96 @@ void DexedAudioProcessorEditor::updateUI() { } int id = processor->getCurrentProgram() + 1; - presets.setSelectedId(id, NotificationType::dontSendNotification); + programs.setSelectedId(id, NotificationType::dontSendNotification); global.updateDisplay(); } -void DexedAudioProcessorEditor::rebuildPresetCombobox() { - presets.clear(NotificationType::dontSendNotification); +void DexedAudioProcessorEditor::rebuildProgramCombobox() { + programs.clear(NotificationType::dontSendNotification); for(int i=0;igetNumPrograms();i++) { String id; id << (i+1) << ". " << processor->getProgramName(i); - presets.addItem(id, i+1); + programs.addItem(id, i+1); } - presets.setSelectedId(processor->getCurrentProgram()+1, NotificationType::dontSendNotification); + programs.setSelectedId(processor->getCurrentProgram()+1, NotificationType::dontSendNotification); } +void DexedAudioProcessorEditor::storeProgram() { + String currentName(processor->getProgramName(processor->getCurrentProgram())); + char destSysex[4096]; + File *externalFile = NULL; + + memcpy(&destSysex, processor->sysex, 4096); + + while (true) { + String msg; + if ( externalFile == NULL ) { + msg = "Store program to current cartridge"; + } else { + msg = "Store program to " + externalFile->getFileName(); + } + + AlertWindow dialog(String("Store Program"), msg, AlertWindow::NoIcon, this); + dialog.addTextEditor(String("Name"), currentName, String("Name"), false); + // TODO: fix the name length to 10 + + StringArray programs; + extractProgramNames((char *) &destSysex, programs); + + dialog.addComboBox(String("Dest"), programs); + dialog.addButton("OK", 0, KeyPress(KeyPress::returnKey)); + dialog.addButton("Cancel", 1, KeyPress(KeyPress::escapeKey)); + dialog.addButton("External File", 2, KeyPress()); + int response = dialog.runModalLoop(); + + if ( response == 2 ) { + FileChooser fc("Destination Sysex", File::nonexistent, "*.syx;*.SYX;*.*", 1); + + if ( fc.browseForFileToOpen() ) { + if ( externalFile != NULL ) + delete externalFile; + + MemoryBlock block; + externalFile = new File(fc.getResults().getReference(0)); + if ( externalFile->loadFileAsData(block) ) { + block.copyTo(destSysex, 6, 4096); + continue; + } + AlertWindow::showMessageBoxAsync(AlertWindow::WarningIcon, "Read error", "Unable to read file"); + } + } + + if ( response == 0 ) { + TextEditor *name = dialog.getTextEditor(String("Name")); + ComboBox *dest = dialog.getComboBoxComponent(String("Dest")); + + int programNum = dest->getSelectedItemIndex(); + String programName = name->getText(); + if ( programName.length() > 10 ) { + int toStrip = programName.length() - 10; + programName.dropLastCharacters(toStrip); + } + + if ( externalFile == NULL ) { + packProgram((uint8_t *) processor->sysex, (uint8_t *) processor->data, programNum, programName); + processor->programNames.set(programNum, programName); + rebuildProgramCombobox(); + processor->setCurrentProgram(programNum); + processor->updateHostDisplay(); + } else { + packProgram((uint8_t *) &destSysex, (uint8_t *) processor->data, programNum, programName); + char sysexFile[4104]; + exportSysex((char *) &sysexFile, (char *) &destSysex); + if ( ! externalFile->replaceWithData(sysexFile, 4104) ) { + AlertWindow::showMessageBoxAsync(AlertWindow::WarningIcon, "Write error", "Unable to write file"); + } + } + } + + break; + } + + if ( externalFile != NULL ) + delete externalFile; +} diff --git a/Source/PluginEditor.h b/Source/PluginEditor.h index ff0d774..8aa5c4e 100755 --- a/Source/PluginEditor.h +++ b/Source/PluginEditor.h @@ -35,15 +35,19 @@ class DexedAudioProcessorEditor : public AudioProcessorEditor, public ComboBoxListener, public Timer { DexedAudioProcessor *processor; - ComboBox presets; + ComboBox programs; + ComboBox cartridges; + MidiKeyboardComponent midiKeyboard; DXLookNFeel dx_lnf; - - ScopedPointer cartButton; + ScopedPointer loadButton; ScopedPointer saveButton; ScopedPointer storeButton; ScopedPointer aboutButton; + ScopedPointer settings; + + void storeProgram(); public: @@ -57,11 +61,12 @@ public: void paint (Graphics& g); void buttonClicked (Button* buttonThatWasClicked); void comboBoxChanged (ComboBox* comboBoxThatHasChanged); + OperatorEditor operators[6]; GlobalEditor global; void updateUI(); - void rebuildPresetCombobox(); + void rebuildProgramCombobox(); }; diff --git a/Source/PluginFx.cpp b/Source/PluginFx.cpp old mode 100644 new mode 100755 diff --git a/Source/PluginFx.h b/Source/PluginFx.h old mode 100644 new mode 100755 diff --git a/Source/PluginParam.cpp b/Source/PluginParam.cpp index 2e8b370..65b60a8 100755 --- a/Source/PluginParam.cpp +++ b/Source/PluginParam.cpp @@ -205,12 +205,7 @@ void CtrlDX::updateComponent() { * */ void DexedAudioProcessor::initCtrl() { - MemoryInputStream *mis = new MemoryInputStream(BinaryData::builtin_pgm_zip, BinaryData::builtin_pgm_zipSize, false); - builtin_pgm = new ZipFile(mis, true); - builtin_pgm->sortEntriesByFilename(); - loadBuiltin(0); - currentProgram = 0; fxCutoff = new CtrlFloat("Cutoff", &fx.uiCutoff); diff --git a/Source/PluginProcessor.h b/Source/PluginProcessor.h index 2e6b00a..eea87c7 100755 --- a/Source/PluginProcessor.h +++ b/Source/PluginProcessor.h @@ -28,6 +28,7 @@ #include "msfa/lfo.h" #include "msfa/synth.h" #include "PluginParam.h" +#include "PluginData.h" #include "PluginFx.h" struct ProcessorVoice { @@ -61,8 +62,6 @@ class DexedAudioProcessor : public AudioProcessor, public AsyncUpdater SInt16 *workBlock; int workBlockSize; int currentProgram; - char sysex[4096]; - StringArray programNames; /** * The last time the state was save, to be able to bypass a VST host bug. @@ -99,12 +98,12 @@ class DexedAudioProcessor : public AudioProcessor, public AsyncUpdater void initCtrl(); public : - static const int REFRESH_MSG = 1; - int refreshUI; - + StringArray programNames; + char sysex[4096]; char data[161]; - ScopedPointer builtin_pgm; + CartridgeManager cartManager; + Array ctrl; OperatorCtrl opCtrl[6]; @@ -126,7 +125,6 @@ public : ScopedPointer fxReso; int importSysex(const char *imported); - void exportSysex(char *dest); void setDxValue(int offset, int v); //==============================================================================