commit 843c6e300cc54a90c5643a263ee5e4ce4ca97fcf Author: Jens Ahrensfeld Date: Sat Oct 25 07:27:55 2014 +0000 - initial import git-svn-id: http://moon:8086/svn/software/trunk/projects/JaySynth@37 b431acfa-c32f-4a4a-93f1-934dc6c82436 diff --git a/Builds/VisualStudio2008/JaySynth.ncb b/Builds/VisualStudio2008/JaySynth.ncb new file mode 100644 index 0000000..d5d65a6 Binary files /dev/null and b/Builds/VisualStudio2008/JaySynth.ncb differ diff --git a/Builds/VisualStudio2008/JaySynth.sdf b/Builds/VisualStudio2008/JaySynth.sdf new file mode 100644 index 0000000..46e99a3 Binary files /dev/null and b/Builds/VisualStudio2008/JaySynth.sdf differ diff --git a/Builds/VisualStudio2008/JaySynth.sln b/Builds/VisualStudio2008/JaySynth.sln new file mode 100644 index 0000000..259aa0d --- /dev/null +++ b/Builds/VisualStudio2008/JaySynth.sln @@ -0,0 +1,19 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "JaySynth", "JaySynth.vcxproj", "{2400C049-DC84-E012-E041-0D0690E731F9}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2400C049-DC84-E012-E041-0D0690E731F9}.Debug|Win32.ActiveCfg = Debug|Win32 + {2400C049-DC84-E012-E041-0D0690E731F9}.Debug|Win32.Build.0 = Debug|Win32 + {2400C049-DC84-E012-E041-0D0690E731F9}.Release|Win32.ActiveCfg = Release|Win32 + {2400C049-DC84-E012-E041-0D0690E731F9}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Builds/VisualStudio2008/JaySynth.suo b/Builds/VisualStudio2008/JaySynth.suo new file mode 100644 index 0000000..249ea58 Binary files /dev/null and b/Builds/VisualStudio2008/JaySynth.suo differ diff --git a/Builds/VisualStudio2008/JaySynth.v11.suo b/Builds/VisualStudio2008/JaySynth.v11.suo new file mode 100644 index 0000000..ee8011b Binary files /dev/null and b/Builds/VisualStudio2008/JaySynth.v11.suo differ diff --git a/Builds/VisualStudio2008/JaySynth.vcproj b/Builds/VisualStudio2008/JaySynth.vcproj new file mode 100644 index 0000000..2c7a7dc --- /dev/null +++ b/Builds/VisualStudio2008/JaySynth.vcproj @@ -0,0 +1,9316 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Builds/VisualStudio2008/JaySynth.vcproj.Saturn.jens.user b/Builds/VisualStudio2008/JaySynth.vcproj.Saturn.jens.user new file mode 100644 index 0000000..8f26f63 --- /dev/null +++ b/Builds/VisualStudio2008/JaySynth.vcproj.Saturn.jens.user @@ -0,0 +1,65 @@ + + + + + + + + + + + diff --git a/Builds/VisualStudio2008/JaySynth.vcproj.jupiter.jens.user b/Builds/VisualStudio2008/JaySynth.vcproj.jupiter.jens.user new file mode 100644 index 0000000..7b45bd7 --- /dev/null +++ b/Builds/VisualStudio2008/JaySynth.vcproj.jupiter.jens.user @@ -0,0 +1,65 @@ + + + + + + + + + + + diff --git a/Builds/VisualStudio2008/JaySynth.vcxproj b/Builds/VisualStudio2008/JaySynth.vcxproj new file mode 100644 index 0000000..e7d853c --- /dev/null +++ b/Builds/VisualStudio2008/JaySynth.vcxproj @@ -0,0 +1,2006 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {2400C049-DC84-E012-E041-0D0690E731F9} + JaySynth + + + + DynamicLibrary + v110 + false + MultiByte + true + + + DynamicLibrary + v110 + false + MultiByte + + + + + + + + + + + + + <_ProjectFileVersion>11.0.50727.1 + + + .\Debug\ + .\Debug\ + true + + + .\Release\ + .\Release\ + true + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + .\Debug\JaySynth.tlb + + + + Disabled + ..\..\JuceLibraryCode;..\..\..\..\..\SDKs\juce;..\..\..\..\..\libsrc;..\..\..\..\..\SDKs\vst2\vstsdk2.4;..\..\..\..\..\Projects\VST\JaySynth1\Source\synth;%(AdditionalIncludeDirectories) + fir_float_t=double;SYNTH_DEBUG;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2008_78A5006=1;%(PreprocessorDefinitions) + MultiThreadedDebug + true + + .\Debug\JaySynth.pch + .\Debug\ + .\Debug\ + .\Debug\ + true + Level4 + true + EditAndContinue + + + _DEBUG;%(PreprocessorDefinitions) + + + .\Debug\JaySynth.dll + true + libcmt.lib; msvcrt.lib;%(IgnoreSpecificDefaultLibraries) + true + .\Debug\JaySynth.pdb + Windows + MachineX86 + + + true + .\Debug\JaySynth.bsc + + + Post-build + copy $(TargetPath) "C:\Program Files (x86)\Steinberg\VSTPlugins" + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + .\Release\JaySynth.tlb + + + + Full + AnySuitable + Speed + true + ..\..\JuceLibraryCode;..\..\..\..\..\SDKs\juce;..\..\..\..\..\libsrc;..\..\..\..\..\SDKs\vst2\vstsdk2.4;..\..\..\..\..\Projects\VST\JaySynth1\Source\synth;%(AdditionalIncludeDirectories) + fir_float_t=double;WIN32;_WINDOWS;NDEBUG;JUCER_VS2008_78A5006=1;%(PreprocessorDefinitions) + true + Default + MultiThreaded + StreamingSIMDExtensions2 + Fast + false + true + + .\Release\JaySynth.pch + .\Release\ + .\Release\ + .\Release\ + Level4 + true + + + + NDEBUG;%(PreprocessorDefinitions) + + + .\Release\JaySynth.dll + true + false + .\Release\JaySynth.pdb + Windows + true + true + MachineX86 + false + + + true + .\Release\JaySynth.bsc + + + Post-build + copy $(TargetPath) "C:\Program Files (x86)\Steinberg\VSTPlugins" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + true + true + + + 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 + StdCall + + + StdCall + StdCall + + + StdCall + StdCall + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + true + + + true + true + + + + + true + true + + + true + true + + + + + + true + true + + + + true + true + + + + + + + + true + true + + + true + true + + + + + true + true + + + + + true + true + + + + + + + + + + true + true + + + + + + + true + true + + + + + + + + + \ No newline at end of file diff --git a/Builds/VisualStudio2008/JaySynth.vcxproj.filters b/Builds/VisualStudio2008/JaySynth.vcxproj.filters new file mode 100644 index 0000000..353290f --- /dev/null +++ b/Builds/VisualStudio2008/JaySynth.vcxproj.filters @@ -0,0 +1,2752 @@ + + + + + {e87cb7d5-9c99-4895-8609-4d9756a62dbd} + + + {c58e7f56-4dbc-4a9a-b868-08b1f0509076} + + + {d48c62e7-7556-4004-b021-494a05b7beec} + + + {871b74ce-8731-44d9-b8bc-22bb79035e09} + + + {a9328582-6981-40af-b913-4b28a8f0a7ea} + + + {38b7295a-b440-4a55-9df8-b58c5ca48d2c} + + + {7dbaa878-846d-4e1a-a2db-6991673bd6da} + + + {840e0209-7278-43bb-a0db-d1eb8e6f0b47} + + + {fe3d180d-12c4-416f-a8e0-8bf3b3de054f} + + + {c2a7ee1e-3987-46f4-ab6b-084c3cbf4429} + + + {6387f0aa-5ecd-4854-a0e6-272c57c40b75} + + + {34810cb0-a8aa-438c-b8b8-3917cf355e21} + + + {d1c886ff-8d7a-49c4-aa93-d2321ad18d79} + + + {724c1e45-4fc2-4bb3-9a10-fb5c52ef564f} + + + {7db9bfef-1fb6-4e98-b69c-9723ab6842a5} + + + {65e5631c-d7c2-4925-ba3b-2f8df4adb2e8} + + + {e9eba772-115d-4701-a6a9-f7fbd330a77d} + + + {fec6b41c-036d-4540-b622-cb14d6e9060f} + + + {2a9dae39-f150-441f-ba75-effd0b9094eb} + + + {24e30e4f-a823-4066-bbbd-98ba76619ad0} + + + {5ab00cdb-2569-4b54-9296-3f848a88c185} + + + {d2d0e880-c177-4746-8b01-09e083f8d426} + + + {d2ae610c-3e0f-4eec-b729-4fe5c7e23717} + + + {d8a06864-e4fd-4409-bc98-20ba37d3a9bd} + + + {dee55115-f939-4feb-84f1-36a7b22f156a} + + + {55823798-5a2d-4429-a064-f730ed7170b1} + + + {667c94d0-8001-4022-afef-268ff908fa0a} + + + {d1be14c6-25cb-4c98-b098-dc3022593371} + + + {96eca1bc-2d9e-437d-9c34-089889b29052} + + + {5b20ebf1-6c78-488c-9c9c-6cad173430bc} + + + {d353e298-d52b-45da-99b3-0b9547321883} + + + {96eea105-0241-468b-ba9b-f7f7bb7f76b7} + + + {e392cd7a-ec5f-4520-b08b-5828400c32f9} + + + {98e54953-7f8a-4b4b-ae1c-97d1192fe4cf} + + + {5c225685-3dd5-401f-93b3-1bd7223ba2cf} + + + {a07045e0-6cfc-4c00-84e1-b26c9d7b7e36} + + + {48188d4d-5168-4aef-adac-1116e34db929} + + + {565156db-a449-4bc3-aa99-8376549f8d28} + + + {fc498f52-178d-430d-9747-99ef7fa2aed2} + + + {71f470d8-6500-4b4a-a12a-edcd2b5b571c} + + + {4967c8e7-f916-43bd-9216-9b89d3c0704f} + + + {c8709af5-ba92-4095-aaaa-00a2af8974cc} + + + {2541acac-b4f1-476c-bced-6585dc160126} + + + {256ee540-96ed-4ff7-b9de-e69011799563} + + + {cff586ce-a4d0-415d-a05f-49044981b9ce} + + + {90457742-f48d-4ff0-bb5e-c82fa064bd79} + + + {f69acd50-74ed-4981-9211-f7a37ec114aa} + + + {068e81eb-c3c4-45cf-bc89-2bb1622ce401} + + + {21a54d4d-cd12-4916-8254-f9d526e0205f} + + + {179c70ff-719d-4e2f-9b13-37e78be104ac} + + + {c53b46ed-9aac-410e-912e-94de0b10a39c} + + + {9672e070-0656-4e27-9456-9b2e0448be37} + + + {2c676fcc-516c-4ce0-8885-f6d79d8beb80} + + + {07cf3139-4362-456c-bc28-56a8cd2ca3db} + + + {6b83e2af-98a6-437e-a7f1-866adf472f2b} + + + {61831753-e847-4050-ac38-e4c9f48359d1} + + + {285bf376-5a50-4ba6-917e-2be40bce5a36} + + + {33f27db2-d30e-4e75-91ac-f231acd8390a} + + + {b440f27a-fa16-416c-87bf-8c1abc53bd36} + + + {4f949a3e-c4e0-4518-8332-d0eb7de56dbb} + + + {2cc69efe-78b3-4db5-aa6d-ac715992e122} + + + {d6e771ba-69df-4aae-82b1-84ff51245c6d} + + + {722f8d85-cac3-4633-9a82-577e1645b5f8} + + + {074e861b-675d-47e0-9080-22c9e5e9da42} + + + {2e5b667e-67b6-4a61-b2b2-14bda5b4a787} + + + {c38a4b78-6270-4604-a02e-810aa5b234ac} + + + {46738e50-ed8e-44a9-a051-93bda175eb2f} + + + {fe806204-3170-4b48-8c22-a9a6ddccff92} + + + {12073271-4239-453b-b5a9-243a504a2ca8} + + + {a18bfc10-cb2c-4d67-9f7b-d3e73849f346} + + + {9365259a-7e7a-4376-8d1f-0487ec12f1d8} + + + {d61d9cbe-e249-4a52-a3b0-2caf3e6b647c} + + + {d1381855-82e9-4911-b16d-ce87916f3995} + + + {d43b0cda-6b05-416d-ada0-f2d8274848e3} + + + {7527bc11-2cdf-4b54-b4cb-aaa134c13db4} + + + {c9bbd48c-a7e5-4f29-b460-e46bb51d60e5} + + + {66b03071-587a-4e8c-ab4c-ca7d3a3156b8} + + + {c35684e2-37ce-42a5-ab03-4f479608f60b} + + + {e1377419-e5b0-46ec-bc0f-ea72c958e63b} + + + {53e1ec1a-63b1-4fa0-a2e0-728bebfe1b98} + + + {b8ba3f91-227c-4b4a-bf97-c004796e6d75} + + + {523f2f06-db53-4ffd-917f-4cafbc81dc4c} + + + {7b5252c9-3d5d-4e59-bdfe-b2e994f994b5} + + + {915d6976-0fde-4127-99b5-e0d7ef71fe22} + + + {d7a8a9b8-8cdb-4a28-ad5f-ed3488f25d61} + + + {004d2252-8fcf-4d7f-8306-d5ebb3b4f68c} + + + {252fcf4b-9ea3-46cd-8f05-79f42bea5dd9} + + + {efe75190-c931-4dae-bde2-d2001209d0fa} + + + {ecb044e5-40e4-45b1-9572-5228e1f19ff3} + + + {12784a44-b9f5-4032-87b0-a7241e41303c} + + + {424cbb54-dbc8-45b9-bc9a-ac5f47e3e666} + + + {2cdcf1f2-faa0-4928-a4ec-42c5aa2f56c8} + + + {82cf65e0-1312-4d2a-b6e9-47087dc65f69} + + + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + 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\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_devices\audio_io + + + Juce Modules\juce_audio_devices\audio_io + + + Juce Modules\juce_audio_devices\audio_io + + + Juce Modules\juce_audio_devices\midi_io + + + Juce Modules\juce_audio_devices\midi_io + + + Juce Modules\juce_audio_devices\sources + + + Juce Modules\juce_audio_devices\sources + + + Juce Modules\juce_audio_devices\audio_cd + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_formats\format + + + Juce Modules\juce_audio_formats\format + + + Juce Modules\juce_audio_formats\format + + + Juce Modules\juce_audio_formats\format + + + Juce Modules\juce_audio_formats\format + + + Juce Modules\juce_audio_formats\format + + + Juce Modules\juce_audio_formats\codecs + + + Juce Modules\juce_audio_formats\codecs + + + Juce Modules\juce_audio_formats\codecs + + + Juce Modules\juce_audio_formats\codecs + + + Juce Modules\juce_audio_formats\codecs + + + Juce Modules\juce_audio_formats\codecs + + + Juce Modules\juce_audio_formats\codecs + + + Juce Modules\juce_audio_formats\codecs + + + Juce Modules\juce_audio_formats\sampler + + + 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\scanning + + + Juce Modules\juce_audio_processors\scanning + + + Juce Modules\juce_audio_processors\scanning + + + 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\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\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\json + + + 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_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_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\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\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\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\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\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_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\lookandfeel + + + 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 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 Modules\juce_audio_basics + + + Juce Modules\juce_audio_devices + + + Juce Modules\juce_audio_formats + + + Juce Modules\juce_audio_plugin_client + + + Juce Modules\juce_audio_processors + + + 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 + + + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + JaySynth\Source + + + Juce Modules\juce_audio_basics + + + 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\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_devices + + + Juce Modules\juce_audio_devices\audio_io + + + Juce Modules\juce_audio_devices\audio_io + + + Juce Modules\juce_audio_devices\audio_io + + + Juce Modules\juce_audio_devices\midi_io + + + Juce Modules\juce_audio_devices\midi_io + + + Juce Modules\juce_audio_devices\midi_io + + + Juce Modules\juce_audio_devices\sources + + + Juce Modules\juce_audio_devices\sources + + + Juce Modules\juce_audio_devices\audio_cd + + + Juce Modules\juce_audio_devices\audio_cd + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_formats + + + Juce Modules\juce_audio_formats\format + + + Juce Modules\juce_audio_formats\format + + + Juce Modules\juce_audio_formats\format + + + Juce Modules\juce_audio_formats\format + + + Juce Modules\juce_audio_formats\format + + + Juce Modules\juce_audio_formats\format + + + Juce Modules\juce_audio_formats\codecs + + + Juce Modules\juce_audio_formats\codecs + + + Juce Modules\juce_audio_formats\codecs + + + Juce Modules\juce_audio_formats\codecs + + + Juce Modules\juce_audio_formats\codecs + + + Juce Modules\juce_audio_formats\codecs + + + Juce Modules\juce_audio_formats\codecs + + + Juce Modules\juce_audio_formats\codecs + + + Juce Modules\juce_audio_formats\sampler + + + Juce Modules\juce_audio_plugin_client + + + 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_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\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_core + + + 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\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\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\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\json + + + 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\native + + + Juce Modules\juce_data_structures + + + 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_events + + + 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_graphics + + + 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_gui_basics + + + 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\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\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\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\application + + + Juce Modules\juce_gui_basics\native + + + Juce Modules\juce_gui_extra + + + 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\lookandfeel + + + 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 Library Code + + + Juce Library Code + + + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_devices\native + + + Juce Modules\juce_audio_plugin_client\AU + + + Juce Modules\juce_audio_plugin_client\RTAS + + + Juce Modules\juce_audio_plugin_client\VST + + + Juce Modules\juce_audio_processors\format_types + + + 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_events\native + + + Juce Modules\juce_events\native + + + Juce Modules\juce_graphics\native + + + Juce Modules\juce_graphics\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\native + + + Juce Modules\juce_gui_extra\native + + + Juce Modules\juce_gui_extra\native + + + Juce Modules\juce_gui_extra\native + + + + + Juce Library Code + + + \ No newline at end of file diff --git a/Builds/VisualStudio2008/UpgradeLog.XML b/Builds/VisualStudio2008/UpgradeLog.XML new file mode 100644 index 0000000..44c6d61 Binary files /dev/null and b/Builds/VisualStudio2008/UpgradeLog.XML differ diff --git a/Builds/VisualStudio2008/UpgradeLog.htm b/Builds/VisualStudio2008/UpgradeLog.htm new file mode 100644 index 0000000..70b2e4b Binary files /dev/null and b/Builds/VisualStudio2008/UpgradeLog.htm differ diff --git a/Builds/VisualStudio2008/resource.h b/Builds/VisualStudio2008/resource.h new file mode 100644 index 0000000..807da62 --- /dev/null +++ b/Builds/VisualStudio2008/resource.h @@ -0,0 +1,1489 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by resources.rc +// +#define SW_HIDE 0 +#define HIDE_WINDOW 0 +#define WM_NULL 0x0000 +#define WA_INACTIVE 0 +#define HTNOWHERE 0 +#define SMTO_NORMAL 0x0000 +#define ICON_SMALL 0 +#define SIZE_RESTORED 0 +#define BN_CLICKED 0 +#define BST_UNCHECKED 0x0000 +#define HDS_HORZ 0x0000 +#define TBSTYLE_BUTTON 0x0000 +#define TBS_HORZ 0x0000 +#define TBS_BOTTOM 0x0000 +#define TBS_RIGHT 0x0000 +#define LVS_ICON 0x0000 +#define LVS_ALIGNTOP 0x0000 +#define TCS_TABS 0x0000 +#define TCS_SINGLELINE 0x0000 +#define TCS_RIGHTJUSTIFY 0x0000 +#define DTS_SHORTDATEFORMAT 0x0000 +#define PGS_VERT 0x00000000 +#define LANG_NEUTRAL 0x00 +#define SUBLANG_NEUTRAL 0x00 +#define SORT_DEFAULT 0x0 +#define SORT_JAPANESE_XJIS 0x0 +#define SORT_CHINESE_BIG5 0x0 +#define SORT_CHINESE_PRCP 0x0 +#define SORT_KOREAN_KSC 0x0 +#define SORT_HUNGARIAN_DEFAULT 0x0 +#define SORT_GEORGIAN_TRADITIONAL 0x0 +#define _USE_DECLSPECS_FOR_SAL 0 +#define _USE_ATTRIBUTES_FOR_SAL 0 +#define CREATEPROCESS_MANIFEST_RESOURCE_ID 1 +#define MINIMUM_RESERVED_MANIFEST_RESOURCE_ID 1 +#define SW_SHOWNORMAL 1 +#define SW_NORMAL 1 +#define SHOW_OPENWINDOW 1 +#define SW_PARENTCLOSING 1 +#define VK_LBUTTON 0x01 +#define WM_CREATE 0x0001 +#define WA_ACTIVE 1 +#define PWR_OK 1 +#define PWR_SUSPENDREQUEST 1 +#define NFR_ANSI 1 +#define UIS_SET 1 +#define UISF_HIDEFOCUS 0x1 +#define XBUTTON1 0x0001 +#define WMSZ_LEFT 1 +#define HTCLIENT 1 +#define SMTO_BLOCK 0x0001 +#define MA_ACTIVATE 1 +#define ICON_BIG 1 +#define SIZE_MINIMIZED 1 +#define MK_LBUTTON 0x0001 +#define TME_HOVER 0x00000001 +#define CS_VREDRAW 0x0001 +#define CF_TEXT 1 +#define SCF_ISSECURE 0x00000001 +#define IDOK 1 +#define BN_PAINT 1 +#define BST_CHECKED 0x0001 +#define TBSTYLE_SEP 0x0001 +#define TTS_ALWAYSTIP 0x01 +#define TBS_AUTOTICKS 0x0001 +#define UDS_WRAP 0x0001 +#define PBS_SMOOTH 0x01 +#define LWS_TRANSPARENT 0x0001 +#define LVS_REPORT 0x0001 +#define TVS_HASBUTTONS 0x0001 +#define TCS_SCROLLOPPOSITE 0x0001 +#define ACS_CENTER 0x0001 +#define MCS_DAYSTATE 0x0001 +#define DTS_UPDOWN 0x0001 +#define PGS_HORZ 0x00000001 +#define NFS_EDIT 0x0001 +#define BCSIF_GLYPH 0x0001 +#define BCSS_NOSPLIT 0x0001 +#define LANG_ARABIC 0x01 +#define SUBLANG_DEFAULT 0x01 +#define SUBLANG_AFRIKAANS_SOUTH_AFRICA 0x01 +#define SUBLANG_ALBANIAN_ALBANIA 0x01 +#define SUBLANG_ALSATIAN_FRANCE 0x01 +#define SUBLANG_AMHARIC_ETHIOPIA 0x01 +#define SUBLANG_ARABIC_SAUDI_ARABIA 0x01 +#define SUBLANG_ARMENIAN_ARMENIA 0x01 +#define SUBLANG_ASSAMESE_INDIA 0x01 +#define SUBLANG_AZERI_LATIN 0x01 +#define SUBLANG_BASHKIR_RUSSIA 0x01 +#define SUBLANG_BASQUE_BASQUE 0x01 +#define SUBLANG_BELARUSIAN_BELARUS 0x01 +#define SUBLANG_BENGALI_INDIA 0x01 +#define SUBLANG_BRETON_FRANCE 0x01 +#define SUBLANG_BULGARIAN_BULGARIA 0x01 +#define SUBLANG_CATALAN_CATALAN 0x01 +#define SUBLANG_CHINESE_TRADITIONAL 0x01 +#define SUBLANG_CORSICAN_FRANCE 0x01 +#define SUBLANG_CZECH_CZECH_REPUBLIC 0x01 +#define SUBLANG_CROATIAN_CROATIA 0x01 +#define SUBLANG_DANISH_DENMARK 0x01 +#define SUBLANG_DARI_AFGHANISTAN 0x01 +#define SUBLANG_DIVEHI_MALDIVES 0x01 +#define SUBLANG_DUTCH 0x01 +#define SUBLANG_ENGLISH_US 0x01 +#define SUBLANG_ESTONIAN_ESTONIA 0x01 +#define SUBLANG_FAEROESE_FAROE_ISLANDS 0x01 +#define SUBLANG_FILIPINO_PHILIPPINES 0x01 +#define SUBLANG_FINNISH_FINLAND 0x01 +#define SUBLANG_FRENCH 0x01 +#define SUBLANG_FRISIAN_NETHERLANDS 0x01 +#define SUBLANG_GALICIAN_GALICIAN 0x01 +#define SUBLANG_GEORGIAN_GEORGIA 0x01 +#define SUBLANG_GERMAN 0x01 +#define SUBLANG_GREEK_GREECE 0x01 +#define SUBLANG_GREENLANDIC_GREENLAND 0x01 +#define SUBLANG_GUJARATI_INDIA 0x01 +#define SUBLANG_HAUSA_NIGERIA_LATIN 0x01 +#define SUBLANG_HEBREW_ISRAEL 0x01 +#define SUBLANG_HINDI_INDIA 0x01 +#define SUBLANG_HUNGARIAN_HUNGARY 0x01 +#define SUBLANG_ICELANDIC_ICELAND 0x01 +#define SUBLANG_IGBO_NIGERIA 0x01 +#define SUBLANG_INDONESIAN_INDONESIA 0x01 +#define SUBLANG_INUKTITUT_CANADA 0x01 +#define SUBLANG_ITALIAN 0x01 +#define SUBLANG_JAPANESE_JAPAN 0x01 +#define SUBLANG_KANNADA_INDIA 0x01 +#define SUBLANG_KAZAK_KAZAKHSTAN 0x01 +#define SUBLANG_KHMER_CAMBODIA 0x01 +#define SUBLANG_KICHE_GUATEMALA 0x01 +#define SUBLANG_KINYARWANDA_RWANDA 0x01 +#define SUBLANG_KONKANI_INDIA 0x01 +#define SUBLANG_KOREAN 0x01 +#define SUBLANG_KYRGYZ_KYRGYZSTAN 0x01 +#define SUBLANG_LAO_LAO 0x01 +#define SUBLANG_LATVIAN_LATVIA 0x01 +#define SUBLANG_LITHUANIAN 0x01 +#define SUBLANG_LUXEMBOURGISH_LUXEMBOURG 0x01 +#define SUBLANG_MACEDONIAN_MACEDONIA 0x01 +#define SUBLANG_MALAY_MALAYSIA 0x01 +#define SUBLANG_MALAYALAM_INDIA 0x01 +#define SUBLANG_MALTESE_MALTA 0x01 +#define SUBLANG_MAORI_NEW_ZEALAND 0x01 +#define SUBLANG_MAPUDUNGUN_CHILE 0x01 +#define SUBLANG_MARATHI_INDIA 0x01 +#define SUBLANG_MOHAWK_MOHAWK 0x01 +#define SUBLANG_MONGOLIAN_CYRILLIC_MONGOLIA 0x01 +#define SUBLANG_NEPALI_NEPAL 0x01 +#define SUBLANG_NORWEGIAN_BOKMAL 0x01 +#define SUBLANG_OCCITAN_FRANCE 0x01 +#define SUBLANG_ORIYA_INDIA 0x01 +#define SUBLANG_PASHTO_AFGHANISTAN 0x01 +#define SUBLANG_PERSIAN_IRAN 0x01 +#define SUBLANG_POLISH_POLAND 0x01 +#define SUBLANG_PORTUGUESE_BRAZILIAN 0x01 +#define SUBLANG_PUNJABI_INDIA 0x01 +#define SUBLANG_QUECHUA_BOLIVIA 0x01 +#define SUBLANG_ROMANIAN_ROMANIA 0x01 +#define SUBLANG_ROMANSH_SWITZERLAND 0x01 +#define SUBLANG_RUSSIAN_RUSSIA 0x01 +#define SUBLANG_SAMI_NORTHERN_NORWAY 0x01 +#define SUBLANG_SANSKRIT_INDIA 0x01 +#define SUBLANG_SERBIAN_CROATIA 0x01 +#define SUBLANG_SINDHI_INDIA 0x01 +#define SUBLANG_SINHALESE_SRI_LANKA 0x01 +#define SUBLANG_SOTHO_NORTHERN_SOUTH_AFRICA 0x01 +#define SUBLANG_SLOVAK_SLOVAKIA 0x01 +#define SUBLANG_SLOVENIAN_SLOVENIA 0x01 +#define SUBLANG_SPANISH 0x01 +#define SUBLANG_SWAHILI_KENYA 0x01 +#define SUBLANG_SWEDISH 0x01 +#define SUBLANG_SYRIAC_SYRIA 0x01 +#define SUBLANG_TAJIK_TAJIKISTAN 0x01 +#define SUBLANG_TAMIL_INDIA 0x01 +#define SUBLANG_TATAR_RUSSIA 0x01 +#define SUBLANG_TELUGU_INDIA 0x01 +#define SUBLANG_THAI_THAILAND 0x01 +#define SUBLANG_TIBETAN_PRC 0x01 +#define SUBLANG_TSWANA_SOUTH_AFRICA 0x01 +#define SUBLANG_TURKISH_TURKEY 0x01 +#define SUBLANG_TURKMEN_TURKMENISTAN 0x01 +#define SUBLANG_UIGHUR_PRC 0x01 +#define SUBLANG_UKRAINIAN_UKRAINE 0x01 +#define SUBLANG_UPPER_SORBIAN_GERMANY 0x01 +#define SUBLANG_URDU_PAKISTAN 0x01 +#define SUBLANG_UZBEK_LATIN 0x01 +#define SUBLANG_VIETNAMESE_VIETNAM 0x01 +#define SUBLANG_WELSH_UNITED_KINGDOM 0x01 +#define SUBLANG_WOLOF_SENEGAL 0x01 +#define SUBLANG_XHOSA_SOUTH_AFRICA 0x01 +#define SUBLANG_YAKUT_RUSSIA 0x01 +#define SUBLANG_YI_PRC 0x01 +#define SUBLANG_YORUBA_NIGERIA 0x01 +#define SUBLANG_ZULU_SOUTH_AFRICA 0x01 +#define SORT_INVARIANT_MATH 0x1 +#define SORT_JAPANESE_UNICODE 0x1 +#define SORT_CHINESE_UNICODE 0x1 +#define SORT_KOREAN_UNICODE 0x1 +#define SORT_GERMAN_PHONE_BOOK 0x1 +#define SORT_HUNGARIAN_TECHNICAL 0x1 +#define SORT_GEORGIAN_MODERN 0x1 +#define VS_VERSION_INFO 1 +#define VFFF_ISSHAREDFILE 0x0001 +#define VFF_CURNEDEST 0x0001 +#define VIFF_FORCEINSTALL 0x0001 +#define ISOLATIONAWARE_MANIFEST_RESOURCE_ID 2 +#define SW_SHOWMINIMIZED 2 +#define SHOW_ICONWINDOW 2 +#define SW_OTHERZOOM 2 +#define VK_RBUTTON 0x02 +#define WM_DESTROY 0x0002 +#define WA_CLICKACTIVE 2 +#define PWR_SUSPENDRESUME 2 +#define NFR_UNICODE 2 +#define UIS_CLEAR 2 +#define UISF_HIDEACCEL 0x2 +#define XBUTTON2 0x0002 +#define WMSZ_RIGHT 2 +#define HTCAPTION 2 +#define SMTO_ABORTIFHUNG 0x0002 +#define MA_ACTIVATEANDEAT 2 +#define ICON_SMALL2 2 +#define SIZE_MAXIMIZED 2 +#define MK_RBUTTON 0x0002 +#define TME_LEAVE 0x00000002 +#define CS_HREDRAW 0x0002 +#define CF_BITMAP 2 +#define IDCANCEL 2 +#define BN_HILITE 2 +#define BST_INDETERMINATE 0x0002 +#define HDS_BUTTONS 0x0002 +#define TBSTYLE_CHECK 0x0002 +#define TTS_NOPREFIX 0x02 +#define TBS_VERT 0x0002 +#define UDS_SETBUDDYINT 0x0002 +#define LWS_IGNORERETURN 0x0002 +#define LVS_SMALLICON 0x0002 +#define TVS_HASLINES 0x0002 +#define TVS_EX_MULTISELECT 0x0002 +#define TCS_BOTTOM 0x0002 +#define TCS_RIGHT 0x0002 +#define ACS_TRANSPARENT 0x0002 +#define MCS_MULTISELECT 0x0002 +#define DTS_SHOWNONE 0x0002 +#define PGS_AUTOSCROLL 0x00000002 +#define NFS_STATIC 0x0002 +#define BCSIF_IMAGE 0x0002 +#define BCSS_STRETCH 0x0002 +#define LANG_BULGARIAN 0x02 +#define SUBLANG_SYS_DEFAULT 0x02 +#define SUBLANG_ARABIC_IRAQ 0x02 +#define SUBLANG_AZERI_CYRILLIC 0x02 +#define SUBLANG_BENGALI_BANGLADESH 0x02 +#define SUBLANG_CHINESE_SIMPLIFIED 0x02 +#define SUBLANG_DUTCH_BELGIAN 0x02 +#define SUBLANG_ENGLISH_UK 0x02 +#define SUBLANG_FRENCH_BELGIAN 0x02 +#define SUBLANG_GERMAN_SWISS 0x02 +#define SUBLANG_INUKTITUT_CANADA_LATIN 0x02 +#define SUBLANG_IRISH_IRELAND 0x02 +#define SUBLANG_ITALIAN_SWISS 0x02 +#define SUBLANG_KASHMIRI_SASIA 0x02 +#define SUBLANG_KASHMIRI_INDIA 0x02 +#define SUBLANG_LOWER_SORBIAN_GERMANY 0x02 +#define SUBLANG_MALAY_BRUNEI_DARUSSALAM 0x02 +#define SUBLANG_MONGOLIAN_PRC 0x02 +#define SUBLANG_NEPALI_INDIA 0x02 +#define SUBLANG_NORWEGIAN_NYNORSK 0x02 +#define SUBLANG_PORTUGUESE 0x02 +#define SUBLANG_QUECHUA_ECUADOR 0x02 +#define SUBLANG_SAMI_NORTHERN_SWEDEN 0x02 +#define SUBLANG_SERBIAN_LATIN 0x02 +#define SUBLANG_SINDHI_PAKISTAN 0x02 +#define SUBLANG_SINDHI_AFGHANISTAN 0x02 +#define SUBLANG_SPANISH_MEXICAN 0x02 +#define SUBLANG_SWEDISH_FINLAND 0x02 +#define SUBLANG_TAMAZIGHT_ALGERIA_LATIN 0x02 +#define SUBLANG_TIGRIGNA_ERITREA 0x02 +#define SUBLANG_URDU_INDIA 0x02 +#define SUBLANG_UZBEK_CYRILLIC 0x02 +#define SORT_CHINESE_PRC 0x2 +#define VFF_FILEINUSE 0x0002 +#define VIFF_DONTDELETEOLD 0x0002 +#define ISOLATIONAWARE_NOSTATICIMPORT_MANIFEST_RESOURCE_ID 3 +#define SW_SHOWMAXIMIZED 3 +#define SW_MAXIMIZE 3 +#define SHOW_FULLSCREEN 3 +#define SW_PARENTOPENING 3 +#define VK_CANCEL 0x03 +#define WM_MOVE 0x0003 +#define PWR_CRITICALRESUME 3 +#define NF_QUERY 3 +#define UIS_INITIALIZE 3 +#define WMSZ_TOP 3 +#define HTSYSMENU 3 +#define MA_NOACTIVATE 3 +#define SIZE_MAXSHOW 3 +#define CF_METAFILEPICT 3 +#define IDABORT 3 +#define BN_UNHILITE 3 +#define LVS_LIST 0x0003 +#define LVS_TYPEMASK 0x0003 +#define LANG_CATALAN 0x03 +#define SUBLANG_CUSTOM_DEFAULT 0x03 +#define SUBLANG_ARABIC_EGYPT 0x03 +#define SUBLANG_CHINESE_HONGKONG 0x03 +#define SUBLANG_ENGLISH_AUS 0x03 +#define SUBLANG_FRENCH_CANADIAN 0x03 +#define SUBLANG_GERMAN_AUSTRIAN 0x03 +#define SUBLANG_QUECHUA_PERU 0x03 +#define SUBLANG_SAMI_NORTHERN_FINLAND 0x03 +#define SUBLANG_SERBIAN_CYRILLIC 0x03 +#define SUBLANG_SPANISH_MODERN 0x03 +#define SORT_CHINESE_BOPOMOFO 0x3 +#define SW_SHOWNOACTIVATE 4 +#define SHOW_OPENNOACTIVATE 4 +#define SW_OTHERUNZOOM 4 +#define VK_MBUTTON 0x04 +#define NF_REQUERY 4 +#define UISF_ACTIVE 0x4 +#define WMSZ_TOPLEFT 4 +#define HTGROWBOX 4 +#define MA_NOACTIVATEANDEAT 4 +#define SIZE_MAXHIDE 4 +#define MK_SHIFT 0x0004 +#define CF_SYLK 4 +#define IDRETRY 4 +#define BN_DISABLE 4 +#define BST_PUSHED 0x0004 +#define HDS_HOTTRACK 0x0004 +#define TBSTYLE_GROUP 0x0004 +#define TBS_TOP 0x0004 +#define TBS_LEFT 0x0004 +#define UDS_ALIGNRIGHT 0x0004 +#define PBS_VERTICAL 0x04 +#define LWS_NOPREFIX 0x0004 +#define LVS_SINGLESEL 0x0004 +#define TVS_LINESATROOT 0x0004 +#define TVS_EX_DOUBLEBUFFER 0x0004 +#define TCS_MULTISELECT 0x0004 +#define ACS_AUTOPLAY 0x0004 +#define MCS_WEEKNUMBERS 0x0004 +#define DTS_LONGDATEFORMAT 0x0004 +#define PGS_DRAGNDROP 0x00000004 +#define NFS_LISTCOMBO 0x0004 +#define BCSIF_STYLE 0x0004 +#define BCSS_ALIGNLEFT 0x0004 +#define LANG_CHINESE 0x04 +#define LANG_CHINESE_SIMPLIFIED 0x04 +#define SUBLANG_CUSTOM_UNSPECIFIED 0x04 +#define SUBLANG_ARABIC_LIBYA 0x04 +#define SUBLANG_CHINESE_SINGAPORE 0x04 +#define SUBLANG_CROATIAN_BOSNIA_HERZEGOVINA_LATIN 0x04 +#define SUBLANG_ENGLISH_CAN 0x04 +#define SUBLANG_FRENCH_SWISS 0x04 +#define SUBLANG_GERMAN_LUXEMBOURG 0x04 +#define SUBLANG_SAMI_LULE_NORWAY 0x04 +#define SUBLANG_SPANISH_GUATEMALA 0x04 +#define SORT_JAPANESE_RADICALSTROKE 0x4 +#define VFF_BUFFTOOSMALL 0x0004 +#define SW_SHOW 5 +#define VK_XBUTTON1 0x05 +#define WM_SIZE 0x0005 +#define WMSZ_TOPRIGHT 5 +#define HTMENU 5 +#define CF_DIF 5 +#define IDIGNORE 5 +#define BN_DOUBLECLICKED 5 +#define LANG_CZECH 0x05 +#define SUBLANG_UI_CUSTOM_DEFAULT 0x05 +#define SUBLANG_ARABIC_ALGERIA 0x05 +#define SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_LATIN 0x05 +#define SUBLANG_CHINESE_MACAU 0x05 +#define SUBLANG_ENGLISH_NZ 0x05 +#define SUBLANG_FRENCH_LUXEMBOURG 0x05 +#define SUBLANG_GERMAN_LIECHTENSTEIN 0x05 +#define SUBLANG_SAMI_LULE_SWEDEN 0x05 +#define SUBLANG_SPANISH_COSTA_RICA 0x05 +#define SW_MINIMIZE 6 +#define VK_XBUTTON2 0x06 +#define WM_ACTIVATE 0x0006 +#define WMSZ_BOTTOM 6 +#define HTHSCROLL 6 +#define CF_TIFF 6 +#define IDYES 6 +#define BN_SETFOCUS 6 +#define LANG_DANISH 0x06 +#define SUBLANG_ARABIC_MOROCCO 0x06 +#define SUBLANG_ENGLISH_EIRE 0x06 +#define SUBLANG_FRENCH_MONACO 0x06 +#define SUBLANG_SAMI_SOUTHERN_NORWAY 0x06 +#define SUBLANG_SERBIAN_BOSNIA_HERZEGOVINA_LATIN 0x06 +#define SUBLANG_SPANISH_PANAMA 0x06 +#define SW_SHOWMINNOACTIVE 7 +#define WM_SETFOCUS 0x0007 +#define WMSZ_BOTTOMLEFT 7 +#define HTVSCROLL 7 +#define CF_OEMTEXT 7 +#define IDNO 7 +#define BN_KILLFOCUS 7 +#define LANG_GERMAN 0x07 +#define SUBLANG_ARABIC_TUNISIA 0x07 +#define SUBLANG_ENGLISH_SOUTH_AFRICA 0x07 +#define SUBLANG_SAMI_SOUTHERN_SWEDEN 0x07 +#define SUBLANG_SERBIAN_BOSNIA_HERZEGOVINA_CYRILLIC 0x07 +#define SUBLANG_SPANISH_DOMINICAN_REPUBLIC 0x07 +#define SW_SHOWNA 8 +#define VK_BACK 0x08 +#define WM_KILLFOCUS 0x0008 +#define WMSZ_BOTTOMRIGHT 8 +#define HTMINBUTTON 8 +#define SMTO_NOTIMEOUTIFNOTHUNG 0x0008 +#define MK_CONTROL 0x0008 +#define CS_DBLCLKS 0x0008 +#define CF_DIB 8 +#define IDCLOSE 8 +#define BST_FOCUS 0x0008 +#define HDS_HIDDEN 0x0008 +#define TBSTYLE_DROPDOWN 0x0008 +#define TBS_BOTH 0x0008 +#define UDS_ALIGNLEFT 0x0008 +#define PBS_MARQUEE 0x08 +#define LWS_USEVISUALSTYLE 0x0008 +#define LVS_SHOWSELALWAYS 0x0008 +#define TVS_EDITLABELS 0x0008 +#define TVS_EX_NOINDENTSTATE 0x0008 +#define TCS_FLATBUTTONS 0x0008 +#define ACS_TIMER 0x0008 +#define MCS_NOTODAYCIRCLE 0x0008 +#define NFS_BUTTON 0x0008 +#define BCSIF_SIZE 0x0008 +#define BCSS_IMAGE 0x0008 +#define LANG_GREEK 0x08 +#define SUBLANG_ARABIC_OMAN 0x08 +#define SUBLANG_BOSNIAN_BOSNIA_HERZEGOVINA_CYRILLIC 0x08 +#define SUBLANG_ENGLISH_JAMAICA 0x08 +#define SUBLANG_SAMI_SKOLT_FINLAND 0x08 +#define SUBLANG_SPANISH_VENEZUELA 0x08 +#define SW_RESTORE 9 +#define VK_TAB 0x09 +#define HTMAXBUTTON 9 +#define CF_PALETTE 9 +#define IDHELP 9 +#define DTS_TIMEFORMAT 0x0009 +#define LANG_ENGLISH 0x09 +#define SUBLANG_ARABIC_YEMEN 0x09 +#define SUBLANG_ENGLISH_CARIBBEAN 0x09 +#define SUBLANG_SAMI_INARI_FINLAND 0x09 +#define SUBLANG_SPANISH_COLOMBIA 0x09 +#define SW_SHOWDEFAULT 10 +#define WM_ENABLE 0x000A +#define HTLEFT 10 +#define CF_PENDATA 10 +#define IDTRYAGAIN 10 +#define HELP_CONTEXTMENU 0x000a +#define LANG_SPANISH 0x0a +#define SUBLANG_ARABIC_SYRIA 0x0a +#define SUBLANG_ENGLISH_BELIZE 0x0a +#define SUBLANG_SPANISH_PERU 0x0a +#define SW_FORCEMINIMIZE 11 +#define SW_MAX 11 +#define WM_SETREDRAW 0x000B +#define HTRIGHT 11 +#define CF_RIFF 11 +#define IDCONTINUE 11 +#define HELP_FINDER 0x000b +#define LANG_FINNISH 0x0b +#define SUBLANG_ARABIC_JORDAN 0x0b +#define SUBLANG_ENGLISH_TRINIDAD 0x0b +#define SUBLANG_SPANISH_ARGENTINA 0x0b +#define VK_CLEAR 0x0C +#define WM_SETTEXT 0x000C +#define HTTOP 12 +#define CF_WAVE 12 +#define HELP_WM_HELP 0x000c +#define DTS_SHORTDATECENTURYFORMAT 0x000C +#define LANG_FRENCH 0x0c +#define SUBLANG_ARABIC_LEBANON 0x0c +#define SUBLANG_ENGLISH_ZIMBABWE 0x0c +#define SUBLANG_SPANISH_ECUADOR 0x0c +#define VK_RETURN 0x0D +#define WM_GETTEXT 0x000D +#define HTTOPLEFT 13 +#define CF_UNICODETEXT 13 +#define HELP_SETPOPUP_POS 0x000d +#define LANG_HEBREW 0x0d +#define SUBLANG_ARABIC_KUWAIT 0x0d +#define SUBLANG_ENGLISH_PHILIPPINES 0x0d +#define SUBLANG_SPANISH_CHILE 0x0d +#define WM_GETTEXTLENGTH 0x000E +#define HTTOPRIGHT 14 +#define CF_ENHMETAFILE 14 +#define LANG_HUNGARIAN 0x0e +#define SUBLANG_ARABIC_UAE 0x0e +#define SUBLANG_SPANISH_URUGUAY 0x0e +#define WM_PAINT 0x000F +#define HTBOTTOM 15 +#define CF_HDROP 15 +#define LANG_ICELANDIC 0x0f +#define SUBLANG_ARABIC_BAHRAIN 0x0f +#define SUBLANG_SPANISH_PARAGUAY 0x0f +#define MAXIMUM_RESERVED_MANIFEST_RESOURCE_ID 16 +#define VK_SHIFT 0x10 +#define WM_CLOSE 0x0010 +#define HTBOTTOMLEFT 16 +#define WVR_ALIGNTOP 0x0010 +#define MK_MBUTTON 0x0010 +#define TME_NONCLIENT 0x00000010 +#define CF_LOCALE 16 +#define HELP_TCARD_DATA 0x0010 +#define TBSTYLE_AUTOSIZE 0x0010 +#define TTS_NOANIMATE 0x10 +#define TBS_NOTICKS 0x0010 +#define UDS_AUTOBUDDY 0x0010 +#define PBS_SMOOTHREVERSE 0x10 +#define LWS_USECUSTOMTEXT 0x0010 +#define LVS_SORTASCENDING 0x0010 +#define TVS_DISABLEDRAGDROP 0x0010 +#define TVS_EX_RICHTOOLTIP 0x0010 +#define TCS_FORCEICONLEFT 0x0010 +#define MCS_NOTODAY 0x0010 +#define DTS_APPCANPARSE 0x0010 +#define NFS_ALL 0x0010 +#define LANG_ITALIAN 0x10 +#define SUBLANG_ARABIC_QATAR 0x10 +#define SUBLANG_ENGLISH_INDIA 0x10 +#define SUBLANG_SPANISH_BOLIVIA 0x10 +#define VK_CONTROL 0x11 +#define WM_QUERYENDSESSION 0x0011 +#define HTBOTTOMRIGHT 17 +#define CF_DIBV5 17 +#define HELP_TCARD_OTHER_CALLER 0x0011 +#define LANG_JAPANESE 0x11 +#define SUBLANG_ENGLISH_MALAYSIA 0x11 +#define SUBLANG_SPANISH_EL_SALVADOR 0x11 +#define VK_MENU 0x12 +#define WM_QUIT 0x0012 +#define HTBORDER 18 +#define CF_MAX 18 +#define LANG_KOREAN 0x12 +#define SUBLANG_ENGLISH_SINGAPORE 0x12 +#define SUBLANG_SPANISH_HONDURAS 0x12 +#define VK_PAUSE 0x13 +#define WM_QUERYOPEN 0x0013 +#define HTOBJECT 19 +#define LANG_DUTCH 0x13 +#define SUBLANG_SPANISH_NICARAGUA 0x13 +#define VK_CAPITAL 0x14 +#define WM_ERASEBKGND 0x0014 +#define HTCLOSE 20 +#define LANG_NORWEGIAN 0x14 +#define SUBLANG_SPANISH_PUERTO_RICO 0x14 +#define VK_KANA 0x15 +#define VK_HANGEUL 0x15 +#define VK_HANGUL 0x15 +#define WM_SYSCOLORCHANGE 0x0015 +#define HTHELP 21 +#define LANG_POLISH 0x15 +#define SUBLANG_SPANISH_US 0x15 +#define WM_ENDSESSION 0x0016 +#define LANG_PORTUGUESE 0x16 +#define VK_JUNJA 0x17 +#define LANG_ROMANSH 0x17 +#define RT_MANIFEST 24 +#define VK_FINAL 0x18 +#define WM_SHOWWINDOW 0x0018 +#define LANG_ROMANIAN 0x18 +#define VK_HANJA 0x19 +#define VK_KANJI 0x19 +#define LANG_RUSSIAN 0x19 +#define WM_WININICHANGE 0x001A +#define LANG_BOSNIAN 0x1a +#define LANG_CROATIAN 0x1a +#define LANG_SERBIAN 0x1a +#define VK_ESCAPE 0x1B +#define WM_DEVMODECHANGE 0x001B +#define LANG_SLOVAK 0x1b +#define VK_CONVERT 0x1C +#define WM_ACTIVATEAPP 0x001C +#define LANG_ALBANIAN 0x1c +#define VK_NONCONVERT 0x1D +#define WM_FONTCHANGE 0x001D +#define LANG_SWEDISH 0x1d +#define VK_ACCEPT 0x1E +#define WM_TIMECHANGE 0x001E +#define LANG_THAI 0x1e +#define VK_MODECHANGE 0x1F +#define WM_CANCELMODE 0x001F +#define LANG_TURKISH 0x1f +#define VK_SPACE 0x20 +#define WM_SETCURSOR 0x0020 +#define SMTO_ERRORONEXIT 0x0020 +#define WVR_ALIGNLEFT 0x0020 +#define MK_XBUTTON1 0x0020 +#define CS_OWNDC 0x0020 +#define TBSTYLE_NOPREFIX 0x0020 +#define TTS_NOFADE 0x20 +#define TBS_ENABLESELRANGE 0x0020 +#define UDS_ARROWKEYS 0x0020 +#define LWS_RIGHT 0x0020 +#define LVS_SORTDESCENDING 0x0020 +#define TVS_SHOWSELALWAYS 0x0020 +#define TVS_EX_AUTOHSCROLL 0x0020 +#define TCS_FORCELABELLEFT 0x0020 +#define DTS_RIGHTALIGN 0x0020 +#define NFS_USEFONTASSOC 0x0020 +#define LANG_URDU 0x20 +#define VK_PRIOR 0x21 +#define WM_MOUSEACTIVATE 0x0021 +#define LANG_INDONESIAN 0x21 +#define VK_NEXT 0x22 +#define WM_CHILDACTIVATE 0x0022 +#define LANG_UKRAINIAN 0x22 +#define VK_END 0x23 +#define WM_QUEUESYNC 0x0023 +#define LANG_BELARUSIAN 0x23 +#define VK_HOME 0x24 +#define WM_GETMINMAXINFO 0x0024 +#define LANG_SLOVENIAN 0x24 +#define VK_LEFT 0x25 +#define LANG_ESTONIAN 0x25 +#define VK_UP 0x26 +#define WM_PAINTICON 0x0026 +#define LANG_LATVIAN 0x26 +#define VK_RIGHT 0x27 +#define WM_ICONERASEBKGND 0x0027 +#define LANG_LITHUANIAN 0x27 +#define VK_DOWN 0x28 +#define WM_NEXTDLGCTL 0x0028 +#define LANG_TAJIK 0x28 +#define VK_SELECT 0x29 +#define LANG_FARSI 0x29 +#define LANG_PERSIAN 0x29 +#define VK_PRINT 0x2A +#define WM_SPOOLERSTATUS 0x002A +#define LANG_VIETNAMESE 0x2a +#define VK_EXECUTE 0x2B +#define WM_DRAWITEM 0x002B +#define LANG_ARMENIAN 0x2b +#define VK_SNAPSHOT 0x2C +#define WM_MEASUREITEM 0x002C +#define LANG_AZERI 0x2c +#define VK_INSERT 0x2D +#define WM_DELETEITEM 0x002D +#define LANG_BASQUE 0x2d +#define VK_DELETE 0x2E +#define WM_VKEYTOITEM 0x002E +#define LANG_LOWER_SORBIAN 0x2e +#define LANG_UPPER_SORBIAN 0x2e +#define VK_HELP 0x2F +#define WM_CHARTOITEM 0x002F +#define LANG_MACEDONIAN 0x2f +#define WM_SETFONT 0x0030 +#define WM_GETFONT 0x0031 +#define WM_SETHOTKEY 0x0032 +#define LANG_TSWANA 0x32 +#define WM_GETHOTKEY 0x0033 +#define LANG_XHOSA 0x34 +#define LANG_ZULU 0x35 +#define LANG_AFRIKAANS 0x36 +#define WM_QUERYDRAGICON 0x0037 +#define LANG_GEORGIAN 0x37 +#define LANG_FAEROESE 0x38 +#define WM_COMPAREITEM 0x0039 +#define LANG_HINDI 0x39 +#define LANG_MALTESE 0x3a +#define LANG_SAMI 0x3b +#define LANG_IRISH 0x3c +#define WM_GETOBJECT 0x003D +#define LANG_MALAY 0x3e +#define LANG_KAZAK 0x3f +#define WVR_ALIGNBOTTOM 0x0040 +#define MK_XBUTTON2 0x0040 +#define CS_CLASSDC 0x0040 +#define HDS_DRAGDROP 0x0040 +#define BTNS_SHOWTEXT 0x0040 +#define TTS_BALLOON 0x40 +#define TBS_FIXEDLENGTH 0x0040 +#define UDS_HORZ 0x0040 +#define LVS_SHAREIMAGELISTS 0x0040 +#define TVS_RTLREADING 0x0040 +#define TVS_EX_FADEINOUTEXPANDOS 0x0040 +#define TCS_HOTTRACK 0x0040 +#define MCS_NOTRAILINGDATES 0x0040 +#define LANG_KYRGYZ 0x40 +#define WM_COMPACTING 0x0041 +#define LANG_SWAHILI 0x41 +#define LANG_TURKMEN 0x42 +#define LANG_UZBEK 0x43 +#define WM_COMMNOTIFY 0x0044 +#define LANG_TATAR 0x44 +#define LANG_BENGALI 0x45 +#define WM_WINDOWPOSCHANGING 0x0046 +#define LANG_PUNJABI 0x46 +#define WM_WINDOWPOSCHANGED 0x0047 +#define LANG_GUJARATI 0x47 +#define WM_POWER 0x0048 +#define LANG_ORIYA 0x48 +#define LANG_TAMIL 0x49 +#define WM_COPYDATA 0x004A +#define LANG_TELUGU 0x4a +#define WM_CANCELJOURNAL 0x004B +#define LANG_KANNADA 0x4b +#define LANG_MALAYALAM 0x4c +#define LANG_ASSAMESE 0x4d +#define WM_NOTIFY 0x004E +#define LANG_MARATHI 0x4e +#define LANG_SANSKRIT 0x4f +#define WM_INPUTLANGCHANGEREQUEST 0x0050 +#define LANG_MONGOLIAN 0x50 +#define WM_INPUTLANGCHANGE 0x0051 +#define LANG_TIBETAN 0x51 +#define WM_TCARD 0x0052 +#define LANG_WELSH 0x52 +#define WM_HELP 0x0053 +#define LANG_KHMER 0x53 +#define WM_USERCHANGED 0x0054 +#define LANG_LAO 0x54 +#define WM_NOTIFYFORMAT 0x0055 +#define LANG_GALICIAN 0x56 +#define LANG_KONKANI 0x57 +#define LANG_MANIPURI 0x58 +#define LANG_SINDHI 0x59 +#define LANG_SYRIAC 0x5a +#define VK_LWIN 0x5B +#define LANG_SINHALESE 0x5b +#define VK_RWIN 0x5C +#define VK_APPS 0x5D +#define LANG_INUKTITUT 0x5d +#define LANG_AMHARIC 0x5e +#define VK_SLEEP 0x5F +#define LANG_TAMAZIGHT 0x5f +#define VK_NUMPAD0 0x60 +#define LANG_KASHMIRI 0x60 +#define VK_NUMPAD1 0x61 +#define LANG_NEPALI 0x61 +#define VK_NUMPAD2 0x62 +#define LANG_FRISIAN 0x62 +#define VK_NUMPAD3 0x63 +#define LANG_PASHTO 0x63 +#define VK_NUMPAD4 0x64 +#define LANG_FILIPINO 0x64 +#define VS_USER_DEFINED 100 +#define VK_NUMPAD5 0x65 +#define LANG_DIVEHI 0x65 +#define VK_NUMPAD6 0x66 +#define VK_NUMPAD7 0x67 +#define VK_NUMPAD8 0x68 +#define LANG_HAUSA 0x68 +#define VK_NUMPAD9 0x69 +#define VK_MULTIPLY 0x6A +#define LANG_YORUBA 0x6a +#define VK_ADD 0x6B +#define LANG_QUECHUA 0x6b +#define VK_SEPARATOR 0x6C +#define LANG_SOTHO 0x6c +#define VK_SUBTRACT 0x6D +#define LANG_BASHKIR 0x6d +#define VK_DECIMAL 0x6E +#define LANG_LUXEMBOURGISH 0x6e +#define VK_DIVIDE 0x6F +#define LANG_GREENLANDIC 0x6f +#define VK_F1 0x70 +#define LANG_IGBO 0x70 +#define VK_F2 0x71 +#define VK_F3 0x72 +#define VK_F4 0x73 +#define LANG_TIGRIGNA 0x73 +#define VK_F5 0x74 +#define VK_F6 0x75 +#define VK_F7 0x76 +#define VK_F8 0x77 +#define VK_F9 0x78 +#define WHEEL_DELTA 120 +#define LANG_YI 0x78 +#define VK_F10 0x79 +#define VK_F11 0x7A +#define LANG_MAPUDUNGUN 0x7a +#define VK_F12 0x7B +#define WM_CONTEXTMENU 0x007B +#define VK_F13 0x7C +#define WM_STYLECHANGING 0x007C +#define LANG_MOHAWK 0x7c +#define VK_F14 0x7D +#define WM_STYLECHANGED 0x007D +#define VK_F15 0x7E +#define WM_DISPLAYCHANGE 0x007E +#define LANG_BRETON 0x7e +#define VK_F16 0x7F +#define WM_GETICON 0x007F +#define LANG_INVARIANT 0x7f +#define VK_F17 0x80 +#define WM_SETICON 0x0080 +#define WVR_ALIGNRIGHT 0x0080 +#define CS_PARENTDC 0x0080 +#define CF_OWNERDISPLAY 0x0080 +#define HDS_FULLDRAG 0x0080 +#define BTNS_WHOLEDROPDOWN 0x0080 +#define TTS_CLOSE 0x80 +#define TBS_NOTHUMB 0x0080 +#define UDS_NOTHOUSANDS 0x0080 +#define LVS_NOLABELWRAP 0x0080 +#define TVS_NOTOOLTIPS 0x0080 +#define TVS_EX_PARTIALCHECKBOXES 0x0080 +#define TCS_VERTICAL 0x0080 +#define MCS_SHORTDAYSOFWEEK 0x0080 +#define LANG_UIGHUR 0x80 +#define VK_F18 0x81 +#define WM_NCCREATE 0x0081 +#define CF_DSPTEXT 0x0081 +#define LANG_MAORI 0x81 +#define VK_F19 0x82 +#define WM_NCDESTROY 0x0082 +#define CF_DSPBITMAP 0x0082 +#define LANG_OCCITAN 0x82 +#define VK_F20 0x83 +#define WM_NCCALCSIZE 0x0083 +#define CF_DSPMETAFILEPICT 0x0083 +#define LANG_CORSICAN 0x83 +#define VK_F21 0x84 +#define WM_NCHITTEST 0x0084 +#define LANG_ALSATIAN 0x84 +#define VK_F22 0x85 +#define WM_NCPAINT 0x0085 +#define LANG_YAKUT 0x85 +#define VK_F23 0x86 +#define WM_NCACTIVATE 0x0086 +#define LANG_KICHE 0x86 +#define VK_F24 0x87 +#define WM_GETDLGCODE 0x0087 +#define LANG_KINYARWANDA 0x87 +#define WM_SYNCPAINT 0x0088 +#define LANG_WOLOF 0x88 +#define LANG_DARI 0x8c +#define CF_DSPENHMETAFILE 0x008E +#define VK_NUMLOCK 0x90 +#define VK_SCROLL 0x91 +#define VK_OEM_NEC_EQUAL 0x92 +#define VK_OEM_FJ_JISHO 0x92 +#define VK_OEM_FJ_MASSHOU 0x93 +#define VK_OEM_FJ_TOUROKU 0x94 +#define VK_OEM_FJ_LOYA 0x95 +#define VK_OEM_FJ_ROYA 0x96 +#define VK_LSHIFT 0xA0 +#define WM_NCMOUSEMOVE 0x00A0 +#define VK_RSHIFT 0xA1 +#define WM_NCLBUTTONDOWN 0x00A1 +#define VK_LCONTROL 0xA2 +#define WM_NCLBUTTONUP 0x00A2 +#define VK_RCONTROL 0xA3 +#define WM_NCLBUTTONDBLCLK 0x00A3 +#define VK_LMENU 0xA4 +#define WM_NCRBUTTONDOWN 0x00A4 +#define VK_RMENU 0xA5 +#define WM_NCRBUTTONUP 0x00A5 +#define VK_BROWSER_BACK 0xA6 +#define WM_NCRBUTTONDBLCLK 0x00A6 +#define VK_BROWSER_FORWARD 0xA7 +#define WM_NCMBUTTONDOWN 0x00A7 +#define VK_BROWSER_REFRESH 0xA8 +#define WM_NCMBUTTONUP 0x00A8 +#define VK_BROWSER_STOP 0xA9 +#define WM_NCMBUTTONDBLCLK 0x00A9 +#define VK_BROWSER_SEARCH 0xAA +#define VK_BROWSER_FAVORITES 0xAB +#define WM_NCXBUTTONDOWN 0x00AB +#define VK_BROWSER_HOME 0xAC +#define WM_NCXBUTTONUP 0x00AC +#define VK_VOLUME_MUTE 0xAD +#define WM_NCXBUTTONDBLCLK 0x00AD +#define VK_VOLUME_DOWN 0xAE +#define VK_VOLUME_UP 0xAF +#define VK_MEDIA_NEXT_TRACK 0xB0 +#define EM_GETSEL 0x00B0 +#define VK_MEDIA_PREV_TRACK 0xB1 +#define EM_SETSEL 0x00B1 +#define VK_MEDIA_STOP 0xB2 +#define EM_GETRECT 0x00B2 +#define VK_MEDIA_PLAY_PAUSE 0xB3 +#define EM_SETRECT 0x00B3 +#define VK_LAUNCH_MAIL 0xB4 +#define EM_SETRECTNP 0x00B4 +#define VK_LAUNCH_MEDIA_SELECT 0xB5 +#define EM_SCROLL 0x00B5 +#define VK_LAUNCH_APP1 0xB6 +#define EM_LINESCROLL 0x00B6 +#define VK_LAUNCH_APP2 0xB7 +#define EM_SCROLLCARET 0x00B7 +#define EM_GETMODIFY 0x00B8 +#define EM_SETMODIFY 0x00B9 +#define VK_OEM_1 0xBA +#define EM_GETLINECOUNT 0x00BA +#define VK_OEM_PLUS 0xBB +#define EM_LINEINDEX 0x00BB +#define VK_OEM_COMMA 0xBC +#define EM_SETHANDLE 0x00BC +#define VK_OEM_MINUS 0xBD +#define EM_GETHANDLE 0x00BD +#define VK_OEM_PERIOD 0xBE +#define EM_GETTHUMB 0x00BE +#define VK_OEM_2 0xBF +#define VK_OEM_3 0xC0 +#define EM_LINELENGTH 0x00C1 +#define EM_REPLACESEL 0x00C2 +#define EM_GETLINE 0x00C4 +#define EM_LIMITTEXT 0x00C5 +#define EM_CANUNDO 0x00C6 +#define EM_UNDO 0x00C7 +#define EM_FMTLINES 0x00C8 +#define EM_LINEFROMCHAR 0x00C9 +#define EM_SETTABSTOPS 0x00CB +#define EM_SETPASSWORDCHAR 0x00CC +#define EM_EMPTYUNDOBUFFER 0x00CD +#define EM_GETFIRSTVISIBLELINE 0x00CE +#define EM_SETREADONLY 0x00CF +#define EM_SETWORDBREAKPROC 0x00D0 +#define EM_GETWORDBREAKPROC 0x00D1 +#define EM_GETPASSWORDCHAR 0x00D2 +#define EM_SETMARGINS 0x00D3 +#define EM_GETMARGINS 0x00D4 +#define EM_GETLIMITTEXT 0x00D5 +#define EM_POSFROMCHAR 0x00D6 +#define EM_CHARFROMPOS 0x00D7 +#define EM_SETIMESTATUS 0x00D8 +#define EM_GETIMESTATUS 0x00D9 +#define VK_OEM_4 0xDB +#define VK_OEM_5 0xDC +#define VK_OEM_6 0xDD +#define VK_OEM_7 0xDE +#define VK_OEM_8 0xDF +#define VK_OEM_AX 0xE1 +#define VK_OEM_102 0xE2 +#define VK_ICO_HELP 0xE3 +#define VK_ICO_00 0xE4 +#define VK_PROCESSKEY 0xE5 +#define VK_ICO_CLEAR 0xE6 +#define VK_PACKET 0xE7 +#define VK_OEM_RESET 0xE9 +#define VK_OEM_JUMP 0xEA +#define VK_OEM_PA1 0xEB +#define VK_OEM_PA2 0xEC +#define VK_OEM_PA3 0xED +#define VK_OEM_WSCTRL 0xEE +#define VK_OEM_CUSEL 0xEF +#define VK_OEM_ATTN 0xF0 +#define BM_GETCHECK 0x00F0 +#define VK_OEM_FINISH 0xF1 +#define BM_SETCHECK 0x00F1 +#define VK_OEM_COPY 0xF2 +#define BM_GETSTATE 0x00F2 +#define VK_OEM_AUTO 0xF3 +#define BM_SETSTATE 0x00F3 +#define VK_OEM_ENLW 0xF4 +#define BM_SETSTYLE 0x00F4 +#define VK_OEM_BACKTAB 0xF5 +#define BM_CLICK 0x00F5 +#define VK_ATTN 0xF6 +#define BM_GETIMAGE 0x00F6 +#define VK_CRSEL 0xF7 +#define BM_SETIMAGE 0x00F7 +#define VK_EXSEL 0xF8 +#define BM_SETDONTCLICK 0x00F8 +#define VK_EREOF 0xF9 +#define VK_PLAY 0xFA +#define VK_ZOOM 0xFB +#define VK_NONAME 0xFC +#define VK_PA1 0xFD +#define VK_OEM_CLEAR 0xFE +#define WM_INPUT_DEVICE_CHANGE 0x00FE +#define SUBVERSION_MASK 0x000000FF +#define WM_INPUT 0x00FF +#define WM_KEYFIRST 0x0100 +#define WM_KEYDOWN 0x0100 +#define WVR_HREDRAW 0x0100 +#define HDS_FILTERBAR 0x0100 +#define TBSTYLE_TOOLTIPS 0x0100 +#define RBS_TOOLTIPS 0x00000100 +#define TTS_USEVISUALSTYLE 0x100 +#define SBARS_SIZEGRIP 0x0100 +#define TBS_TOOLTIPS 0x0100 +#define UDS_HOTTRACK 0x0100 +#define LVS_AUTOARRANGE 0x0100 +#define TVS_CHECKBOXES 0x0100 +#define TVS_EX_EXCLUSIONCHECKBOXES 0x0100 +#define TCS_BUTTONS 0x0100 +#define MCS_NOSELCHANGEONNAV 0x0100 +#define WM_KEYUP 0x0101 +#define WM_CHAR 0x0102 +#define WM_DEADCHAR 0x0103 +#define WM_SYSKEYDOWN 0x0104 +#define WM_SYSKEYUP 0x0105 +#define WM_SYSCHAR 0x0106 +#define WM_SYSDEADCHAR 0x0107 +#define WM_UNICHAR 0x0109 +#define WM_KEYLAST 0x0109 +#define WM_IME_STARTCOMPOSITION 0x010D +#define WM_IME_ENDCOMPOSITION 0x010E +#define WM_IME_COMPOSITION 0x010F +#define WM_IME_KEYLAST 0x010F +#define WM_INITDIALOG 0x0110 +#define WM_COMMAND 0x0111 +#define WM_SYSCOMMAND 0x0112 +#define WM_TIMER 0x0113 +#define WM_HSCROLL 0x0114 +#define WM_VSCROLL 0x0115 +#define WM_INITMENU 0x0116 +#define WM_INITMENUPOPUP 0x0117 +#define WM_MENUSELECT 0x011F +#define WM_MENUCHAR 0x0120 +#define WM_ENTERIDLE 0x0121 +#define WM_MENURBUTTONUP 0x0122 +#define WM_MENUDRAG 0x0123 +#define WM_MENUGETOBJECT 0x0124 +#define WM_UNINITMENUPOPUP 0x0125 +#define WM_MENUCOMMAND 0x0126 +#define WM_CHANGEUISTATE 0x0127 +#define WM_UPDATEUISTATE 0x0128 +#define WM_QUERYUISTATE 0x0129 +#define WM_CTLCOLORMSGBOX 0x0132 +#define WM_CTLCOLOREDIT 0x0133 +#define WM_CTLCOLORLISTBOX 0x0134 +#define WM_CTLCOLORBTN 0x0135 +#define WM_CTLCOLORDLG 0x0136 +#define WM_CTLCOLORSCROLLBAR 0x0137 +#define WM_CTLCOLORSTATIC 0x0138 +#define MN_GETHMENU 0x01E1 +#define _WIN32_IE_IE20 0x0200 +#define WM_MOUSEFIRST 0x0200 +#define WM_MOUSEMOVE 0x0200 +#define WVR_VREDRAW 0x0200 +#define CS_NOCLOSE 0x0200 +#define CF_PRIVATEFIRST 0x0200 +#define HDS_FLAT 0x0200 +#define TBSTYLE_WRAPABLE 0x0200 +#define RBS_VARHEIGHT 0x00000200 +#define TBS_REVERSED 0x0200 +#define LVS_EDITLABELS 0x0200 +#define TVS_TRACKSELECT 0x0200 +#define TVS_EX_DIMMEDCHECKBOXES 0x0200 +#define TCS_MULTILINE 0x0200 +#define WM_LBUTTONDOWN 0x0201 +#define WM_LBUTTONUP 0x0202 +#define WM_LBUTTONDBLCLK 0x0203 +#define WM_RBUTTONDOWN 0x0204 +#define WM_RBUTTONUP 0x0205 +#define WM_RBUTTONDBLCLK 0x0206 +#define WM_MBUTTONDOWN 0x0207 +#define WM_MBUTTONUP 0x0208 +#define WM_MBUTTONDBLCLK 0x0209 +#define WM_MOUSEWHEEL 0x020A +#define WM_XBUTTONDOWN 0x020B +#define WM_XBUTTONUP 0x020C +#define WM_XBUTTONDBLCLK 0x020D +#define WM_MOUSEHWHEEL 0x020E +#define WM_MOUSELAST 0x020E +#define WM_PARENTNOTIFY 0x0210 +#define WM_ENTERMENULOOP 0x0211 +#define WM_EXITMENULOOP 0x0212 +#define WM_NEXTMENU 0x0213 +#define WM_SIZING 0x0214 +#define WM_CAPTURECHANGED 0x0215 +#define WM_MOVING 0x0216 +#define WM_POWERBROADCAST 0x0218 +#define WM_DEVICECHANGE 0x0219 +#define WM_MDICREATE 0x0220 +#define WM_MDIDESTROY 0x0221 +#define WM_MDIACTIVATE 0x0222 +#define WM_MDIRESTORE 0x0223 +#define WM_MDINEXT 0x0224 +#define WM_MDIMAXIMIZE 0x0225 +#define WM_MDITILE 0x0226 +#define WM_MDICASCADE 0x0227 +#define WM_MDIICONARRANGE 0x0228 +#define WM_MDIGETACTIVE 0x0229 +#define WM_MDISETMENU 0x0230 +#define WM_ENTERSIZEMOVE 0x0231 +#define WM_EXITSIZEMOVE 0x0232 +#define WM_DROPFILES 0x0233 +#define WM_MDIREFRESHMENU 0x0234 +#define WM_IME_SETCONTEXT 0x0281 +#define WM_IME_NOTIFY 0x0282 +#define WM_IME_CONTROL 0x0283 +#define WM_IME_COMPOSITIONFULL 0x0284 +#define WM_IME_SELECT 0x0285 +#define WM_IME_CHAR 0x0286 +#define WM_IME_REQUEST 0x0288 +#define WM_IME_KEYDOWN 0x0290 +#define WM_IME_KEYUP 0x0291 +#define WM_NCMOUSEHOVER 0x02A0 +#define WM_MOUSEHOVER 0x02A1 +#define WM_NCMOUSELEAVE 0x02A2 +#define WM_MOUSELEAVE 0x02A3 +#define WM_WTSSESSION_CHANGE 0x02B1 +#define WM_TABLET_FIRST 0x02c0 +#define WM_TABLET_LAST 0x02df +#define CF_PRIVATELAST 0x02FF +#define _WIN32_IE_IE30 0x0300 +#define WM_CUT 0x0300 +#define CF_GDIOBJFIRST 0x0300 +#define WM_COPY 0x0301 +#define _WIN32_IE_IE302 0x0302 +#define WM_PASTE 0x0302 +#define WM_CLEAR 0x0303 +#define WM_UNDO 0x0304 +#define WM_RENDERFORMAT 0x0305 +#define WM_RENDERALLFORMATS 0x0306 +#define WM_DESTROYCLIPBOARD 0x0307 +#define WM_DRAWCLIPBOARD 0x0308 +#define WM_PAINTCLIPBOARD 0x0309 +#define WM_VSCROLLCLIPBOARD 0x030A +#define WM_SIZECLIPBOARD 0x030B +#define WM_ASKCBFORMATNAME 0x030C +#define WM_CHANGECBCHAIN 0x030D +#define WM_HSCROLLCLIPBOARD 0x030E +#define WM_QUERYNEWPALETTE 0x030F +#define WM_PALETTEISCHANGING 0x0310 +#define WM_PALETTECHANGED 0x0311 +#define WM_HOTKEY 0x0312 +#define WM_PRINT 0x0317 +#define WM_PRINTCLIENT 0x0318 +#define WM_APPCOMMAND 0x0319 +#define WM_THEMECHANGED 0x031A +#define WM_CLIPBOARDUPDATE 0x031D +#define WM_DWMCOMPOSITIONCHANGED 0x031E +#define WM_DWMNCRENDERINGCHANGED 0x031F +#define WM_DWMCOLORIZATIONCOLORCHANGED 0x0320 +#define WM_DWMWINDOWMAXIMIZEDCHANGE 0x0321 +#define WM_GETTITLEBARINFOEX 0x033F +#define WM_HANDHELDFIRST 0x0358 +#define WM_HANDHELDLAST 0x035F +#define WM_AFXFIRST 0x0360 +#define WM_AFXLAST 0x037F +#define WM_PENWINFIRST 0x0380 +#define WM_PENWINLAST 0x038F +#define WM_DDE_FIRST 0x03E0 +#define CF_GDIOBJLAST 0x03FF +#define _WIN32_WINNT_NT4 0x0400 +#define _WIN32_IE_IE40 0x0400 +#define WM_USER 0x0400 +#define WVR_VALIDRECTS 0x0400 +#define HDS_CHECKBOXES 0x0400 +#define TBSTYLE_ALTDRAG 0x0400 +#define RBS_BANDBORDERS 0x00000400 +#define TBS_DOWNISLEFT 0x0400 +#define LVS_OWNERDRAWFIXED 0x0400 +#define TVS_SINGLEEXPAND 0x0400 +#define TVS_EX_DRAWIMAGEASYNC 0x0400 +#define TCS_FIXEDWIDTH 0x0400 +#define ctlFirst 0x0400 +#define psh1 0x0400 +#define _WIN32_IE_IE401 0x0401 +#define psh2 0x0401 +#define psh3 0x0402 +#define psh4 0x0403 +#define psh5 0x0404 +#define psh6 0x0405 +#define psh7 0x0406 +#define psh8 0x0407 +#define psh9 0x0408 +#define psh10 0x0409 +#define psh11 0x040a +#define psh12 0x040b +#define psh13 0x040c +#define psh14 0x040d +#define psh15 0x040e +#define psh16 0x040f +#define _WIN32_WINDOWS 0x0410 +#define chx1 0x0410 +#define chx2 0x0411 +#define chx3 0x0412 +#define chx4 0x0413 +#define chx5 0x0414 +#define chx6 0x0415 +#define chx7 0x0416 +#define chx8 0x0417 +#define chx9 0x0418 +#define chx10 0x0419 +#define chx11 0x041a +#define chx12 0x041b +#define chx13 0x041c +#define chx14 0x041d +#define chx15 0x041e +#define chx16 0x041f +#define rad1 0x0420 +#define rad2 0x0421 +#define rad3 0x0422 +#define rad4 0x0423 +#define rad5 0x0424 +#define rad6 0x0425 +#define rad7 0x0426 +#define rad8 0x0427 +#define rad9 0x0428 +#define rad10 0x0429 +#define rad11 0x042a +#define rad12 0x042b +#define rad13 0x042c +#define rad14 0x042d +#define rad15 0x042e +#define rad16 0x042f +#define grp1 0x0430 +#define grp2 0x0431 +#define grp3 0x0432 +#define grp4 0x0433 +#define frm1 0x0434 +#define frm2 0x0435 +#define frm3 0x0436 +#define frm4 0x0437 +#define rct1 0x0438 +#define rct2 0x0439 +#define rct3 0x043a +#define rct4 0x043b +#define ico1 0x043c +#define ico2 0x043d +#define ico3 0x043e +#define ico4 0x043f +#define stc1 0x0440 +#define stc2 0x0441 +#define stc3 0x0442 +#define stc4 0x0443 +#define stc5 0x0444 +#define stc6 0x0445 +#define stc7 0x0446 +#define stc8 0x0447 +#define stc9 0x0448 +#define stc10 0x0449 +#define stc11 0x044a +#define stc12 0x044b +#define stc13 0x044c +#define stc14 0x044d +#define stc15 0x044e +#define stc16 0x044f +#define stc17 0x0450 +#define stc18 0x0451 +#define stc19 0x0452 +#define stc20 0x0453 +#define stc21 0x0454 +#define stc22 0x0455 +#define stc23 0x0456 +#define stc24 0x0457 +#define stc25 0x0458 +#define stc26 0x0459 +#define stc27 0x045a +#define stc28 0x045b +#define stc29 0x045c +#define stc30 0x045d +#define stc31 0x045e +#define stc32 0x045f +#define lst1 0x0460 +#define lst2 0x0461 +#define lst3 0x0462 +#define lst4 0x0463 +#define lst5 0x0464 +#define lst6 0x0465 +#define lst7 0x0466 +#define lst8 0x0467 +#define lst9 0x0468 +#define lst10 0x0469 +#define lst11 0x046a +#define lst12 0x046b +#define lst13 0x046c +#define lst14 0x046d +#define lst15 0x046e +#define lst16 0x046f +#define cmb1 0x0470 +#define cmb2 0x0471 +#define cmb3 0x0472 +#define cmb4 0x0473 +#define cmb5 0x0474 +#define cmb6 0x0475 +#define cmb7 0x0476 +#define cmb8 0x0477 +#define cmb9 0x0478 +#define cmb10 0x0479 +#define cmb11 0x047a +#define cmb12 0x047b +#define cmb13 0x047c +#define cmb14 0x047d +#define cmb15 0x047e +#define cmb16 0x047f +#define edt1 0x0480 +#define edt2 0x0481 +#define edt3 0x0482 +#define edt4 0x0483 +#define edt5 0x0484 +#define edt6 0x0485 +#define edt7 0x0486 +#define edt8 0x0487 +#define edt9 0x0488 +#define edt10 0x0489 +#define edt11 0x048a +#define edt12 0x048b +#define edt13 0x048c +#define edt14 0x048d +#define edt15 0x048e +#define edt16 0x048f +#define scr1 0x0490 +#define scr2 0x0491 +#define scr3 0x0492 +#define scr4 0x0493 +#define scr5 0x0494 +#define scr6 0x0495 +#define scr7 0x0496 +#define scr8 0x0497 +#define ctl1 0x04A0 +#define ctlLast 0x04ff +#define _WIN32_WINNT_WIN2K 0x0500 +#define _WIN32_IE_IE50 0x0500 +#define _WIN32_WINNT_WINXP 0x0501 +#define _WIN32_IE_IE501 0x0501 +#define _WIN32_WINNT_WS03 0x0502 +#define _WIN32_IE_IE55 0x0550 +#define _WIN32_WINNT_LONGHORN 0x0600 +#define _WIN32_IE_IE60 0x0600 +#define _WIN32_WINNT 0x0600 +#define FILEOPENORD 1536 +#define _WIN32_IE_IE60SP1 0x0601 +#define MULTIFILEOPENORD 1537 +#define _WIN32_IE_WS03 0x0602 +#define PRINTDLGORD 1538 +#define _WIN32_IE_IE60SP2 0x0603 +#define PRNSETUPDLGORD 1539 +#define FINDDLGORD 1540 +#define REPLACEDLGORD 1541 +#define FONTDLGORD 1542 +#define FORMATDLGORD31 1543 +#define FORMATDLGORD30 1544 +#define RUNDLGORD 1545 +#define PAGESETUPDLGORD 1546 +#define NEWFILEOPENORD 1547 +#define PRINTDLGEXORD 1549 +#define PAGESETUPDLGORDMOTIF 1550 +#define COLORMGMTDLGORD 1551 +#define NEWFILEOPENV2ORD 1552 +#define NEWFILEOPENV3ORD 1553 +#define _WIN32_IE_IE70 0x0700 +#define _WIN32_IE 0x0700 +#define CS_SAVEBITS 0x0800 +#define HDS_NOSIZING 0x0800 +#define TBSTYLE_FLAT 0x0800 +#define RBS_FIXEDORDER 0x00000800 +#define SBARS_TOOLTIPS 0x0800 +#define SBT_TOOLTIPS 0x0800 +#define TBS_NOTIFYBEFOREMOVE 0x0800 +#define LVS_ALIGNLEFT 0x0800 +#define TVS_INFOTIP 0x0800 +#define TCS_RAGGEDRIGHT 0x0800 +#define LVS_ALIGNMASK 0x0c00 +#define CS_BYTEALIGNCLIENT 0x1000 +#define HDS_OVERFLOW 0x1000 +#define TBSTYLE_LIST 0x1000 +#define RBS_REGISTERDROP 0x00001000 +#define TBS_TRANSPARENTBKGND 0x1000 +#define LVS_OWNERDATA 0x1000 +#define TVS_FULLROWSELECT 0x1000 +#define TCS_FOCUSONBUTTONDOWN 0x1000 +#define CS_BYTEALIGNWINDOW 0x2000 +#define TBSTYLE_CUSTOMERASE 0x2000 +#define RBS_AUTOSIZE 0x00002000 +#define LVS_NOSCROLL 0x2000 +#define TVS_NOSCROLL 0x2000 +#define TCS_OWNERDRAWFIXED 0x2000 +#define CS_GLOBALCLASS 0x4000 +#define TBSTYLE_REGISTERDROP 0x4000 +#define RBS_VERTICALGRIPPER 0x00004000 +#define LVS_NOCOLUMNHEADER 0x4000 +#define TVS_NONEVENHEIGHT 0x4000 +#define TCS_TOOLTIPS 0x4000 +#define IDH_NO_HELP 28440 +#define IDH_MISSING_CONTEXT 28441 +#define IDH_GENERIC_HELP_BUTTON 28442 +#define IDH_OK 28443 +#define IDH_CANCEL 28444 +#define IDH_HELP 28445 +#define LANG_BOSNIAN_NEUTRAL 0x781a +#define LANG_CHINESE_TRADITIONAL 0x7c04 +#define LANG_SERBIAN_NEUTRAL 0x7c1a +#define IDTIMEOUT 32000 +#define OCR_NORMAL 32512 +#define OIC_SAMPLE 32512 +#define IDI_APPLICATION 32512 +#define OCR_IBEAM 32513 +#define OIC_HAND 32513 +#define IDI_HAND 32513 +#define OCR_WAIT 32514 +#define OIC_QUES 32514 +#define IDI_QUESTION 32514 +#define OCR_CROSS 32515 +#define OIC_BANG 32515 +#define IDI_EXCLAMATION 32515 +#define OCR_UP 32516 +#define OIC_NOTE 32516 +#define IDI_ASTERISK 32516 +#define OIC_WINLOGO 32517 +#define IDI_WINLOGO 32517 +#define OIC_SHIELD 32518 +#define IDI_SHIELD 32518 +#define OCR_SIZE 32640 +#define OCR_ICON 32641 +#define OCR_SIZENWSE 32642 +#define OCR_SIZENESW 32643 +#define OCR_SIZEWE 32644 +#define OCR_SIZENS 32645 +#define OCR_SIZEALL 32646 +#define OCR_ICOCUR 32647 +#define OCR_NO 32648 +#define OCR_HAND 32649 +#define OCR_APPSTARTING 32650 +#define OBM_LFARROWI 32734 +#define OBM_RGARROWI 32735 +#define OBM_DNARROWI 32736 +#define OBM_UPARROWI 32737 +#define OBM_COMBO 32738 +#define OBM_MNARROW 32739 +#define OBM_LFARROWD 32740 +#define OBM_RGARROWD 32741 +#define OBM_DNARROWD 32742 +#define OBM_UPARROWD 32743 +#define OBM_RESTORED 32744 +#define OBM_ZOOMD 32745 +#define OBM_REDUCED 32746 +#define OBM_RESTORE 32747 +#define OBM_ZOOM 32748 +#define OBM_REDUCE 32749 +#define OBM_LFARROW 32750 +#define OBM_RGARROW 32751 +#define OBM_DNARROW 32752 +#define OBM_UPARROW 32753 +#define OBM_CLOSE 32754 +#define OBM_OLD_RESTORE 32755 +#define OBM_OLD_ZOOM 32756 +#define OBM_OLD_REDUCE 32757 +#define OBM_BTNCORNERS 32758 +#define OBM_CHECKBOXES 32759 +#define OBM_CHECK 32760 +#define OBM_BTSIZE 32761 +#define OBM_OLD_LFARROW 32762 +#define OBM_OLD_RGARROW 32763 +#define OBM_OLD_DNARROW 32764 +#define OBM_OLD_UPARROW 32765 +#define OBM_SIZE 32766 +#define OBM_OLD_CLOSE 32767 +#define WM_APP 0x8000 +#define HELP_TCARD 0x8000 +#define TBSTYLE_TRANSPARENT 0x8000 +#define RBS_DBLCLKTOGGLE 0x00008000 +#define LVS_NOSORTHEADER 0x8000 +#define TVS_NOHSCROLL 0x8000 +#define TCS_FOCUSNEVER 0x8000 +#define SC_SIZE 0xF000 +#define SC_SEPARATOR 0xF00F +#define SC_MOVE 0xF010 +#define SC_MINIMIZE 0xF020 +#define SC_MAXIMIZE 0xF030 +#define SC_NEXTWINDOW 0xF040 +#define SC_PREVWINDOW 0xF050 +#define SC_CLOSE 0xF060 +#define SC_VSCROLL 0xF070 +#define SC_HSCROLL 0xF080 +#define SC_MOUSEMENU 0xF090 +#define SC_KEYMENU 0xF100 +#define SC_ARRANGE 0xF110 +#define SC_RESTORE 0xF120 +#define SC_TASKLIST 0xF130 +#define SC_SCREENSAVE 0xF140 +#define SC_HOTKEY 0xF150 +#define SC_DEFAULT 0xF160 +#define SC_MONITORPOWER 0xF170 +#define SC_CONTEXTHELP 0xF180 +#define LVS_TYPESTYLEMASK 0xfc00 +#define SPVERSION_MASK 0x0000FF00 +#define HTERROR -2 +#define PWR_FAIL -1 +#define UNICODE_NOCHAR 0xFFFF +#define HTTRANSPARENT -1 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 101 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1000 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/Builds/VisualStudio2008/resources.aps b/Builds/VisualStudio2008/resources.aps new file mode 100644 index 0000000..e5ef1b5 Binary files /dev/null and b/Builds/VisualStudio2008/resources.aps differ diff --git a/Builds/VisualStudio2008/resources.rc b/Builds/VisualStudio2008/resources.rc new file mode 100644 index 0000000..e7c4b3e --- /dev/null +++ b/Builds/VisualStudio2008/resources.rc @@ -0,0 +1,32 @@ +#undef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#include +#include "../../JuceLibraryCode/AppConfig.h" + +VS_VERSION_INFO VERSIONINFO +FILEVERSION JucePlugin_Version +PRODUCTVERSION JucePlugin_Version +#ifdef DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS VS_FF_PRERELEASE +#endif +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + BEGIN + VALUE "CompanyName", JucePlugin_Manufacturer + VALUE "LegalCopyright", "Copyright (C) 2012, 2013\0" + VALUE "FileDescription", JucePlugin_Desc + VALUE "FileVersion", JucePlugin_VersionString + VALUE "ProductName", JucePlugin_Name + VALUE "ProductVersion", JucePlugin_VersionString + END + END + + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 65001 + END +END diff --git a/JuceLibraryCode/AppConfig.h b/JuceLibraryCode/AppConfig.h new file mode 100644 index 0000000..713d916 --- /dev/null +++ b/JuceLibraryCode/AppConfig.h @@ -0,0 +1,259 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + + There's a section below where you can add your own custom code safely, and the + Introjucer will preserve the contents of that block, but the best way to change + any of these definitions is by using the Introjucer's project settings. + + Any commented-out settings will assume their default values. + +*/ + +#ifndef __JUCE_APPCONFIG_SGFP29__ +#define __JUCE_APPCONFIG_SGFP29__ + +//============================================================================== +// [BEGIN_USER_CODE_SECTION] + +// (You can add your own code in this section, and the Introjucer will not overwrite it) + +// [END_USER_CODE_SECTION] + +//============================================================================== +#define JUCE_MODULE_AVAILABLE_juce_audio_basics 1 +#define JUCE_MODULE_AVAILABLE_juce_audio_devices 1 +#define JUCE_MODULE_AVAILABLE_juce_audio_formats 1 +#define JUCE_MODULE_AVAILABLE_juce_audio_plugin_client 1 +#define JUCE_MODULE_AVAILABLE_juce_audio_processors 1 +#define JUCE_MODULE_AVAILABLE_juce_core 1 +#define JUCE_MODULE_AVAILABLE_juce_data_structures 1 +#define JUCE_MODULE_AVAILABLE_juce_events 1 +#define JUCE_MODULE_AVAILABLE_juce_graphics 1 +#define JUCE_MODULE_AVAILABLE_juce_gui_basics 1 +#define JUCE_MODULE_AVAILABLE_juce_gui_extra 1 + +//============================================================================== +// juce_audio_devices flags: + +#ifndef JUCE_ASIO + //#define JUCE_ASIO +#endif + +#ifndef JUCE_WASAPI + //#define JUCE_WASAPI +#endif + +#ifndef JUCE_DIRECTSOUND + //#define JUCE_DIRECTSOUND +#endif + +#ifndef JUCE_ALSA + //#define JUCE_ALSA +#endif + +#ifndef JUCE_JACK + //#define JUCE_JACK +#endif + +#ifndef JUCE_USE_ANDROID_OPENSLES + //#define JUCE_USE_ANDROID_OPENSLES +#endif + +#ifndef JUCE_USE_CDREADER + //#define JUCE_USE_CDREADER +#endif + +#ifndef JUCE_USE_CDBURNER + //#define JUCE_USE_CDBURNER +#endif + +//============================================================================== +// juce_audio_formats flags: + +#ifndef JUCE_USE_FLAC + //#define JUCE_USE_FLAC +#endif + +#ifndef JUCE_USE_OGGVORBIS + //#define JUCE_USE_OGGVORBIS +#endif + +#ifndef JUCE_USE_MP3AUDIOFORMAT + //#define JUCE_USE_MP3AUDIOFORMAT +#endif + +#ifndef JUCE_USE_WINDOWS_MEDIA_FORMAT + //#define JUCE_USE_WINDOWS_MEDIA_FORMAT +#endif + +//============================================================================== +// juce_audio_processors flags: + +#ifndef JUCE_PLUGINHOST_VST + #define JUCE_PLUGINHOST_VST 1 +#endif + +#ifndef JUCE_PLUGINHOST_AU + //#define JUCE_PLUGINHOST_AU +#endif + +//============================================================================== +// juce_core flags: + +#ifndef JUCE_FORCE_DEBUG + //#define JUCE_FORCE_DEBUG +#endif + +#ifndef JUCE_LOG_ASSERTIONS + //#define JUCE_LOG_ASSERTIONS +#endif + +#ifndef JUCE_CHECK_MEMORY_LEAKS + //#define JUCE_CHECK_MEMORY_LEAKS +#endif + +#ifndef JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES + //#define JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES +#endif + +//============================================================================== +// juce_graphics flags: + +#ifndef JUCE_USE_COREIMAGE_LOADER + //#define JUCE_USE_COREIMAGE_LOADER +#endif + +#ifndef JUCE_USE_DIRECTWRITE + #define JUCE_USE_DIRECTWRITE 0 +#endif + +//============================================================================== +// juce_gui_basics flags: + +#ifndef JUCE_ENABLE_REPAINT_DEBUGGING + //#define JUCE_ENABLE_REPAINT_DEBUGGING +#endif + +#ifndef JUCE_USE_XSHM + //#define JUCE_USE_XSHM +#endif + +#ifndef JUCE_USE_XRENDER + //#define JUCE_USE_XRENDER +#endif + +#ifndef JUCE_USE_XCURSOR + //#define JUCE_USE_XCURSOR +#endif + +//============================================================================== +// juce_gui_extra flags: + +#ifndef JUCE_WEB_BROWSER + //#define JUCE_WEB_BROWSER +#endif + + +//============================================================================== +// Audio plugin settings.. + +#ifndef JucePlugin_Build_VST + #define JucePlugin_Build_VST 1 +#endif +#ifndef JucePlugin_Build_AU + #define JucePlugin_Build_AU 1 +#endif +#ifndef JucePlugin_Build_RTAS + #define JucePlugin_Build_RTAS 0 +#endif +#ifndef JucePlugin_Name + #define JucePlugin_Name "JaySynth" +#endif +#ifndef JucePlugin_Desc + #define JucePlugin_Desc "A Synthesizer VST-Plugin" +#endif +#ifndef JucePlugin_Manufacturer + #define JucePlugin_Manufacturer "Jay Digital Illusions" +#endif +#ifndef JucePlugin_ManufacturerCode + #define JucePlugin_ManufacturerCode '3110' +#endif +#ifndef JucePlugin_PluginCode + #define JucePlugin_PluginCode 'Jsy1' +#endif +#ifndef JucePlugin_MaxNumInputChannels + #define JucePlugin_MaxNumInputChannels 2 +#endif +#ifndef JucePlugin_MaxNumOutputChannels + #define JucePlugin_MaxNumOutputChannels 2 +#endif +#ifndef JucePlugin_PreferredChannelConfigurations + #define JucePlugin_PreferredChannelConfigurations {2, 2} +#endif +#ifndef JucePlugin_IsSynth + #define JucePlugin_IsSynth 1 +#endif +#ifndef JucePlugin_WantsMidiInput + #define JucePlugin_WantsMidiInput 1 +#endif +#ifndef JucePlugin_ProducesMidiOutput + #define JucePlugin_ProducesMidiOutput 0 +#endif +#ifndef JucePlugin_SilenceInProducesSilenceOut + #define JucePlugin_SilenceInProducesSilenceOut 0 +#endif +#ifndef JucePlugin_TailLengthSeconds + #define JucePlugin_TailLengthSeconds 0 +#endif +#ifndef JucePlugin_EditorRequiresKeyboardFocus + #define JucePlugin_EditorRequiresKeyboardFocus 0 +#endif +#ifndef JucePlugin_Version + #define JucePlugin_Version 0,5,6,0 +#endif +#ifndef JucePlugin_VersionCode + #define JucePlugin_VersionCode 560 +#endif +#ifndef JucePlugin_VersionString + #define JucePlugin_VersionString "0.5.6" +#endif +#ifndef JucePlugin_VSTUniqueID + #define JucePlugin_VSTUniqueID JucePlugin_PluginCode +#endif +#ifndef JucePlugin_VSTCategory + #define JucePlugin_VSTCategory kPlugCategSynth +#endif +#ifndef JucePlugin_AUMainType + #define JucePlugin_AUMainType kAudioUnitType_MusicDevice +#endif +#ifndef JucePlugin_AUSubType + #define JucePlugin_AUSubType JucePlugin_PluginCode +#endif +#ifndef JucePlugin_AUExportPrefix + #define JucePlugin_AUExportPrefix JaySynthAU +#endif +#ifndef JucePlugin_AUExportPrefixQuoted + #define JucePlugin_AUExportPrefixQuoted "JaySynthAU" +#endif +#ifndef JucePlugin_AUManufacturerCode + #define JucePlugin_AUManufacturerCode JucePlugin_ManufacturerCode +#endif +#ifndef JucePlugin_CFBundleIdentifier + #define JucePlugin_CFBundleIdentifier com.JDI.JaySynth +#endif +#ifndef JucePlugin_AUCocoaViewClassName + #define JucePlugin_AUCocoaViewClassName JaySynthAU_V1 +#endif +#ifndef JucePlugin_RTASCategory + #define JucePlugin_RTASCategory ePlugInCategory_SWGenerators +#endif +#ifndef JucePlugin_RTASManufacturerCode + #define JucePlugin_RTASManufacturerCode JucePlugin_ManufacturerCode +#endif +#ifndef JucePlugin_RTASProductId + #define JucePlugin_RTASProductId JucePlugin_PluginCode +#endif + +#endif // __JUCE_APPCONFIG_SGFP29__ diff --git a/JuceLibraryCode/JuceHeader.h b/JuceLibraryCode/JuceHeader.h new file mode 100644 index 0000000..cc8c27e --- /dev/null +++ b/JuceLibraryCode/JuceHeader.h @@ -0,0 +1,43 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + + This is the header file that your files should include in order to get all the + JUCE library headers. You should avoid including the JUCE headers directly in + your own source files, because that wouldn't pick up the correct configuration + options for your app. + +*/ + +#ifndef __APPHEADERFILE_SGFP29__ +#define __APPHEADERFILE_SGFP29__ + +#include "AppConfig.h" + +#include "modules/juce_audio_basics/juce_audio_basics.h" +#include "modules/juce_audio_devices/juce_audio_devices.h" +#include "modules/juce_audio_formats/juce_audio_formats.h" +#include "modules/juce_audio_plugin_client/juce_audio_plugin_client.h" +#include "modules/juce_audio_processors/juce_audio_processors.h" +#include "modules/juce_core/juce_core.h" +#include "modules/juce_data_structures/juce_data_structures.h" +#include "modules/juce_events/juce_events.h" +#include "modules/juce_graphics/juce_graphics.h" +#include "modules/juce_gui_basics/juce_gui_basics.h" +#include "modules/juce_gui_extra/juce_gui_extra.h" + +#if ! DONT_SET_USING_JUCE_NAMESPACE + // If your code uses a lot of JUCE classes, then this will obviously save you + // a lot of typing, but can be disabled by setting DONT_SET_USING_JUCE_NAMESPACE. + using namespace juce; +#endif + +namespace ProjectInfo +{ + const char* const projectName = JucePlugin_Name; + const char* const versionString = JucePlugin_VersionString; + const int versionNumber = JucePlugin_VersionCode; +} + +#endif // __APPHEADERFILE_SGFP29__ diff --git a/JuceLibraryCode/ReadMe.txt b/JuceLibraryCode/ReadMe.txt new file mode 100644 index 0000000..f6c3564 --- /dev/null +++ b/JuceLibraryCode/ReadMe.txt @@ -0,0 +1,12 @@ + + Important Note!! + ================ + +The purpose of this folder is to contain files that are auto-generated by the Introjucer, +and ALL files in this folder will be mercilessly DELETED and completely re-written whenever +the Introjucer saves your project. + +Therefore, it's a bad idea to make any manual changes to the files in here, or to +put any of your own files in here if you don't want to lose them. (Of course you may choose +to add the folder's contents to your version-control system so that you can re-merge your own +modifications after the Introjucer has saved its changes). diff --git a/Love_and_Horror_V2.fxb b/Love_and_Horror_V2.fxb new file mode 100644 index 0000000..8c3fb54 Binary files /dev/null and b/Love_and_Horror_V2.fxb differ diff --git a/Source/ButtonLED.cpp b/Source/ButtonLED.cpp new file mode 100644 index 0000000..b167102 --- /dev/null +++ b/Source/ButtonLED.cpp @@ -0,0 +1,291 @@ +/* + ============================================================================== + + This is an automatically generated file created by the Jucer! + + Creation date: 10 Aug 2012 1:11:16pm + + Be careful when adding custom code to these files, as only the code within + the "//[xyz]" and "//[/xyz]" sections will be retained when the file is loaded + and re-saved. + + Jucer version: 1.12 + + ------------------------------------------------------------------------------ + + The Jucer is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-6 by Raw Material Software ltd. + + ============================================================================== +*/ + +//[Headers] You can add your own extra header files here... +//[/Headers] + +#include "ButtonLED.h" + + +//[MiscUserDefs] You can add your own user definitions and misc code here... +//[/MiscUserDefs] + +//============================================================================== +ButtonLED::ButtonLED (const String& name) + : Button (L"Button LED"), + cachedImage_led_23_red_png (0), + cachedImage_led_23_red1_png (0), + triggeredOnMouseDown(0), + clickingTogglesState(0), + clickingLeftMouseButtonTogglesState(1), + clickingMiddleMouseButtonTogglesState(0), + clickingRightMouseButtonTogglesState(0) + +{ + cachedImage_led_23_red_png = ImageCache::getFromMemory (led_23_red_png, led_23_red_pngSize); + cachedImage_led_23_red1_png = ImageCache::getFromMemory (led_23_red1_png, led_23_red1_pngSize); + + //[UserPreSize] + //[/UserPreSize] + + setSize (32, 32); + + + //[Constructor] You can add your own custom stuff here.. + setName(name); + //[/Constructor] +} + +ButtonLED::~ButtonLED() +{ + //[Destructor_pre]. You can add your own custom destruction code here.. + //[/Destructor_pre] + + + + //[Destructor]. You can add your own custom destruction code here.. + //[/Destructor] +} + +//============================================================================== +void ButtonLED::resized() +{ + //[UserResized] Add your own custom resize handling here.. + + //[/UserResized] +} +/* +void ButtonLED::paintButton (Graphics& g, bool isMouseOverButton, bool isButtonDown) +{ + if (getToggleState()) + { + g.setColour (Colours::black); + g.drawImageWithin (cachedImage_led_23_red1_png, + 0, 0, 32, 32, + RectanglePlacement::centred, + false); + } + else + { + g.setColour (Colours::black); + g.drawImageWithin (cachedImage_led_23_red_png, + 0, 0, 32, 32, + RectanglePlacement::centred, + false); + } +} +*/ +void ButtonLED::clicked() +{ + //[UserCode_clicked] -- Add your code here... + //[/UserCode_clicked] +} + +void ButtonLED::buttonStateChanged() +{ + //[UserCode_buttonStateChanged] -- Add your code here... + //[/UserCode_buttonStateChanged] +} + +void ButtonLED::mouseWheelMove(const MouseEvent &/*event*/, const MouseWheelDetails &/*wheel*/) +{ +} + +//[MiscUserCode] You can add your own definitions of your custom methods or any other code here... +bool ButtonLED::getClickingLeftMouseButtonTogglesState (void) +{ + return clickingLeftMouseButtonTogglesState; +} + +bool ButtonLED::getClickingMiddleMouseButtonTogglesState (void) +{ + return clickingMiddleMouseButtonTogglesState; +} + +bool ButtonLED::getClickingRightMouseButtonTogglesState (void) +{ + return clickingRightMouseButtonTogglesState; +} + +void ButtonLED::setClickingLeftMouseButtonTogglesState (bool value) +{ + this ->clickingLeftMouseButtonTogglesState = value; +} + +void ButtonLED::setClickingMiddleMouseButtonTogglesState (bool value) +{ + this ->clickingMiddleMouseButtonTogglesState = value; +} + +void ButtonLED::setClickingRightMouseButtonTogglesState (bool value) +{ + this ->clickingRightMouseButtonTogglesState = value; +} + +void ButtonLED::setTriggeredOnMouseDown (bool triggeredOnMouseDown) +{ + Button::setTriggeredOnMouseDown(triggeredOnMouseDown); +} + +void ButtonLED::setClickingTogglesState(bool clickingTogglesState) +{ + this->clickingTogglesState = clickingTogglesState; +} + +bool ButtonLED::getClickingTogglesState(void) +{ + return this->clickingTogglesState; +} + +void ButtonLED::clicked(const ModifierKeys &modifiers) +{ + bool state; + + state = getToggleState(); + + if (modifiers.isLeftButtonDown()) + if (!clickingLeftMouseButtonTogglesState) + return; + + if (modifiers.isMiddleButtonDown()) + if (!clickingMiddleMouseButtonTogglesState) + return; + + if (modifiers.isRightButtonDown()) + if (!clickingRightMouseButtonTogglesState) + return; + + if (clickingTogglesState) + setToggleState(!state, false); + +} + +void ButtonLED::paintButton (Graphics& g, bool /*isMouseOverButton*/, bool /*isButtonDown*/) +{ + if (getToggleState()) + { + g.setColour (Colours::black); + g.drawImageWithin (cachedImage_led_23_red1_png, + 0, 0, getWidth(), getHeight(), + RectanglePlacement::centred, + false); + } + else + { + g.setColour (Colours::black); + g.drawImageWithin (cachedImage_led_23_red_png, + 0, 0, getWidth(), getHeight(), + RectanglePlacement::centred, + false); + } +} +//[/MiscUserCode] + + +//============================================================================== +#if 0 +/* -- Jucer information section -- + + This is where the Jucer puts all of its metadata, so don't change anything in here! + +BEGIN_JUCER_METADATA + + + + + + + + + + + + + + + + + + + +END_JUCER_METADATA +*/ +#endif + +//============================================================================== +// Binary resources - be careful not to edit any of these sections! + +// JUCER_RESOURCE: led_23_red_png, 820, "C:/Users/jens/Pictures/led_23_red.png" +static const unsigned char resource_ButtonLED_led_23_red_png[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,32,0,0,0,32,8,6,0,0,0,115,122,122,244,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,0, +4,103,65,77,65,0,0,177,143,11,252,97,5,0,0,0,9,112,72,89,115,0,0,14,195,0,0,14,195,1,199,111,168,100,0,0,2,201,73,68,65,84,88,71,237,84,77,79,26,81,20,125,51,128,56,200,48,10,242,49,45,6,148,50,72,45, +137,74,213,64,210,16,43,196,208,32,154,74,109,218,212,29,38,74,237,166,11,235,166,254,0,22,46,92,179,169,174,26,211,96,93,117,221,244,159,116,103,210,29,173,216,152,156,222,59,66,226,162,59,199,38,77, +120,201,201,187,51,239,222,123,206,189,239,67,136,222,232,117,160,215,129,94,7,254,215,14,36,18,9,111,50,153,124,96,24,70,238,159,214,80,169,84,222,44,46,46,54,106,181,218,175,157,157,29,108,111,111,131, +190,207,253,126,255,161,162,40,183,43,38,151,203,45,111,109,109,181,26,141,6,154,205,38,78,78,154,56,58,58,66,189,94,71,181,90,133,174,235,63,169,27,43,183,210,145,124,62,159,221,216,216,104,29,28,28, +224,248,248,35,90,173,31,56,59,251,142,201,201,73,238,0,214,215,215,81,40,20,160,170,42,139,120,111,181,8,185,88,44,30,238,238,238,98,111,111,15,167,167,159,112,121,217,194,254,126,29,195,195,195,112, +58,157,112,187,221,72,167,211,136,70,163,32,242,15,4,217,74,17,246,181,181,181,246,230,230,38,150,150,150,48,59,59,131,233,233,105,208,190,131,246,29,146,36,193,227,81,77,17,154,166,241,119,155,200,251, +173,18,32,5,131,65,163,84,42,161,92,46,155,196,99,99,99,8,4,2,112,185,92,144,108,14,24,70,2,153,204,44,188,222,33,174,190,139,123,100,75,86,136,112,208,190,38,178,217,44,166,166,166,16,139,197,64,130, +224,86,61,144,6,52,40,129,48,50,243,5,100,30,229,232,16,222,185,46,96,142,200,29,86,8,112,201,178,60,154,74,165,218,76,30,10,133,160,122,60,176,15,250,209,63,18,135,158,158,67,118,245,41,50,165,34,84, +22,208,215,199,34,46,8,35,4,197,10,1,78,74,18,165,170,63,155,228,170,10,89,113,195,17,140,32,52,147,65,120,225,49,178,47,159,35,62,159,131,208,117,8,218,22,242,255,194,49,4,142,189,241,232,227,100,118, +187,125,153,200,207,109,202,0,132,234,131,8,142,64,142,39,32,167,82,38,132,97,116,5,240,1,92,237,8,224,216,27,15,62,205,119,9,51,66,150,223,9,215,96,91,120,67,16,209,81,136,241,113,136,137,137,171,153, +175,159,207,119,97,250,176,239,85,140,37,91,96,167,68,94,194,4,161,64,4,175,133,170,125,19,225,240,111,17,137,64,140,146,16,182,53,237,43,173,213,76,159,43,95,142,225,216,27,15,126,80,184,146,48,225,33, +225,9,225,25,225,133,176,217,222,154,130,132,120,213,249,199,107,236,195,190,28,99,217,99,100,163,100,30,66,164,67,144,167,185,68,88,233,128,237,133,206,26,251,176,175,37,213,119,219,199,15,10,39,228, +196,92,221,125,66,154,192,119,157,193,118,146,192,251,222,37,183,228,17,234,10,224,153,19,114,39,184,181,67,4,157,192,119,157,193,54,255,227,53,246,177,156,252,111,66,248,142,51,33,131,237,91,39,190,46, +162,103,247,58,96,89,7,254,0,38,229,208,224,232,174,221,11,0,0,0,0,73,69,78,68,174,66,96,130,0,0}; + +const char* ButtonLED::led_23_red_png = (const char*) resource_ButtonLED_led_23_red_png; +const int ButtonLED::led_23_red_pngSize = 820; + +// JUCER_RESOURCE: led_23_red1_png, 1556, "C:/Users/jens/Pictures/led_23_red1.png" +static const unsigned char resource_ButtonLED_led_23_red1_png[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,32,0,0,0,32,8,6,0,0,0,115,122,122,244,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0, +0,4,103,65,77,65,0,0,177,143,11,252,97,5,0,0,0,9,112,72,89,115,0,0,14,195,0,0,14,195,1,199,111,168,100,0,0,5,169,73,68,65,84,88,71,197,87,11,80,148,85,20,62,139,15,18,36,205,23,246,82,18,199,28,84,124, +101,78,22,154,142,212,48,105,54,49,162,77,106,84,44,67,142,137,174,38,141,137,173,248,66,69,99,65,217,101,97,5,97,137,76,5,241,177,147,47,124,84,12,96,234,16,249,200,199,84,128,89,12,54,129,153,186,66, +167,243,237,254,59,187,12,168,187,232,232,206,124,243,223,189,247,124,223,61,247,156,123,207,127,127,162,182,252,204,172,34,51,123,9,218,43,64,91,213,22,41,247,57,206,9,189,101,50,31,129,159,160,139,2, +180,209,135,49,56,229,229,190,240,189,44,157,19,119,82,38,237,38,79,127,193,83,130,103,21,160,141,62,140,193,25,216,62,0,71,204,220,78,132,58,10,58,11,158,80,38,121,70,158,207,9,158,23,12,82,128,54,250, +48,6,71,96,11,14,184,237,238,181,198,150,227,246,28,99,114,132,20,43,234,46,120,82,208,87,48,64,48,88,48,66,240,162,2,180,209,135,49,216,192,22,28,112,161,1,45,15,246,136,61,236,32,98,21,8,43,4,3,4,88, +105,176,96,148,224,21,193,4,5,104,163,15,99,176,129,45,56,224,66,3,90,110,238,11,251,228,29,4,216,84,93,5,8,105,31,1,86,135,9,176,234,177,130,80,193,36,5,104,163,15,99,176,129,45,56,224,66,3,90,208,188, +135,19,45,67,223,67,72,200,107,127,1,66,140,85,134,8,94,19,188,41,152,170,0,109,244,97,12,54,176,5,7,92,104,184,153,10,187,3,174,171,239,45,255,145,211,129,130,225,130,49,130,137,130,201,202,196,51,229, +9,192,17,244,97,12,54,176,5,7,92,104,184,70,225,14,123,193,89,92,28,187,30,155,232,105,65,160,178,34,132,247,85,65,152,32,92,149,125,235,189,246,250,63,230,119,72,253,45,78,254,207,64,159,50,6,27,216, +34,10,224,66,3,90,142,83,113,135,162,213,60,252,143,11,161,167,0,231,28,249,28,166,172,108,98,39,99,109,100,96,252,206,67,225,171,205,214,168,141,5,60,107,195,87,60,70,163,179,250,168,211,143,169,82,170, +163,92,162,0,14,184,208,128,22,52,239,114,34,236,14,160,120,60,38,64,133,235,37,112,132,127,164,180,67,186,166,94,212,76,209,26,111,36,237,40,102,243,225,147,156,127,172,130,51,247,31,231,21,249,7,57, +114,195,86,238,253,238,202,155,180,230,140,6,182,2,112,28,105,128,22,52,161,141,57,90,73,67,243,138,135,156,33,119,40,46,65,130,81,157,13,191,79,157,188,56,245,70,66,174,133,179,246,151,242,181,127,235, +249,207,134,191,57,104,237,81,126,93,119,128,103,164,236,226,80,109,14,251,69,44,191,73,186,234,8,112,20,46,52,28,251,224,46,21,178,249,6,68,37,195,57,238,39,24,76,57,77,163,135,44,48,238,139,94,151,205, +115,245,5,188,253,196,69,110,108,186,206,73,37,85,220,99,77,57,251,45,59,202,221,227,10,121,228,146,124,14,152,99,98,138,249,250,27,112,108,92,187,6,180,160,233,56,142,173,70,192,245,4,192,24,245,29,155, +104,8,25,235,95,158,16,187,214,26,161,53,240,248,181,22,30,170,175,224,96,253,143,220,99,221,9,246,91,85,206,222,203,75,185,95,82,9,251,125,178,151,187,104,138,88,165,206,179,82,90,237,56,27,215,174,1, +45,143,28,64,5,179,59,176,229,118,176,111,66,201,180,49,177,201,28,178,40,93,66,126,132,251,126,113,130,123,38,157,100,223,245,167,217,75,247,11,79,179,92,102,109,73,13,7,233,79,49,105,15,49,45,42,100, +250,188,100,42,184,46,14,64,211,237,8,56,29,48,93,31,214,241,211,125,211,131,230,108,226,192,185,153,220,119,213,17,246,151,149,251,232,46,178,42,163,150,123,110,187,202,218,74,65,197,21,126,169,232,28, +83,198,247,76,73,22,166,184,61,31,146,112,219,234,128,51,5,134,186,225,180,96,247,219,1,243,54,91,123,47,200,99,255,101,7,217,87,119,129,189,179,235,56,192,210,192,227,203,235,57,225,82,29,107,207,95, +230,62,187,43,152,204,135,153,210,10,111,211,66,203,20,50,92,69,65,106,83,10,156,155,48,165,102,4,205,43,120,171,91,108,206,119,254,241,22,246,75,252,129,85,250,106,238,181,243,47,142,168,104,224,119, +42,235,120,197,133,43,28,94,122,129,41,79,86,111,148,213,47,205,42,3,135,192,245,96,19,58,174,88,56,42,206,99,152,82,51,140,98,119,76,105,23,101,252,204,119,245,113,171,215,198,159,153,114,107,88,181, +187,150,125,14,93,225,78,251,126,229,142,69,103,152,190,44,99,202,60,192,148,188,205,74,234,180,120,112,196,1,164,192,163,99,216,178,16,25,174,14,150,20,132,209,7,233,106,138,49,153,200,120,214,74,5,85, +76,7,4,123,46,49,21,96,242,114,38,83,49,83,202,206,219,20,157,106,18,219,104,210,236,10,35,67,29,142,33,138,153,91,133,200,245,18,226,44,197,166,235,3,41,254,219,113,20,179,101,6,205,212,197,81,148,222, +64,169,71,206,81,209,233,70,218,46,57,207,147,201,51,138,27,73,155,127,150,222,215,25,108,54,176,5,7,92,15,75,49,210,208,252,101,148,211,216,159,146,206,191,64,11,247,78,38,245,230,24,154,149,186,148, +34,211,214,83,84,230,38,250,56,103,43,205,222,146,39,109,189,173,15,99,176,129,45,56,224,186,253,50,194,197,236,78,175,227,140,134,65,180,242,84,136,8,135,83,76,206,108,82,155,226,41,58,43,145,62,50,39, +219,128,182,122,243,18,138,201,157,109,179,129,173,177,30,247,69,15,94,199,78,7,92,239,130,246,11,73,110,83,127,210,203,113,76,172,28,79,139,139,195,73,83,164,166,249,133,26,201,243,98,27,236,237,40,219, +24,108,96,11,142,199,23,18,187,19,173,95,201,114,155,6,80,230,181,225,164,171,10,161,213,149,147,40,161,124,58,45,43,139,180,1,237,196,159,222,176,141,153,254,193,228,109,188,146,57,238,199,119,187,148, +230,254,55,148,178,111,141,150,13,54,86,28,10,181,1,109,244,97,236,190,47,165,173,167,226,33,95,203,157,145,120,68,31,38,174,159,42,143,244,211,172,117,71,30,242,199,105,107,31,118,15,240,243,252,127, +1,108,76,65,198,225,150,95,0,0,0,0,73,69,78,68,174,66,96,130,0,0}; + +const char* ButtonLED::led_23_red1_png = (const char*) resource_ButtonLED_led_23_red1_png; +const int ButtonLED::led_23_red1_pngSize = 1556; diff --git a/Source/ButtonLED.h b/Source/ButtonLED.h new file mode 100644 index 0000000..7114852 --- /dev/null +++ b/Source/ButtonLED.h @@ -0,0 +1,100 @@ +/* + ============================================================================== + + This is an automatically generated file created by the Jucer! + + Creation date: 10 Aug 2012 1:11:16pm + + Be careful when adding custom code to these files, as only the code within + the "//[xyz]" and "//[/xyz]" sections will be retained when the file is loaded + and re-saved. + + Jucer version: 1.12 + + ------------------------------------------------------------------------------ + + The Jucer is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-6 by Raw Material Software ltd. + + ============================================================================== +*/ + +#ifndef __JUCER_HEADER_BUTTONLED_BUTTONLED_B8510B75__ +#define __JUCER_HEADER_BUTTONLED_BUTTONLED_B8510B75__ + +//[Headers] -- You can add your own extra header files here -- +#include "../JuceLibraryCode/JuceHeader.h" +//[/Headers] + + + +//============================================================================== +/** + //[Comments] + An auto-generated component, created by the Jucer. + + Describe your class and how it works here! + //[/Comments] +*/ +class ButtonLED : public Button +{ +public: + //============================================================================== + ButtonLED (const String& name); + ~ButtonLED(); + + //============================================================================== + //[UserMethods] -- You can add your own custom methods in this section. + void paintButton (Graphics& g, bool isMouseOverButton, bool isButtonDown); + void clicked(const ModifierKeys &modifiers); + void mouseWheelMove(const MouseEvent &event, const MouseWheelDetails &wheel); + void setTriggeredOnMouseDown (bool triggeredOnMouseDown); + bool getClickingTogglesState (void); + void setClickingTogglesState (bool clickingTogglesState); + + bool getClickingLeftMouseButtonTogglesState (void); + bool getClickingMiddleMouseButtonTogglesState (void); + bool getClickingRightMouseButtonTogglesState (void); + + void setClickingLeftMouseButtonTogglesState (bool value); + void setClickingMiddleMouseButtonTogglesState (bool value); + void setClickingRightMouseButtonTogglesState (bool value); + //[/UserMethods] + + void resized(); + void clicked(); + void buttonStateChanged(); + + // Binary resources: + static const char* led_23_red_png; + static const int led_23_red_pngSize; + static const char* led_23_red1_png; + static const int led_23_red1_pngSize; + + + //============================================================================== + juce_UseDebuggingNewOperator + +private: + //[UserVariables] -- You can add your own custom variables in this section. + bool triggeredOnMouseDown; + bool clickingTogglesState; + bool clickingLeftMouseButtonTogglesState; + bool clickingMiddleMouseButtonTogglesState; + bool clickingRightMouseButtonTogglesState; + + //[/UserVariables] + + //============================================================================== + Image cachedImage_led_23_red_png; + Image cachedImage_led_23_red1_png; + + + //============================================================================== + // (prevent copy constructor and operator= being generated..) + ButtonLED (const ButtonLED&); + const ButtonLED& operator= (const ButtonLED&); +}; + + +#endif // __JUCER_HEADER_BUTTONLED_BUTTONLED_B8510B75__ diff --git a/Source/JaySynth.cpp b/Source/JaySynth.cpp new file mode 100644 index 0000000..b61bfe9 --- /dev/null +++ b/Source/JaySynth.cpp @@ -0,0 +1,1422 @@ +/* + ============================================================================== + + This file was generated by user! + + ============================================================================== +*/ + +#include +#include + +#include "synth_defs.h" +#include "JaySynthSound.h" +#include "JaySynthVoice.h" +#include "JaySynthMonophonicMGR.h" +#include "JaySynthMidiCC.h" +#include "JaySynth.h" + +#ifndef max +#define max(a,b) (((a) > (b)) ? (a) : (b)) +#endif + +#ifndef min +#define min(a,b) (((a) < (b)) ? (a) : (b)) +#endif + +//============================================================================== +/** A JaySynth that just plays incredible sounds.. */ +JaySynth::JaySynth (int num_voices, String pathToWaves) +{ + int i, j; + char paramName[256]; + pMidCC_editBuffer = NULL; + + memset(synth_common.vco.wt.wave_rawdata, 0, sizeof(synth_common.vco.wt.wave_rawdata)); + if (pathToWaves != String::empty) + { + File wavesFile = File(pathToWaves); + ScopedPointerpIn = wavesFile.createInputStream(); + pIn->read(synth_common.vco.wt.wave_rawdata, sizeof(synth_common.vco.wt.wave_rawdata)); + } + + max_num_voices = num_voices; + total_num_voices = num_voices; + + m_pVoices = new voice_t[num_voices]; + for (i = 0; i < num_voices; i++) + addVoice (new JaySynthVoice(&m_pVoices[i], i, &synth_common)); // These voices will play our sounds.. + + addSound (new JaySynthSound()); + + lastPitchWheelValue = 8192; + lastmidiChannel = 0; + + paramInfoInit(&pb_range[0], 0, NULL); + paramInfoInit(&pb_range[1], 1, NULL); + + paramInfoSet(&pb_range[0], 1, 1, 0.5, -12, 0, +12, 0); + paramInfoSet(&pb_range[1], 1, 1, 0.5, -12, 0, +12, 0); + + pPer_voice_controls = new per_voice_control_t[max_num_voices]; + memset(pPer_voice_controls, 0, max_num_voices*sizeof(per_voice_control_t)); + + pCurrNoteInfos = new midi_note_info_t[max_num_voices]; + memset(pCurrNoteInfos, 0, max_num_voices*sizeof(midi_note_info_t)); + + ClearControls(); + + memset(params, 0, SYNTH_NUM_PARAMS*sizeof(synth_float_t)); + memset(last_midiCC_info, 0, NUM_MIDI_CONTROLLERS*sizeof(midiCC_info_t)); + memset(&last_midi_note_info, 0, sizeof(last_midi_note_info)); + + clearKeysPressed(); + + for (i=0; i < NUM_MIDI_CONTROLLERS; i++) + last_midiCC_info[i].ID = i; + + // Init humanize parameter from global parameter constraints + humanize_voice_param = new param_info_t*[SYNTH_NUM_PARAMS]; + + for (i=0; i < SYNTH_NUM_PARAMS; i++) + { + humanize_voice_param[i] = new param_info_t[max_num_voices]; + for (j=0; j < max_num_voices; j++) + { + sprintf_s(paramName, "%s Voice# %03d", String(getParamInfo(i)->pName), j); + paramInfoInit(&humanize_voice_param[i][j], getParamInfo(i)->id, paramName); + paramInfoCopy(&humanize_voice_param[i][j], getParamInfo(i)); + } + } + updateParameters(); + + next_possible_voice = 0; + oldest_voice = 0; + doHumanize = 0; + isHumanize = 0; + m_doMonophon = 0; + m_isMonophon = 0; + m_doUnison = 0; + m_isUnison = 0; + m_unisonGain = 1; + m_doMonophonRetrigger = true; + + m_num_audiothreads = SystemStats::getNumCpus(); + m_ppAudioThread = new JaySynthThread*[m_num_audiothreads]; + m_pEventAudioThreadRdy = new WaitableEvent[m_num_audiothreads]; + + for (i=0; i < m_num_audiothreads; i++) + m_ppAudioThread[i] = new JaySynthThread(&m_pEventAudioThreadRdy[i], m_pVoices, num_voices, i, m_num_audiothreads); + +} + +JaySynth::~JaySynth() +{ + int i, j; + + paramInfoFree(&pb_range[0]); + paramInfoFree(&pb_range[1]); + + for (i=0; i < SYNTH_NUM_PARAMS; i++) + { + for (j=0; j < max_num_voices; j++) + { + paramInfoFree(&humanize_voice_param[i][j]); + } + delete (humanize_voice_param[i]); + } + delete (humanize_voice_param); + + for (i = max_num_voices; --i >= 0;) + removeVoice(i); + + delete (pPer_voice_controls); + delete (pCurrNoteInfos); + delete (m_pVoices); + + for (i=0; i < m_num_audiothreads; i++) + delete(m_ppAudioThread[i]); + + delete(m_ppAudioThread); + delete(m_pEventAudioThreadRdy); + + +} + +synth_float_t JaySynth::getVolume(void) +{ + return master_volume*m_unisonGain; +} + +void JaySynth::humanizeParam (int paramID, bool useRandom, UINT32 random_seed, synth_float_t spread_min, synth_float_t variance) +{ + int j; + synth_float_t spread, spread_dir, value_lo, value_hi; + + noise_gen_t noise; + + Noise_Init(&noise, random_seed); + + spread_dir = 1.0; + for (j=0; j < GET_NUM_VOICES; j++) + { + if (useRandom) + { + do + { + spread = Noise_Gaussian(&noise, variance*sqrt(1.f/12), 0.0); + } while (fabs(spread) < spread_min); + spread = fabs(spread)*spread_dir; + } + else + spread = variance*((synth_float_t)j/GET_NUM_VOICES -0.5); + + + value_lo = clampParam(getParamInfo(paramID), getParamInfo(paramID)->pmin * (1 + spread)); + value_hi = clampParam(getParamInfo(paramID), getParamInfo(paramID)->pmax * (1 + spread)); + paramInfoSet(&humanize_voice_param[paramID][j], + /*base*/getParamInfo(paramID)->base, + /*kexp*/getParamInfo(paramID)->kexp, + /*scenter*/getParamInfo(paramID)->scenter, + /*pmin*/ value_lo, + /*pcenter*/-1E6/*getParamInfo(i)->pcenter*/, + /*pmax*/value_hi, + /*pinterval*/0); + + spread_dir = -spread_dir; + } + Noise_Free(&noise); + +} + +void JaySynth::setSampleRate (synth_float_t sampleRate) +{ + int i; + Synthesiser::setCurrentPlaybackSampleRate (sampleRate); + for (i=0; i < max_num_voices; i++) + ((JaySynthVoice*)getVoice(i))->setSampleRate(sampleRate); + +} + +void JaySynth::setBufsize (int /*bufsize*/) +{ +} + +void JaySynth::humanizeModeChanged(void) +{ + if (doHumanize ^ isHumanize) + { + isHumanize = doHumanize; + humanizeVarianceChanged_VCO(); + humanizeVarianceChanged_VCF(); + humanizeVarianceChanged_ENV(); + updateParameters(); + } +} + +void JaySynth::humanizeVarianceChanged_VCO(void) +{ + int i; + synth_float_t f_ref; + noise_gen_t noise; + + Noise_Init(&noise, 0x1234561); + + for (i=0; i < GET_NUM_VOICES; i++) + { + f_ref = Noise_Gaussian(&noise, 100*humanize_var_vco, 440.0); + + if (isHumanize) + ((JaySynthVoice*)getVoice(i))->setParameter(VOICE_PARAM_MASTER_FREF, f_ref); + else + ((JaySynthVoice*)getVoice(i))->setParameter(VOICE_PARAM_MASTER_FREF, 440.0); + + } + Noise_Free(&noise); + +} + +void JaySynth::humanizeVarianceChanged_VCF(void) +{ + humanizeParam(SYNTH_PARAM_VCF_F, true, 0x1234561, 0, humanize_var_vcf); + humanizeParam(SYNTH_PARAM_VCF_Q, true, 0x1234561, 0, 0.1*humanize_var_vcf); + + // Re-Read parameter + setParameter(SYNTH_PARAM_VCF_F, params[SYNTH_PARAM_VCF_F]); + setParameter(SYNTH_PARAM_VCF_Q, params[SYNTH_PARAM_VCF_Q]); +} + +void JaySynth::humanizeVarianceChanged_ENV(void) +{ + humanizeParam(SYNTH_PARAM_VCA_ENV_A, true, 0x1234561, 0, humanize_var_env); + humanizeParam(SYNTH_PARAM_VCA_ENV_D, true, 0x1234561, 0, humanize_var_env); + humanizeParam(SYNTH_PARAM_VCA_ENV_R, true, 0x1234561, 0, humanize_var_env); + + humanizeParam(SYNTH_PARAM_VCF_ENV_A, true, 0x1234561, 0, humanize_var_env); + humanizeParam(SYNTH_PARAM_VCF_ENV_D, true, 0x1234561, 0, humanize_var_env); + humanizeParam(SYNTH_PARAM_VCF_ENV_R, true, 0x1234561, 0, humanize_var_env); + + humanizeParam(SYNTH_PARAM_ENV_2_A, true, 0x1234561, 0, humanize_var_env); + humanizeParam(SYNTH_PARAM_ENV_2_D, true, 0x1234561, 0, humanize_var_env); + humanizeParam(SYNTH_PARAM_ENV_2_R, true, 0x1234561, 0, humanize_var_env); + + humanizeParam(SYNTH_PARAM_ENV_3_A, true, 0x1234561, 0, humanize_var_env); + humanizeParam(SYNTH_PARAM_ENV_3_D, true, 0x1234561, 0, humanize_var_env); + humanizeParam(SYNTH_PARAM_ENV_3_R, true, 0x1234561, 0, humanize_var_env); + + // Re-Read parameter + setParameter(SYNTH_PARAM_VCA_ENV_A, params[SYNTH_PARAM_VCA_ENV_A]); + setParameter(SYNTH_PARAM_VCA_ENV_D, params[SYNTH_PARAM_VCA_ENV_D]); + setParameter(SYNTH_PARAM_VCA_ENV_R, params[SYNTH_PARAM_VCA_ENV_R]); + + setParameter(SYNTH_PARAM_VCF_ENV_A, params[SYNTH_PARAM_VCF_ENV_A]); + setParameter(SYNTH_PARAM_VCF_ENV_D, params[SYNTH_PARAM_VCF_ENV_D]); + setParameter(SYNTH_PARAM_VCF_ENV_R, params[SYNTH_PARAM_VCF_ENV_R]); + + setParameter(SYNTH_PARAM_ENV_2_A, params[SYNTH_PARAM_ENV_2_A]); + setParameter(SYNTH_PARAM_ENV_2_D, params[SYNTH_PARAM_ENV_2_D]); + setParameter(SYNTH_PARAM_ENV_2_R, params[SYNTH_PARAM_ENV_2_R]); + + setParameter(SYNTH_PARAM_ENV_3_A, params[SYNTH_PARAM_ENV_3_A]); + setParameter(SYNTH_PARAM_ENV_3_D, params[SYNTH_PARAM_ENV_3_D]); + setParameter(SYNTH_PARAM_ENV_3_R, params[SYNTH_PARAM_ENV_3_R]); +} + +//============================================================================== +// Parameter stuff +//============================================================================== +void JaySynth::ClearControls(void) +{ + memset(controls, 0, SYNTH_NUM_PARAMS*sizeof(synth_float_t)); +} + +void JaySynth::updateParameters(void) +{ + int paramID, voice; + + for (paramID=0; paramID < SYNTH_NUM_PARAMS; paramID++) + { + if (pMidCC_editBuffer) + { + for (voice=0; voice < GET_NUM_VOICES; voice++) + { + setPerVoiceControl(voice, SYNTH_PER_VOICE_CONTROL_VELKEY, paramID, pMidCC_editBuffer->getVelKeyControl(paramID, pCurrNoteInfos[voice].velocity, pCurrNoteInfos[voice].note)); + } + } + + setParam(paramID, -1); + } +} + +void JaySynth::updateParameter(int paramID) +{ + int voice; + + if (paramID >= SYNTH_NUM_PARAMS) + return; + + if (pMidCC_editBuffer) + { + for (voice=0; voice < GET_NUM_VOICES; voice++) + { + setPerVoiceControl(voice, SYNTH_PER_VOICE_CONTROL_VELKEY, paramID, pMidCC_editBuffer->getVelKeyControl(paramID, pCurrNoteInfos[voice].velocity, pCurrNoteInfos[voice].note)); + } + } + + setParam(paramID, -1); +} + +synth_float_t JaySynth::getParameter(int paramID) +{ + if (paramID < SYNTH_NUM_PARAMS) + return params[paramID]; + + return 0; +} + +void JaySynth::setParameter(int paramID, synth_float_t param) +{ + params[paramID] = param; + setParam(paramID, -1); + + paramID_changed = paramID; + listeners.call (&JaySynthListener::synthChanged, SYNTH_CHANGED_PARAM, ¶mID_changed); +} + +void JaySynth::setControl(int paramID, synth_float_t param) +{ + controls[paramID] = param; + setParam(paramID, -1); + + paramID_changed = paramID; + listeners.call (&JaySynthListener::synthChanged, SYNTH_CHANGED_PARAM, ¶mID_changed); +} + +void JaySynth::setPerVoiceControl(int voice, int channel, int paramID, synth_float_t param) +{ + pPer_voice_controls[voice].ctrl[channel][paramID] = param; + setParam(paramID, voice); +} + +void JaySynth::setParam(int paramID, int voice) +{ + int i, j, voice_param_type, voice_min, voice_max; + synth_float_t param; + + param_info_t *pParamInfo = getParamInfo(paramID); + + if (!pParamInfo) + return; + + voice_param_type = -1; + param = clampParam(pParamInfo, params[paramID] + controls[paramID]); + switch (paramID) + { + + case SYNTH_PARAM_VOLUME: + master_volume = param/100; + break; + + case SYNTH_PARAM_TUNE: + voice_param_type = VOICE_PARAM_MASTER_TUNE; + break; + + case SYNTH_PARAM_TOTAL_NUM_VOICES: + total_num_voices = (int)param; + break; + + case SYNTH_PARAM_VOICE_PAN_SPREAD: + voice_param_type = VOICE_PARAM_VOICE_PAN; + break; + + case SYNTH_PARAM_HUMANIZE_ENABLE: + doHumanize = param >= 0.5; + break; + + case SYNTH_PARAM_HUMANIZE_VAR_VCO: + humanize_var_vco = param/100; + break; + + case SYNTH_PARAM_HUMANIZE_VAR_VCF: + humanize_var_vcf = param/100; + break; + + case SYNTH_PARAM_HUMANIZE_VAR_ENV: + humanize_var_env = param/100; + break; + + case SYNTH_PARAM_MONOPHONIC_ENABLE: + m_doMonophon = param >= 0.5; + break; + + case SYNTH_PARAM_MONOPHONIC_RETRIGGER_ENABLE: + m_doMonophonRetrigger = param >= 0.5; + break; + + case SYNTH_PARAM_UNISONO_ENABLE: + m_doUnison = param >= 0.5; + break; + + case SYNTH_PARAM_UNISONO_NUM_VOICES: + unison_num_voices = (int)param; + break; + + case SYNTH_PARAM_PORTAMENTO_TIME: + voice_param_type = VOICE_PARAM_PORTAMENTO_TIME; + break; + + case SYNTH_PARAM_NOISE_ENABLE: + voice_param_type = VOICE_PARAM_NOISE_ENABLE; + break; + + case SYNTH_PARAM_NOISE_LEVEL: + voice_param_type = VOICE_PARAM_NOISE_LEVEL; + break; + + case SYNTH_PARAM_NOISE_SHAPE: + voice_param_type = VOICE_PARAM_NOISE_SHAPE; + break; + + case SYNTH_PARAM_VCF_TYPE: + voice_param_type = VOICE_PARAM_VCF_TYPE; + break; + + case SYNTH_PARAM_VCF_ORDER: + voice_param_type = VOICE_PARAM_VCF_ORDER; + break; + + case SYNTH_PARAM_VCF_F: + voice_param_type = VOICE_PARAM_VCF_F; + break; + + case SYNTH_PARAM_VCF_Q: + voice_param_type = VOICE_PARAM_VCF_Q; + break; + + case SYNTH_PARAM_OSC_0_ENABLE: + case SYNTH_PARAM_OSC_1_ENABLE: + voice_param_type = VOICE_PARAM_OSC_0_ENABLE + (paramID - SYNTH_PARAM_OSC_0_ENABLE); + break; + + case SYNTH_PARAM_OSC_0_RESTART_ON_TRIGGER: + case SYNTH_PARAM_OSC_1_RESTART_ON_TRIGGER: + voice_param_type = VOICE_PARAM_OSC_0_RESTART_ON_TRIGGER + (paramID - SYNTH_PARAM_OSC_0_RESTART_ON_TRIGGER); + break; + + case SYNTH_PARAM_OSC_0_LEVEL: + case SYNTH_PARAM_OSC_1_LEVEL: + voice_param_type = VOICE_PARAM_OSC_0_LEVEL + (paramID - SYNTH_PARAM_OSC_0_LEVEL); + break; + + case SYNTH_PARAM_OSC_0_DUTYCYCLE: + case SYNTH_PARAM_OSC_1_DUTYCYCLE: + voice_param_type = VOICE_PARAM_OSC_0_DUTYCYCLE + (paramID - SYNTH_PARAM_OSC_0_DUTYCYCLE); + break; + + case SYNTH_PARAM_OSC_0_DETUNE: + case SYNTH_PARAM_OSC_1_DETUNE: + voice_param_type = VOICE_PARAM_OSC_0_DETUNE + (paramID - SYNTH_PARAM_OSC_0_DETUNE); + break; + + case SYNTH_PARAM_OSC_0_TRANSPOSE: + case SYNTH_PARAM_OSC_1_TRANSPOSE: + voice_param_type = VOICE_PARAM_OSC_0_TRANSPOSE + (paramID - SYNTH_PARAM_OSC_0_TRANSPOSE); + break; + + case SYNTH_PARAM_OSC_0_PB_RANGE_MIN: + case SYNTH_PARAM_OSC_1_PB_RANGE_MIN: + paramInfoSetPMIN(&pb_range[(paramID - SYNTH_PARAM_OSC_0_PB_RANGE_MIN)], param); + handlePitchWheel(lastmidiChannel, lastPitchWheelValue); + break; + + case SYNTH_PARAM_OSC_0_PB_RANGE_MAX: + case SYNTH_PARAM_OSC_1_PB_RANGE_MAX: + paramInfoSetPMAX(&pb_range[(paramID - SYNTH_PARAM_OSC_0_PB_RANGE_MAX)], param); + handlePitchWheel(lastmidiChannel, lastPitchWheelValue); + break; + + case SYNTH_PARAM_OSC_0_WAVEFORM: + case SYNTH_PARAM_OSC_1_WAVEFORM: + voice_param_type = VOICE_PARAM_OSC_0_WAVEFORM + (paramID - SYNTH_PARAM_OSC_0_WAVEFORM); + break; + + case SYNTH_PARAM_OSC_0_FM_AMT_0: + case SYNTH_PARAM_OSC_1_FM_AMT_0: + voice_param_type = VOICE_PARAM_OSC_0_FM_AMT_0 + (paramID - SYNTH_PARAM_OSC_0_FM_AMT_0); + break; + + case SYNTH_PARAM_OSC_0_FM_AMT_1: + case SYNTH_PARAM_OSC_1_FM_AMT_1: + voice_param_type = VOICE_PARAM_OSC_0_FM_AMT_1 + (paramID - SYNTH_PARAM_OSC_0_FM_AMT_1); + break; + + case SYNTH_PARAM_OSC_0_FM_SRC_0: + case SYNTH_PARAM_OSC_1_FM_SRC_0: + voice_param_type = VOICE_PARAM_OSC_0_FM_SRC_0 + (paramID - SYNTH_PARAM_OSC_0_FM_SRC_0); + break; + + case SYNTH_PARAM_OSC_0_FM_SRC_1: + case SYNTH_PARAM_OSC_1_FM_SRC_1: + voice_param_type = VOICE_PARAM_OSC_0_FM_SRC_1 + (paramID - SYNTH_PARAM_OSC_0_FM_SRC_1); + break; + + case SYNTH_PARAM_OSC_0_FM_SRC_OP: + case SYNTH_PARAM_OSC_1_FM_SRC_OP: + voice_param_type = VOICE_PARAM_OSC_0_FM_SRC_OP + (paramID - SYNTH_PARAM_OSC_0_FM_SRC_OP); + break; + + case SYNTH_PARAM_OSC_0_AM_AMT_0: + case SYNTH_PARAM_OSC_1_AM_AMT_0: + voice_param_type = VOICE_PARAM_OSC_0_AM_AMT_0 + (paramID - SYNTH_PARAM_OSC_0_AM_AMT_0); + break; + + case SYNTH_PARAM_OSC_0_AM_AMT_1: + case SYNTH_PARAM_OSC_1_AM_AMT_1: + voice_param_type = VOICE_PARAM_OSC_0_AM_AMT_1 + (paramID - SYNTH_PARAM_OSC_0_AM_AMT_1); + break; + + case SYNTH_PARAM_OSC_0_AM_SRC_0: + case SYNTH_PARAM_OSC_1_AM_SRC_0: + voice_param_type = VOICE_PARAM_OSC_0_AM_SRC_0 + (paramID - SYNTH_PARAM_OSC_0_AM_SRC_0); + break; + + case SYNTH_PARAM_OSC_0_AM_SRC_1: + case SYNTH_PARAM_OSC_1_AM_SRC_1: + voice_param_type = VOICE_PARAM_OSC_0_AM_SRC_1 + (paramID - SYNTH_PARAM_OSC_0_AM_SRC_1); + break; + + case SYNTH_PARAM_OSC_0_AM_SRC_OP: + case SYNTH_PARAM_OSC_1_AM_SRC_OP: + voice_param_type = VOICE_PARAM_OSC_0_AM_SRC_OP + (paramID - SYNTH_PARAM_OSC_0_AM_SRC_OP); + break; + + case SYNTH_PARAM_OSC_0_PWM_AMT_0: + case SYNTH_PARAM_OSC_1_PWM_AMT_0: + voice_param_type = VOICE_PARAM_OSC_0_PWM_AMT_0 + (paramID - SYNTH_PARAM_OSC_0_PWM_AMT_0); + break; + + case SYNTH_PARAM_OSC_0_PWM_AMT_1: + case SYNTH_PARAM_OSC_1_PWM_AMT_1: + voice_param_type = VOICE_PARAM_OSC_0_PWM_AMT_1 + (paramID - SYNTH_PARAM_OSC_0_PWM_AMT_1); + break; + + case SYNTH_PARAM_OSC_0_PWM_SRC_0: + case SYNTH_PARAM_OSC_1_PWM_SRC_0: + voice_param_type = VOICE_PARAM_OSC_0_PWM_SRC_0 + (paramID - SYNTH_PARAM_OSC_0_PWM_SRC_0); + break; + + case SYNTH_PARAM_OSC_0_PWM_SRC_1: + case SYNTH_PARAM_OSC_1_PWM_SRC_1: + voice_param_type = VOICE_PARAM_OSC_0_PWM_SRC_1 + (paramID - SYNTH_PARAM_OSC_0_PWM_SRC_1); + break; + + case SYNTH_PARAM_OSC_0_PWM_SRC_OP: + case SYNTH_PARAM_OSC_1_PWM_SRC_OP: + voice_param_type = VOICE_PARAM_OSC_0_PWM_SRC_OP + (paramID - SYNTH_PARAM_OSC_0_PWM_SRC_OP); + break; + + case SYNTH_PARAM_ENV_0_A: + case SYNTH_PARAM_ENV_1_A: + case SYNTH_PARAM_ENV_2_A: + case SYNTH_PARAM_ENV_3_A: + voice_param_type = VOICE_PARAM_ENV_0_A + (paramID - SYNTH_PARAM_ENV_0_A); + break; + + case SYNTH_PARAM_ENV_0_D: + case SYNTH_PARAM_ENV_1_D: + case SYNTH_PARAM_ENV_2_D: + case SYNTH_PARAM_ENV_3_D: + voice_param_type = VOICE_PARAM_ENV_0_D + (paramID - SYNTH_PARAM_ENV_0_D); + break; + + case SYNTH_PARAM_ENV_0_S: + case SYNTH_PARAM_ENV_1_S: + case SYNTH_PARAM_ENV_2_S: + case SYNTH_PARAM_ENV_3_S: + voice_param_type = VOICE_PARAM_ENV_0_S + (paramID - SYNTH_PARAM_ENV_0_S); + break; + + case SYNTH_PARAM_ENV_0_R: + case SYNTH_PARAM_ENV_1_R: + case SYNTH_PARAM_ENV_2_R: + case SYNTH_PARAM_ENV_3_R: + voice_param_type = VOICE_PARAM_ENV_0_R + (paramID - SYNTH_PARAM_ENV_0_R); + break; + + case SYNTH_PARAM_VCA_AM_AMT_0: + voice_param_type = VOICE_PARAM_VCA_AM_AMT_0; + break; + + case SYNTH_PARAM_VCA_AM_SRC_0: + voice_param_type = VOICE_PARAM_VCA_AM_SRC_0; + break; + + case SYNTH_PARAM_VCA_PAN_AMT_0: + voice_param_type = VOICE_PARAM_VCA_PAN_AMT_0; + break; + + case SYNTH_PARAM_VCA_PAN_SRC_0: + voice_param_type = VOICE_PARAM_VCA_PAN_SRC_0; + break; + + case SYNTH_PARAM_VCA_ENV_AMT: + voice_param_type = VOICE_PARAM_VCA_ENV_GAIN; + break; + + case SYNTH_PARAM_VCF_ENV_AMT: + voice_param_type = VOICE_PARAM_VCF_ENV_GAIN; + break; + + case SYNTH_PARAM_VCF_F_AMT_0: + voice_param_type = VOICE_PARAM_VCF_F_AMT_0; + break; + + case SYNTH_PARAM_VCF_F_AMT_1: + voice_param_type = VOICE_PARAM_VCF_F_AMT_1; + break; + + case SYNTH_PARAM_VCF_F_SRC_0: + voice_param_type = VOICE_PARAM_VCF_F_SRC_0; + break; + + case SYNTH_PARAM_VCF_F_SRC_1: + voice_param_type = VOICE_PARAM_VCF_F_SRC_1; + break; + + case SYNTH_PARAM_VCF_F_SRC_OP: + voice_param_type = VOICE_PARAM_VCF_F_SRC_OP; + break; + + case SYNTH_PARAM_VCF_Q_AMT_0: + voice_param_type = VOICE_PARAM_VCF_Q_AMT_0; + break; + + case SYNTH_PARAM_VCF_Q_AMT_1: + voice_param_type = VOICE_PARAM_VCF_Q_AMT_1; + break; + + case SYNTH_PARAM_VCF_Q_SRC_0: + voice_param_type = VOICE_PARAM_VCF_Q_SRC_0; + break; + + case SYNTH_PARAM_VCF_Q_SRC_1: + voice_param_type = VOICE_PARAM_VCF_Q_SRC_1; + break; + + case SYNTH_PARAM_VCF_Q_SRC_OP: + voice_param_type = VOICE_PARAM_VCF_Q_SRC_OP; + break; + + case SYNTH_PARAM_LFO_0_SPEED: + case SYNTH_PARAM_LFO_1_SPEED: + case SYNTH_PARAM_LFO_2_SPEED: + case SYNTH_PARAM_LFO_3_SPEED: + voice_param_type = VOICE_PARAM_LFO_0_SPEED + (paramID - SYNTH_PARAM_LFO_0_SPEED); + break; + + case SYNTH_PARAM_LFO_0_SMOOTH: + case SYNTH_PARAM_LFO_1_SMOOTH: + case SYNTH_PARAM_LFO_2_SMOOTH: + case SYNTH_PARAM_LFO_3_SMOOTH: + voice_param_type = VOICE_PARAM_LFO_0_SMOOTH + (paramID - SYNTH_PARAM_LFO_0_SMOOTH); + break; + + case SYNTH_PARAM_LFO_0_DELAY: + case SYNTH_PARAM_LFO_1_DELAY: + case SYNTH_PARAM_LFO_2_DELAY: + case SYNTH_PARAM_LFO_3_DELAY: + voice_param_type = VOICE_PARAM_LFO_0_DELAY + (paramID - SYNTH_PARAM_LFO_0_DELAY); + break; + + case SYNTH_PARAM_LFO_0_ATTACK: + case SYNTH_PARAM_LFO_1_ATTACK: + case SYNTH_PARAM_LFO_2_ATTACK: + case SYNTH_PARAM_LFO_3_ATTACK: + voice_param_type = VOICE_PARAM_LFO_0_ATTACK + (paramID - SYNTH_PARAM_LFO_0_ATTACK); + break; + + case SYNTH_PARAM_LFO_0_SHAPE: + case SYNTH_PARAM_LFO_1_SHAPE: + case SYNTH_PARAM_LFO_2_SHAPE: + case SYNTH_PARAM_LFO_3_SHAPE: + voice_param_type = VOICE_PARAM_LFO_0_SHAPE + (paramID - SYNTH_PARAM_LFO_0_SHAPE); + break; + + case SYNTH_PARAM_LFO_0_MODE: + case SYNTH_PARAM_LFO_1_MODE: + case SYNTH_PARAM_LFO_2_MODE: + case SYNTH_PARAM_LFO_3_MODE: + voice_param_type = VOICE_PARAM_LFO_0_MODE + (paramID - SYNTH_PARAM_LFO_0_MODE); + break; + + case SYNTH_PARAM_LFO_0_SYNC: + case SYNTH_PARAM_LFO_1_SYNC: + case SYNTH_PARAM_LFO_2_SYNC: + case SYNTH_PARAM_LFO_3_SYNC: + voice_param_type = VOICE_PARAM_LFO_0_SYNC + (paramID - SYNTH_PARAM_LFO_0_SYNC); + break; + + case SYNTH_PARAM_LFO_0_SYMMETRY: + case SYNTH_PARAM_LFO_1_SYMMETRY: + case SYNTH_PARAM_LFO_2_SYMMETRY: + case SYNTH_PARAM_LFO_3_SYMMETRY: + voice_param_type = VOICE_PARAM_LFO_0_SYMMETRY + (paramID - SYNTH_PARAM_LFO_0_SYMMETRY); + break; + + default: + break; + } + + if (voice_param_type >= 0) + { + voice_min = voice; + voice_max = voice; + if (voice < 0) + { + voice_min = 0; + voice_max = GET_NUM_VOICES-1; + } + + if (isHumanize) + { + param_info_t *pConstraints = getParamInfo(paramID); + param_info_t *pHumanized; + for (i=voice_min; i <= voice_max; i++) + { + param = params[paramID] + controls[paramID]; + for (j=0; j < SYNTH_PER_VOICE_CONTROL_SIZE; j++) + param += pPer_voice_controls[i].ctrl[j][paramID]; + + param = clampParam(pParamInfo, param); + pHumanized = &humanize_voice_param[paramID][i]; + ((JaySynthVoice*)getVoice(i))->setParameter(voice_param_type, toParam(pHumanized, toSlider(pConstraints, param))); + } + } + else + { + for (i=voice_min; i <= voice_max; i++) + { + param = params[paramID] + controls[paramID]; + for (j=0; j < SYNTH_PER_VOICE_CONTROL_SIZE; j++) + param += pPer_voice_controls[i].ctrl[j][paramID]; + + param = clampParam(pParamInfo, param); + ((JaySynthVoice*)getVoice(i))->setParameter(voice_param_type, param); + + } + } + } + +} + +//============================================================================== +// Midi-Event stuff +//============================================================================== +void JaySynth::handlePitchWheel (const int midiChannel, const int wheelValue) +{ + int i; + synth_float_t scale, value; + + lastPitchWheelValue = wheelValue; + lastmidiChannel = midiChannel; + value = (synth_float_t)wheelValue/16384; // PB-Range 0 to 1, center at 0.5 + + scale = pow(2, toParam(&pb_range[0], value)/12); + for (i=0; i < GET_NUM_VOICES; i++) + ((JaySynthVoice*)getVoice(i))->setParameter(VOICE_PARAM_OSC_0_SCALE, scale); + + scale = pow(2, toParam(&pb_range[1], value)/12); + for (i=0; i < GET_NUM_VOICES; i++) + ((JaySynthVoice*)getVoice(i))->setParameter(VOICE_PARAM_OSC_1_SCALE, scale); + +} + +void JaySynth::handleController (const int midiChannel, + const int controllerNumber, + const int controllerValue) +{ + midiCC_info.channel = midiChannel; + midiCC_info.ID = controllerNumber; + midiCC_info.value = (synth_float_t)controllerValue/127; + + last_midiCC_info[controllerNumber] = midiCC_info; + listeners.call (&JaySynthListener::synthChanged, SYNTH_CHANGED_MIDICC, &midiCC_info); + + switch (controllerNumber) + { + case 0x40: handleSustainPedal (midiChannel, controllerValue >= 64); break; + case 0x42: handleSostenutoPedal (midiChannel, controllerValue >= 64); break; + case 0x43: handleSoftPedal (midiChannel, controllerValue >= 64); break; + default: break; + } + + const ScopedLock sl (lock); + + for (int i = 0; i < GET_NUM_VOICES; i++) + { + JaySynthVoice* const voice = voices.getUnchecked (i); + + if (midiChannel <= 0 || voice->isPlayingChannel (midiChannel)) + voice->controllerMoved (controllerNumber, controllerValue); + } +} + +void JaySynth::handleSustainPedal (int midiChannel, bool isDown) +{ + jassert (midiChannel > 0 && midiChannel <= 16); + const ScopedLock sl (lock); + + if (isDown) + { + sustainPedalsDown.setBit (midiChannel); + } + else + { + for (int i = 0; i < GET_NUM_VOICES; i++) + { + JaySynthVoice* const voice = voices.getUnchecked (i); + + if (voice->isPlayingChannel (midiChannel) && ! voice->keyIsDown) + Voicestop (voice, true); + } + + sustainPedalsDown.clearBit (midiChannel); + } +} + +void JaySynth::handleSostenutoPedal (int midiChannel, bool isDown) +{ + jassert (midiChannel > 0 && midiChannel <= 16); + const ScopedLock sl (lock); + + for (int i = 0; i < GET_NUM_VOICES; i++) + { + JaySynthVoice* const voice = voices.getUnchecked (i); + + if (voice->isPlayingChannel (midiChannel)) + { + if (isDown) + voice->sostenutoPedalDown = true; + else if (voice->sostenutoPedalDown) + Voicestop (voice, true); + } + } +} + +void JaySynth::handleSoftPedal (int midiChannel, bool /*isDown*/) +{ + (void) midiChannel; + jassert (midiChannel > 0 && midiChannel <= 16); +} + +//============================================================================== +// Audio data rendering stuff +//============================================================================== +void JaySynth::renderNextBlock (AudioSampleBuffer& outputBuffer, + const MidiBuffer& midiData, + int startSample, + int numSamples) +{ + int i; + int numVoicesPlaying; + float *buf1, *buf2; + + // must set the sample rate before using this! + jassert (sampleRate != 0); + + const ScopedLock sl (lock); + + MidiBuffer::Iterator midiIterator (midiData); + midiIterator.setNextSamplePosition (startSample); + MidiMessage m (0xf4, 0.0); + + while (numSamples > 0) + { + int midiEventPos; + const bool useEvent = midiIterator.getNextEvent (m, midiEventPos) + && midiEventPos < startSample + numSamples; + + const int numThisTime = useEvent ? midiEventPos - startSample + : numSamples; + + if (numThisTime > 0) + { + + // Process global voice data + buf1 = outputBuffer.getSampleData (0, startSample); + buf2 = outputBuffer.getSampleData (1, startSample); + VoiceProcessDataV_Common(&m_pVoices[0], buf1, buf2, numThisTime); + + // Start audio threads + for (i=0; i < m_num_audiothreads; i++) + { + m_ppAudioThread[i]->go(numThisTime); + } + + // Wait for audio threads finishing and add buffer + for (i=0; i < m_num_audiothreads; i++) + { + m_pEventAudioThreadRdy[i].wait(-1); + outputBuffer.addFrom(0, startSample, m_ppAudioThread[i]->getBuffer(), 0, 0, numThisTime, 1.0); + outputBuffer.addFrom(1, startSample, m_ppAudioThread[i]->getBuffer(), 1, 0, numThisTime, 1.0); + } + } + + // Clear note if voice is idle + for (int i = 0; i < max_num_voices; i++) + { + if (m_pVoices[i].state == note_state_idle) + { + if (voices.getUnchecked(i)->currentlyPlayingNote >= 0) + { + voices.getUnchecked(i)->clearCurrentNote(); + numVoicesPlaying = getNumVoicesPlaying(sounds.getUnchecked(0)); + listeners.call (&JaySynthListener::synthChanged, SYNTH_CHANGED_NUM_VOICES_PLAYING, &numVoicesPlaying); + } + } + } + if (useEvent) + handleMidiEvent (m); + + startSample += numThisTime; + numSamples -= numThisTime; + } +} + +void JaySynth::handleMidiEvent (const MidiMessage& m) +{ + if (m.isNoteOn()) + { + noteOn (m.getChannel(), + m.getNoteNumber(), + m.getFloatVelocity()); + } + else if (m.isNoteOff()) + { + noteOff (m.getChannel(), + m.getNoteNumber(), + true); + } + else if (m.isAllNotesOff() || m.isAllSoundOff()) + { + allNotesOff (m.getChannel(), true); + + } + else if (m.isPitchWheel()) + { + const int channel = m.getChannel(); + const int wheelPos = m.getPitchWheelValue(); + lastPitchWheelValues [channel - 1] = wheelPos; + + handlePitchWheel (channel, wheelPos); + } + else if (m.isController()) + { + handleController (m.getChannel(), + m.getControllerNumber(), + m.getControllerValue()); + } + else if (m.isMidiStart()) + { + SynthDebug("MidiStart\n"); + } + else if (m.isMidiContinue()) + { + SynthDebug("MidiContinue\n"); + } + else if (m.isMidiStop()) + { + SynthDebug("MidiStop\n"); + } + else if (m.isMidiClock()) + { + + } + else if (m.isSongPositionPointer()) + { + + } + else if (m.isQuarterFrame()) + { + + } + else if (m.isFullFrame()) + { + + } +} + +//============================================================================== +// Voice trigger stuff +//============================================================================== +void JaySynth::Voicestart (JaySynthVoice* const voice, + SynthesiserSound* const sound, + const int midiChannel, + const int midiNoteNumber, + const float velocity, bool doTrigger) +{ + int numVoicesPlaying; + + if (voice != nullptr && sound != nullptr) + { +// if (voice->getCurrentlyPlayingSound() != nullptr) +// if (!isMonophon) +// voice->stopNote (false); + + if (pMidCC_editBuffer) + { + for (int paramID=0; paramID < SYNTH_NUM_PARAMS; paramID++) + { + if (pMidCC_editBuffer->isAssignedVelKeyControl(paramID)) + setPerVoiceControl(voice->m_pVoice->id, SYNTH_PER_VOICE_CONTROL_VELKEY, paramID, pMidCC_editBuffer->getVelKeyControl(paramID, velocity, midiNoteNumber)); + } + } + + pCurrNoteInfos[voice->m_pVoice->id].note = midiNoteNumber; + pCurrNoteInfos[voice->m_pVoice->id].velocity = velocity; + + VoiceParam2Set(voice->m_pVoice, VOICE_PARAM_KEY, midiNoteNumber); + +// if (!m_isMonophon || (m_isMonophon && doTrigger && (m_num_keys_pressed_last == 0)) || (m_isMonophon && doTrigger && m_doMonophonRetrigger && (m_highest_key_last < midiNoteNumber))) + if (!m_isMonophon || (m_isMonophon && doTrigger && (m_num_keys_pressed_last == 0)) || (m_isMonophon && m_doMonophonRetrigger && (m_latest_key != m_latest_key_last))) + { + voice->startNote (midiNoteNumber, velocity, sound, + lastPitchWheelValues [midiChannel - 1]); + } + + voice->currentlyPlayingNote = midiNoteNumber; +// voice->noteOnTime = ++lastNoteOnCounter; + voice->currentlyPlayingSound = sound; + voice->keyIsDown = true; + voice->sostenutoPedalDown = false; + numVoicesPlaying = getNumVoicesPlaying(sounds.getUnchecked(0)); + listeners.call (&JaySynthListener::synthChanged, SYNTH_CHANGED_NUM_VOICES_PLAYING, &numVoicesPlaying); + + } +} + +void JaySynth::Voicestop (JaySynthVoice* voice, const bool allowTailOff) +{ + jassert (voice != nullptr); + + voice->stopNote (allowTailOff); + + // the subclass MUST call clearCurrentNote() if it's not tailing off! RTFM for stopNote()! + jassert (allowTailOff || (voice->getCurrentlyPlayingNote() < 0 && voice->getCurrentlyPlayingSound() == 0)); +} + +void JaySynth::allNotesOff (const int midiChannel, const bool allowTailOff) +{ + int i; + int numVoicesPlaying; + const ScopedLock sl (lock); + + clearKeysPressed(); + + for (i=0; i < max_num_voices; i++) + { + JaySynthVoice* const voice = voices.getUnchecked (i); + + if (midiChannel <= 0 || voice->isPlayingChannel (midiChannel)) + voice->stopNote (allowTailOff); + } + sustainPedalsDown.clear(); + next_possible_voice = 0; + oldest_voice = 0; +} + +void JaySynth::noteOn (const int midiChannel, const int midiNoteNumber, const float velocity) +{ + int i, j, latest_note; + float latest_vel; + const ScopedLock sl (lock); + + last_midi_note_info.note = midiNoteNumber; + last_midi_note_info.velocity = velocity; + listeners.call (&JaySynthListener::synthChanged, SYNTH_CHANGED_NOTE_PRESSED, &last_midi_note_info); + + setKeyPressed(midiNoteNumber, velocity); + if (m_isMonophon) + { + latest_note = m_latest_key; + latest_vel = m_monoMGR.getVel(m_latest_key); + for (i=0; i < sounds.size(); i++) + { + SynthesiserSound* const sound = sounds.getUnchecked(i); + if (m_isUnison) + { + for (j=0; j < unison_num_voices; j++) + { + Voicestart (voices.getUnchecked (j), sound, midiChannel, latest_note, latest_vel, true); + } + } + else + { + Voicestart (voices.getUnchecked (0), sound, midiChannel, latest_note, latest_vel, true); + } + } + } + else + { + for (int i = sounds.size(); --i >= 0;) + { + SynthesiserSound* const sound = sounds.getUnchecked(i); + + if (sound->appliesToNote (midiNoteNumber) + && sound->appliesToChannel (midiChannel)) + { + // If hitting a note that's still ringing, stop it first (it could be + // still playing because of the sustain or sostenuto pedal). +// for (j=0; j < max_num_voices; j++) +// { +// JaySynthVoice* const voice = voices.getUnchecked (j); +// +// if (!m_isMonophon) +// { +// if (voice->getCurrentlyPlayingNote() == midiNoteNumber && voice->isPlayingChannel (midiChannel)) +// Voicestop (voice, true); +// } +// } + if (m_isUnison) + { + for (j=0; j < unison_num_voices; j++) + { + Voicestart (getFreeVoice (sound, isNoteStealingEnabled()), sound, midiChannel, midiNoteNumber, velocity, true); + } + } + else + { + Voicestart (getFreeVoice (sound, isNoteStealingEnabled()), sound, midiChannel, midiNoteNumber, velocity, true); + } + } + } + } +} + +void JaySynth::noteOff (const int midiChannel, + const int midiNoteNumber, + const bool allowTailOff) +{ + int i, j, latest_note; + float latest_vel; + const ScopedLock sl (lock); + + midi_note_info_t midi_note_info; + midi_note_info.note = midiNoteNumber; + midi_note_info.velocity = 0; + listeners.call (&JaySynthListener::synthChanged, SYNTH_CHANGED_NOTE_RELEASED, &midi_note_info); + + setKeyPressed(midiNoteNumber, 0); + if (m_isMonophon) + { + latest_note = m_latest_key; + latest_vel = m_monoMGR.getVel(m_latest_key); + if (latest_note >= 0) + { + for (i = sounds.size(); --i >= 0;) + { + SynthesiserSound* const sound = sounds.getUnchecked(i); + if (m_isUnison) + { + for (j=0; j < unison_num_voices; j++) + { + Voicestart (voices.getUnchecked (j), sound, midiChannel, latest_note, latest_vel, false); + } + } + else + { + Voicestart (voices.getUnchecked (0), sound, midiChannel, latest_note, latest_vel, false); + } + } + } + else + { + for (i=0; i < max_num_voices; i++) + { + JaySynthVoice* const voice = voices.getUnchecked (i); + voice->keyIsDown = false; + if (! (sustainPedalsDown [midiChannel] || voice->sostenutoPedalDown)) + { + Voicestop (voice, allowTailOff); + } + } + } + } + else + { + + for (i=0; i < max_num_voices; i++) + { + JaySynthVoice* const voice = voices.getUnchecked (i); + + if (voice->getCurrentlyPlayingNote() == midiNoteNumber) + { + SynthesiserSound* const sound = voice->getCurrentlyPlayingSound(); + + if (sound != nullptr + && sound->appliesToNote (midiNoteNumber) + && sound->appliesToChannel (midiChannel)) + { + voice->keyIsDown = false; + + if (! (sustainPedalsDown [midiChannel] || voice->sostenutoPedalDown)) + Voicestop (voice, allowTailOff); + } + } + } + } +} + +//============================================================================== +// Voice management stuff +//============================================================================== +void JaySynth::unisonoModeChanged(void) +{ + int key; + float vel; +// if ((m_doMonophon ^ m_isMonophon) || (m_doUnison ^ m_isUnison)) + { + m_isMonophon = m_doMonophon; + m_isUnison = m_doUnison; + allNotesOff(0, false); + if (m_isMonophon) + { + key = m_latest_key; + vel = m_monoMGR.getVel(m_latest_key); + } + if (m_isUnison) + { + m_unisonGain = 5.0/(4 + unison_num_voices); + } + else + { + m_unisonGain = 1; + } + } +} + +void JaySynth::advanceNextPossibleVoice(void) +{ + next_possible_voice++; + if (next_possible_voice >= total_num_voices) + next_possible_voice = 0; +} + +int JaySynth::getNextPossibleVoice(void) +{ + return next_possible_voice; +} + +void JaySynth::advanceOldestVoice(void) +{ + oldest_voice++; + if (oldest_voice >= total_num_voices) + oldest_voice = 0; +} + +int JaySynth::getOldestVoice(void) +{ + return oldest_voice; +} + +int JaySynth::getNumVoicesPlaying (SynthesiserSound* soundToPlay) +{ + int i, numVoicesFound; + const ScopedLock sl (lock); + + numVoicesFound = 0; + for (i = 0; i < max_num_voices; i++) + { + if (voices.getUnchecked (i)->getCurrentlyPlayingNote() >= 0 + && voices.getUnchecked (i)->canPlaySound (soundToPlay)) + { + numVoicesFound++; + } + } + return numVoicesFound; +} + +JaySynthVoice* JaySynth::getFreeVoice (SynthesiserSound* soundToPlay, + const bool stealIfNoneAvailable) +{ + int i, freeVoiceFound; + const ScopedLock sl (lock); + + freeVoiceFound = -1; + for (i = 0; i < total_num_voices; i++) + { + if (voices.getUnchecked (getNextPossibleVoice())->getCurrentlyPlayingNote() < 0 + && voices.getUnchecked (getNextPossibleVoice())->canPlaySound (soundToPlay)) + { + freeVoiceFound = getNextPossibleVoice(); + advanceNextPossibleVoice(); + break; + } + advanceNextPossibleVoice(); + } + + if (freeVoiceFound >= 0) + { + return voices.getUnchecked (freeVoiceFound); + } + + if (stealIfNoneAvailable) + { + // currently this just steals the one that's been playing the longest, but could be made a bit smarter.. + JaySynthVoice* oldest = voices.getUnchecked (getOldestVoice()); + + for (i = 0; i < total_num_voices; i++) + { + advanceOldestVoice(); + if (voices.getUnchecked (getOldestVoice())->getCurrentlyPlayingNote() >= 0) + break; + + } + + jassert (oldest != nullptr); + return oldest; + } + + return nullptr; +} + +void JaySynth::clearKeysPressed(void) +{ + m_monoMGR.init(); + m_num_keys_pressed = -1; + m_latest_key = -1; + m_highest_key = -1; + m_num_keys_pressed_last = -1; + m_latest_key_last = -1; + m_highest_key_last = -1; +} + +void JaySynth::setKeyPressed(int key, float vel) +{ + m_num_keys_pressed_last = m_monoMGR.getNumNotes(); + m_latest_key_last = m_monoMGR.getLatestNote(); + m_highest_key_last = m_monoMGR.getHighestNote(); + m_monoMGR.add(key, vel); + m_num_keys_pressed = m_monoMGR.getNumNotes(); + m_latest_key = m_monoMGR.getLatestNote(); + m_highest_key = m_monoMGR.getHighestNote(); +} + +void JaySynthThread::run(void) +{ + float *buf1, *buf2; + + while(!threadShouldExit()) + { + wait(-1); + if (threadShouldExit()) + break; + + m_buffer->clear (0, 0, m_sample_len); + m_buffer->clear (1, 0, m_sample_len); + + buf1 = m_buffer->getSampleData (0, 0); + buf2 = m_buffer->getSampleData (1, 0); + + for (int i = m_voice_offset; i < m_num_voices; i += m_voice_step) + { + if (m_pVoices[i].state == note_state_idle) + continue; + + VoiceProcessDataV(&m_pVoices[i], buf1, buf2, m_sample_len); + + } + m_pEventRdy->signal(); + } +} + +JaySynthThread::JaySynthThread(WaitableEvent *pEventRdy, voice_t *pVoices, int num_voices, int offset, int step) +: Thread(L"") +{ + setCurrentThreadName(L"JaySynthAudioThread_" + String(offset)); + m_pEventRdy = pEventRdy; + m_num_voices = num_voices; + m_pVoices = pVoices; + m_voice_offset = offset; + m_voice_step = step; + m_buffer = new AudioSampleBuffer(2, SYNTH_MAX_BUFSIZE); + startThread (12); +} + +void JaySynthThread::go(int len) +{ + m_sample_len = len; + notify(); +} + +AudioSampleBuffer& JaySynthThread::getBuffer(void) +{ + return *m_buffer; +} + +JaySynthThread::~JaySynthThread() +{ + stopThread (100); + delete (m_buffer); +} +//============================================================================== diff --git a/Source/JaySynth.h b/Source/JaySynth.h new file mode 100644 index 0000000..f661f34 --- /dev/null +++ b/Source/JaySynth.h @@ -0,0 +1,252 @@ +/* + ============================================================================== + + This file was generated by user! + + ============================================================================== +*/ + +#ifndef _JAYSYNTH_H_ +#define _JAYSYNTH_H_ + +#include "../JuceLibraryCode/JuceHeader.h" +#include "synth_defs.h" +#include "param_scale.h" +#include "JaySynthVoice.h" +#include "JaySynthMonophonicMGR.h" + +#define GET_NUM_VOICES max_num_voices + +class JaySynthListener +{ +public: + virtual void synthChanged(int /*type*/, void* /*pData*/) {}; +}; + +class JaySynthThread : public Thread +{ +public: + JaySynthThread(WaitableEvent *pEventRdy, voice_t *pVoices, int num_voices, int offset, int step); + ~JaySynthThread(); + void go(int len); + AudioSampleBuffer& getBuffer(void); + void run(void); +private: + AudioSampleBuffer *m_buffer; + voice_t *m_pVoices; + int m_num_voices; + int m_voice_offset, m_voice_step; + int m_sample_len; + WaitableEvent *m_pEventRun; + WaitableEvent *m_pEventRdy; + +}; + +class JaySynth : public Synthesiser +{ +public: + JaySynth(int num_voices, String pathToWaves); + ~JaySynth(); + void setSampleRate (synth_float_t sampleRate); + void setBufsize (int bufsize); + void setParam(int paramID, int voice); + void ClearControls(void); + void setControl(int paramID, synth_float_t value); + void setParameter(int paramID, synth_float_t value); + void setPerVoiceControl(int voice, int channel, int paramID, synth_float_t param); + synth_float_t getParameter(int paramID); + synth_float_t getVolume(void); + int lastPitchWheelValue, lastmidiChannel; + void handlePitchWheel (int midiChannel, int wheelValue); + void handleController (int midiChannel, int controllerNumber, int controllerValue); + void updateParameters(void); + void updateParameter(int paramID); + void humanizeModeChanged(void); + void humanizeVarianceChanged_VCO(void); + void humanizeVarianceChanged_VCF(void); + void humanizeVarianceChanged_ENV(void); + void unisonoModeChanged(void); + void humanizeParam (int paramID, bool useRandom, UINT32 random_seed, synth_float_t spread_min, synth_float_t variance); + bool isUnison(void) + { + return m_isUnison; + } + int getUnisonNumberOfVoices(void) + { + return unison_num_voices; + } + + // ======================================================================== + void advanceNextPossibleVoice(void); + int getNextPossibleVoice(void); + void advanceOldestVoice(void); + int getOldestVoice(void); + void Voicestart (JaySynthVoice* const voice, + SynthesiserSound* const sound, + const int midiChannel, + const int midiNoteNumber, + const float velocity, bool doTrigger); + + void Voicestop (JaySynthVoice* voice, const bool allowTailOff); + int getNumVoicesPlaying (SynthesiserSound* soundToPlay); + + void clearKeysPressed(void); + void setKeyPressed(int key, float vel); + + void noteOn (int midiChannel, int midiNoteNumber, float velocity); + void noteOff (int midiChannel, int midiNoteNumber, bool allowTailOff); + void allNotesOff (int midiChannel, bool allowTailOff); + + JaySynthVoice* getFreeVoice (SynthesiserSound* soundToPlay, + const bool stealIfNoneAvailable); + + void handleMidiEvent (const MidiMessage& m); + void handleSustainPedal (int midiChannel, bool isDown); + void handleSostenutoPedal (int midiChannel, bool isDown); + void handleSoftPedal (int midiChannel, bool isDown); + + void renderNextBlock (AudioSampleBuffer& outputAudio, + const MidiBuffer& inputMidi, + int startSample, + int numSamples); + + int getNumVoices() const + { + return max_num_voices; + } + + JaySynthVoice* getVoice (const int index) const + { + const ScopedLock sl (lock); + return voices [index]; + } + + void clearVoices() + { + const ScopedLock sl (lock); + voices.clear(); + } + + void addVoice (JaySynthVoice* const newVoice) + { + const ScopedLock sl (lock); + voices.add (newVoice); + } + + void removeVoice (const int index) + { + const ScopedLock sl (lock); + voices.remove (index); + } + + // ======================================================================== + void addListener(JaySynthListener *listener) + { + listeners.add (listener); + } + + enum + { + SYNTH_PER_VOICE_CONTROL_VELKEY = 0, + SYNTH_PER_VOICE_CONTROL_SIZE + }; + + enum + { + SYNTH_CHANGED_PARAM = 0, + SYNTH_CHANGED_MIDICC, + SYNTH_CHANGED_NUM_VOICES_PLAYING, + SYNTH_CHANGED_NOTE_PRESSED, + SYNTH_CHANGED_NOTE_RELEASED, + SYNTH_CHANGED_SIZE + }; + + typedef struct _smidiCC_info_t + { + int channel; + int ID; + synth_float_t value; + } midiCC_info_t; + + typedef struct _smidi_note_info_t + { + int note; + synth_float_t velocity; + + } midi_note_info_t; + + midiCC_info_t* getLastMidiCC_infos(void) + { + return last_midiCC_info; + } + + midiCC_info_t* getLastMidiCC_info(int controllerID) + { + if (controllerID < NUM_MIDI_CONTROLLERS) + return &last_midiCC_info[controllerID]; + + return NULL; + } + + midi_note_info_t* getLastMidiNote_infos() + { + return &last_midi_note_info; + } + + void setMidiCC_editBuffer(JaySynthMidiCC *pMidiCC) + { + pMidCC_editBuffer = pMidiCC; + } + + typedef struct _sper_voice_control_t + { + synth_float_t ctrl[SYNTH_PER_VOICE_CONTROL_SIZE][SYNTH_NUM_PARAMS]; + + } per_voice_control_t; + + //============================================================================== + +private: + int m_num_audiothreads; + float sampleRate; + BigInteger sustainPedalsDown; + int paramID_changed, next_possible_voice, oldest_voice; + JaySynthMidiCC *pMidCC_editBuffer; + midiCC_info_t last_midiCC_info[NUM_MIDI_CONTROLLERS]; + midiCC_info_t midiCC_info; + synth_float_t params[SYNTH_NUM_PARAMS]; + synth_float_t controls[SYNTH_NUM_PARAMS]; + per_voice_control_t *pPer_voice_controls; + synth_float_t master_volume; + synth_float_t humanize_var_vco; + synth_float_t humanize_var_vcf; + synth_float_t humanize_var_env; + voice_common_t synth_common; + param_info_t pb_range[VOICE_NUM_OSC]; + bool m_doVcoRestartOnTrigger; + bool doHumanize, isHumanize; + bool m_doMonophon, m_isMonophon; + bool m_doUnison, m_isUnison; + bool m_doMonophonRetrigger; + int m_num_keys_pressed; + int m_num_keys_pressed_last; + int m_highest_key; + int m_highest_key_last; + int m_latest_key; + int m_latest_key_last; + int unison_num_voices; + int max_num_voices, total_num_voices; + param_info_t **humanize_voice_param; + ListenerList listeners; + OwnedArray voices; + synth_float_t m_unisonGain; + midi_note_info_t *pCurrNoteInfos; + midi_note_info_t last_midi_note_info; + voice_t *m_pVoices; + JaySynthThread **m_ppAudioThread; + WaitableEvent *m_pEventAudioThreadRdy; + JaySynthMonophonicMGR m_monoMGR; +}; + + +#endif // _JAYSYNTH_H_ diff --git a/Source/JaySynthAudioProcessorEditor.cpp b/Source/JaySynthAudioProcessorEditor.cpp new file mode 100644 index 0000000..6bf9083 --- /dev/null +++ b/Source/JaySynthAudioProcessorEditor.cpp @@ -0,0 +1,6734 @@ +/* + ============================================================================== + + This is an automatically generated file created by the Jucer! + + Creation date: 31 Mar 2014 12:38:24pm + + Be careful when adding custom code to these files, as only the code within + the "//[xyz]" and "//[/xyz]" sections will be retained when the file is loaded + and re-saved. + + Jucer version: 1.12 + + ------------------------------------------------------------------------------ + + The Jucer is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-6 by Raw Material Software ltd. + + ============================================================================== +*/ + +//[Headers] You can add your own extra header files here... +//[/Headers] + +#include "JaySynthAudioProcessorEditor.h" + + +//[MiscUserDefs] You can add your own user definitions and misc code here... +//[/MiscUserDefs] + +//============================================================================== +JaySynthAudioProcessorEditor::JaySynthAudioProcessorEditor (JaySynthAudioProcessor* ownerFilter, bool has_wt) + : AudioProcessorEditor (ownerFilter), + m_label_colon (0), + m_slider_master_volume (0), + m_slider_vcf_f (0), + m_slider_vcf_q (0), + m_slider_osc0_det (0), + m_slider_osc1_det (0), + m_slider_osc0_transpose (0), + m_slider_osc1_transpose (0), + m_slider_vca_env_attack (0), + m_slider_vca_env_decay (0), + m_slider_vca_env_release (0), + m_slider_vca_env_sustain (0), + m_slider_vcf_env_attack (0), + m_slider_vcf_env_decay (0), + m_slider_vcf_env_release (0), + m_slider_vcf_env_sustain (0), + m_slider_vcf_env_amount (0), + m_label_vcf_env_attack (0), + m_label_vcf_f (0), + m_label_vca_env_attack (0), + m_label_vca_env_decay (0), + m_label_vca_env_sustain (0), + m_label_vca_env_release (0), + m_label_vcf_env_decay (0), + m_label_vcf_env_sustain (0), + m_label_vcf_env_release (0), + m_label_vcf_q (0), + m_label_vcf_env_amount (0), + m_label_master_volume (0), + m_label_osc0_transpose (0), + m_label_osc1_transpose (0), + m_label_osc0_det (0), + m_label_osc1_det (0), + m_slider_vca_env_amount (0), + m_label_vca_env_amount (0), + m_slider_osc0_dutycycle (0), + m_slider_osc1_dutycycle (0), + m_label_osc0_dutycycle (0), + m_label_osc1_dutycycle (0), + m_slider_lfo0_speed (0), + m_slider_osc1_fm_amt0 (0), + m_slider_osc0_fm_amt0 (0), + m_label_lfo0_speed (0), + m_label_osc0_fm_amt0 (0), + m_label_osc1_fm_amt0 (0), + m_slider_vcf_f_amt0 (0), + m_label_vcf_f_amt0 (0), + m_slider_lfo1_speed (0), + m_label_lfo1_speed (0), + m_comboBox_osc0_shape (0), + m_comboBox_osc1_shape (0), + m_comboBox_lfo0_shape (0), + m_comboBox_lfo1_shape (0), + m_slider_lfo2_speed (0), + m_slider_lfo3_speed (0), + m_comboBox_lfo2_shape (0), + m_comboBox_lfo3_shape (0), + m_label_lfo2_speed (0), + m_label_lfo3_speed (0), + m_comboBox_vcf_f_src0 (0), + m_comboBox_osc0_fm_src0 (0), + m_comboBox_osc1_fm_src0 (0), + m_slider_vca_am_amt0 (0), + m_label_vca_am_amt0 (0), + m_comboBox_vca_am_src0 (0), + m_slider_vca_pan_amt0 (0), + m_label_vca_pan_amt0 (0), + m_comboBox_vca_pan_src0 (0), + m_label_synth_name (0), + m_label_synth_version (0), + m_comboBox_vcf_type (0), + m_slider_lfo1_smooth (0), + m_label_lfo1_smooth (0), + m_slider_lfo0_smooth (0), + m_label_lfo0_smooth (0), + m_slider_lfo2_smooth (0), + m_label_lfo2_smooth (0), + m_slider_lfo3_smooth (0), + m_label_lfo3_smooth (0), + m_slider_osc0_pwm_amt0 (0), + m_label_osc0_pwm_amt0 (0), + m_slider_osc1_pwm_amt0 (0), + m_label_osc1_pwm_amt0 (0), + m_comboBox_osc0_pwm_src0 (0), + m_comboBox_osc1_pwm_src0 (0), + m_slider_osc0_level (0), + m_label_osc0_level (0), + m_slider_osc1_level (0), + m_label_osc1_level (0), + m_slider_noise_level (0), + m_label_noise_level (0), + m_comboBox_noise_shape (0), + m_btn_noise_enable_led (0), + m_btn_osc0_enable (0), + m_btn_osc1_enable (0), + m_label_patch_name (0), + m_button_patch_incr (0), + m_button_patch_decr (0), + m_label_patch_number (0), + m_label_osc1_pb_min (0), + m_label_osc1_pb_max (0), + m_label_osc0_pb_max (0), + m_label_osc0_pb_min (0), + m_slider_master_tune (0), + m_label_master_tune (0), + m_button_humanize_enable (0), + m_comboBox_vcf_order (0), + m_slider_portamento_time (0), + m_label_portamento_time (0), + m_button_unisono_enable (0), + m_slider_humanize_var_vco (0), + m_slider_voice_pan_spread (0), + m_label_voice_pan_spread (0), + m_slider_humanize_var_vcf (0), + m_slider_humanize_var_env (0), + m_label_unisono_num_voices (0), + m_button_osc0_restart_enable (0), + m_button_osc1_restart_enable (0), + m_button_mono_enable (0), + m_comboBox_osc1_fm_src1 (0), + m_comboBox_osc1_pwm_src1 (0), + m_comboBox_osc0_fm_src1 (0), + m_comboBox_osc0_pwm_src1 (0), + m_comboBox_osc1_am_src0 (0), + m_comboBox_osc1_am_src1 (0), + m_slider_osc1_am_amt0 (0), + m_label_osc1_am_amt0 (0), + m_comboBox_osc0_am_src0 (0), + m_comboBox_osc0_am_src1 (0), + m_slider_osc0_am_amt0 (0), + m_label_osc0_am_amt0 (0), + m_slider_env2_attack (0), + m_slider_env2_decay (0), + m_slider_env2_release (0), + m_slider_env2_sustain (0), + m_label_env2_attack (0), + m_label_env2_decay (0), + m_label_env2_sustain (0), + m_label_env2_release (0), + m_slider_env3_attack (0), + m_slider_env3_decay (0), + m_slider_env3_release (0), + m_slider_env3_sustain (0), + m_label_env3_attack (0), + m_label_env3_decay (0), + m_label_env3_sustain (0), + m_label_env3_release (0), + m_comboBox_vcf_f_src1 (0), + m_slider_vcf_q_amt0 (0), + m_label_vcf_q_amt0 (0), + m_comboBox_vcf_q_src0 (0), + m_comboBox_vcf_q_src1 (0), + m_label_humanize_var_vco (0), + m_label_humanize_var_vcf (0), + m_label_humanize_var_env (0), + m_btn_limiter_led (0), + m_label_limiter_led (0), + m_slider_lfo0_delay (0), + m_label_lfo0_delay (0), + m_slider_lfo0_attack (0), + m_label_lfo0_attack (0), + m_slider_lfo1_delay (0), + m_label_lfo1_delay (0), + m_slider_lfo1_attack (0), + m_label_lfo1_attack (0), + m_slider_lfo2_delay (0), + m_label_lfo2_delay (0), + m_slider_lfo2_attack (0), + m_label_lfo2_attack (0), + m_slider_lfo3_delay (0), + m_label_lfo3_delay (0), + m_slider_lfo3_attack (0), + m_label_lfo3_attack (0), + m_button_lfo0_restart_enable (0), + m_button_lfo0_individual_enable (0), + m_slider_lfo0_symmetry (0), + m_label_lfo0_symmetry (0), + m_slider_lfo1_symmetry (0), + m_label_lfo1_symmetry (0), + m_button_lfo1_restart_enable (0), + m_button_lfo1_individual_enable (0), + m_button_lfo2_restart_enable (0), + m_button_lfo2_individual_enable (0), + m_slider_lfo2_symmetry (0), + m_label_lfo2_symmetry (0), + m_slider_lfo3_symmetry (0), + m_label_lfo3_symmetry (0), + m_button_lfo3_restart_enable (0), + m_button_lfo3_individual_enable (0), + m_slider_osc0_fm_amt1 (0), + m_label_osc0_fm_amt1 (0), + m_slider_osc0_pwm_amt1 (0), + m_label_osc0_pwm_amt1 (0), + m_slider_osc0_am_amt1 (0), + m_label_osc0_am_amt1 (0), + m_slider_osc1_fm_amt1 (0), + m_label_osc1_fm_amt1 (0), + m_slider_osc1_pwm_amt1 (0), + m_label_osc1_pwm_amt1 (0), + m_slider_osc1_am_amt1 (0), + m_label_osc1_am_amt1 (0), + m_slider_vcf_f_amt1 (0), + m_label_vcf_f_amt1 (0), + m_slider_vcf_q_amt1 (0), + m_label_vcf_q_amt1 (0), + m_button_mono_retrigger (0), + m_label_max_num_voices (0), + m_label_num_voices_playing (0) +{ + addAndMakeVisible (m_label_colon = new Label (L"Colon", + L":")); + m_label_colon->setFont (Font (L"Times New Roman", 20.0000f, Font::plain)); + m_label_colon->setJustificationType (Justification::centredLeft); + m_label_colon->setEditable (false, false, false); + m_label_colon->setColour (Label::textColourId, Colours::white); + m_label_colon->setColour (TextEditor::textColourId, Colours::black); + m_label_colon->setColour (TextEditor::backgroundColourId, Colour (0x0)); + + addAndMakeVisible (m_slider_master_volume = new Slider (L"Master volume")); + m_slider_master_volume->setTooltip (L"Master volume [%]"); + m_slider_master_volume->setRange (0, 1, 0); + m_slider_master_volume->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_master_volume->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_master_volume->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_master_volume->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_master_volume->addListener (this); + + addAndMakeVisible (m_slider_vcf_f = new Slider (L"VCF Cutoff")); + m_slider_vcf_f->setTooltip (L"VCF Cutoff [Hz]"); + m_slider_vcf_f->setRange (0, 1, 0); + m_slider_vcf_f->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_vcf_f->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_vcf_f->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_vcf_f->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_vcf_f->addListener (this); + + addAndMakeVisible (m_slider_vcf_q = new Slider (L"VCF Resonance")); + m_slider_vcf_q->setTooltip (L"VCF Resonance. Value = 1.0 means no resonance"); + m_slider_vcf_q->setRange (0, 1, 0); + m_slider_vcf_q->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_vcf_q->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_vcf_q->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_vcf_q->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_vcf_q->addListener (this); + + addAndMakeVisible (m_slider_osc0_det = new Slider (L"OSC 1 Detune")); + m_slider_osc0_det->setTooltip (L"OSC 1 Detune [cent]"); + m_slider_osc0_det->setRange (0, 1, 0); + m_slider_osc0_det->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_osc0_det->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_osc0_det->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_osc0_det->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_osc0_det->addListener (this); + + addAndMakeVisible (m_slider_osc1_det = new Slider (L"OSC 2 Detune")); + m_slider_osc1_det->setTooltip (L"OSC 2 Detune [cent]"); + m_slider_osc1_det->setRange (0, 1, 0); + m_slider_osc1_det->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_osc1_det->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_osc1_det->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_osc1_det->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_osc1_det->addListener (this); + + addAndMakeVisible (m_slider_osc0_transpose = new Slider (L"OSC 1 Transpose")); + m_slider_osc0_transpose->setTooltip (L"OSC 1 Transpose [semitones]"); + m_slider_osc0_transpose->setRange (0, 1, 0); + m_slider_osc0_transpose->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_osc0_transpose->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_osc0_transpose->setColour (Slider::trackColourId, Colour (0x7fffffff)); + m_slider_osc0_transpose->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_osc0_transpose->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_osc0_transpose->addListener (this); + + addAndMakeVisible (m_slider_osc1_transpose = new Slider (L"OSC 2 Transpose")); + m_slider_osc1_transpose->setTooltip (L"OSC 2 Transpose [semitones]"); + m_slider_osc1_transpose->setRange (0, 1, 0); + m_slider_osc1_transpose->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_osc1_transpose->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_osc1_transpose->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_osc1_transpose->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_osc1_transpose->addListener (this); + + addAndMakeVisible (m_slider_vca_env_attack = new Slider (L"VCA Attack")); + m_slider_vca_env_attack->setTooltip (L"VCA Attack Time [ms]"); + m_slider_vca_env_attack->setRange (0, 1, 0); + m_slider_vca_env_attack->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_vca_env_attack->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_vca_env_attack->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_vca_env_attack->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_vca_env_attack->addListener (this); + + addAndMakeVisible (m_slider_vca_env_decay = new Slider (L"VCA Decay")); + m_slider_vca_env_decay->setTooltip (L"VCA Decay Time [ms]"); + m_slider_vca_env_decay->setRange (0, 1, 0); + m_slider_vca_env_decay->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_vca_env_decay->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_vca_env_decay->setColour (Slider::trackColourId, Colour (0x7fffffff)); + m_slider_vca_env_decay->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_vca_env_decay->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_vca_env_decay->addListener (this); + + addAndMakeVisible (m_slider_vca_env_release = new Slider (L"VCA Release")); + m_slider_vca_env_release->setTooltip (L"VCA Release Time [ms]"); + m_slider_vca_env_release->setRange (0, 1, 0); + m_slider_vca_env_release->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_vca_env_release->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_vca_env_release->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_vca_env_release->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_vca_env_release->addListener (this); + + addAndMakeVisible (m_slider_vca_env_sustain = new Slider (L"VCA Sustain")); + m_slider_vca_env_sustain->setTooltip (L"VCA Sustain Level [%]"); + m_slider_vca_env_sustain->setRange (0, 1, 0); + m_slider_vca_env_sustain->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_vca_env_sustain->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_vca_env_sustain->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_vca_env_sustain->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_vca_env_sustain->addListener (this); + + addAndMakeVisible (m_slider_vcf_env_attack = new Slider (L"VCF Attack")); + m_slider_vcf_env_attack->setTooltip (L"VCF Attack Time [ms]"); + m_slider_vcf_env_attack->setRange (0, 1, 0); + m_slider_vcf_env_attack->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_vcf_env_attack->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_vcf_env_attack->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_vcf_env_attack->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_vcf_env_attack->addListener (this); + + addAndMakeVisible (m_slider_vcf_env_decay = new Slider (L"VCF Decay")); + m_slider_vcf_env_decay->setTooltip (L"VCF Decay Time [ms]"); + m_slider_vcf_env_decay->setRange (0, 1, 0); + m_slider_vcf_env_decay->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_vcf_env_decay->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_vcf_env_decay->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_vcf_env_decay->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_vcf_env_decay->addListener (this); + + addAndMakeVisible (m_slider_vcf_env_release = new Slider (L"VCF Release")); + m_slider_vcf_env_release->setTooltip (L"VCF Release Time [ms]"); + m_slider_vcf_env_release->setRange (0, 1, 0); + m_slider_vcf_env_release->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_vcf_env_release->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_vcf_env_release->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_vcf_env_release->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_vcf_env_release->addListener (this); + + addAndMakeVisible (m_slider_vcf_env_sustain = new Slider (L"VCF Sustain")); + m_slider_vcf_env_sustain->setTooltip (L"VCF Sustain Level [%]"); + m_slider_vcf_env_sustain->setRange (0, 1, 0); + m_slider_vcf_env_sustain->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_vcf_env_sustain->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_vcf_env_sustain->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_vcf_env_sustain->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_vcf_env_sustain->addListener (this); + + addAndMakeVisible (m_slider_vcf_env_amount = new Slider (L"VCF ENV Amount")); + m_slider_vcf_env_amount->setTooltip (L"VCF Envelope Amount [%]"); + m_slider_vcf_env_amount->setRange (0, 1, 0); + m_slider_vcf_env_amount->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_vcf_env_amount->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_vcf_env_amount->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_vcf_env_amount->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_vcf_env_amount->addListener (this); + + addAndMakeVisible (m_label_vcf_env_attack = new Label (L"VCF Attack", + L"value")); + m_label_vcf_env_attack->setFont (Font (14.0000f, Font::plain)); + m_label_vcf_env_attack->setJustificationType (Justification::centred); + m_label_vcf_env_attack->setEditable (true, true, false); + m_label_vcf_env_attack->setColour (TextEditor::textColourId, Colours::black); + m_label_vcf_env_attack->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_vcf_env_attack->addListener (this); + + addAndMakeVisible (m_label_vcf_f = new Label (L"VCF Cutoff", + L"value")); + m_label_vcf_f->setFont (Font (14.0000f, Font::plain)); + m_label_vcf_f->setJustificationType (Justification::centred); + m_label_vcf_f->setEditable (true, true, false); + m_label_vcf_f->setColour (TextEditor::textColourId, Colours::black); + m_label_vcf_f->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_vcf_f->addListener (this); + + addAndMakeVisible (m_label_vca_env_attack = new Label (L"VCA Attack", + L"value")); + m_label_vca_env_attack->setFont (Font (14.0000f, Font::plain)); + m_label_vca_env_attack->setJustificationType (Justification::centred); + m_label_vca_env_attack->setEditable (true, true, false); + m_label_vca_env_attack->setColour (TextEditor::textColourId, Colours::black); + m_label_vca_env_attack->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_vca_env_attack->addListener (this); + + addAndMakeVisible (m_label_vca_env_decay = new Label (L"VCA Decay", + L"value")); + m_label_vca_env_decay->setFont (Font (14.0000f, Font::plain)); + m_label_vca_env_decay->setJustificationType (Justification::centred); + m_label_vca_env_decay->setEditable (true, true, false); + m_label_vca_env_decay->setColour (TextEditor::textColourId, Colours::black); + m_label_vca_env_decay->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_vca_env_decay->addListener (this); + + addAndMakeVisible (m_label_vca_env_sustain = new Label (L"VCA Sustain", + L"value")); + m_label_vca_env_sustain->setFont (Font (14.0000f, Font::plain)); + m_label_vca_env_sustain->setJustificationType (Justification::centred); + m_label_vca_env_sustain->setEditable (true, true, false); + m_label_vca_env_sustain->setColour (TextEditor::textColourId, Colours::black); + m_label_vca_env_sustain->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_vca_env_sustain->addListener (this); + + addAndMakeVisible (m_label_vca_env_release = new Label (L"VCA Release", + L"value")); + m_label_vca_env_release->setFont (Font (14.0000f, Font::plain)); + m_label_vca_env_release->setJustificationType (Justification::centred); + m_label_vca_env_release->setEditable (true, true, false); + m_label_vca_env_release->setColour (TextEditor::textColourId, Colours::black); + m_label_vca_env_release->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_vca_env_release->addListener (this); + + addAndMakeVisible (m_label_vcf_env_decay = new Label (L"VCF Decay", + L"value")); + m_label_vcf_env_decay->setFont (Font (14.0000f, Font::plain)); + m_label_vcf_env_decay->setJustificationType (Justification::centred); + m_label_vcf_env_decay->setEditable (true, true, false); + m_label_vcf_env_decay->setColour (TextEditor::textColourId, Colours::black); + m_label_vcf_env_decay->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_vcf_env_decay->addListener (this); + + addAndMakeVisible (m_label_vcf_env_sustain = new Label (L"VCF Sustain", + L"value")); + m_label_vcf_env_sustain->setFont (Font (14.0000f, Font::plain)); + m_label_vcf_env_sustain->setJustificationType (Justification::centred); + m_label_vcf_env_sustain->setEditable (true, true, false); + m_label_vcf_env_sustain->setColour (TextEditor::textColourId, Colours::black); + m_label_vcf_env_sustain->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_vcf_env_sustain->addListener (this); + + addAndMakeVisible (m_label_vcf_env_release = new Label (L"VCF Release", + L"value")); + m_label_vcf_env_release->setFont (Font (14.0000f, Font::plain)); + m_label_vcf_env_release->setJustificationType (Justification::centred); + m_label_vcf_env_release->setEditable (true, true, false); + m_label_vcf_env_release->setColour (TextEditor::textColourId, Colours::black); + m_label_vcf_env_release->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_vcf_env_release->addListener (this); + + addAndMakeVisible (m_label_vcf_q = new Label (L"VCF Resonance", + L"value")); + m_label_vcf_q->setFont (Font (14.0000f, Font::plain)); + m_label_vcf_q->setJustificationType (Justification::centred); + m_label_vcf_q->setEditable (true, true, false); + m_label_vcf_q->setColour (TextEditor::textColourId, Colours::black); + m_label_vcf_q->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_vcf_q->addListener (this); + + addAndMakeVisible (m_label_vcf_env_amount = new Label (L"VCF ENV Amount", + L"value")); + m_label_vcf_env_amount->setFont (Font (14.0000f, Font::plain)); + m_label_vcf_env_amount->setJustificationType (Justification::centred); + m_label_vcf_env_amount->setEditable (true, true, false); + m_label_vcf_env_amount->setColour (TextEditor::textColourId, Colours::black); + m_label_vcf_env_amount->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_vcf_env_amount->addListener (this); + + addAndMakeVisible (m_label_master_volume = new Label (L"Master volume", + L"value")); + m_label_master_volume->setFont (Font (14.0000f, Font::plain)); + m_label_master_volume->setJustificationType (Justification::centred); + m_label_master_volume->setEditable (true, true, false); + m_label_master_volume->setColour (TextEditor::textColourId, Colours::black); + m_label_master_volume->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_master_volume->addListener (this); + + addAndMakeVisible (m_label_osc0_transpose = new Label (L"OSC 1 Transpose", + L"value")); + m_label_osc0_transpose->setFont (Font (14.0000f, Font::plain)); + m_label_osc0_transpose->setJustificationType (Justification::centred); + m_label_osc0_transpose->setEditable (true, true, false); + m_label_osc0_transpose->setColour (TextEditor::textColourId, Colours::black); + m_label_osc0_transpose->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_osc0_transpose->addListener (this); + + addAndMakeVisible (m_label_osc1_transpose = new Label (L"OSC 2 Transpose", + L"value")); + m_label_osc1_transpose->setFont (Font (14.0000f, Font::plain)); + m_label_osc1_transpose->setJustificationType (Justification::centred); + m_label_osc1_transpose->setEditable (true, true, false); + m_label_osc1_transpose->setColour (TextEditor::textColourId, Colours::black); + m_label_osc1_transpose->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_osc1_transpose->addListener (this); + + addAndMakeVisible (m_label_osc0_det = new Label (L"OSC 1 Detune", + L"value")); + m_label_osc0_det->setFont (Font (14.0000f, Font::plain)); + m_label_osc0_det->setJustificationType (Justification::centred); + m_label_osc0_det->setEditable (true, true, false); + m_label_osc0_det->setColour (TextEditor::textColourId, Colours::black); + m_label_osc0_det->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_osc0_det->addListener (this); + + addAndMakeVisible (m_label_osc1_det = new Label (L"OSC 2 Detune", + L"value")); + m_label_osc1_det->setFont (Font (14.0000f, Font::plain)); + m_label_osc1_det->setJustificationType (Justification::centred); + m_label_osc1_det->setEditable (true, true, false); + m_label_osc1_det->setColour (TextEditor::textColourId, Colours::black); + m_label_osc1_det->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_osc1_det->addListener (this); + + addAndMakeVisible (m_slider_vca_env_amount = new Slider (L"VCA ENV Amount")); + m_slider_vca_env_amount->setTooltip (L"VCA Envelope Amount [%]"); + m_slider_vca_env_amount->setRange (0, 1, 0); + m_slider_vca_env_amount->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_vca_env_amount->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_vca_env_amount->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_vca_env_amount->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_vca_env_amount->addListener (this); + + addAndMakeVisible (m_label_vca_env_amount = new Label (L"VCA ENV Amount", + L"value")); + m_label_vca_env_amount->setFont (Font (14.0000f, Font::plain)); + m_label_vca_env_amount->setJustificationType (Justification::centred); + m_label_vca_env_amount->setEditable (true, true, false); + m_label_vca_env_amount->setColour (TextEditor::textColourId, Colours::black); + m_label_vca_env_amount->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_vca_env_amount->addListener (this); + + addAndMakeVisible (m_slider_osc0_dutycycle = new Slider (L"OSC 1 pulse width")); + m_slider_osc0_dutycycle->setTooltip (L"OSC 1 pulse width [%]"); + m_slider_osc0_dutycycle->setRange (0, 1, 0); + m_slider_osc0_dutycycle->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_osc0_dutycycle->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_osc0_dutycycle->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_osc0_dutycycle->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_osc0_dutycycle->addListener (this); + + addAndMakeVisible (m_slider_osc1_dutycycle = new Slider (L"OSC 2 pulse width")); + m_slider_osc1_dutycycle->setTooltip (L"OSC 2 pulse width [%]"); + m_slider_osc1_dutycycle->setRange (0, 1, 0); + m_slider_osc1_dutycycle->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_osc1_dutycycle->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_osc1_dutycycle->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_osc1_dutycycle->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_osc1_dutycycle->addListener (this); + + addAndMakeVisible (m_label_osc0_dutycycle = new Label (L"OSC 1 pulse width", + L"value")); + m_label_osc0_dutycycle->setFont (Font (14.0000f, Font::plain)); + m_label_osc0_dutycycle->setJustificationType (Justification::centred); + m_label_osc0_dutycycle->setEditable (true, true, false); + m_label_osc0_dutycycle->setColour (TextEditor::textColourId, Colours::black); + m_label_osc0_dutycycle->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_osc0_dutycycle->addListener (this); + + addAndMakeVisible (m_label_osc1_dutycycle = new Label (L"OSC 2 pulse width", + L"value")); + m_label_osc1_dutycycle->setFont (Font (14.0000f, Font::plain)); + m_label_osc1_dutycycle->setJustificationType (Justification::centred); + m_label_osc1_dutycycle->setEditable (true, true, false); + m_label_osc1_dutycycle->setColour (TextEditor::textColourId, Colours::black); + m_label_osc1_dutycycle->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_osc1_dutycycle->addListener (this); + + addAndMakeVisible (m_slider_lfo0_speed = new Slider (L"LFO 1 speed")); + m_slider_lfo0_speed->setTooltip (L"LFO 1 speed [Hz]"); + m_slider_lfo0_speed->setRange (0, 1, 0); + m_slider_lfo0_speed->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_lfo0_speed->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_lfo0_speed->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_lfo0_speed->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_lfo0_speed->addListener (this); + + addAndMakeVisible (m_slider_osc1_fm_amt0 = new Slider (L"OSC 2 FM amount 1")); + m_slider_osc1_fm_amt0->setTooltip (L"OSC 2 FM amount [semitones]"); + m_slider_osc1_fm_amt0->setRange (0, 1, 0); + m_slider_osc1_fm_amt0->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_osc1_fm_amt0->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_osc1_fm_amt0->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_osc1_fm_amt0->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_osc1_fm_amt0->addListener (this); + + addAndMakeVisible (m_slider_osc0_fm_amt0 = new Slider (L"OSC 1 FM amount 1")); + m_slider_osc0_fm_amt0->setTooltip (L"OSC 1 FM amount [semitones]"); + m_slider_osc0_fm_amt0->setRange (0, 1, 0); + m_slider_osc0_fm_amt0->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_osc0_fm_amt0->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_osc0_fm_amt0->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_osc0_fm_amt0->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_osc0_fm_amt0->addListener (this); + + addAndMakeVisible (m_label_lfo0_speed = new Label (L"LFO 1 speed", + L"value")); + m_label_lfo0_speed->setFont (Font (14.0000f, Font::plain)); + m_label_lfo0_speed->setJustificationType (Justification::centred); + m_label_lfo0_speed->setEditable (true, true, false); + m_label_lfo0_speed->setColour (Label::outlineColourId, Colour (0x0)); + m_label_lfo0_speed->setColour (TextEditor::textColourId, Colours::azure); + m_label_lfo0_speed->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_lfo0_speed->setColour (TextEditor::highlightColourId, Colour (0xf7f7f7)); + m_label_lfo0_speed->addListener (this); + + addAndMakeVisible (m_label_osc0_fm_amt0 = new Label (L"OSC 1 FM amt 1", + L"value")); + m_label_osc0_fm_amt0->setFont (Font (14.0000f, Font::plain)); + m_label_osc0_fm_amt0->setJustificationType (Justification::centred); + m_label_osc0_fm_amt0->setEditable (true, true, false); + m_label_osc0_fm_amt0->setColour (TextEditor::textColourId, Colours::black); + m_label_osc0_fm_amt0->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_osc0_fm_amt0->addListener (this); + + addAndMakeVisible (m_label_osc1_fm_amt0 = new Label (L"OSC 2 FM amt 1", + L"value")); + m_label_osc1_fm_amt0->setFont (Font (14.0000f, Font::plain)); + m_label_osc1_fm_amt0->setJustificationType (Justification::centred); + m_label_osc1_fm_amt0->setEditable (true, true, false); + m_label_osc1_fm_amt0->setColour (TextEditor::textColourId, Colours::black); + m_label_osc1_fm_amt0->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_osc1_fm_amt0->addListener (this); + + addAndMakeVisible (m_slider_vcf_f_amt0 = new Slider (L"VCF Cutoff amount 1")); + m_slider_vcf_f_amt0->setTooltip (L"VCF Cutoff Amount [%]"); + m_slider_vcf_f_amt0->setRange (0, 1, 0); + m_slider_vcf_f_amt0->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_vcf_f_amt0->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_vcf_f_amt0->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_vcf_f_amt0->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_vcf_f_amt0->addListener (this); + + addAndMakeVisible (m_label_vcf_f_amt0 = new Label (L"VCF Cutoff amount 1", + L"value")); + m_label_vcf_f_amt0->setFont (Font (14.0000f, Font::plain)); + m_label_vcf_f_amt0->setJustificationType (Justification::centred); + m_label_vcf_f_amt0->setEditable (true, true, false); + m_label_vcf_f_amt0->setColour (TextEditor::textColourId, Colours::black); + m_label_vcf_f_amt0->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_vcf_f_amt0->addListener (this); + + addAndMakeVisible (m_slider_lfo1_speed = new Slider (L"LFO 2 speed")); + m_slider_lfo1_speed->setTooltip (L"LFO 2 speed [Hz]"); + m_slider_lfo1_speed->setRange (0, 1, 0); + m_slider_lfo1_speed->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_lfo1_speed->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_lfo1_speed->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_lfo1_speed->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_lfo1_speed->addListener (this); + + addAndMakeVisible (m_label_lfo1_speed = new Label (L"LFO 2 speed", + L"value")); + m_label_lfo1_speed->setFont (Font (14.0000f, Font::plain)); + m_label_lfo1_speed->setJustificationType (Justification::centred); + m_label_lfo1_speed->setEditable (true, true, false); + m_label_lfo1_speed->setColour (TextEditor::textColourId, Colours::black); + m_label_lfo1_speed->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_lfo1_speed->addListener (this); + + addAndMakeVisible (m_comboBox_osc0_shape = new ComboBox (L"OSC 1 shape")); + m_comboBox_osc0_shape->setTooltip (L"OSC 1 shape"); + m_comboBox_osc0_shape->setEditableText (false); + m_comboBox_osc0_shape->setJustificationType (Justification::centred); + m_comboBox_osc0_shape->setTextWhenNothingSelected (String::empty); + m_comboBox_osc0_shape->setTextWhenNoChoicesAvailable (L"(no choices)"); + m_comboBox_osc0_shape->addItem (L"Saw", 1); + m_comboBox_osc0_shape->addItem (L"Pulse", 2); + m_comboBox_osc0_shape->addItem (L"Tri", 3); + m_comboBox_osc0_shape->addItem (L"Sine", 4); + m_comboBox_osc0_shape->addItem (L"Impulse", 5); + m_comboBox_osc0_shape->addListener (this); + + addAndMakeVisible (m_comboBox_osc1_shape = new ComboBox (L"OSC 2 shape")); + m_comboBox_osc1_shape->setTooltip (L"OSC 2 shape"); + m_comboBox_osc1_shape->setEditableText (false); + m_comboBox_osc1_shape->setJustificationType (Justification::centred); + m_comboBox_osc1_shape->setTextWhenNothingSelected (String::empty); + m_comboBox_osc1_shape->setTextWhenNoChoicesAvailable (L"(no choices)"); + m_comboBox_osc1_shape->addItem (L"Saw", 1); + m_comboBox_osc1_shape->addItem (L"Pulse", 2); + m_comboBox_osc1_shape->addItem (L"Tri", 3); + m_comboBox_osc1_shape->addItem (L"Sine", 4); + m_comboBox_osc1_shape->addItem (L"Impulse", 5); + m_comboBox_osc1_shape->addListener (this); + + addAndMakeVisible (m_comboBox_lfo0_shape = new ComboBox (L"LFO 1 shape")); + m_comboBox_lfo0_shape->setTooltip (L"LFO 1 shape"); + m_comboBox_lfo0_shape->setEditableText (false); + m_comboBox_lfo0_shape->setJustificationType (Justification::centred); + m_comboBox_lfo0_shape->setTextWhenNothingSelected (String::empty); + m_comboBox_lfo0_shape->setTextWhenNoChoicesAvailable (L"(no choices)"); + m_comboBox_lfo0_shape->addItem (L"Sine", 1); + m_comboBox_lfo0_shape->addItem (L"Cosine", 2); + m_comboBox_lfo0_shape->addItem (L"Saw", 3); + m_comboBox_lfo0_shape->addItem (L"Square", 4); + m_comboBox_lfo0_shape->addItem (L"Tri", 5); + m_comboBox_lfo0_shape->addItem (L"S&H 1", 6); + m_comboBox_lfo0_shape->addItem (L"S&H 2", 7); + m_comboBox_lfo0_shape->addItem (L"1-Sine", 8); + m_comboBox_lfo0_shape->addItem (L"1-Cosine", 9); + m_comboBox_lfo0_shape->addItem (L"1-Saw", 10); + m_comboBox_lfo0_shape->addItem (L"1-Square", 11); + m_comboBox_lfo0_shape->addItem (L"1-Tri", 12); + m_comboBox_lfo0_shape->addListener (this); + + addAndMakeVisible (m_comboBox_lfo1_shape = new ComboBox (L"LFO 2 shape")); + m_comboBox_lfo1_shape->setTooltip (L"LFO 2 shape"); + m_comboBox_lfo1_shape->setEditableText (false); + m_comboBox_lfo1_shape->setJustificationType (Justification::centred); + m_comboBox_lfo1_shape->setTextWhenNothingSelected (String::empty); + m_comboBox_lfo1_shape->setTextWhenNoChoicesAvailable (L"(no choices)"); + m_comboBox_lfo1_shape->addItem (L"Sine", 1); + m_comboBox_lfo1_shape->addItem (L"Cosine", 2); + m_comboBox_lfo1_shape->addItem (L"Saw", 3); + m_comboBox_lfo1_shape->addItem (L"Square", 4); + m_comboBox_lfo1_shape->addItem (L"Tri", 5); + m_comboBox_lfo1_shape->addItem (L"S&H 1", 6); + m_comboBox_lfo1_shape->addItem (L"S&H 2", 7); + m_comboBox_lfo1_shape->addItem (L"1-Sine", 8); + m_comboBox_lfo1_shape->addItem (L"1-Cosine", 9); + m_comboBox_lfo1_shape->addItem (L"1-Saw", 10); + m_comboBox_lfo1_shape->addItem (L"1-Square", 11); + m_comboBox_lfo1_shape->addItem (L"1-Tri", 12); + m_comboBox_lfo1_shape->addListener (this); + + addAndMakeVisible (m_slider_lfo2_speed = new Slider (L"LFO 3 speed")); + m_slider_lfo2_speed->setTooltip (L"LFO 3 speed [Hz]"); + m_slider_lfo2_speed->setRange (0, 1, 0); + m_slider_lfo2_speed->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_lfo2_speed->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_lfo2_speed->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_lfo2_speed->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_lfo2_speed->addListener (this); + + addAndMakeVisible (m_slider_lfo3_speed = new Slider (L"LFO 4 speed")); + m_slider_lfo3_speed->setTooltip (L"LFO 4 speed [Hz]"); + m_slider_lfo3_speed->setRange (0, 1, 0); + m_slider_lfo3_speed->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_lfo3_speed->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_lfo3_speed->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_lfo3_speed->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_lfo3_speed->addListener (this); + + addAndMakeVisible (m_comboBox_lfo2_shape = new ComboBox (L"LFO 3 shape")); + m_comboBox_lfo2_shape->setTooltip (L"LFO 3 shape"); + m_comboBox_lfo2_shape->setEditableText (false); + m_comboBox_lfo2_shape->setJustificationType (Justification::centred); + m_comboBox_lfo2_shape->setTextWhenNothingSelected (String::empty); + m_comboBox_lfo2_shape->setTextWhenNoChoicesAvailable (L"(no choices)"); + m_comboBox_lfo2_shape->addItem (L"Sine", 1); + m_comboBox_lfo2_shape->addItem (L"Cosine", 2); + m_comboBox_lfo2_shape->addItem (L"Saw", 3); + m_comboBox_lfo2_shape->addItem (L"Square", 4); + m_comboBox_lfo2_shape->addItem (L"Tri", 5); + m_comboBox_lfo2_shape->addItem (L"S&H 1", 6); + m_comboBox_lfo2_shape->addItem (L"S&H 2", 7); + m_comboBox_lfo2_shape->addItem (L"1-Sine", 8); + m_comboBox_lfo2_shape->addItem (L"1-Cosine", 9); + m_comboBox_lfo2_shape->addItem (L"1-Saw", 10); + m_comboBox_lfo2_shape->addItem (L"1-Square", 11); + m_comboBox_lfo2_shape->addItem (L"1-Tri", 12); + m_comboBox_lfo2_shape->addListener (this); + + addAndMakeVisible (m_comboBox_lfo3_shape = new ComboBox (L"LFO 4 shape")); + m_comboBox_lfo3_shape->setTooltip (L"LFO 4 shape"); + m_comboBox_lfo3_shape->setEditableText (false); + m_comboBox_lfo3_shape->setJustificationType (Justification::centred); + m_comboBox_lfo3_shape->setTextWhenNothingSelected (String::empty); + m_comboBox_lfo3_shape->setTextWhenNoChoicesAvailable (L"(no choices)"); + m_comboBox_lfo3_shape->addItem (L"Sine", 1); + m_comboBox_lfo3_shape->addItem (L"Cosine", 2); + m_comboBox_lfo3_shape->addItem (L"Saw", 3); + m_comboBox_lfo3_shape->addItem (L"Square", 4); + m_comboBox_lfo3_shape->addItem (L"Tri", 5); + m_comboBox_lfo3_shape->addItem (L"S&H 1", 6); + m_comboBox_lfo3_shape->addItem (L"S&H 2", 7); + m_comboBox_lfo3_shape->addItem (L"1-Sine", 8); + m_comboBox_lfo3_shape->addItem (L"1-Cosine", 9); + m_comboBox_lfo3_shape->addItem (L"1-Saw", 10); + m_comboBox_lfo3_shape->addItem (L"1-Square", 11); + m_comboBox_lfo3_shape->addItem (L"1-Tri", 12); + m_comboBox_lfo3_shape->addListener (this); + + addAndMakeVisible (m_label_lfo2_speed = new Label (L"LFO 3 speed", + L"value")); + m_label_lfo2_speed->setFont (Font (14.0000f, Font::plain)); + m_label_lfo2_speed->setJustificationType (Justification::centred); + m_label_lfo2_speed->setEditable (true, true, false); + m_label_lfo2_speed->setColour (TextEditor::textColourId, Colours::black); + m_label_lfo2_speed->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_lfo2_speed->addListener (this); + + addAndMakeVisible (m_label_lfo3_speed = new Label (L"LFO 3 speed", + L"value")); + m_label_lfo3_speed->setFont (Font (14.0000f, Font::plain)); + m_label_lfo3_speed->setJustificationType (Justification::centred); + m_label_lfo3_speed->setEditable (true, true, false); + m_label_lfo3_speed->setColour (TextEditor::textColourId, Colours::black); + m_label_lfo3_speed->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_lfo3_speed->addListener (this); + + addAndMakeVisible (m_comboBox_vcf_f_src0 = new ComboBox (L"VCF Cutoff Source 1")); + m_comboBox_vcf_f_src0->setTooltip (L"VCF Cutoff Modulation Source 1"); + m_comboBox_vcf_f_src0->setEditableText (false); + m_comboBox_vcf_f_src0->setJustificationType (Justification::centred); + m_comboBox_vcf_f_src0->setTextWhenNothingSelected (String::empty); + m_comboBox_vcf_f_src0->setTextWhenNoChoicesAvailable (L"(no choices)"); + m_comboBox_vcf_f_src0->addListener (this); + + addAndMakeVisible (m_comboBox_osc0_fm_src0 = new ComboBox (L"OSC 1 FM Source 1")); + m_comboBox_osc0_fm_src0->setTooltip (L"OSC 1 FM Modulation Source 1"); + m_comboBox_osc0_fm_src0->setEditableText (false); + m_comboBox_osc0_fm_src0->setJustificationType (Justification::centred); + m_comboBox_osc0_fm_src0->setTextWhenNothingSelected (String::empty); + m_comboBox_osc0_fm_src0->setTextWhenNoChoicesAvailable (L"(no choices)"); + m_comboBox_osc0_fm_src0->addListener (this); + + addAndMakeVisible (m_comboBox_osc1_fm_src0 = new ComboBox (L"OSC 2 FM Source 1")); + m_comboBox_osc1_fm_src0->setTooltip (L"OSC 2 FM Modulation Source 1"); + m_comboBox_osc1_fm_src0->setEditableText (false); + m_comboBox_osc1_fm_src0->setJustificationType (Justification::centred); + m_comboBox_osc1_fm_src0->setTextWhenNothingSelected (String::empty); + m_comboBox_osc1_fm_src0->setTextWhenNoChoicesAvailable (L"(no choices)"); + m_comboBox_osc1_fm_src0->addListener (this); + + addAndMakeVisible (m_slider_vca_am_amt0 = new Slider (L"Tremolo amt")); + m_slider_vca_am_amt0->setTooltip (L"Tremolo Amount [%]"); + m_slider_vca_am_amt0->setRange (0, 1, 0); + m_slider_vca_am_amt0->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_vca_am_amt0->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_vca_am_amt0->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_vca_am_amt0->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_vca_am_amt0->addListener (this); + + addAndMakeVisible (m_label_vca_am_amt0 = new Label (L"Tremolo amt", + L"value")); + m_label_vca_am_amt0->setFont (Font (14.0000f, Font::plain)); + m_label_vca_am_amt0->setJustificationType (Justification::centred); + m_label_vca_am_amt0->setEditable (true, true, false); + m_label_vca_am_amt0->setColour (TextEditor::textColourId, Colours::black); + m_label_vca_am_amt0->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_vca_am_amt0->addListener (this); + + addAndMakeVisible (m_comboBox_vca_am_src0 = new ComboBox (L"Tremolo Source 1")); + m_comboBox_vca_am_src0->setTooltip (L"Tremolo Modulation Source 1"); + m_comboBox_vca_am_src0->setEditableText (false); + m_comboBox_vca_am_src0->setJustificationType (Justification::centred); + m_comboBox_vca_am_src0->setTextWhenNothingSelected (String::empty); + m_comboBox_vca_am_src0->setTextWhenNoChoicesAvailable (L"(no choices)"); + m_comboBox_vca_am_src0->addListener (this); + + addAndMakeVisible (m_slider_vca_pan_amt0 = new Slider (L"Stereo pan amt")); + m_slider_vca_pan_amt0->setTooltip (L"Stereo Pan Amount [%]"); + m_slider_vca_pan_amt0->setRange (0, 1, 0); + m_slider_vca_pan_amt0->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_vca_pan_amt0->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_vca_pan_amt0->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_vca_pan_amt0->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_vca_pan_amt0->addListener (this); + + addAndMakeVisible (m_label_vca_pan_amt0 = new Label (L"Stereo pan amt", + L"value")); + m_label_vca_pan_amt0->setFont (Font (14.0000f, Font::plain)); + m_label_vca_pan_amt0->setJustificationType (Justification::centred); + m_label_vca_pan_amt0->setEditable (true, true, false); + m_label_vca_pan_amt0->setColour (TextEditor::textColourId, Colours::black); + m_label_vca_pan_amt0->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_vca_pan_amt0->addListener (this); + + addAndMakeVisible (m_comboBox_vca_pan_src0 = new ComboBox (L"Stereo pan Source")); + m_comboBox_vca_pan_src0->setTooltip (L"Stereo Pan Modulation Source 1"); + m_comboBox_vca_pan_src0->setEditableText (false); + m_comboBox_vca_pan_src0->setJustificationType (Justification::centred); + m_comboBox_vca_pan_src0->setTextWhenNothingSelected (String::empty); + m_comboBox_vca_pan_src0->setTextWhenNoChoicesAvailable (L"(no choices)"); + m_comboBox_vca_pan_src0->addListener (this); + + addAndMakeVisible (m_label_synth_name = new Label (L"Synth Name", + L"Jay Synth")); + m_label_synth_name->setFont (Font (L"Arial", 20.0000f, Font::plain)); + m_label_synth_name->setJustificationType (Justification::centredLeft); + m_label_synth_name->setEditable (false, false, false); + m_label_synth_name->setColour (Label::textColourId, Colours::white); + m_label_synth_name->setColour (TextEditor::textColourId, Colours::black); + m_label_synth_name->setColour (TextEditor::backgroundColourId, Colour (0x0)); + + addAndMakeVisible (m_label_synth_version = new Label (L"Synth Version", + L"V 1.0.0")); + m_label_synth_version->setFont (Font (L"Arial", 14.0000f, Font::plain)); + m_label_synth_version->setJustificationType (Justification::centredRight); + m_label_synth_version->setEditable (false, false, false); + m_label_synth_version->setColour (Label::textColourId, Colours::white); + m_label_synth_version->setColour (TextEditor::textColourId, Colours::black); + m_label_synth_version->setColour (TextEditor::backgroundColourId, Colour (0x0)); + + addAndMakeVisible (m_comboBox_vcf_type = new ComboBox (L"VCF Type")); + m_comboBox_vcf_type->setTooltip (L"VCF Type"); + m_comboBox_vcf_type->setEditableText (false); + m_comboBox_vcf_type->setJustificationType (Justification::centred); + m_comboBox_vcf_type->setTextWhenNothingSelected (String::empty); + m_comboBox_vcf_type->setTextWhenNoChoicesAvailable (L"(no choices)"); + m_comboBox_vcf_type->addItem (L"LPF", 1); + m_comboBox_vcf_type->addItem (L"HPF", 2); + m_comboBox_vcf_type->addItem (L"BPF", 3); + m_comboBox_vcf_type->addListener (this); + + addAndMakeVisible (m_slider_lfo1_smooth = new Slider (L"LFO 2 smooth")); + m_slider_lfo1_smooth->setTooltip (L"LFO 2 smooth [%]"); + m_slider_lfo1_smooth->setRange (0, 1, 0); + m_slider_lfo1_smooth->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_lfo1_smooth->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_lfo1_smooth->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_lfo1_smooth->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_lfo1_smooth->addListener (this); + + addAndMakeVisible (m_label_lfo1_smooth = new Label (L"LFO 2 smooth", + L"value")); + m_label_lfo1_smooth->setFont (Font (14.0000f, Font::plain)); + m_label_lfo1_smooth->setJustificationType (Justification::centred); + m_label_lfo1_smooth->setEditable (true, true, false); + m_label_lfo1_smooth->setColour (TextEditor::textColourId, Colours::black); + m_label_lfo1_smooth->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_lfo1_smooth->addListener (this); + + addAndMakeVisible (m_slider_lfo0_smooth = new Slider (L"LFO 1 smooth")); + m_slider_lfo0_smooth->setTooltip (L"LFO 1 smooth [%]"); + m_slider_lfo0_smooth->setRange (0, 1, 0); + m_slider_lfo0_smooth->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_lfo0_smooth->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_lfo0_smooth->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_lfo0_smooth->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_lfo0_smooth->addListener (this); + + addAndMakeVisible (m_label_lfo0_smooth = new Label (L"LFO 1 smooth", + L"value")); + m_label_lfo0_smooth->setFont (Font (14.0000f, Font::plain)); + m_label_lfo0_smooth->setJustificationType (Justification::centred); + m_label_lfo0_smooth->setEditable (true, true, false); + m_label_lfo0_smooth->setColour (TextEditor::textColourId, Colours::black); + m_label_lfo0_smooth->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_lfo0_smooth->addListener (this); + + addAndMakeVisible (m_slider_lfo2_smooth = new Slider (L"LFO 3 smooth")); + m_slider_lfo2_smooth->setTooltip (L"LFO 3 smooth [%]"); + m_slider_lfo2_smooth->setRange (0, 1, 0); + m_slider_lfo2_smooth->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_lfo2_smooth->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_lfo2_smooth->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_lfo2_smooth->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_lfo2_smooth->addListener (this); + + addAndMakeVisible (m_label_lfo2_smooth = new Label (L"LFO 3 smooth", + L"value")); + m_label_lfo2_smooth->setFont (Font (14.0000f, Font::plain)); + m_label_lfo2_smooth->setJustificationType (Justification::centred); + m_label_lfo2_smooth->setEditable (true, true, false); + m_label_lfo2_smooth->setColour (TextEditor::textColourId, Colours::black); + m_label_lfo2_smooth->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_lfo2_smooth->addListener (this); + + addAndMakeVisible (m_slider_lfo3_smooth = new Slider (L"LFO 4 smooth")); + m_slider_lfo3_smooth->setTooltip (L"LFO 4 smooth [%]"); + m_slider_lfo3_smooth->setRange (0, 1, 0); + m_slider_lfo3_smooth->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_lfo3_smooth->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_lfo3_smooth->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_lfo3_smooth->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_lfo3_smooth->addListener (this); + + addAndMakeVisible (m_label_lfo3_smooth = new Label (L"LFO 4 smooth", + L"value")); + m_label_lfo3_smooth->setFont (Font (14.0000f, Font::plain)); + m_label_lfo3_smooth->setJustificationType (Justification::centred); + m_label_lfo3_smooth->setEditable (true, true, false); + m_label_lfo3_smooth->setColour (TextEditor::textColourId, Colours::black); + m_label_lfo3_smooth->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_lfo3_smooth->addListener (this); + + addAndMakeVisible (m_slider_osc0_pwm_amt0 = new Slider (L"OSC 1 PWM amount 1")); + m_slider_osc0_pwm_amt0->setTooltip (L"OSC 1 PWM Amount [%]"); + m_slider_osc0_pwm_amt0->setRange (0, 1, 0); + m_slider_osc0_pwm_amt0->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_osc0_pwm_amt0->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_osc0_pwm_amt0->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_osc0_pwm_amt0->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_osc0_pwm_amt0->addListener (this); + + addAndMakeVisible (m_label_osc0_pwm_amt0 = new Label (L"OSC 1 PWM 1", + L"value")); + m_label_osc0_pwm_amt0->setFont (Font (14.0000f, Font::plain)); + m_label_osc0_pwm_amt0->setJustificationType (Justification::centred); + m_label_osc0_pwm_amt0->setEditable (true, true, false); + m_label_osc0_pwm_amt0->setColour (TextEditor::textColourId, Colours::black); + m_label_osc0_pwm_amt0->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_osc0_pwm_amt0->addListener (this); + + addAndMakeVisible (m_slider_osc1_pwm_amt0 = new Slider (L"OSC 2 PWM amount 1")); + m_slider_osc1_pwm_amt0->setTooltip (L"OSC 2 PWM Amount [%]"); + m_slider_osc1_pwm_amt0->setRange (0, 1, 0); + m_slider_osc1_pwm_amt0->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_osc1_pwm_amt0->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_osc1_pwm_amt0->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_osc1_pwm_amt0->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_osc1_pwm_amt0->addListener (this); + + addAndMakeVisible (m_label_osc1_pwm_amt0 = new Label (L"OSC 2 PWM amount 1", + L"value")); + m_label_osc1_pwm_amt0->setFont (Font (14.0000f, Font::plain)); + m_label_osc1_pwm_amt0->setJustificationType (Justification::centred); + m_label_osc1_pwm_amt0->setEditable (true, true, false); + m_label_osc1_pwm_amt0->setColour (TextEditor::textColourId, Colours::black); + m_label_osc1_pwm_amt0->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_osc1_pwm_amt0->addListener (this); + + addAndMakeVisible (m_comboBox_osc0_pwm_src0 = new ComboBox (L"OSC 1 PWM Source 1")); + m_comboBox_osc0_pwm_src0->setTooltip (L"OSC 1 PWM Modulation Source 1"); + m_comboBox_osc0_pwm_src0->setEditableText (false); + m_comboBox_osc0_pwm_src0->setJustificationType (Justification::centred); + m_comboBox_osc0_pwm_src0->setTextWhenNothingSelected (String::empty); + m_comboBox_osc0_pwm_src0->setTextWhenNoChoicesAvailable (L"(no choices)"); + m_comboBox_osc0_pwm_src0->addListener (this); + + addAndMakeVisible (m_comboBox_osc1_pwm_src0 = new ComboBox (L"OSC 2 PWM Source 1")); + m_comboBox_osc1_pwm_src0->setTooltip (L"OSC 2 PWM Modulation Source 1"); + m_comboBox_osc1_pwm_src0->setEditableText (false); + m_comboBox_osc1_pwm_src0->setJustificationType (Justification::centred); + m_comboBox_osc1_pwm_src0->setTextWhenNothingSelected (String::empty); + m_comboBox_osc1_pwm_src0->setTextWhenNoChoicesAvailable (L"(no choices)"); + m_comboBox_osc1_pwm_src0->addListener (this); + + addAndMakeVisible (m_slider_osc0_level = new Slider (L"OSC 1 Level")); + m_slider_osc0_level->setTooltip (L"OSC 1 Level [%]"); + m_slider_osc0_level->setRange (0, 1, 0); + m_slider_osc0_level->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_osc0_level->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_osc0_level->setColour (Slider::trackColourId, Colour (0x7fffffff)); + m_slider_osc0_level->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_osc0_level->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_osc0_level->addListener (this); + + addAndMakeVisible (m_label_osc0_level = new Label (L"OSC 1 Level", + L"value")); + m_label_osc0_level->setFont (Font (14.0000f, Font::plain)); + m_label_osc0_level->setJustificationType (Justification::centred); + m_label_osc0_level->setEditable (true, true, false); + m_label_osc0_level->setColour (TextEditor::textColourId, Colours::black); + m_label_osc0_level->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_osc0_level->addListener (this); + + addAndMakeVisible (m_slider_osc1_level = new Slider (L"OSC 2 Level")); + m_slider_osc1_level->setTooltip (L"OSC 2 Level [%]"); + m_slider_osc1_level->setRange (0, 1, 0); + m_slider_osc1_level->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_osc1_level->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_osc1_level->setColour (Slider::trackColourId, Colour (0x7fffffff)); + m_slider_osc1_level->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_osc1_level->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_osc1_level->addListener (this); + + addAndMakeVisible (m_label_osc1_level = new Label (L"OSC 2 Level", + L"value")); + m_label_osc1_level->setFont (Font (14.0000f, Font::plain)); + m_label_osc1_level->setJustificationType (Justification::centred); + m_label_osc1_level->setEditable (true, true, false); + m_label_osc1_level->setColour (TextEditor::textColourId, Colours::black); + m_label_osc1_level->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_osc1_level->addListener (this); + + addAndMakeVisible (m_slider_noise_level = new Slider (L"Noise Level")); + m_slider_noise_level->setTooltip (L"Noise Level [%]"); + m_slider_noise_level->setRange (0, 1, 0); + m_slider_noise_level->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_noise_level->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_noise_level->setColour (Slider::trackColourId, Colour (0x7fffffff)); + m_slider_noise_level->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_noise_level->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_noise_level->addListener (this); + + addAndMakeVisible (m_label_noise_level = new Label (L"Noise Level", + L"value")); + m_label_noise_level->setFont (Font (14.0000f, Font::plain)); + m_label_noise_level->setJustificationType (Justification::centred); + m_label_noise_level->setEditable (true, true, false); + m_label_noise_level->setColour (TextEditor::textColourId, Colours::black); + m_label_noise_level->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_noise_level->addListener (this); + + addAndMakeVisible (m_comboBox_noise_shape = new ComboBox (L"Noise shape")); + m_comboBox_noise_shape->setTooltip (L"Noise shape"); + m_comboBox_noise_shape->setEditableText (false); + m_comboBox_noise_shape->setJustificationType (Justification::centred); + m_comboBox_noise_shape->setTextWhenNothingSelected (String::empty); + m_comboBox_noise_shape->setTextWhenNoChoicesAvailable (L"(no choices)"); + m_comboBox_noise_shape->addItem (L"Uniform", 1); + m_comboBox_noise_shape->addItem (L"Gauss", 2); + m_comboBox_noise_shape->addListener (this); + + addAndMakeVisible (m_btn_noise_enable_led = new ButtonLED (L"Noise On/Off")); + addAndMakeVisible (m_btn_osc0_enable = new ButtonLED (L"OSC 1 On/Off")); + addAndMakeVisible (m_btn_osc1_enable = new ButtonLED (L"OSC 2 On/Off")); + addAndMakeVisible (m_label_patch_name = new Label (L"Label Patch Name", + L"Patch name")); + m_label_patch_name->setFont (Font (20.0000f, Font::plain)); + m_label_patch_name->setJustificationType (Justification::centredLeft); + m_label_patch_name->setEditable (true, true, false); + m_label_patch_name->setColour (Label::textColourId, Colours::white); + m_label_patch_name->setColour (TextEditor::textColourId, Colours::black); + m_label_patch_name->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_patch_name->addListener (this); + + addAndMakeVisible (m_button_patch_incr = new TextButton (L"Patch Increment")); + m_button_patch_incr->setTooltip (L"Next Patch"); + m_button_patch_incr->setButtonText (L"+"); + + addAndMakeVisible (m_button_patch_decr = new TextButton (L"Patch Decrement")); + m_button_patch_decr->setTooltip (L"Previous Patch"); + m_button_patch_decr->setButtonText (L"-"); + + addAndMakeVisible (m_label_patch_number = new Label (L"Label Patch Number", + L"00")); + m_label_patch_number->setFont (Font (20.0000f, Font::plain)); + m_label_patch_number->setJustificationType (Justification::centredLeft); + m_label_patch_number->setEditable (true, true, false); + m_label_patch_number->setColour (Label::textColourId, Colours::white); + m_label_patch_number->setColour (TextEditor::textColourId, Colours::black); + m_label_patch_number->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_patch_number->addListener (this); + + addAndMakeVisible (m_label_osc1_pb_min = new Label (L"OSC 2 Pitch bender min", + L"-24")); + m_label_osc1_pb_min->setTooltip (L"OSC 2 pitch bender minimum [semitones]"); + m_label_osc1_pb_min->setFont (Font (12.0000f, Font::plain)); + m_label_osc1_pb_min->setJustificationType (Justification::centred); + m_label_osc1_pb_min->setEditable (true, true, false); + m_label_osc1_pb_min->setColour (TextEditor::textColourId, Colours::black); + m_label_osc1_pb_min->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_osc1_pb_min->addListener (this); + + addAndMakeVisible (m_label_osc1_pb_max = new Label (L"OSC 2 Pitch bender max", + L"+24")); + m_label_osc1_pb_max->setTooltip (L"OSC 2 pitch bender maximum [semitones]"); + m_label_osc1_pb_max->setFont (Font (12.0000f, Font::plain)); + m_label_osc1_pb_max->setJustificationType (Justification::centred); + m_label_osc1_pb_max->setEditable (true, true, false); + m_label_osc1_pb_max->setColour (TextEditor::textColourId, Colours::black); + m_label_osc1_pb_max->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_osc1_pb_max->addListener (this); + + addAndMakeVisible (m_label_osc0_pb_max = new Label (L"OSC 1 Pitch bender max", + L"+24")); + m_label_osc0_pb_max->setTooltip (L"OSC 1 pitch bender maximum [semitones]"); + m_label_osc0_pb_max->setFont (Font (12.0000f, Font::plain)); + m_label_osc0_pb_max->setJustificationType (Justification::centred); + m_label_osc0_pb_max->setEditable (true, true, false); + m_label_osc0_pb_max->setColour (TextEditor::textColourId, Colours::black); + m_label_osc0_pb_max->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_osc0_pb_max->addListener (this); + + addAndMakeVisible (m_label_osc0_pb_min = new Label (L"OSC 1 Pitch bender min", + L"-24")); + m_label_osc0_pb_min->setTooltip (L"OSC 1 pitch bender minimum [semitones]"); + m_label_osc0_pb_min->setFont (Font (12.0000f, Font::plain)); + m_label_osc0_pb_min->setJustificationType (Justification::centred); + m_label_osc0_pb_min->setEditable (true, true, false); + m_label_osc0_pb_min->setColour (TextEditor::textColourId, Colours::black); + m_label_osc0_pb_min->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_osc0_pb_min->addListener (this); + + addAndMakeVisible (m_slider_master_tune = new Slider (L"Master tune")); + m_slider_master_tune->setTooltip (L"Master tune [semitones]"); + m_slider_master_tune->setRange (0, 1, 0); + m_slider_master_tune->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_master_tune->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_master_tune->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_master_tune->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_master_tune->addListener (this); + + addAndMakeVisible (m_label_master_tune = new Label (L"Master tune", + L"value")); + m_label_master_tune->setFont (Font (14.0000f, Font::plain)); + m_label_master_tune->setJustificationType (Justification::centred); + m_label_master_tune->setEditable (true, true, false); + m_label_master_tune->setColour (TextEditor::textColourId, Colours::black); + m_label_master_tune->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_master_tune->addListener (this); + + addAndMakeVisible (m_button_humanize_enable = new ToggleButton (L"Humanize Enable")); + m_button_humanize_enable->setTooltip (L"Humanize spreads individual voice parameter to get a more vivid sound\\n. Humanize alters VCO tune, VCF cutoff and ENV times."); + m_button_humanize_enable->setButtonText (L"Humanize"); + m_button_humanize_enable->setColour (ToggleButton::textColourId, Colours::white); + + addAndMakeVisible (m_comboBox_vcf_order = new ComboBox (L"VCF Order")); + m_comboBox_vcf_order->setTooltip (L"VCF Order"); + m_comboBox_vcf_order->setEditableText (false); + m_comboBox_vcf_order->setJustificationType (Justification::centred); + m_comboBox_vcf_order->setTextWhenNothingSelected (String::empty); + m_comboBox_vcf_order->setTextWhenNoChoicesAvailable (L"(no choices)"); + m_comboBox_vcf_order->addItem (L"12 dB/Oct.", 1); + m_comboBox_vcf_order->addItem (L"24 dB/Oct.", 2); + m_comboBox_vcf_order->addSeparator(); + m_comboBox_vcf_order->addListener (this); + + addAndMakeVisible (m_slider_portamento_time = new Slider (L"Portamento Time")); + m_slider_portamento_time->setTooltip (L"Portamento Time [s]"); + m_slider_portamento_time->setRange (0, 1, 0); + m_slider_portamento_time->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_portamento_time->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_portamento_time->setColour (Slider::trackColourId, Colour (0x7fffffff)); + m_slider_portamento_time->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_portamento_time->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_portamento_time->addListener (this); + + addAndMakeVisible (m_label_portamento_time = new Label (L"Portamento Time", + L"value")); + m_label_portamento_time->setFont (Font (14.0000f, Font::plain)); + m_label_portamento_time->setJustificationType (Justification::centred); + m_label_portamento_time->setEditable (true, true, false); + m_label_portamento_time->setColour (TextEditor::textColourId, Colours::black); + m_label_portamento_time->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_portamento_time->addListener (this); + + addAndMakeVisible (m_button_unisono_enable = new ToggleButton (L"Unisono Enable")); + m_button_unisono_enable->setTooltip (L"This button switches unisono mode on and off"); + m_button_unisono_enable->setButtonText (L"Unisono"); + m_button_unisono_enable->setColour (ToggleButton::textColourId, Colours::white); + + addAndMakeVisible (m_slider_humanize_var_vco = new Slider (L"Humanize Variance VCO")); + m_slider_humanize_var_vco->setTooltip (L"Humanize spread VCO [%]"); + m_slider_humanize_var_vco->setRange (0, 1, 0); + m_slider_humanize_var_vco->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_humanize_var_vco->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_humanize_var_vco->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_humanize_var_vco->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_humanize_var_vco->addListener (this); + + addAndMakeVisible (m_slider_voice_pan_spread = new Slider (L"Voice Pan Spread")); + m_slider_voice_pan_spread->setTooltip (L"Voice Pan Spread [%]"); + m_slider_voice_pan_spread->setRange (0, 1, 0); + m_slider_voice_pan_spread->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_voice_pan_spread->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_voice_pan_spread->setColour (Slider::trackColourId, Colour (0x7fffffff)); + m_slider_voice_pan_spread->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_voice_pan_spread->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_voice_pan_spread->addListener (this); + + addAndMakeVisible (m_label_voice_pan_spread = new Label (L"Voice Pan Spread", + L"value")); + m_label_voice_pan_spread->setFont (Font (14.0000f, Font::plain)); + m_label_voice_pan_spread->setJustificationType (Justification::centred); + m_label_voice_pan_spread->setEditable (true, true, false); + m_label_voice_pan_spread->setColour (TextEditor::textColourId, Colours::black); + m_label_voice_pan_spread->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_voice_pan_spread->addListener (this); + + addAndMakeVisible (m_slider_humanize_var_vcf = new Slider (L"Humanize Variance VCF")); + m_slider_humanize_var_vcf->setTooltip (L"Humanize spread VCF [%]"); + m_slider_humanize_var_vcf->setRange (0, 1, 0); + m_slider_humanize_var_vcf->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_humanize_var_vcf->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_humanize_var_vcf->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_humanize_var_vcf->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_humanize_var_vcf->addListener (this); + + addAndMakeVisible (m_slider_humanize_var_env = new Slider (L"Humanize Variance ENV")); + m_slider_humanize_var_env->setTooltip (L"Humanize spread Envelopes [%]"); + m_slider_humanize_var_env->setRange (0, 1, 0); + m_slider_humanize_var_env->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_humanize_var_env->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_humanize_var_env->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_humanize_var_env->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_humanize_var_env->addListener (this); + + addAndMakeVisible (m_label_unisono_num_voices = new Label (L"Unisono Number of Voices", + L"999")); + m_label_unisono_num_voices->setTooltip (L"Unisono number of voices to allocate"); + m_label_unisono_num_voices->setFont (Font (14.0000f, Font::plain)); + m_label_unisono_num_voices->setJustificationType (Justification::centred); + m_label_unisono_num_voices->setEditable (true, true, false); + m_label_unisono_num_voices->setColour (TextEditor::textColourId, Colours::black); + m_label_unisono_num_voices->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_unisono_num_voices->addListener (this); + + addAndMakeVisible (m_button_osc0_restart_enable = new ToggleButton (L"Restart VCO 1 Enable")); + m_button_osc0_restart_enable->setTooltip (L"If not set the VCO runs free, starting with different phases on each note trigger. If set, phase is reset on note trigger. This may add more punch to the sound if set on both VCOs."); + m_button_osc0_restart_enable->setButtonText (L"Restart"); + m_button_osc0_restart_enable->setColour (ToggleButton::textColourId, Colours::white); + + addAndMakeVisible (m_button_osc1_restart_enable = new ToggleButton (L"Restart VCO 2 Enable")); + m_button_osc1_restart_enable->setTooltip (L"If not set the VCO runs free, starting with different phases on each note trigger. If set, phase is reset on note trigger. This may add more punch to the sound if set on both VCOs."); + m_button_osc1_restart_enable->setButtonText (L"Restart"); + m_button_osc1_restart_enable->setColour (ToggleButton::textColourId, Colours::white); + + addAndMakeVisible (m_button_mono_enable = new ToggleButton (L"Monophonic Enable")); + m_button_mono_enable->setTooltip (L"This button switches monophonic mode on and off"); + m_button_mono_enable->setButtonText (L"Monophonic"); + m_button_mono_enable->setColour (ToggleButton::textColourId, Colours::white); + + addAndMakeVisible (m_comboBox_osc1_fm_src1 = new ComboBox (L"OSC 2 FM Source 2")); + m_comboBox_osc1_fm_src1->setTooltip (L"OSC 2 FM Modulation Source 2"); + m_comboBox_osc1_fm_src1->setEditableText (false); + m_comboBox_osc1_fm_src1->setJustificationType (Justification::centred); + m_comboBox_osc1_fm_src1->setTextWhenNothingSelected (String::empty); + m_comboBox_osc1_fm_src1->setTextWhenNoChoicesAvailable (L"(no choices)"); + m_comboBox_osc1_fm_src1->addListener (this); + + addAndMakeVisible (m_comboBox_osc1_pwm_src1 = new ComboBox (L"OSC 2 PWM Source 2")); + m_comboBox_osc1_pwm_src1->setTooltip (L"OSC 2 PWM Modulation Source 2"); + m_comboBox_osc1_pwm_src1->setEditableText (false); + m_comboBox_osc1_pwm_src1->setJustificationType (Justification::centred); + m_comboBox_osc1_pwm_src1->setTextWhenNothingSelected (String::empty); + m_comboBox_osc1_pwm_src1->setTextWhenNoChoicesAvailable (L"(no choices)"); + m_comboBox_osc1_pwm_src1->addListener (this); + + addAndMakeVisible (m_comboBox_osc0_fm_src1 = new ComboBox (L"OSC 1 FM Source 2")); + m_comboBox_osc0_fm_src1->setTooltip (L"OSC 1 FM Modulation Source 2"); + m_comboBox_osc0_fm_src1->setEditableText (false); + m_comboBox_osc0_fm_src1->setJustificationType (Justification::centred); + m_comboBox_osc0_fm_src1->setTextWhenNothingSelected (String::empty); + m_comboBox_osc0_fm_src1->setTextWhenNoChoicesAvailable (L"(no choices)"); + m_comboBox_osc0_fm_src1->addListener (this); + + addAndMakeVisible (m_comboBox_osc0_pwm_src1 = new ComboBox (L"OSC 1 PWM Source 2")); + m_comboBox_osc0_pwm_src1->setTooltip (L"OSC 1 PWM Modulation Source 2"); + m_comboBox_osc0_pwm_src1->setEditableText (false); + m_comboBox_osc0_pwm_src1->setJustificationType (Justification::centred); + m_comboBox_osc0_pwm_src1->setTextWhenNothingSelected (String::empty); + m_comboBox_osc0_pwm_src1->setTextWhenNoChoicesAvailable (L"(no choices)"); + m_comboBox_osc0_pwm_src1->addListener (this); + + addAndMakeVisible (m_comboBox_osc1_am_src0 = new ComboBox (L"OSC 2 AM Source 1")); + m_comboBox_osc1_am_src0->setTooltip (L"OSC 2 AM Modulation Source 1"); + m_comboBox_osc1_am_src0->setEditableText (false); + m_comboBox_osc1_am_src0->setJustificationType (Justification::centred); + m_comboBox_osc1_am_src0->setTextWhenNothingSelected (String::empty); + m_comboBox_osc1_am_src0->setTextWhenNoChoicesAvailable (L"(no choices)"); + m_comboBox_osc1_am_src0->addListener (this); + + addAndMakeVisible (m_comboBox_osc1_am_src1 = new ComboBox (L"OSC 2 AM Source 2")); + m_comboBox_osc1_am_src1->setTooltip (L"OSC 2 AM Modulation Source 2"); + m_comboBox_osc1_am_src1->setEditableText (false); + m_comboBox_osc1_am_src1->setJustificationType (Justification::centred); + m_comboBox_osc1_am_src1->setTextWhenNothingSelected (String::empty); + m_comboBox_osc1_am_src1->setTextWhenNoChoicesAvailable (L"(no choices)"); + m_comboBox_osc1_am_src1->addListener (this); + + addAndMakeVisible (m_slider_osc1_am_amt0 = new Slider (L"OSC 2 AM amount 1")); + m_slider_osc1_am_amt0->setTooltip (L"OSC 2 AM amount [%]"); + m_slider_osc1_am_amt0->setRange (0, 1, 0); + m_slider_osc1_am_amt0->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_osc1_am_amt0->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_osc1_am_amt0->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_osc1_am_amt0->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_osc1_am_amt0->addListener (this); + + addAndMakeVisible (m_label_osc1_am_amt0 = new Label (L"OSC 2 AM amt 1", + L"value")); + m_label_osc1_am_amt0->setFont (Font (14.0000f, Font::plain)); + m_label_osc1_am_amt0->setJustificationType (Justification::centred); + m_label_osc1_am_amt0->setEditable (true, true, false); + m_label_osc1_am_amt0->setColour (TextEditor::textColourId, Colours::black); + m_label_osc1_am_amt0->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_osc1_am_amt0->addListener (this); + + addAndMakeVisible (m_comboBox_osc0_am_src0 = new ComboBox (L"OSC 1 AM Source 1")); + m_comboBox_osc0_am_src0->setTooltip (L"OSC 1 AM Modulation Source 1"); + m_comboBox_osc0_am_src0->setEditableText (false); + m_comboBox_osc0_am_src0->setJustificationType (Justification::centred); + m_comboBox_osc0_am_src0->setTextWhenNothingSelected (String::empty); + m_comboBox_osc0_am_src0->setTextWhenNoChoicesAvailable (L"(no choices)"); + m_comboBox_osc0_am_src0->addListener (this); + + addAndMakeVisible (m_comboBox_osc0_am_src1 = new ComboBox (L"OSC 1 AM Source 2")); + m_comboBox_osc0_am_src1->setTooltip (L"OSC 1 AM Modulation Source 2"); + m_comboBox_osc0_am_src1->setEditableText (false); + m_comboBox_osc0_am_src1->setJustificationType (Justification::centred); + m_comboBox_osc0_am_src1->setTextWhenNothingSelected (String::empty); + m_comboBox_osc0_am_src1->setTextWhenNoChoicesAvailable (L"(no choices)"); + m_comboBox_osc0_am_src1->addListener (this); + + addAndMakeVisible (m_slider_osc0_am_amt0 = new Slider (L"OSC 1 AM amount 1")); + m_slider_osc0_am_amt0->setTooltip (L"OSC 1 AM amount [%]"); + m_slider_osc0_am_amt0->setRange (0, 1, 0); + m_slider_osc0_am_amt0->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_osc0_am_amt0->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_osc0_am_amt0->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_osc0_am_amt0->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_osc0_am_amt0->addListener (this); + + addAndMakeVisible (m_label_osc0_am_amt0 = new Label (L"OSC 1 AM amt 1", + L"value")); + m_label_osc0_am_amt0->setFont (Font (14.0000f, Font::plain)); + m_label_osc0_am_amt0->setJustificationType (Justification::centred); + m_label_osc0_am_amt0->setEditable (true, true, false); + m_label_osc0_am_amt0->setColour (TextEditor::textColourId, Colours::black); + m_label_osc0_am_amt0->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_osc0_am_amt0->addListener (this); + + addAndMakeVisible (m_slider_env2_attack = new Slider (L"ENV 3 Attack")); + m_slider_env2_attack->setTooltip (L"ENV 3 Attack Time [ms]"); + m_slider_env2_attack->setRange (0, 1, 0); + m_slider_env2_attack->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_env2_attack->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_env2_attack->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_env2_attack->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_env2_attack->addListener (this); + + addAndMakeVisible (m_slider_env2_decay = new Slider (L"ENV 3 Decay")); + m_slider_env2_decay->setTooltip (L"ENV 3 Decay Time [ms]"); + m_slider_env2_decay->setRange (0, 1, 0); + m_slider_env2_decay->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_env2_decay->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_env2_decay->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_env2_decay->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_env2_decay->addListener (this); + + addAndMakeVisible (m_slider_env2_release = new Slider (L"ENV 3 Release")); + m_slider_env2_release->setTooltip (L"ENV 3 Release Time [ms]"); + m_slider_env2_release->setRange (0, 1, 0); + m_slider_env2_release->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_env2_release->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_env2_release->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_env2_release->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_env2_release->addListener (this); + + addAndMakeVisible (m_slider_env2_sustain = new Slider (L"ENV 3 Sustain")); + m_slider_env2_sustain->setTooltip (L"ENV 3 Sustain Level [%]"); + m_slider_env2_sustain->setRange (0, 1, 0); + m_slider_env2_sustain->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_env2_sustain->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_env2_sustain->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_env2_sustain->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_env2_sustain->addListener (this); + + addAndMakeVisible (m_label_env2_attack = new Label (L"ENV 3 Attack", + L"value")); + m_label_env2_attack->setFont (Font (14.0000f, Font::plain)); + m_label_env2_attack->setJustificationType (Justification::centred); + m_label_env2_attack->setEditable (true, true, false); + m_label_env2_attack->setColour (TextEditor::textColourId, Colours::black); + m_label_env2_attack->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_env2_attack->addListener (this); + + addAndMakeVisible (m_label_env2_decay = new Label (L"ENV 3 Decay", + L"value")); + m_label_env2_decay->setFont (Font (14.0000f, Font::plain)); + m_label_env2_decay->setJustificationType (Justification::centred); + m_label_env2_decay->setEditable (true, true, false); + m_label_env2_decay->setColour (TextEditor::textColourId, Colours::black); + m_label_env2_decay->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_env2_decay->addListener (this); + + addAndMakeVisible (m_label_env2_sustain = new Label (L"ENV 3 Sustain", + L"value")); + m_label_env2_sustain->setFont (Font (14.0000f, Font::plain)); + m_label_env2_sustain->setJustificationType (Justification::centred); + m_label_env2_sustain->setEditable (true, true, false); + m_label_env2_sustain->setColour (TextEditor::textColourId, Colours::black); + m_label_env2_sustain->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_env2_sustain->addListener (this); + + addAndMakeVisible (m_label_env2_release = new Label (L"ENV 3 Release", + L"value")); + m_label_env2_release->setFont (Font (14.0000f, Font::plain)); + m_label_env2_release->setJustificationType (Justification::centred); + m_label_env2_release->setEditable (true, true, false); + m_label_env2_release->setColour (TextEditor::textColourId, Colours::black); + m_label_env2_release->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_env2_release->addListener (this); + + addAndMakeVisible (m_slider_env3_attack = new Slider (L"ENV 4 Attack")); + m_slider_env3_attack->setTooltip (L"ENV 4 Attack Time [ms]"); + m_slider_env3_attack->setRange (0, 1, 0); + m_slider_env3_attack->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_env3_attack->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_env3_attack->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_env3_attack->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_env3_attack->addListener (this); + + addAndMakeVisible (m_slider_env3_decay = new Slider (L"ENV 4 Decay")); + m_slider_env3_decay->setTooltip (L"ENV 4 Decay Time [ms]"); + m_slider_env3_decay->setRange (0, 1, 0); + m_slider_env3_decay->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_env3_decay->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_env3_decay->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_env3_decay->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_env3_decay->addListener (this); + + addAndMakeVisible (m_slider_env3_release = new Slider (L"ENV 4 Release")); + m_slider_env3_release->setTooltip (L"ENV 4 Release Time [ms]"); + m_slider_env3_release->setRange (0, 1, 0); + m_slider_env3_release->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_env3_release->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_env3_release->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_env3_release->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_env3_release->addListener (this); + + addAndMakeVisible (m_slider_env3_sustain = new Slider (L"ENV 4 Sustain")); + m_slider_env3_sustain->setTooltip (L"ENV 4 Sustain Level [%]"); + m_slider_env3_sustain->setRange (0, 1, 0); + m_slider_env3_sustain->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_env3_sustain->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_env3_sustain->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_env3_sustain->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_env3_sustain->addListener (this); + + addAndMakeVisible (m_label_env3_attack = new Label (L"ENV 4 Attack", + L"value")); + m_label_env3_attack->setFont (Font (14.0000f, Font::plain)); + m_label_env3_attack->setJustificationType (Justification::centred); + m_label_env3_attack->setEditable (true, true, false); + m_label_env3_attack->setColour (TextEditor::textColourId, Colours::black); + m_label_env3_attack->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_env3_attack->addListener (this); + + addAndMakeVisible (m_label_env3_decay = new Label (L"ENV 4 Decay", + L"value")); + m_label_env3_decay->setFont (Font (14.0000f, Font::plain)); + m_label_env3_decay->setJustificationType (Justification::centred); + m_label_env3_decay->setEditable (true, true, false); + m_label_env3_decay->setColour (TextEditor::textColourId, Colours::black); + m_label_env3_decay->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_env3_decay->addListener (this); + + addAndMakeVisible (m_label_env3_sustain = new Label (L"ENV 4 Sustain", + L"value")); + m_label_env3_sustain->setFont (Font (14.0000f, Font::plain)); + m_label_env3_sustain->setJustificationType (Justification::centred); + m_label_env3_sustain->setEditable (true, true, false); + m_label_env3_sustain->setColour (TextEditor::textColourId, Colours::black); + m_label_env3_sustain->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_env3_sustain->addListener (this); + + addAndMakeVisible (m_label_env3_release = new Label (L"ENV 4 Release", + L"value")); + m_label_env3_release->setFont (Font (14.0000f, Font::plain)); + m_label_env3_release->setJustificationType (Justification::centred); + m_label_env3_release->setEditable (true, true, false); + m_label_env3_release->setColour (TextEditor::textColourId, Colours::black); + m_label_env3_release->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_env3_release->addListener (this); + + addAndMakeVisible (m_comboBox_vcf_f_src1 = new ComboBox (L"VCF Cutoff Source 2")); + m_comboBox_vcf_f_src1->setTooltip (L"VCF Cutoff Modulation Source 2"); + m_comboBox_vcf_f_src1->setEditableText (false); + m_comboBox_vcf_f_src1->setJustificationType (Justification::centred); + m_comboBox_vcf_f_src1->setTextWhenNothingSelected (String::empty); + m_comboBox_vcf_f_src1->setTextWhenNoChoicesAvailable (L"(no choices)"); + m_comboBox_vcf_f_src1->addListener (this); + + addAndMakeVisible (m_slider_vcf_q_amt0 = new Slider (L"VCF Resonance amount 1")); + m_slider_vcf_q_amt0->setTooltip (L"VCF Resonance Amount [%]"); + m_slider_vcf_q_amt0->setRange (0, 1, 0); + m_slider_vcf_q_amt0->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_vcf_q_amt0->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_vcf_q_amt0->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_vcf_q_amt0->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_vcf_q_amt0->addListener (this); + + addAndMakeVisible (m_label_vcf_q_amt0 = new Label (L"VCF Resonance amount 1", + L"value")); + m_label_vcf_q_amt0->setFont (Font (14.0000f, Font::plain)); + m_label_vcf_q_amt0->setJustificationType (Justification::centred); + m_label_vcf_q_amt0->setEditable (true, true, false); + m_label_vcf_q_amt0->setColour (TextEditor::textColourId, Colours::black); + m_label_vcf_q_amt0->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_vcf_q_amt0->addListener (this); + + addAndMakeVisible (m_comboBox_vcf_q_src0 = new ComboBox (L"VCF Resonance Source 1")); + m_comboBox_vcf_q_src0->setTooltip (L"VCF Resonance Modulation Source 1"); + m_comboBox_vcf_q_src0->setEditableText (false); + m_comboBox_vcf_q_src0->setJustificationType (Justification::centred); + m_comboBox_vcf_q_src0->setTextWhenNothingSelected (String::empty); + m_comboBox_vcf_q_src0->setTextWhenNoChoicesAvailable (L"(no choices)"); + m_comboBox_vcf_q_src0->addListener (this); + + addAndMakeVisible (m_comboBox_vcf_q_src1 = new ComboBox (L"VCF Resonance Source 2")); + m_comboBox_vcf_q_src1->setTooltip (L"VCF Resonance Modulation Source 2"); + m_comboBox_vcf_q_src1->setEditableText (false); + m_comboBox_vcf_q_src1->setJustificationType (Justification::centred); + m_comboBox_vcf_q_src1->setTextWhenNothingSelected (String::empty); + m_comboBox_vcf_q_src1->setTextWhenNoChoicesAvailable (L"(no choices)"); + m_comboBox_vcf_q_src1->addListener (this); + + addAndMakeVisible (m_label_humanize_var_vco = new Label (L"Humanize Variance VCO", + L"value")); + m_label_humanize_var_vco->setFont (Font (14.0000f, Font::plain)); + m_label_humanize_var_vco->setJustificationType (Justification::centred); + m_label_humanize_var_vco->setEditable (true, true, false); + m_label_humanize_var_vco->setColour (TextEditor::textColourId, Colours::black); + m_label_humanize_var_vco->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_humanize_var_vco->addListener (this); + + addAndMakeVisible (m_label_humanize_var_vcf = new Label (L"Humanize Variance VCF", + L"value")); + m_label_humanize_var_vcf->setFont (Font (14.0000f, Font::plain)); + m_label_humanize_var_vcf->setJustificationType (Justification::centred); + m_label_humanize_var_vcf->setEditable (true, true, false); + m_label_humanize_var_vcf->setColour (TextEditor::textColourId, Colours::black); + m_label_humanize_var_vcf->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_humanize_var_vcf->addListener (this); + + addAndMakeVisible (m_label_humanize_var_env = new Label (L"Humanize Variance ENV", + L"value")); + m_label_humanize_var_env->setFont (Font (14.0000f, Font::plain)); + m_label_humanize_var_env->setJustificationType (Justification::centred); + m_label_humanize_var_env->setEditable (true, true, false); + m_label_humanize_var_env->setColour (TextEditor::textColourId, Colours::black); + m_label_humanize_var_env->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_humanize_var_env->addListener (this); + + addAndMakeVisible (m_btn_limiter_led = new ButtonLED (L"Limiter 1 On/Off")); + addAndMakeVisible (m_label_limiter_led = new Label (L"Limiter LED Text", + L"Limiting")); + m_label_limiter_led->setFont (Font (L"Arial", 12.0000f, Font::plain)); + m_label_limiter_led->setJustificationType (Justification::centredLeft); + m_label_limiter_led->setEditable (false, false, false); + m_label_limiter_led->setColour (Label::textColourId, Colours::white); + m_label_limiter_led->setColour (TextEditor::textColourId, Colours::black); + m_label_limiter_led->setColour (TextEditor::backgroundColourId, Colour (0x0)); + + addAndMakeVisible (m_slider_lfo0_delay = new Slider (L"LFO 1 Delay")); + m_slider_lfo0_delay->setTooltip (L"LFO 1 Delay [ms]. Use with Sync = \'Restart\'."); + m_slider_lfo0_delay->setRange (0, 1, 0); + m_slider_lfo0_delay->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_lfo0_delay->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_lfo0_delay->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_lfo0_delay->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_lfo0_delay->addListener (this); + + addAndMakeVisible (m_label_lfo0_delay = new Label (L"LFO 1 Delay", + L"value")); + m_label_lfo0_delay->setFont (Font (14.0000f, Font::plain)); + m_label_lfo0_delay->setJustificationType (Justification::centred); + m_label_lfo0_delay->setEditable (true, true, false); + m_label_lfo0_delay->setColour (Label::outlineColourId, Colour (0x0)); + m_label_lfo0_delay->setColour (TextEditor::textColourId, Colours::azure); + m_label_lfo0_delay->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_lfo0_delay->setColour (TextEditor::highlightColourId, Colour (0xf7f7f7)); + m_label_lfo0_delay->addListener (this); + + addAndMakeVisible (m_slider_lfo0_attack = new Slider (L"LFO 1 Attack")); + m_slider_lfo0_attack->setTooltip (L"LFO 1 Attack Time [ms]. Use with Sync = \'Restart\'."); + m_slider_lfo0_attack->setRange (0, 1, 0); + m_slider_lfo0_attack->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_lfo0_attack->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_lfo0_attack->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_lfo0_attack->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_lfo0_attack->addListener (this); + + addAndMakeVisible (m_label_lfo0_attack = new Label (L"LFO 1 Attack", + L"value")); + m_label_lfo0_attack->setFont (Font (14.0000f, Font::plain)); + m_label_lfo0_attack->setJustificationType (Justification::centred); + m_label_lfo0_attack->setEditable (true, true, false); + m_label_lfo0_attack->setColour (Label::outlineColourId, Colour (0x0)); + m_label_lfo0_attack->setColour (TextEditor::textColourId, Colours::azure); + m_label_lfo0_attack->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_lfo0_attack->setColour (TextEditor::highlightColourId, Colour (0xf7f7f7)); + m_label_lfo0_attack->addListener (this); + + addAndMakeVisible (m_slider_lfo1_delay = new Slider (L"LFO 2 Delay")); + m_slider_lfo1_delay->setTooltip (L"LFO 2 Delay [ms]. Use with Sync = \'Restart\'."); + m_slider_lfo1_delay->setRange (0, 1, 0); + m_slider_lfo1_delay->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_lfo1_delay->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_lfo1_delay->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_lfo1_delay->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_lfo1_delay->addListener (this); + + addAndMakeVisible (m_label_lfo1_delay = new Label (L"LFO 2 Delay", + L"value")); + m_label_lfo1_delay->setFont (Font (14.0000f, Font::plain)); + m_label_lfo1_delay->setJustificationType (Justification::centred); + m_label_lfo1_delay->setEditable (true, true, false); + m_label_lfo1_delay->setColour (Label::outlineColourId, Colour (0x0)); + m_label_lfo1_delay->setColour (TextEditor::textColourId, Colours::azure); + m_label_lfo1_delay->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_lfo1_delay->setColour (TextEditor::highlightColourId, Colour (0xf7f7f7)); + m_label_lfo1_delay->addListener (this); + + addAndMakeVisible (m_slider_lfo1_attack = new Slider (L"LFO 2 Attack")); + m_slider_lfo1_attack->setTooltip (L"LFO 2 Attack Time [ms]. Use with Sync = \'Restart\'."); + m_slider_lfo1_attack->setRange (0, 1, 0); + m_slider_lfo1_attack->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_lfo1_attack->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_lfo1_attack->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_lfo1_attack->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_lfo1_attack->addListener (this); + + addAndMakeVisible (m_label_lfo1_attack = new Label (L"LFO 2 Attack", + L"value")); + m_label_lfo1_attack->setFont (Font (14.0000f, Font::plain)); + m_label_lfo1_attack->setJustificationType (Justification::centred); + m_label_lfo1_attack->setEditable (true, true, false); + m_label_lfo1_attack->setColour (Label::outlineColourId, Colour (0x0)); + m_label_lfo1_attack->setColour (TextEditor::textColourId, Colours::azure); + m_label_lfo1_attack->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_lfo1_attack->setColour (TextEditor::highlightColourId, Colour (0xf7f7f7)); + m_label_lfo1_attack->addListener (this); + + addAndMakeVisible (m_slider_lfo2_delay = new Slider (L"LFO 3 Delay")); + m_slider_lfo2_delay->setTooltip (L"LFO 3 Delay [ms]. Use with Sync = \'Restart\'."); + m_slider_lfo2_delay->setRange (0, 1, 0); + m_slider_lfo2_delay->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_lfo2_delay->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_lfo2_delay->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_lfo2_delay->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_lfo2_delay->addListener (this); + + addAndMakeVisible (m_label_lfo2_delay = new Label (L"LFO 3 Delay", + L"value")); + m_label_lfo2_delay->setFont (Font (14.0000f, Font::plain)); + m_label_lfo2_delay->setJustificationType (Justification::centred); + m_label_lfo2_delay->setEditable (true, true, false); + m_label_lfo2_delay->setColour (Label::outlineColourId, Colour (0x0)); + m_label_lfo2_delay->setColour (TextEditor::textColourId, Colours::azure); + m_label_lfo2_delay->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_lfo2_delay->setColour (TextEditor::highlightColourId, Colour (0xf7f7f7)); + m_label_lfo2_delay->addListener (this); + + addAndMakeVisible (m_slider_lfo2_attack = new Slider (L"LFO 3 Attack")); + m_slider_lfo2_attack->setTooltip (L"LFO 3 Attack Time [ms]. Use with Sync = \'Restart\'."); + m_slider_lfo2_attack->setRange (0, 1, 0); + m_slider_lfo2_attack->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_lfo2_attack->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_lfo2_attack->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_lfo2_attack->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_lfo2_attack->addListener (this); + + addAndMakeVisible (m_label_lfo2_attack = new Label (L"LFO 3 Attack", + L"value")); + m_label_lfo2_attack->setFont (Font (14.0000f, Font::plain)); + m_label_lfo2_attack->setJustificationType (Justification::centred); + m_label_lfo2_attack->setEditable (true, true, false); + m_label_lfo2_attack->setColour (Label::outlineColourId, Colour (0x0)); + m_label_lfo2_attack->setColour (TextEditor::textColourId, Colours::azure); + m_label_lfo2_attack->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_lfo2_attack->setColour (TextEditor::highlightColourId, Colour (0xf7f7f7)); + m_label_lfo2_attack->addListener (this); + + addAndMakeVisible (m_slider_lfo3_delay = new Slider (L"LFO 4 Delay")); + m_slider_lfo3_delay->setTooltip (L"LFO 4 Delay [ms]. Use with Sync = \'Restart\'."); + m_slider_lfo3_delay->setRange (0, 1, 0); + m_slider_lfo3_delay->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_lfo3_delay->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_lfo3_delay->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_lfo3_delay->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_lfo3_delay->addListener (this); + + addAndMakeVisible (m_label_lfo3_delay = new Label (L"LFO 4 Delay", + L"value")); + m_label_lfo3_delay->setFont (Font (14.0000f, Font::plain)); + m_label_lfo3_delay->setJustificationType (Justification::centred); + m_label_lfo3_delay->setEditable (true, true, false); + m_label_lfo3_delay->setColour (Label::outlineColourId, Colour (0x0)); + m_label_lfo3_delay->setColour (TextEditor::textColourId, Colours::azure); + m_label_lfo3_delay->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_lfo3_delay->setColour (TextEditor::highlightColourId, Colour (0xf7f7f7)); + m_label_lfo3_delay->addListener (this); + + addAndMakeVisible (m_slider_lfo3_attack = new Slider (L"LFO 4 Attack")); + m_slider_lfo3_attack->setTooltip (L"LFO 4 Attack Time [ms]. Use with Sync = \'Restart\'."); + m_slider_lfo3_attack->setRange (0, 1, 0); + m_slider_lfo3_attack->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_lfo3_attack->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_lfo3_attack->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_lfo3_attack->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_lfo3_attack->addListener (this); + + addAndMakeVisible (m_label_lfo3_attack = new Label (L"LFO 4 Attack", + L"value")); + m_label_lfo3_attack->setFont (Font (14.0000f, Font::plain)); + m_label_lfo3_attack->setJustificationType (Justification::centred); + m_label_lfo3_attack->setEditable (true, true, false); + m_label_lfo3_attack->setColour (Label::outlineColourId, Colour (0x0)); + m_label_lfo3_attack->setColour (TextEditor::textColourId, Colours::azure); + m_label_lfo3_attack->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_lfo3_attack->setColour (TextEditor::highlightColourId, Colour (0xf7f7f7)); + m_label_lfo3_attack->addListener (this); + + addAndMakeVisible (m_button_lfo0_restart_enable = new ToggleButton (L"Restart LFO 1 Enable")); + m_button_lfo0_restart_enable->setTooltip (L"Use \'Restart\' to reset LFO phase on each note trigger. Use \'Free\' to use a free running LFO."); + m_button_lfo0_restart_enable->setButtonText (String::empty); + m_button_lfo0_restart_enable->setColour (ToggleButton::textColourId, Colours::white); + + addAndMakeVisible (m_button_lfo0_individual_enable = new ToggleButton (L"LFO 1 Global Enable")); + m_button_lfo0_individual_enable->setTooltip (L"Set this to \'Global\' to use the LFO for all voices. Set this to \'Individual\' to make voices have their own LFO."); + m_button_lfo0_individual_enable->setButtonText (String::empty); + m_button_lfo0_individual_enable->setColour (ToggleButton::textColourId, Colours::white); + + addAndMakeVisible (m_slider_lfo0_symmetry = new Slider (L"LFO 1 Symmetry")); + m_slider_lfo0_symmetry->setTooltip (L"LFO 1 Symmetry [%]"); + m_slider_lfo0_symmetry->setRange (0, 1, 0); + m_slider_lfo0_symmetry->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_lfo0_symmetry->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_lfo0_symmetry->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_lfo0_symmetry->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_lfo0_symmetry->addListener (this); + + addAndMakeVisible (m_label_lfo0_symmetry = new Label (L"LFO 1 Symmetry", + L"value")); + m_label_lfo0_symmetry->setFont (Font (14.0000f, Font::plain)); + m_label_lfo0_symmetry->setJustificationType (Justification::centred); + m_label_lfo0_symmetry->setEditable (true, true, false); + m_label_lfo0_symmetry->setColour (Label::outlineColourId, Colour (0x0)); + m_label_lfo0_symmetry->setColour (TextEditor::textColourId, Colours::azure); + m_label_lfo0_symmetry->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_lfo0_symmetry->setColour (TextEditor::highlightColourId, Colour (0xf7f7f7)); + m_label_lfo0_symmetry->addListener (this); + + addAndMakeVisible (m_slider_lfo1_symmetry = new Slider (L"LFO 2 Symmetry")); + m_slider_lfo1_symmetry->setTooltip (L"LFO 2 Symmetry [%]"); + m_slider_lfo1_symmetry->setRange (0, 1, 0); + m_slider_lfo1_symmetry->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_lfo1_symmetry->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_lfo1_symmetry->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_lfo1_symmetry->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_lfo1_symmetry->addListener (this); + + addAndMakeVisible (m_label_lfo1_symmetry = new Label (L"LFO 2 Symmetry", + L"value")); + m_label_lfo1_symmetry->setFont (Font (14.0000f, Font::plain)); + m_label_lfo1_symmetry->setJustificationType (Justification::centred); + m_label_lfo1_symmetry->setEditable (true, true, false); + m_label_lfo1_symmetry->setColour (Label::outlineColourId, Colour (0x0)); + m_label_lfo1_symmetry->setColour (TextEditor::textColourId, Colours::azure); + m_label_lfo1_symmetry->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_lfo1_symmetry->setColour (TextEditor::highlightColourId, Colour (0xf7f7f7)); + m_label_lfo1_symmetry->addListener (this); + + addAndMakeVisible (m_button_lfo1_restart_enable = new ToggleButton (L"Restart LFO 2 Enable")); + m_button_lfo1_restart_enable->setTooltip (L"Use \'Restart\' to reset LFO phase on each note trigger. Use \'Free\' to use a free running LFO."); + m_button_lfo1_restart_enable->setButtonText (String::empty); + m_button_lfo1_restart_enable->setColour (ToggleButton::textColourId, Colours::white); + + addAndMakeVisible (m_button_lfo1_individual_enable = new ToggleButton (L"LFO 2 Global Enable")); + m_button_lfo1_individual_enable->setTooltip (L"Set this to \'Global\' to use the LFO for all voices. Set this to \'Individual\' to make voices have their own LFO."); + m_button_lfo1_individual_enable->setButtonText (String::empty); + m_button_lfo1_individual_enable->setColour (ToggleButton::textColourId, Colours::white); + + addAndMakeVisible (m_button_lfo2_restart_enable = new ToggleButton (L"Restart LFO 3 Enable")); + m_button_lfo2_restart_enable->setTooltip (L"Use \'Restart\' to reset LFO phase on each note trigger. Use \'Free\' to use a free running LFO."); + m_button_lfo2_restart_enable->setButtonText (String::empty); + m_button_lfo2_restart_enable->setColour (ToggleButton::textColourId, Colours::white); + + addAndMakeVisible (m_button_lfo2_individual_enable = new ToggleButton (L"LFO 3 Global Enable")); + m_button_lfo2_individual_enable->setTooltip (L"Set this to \'Global\' to use the LFO for all voices. Set this to \'Individual\' to make voices have their own LFO."); + m_button_lfo2_individual_enable->setButtonText (String::empty); + m_button_lfo2_individual_enable->setColour (ToggleButton::textColourId, Colours::white); + + addAndMakeVisible (m_slider_lfo2_symmetry = new Slider (L"LFO 3 Symmetry")); + m_slider_lfo2_symmetry->setTooltip (L"LFO 3 Symmetry [%]"); + m_slider_lfo2_symmetry->setRange (0, 1, 0); + m_slider_lfo2_symmetry->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_lfo2_symmetry->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_lfo2_symmetry->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_lfo2_symmetry->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_lfo2_symmetry->addListener (this); + + addAndMakeVisible (m_label_lfo2_symmetry = new Label (L"LFO 3 Symmetry", + L"value")); + m_label_lfo2_symmetry->setFont (Font (14.0000f, Font::plain)); + m_label_lfo2_symmetry->setJustificationType (Justification::centred); + m_label_lfo2_symmetry->setEditable (true, true, false); + m_label_lfo2_symmetry->setColour (Label::outlineColourId, Colour (0x0)); + m_label_lfo2_symmetry->setColour (TextEditor::textColourId, Colours::azure); + m_label_lfo2_symmetry->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_lfo2_symmetry->setColour (TextEditor::highlightColourId, Colour (0xf7f7f7)); + m_label_lfo2_symmetry->addListener (this); + + addAndMakeVisible (m_slider_lfo3_symmetry = new Slider (L"LFO 4 Symmetry")); + m_slider_lfo3_symmetry->setTooltip (L"LFO 4 Symmetry [%]"); + m_slider_lfo3_symmetry->setRange (0, 1, 0); + m_slider_lfo3_symmetry->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_lfo3_symmetry->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_lfo3_symmetry->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_lfo3_symmetry->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_lfo3_symmetry->addListener (this); + + addAndMakeVisible (m_label_lfo3_symmetry = new Label (L"LFO 4 Symmetry", + L"value")); + m_label_lfo3_symmetry->setFont (Font (14.0000f, Font::plain)); + m_label_lfo3_symmetry->setJustificationType (Justification::centred); + m_label_lfo3_symmetry->setEditable (true, true, false); + m_label_lfo3_symmetry->setColour (Label::outlineColourId, Colour (0x0)); + m_label_lfo3_symmetry->setColour (TextEditor::textColourId, Colours::azure); + m_label_lfo3_symmetry->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_lfo3_symmetry->setColour (TextEditor::highlightColourId, Colour (0xf7f7f7)); + m_label_lfo3_symmetry->addListener (this); + + addAndMakeVisible (m_button_lfo3_restart_enable = new ToggleButton (L"Restart LFO 4 Enable")); + m_button_lfo3_restart_enable->setTooltip (L"Use \'Restart\' to reset LFO phase on each note trigger. Use \'Free\' to use a free running LFO."); + m_button_lfo3_restart_enable->setButtonText (String::empty); + m_button_lfo3_restart_enable->setColour (ToggleButton::textColourId, Colours::white); + + addAndMakeVisible (m_button_lfo3_individual_enable = new ToggleButton (L"LFO 4 Global Enable")); + m_button_lfo3_individual_enable->setTooltip (L"Set this to \'Global\' to use the LFO for all voices. Set this to \'Individual\' to make voices have their own LFO."); + m_button_lfo3_individual_enable->setButtonText (String::empty); + m_button_lfo3_individual_enable->setColour (ToggleButton::textColourId, Colours::white); + + addAndMakeVisible (m_slider_osc0_fm_amt1 = new Slider (L"OSC 1 FM amount 2")); + m_slider_osc0_fm_amt1->setTooltip (L"OSC 1 FM amount [%]"); + m_slider_osc0_fm_amt1->setRange (0, 1, 0); + m_slider_osc0_fm_amt1->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_osc0_fm_amt1->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_osc0_fm_amt1->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_osc0_fm_amt1->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_osc0_fm_amt1->addListener (this); + + addAndMakeVisible (m_label_osc0_fm_amt1 = new Label (L"OSC 1 FM amt 2", + L"value")); + m_label_osc0_fm_amt1->setFont (Font (14.0000f, Font::plain)); + m_label_osc0_fm_amt1->setJustificationType (Justification::centred); + m_label_osc0_fm_amt1->setEditable (true, true, false); + m_label_osc0_fm_amt1->setColour (TextEditor::textColourId, Colours::black); + m_label_osc0_fm_amt1->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_osc0_fm_amt1->addListener (this); + + addAndMakeVisible (m_slider_osc0_pwm_amt1 = new Slider (L"OSC 1 PWM amount 2")); + m_slider_osc0_pwm_amt1->setTooltip (L"OSC 1 PWM Amount [%]"); + m_slider_osc0_pwm_amt1->setRange (0, 1, 0); + m_slider_osc0_pwm_amt1->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_osc0_pwm_amt1->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_osc0_pwm_amt1->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_osc0_pwm_amt1->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_osc0_pwm_amt1->addListener (this); + + addAndMakeVisible (m_label_osc0_pwm_amt1 = new Label (L"OSC 1 PWM amt 2", + L"value")); + m_label_osc0_pwm_amt1->setFont (Font (14.0000f, Font::plain)); + m_label_osc0_pwm_amt1->setJustificationType (Justification::centred); + m_label_osc0_pwm_amt1->setEditable (true, true, false); + m_label_osc0_pwm_amt1->setColour (TextEditor::textColourId, Colours::black); + m_label_osc0_pwm_amt1->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_osc0_pwm_amt1->addListener (this); + + addAndMakeVisible (m_slider_osc0_am_amt1 = new Slider (L"OSC 1 AM amount 2")); + m_slider_osc0_am_amt1->setTooltip (L"OSC 1 AM amount [%]"); + m_slider_osc0_am_amt1->setRange (0, 1, 0); + m_slider_osc0_am_amt1->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_osc0_am_amt1->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_osc0_am_amt1->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_osc0_am_amt1->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_osc0_am_amt1->addListener (this); + + addAndMakeVisible (m_label_osc0_am_amt1 = new Label (L"OSC 1 AM amt 2", + L"value")); + m_label_osc0_am_amt1->setFont (Font (14.0000f, Font::plain)); + m_label_osc0_am_amt1->setJustificationType (Justification::centred); + m_label_osc0_am_amt1->setEditable (true, true, false); + m_label_osc0_am_amt1->setColour (TextEditor::textColourId, Colours::black); + m_label_osc0_am_amt1->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_osc0_am_amt1->addListener (this); + + addAndMakeVisible (m_slider_osc1_fm_amt1 = new Slider (L"OSC 2 FM amount 2")); + m_slider_osc1_fm_amt1->setTooltip (L"OSC 2 FM amount [%]"); + m_slider_osc1_fm_amt1->setRange (0, 1, 0); + m_slider_osc1_fm_amt1->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_osc1_fm_amt1->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_osc1_fm_amt1->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_osc1_fm_amt1->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_osc1_fm_amt1->addListener (this); + + addAndMakeVisible (m_label_osc1_fm_amt1 = new Label (L"OSC 2 FM amt 2", + L"value")); + m_label_osc1_fm_amt1->setFont (Font (14.0000f, Font::plain)); + m_label_osc1_fm_amt1->setJustificationType (Justification::centred); + m_label_osc1_fm_amt1->setEditable (true, true, false); + m_label_osc1_fm_amt1->setColour (TextEditor::textColourId, Colours::black); + m_label_osc1_fm_amt1->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_osc1_fm_amt1->addListener (this); + + addAndMakeVisible (m_slider_osc1_pwm_amt1 = new Slider (L"OSC 2 PWM amount 2")); + m_slider_osc1_pwm_amt1->setTooltip (L"OSC 2 PWM Amount [%]"); + m_slider_osc1_pwm_amt1->setRange (0, 1, 0); + m_slider_osc1_pwm_amt1->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_osc1_pwm_amt1->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_osc1_pwm_amt1->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_osc1_pwm_amt1->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_osc1_pwm_amt1->addListener (this); + + addAndMakeVisible (m_label_osc1_pwm_amt1 = new Label (L"OSC 2 PWM amt 2", + L"value")); + m_label_osc1_pwm_amt1->setFont (Font (14.0000f, Font::plain)); + m_label_osc1_pwm_amt1->setJustificationType (Justification::centred); + m_label_osc1_pwm_amt1->setEditable (true, true, false); + m_label_osc1_pwm_amt1->setColour (TextEditor::textColourId, Colours::black); + m_label_osc1_pwm_amt1->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_osc1_pwm_amt1->addListener (this); + + addAndMakeVisible (m_slider_osc1_am_amt1 = new Slider (L"OSC 2 AM amount 2")); + m_slider_osc1_am_amt1->setTooltip (L"OSC 2 AM amount [%]"); + m_slider_osc1_am_amt1->setRange (0, 1, 0); + m_slider_osc1_am_amt1->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_osc1_am_amt1->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_osc1_am_amt1->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_osc1_am_amt1->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_osc1_am_amt1->addListener (this); + + addAndMakeVisible (m_label_osc1_am_amt1 = new Label (L"OSC 2 AM amt 2", + L"value")); + m_label_osc1_am_amt1->setFont (Font (14.0000f, Font::plain)); + m_label_osc1_am_amt1->setJustificationType (Justification::centred); + m_label_osc1_am_amt1->setEditable (true, true, false); + m_label_osc1_am_amt1->setColour (TextEditor::textColourId, Colours::black); + m_label_osc1_am_amt1->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_osc1_am_amt1->addListener (this); + + addAndMakeVisible (m_slider_vcf_f_amt1 = new Slider (L"VCF Cutoff amount 2")); + m_slider_vcf_f_amt1->setTooltip (L"VCF Cutoff Amount [%]"); + m_slider_vcf_f_amt1->setRange (0, 1, 0); + m_slider_vcf_f_amt1->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_vcf_f_amt1->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_vcf_f_amt1->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_vcf_f_amt1->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_vcf_f_amt1->addListener (this); + + addAndMakeVisible (m_label_vcf_f_amt1 = new Label (L"VCF Cutoff amount 2", + L"value")); + m_label_vcf_f_amt1->setFont (Font (14.0000f, Font::plain)); + m_label_vcf_f_amt1->setJustificationType (Justification::centred); + m_label_vcf_f_amt1->setEditable (true, true, false); + m_label_vcf_f_amt1->setColour (TextEditor::textColourId, Colours::black); + m_label_vcf_f_amt1->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_vcf_f_amt1->addListener (this); + + addAndMakeVisible (m_slider_vcf_q_amt1 = new Slider (L"VCF Resonance amount 2")); + m_slider_vcf_q_amt1->setTooltip (L"VCF Resonance Amount [%]"); + m_slider_vcf_q_amt1->setRange (0, 1, 0); + m_slider_vcf_q_amt1->setSliderStyle (Slider::RotaryVerticalDrag); + m_slider_vcf_q_amt1->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); + m_slider_vcf_q_amt1->setColour (Slider::rotarySliderFillColourId, Colour (0x7fffffff)); + m_slider_vcf_q_amt1->setColour (Slider::rotarySliderOutlineColourId, Colour (0x66ffffff)); + m_slider_vcf_q_amt1->addListener (this); + + addAndMakeVisible (m_label_vcf_q_amt1 = new Label (L"VCF Resonance amount 2", + L"value")); + m_label_vcf_q_amt1->setFont (Font (14.0000f, Font::plain)); + m_label_vcf_q_amt1->setJustificationType (Justification::centred); + m_label_vcf_q_amt1->setEditable (true, true, false); + m_label_vcf_q_amt1->setColour (TextEditor::textColourId, Colours::black); + m_label_vcf_q_amt1->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_vcf_q_amt1->addListener (this); + + addAndMakeVisible (m_button_mono_retrigger = new ToggleButton (L"Monophonic Retrigger")); + m_button_mono_retrigger->setTooltip (L"This button switches monophonic retrigger mode on and off"); + m_button_mono_retrigger->setButtonText (L"Mono Retrigger"); + m_button_mono_retrigger->setColour (ToggleButton::textColourId, Colours::white); + + addAndMakeVisible (m_label_max_num_voices = new Label (L"Maximum number of voices (Polyphony)", + L"999")); + m_label_max_num_voices->setTooltip (L"Unisono number of voices to allocate"); + m_label_max_num_voices->setFont (Font (14.0000f, Font::plain)); + m_label_max_num_voices->setJustificationType (Justification::centred); + m_label_max_num_voices->setEditable (true, true, false); + m_label_max_num_voices->setColour (TextEditor::textColourId, Colours::black); + m_label_max_num_voices->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_max_num_voices->addListener (this); + + addAndMakeVisible (m_label_num_voices_playing = new Label (L"Number of Voices Playing", + L"0")); + m_label_num_voices_playing->setTooltip (L"Number of voices currently playing"); + m_label_num_voices_playing->setFont (Font (14.0000f, Font::plain)); + m_label_num_voices_playing->setJustificationType (Justification::centred); + m_label_num_voices_playing->setEditable (true, true, false); + m_label_num_voices_playing->setColour (Label::textColourId, Colours::yellow); + m_label_num_voices_playing->setColour (TextEditor::textColourId, Colours::black); + m_label_num_voices_playing->setColour (TextEditor::backgroundColourId, Colour (0x0)); + m_label_num_voices_playing->addListener (this); + + + //[UserPreSize] + //[/UserPreSize] + + setSize (1120, 720); + + + //[Constructor] You can add your own custom stuff here.. + + // Combobox entries + // WaveTable + if (has_wt) + { + int k = 1; + for (int i=0; i < WT_NUM_WAVETABLES; i++) + { + m_comboBox_osc0_shape->addItem (String(L"WT ") + String::formatted("%02d", k), OSC_WAVEFORM_WAVETABLE+i+1); + m_comboBox_osc1_shape->addItem (String(L"WT ") + String::formatted("%02d", k), OSC_WAVEFORM_WAVETABLE+i+1); + + if (k == 28) + k = 53; + else + k++; + } + } + // Modulation sources + m_mod_src0_names[VOICE_MOD_SRC_0_DISABLED] = String(L"Off"); + m_mod_src0_names[VOICE_MOD_SRC_0_LFO_0] = String(L"LFO 1"); + m_mod_src0_names[VOICE_MOD_SRC_0_LFO_1] = String(L"LFO 2"); + m_mod_src0_names[VOICE_MOD_SRC_0_LFO_2] = String(L"LFO 3"); + m_mod_src0_names[VOICE_MOD_SRC_0_LFO_3] = String(L"LFO 4"); + m_mod_src0_names[VOICE_MOD_SRC_0_ENV_0] = String(L"VCF ENV"); + m_mod_src0_names[VOICE_MOD_SRC_0_ENV_1] = String(L"VCA ENV"); + m_mod_src0_names[VOICE_MOD_SRC_0_ENV_2] = String(L"ENV 3"); + m_mod_src0_names[VOICE_MOD_SRC_0_ENV_3] = String(L"ENV 4"); + m_mod_src0_names[VOICE_MOD_SRC_0_VCO_0] = String(L"VCO 1"); + + m_mod_src1_names[VOICE_MOD_SRC_1_DISABLED] = String(L"Off"); + m_mod_src1_names[VOICE_MOD_SRC_1_LFO_0] = String(L"LFO 1"); + m_mod_src1_names[VOICE_MOD_SRC_1_LFO_1] = String(L"LFO 2"); + m_mod_src1_names[VOICE_MOD_SRC_1_LFO_2] = String(L"LFO 3"); + m_mod_src1_names[VOICE_MOD_SRC_1_LFO_3] = String(L"LFO 4"); + m_mod_src1_names[VOICE_MOD_SRC_1_ENV_0] = String(L"VCF ENV"); + m_mod_src1_names[VOICE_MOD_SRC_1_ENV_1] = String(L"VCA ENV"); + m_mod_src1_names[VOICE_MOD_SRC_1_ENV_2] = String(L"ENV 3"); + m_mod_src1_names[VOICE_MOD_SRC_1_ENV_3] = String(L"ENV 4"); + + m_mod_src_op_names[VOICE_MOD_SRC_OP_ADD] = String(L"+"); + m_mod_src_op_names[VOICE_MOD_SRC_OP_MUL] = String(L"*"); + + for (int i=0; i < VOICE_NUM_MOD_SOURCES_0; i++) + { + m_mod_src0_cb_names[i] = m_mod_src0_names[i]; + m_comboBox_osc0_am_src0->addItem (m_mod_src0_cb_names[i], i+1); + m_comboBox_osc1_am_src0->addItem (m_mod_src0_cb_names[i], i+1); + m_comboBox_osc0_fm_src0->addItem (m_mod_src0_cb_names[i], i+1); + m_comboBox_osc1_fm_src0->addItem (m_mod_src0_cb_names[i], i+1); + m_comboBox_osc0_pwm_src0->addItem (m_mod_src0_cb_names[i], i+1); + m_comboBox_osc1_pwm_src0->addItem (m_mod_src0_cb_names[i], i+1); + m_comboBox_vcf_f_src0->addItem (m_mod_src0_cb_names[i], i+1); + m_comboBox_vcf_q_src0->addItem (m_mod_src0_cb_names[i], i+1); + m_comboBox_vca_am_src0->addItem (m_mod_src0_cb_names[i], i+1); + m_comboBox_vca_pan_src0->addItem (m_mod_src0_cb_names[i], i+1); + } + + int k = 0; + m_mod_src1_cb_names[k] = m_mod_src1_names[VOICE_MOD_SRC_1_DISABLED]; + m_comboBox_osc0_am_src1->addItem (m_mod_src1_cb_names[k], 1); + m_comboBox_osc1_am_src1->addItem (m_mod_src1_cb_names[k], 1); + m_comboBox_osc0_fm_src1->addItem (m_mod_src1_cb_names[k], 1); + m_comboBox_osc1_fm_src1->addItem (m_mod_src1_cb_names[k], 1); + m_comboBox_osc0_pwm_src1->addItem (m_mod_src1_cb_names[k], 1); + m_comboBox_osc1_pwm_src1->addItem (m_mod_src1_cb_names[k], 1); + m_comboBox_vcf_f_src1->addItem (m_mod_src1_cb_names[k], 1); + m_comboBox_vcf_q_src1->addItem (m_mod_src1_cb_names[k], 1); + k++; + for (int j=0; j < VOICE_NUM_MOD_OPS; j++) + { + for (int i=1; i < VOICE_NUM_MOD_SOURCES_1; i++) + { + m_mod_src1_cb_names[k] = m_mod_src_op_names[j] + String(" ") + m_mod_src1_names[i]; + m_comboBox_osc0_am_src1->addItem (m_mod_src1_cb_names[k], k+1); + m_comboBox_osc1_am_src1->addItem (m_mod_src1_cb_names[k], k+1); + m_comboBox_osc0_fm_src1->addItem (m_mod_src1_cb_names[k], k+1); + m_comboBox_osc1_fm_src1->addItem (m_mod_src1_cb_names[k], k+1); + m_comboBox_osc0_pwm_src1->addItem (m_mod_src1_cb_names[k], k+1); + m_comboBox_osc1_pwm_src1->addItem (m_mod_src1_cb_names[k], k+1); + m_comboBox_vcf_f_src1->addItem (m_mod_src1_cb_names[k], k+1); + m_comboBox_vcf_q_src1->addItem (m_mod_src1_cb_names[k], k+1); + k++; + } + } + + startTimer (500); +#ifdef DEBUG + m_label_synth_version->setText(String("V ") + String(JucePlugin_VersionString) + String(" (DEBUG)"), true); +#else + m_label_synth_version->setText(String("V ") + String(JucePlugin_VersionString), true); +#endif + m_btn_noise_enable_led->addListener (this); + m_btn_noise_enable_led->setTriggeredOnMouseDown (true); + m_btn_noise_enable_led->setClickingTogglesState(true); + + m_btn_osc0_enable->addListener (this); + m_btn_osc0_enable->setTriggeredOnMouseDown (true); + m_btn_osc0_enable->setClickingTogglesState(true); + + m_btn_osc1_enable->addListener (this); + m_btn_osc1_enable->setTriggeredOnMouseDown (true); + m_btn_osc1_enable->setClickingTogglesState(true); + + m_button_patch_incr->addListener (this); + m_button_patch_decr->addListener (this); + + m_button_humanize_enable->addListener (this); + m_button_humanize_enable->setTriggeredOnMouseDown (true); + m_button_humanize_enable->setClickingTogglesState(true); + + m_button_mono_enable->addListener (this); + m_button_mono_enable->setTriggeredOnMouseDown (true); + m_button_mono_enable->setClickingTogglesState(true); + + m_button_mono_retrigger->addListener (this); + m_button_mono_retrigger->setTriggeredOnMouseDown (true); + m_button_mono_retrigger->setClickingTogglesState(true); + + m_button_unisono_enable->addListener (this); + m_button_unisono_enable->setTriggeredOnMouseDown (true); + m_button_unisono_enable->setClickingTogglesState(true); + + m_button_osc0_restart_enable->addListener (this); + m_button_osc0_restart_enable->setTriggeredOnMouseDown (true); + m_button_osc0_restart_enable->setClickingTogglesState(true); + + m_button_osc1_restart_enable->addListener (this); + m_button_osc1_restart_enable->setTriggeredOnMouseDown (true); + m_button_osc1_restart_enable->setClickingTogglesState(true); + + m_button_lfo0_restart_enable->addListener (this); + m_button_lfo0_restart_enable->setTriggeredOnMouseDown (true); + m_button_lfo0_restart_enable->setClickingTogglesState(true); + + m_button_lfo1_restart_enable->addListener (this); + m_button_lfo1_restart_enable->setTriggeredOnMouseDown (true); + m_button_lfo1_restart_enable->setClickingTogglesState(true); + + m_button_lfo2_restart_enable->addListener (this); + m_button_lfo2_restart_enable->setTriggeredOnMouseDown (true); + m_button_lfo2_restart_enable->setClickingTogglesState(true); + + m_button_lfo3_restart_enable->addListener (this); + m_button_lfo3_restart_enable->setTriggeredOnMouseDown (true); + m_button_lfo3_restart_enable->setClickingTogglesState(true); + + m_button_lfo0_individual_enable->addListener (this); + m_button_lfo0_individual_enable->setTriggeredOnMouseDown (true); + m_button_lfo0_individual_enable->setClickingTogglesState(true); + + m_button_lfo1_individual_enable->addListener (this); + m_button_lfo1_individual_enable->setTriggeredOnMouseDown (true); + m_button_lfo1_individual_enable->setClickingTogglesState(true); + + m_button_lfo2_individual_enable->addListener (this); + m_button_lfo2_individual_enable->setTriggeredOnMouseDown (true); + m_button_lfo2_individual_enable->setClickingTogglesState(true); + + m_button_lfo3_individual_enable->addListener (this); + m_button_lfo3_individual_enable->setTriggeredOnMouseDown (true); + m_button_lfo3_individual_enable->setClickingTogglesState(true); + + m_label_synth_name->setTooltip(String("Jay Synth V ") + String(JucePlugin_VersionString) + String(", 2012, Jens Ahrensfeld")); + m_tooltipWindow = new TooltipWindow (this, 700); + m_MidiCC_PopUp = 0; + m_VelKey_PopUp = 0; + + // -------------------------------------------------------------------- + // Buttons + // -------------------------------------------------------------------- + m_btn_osc0_enable->setComponentID(String("BUTTON ") + String(SYNTH_PARAM_OSC_0_ENABLE)); + m_btn_osc1_enable->setComponentID(String("BUTTON ") + String(SYNTH_PARAM_OSC_1_ENABLE)); + m_btn_noise_enable_led->setComponentID(String("BUTTON ") + String(SYNTH_PARAM_NOISE_ENABLE)); + m_button_humanize_enable->setComponentID(String("BUTTON ") + String(SYNTH_PARAM_HUMANIZE_ENABLE)); + m_button_mono_enable->setComponentID(String("BUTTON ") + String(SYNTH_PARAM_MONOPHONIC_ENABLE)); + m_button_mono_retrigger->setComponentID(String("BUTTON ") + String(SYNTH_PARAM_MONOPHONIC_RETRIGGER_ENABLE)); + m_button_unisono_enable->setComponentID(String("BUTTON ") + String(SYNTH_PARAM_UNISONO_ENABLE)); + + m_button_osc0_restart_enable->setComponentID(String("BUTTON ") + String(SYNTH_PARAM_OSC_0_RESTART_ON_TRIGGER)); + m_button_osc1_restart_enable->setComponentID(String("BUTTON ") + String(SYNTH_PARAM_OSC_1_RESTART_ON_TRIGGER)); + + m_button_lfo0_restart_enable->setComponentID(String("BUTTON ") + String(SYNTH_PARAM_LFO_0_SYNC)); + m_button_lfo1_restart_enable->setComponentID(String("BUTTON ") + String(SYNTH_PARAM_LFO_1_SYNC)); + m_button_lfo2_restart_enable->setComponentID(String("BUTTON ") + String(SYNTH_PARAM_LFO_2_SYNC)); + m_button_lfo3_restart_enable->setComponentID(String("BUTTON ") + String(SYNTH_PARAM_LFO_3_SYNC)); + + m_button_lfo0_individual_enable->setComponentID(String("BUTTON ") + String(SYNTH_PARAM_LFO_0_MODE)); + m_button_lfo1_individual_enable->setComponentID(String("BUTTON ") + String(SYNTH_PARAM_LFO_1_MODE)); + m_button_lfo2_individual_enable->setComponentID(String("BUTTON ") + String(SYNTH_PARAM_LFO_2_MODE)); + m_button_lfo3_individual_enable->setComponentID(String("BUTTON ") + String(SYNTH_PARAM_LFO_3_MODE)); + + // -------------------------------------------------------------------- + // Sliders + // -------------------------------------------------------------------- + m_slider_master_volume->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_VOLUME)); + m_slider_master_tune->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_TUNE)); + m_slider_humanize_var_vco->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_HUMANIZE_VAR_VCO)); + m_slider_humanize_var_vcf->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_HUMANIZE_VAR_VCF)); + m_slider_humanize_var_env->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_HUMANIZE_VAR_ENV)); + m_slider_voice_pan_spread->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_VOICE_PAN_SPREAD)); + m_slider_portamento_time->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_PORTAMENTO_TIME)); + + m_slider_osc0_level->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_OSC_0_LEVEL)); + m_slider_osc1_level->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_OSC_1_LEVEL)); + m_slider_osc0_dutycycle->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_OSC_0_DUTYCYCLE)); + m_slider_osc1_dutycycle->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_OSC_1_DUTYCYCLE)); + m_slider_osc0_det->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_OSC_0_DETUNE)); + m_slider_osc1_det->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_OSC_1_DETUNE)); + m_slider_osc0_transpose->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_OSC_0_TRANSPOSE)); + m_slider_osc1_transpose->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_OSC_1_TRANSPOSE)); + + m_slider_osc0_fm_amt0->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_OSC_0_FM_AMT_0)); + m_slider_osc1_fm_amt0->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_OSC_1_FM_AMT_0)); + m_slider_osc0_am_amt0->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_OSC_0_AM_AMT_0)); + m_slider_osc1_am_amt0->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_OSC_1_AM_AMT_0)); + m_slider_osc0_pwm_amt0->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_OSC_0_PWM_AMT_0)); + m_slider_osc1_pwm_amt0->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_OSC_1_PWM_AMT_0)); + + m_slider_osc0_fm_amt1->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_OSC_0_FM_AMT_1)); + m_slider_osc1_fm_amt1->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_OSC_1_FM_AMT_1)); + m_slider_osc0_am_amt1->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_OSC_0_AM_AMT_1)); + m_slider_osc1_am_amt1->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_OSC_1_AM_AMT_1)); + m_slider_osc0_pwm_amt1->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_OSC_0_PWM_AMT_1)); + m_slider_osc1_pwm_amt1->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_OSC_1_PWM_AMT_1)); + + m_slider_noise_level->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_NOISE_LEVEL)); + m_slider_vca_env_amount->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_VCA_ENV_AMT)); + m_slider_vca_am_amt0->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_VCA_AM_AMT_0)); + m_slider_vca_pan_amt0->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_VCA_PAN_AMT_0)); + + m_slider_vca_env_attack->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_VCA_ENV_A)); + m_slider_vca_env_decay->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_VCA_ENV_D)); + m_slider_vca_env_sustain->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_VCA_ENV_S)); + m_slider_vca_env_release->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_VCA_ENV_R)); + + m_slider_vcf_env_attack->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_VCF_ENV_A)); + m_slider_vcf_env_decay->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_VCF_ENV_D)); + m_slider_vcf_env_sustain->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_VCF_ENV_S)); + m_slider_vcf_env_release->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_VCF_ENV_R)); + + m_slider_env2_attack->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_ENV_2_A)); + m_slider_env2_decay->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_ENV_2_D)); + m_slider_env2_sustain->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_ENV_2_S)); + m_slider_env2_release->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_ENV_2_R)); + + m_slider_env3_attack->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_ENV_3_A)); + m_slider_env3_decay->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_ENV_3_D)); + m_slider_env3_sustain->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_ENV_3_S)); + m_slider_env3_release->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_ENV_3_R)); + + m_slider_vcf_f->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_VCF_F)); + m_slider_vcf_q->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_VCF_Q)); + m_slider_vcf_env_amount->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_VCF_ENV_AMT)); + + m_slider_vcf_f_amt0->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_VCF_F_AMT_0)); + m_slider_vcf_q_amt0->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_VCF_Q_AMT_0)); + m_slider_vcf_f_amt1->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_VCF_F_AMT_1)); + m_slider_vcf_q_amt1->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_VCF_Q_AMT_1)); + + m_slider_lfo0_speed->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_LFO_0_SPEED)); + m_slider_lfo1_speed->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_LFO_1_SPEED)); + m_slider_lfo2_speed->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_LFO_2_SPEED)); + m_slider_lfo3_speed->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_LFO_3_SPEED)); + m_slider_lfo0_smooth->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_LFO_0_SMOOTH)); + m_slider_lfo1_smooth->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_LFO_1_SMOOTH)); + m_slider_lfo2_smooth->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_LFO_2_SMOOTH)); + m_slider_lfo3_smooth->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_LFO_3_SMOOTH)); + m_slider_lfo0_delay->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_LFO_0_DELAY)); + m_slider_lfo1_delay->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_LFO_1_DELAY)); + m_slider_lfo2_delay->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_LFO_2_DELAY)); + m_slider_lfo3_delay->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_LFO_3_DELAY)); + m_slider_lfo0_attack->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_LFO_0_ATTACK)); + m_slider_lfo1_attack->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_LFO_1_ATTACK)); + m_slider_lfo2_attack->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_LFO_2_ATTACK)); + m_slider_lfo3_attack->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_LFO_3_ATTACK)); + m_slider_lfo0_symmetry->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_LFO_0_SYMMETRY)); + m_slider_lfo1_symmetry->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_LFO_1_SYMMETRY)); + m_slider_lfo2_symmetry->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_LFO_2_SYMMETRY)); + m_slider_lfo3_symmetry->setComponentID(String("SLIDER ") + String(SYNTH_PARAM_LFO_3_SYMMETRY)); + + // -------------------------------------------------------------------- + // Labels + // -------------------------------------------------------------------- + m_label_master_volume->setComponentID(String("LABEL ") + String(SYNTH_PARAM_VOLUME)); + m_label_master_tune->setComponentID(String("LABEL ") + String(SYNTH_PARAM_TUNE)); + m_label_humanize_var_vco->setComponentID(String("LABEL ") + String(SYNTH_PARAM_HUMANIZE_VAR_VCO)); + m_label_humanize_var_vcf->setComponentID(String("LABEL ") + String(SYNTH_PARAM_HUMANIZE_VAR_VCF)); + m_label_humanize_var_env->setComponentID(String("LABEL ") + String(SYNTH_PARAM_HUMANIZE_VAR_ENV)); + m_label_voice_pan_spread->setComponentID(String("LABEL ") + String(SYNTH_PARAM_VOICE_PAN_SPREAD)); + m_label_portamento_time->setComponentID(String("LABEL ") + String(SYNTH_PARAM_PORTAMENTO_TIME)); + m_label_unisono_num_voices->setComponentID(String("LABEL ") + String(SYNTH_PARAM_UNISONO_NUM_VOICES)); + m_label_max_num_voices->setComponentID(String("LABEL ") + String(SYNTH_PARAM_TOTAL_NUM_VOICES)); + + m_label_osc0_level->setComponentID(String("LABEL ") + String(SYNTH_PARAM_OSC_0_LEVEL)); + m_label_osc1_level->setComponentID(String("LABEL ") + String(SYNTH_PARAM_OSC_1_LEVEL)); + m_label_osc0_dutycycle->setComponentID(String("LABEL ") + String(SYNTH_PARAM_OSC_0_DUTYCYCLE)); + m_label_osc1_dutycycle->setComponentID(String("LABEL ") + String(SYNTH_PARAM_OSC_1_DUTYCYCLE)); + m_label_osc0_det->setComponentID(String("LABEL ") + String(SYNTH_PARAM_OSC_0_DETUNE)); + m_label_osc1_det->setComponentID(String("LABEL ") + String(SYNTH_PARAM_OSC_1_DETUNE)); + m_label_osc0_transpose->setComponentID(String("LABEL ") + String(SYNTH_PARAM_OSC_0_TRANSPOSE)); + m_label_osc1_transpose->setComponentID(String("LABEL ") + String(SYNTH_PARAM_OSC_1_TRANSPOSE)); + + m_label_osc0_pb_min->setComponentID(String("LABEL ") + String(SYNTH_PARAM_OSC_0_PB_RANGE_MIN)); + m_label_osc0_pb_max->setComponentID(String("LABEL ") + String(SYNTH_PARAM_OSC_0_PB_RANGE_MAX)); + m_label_osc1_pb_min->setComponentID(String("LABEL ") + String(SYNTH_PARAM_OSC_1_PB_RANGE_MIN)); + m_label_osc1_pb_max->setComponentID(String("LABEL ") + String(SYNTH_PARAM_OSC_1_PB_RANGE_MAX)); + + m_label_osc0_fm_amt0->setComponentID(String("LABEL ") + String(SYNTH_PARAM_OSC_0_FM_AMT_0)); + m_label_osc1_fm_amt0->setComponentID(String("LABEL ") + String(SYNTH_PARAM_OSC_1_FM_AMT_0)); + m_label_osc0_am_amt0->setComponentID(String("LABEL ") + String(SYNTH_PARAM_OSC_0_AM_AMT_0)); + m_label_osc1_am_amt0->setComponentID(String("LABEL ") + String(SYNTH_PARAM_OSC_1_AM_AMT_0)); + m_label_osc0_pwm_amt0->setComponentID(String("LABEL ") + String(SYNTH_PARAM_OSC_0_PWM_AMT_0)); + m_label_osc1_pwm_amt0->setComponentID(String("LABEL ") + String(SYNTH_PARAM_OSC_1_PWM_AMT_0)); + + m_label_osc0_fm_amt1->setComponentID(String("LABEL ") + String(SYNTH_PARAM_OSC_0_FM_AMT_1)); + m_label_osc1_fm_amt1->setComponentID(String("LABEL ") + String(SYNTH_PARAM_OSC_1_FM_AMT_1)); + m_label_osc0_am_amt1->setComponentID(String("LABEL ") + String(SYNTH_PARAM_OSC_0_AM_AMT_1)); + m_label_osc1_am_amt1->setComponentID(String("LABEL ") + String(SYNTH_PARAM_OSC_1_AM_AMT_1)); + m_label_osc0_pwm_amt1->setComponentID(String("LABEL ") + String(SYNTH_PARAM_OSC_0_PWM_AMT_1)); + m_label_osc1_pwm_amt1->setComponentID(String("LABEL ") + String(SYNTH_PARAM_OSC_1_PWM_AMT_1)); + + m_label_noise_level->setComponentID(String("LABEL ") + String(SYNTH_PARAM_NOISE_LEVEL)); + m_label_vca_env_amount->setComponentID(String("LABEL ") + String(SYNTH_PARAM_VCA_ENV_AMT)); + m_label_vca_am_amt0->setComponentID(String("LABEL ") + String(SYNTH_PARAM_VCA_AM_AMT_0)); + m_label_vca_pan_amt0->setComponentID(String("LABEL ") + String(SYNTH_PARAM_VCA_PAN_AMT_0)); + + m_label_vca_env_attack->setComponentID(String("LABEL ") + String(SYNTH_PARAM_VCA_ENV_A)); + m_label_vca_env_decay->setComponentID(String("LABEL ") + String(SYNTH_PARAM_VCA_ENV_D)); + m_label_vca_env_sustain->setComponentID(String("LABEL ") + String(SYNTH_PARAM_VCA_ENV_S)); + m_label_vca_env_release->setComponentID(String("LABEL ") + String(SYNTH_PARAM_VCA_ENV_R)); + + m_label_vcf_env_attack->setComponentID(String("LABEL ") + String(SYNTH_PARAM_VCF_ENV_A)); + m_label_vcf_env_decay->setComponentID(String("LABEL ") + String(SYNTH_PARAM_VCF_ENV_D)); + m_label_vcf_env_sustain->setComponentID(String("LABEL ") + String(SYNTH_PARAM_VCF_ENV_S)); + m_label_vcf_env_release->setComponentID(String("LABEL ") + String(SYNTH_PARAM_VCF_ENV_R)); + + m_label_env2_attack->setComponentID(String("LABEL ") + String(SYNTH_PARAM_ENV_2_A)); + m_label_env2_decay->setComponentID(String("LABEL ") + String(SYNTH_PARAM_ENV_2_D)); + m_label_env2_sustain->setComponentID(String("LABEL ") + String(SYNTH_PARAM_ENV_2_S)); + m_label_env2_release->setComponentID(String("LABEL ") + String(SYNTH_PARAM_ENV_2_R)); + + m_label_env3_attack->setComponentID(String("LABEL ") + String(SYNTH_PARAM_ENV_3_A)); + m_label_env3_decay->setComponentID(String("LABEL ") + String(SYNTH_PARAM_ENV_3_D)); + m_label_env3_sustain->setComponentID(String("LABEL ") + String(SYNTH_PARAM_ENV_3_S)); + m_label_env3_release->setComponentID(String("LABEL ") + String(SYNTH_PARAM_ENV_3_R)); + + m_label_vcf_f->setComponentID(String("LABEL ") + String(SYNTH_PARAM_VCF_F)); + m_label_vcf_q->setComponentID(String("LABEL ") + String(SYNTH_PARAM_VCF_Q)); + m_label_vcf_env_amount->setComponentID(String("LABEL ") + String(SYNTH_PARAM_VCF_ENV_AMT)); + + m_label_vcf_f_amt0->setComponentID(String("LABEL ") + String(SYNTH_PARAM_VCF_F_AMT_0)); + m_label_vcf_q_amt0->setComponentID(String("LABEL ") + String(SYNTH_PARAM_VCF_Q_AMT_0)); + m_label_vcf_f_amt1->setComponentID(String("LABEL ") + String(SYNTH_PARAM_VCF_F_AMT_1)); + m_label_vcf_q_amt1->setComponentID(String("LABEL ") + String(SYNTH_PARAM_VCF_Q_AMT_1)); + + m_label_lfo0_speed->setComponentID(String("LABEL ") + String(SYNTH_PARAM_LFO_0_SPEED)); + m_label_lfo1_speed->setComponentID(String("LABEL ") + String(SYNTH_PARAM_LFO_1_SPEED)); + m_label_lfo2_speed->setComponentID(String("LABEL ") + String(SYNTH_PARAM_LFO_2_SPEED)); + m_label_lfo3_speed->setComponentID(String("LABEL ") + String(SYNTH_PARAM_LFO_3_SPEED)); + m_label_lfo0_smooth->setComponentID(String("LABEL ") + String(SYNTH_PARAM_LFO_0_SMOOTH)); + m_label_lfo1_smooth->setComponentID(String("LABEL ") + String(SYNTH_PARAM_LFO_1_SMOOTH)); + m_label_lfo2_smooth->setComponentID(String("LABEL ") + String(SYNTH_PARAM_LFO_2_SMOOTH)); + m_label_lfo3_smooth->setComponentID(String("LABEL ") + String(SYNTH_PARAM_LFO_3_SMOOTH)); + m_label_lfo0_delay->setComponentID(String("LABEL ") + String(SYNTH_PARAM_LFO_0_DELAY)); + m_label_lfo1_delay->setComponentID(String("LABEL ") + String(SYNTH_PARAM_LFO_1_DELAY)); + m_label_lfo2_delay->setComponentID(String("LABEL ") + String(SYNTH_PARAM_LFO_2_DELAY)); + m_label_lfo3_delay->setComponentID(String("LABEL ") + String(SYNTH_PARAM_LFO_3_DELAY)); + m_label_lfo0_attack->setComponentID(String("LABEL ") + String(SYNTH_PARAM_LFO_0_ATTACK)); + m_label_lfo1_attack->setComponentID(String("LABEL ") + String(SYNTH_PARAM_LFO_1_ATTACK)); + m_label_lfo2_attack->setComponentID(String("LABEL ") + String(SYNTH_PARAM_LFO_2_ATTACK)); + m_label_lfo3_attack->setComponentID(String("LABEL ") + String(SYNTH_PARAM_LFO_3_ATTACK)); + m_label_lfo0_symmetry->setComponentID(String("LABEL ") + String(SYNTH_PARAM_LFO_0_SYMMETRY)); + m_label_lfo1_symmetry->setComponentID(String("LABEL ") + String(SYNTH_PARAM_LFO_1_SYMMETRY)); + m_label_lfo2_symmetry->setComponentID(String("LABEL ") + String(SYNTH_PARAM_LFO_2_SYMMETRY)); + m_label_lfo3_symmetry->setComponentID(String("LABEL ") + String(SYNTH_PARAM_LFO_3_SYMMETRY)); + + // -------------------------------------------------------------------- + // Comboboxes + // -------------------------------------------------------------------- + m_comboBox_osc0_shape->setComponentID(String("COMBOBOX ") + String(SYNTH_PARAM_OSC_0_WAVEFORM)); + m_comboBox_osc1_shape->setComponentID(String("COMBOBOX ") + String(SYNTH_PARAM_OSC_1_WAVEFORM)); + m_comboBox_osc0_fm_src0->setComponentID(String("COMBOBOX ") + String(SYNTH_PARAM_OSC_0_FM_SRC_0)); + m_comboBox_osc1_fm_src0->setComponentID(String("COMBOBOX ") + String(SYNTH_PARAM_OSC_1_FM_SRC_0)); + m_comboBox_osc0_fm_src1->setComponentID(String("COMBOBOX ") + String(SYNTH_PARAM_OSC_0_FM_SRC_1)); + m_comboBox_osc1_fm_src1->setComponentID(String("COMBOBOX ") + String(SYNTH_PARAM_OSC_1_FM_SRC_1)); + m_comboBox_osc0_am_src0->setComponentID(String("COMBOBOX ") + String(SYNTH_PARAM_OSC_0_AM_SRC_0)); + m_comboBox_osc1_am_src0->setComponentID(String("COMBOBOX ") + String(SYNTH_PARAM_OSC_1_AM_SRC_0)); + m_comboBox_osc0_am_src1->setComponentID(String("COMBOBOX ") + String(SYNTH_PARAM_OSC_0_AM_SRC_1)); + m_comboBox_osc1_am_src1->setComponentID(String("COMBOBOX ") + String(SYNTH_PARAM_OSC_1_AM_SRC_1)); + m_comboBox_osc0_pwm_src0->setComponentID(String("COMBOBOX ") + String(SYNTH_PARAM_OSC_0_PWM_SRC_0)); + m_comboBox_osc1_pwm_src0->setComponentID(String("COMBOBOX ") + String(SYNTH_PARAM_OSC_1_PWM_SRC_0)); + m_comboBox_osc0_pwm_src1->setComponentID(String("COMBOBOX ") + String(SYNTH_PARAM_OSC_0_PWM_SRC_1)); + m_comboBox_osc1_pwm_src1->setComponentID(String("COMBOBOX ") + String(SYNTH_PARAM_OSC_1_PWM_SRC_1)); + m_comboBox_noise_shape->setComponentID(String("COMBOBOX ") + String(SYNTH_PARAM_NOISE_SHAPE)); + m_comboBox_vca_am_src0->setComponentID(String("COMBOBOX ") + String(SYNTH_PARAM_VCA_AM_SRC_0)); + m_comboBox_vca_pan_src0->setComponentID(String("COMBOBOX ") + String(SYNTH_PARAM_VCA_PAN_SRC_0)); + m_comboBox_vcf_type->setComponentID(String("COMBOBOX ") + String(SYNTH_PARAM_VCF_TYPE)); + + m_comboBox_vcf_f_src0->setComponentID(String("COMBOBOX ") + String(SYNTH_PARAM_VCF_F_SRC_0)); + m_comboBox_vcf_f_src1->setComponentID(String("COMBOBOX ") + String(SYNTH_PARAM_VCF_F_SRC_1)); + m_comboBox_vcf_q_src0->setComponentID(String("COMBOBOX ") + String(SYNTH_PARAM_VCF_Q_SRC_0)); + m_comboBox_vcf_q_src1->setComponentID(String("COMBOBOX ") + String(SYNTH_PARAM_VCF_Q_SRC_1)); + + m_comboBox_lfo0_shape->setComponentID(String("COMBOBOX ") + String(SYNTH_PARAM_LFO_0_SHAPE)); + m_comboBox_lfo1_shape->setComponentID(String("COMBOBOX ") + String(SYNTH_PARAM_LFO_1_SHAPE)); + m_comboBox_lfo2_shape->setComponentID(String("COMBOBOX ") + String(SYNTH_PARAM_LFO_2_SHAPE)); + m_comboBox_lfo3_shape->setComponentID(String("COMBOBOX ") + String(SYNTH_PARAM_LFO_3_SHAPE)); + m_comboBox_vcf_order->setComponentID(String("COMBOBOX ") + String(SYNTH_PARAM_VCF_ORDER)); + + // -------------------------------------------------------------------- + getProcessor()->addActionListener(this); + + for (int i=0; i < SYNTH_NUM_PARAMS; i++) + { + Button *pButton; + pButton = (Button*)findChildWithID(String("BUTTON ") + String(i)); + if (pButton) + pButton->addMouseListener (this, false); + } + + for (int i=0; i < SYNTH_NUM_PARAMS; i++) + { + Slider *pSlider; + pSlider = (Slider*)findChildWithID(String("SLIDER ") + String(i)); + if (pSlider) + pSlider->addMouseListener (this, false); + + } + + for (int i=0; i < SYNTH_NUM_PARAMS; i++) + { + Label *pLabel; + pLabel = (Label*)findChildWithID(String("LABEL ") + String(i)); + if (pLabel) + pLabel->addMouseListener (this, false); + } + + for (int i=0; i < SYNTH_NUM_PARAMS; i++) + { + ComboBox *pComboBox; + pComboBox = (ComboBox*)findChildWithID(String("COMBOBOX ") + String(i)); + if (pComboBox) + pComboBox->addMouseListener (this, false); + } + + //[/Constructor] +} + +JaySynthAudioProcessorEditor::~JaySynthAudioProcessorEditor() +{ + //[Destructor_pre]. You can add your own custom destruction code here.. + getProcessor()->removeActionListener(this); + deleteAndZero(m_tooltipWindow); + deleteAndZero(m_MidiCC_PopUp); + deleteAndZero(m_VelKey_PopUp); + //[/Destructor_pre] + + deleteAndZero (m_label_colon); + deleteAndZero (m_slider_master_volume); + deleteAndZero (m_slider_vcf_f); + deleteAndZero (m_slider_vcf_q); + deleteAndZero (m_slider_osc0_det); + deleteAndZero (m_slider_osc1_det); + deleteAndZero (m_slider_osc0_transpose); + deleteAndZero (m_slider_osc1_transpose); + deleteAndZero (m_slider_vca_env_attack); + deleteAndZero (m_slider_vca_env_decay); + deleteAndZero (m_slider_vca_env_release); + deleteAndZero (m_slider_vca_env_sustain); + deleteAndZero (m_slider_vcf_env_attack); + deleteAndZero (m_slider_vcf_env_decay); + deleteAndZero (m_slider_vcf_env_release); + deleteAndZero (m_slider_vcf_env_sustain); + deleteAndZero (m_slider_vcf_env_amount); + deleteAndZero (m_label_vcf_env_attack); + deleteAndZero (m_label_vcf_f); + deleteAndZero (m_label_vca_env_attack); + deleteAndZero (m_label_vca_env_decay); + deleteAndZero (m_label_vca_env_sustain); + deleteAndZero (m_label_vca_env_release); + deleteAndZero (m_label_vcf_env_decay); + deleteAndZero (m_label_vcf_env_sustain); + deleteAndZero (m_label_vcf_env_release); + deleteAndZero (m_label_vcf_q); + deleteAndZero (m_label_vcf_env_amount); + deleteAndZero (m_label_master_volume); + deleteAndZero (m_label_osc0_transpose); + deleteAndZero (m_label_osc1_transpose); + deleteAndZero (m_label_osc0_det); + deleteAndZero (m_label_osc1_det); + deleteAndZero (m_slider_vca_env_amount); + deleteAndZero (m_label_vca_env_amount); + deleteAndZero (m_slider_osc0_dutycycle); + deleteAndZero (m_slider_osc1_dutycycle); + deleteAndZero (m_label_osc0_dutycycle); + deleteAndZero (m_label_osc1_dutycycle); + deleteAndZero (m_slider_lfo0_speed); + deleteAndZero (m_slider_osc1_fm_amt0); + deleteAndZero (m_slider_osc0_fm_amt0); + deleteAndZero (m_label_lfo0_speed); + deleteAndZero (m_label_osc0_fm_amt0); + deleteAndZero (m_label_osc1_fm_amt0); + deleteAndZero (m_slider_vcf_f_amt0); + deleteAndZero (m_label_vcf_f_amt0); + deleteAndZero (m_slider_lfo1_speed); + deleteAndZero (m_label_lfo1_speed); + deleteAndZero (m_comboBox_osc0_shape); + deleteAndZero (m_comboBox_osc1_shape); + deleteAndZero (m_comboBox_lfo0_shape); + deleteAndZero (m_comboBox_lfo1_shape); + deleteAndZero (m_slider_lfo2_speed); + deleteAndZero (m_slider_lfo3_speed); + deleteAndZero (m_comboBox_lfo2_shape); + deleteAndZero (m_comboBox_lfo3_shape); + deleteAndZero (m_label_lfo2_speed); + deleteAndZero (m_label_lfo3_speed); + deleteAndZero (m_comboBox_vcf_f_src0); + deleteAndZero (m_comboBox_osc0_fm_src0); + deleteAndZero (m_comboBox_osc1_fm_src0); + deleteAndZero (m_slider_vca_am_amt0); + deleteAndZero (m_label_vca_am_amt0); + deleteAndZero (m_comboBox_vca_am_src0); + deleteAndZero (m_slider_vca_pan_amt0); + deleteAndZero (m_label_vca_pan_amt0); + deleteAndZero (m_comboBox_vca_pan_src0); + deleteAndZero (m_label_synth_name); + deleteAndZero (m_label_synth_version); + deleteAndZero (m_comboBox_vcf_type); + deleteAndZero (m_slider_lfo1_smooth); + deleteAndZero (m_label_lfo1_smooth); + deleteAndZero (m_slider_lfo0_smooth); + deleteAndZero (m_label_lfo0_smooth); + deleteAndZero (m_slider_lfo2_smooth); + deleteAndZero (m_label_lfo2_smooth); + deleteAndZero (m_slider_lfo3_smooth); + deleteAndZero (m_label_lfo3_smooth); + deleteAndZero (m_slider_osc0_pwm_amt0); + deleteAndZero (m_label_osc0_pwm_amt0); + deleteAndZero (m_slider_osc1_pwm_amt0); + deleteAndZero (m_label_osc1_pwm_amt0); + deleteAndZero (m_comboBox_osc0_pwm_src0); + deleteAndZero (m_comboBox_osc1_pwm_src0); + deleteAndZero (m_slider_osc0_level); + deleteAndZero (m_label_osc0_level); + deleteAndZero (m_slider_osc1_level); + deleteAndZero (m_label_osc1_level); + deleteAndZero (m_slider_noise_level); + deleteAndZero (m_label_noise_level); + deleteAndZero (m_comboBox_noise_shape); + deleteAndZero (m_btn_noise_enable_led); + deleteAndZero (m_btn_osc0_enable); + deleteAndZero (m_btn_osc1_enable); + deleteAndZero (m_label_patch_name); + deleteAndZero (m_button_patch_incr); + deleteAndZero (m_button_patch_decr); + deleteAndZero (m_label_patch_number); + deleteAndZero (m_label_osc1_pb_min); + deleteAndZero (m_label_osc1_pb_max); + deleteAndZero (m_label_osc0_pb_max); + deleteAndZero (m_label_osc0_pb_min); + deleteAndZero (m_slider_master_tune); + deleteAndZero (m_label_master_tune); + deleteAndZero (m_button_humanize_enable); + deleteAndZero (m_comboBox_vcf_order); + deleteAndZero (m_slider_portamento_time); + deleteAndZero (m_label_portamento_time); + deleteAndZero (m_button_unisono_enable); + deleteAndZero (m_slider_humanize_var_vco); + deleteAndZero (m_slider_voice_pan_spread); + deleteAndZero (m_label_voice_pan_spread); + deleteAndZero (m_slider_humanize_var_vcf); + deleteAndZero (m_slider_humanize_var_env); + deleteAndZero (m_label_unisono_num_voices); + deleteAndZero (m_button_osc0_restart_enable); + deleteAndZero (m_button_osc1_restart_enable); + deleteAndZero (m_button_mono_enable); + deleteAndZero (m_comboBox_osc1_fm_src1); + deleteAndZero (m_comboBox_osc1_pwm_src1); + deleteAndZero (m_comboBox_osc0_fm_src1); + deleteAndZero (m_comboBox_osc0_pwm_src1); + deleteAndZero (m_comboBox_osc1_am_src0); + deleteAndZero (m_comboBox_osc1_am_src1); + deleteAndZero (m_slider_osc1_am_amt0); + deleteAndZero (m_label_osc1_am_amt0); + deleteAndZero (m_comboBox_osc0_am_src0); + deleteAndZero (m_comboBox_osc0_am_src1); + deleteAndZero (m_slider_osc0_am_amt0); + deleteAndZero (m_label_osc0_am_amt0); + deleteAndZero (m_slider_env2_attack); + deleteAndZero (m_slider_env2_decay); + deleteAndZero (m_slider_env2_release); + deleteAndZero (m_slider_env2_sustain); + deleteAndZero (m_label_env2_attack); + deleteAndZero (m_label_env2_decay); + deleteAndZero (m_label_env2_sustain); + deleteAndZero (m_label_env2_release); + deleteAndZero (m_slider_env3_attack); + deleteAndZero (m_slider_env3_decay); + deleteAndZero (m_slider_env3_release); + deleteAndZero (m_slider_env3_sustain); + deleteAndZero (m_label_env3_attack); + deleteAndZero (m_label_env3_decay); + deleteAndZero (m_label_env3_sustain); + deleteAndZero (m_label_env3_release); + deleteAndZero (m_comboBox_vcf_f_src1); + deleteAndZero (m_slider_vcf_q_amt0); + deleteAndZero (m_label_vcf_q_amt0); + deleteAndZero (m_comboBox_vcf_q_src0); + deleteAndZero (m_comboBox_vcf_q_src1); + deleteAndZero (m_label_humanize_var_vco); + deleteAndZero (m_label_humanize_var_vcf); + deleteAndZero (m_label_humanize_var_env); + deleteAndZero (m_btn_limiter_led); + deleteAndZero (m_label_limiter_led); + deleteAndZero (m_slider_lfo0_delay); + deleteAndZero (m_label_lfo0_delay); + deleteAndZero (m_slider_lfo0_attack); + deleteAndZero (m_label_lfo0_attack); + deleteAndZero (m_slider_lfo1_delay); + deleteAndZero (m_label_lfo1_delay); + deleteAndZero (m_slider_lfo1_attack); + deleteAndZero (m_label_lfo1_attack); + deleteAndZero (m_slider_lfo2_delay); + deleteAndZero (m_label_lfo2_delay); + deleteAndZero (m_slider_lfo2_attack); + deleteAndZero (m_label_lfo2_attack); + deleteAndZero (m_slider_lfo3_delay); + deleteAndZero (m_label_lfo3_delay); + deleteAndZero (m_slider_lfo3_attack); + deleteAndZero (m_label_lfo3_attack); + deleteAndZero (m_button_lfo0_restart_enable); + deleteAndZero (m_button_lfo0_individual_enable); + deleteAndZero (m_slider_lfo0_symmetry); + deleteAndZero (m_label_lfo0_symmetry); + deleteAndZero (m_slider_lfo1_symmetry); + deleteAndZero (m_label_lfo1_symmetry); + deleteAndZero (m_button_lfo1_restart_enable); + deleteAndZero (m_button_lfo1_individual_enable); + deleteAndZero (m_button_lfo2_restart_enable); + deleteAndZero (m_button_lfo2_individual_enable); + deleteAndZero (m_slider_lfo2_symmetry); + deleteAndZero (m_label_lfo2_symmetry); + deleteAndZero (m_slider_lfo3_symmetry); + deleteAndZero (m_label_lfo3_symmetry); + deleteAndZero (m_button_lfo3_restart_enable); + deleteAndZero (m_button_lfo3_individual_enable); + deleteAndZero (m_slider_osc0_fm_amt1); + deleteAndZero (m_label_osc0_fm_amt1); + deleteAndZero (m_slider_osc0_pwm_amt1); + deleteAndZero (m_label_osc0_pwm_amt1); + deleteAndZero (m_slider_osc0_am_amt1); + deleteAndZero (m_label_osc0_am_amt1); + deleteAndZero (m_slider_osc1_fm_amt1); + deleteAndZero (m_label_osc1_fm_amt1); + deleteAndZero (m_slider_osc1_pwm_amt1); + deleteAndZero (m_label_osc1_pwm_amt1); + deleteAndZero (m_slider_osc1_am_amt1); + deleteAndZero (m_label_osc1_am_amt1); + deleteAndZero (m_slider_vcf_f_amt1); + deleteAndZero (m_label_vcf_f_amt1); + deleteAndZero (m_slider_vcf_q_amt1); + deleteAndZero (m_label_vcf_q_amt1); + deleteAndZero (m_button_mono_retrigger); + deleteAndZero (m_label_max_num_voices); + deleteAndZero (m_label_num_voices_playing); + + + //[Destructor]. You can add your own custom destruction code here.. + //[/Destructor] +} + +//============================================================================== +void JaySynthAudioProcessorEditor::paint (Graphics& g) +{ + //[UserPrePaint] Add your own custom painting code here.. + //[/UserPrePaint] + + g.fillAll (Colour (0xff8b94bd)); + + g.setColour (Colour (0xff2a64a5)); + g.fillRoundedRectangle (644.0f, 4.0f, 80.0f, 310.0f, 10.0000f); + + g.setColour (Colour (0xff2a64a5)); + g.fillRoundedRectangle (644.0f, 318.0f, 80.0f, 310.0f, 10.0000f); + + g.setColour (Colour (0xff2a64a5)); + g.fillRoundedRectangle (962.0f, 4.0f, 154.0f, 310.0f, 10.0000f); + + g.setColour (Colour (0xff2a64a5)); + g.fillRoundedRectangle (962.0f, 318.0f, 154.0f, 310.0f, 10.0000f); + + g.setColour (Colour (0xff2a64a5)); + g.fillRoundedRectangle (560.0f, 318.0f, 80.0f, 310.0f, 10.0000f); + + g.setColour (Colour (0xff2a64a5)); + g.fillRoundedRectangle (560.0f, 4.0f, 80.0f, 310.0f, 10.0000f); + + g.setColour (Colour (0xff2a64a5)); + g.fillRoundedRectangle (4.0f, 632.0f, 1112.0f, 84.0f, 10.0000f); + + g.setColour (Colour (0xff2a64a5)); + g.fillRoundedRectangle (4.0f, 318.0f, 324.0f, 310.0f, 10.0000f); + + g.setColour (Colour (0xff2a64a5)); + g.fillRoundedRectangle (446.0f, 318.0f, 110.0f, 310.0f, 10.0000f); + + g.setColour (Colour (0xff2a64a5)); + g.fillRoundedRectangle (446.0f, 4.0f, 110.0f, 310.0f, 10.0000f); + + g.setColour (Colours::black); + g.setFont (Font (15.0000f, Font::plain)); + g.drawText (L"OSC 1 tune", + 12, -108, 76, 30, + Justification::centred, true); + + g.setColour (Colour (0xff2a64a5)); + g.fillRoundedRectangle (728.0f, 318.0f, 230.0f, 310.0f, 10.0000f); + + g.setColour (Colours::white); + g.setFont (Font (16.0000f, Font::plain)); + g.drawText (L"VCA", + 732, 322, 48, 24, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Env. amt.", + 740, 504, 52, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Volume", + 968, 572, 40, 16, + Justification::centred, true); + + g.setColour (Colour (0xff2a64a5)); + g.fillRoundedRectangle (728.0f, 4.0f, 230.0f, 310.0f, 10.0000f); + + g.setColour (Colours::white); + g.setFont (Font (16.0000f, Font::plain)); + g.drawText (L"VCF", + 732, 8, 48, 24, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Env. amt.", + 886, 156, 52, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Reson.", + 816, 88, 44, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Cutoff", + 746, 88, 40, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Sustain", + 664, 222, 40, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Decay", + 664, 156, 40, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Release", + 660, 290, 48, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Attack", + 660, 88, 48, 16, + Justification::centred, true); + + g.setColour (Colour (0xff2a64a5)); + g.fillRoundedRectangle (4.0f, 4.0f, 324.0f, 310.0f, 10.0000f); + + g.setColour (Colours::white); + g.setFont (Font (16.0000f, Font::plain)); + g.drawText (L"VCO 1", + 6, 8, 72, 32, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Detune", + 96, 86, 54, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Transpose", + 246, 154, 58, 16, + Justification::centred, true); + + g.setColour (Colours::white); + g.setFont (Font (16.0000f, Font::plain)); + g.drawText (L"VCO 2", + 6, 322, 72, 32, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Pulse Width", + 160, 86, 68, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Shape", + 242, 86, 64, 16, + Justification::centred, true); + + g.setColour (Colour (0xff2a64a5)); + g.fillRoundedRectangle (332.0f, 4.0f, 110.0f, 310.0f, 10.0000f); + + g.setColour (Colours::white); + g.setFont (Font (16.0000f, Font::plain)); + g.drawText (L"LFO 1", + 336, 8, 60, 24, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"FM amt. 1", + 90, 154, 70, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Speed", + 338, 120, 48, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Shape", + 348, 54, 72, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Mod. amt. 1", + 736, 156, 64, 16, + Justification::centred, true); + + g.setColour (Colour (0xff2a64a5)); + g.fillRoundedRectangle (332.0f, 318.0f, 110.0f, 310.0f, 10.0000f); + + g.setColour (Colours::white); + g.setFont (Font (16.0000f, Font::plain)); + g.drawText (L"LFO 2", + 450, 8, 60, 24, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Polyphon", + 388, 290, 44, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Restart", + 346, 290, 30, 16, + Justification::centred, true); + + g.setColour (Colours::white); + g.setFont (Font (16.0000f, Font::plain)); + g.drawText (L"LFO 3", + 336, 322, 60, 24, + Justification::centred, true); + + g.setColour (Colours::white); + g.setFont (Font (16.0000f, Font::plain)); + g.drawText (L"LFO 4", + 450, 322, 60, 24, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Tremolo", + 736, 402, 60, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Stereo pan", + 810, 402, 60, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"FM Source 1", + 94, 188, 64, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Source", + 804, 436, 72, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Source", + 732, 436, 72, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Source 2", + 732, 290, 72, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"VCF type", + 878, 54, 72, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Smooth", + 386, 120, 44, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"PWM amt. 1", + 160, 154, 70, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"PWM Source 1", + 166, 188, 64, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Level", + 30, 86, 48, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Noise level", + 802, 504, 72, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Noise shape", + 810, 540, 60, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Tune", + 1018, 572, 40, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"VCF Order", + 878, 90, 72, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Portamento", + 1058, 376, 60, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Voice pan.", + 1064, 572, 52, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"VCO hum.", + 966, 504, 44, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"VCF hum.", + 1016, 504, 44, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"ENV hum.", + 1068, 504, 44, 16, + Justification::centred, true); + + g.setColour (Colours::white); + g.setFont (Font (11.0000f, Font::plain)); + g.drawText (L"Unison num. voices :", + 966, 414, 100, 18, + Justification::centredRight, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"FM Source 2", + 94, 290, 64, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"PWM Source 2", + 166, 290, 64, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"AM source 1", + 22, 188, 64, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"AM source 2", + 22, 290, 64, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"AM amt. 1", + 20, 154, 70, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Detune", + 96, 400, 54, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Transpose", + 246, 468, 58, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Pulse Width", + 160, 400, 68, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Shape", + 242, 400, 64, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Level", + 30, 400, 48, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Speed", + 338, 434, 48, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Shape", + 348, 368, 72, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Smooth", + 386, 434, 44, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Speed", + 452, 120, 48, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Shape", + 462, 54, 72, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Smooth", + 500, 120, 44, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Speed", + 452, 434, 48, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Shape", + 462, 368, 72, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Smooth", + 500, 434, 44, 16, + Justification::centred, true); + + g.setColour (Colours::white); + g.setFont (Font (16.0000f, Font::plain)); + g.drawText (L"VCF ENV", + 562, 8, 76, 24, + Justification::centred, true); + + g.setColour (Colours::white); + g.setFont (Font (16.0000f, Font::plain)); + g.drawText (L"VCA ENV", + 648, 8, 72, 24, + Justification::centred, true); + + g.setColour (Colours::white); + g.setFont (Font (16.0000f, Font::plain)); + g.drawText (L"ENV 3", + 562, 322, 76, 24, + Justification::centred, true); + + g.setColour (Colours::white); + g.setFont (Font (16.0000f, Font::plain)); + g.drawText (L"ENV 4", + 648, 322, 72, 24, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Sustain", + 664, 534, 40, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Decay", + 664, 470, 40, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Release", + 660, 604, 48, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Attack", + 660, 402, 48, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Sustain", + 580, 222, 40, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Decay", + 580, 156, 40, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Release", + 576, 290, 48, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Attack", + 576, 88, 48, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Sustain", + 580, 534, 40, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Decay", + 580, 470, 40, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Release", + 576, 604, 48, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Attack", + 576, 402, 48, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Source 1", + 732, 190, 72, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Mod. amt. 1", + 808, 156, 64, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Source 2", + 804, 290, 72, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Source 1", + 804, 190, 72, 16, + Justification::centred, true); + + g.setColour (Colours::white); + g.setFont (Font (16.0000f, Font::plain)); + g.drawText (L"Misc.", + 966, 322, 58, 24, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Delay", + 338, 188, 48, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Attack", + 384, 188, 48, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Delay", + 452, 188, 48, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Attack", + 498, 188, 48, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Delay", + 452, 502, 48, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Attack", + 498, 502, 48, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Delay", + 338, 502, 48, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Attack", + 384, 502, 48, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Symmetry", + 362, 256, 48, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Polyphon", + 500, 290, 44, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Restart", + 458, 290, 30, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Symmetry", + 476, 256, 48, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Polyphon", + 388, 604, 44, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Restart", + 346, 604, 30, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Polyphon", + 500, 604, 44, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Restart", + 458, 604, 30, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Symmetry", + 362, 570, 48, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Symmetry", + 476, 570, 48, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"FM amt. 2", + 90, 256, 70, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"PWM amt. 2", + 160, 256, 70, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"AM amt. 2", + 20, 256, 70, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"FM amt. 1", + 90, 468, 70, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"PWM amt. 1", + 160, 468, 70, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"AM amt. 1", + 20, 468, 70, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"FM Source 1", + 94, 502, 64, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"PWM Source 1", + 166, 502, 64, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"AM source 1", + 22, 502, 64, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"FM amt. 2", + 90, 570, 70, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"PWM amt. 2", + 160, 570, 70, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"AM amt. 2", + 20, 570, 70, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"FM Source 2", + 92, 604, 64, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"PWM Source 2", + 164, 604, 64, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"AM source 2", + 20, 604, 64, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Mod. amt. 2", + 736, 258, 64, 16, + Justification::centred, true); + + g.setColour (Colours::black); + g.setFont (Font (10.0000f, Font::plain)); + g.drawText (L"Mod. amt. 2", + 810, 258, 64, 16, + Justification::centred, true); + + g.setColour (Colours::white); + g.setFont (Font (11.0000f, Font::plain)); + g.drawText (L"Max. Polyphony :", + 966, 394, 100, 18, + Justification::centredRight, true); + + //[UserPaint] Add your own custom painting code here.. + //[/UserPaint] +} + +void JaySynthAudioProcessorEditor::resized() +{ + m_label_colon->setBounds (220, 660, 24, 28); + m_slider_master_volume->setBounds (972, 542, 36, 36); + m_slider_vcf_f->setBounds (748, 56, 36, 36); + m_slider_vcf_q->setBounds (820, 56, 36, 36); + m_slider_osc0_det->setBounds (106, 54, 36, 36); + m_slider_osc1_det->setBounds (106, 368, 36, 36); + m_slider_osc0_transpose->setBounds (256, 122, 36, 36); + m_slider_osc1_transpose->setBounds (256, 436, 36, 36); + m_slider_vca_env_attack->setBounds (666, 56, 36, 36); + m_slider_vca_env_decay->setBounds (666, 124, 36, 36); + m_slider_vca_env_release->setBounds (666, 258, 36, 36); + m_slider_vca_env_sustain->setBounds (666, 190, 36, 36); + m_slider_vcf_env_attack->setBounds (582, 56, 36, 36); + m_slider_vcf_env_decay->setBounds (582, 124, 36, 36); + m_slider_vcf_env_release->setBounds (582, 258, 36, 36); + m_slider_vcf_env_sustain->setBounds (582, 190, 36, 36); + m_slider_vcf_env_amount->setBounds (892, 124, 36, 36); + m_label_vcf_env_attack->setBounds (574, 38, 52, 20); + m_label_vcf_f->setBounds (740, 38, 52, 20); + m_label_vca_env_attack->setBounds (658, 38, 52, 20); + m_label_vca_env_decay->setBounds (658, 106, 52, 20); + m_label_vca_env_sustain->setBounds (658, 172, 52, 20); + m_label_vca_env_release->setBounds (658, 240, 52, 20); + m_label_vcf_env_decay->setBounds (574, 106, 52, 20); + m_label_vcf_env_sustain->setBounds (574, 172, 52, 20); + m_label_vcf_env_release->setBounds (574, 240, 52, 20); + m_label_vcf_q->setBounds (812, 38, 52, 20); + m_label_vcf_env_amount->setBounds (884, 106, 52, 20); + m_label_master_volume->setBounds (968, 524, 44, 20); + m_label_osc0_transpose->setBounds (248, 104, 52, 20); + m_label_osc1_transpose->setBounds (248, 418, 52, 20); + m_label_osc0_det->setBounds (98, 36, 52, 20); + m_label_osc1_det->setBounds (98, 350, 52, 20); + m_slider_vca_env_amount->setBounds (748, 472, 36, 36); + m_label_vca_env_amount->setBounds (740, 454, 52, 20); + m_slider_osc0_dutycycle->setBounds (176, 54, 36, 36); + m_slider_osc1_dutycycle->setBounds (176, 368, 36, 36); + m_label_osc0_dutycycle->setBounds (168, 36, 52, 20); + m_label_osc1_dutycycle->setBounds (168, 350, 52, 20); + m_slider_lfo0_speed->setBounds (346, 88, 36, 36); + m_slider_osc1_fm_amt0->setBounds (106, 436, 36, 36); + m_slider_osc0_fm_amt0->setBounds (106, 122, 36, 36); + m_label_lfo0_speed->setBounds (338, 70, 52, 20); + m_label_osc0_fm_amt0->setBounds (98, 104, 52, 20); + m_label_osc1_fm_amt0->setBounds (98, 418, 52, 20); + m_slider_vcf_f_amt0->setBounds (748, 124, 36, 36); + m_label_vcf_f_amt0->setBounds (740, 106, 52, 20); + m_slider_lfo1_speed->setBounds (460, 88, 36, 36); + m_label_lfo1_speed->setBounds (452, 70, 52, 20); + m_comboBox_osc0_shape->setBounds (244, 68, 64, 16); + m_comboBox_osc1_shape->setBounds (244, 382, 64, 16); + m_comboBox_lfo0_shape->setBounds (354, 38, 64, 16); + m_comboBox_lfo1_shape->setBounds (470, 38, 64, 16); + m_slider_lfo2_speed->setBounds (346, 402, 36, 36); + m_slider_lfo3_speed->setBounds (460, 402, 36, 36); + m_comboBox_lfo2_shape->setBounds (354, 352, 64, 16); + m_comboBox_lfo3_shape->setBounds (470, 352, 64, 16); + m_label_lfo2_speed->setBounds (338, 384, 52, 20); + m_label_lfo3_speed->setBounds (452, 384, 52, 20); + m_comboBox_vcf_f_src0->setBounds (736, 174, 64, 16); + m_comboBox_osc0_fm_src0->setBounds (94, 172, 64, 16); + m_comboBox_osc1_fm_src0->setBounds (94, 486, 64, 16); + m_slider_vca_am_amt0->setBounds (748, 370, 36, 36); + m_label_vca_am_amt0->setBounds (740, 352, 52, 20); + m_comboBox_vca_am_src0->setBounds (736, 420, 64, 16); + m_slider_vca_pan_amt0->setBounds (820, 370, 36, 36); + m_label_vca_pan_amt0->setBounds (812, 352, 52, 20); + m_comboBox_vca_pan_src0->setBounds (808, 420, 64, 16); + m_label_synth_name->setBounds (12, 662, 92, 24); + m_label_synth_version->setBounds (978, 662, 132, 24); + m_comboBox_vcf_type->setBounds (880, 74, 68, 16); + m_slider_lfo1_smooth->setBounds (506, 88, 36, 36); + m_label_lfo1_smooth->setBounds (498, 70, 52, 20); + m_slider_lfo0_smooth->setBounds (392, 88, 36, 36); + m_label_lfo0_smooth->setBounds (384, 70, 52, 20); + m_slider_lfo2_smooth->setBounds (392, 402, 36, 36); + m_label_lfo2_smooth->setBounds (384, 384, 52, 20); + m_slider_lfo3_smooth->setBounds (506, 402, 36, 36); + m_label_lfo3_smooth->setBounds (498, 384, 52, 20); + m_slider_osc0_pwm_amt0->setBounds (176, 122, 36, 36); + m_label_osc0_pwm_amt0->setBounds (168, 104, 52, 20); + m_slider_osc1_pwm_amt0->setBounds (176, 436, 36, 36); + m_label_osc1_pwm_amt0->setBounds (168, 418, 52, 20); + m_comboBox_osc0_pwm_src0->setBounds (166, 172, 64, 16); + m_comboBox_osc1_pwm_src0->setBounds (166, 486, 64, 16); + m_slider_osc0_level->setBounds (36, 54, 36, 36); + m_label_osc0_level->setBounds (28, 36, 52, 20); + m_slider_osc1_level->setBounds (36, 368, 36, 36); + m_label_osc1_level->setBounds (28, 350, 52, 20); + m_slider_noise_level->setBounds (820, 472, 36, 36); + m_label_noise_level->setBounds (810, 454, 56, 20); + m_comboBox_noise_shape->setBounds (808, 524, 64, 16); + m_btn_noise_enable_led->setBounds (862, 472, 32, 32); + m_btn_osc0_enable->setBounds (72, 8, 32, 32); + m_btn_osc1_enable->setBounds (72, 322, 32, 32); + m_label_patch_name->setBounds (232, 658, 308, 32); + m_button_patch_incr->setBounds (156, 662, 28, 24); + m_button_patch_decr->setBounds (120, 662, 28, 24); + m_label_patch_number->setBounds (192, 658, 32, 32); + m_label_osc1_pb_min->setBounds (228, 442, 32, 20); + m_label_osc1_pb_max->setBounds (288, 442, 32, 20); + m_label_osc0_pb_max->setBounds (288, 128, 32, 20); + m_label_osc0_pb_min->setBounds (228, 128, 32, 20); + m_slider_master_tune->setBounds (1022, 542, 36, 36); + m_label_master_tune->setBounds (1018, 524, 44, 20); + m_button_humanize_enable->setBounds (1040, 436, 72, 16); + m_comboBox_vcf_order->setBounds (880, 38, 68, 16); + m_slider_portamento_time->setBounds (1070, 346, 36, 36); + m_label_portamento_time->setBounds (1066, 328, 44, 20); + m_button_unisono_enable->setBounds (966, 436, 76, 16); + m_slider_humanize_var_vco->setBounds (972, 472, 36, 36); + m_slider_voice_pan_spread->setBounds (1072, 542, 36, 36); + m_label_voice_pan_spread->setBounds (1068, 524, 44, 20); + m_slider_humanize_var_vcf->setBounds (1022, 472, 36, 36); + m_slider_humanize_var_env->setBounds (1072, 472, 36, 36); + m_label_unisono_num_voices->setBounds (1064, 414, 42, 18); + m_button_osc0_restart_enable->setBounds (246, 46, 58, 16); + m_button_osc1_restart_enable->setBounds (246, 360, 58, 16); + m_button_mono_enable->setBounds (965, 346, 86, 16); + m_comboBox_osc1_fm_src1->setBounds (94, 588, 64, 16); + m_comboBox_osc1_pwm_src1->setBounds (166, 588, 64, 16); + m_comboBox_osc0_fm_src1->setBounds (94, 274, 64, 16); + m_comboBox_osc0_pwm_src1->setBounds (166, 274, 64, 16); + m_comboBox_osc1_am_src0->setBounds (22, 486, 64, 16); + m_comboBox_osc1_am_src1->setBounds (22, 588, 64, 16); + m_slider_osc1_am_amt0->setBounds (36, 436, 36, 36); + m_label_osc1_am_amt0->setBounds (28, 418, 52, 20); + m_comboBox_osc0_am_src0->setBounds (22, 172, 64, 16); + m_comboBox_osc0_am_src1->setBounds (22, 274, 64, 16); + m_slider_osc0_am_amt0->setBounds (36, 122, 36, 36); + m_label_osc0_am_amt0->setBounds (28, 104, 52, 20); + m_slider_env2_attack->setBounds (582, 370, 36, 36); + m_slider_env2_decay->setBounds (582, 438, 36, 36); + m_slider_env2_release->setBounds (582, 572, 36, 36); + m_slider_env2_sustain->setBounds (582, 502, 36, 36); + m_label_env2_attack->setBounds (574, 352, 52, 20); + m_label_env2_decay->setBounds (574, 420, 52, 20); + m_label_env2_sustain->setBounds (574, 486, 52, 20); + m_label_env2_release->setBounds (574, 554, 52, 20); + m_slider_env3_attack->setBounds (666, 370, 36, 36); + m_slider_env3_decay->setBounds (666, 438, 36, 36); + m_slider_env3_release->setBounds (666, 572, 36, 36); + m_slider_env3_sustain->setBounds (666, 502, 36, 36); + m_label_env3_attack->setBounds (658, 352, 52, 20); + m_label_env3_decay->setBounds (658, 419, 52, 20); + m_label_env3_sustain->setBounds (658, 485, 52, 20); + m_label_env3_release->setBounds (658, 553, 52, 20); + m_comboBox_vcf_f_src1->setBounds (736, 274, 64, 16); + m_slider_vcf_q_amt0->setBounds (820, 124, 36, 36); + m_label_vcf_q_amt0->setBounds (812, 106, 52, 20); + m_comboBox_vcf_q_src0->setBounds (808, 174, 64, 16); + m_comboBox_vcf_q_src1->setBounds (808, 274, 64, 16); + m_label_humanize_var_vco->setBounds (968, 454, 44, 20); + m_label_humanize_var_vcf->setBounds (1018, 454, 44, 20); + m_label_humanize_var_env->setBounds (1068, 454, 44, 20); + m_btn_limiter_led->setBounds (974, 590, 32, 32); + m_label_limiter_led->setBounds (998, 594, 92, 24); + m_slider_lfo0_delay->setBounds (346, 156, 36, 36); + m_label_lfo0_delay->setBounds (338, 138, 52, 20); + m_slider_lfo0_attack->setBounds (392, 156, 36, 36); + m_label_lfo0_attack->setBounds (384, 138, 52, 20); + m_slider_lfo1_delay->setBounds (460, 156, 36, 36); + m_label_lfo1_delay->setBounds (452, 138, 52, 20); + m_slider_lfo1_attack->setBounds (506, 156, 36, 36); + m_label_lfo1_attack->setBounds (498, 138, 52, 20); + m_slider_lfo2_delay->setBounds (346, 470, 36, 36); + m_label_lfo2_delay->setBounds (338, 452, 52, 20); + m_slider_lfo2_attack->setBounds (392, 470, 36, 36); + m_label_lfo2_attack->setBounds (384, 452, 52, 20); + m_slider_lfo3_delay->setBounds (460, 470, 36, 36); + m_label_lfo3_delay->setBounds (452, 452, 52, 20); + m_slider_lfo3_attack->setBounds (506, 470, 36, 36); + m_label_lfo3_attack->setBounds (498, 452, 52, 20); + m_button_lfo0_restart_enable->setBounds (356, 278, 16, 16); + m_button_lfo0_individual_enable->setBounds (402, 278, 16, 16); + m_slider_lfo0_symmetry->setBounds (370, 224, 36, 36); + m_label_lfo0_symmetry->setBounds (362, 206, 52, 20); + m_slider_lfo1_symmetry->setBounds (484, 224, 36, 36); + m_label_lfo1_symmetry->setBounds (476, 206, 52, 20); + m_button_lfo1_restart_enable->setBounds (468, 277, 16, 16); + m_button_lfo1_individual_enable->setBounds (514, 277, 16, 16); + m_button_lfo2_restart_enable->setBounds (356, 592, 16, 16); + m_button_lfo2_individual_enable->setBounds (402, 592, 16, 16); + m_slider_lfo2_symmetry->setBounds (370, 538, 36, 36); + m_label_lfo2_symmetry->setBounds (362, 520, 52, 20); + m_slider_lfo3_symmetry->setBounds (484, 538, 36, 36); + m_label_lfo3_symmetry->setBounds (476, 520, 52, 20); + m_button_lfo3_restart_enable->setBounds (468, 591, 16, 16); + m_button_lfo3_individual_enable->setBounds (514, 591, 16, 16); + m_slider_osc0_fm_amt1->setBounds (106, 224, 36, 36); + m_label_osc0_fm_amt1->setBounds (98, 206, 52, 20); + m_slider_osc0_pwm_amt1->setBounds (176, 224, 36, 36); + m_label_osc0_pwm_amt1->setBounds (168, 206, 52, 20); + m_slider_osc0_am_amt1->setBounds (36, 224, 36, 36); + m_label_osc0_am_amt1->setBounds (28, 206, 52, 20); + m_slider_osc1_fm_amt1->setBounds (106, 538, 36, 36); + m_label_osc1_fm_amt1->setBounds (98, 520, 52, 20); + m_slider_osc1_pwm_amt1->setBounds (176, 538, 36, 36); + m_label_osc1_pwm_amt1->setBounds (168, 520, 52, 20); + m_slider_osc1_am_amt1->setBounds (36, 538, 36, 36); + m_label_osc1_am_amt1->setBounds (28, 520, 52, 20); + m_slider_vcf_f_amt1->setBounds (748, 226, 36, 36); + m_label_vcf_f_amt1->setBounds (740, 208, 52, 20); + m_slider_vcf_q_amt1->setBounds (820, 226, 36, 36); + m_label_vcf_q_amt1->setBounds (812, 208, 52, 20); + m_button_mono_retrigger->setBounds (965, 364, 86, 16); + m_label_max_num_voices->setBounds (1064, 394, 42, 18); + m_label_num_voices_playing->setBounds (1060, 598, 42, 18); + //[UserResized] Add your own custom resize handling here.. + //[/UserResized] +} + +void JaySynthAudioProcessorEditor::sliderValueChanged (Slider* sliderThatWasMoved) +{ + //[UsersliderValueChanged_Pre] + int paramID; + float value; + param_info_t *pParamInfo; + + paramID = (int)(sliderThatWasMoved->getComponentID()).getTrailingIntValue(); + value = (float)sliderThatWasMoved->getValue(); + + pParamInfo = getParamInfo(paramID); + if (pParamInfo) + getProcessor()->setParam(paramID, toParam(pParamInfo, (synth_float_t)value), true, true); + + if (sliderThatWasMoved == m_slider_humanize_var_vco) + { + getProcessor()->humanizeVarianceChanged_VCO(); + } + else if (sliderThatWasMoved == m_slider_humanize_var_vcf) + { + getProcessor()->humanizeVarianceChanged_VCF(); + } + else if (sliderThatWasMoved == m_slider_humanize_var_env) + { + getProcessor()->humanizeVarianceChanged_ENV(); + } + + return; + //[/UsersliderValueChanged_Pre] + + if (sliderThatWasMoved == m_slider_master_volume) + { + //[UserSliderCode_m_slider_master_volume] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_master_volume] + } + else if (sliderThatWasMoved == m_slider_vcf_f) + { + //[UserSliderCode_m_slider_vcf_f] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_vcf_f] + } + else if (sliderThatWasMoved == m_slider_vcf_q) + { + //[UserSliderCode_m_slider_vcf_q] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_vcf_q] + } + else if (sliderThatWasMoved == m_slider_osc0_det) + { + //[UserSliderCode_m_slider_osc0_det] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_osc0_det] + } + else if (sliderThatWasMoved == m_slider_osc1_det) + { + //[UserSliderCode_m_slider_osc1_det] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_osc1_det] + } + else if (sliderThatWasMoved == m_slider_osc0_transpose) + { + //[UserSliderCode_m_slider_osc0_transpose] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_osc0_transpose] + } + else if (sliderThatWasMoved == m_slider_osc1_transpose) + { + //[UserSliderCode_m_slider_osc1_transpose] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_osc1_transpose] + } + else if (sliderThatWasMoved == m_slider_vca_env_attack) + { + //[UserSliderCode_m_slider_vca_env_attack] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_vca_env_attack] + } + else if (sliderThatWasMoved == m_slider_vca_env_decay) + { + //[UserSliderCode_m_slider_vca_env_decay] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_vca_env_decay] + } + else if (sliderThatWasMoved == m_slider_vca_env_release) + { + //[UserSliderCode_m_slider_vca_env_release] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_vca_env_release] + } + else if (sliderThatWasMoved == m_slider_vca_env_sustain) + { + //[UserSliderCode_m_slider_vca_env_sustain] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_vca_env_sustain] + } + else if (sliderThatWasMoved == m_slider_vcf_env_attack) + { + //[UserSliderCode_m_slider_vcf_env_attack] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_vcf_env_attack] + } + else if (sliderThatWasMoved == m_slider_vcf_env_decay) + { + //[UserSliderCode_m_slider_vcf_env_decay] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_vcf_env_decay] + } + else if (sliderThatWasMoved == m_slider_vcf_env_release) + { + //[UserSliderCode_m_slider_vcf_env_release] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_vcf_env_release] + } + else if (sliderThatWasMoved == m_slider_vcf_env_sustain) + { + //[UserSliderCode_m_slider_vcf_env_sustain] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_vcf_env_sustain] + } + else if (sliderThatWasMoved == m_slider_vcf_env_amount) + { + //[UserSliderCode_m_slider_vcf_env_amount] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_vcf_env_amount] + } + else if (sliderThatWasMoved == m_slider_vca_env_amount) + { + //[UserSliderCode_m_slider_vca_env_amount] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_vca_env_amount] + } + else if (sliderThatWasMoved == m_slider_osc0_dutycycle) + { + //[UserSliderCode_m_slider_osc0_dutycycle] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_osc0_dutycycle] + } + else if (sliderThatWasMoved == m_slider_osc1_dutycycle) + { + //[UserSliderCode_m_slider_osc1_dutycycle] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_osc1_dutycycle] + } + else if (sliderThatWasMoved == m_slider_lfo0_speed) + { + //[UserSliderCode_m_slider_lfo0_speed] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_lfo0_speed] + } + else if (sliderThatWasMoved == m_slider_osc1_fm_amt0) + { + //[UserSliderCode_m_slider_osc1_fm_amt0] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_osc1_fm_amt0] + } + else if (sliderThatWasMoved == m_slider_osc0_fm_amt0) + { + //[UserSliderCode_m_slider_osc0_fm_amt0] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_osc0_fm_amt0] + } + else if (sliderThatWasMoved == m_slider_vcf_f_amt0) + { + //[UserSliderCode_m_slider_vcf_f_amt0] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_vcf_f_amt0] + } + else if (sliderThatWasMoved == m_slider_lfo1_speed) + { + //[UserSliderCode_m_slider_lfo1_speed] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_lfo1_speed] + } + else if (sliderThatWasMoved == m_slider_lfo2_speed) + { + //[UserSliderCode_m_slider_lfo2_speed] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_lfo2_speed] + } + else if (sliderThatWasMoved == m_slider_lfo3_speed) + { + //[UserSliderCode_m_slider_lfo3_speed] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_lfo3_speed] + } + else if (sliderThatWasMoved == m_slider_vca_am_amt0) + { + //[UserSliderCode_m_slider_vca_am_amt0] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_vca_am_amt0] + } + else if (sliderThatWasMoved == m_slider_vca_pan_amt0) + { + //[UserSliderCode_m_slider_vca_pan_amt0] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_vca_pan_amt0] + } + else if (sliderThatWasMoved == m_slider_lfo1_smooth) + { + //[UserSliderCode_m_slider_lfo1_smooth] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_lfo1_smooth] + } + else if (sliderThatWasMoved == m_slider_lfo0_smooth) + { + //[UserSliderCode_m_slider_lfo0_smooth] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_lfo0_smooth] + } + else if (sliderThatWasMoved == m_slider_lfo2_smooth) + { + //[UserSliderCode_m_slider_lfo2_smooth] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_lfo2_smooth] + } + else if (sliderThatWasMoved == m_slider_lfo3_smooth) + { + //[UserSliderCode_m_slider_lfo3_smooth] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_lfo3_smooth] + } + else if (sliderThatWasMoved == m_slider_osc0_pwm_amt0) + { + //[UserSliderCode_m_slider_osc0_pwm_amt0] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_osc0_pwm_amt0] + } + else if (sliderThatWasMoved == m_slider_osc1_pwm_amt0) + { + //[UserSliderCode_m_slider_osc1_pwm_amt0] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_osc1_pwm_amt0] + } + else if (sliderThatWasMoved == m_slider_osc0_level) + { + //[UserSliderCode_m_slider_osc0_level] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_osc0_level] + } + else if (sliderThatWasMoved == m_slider_osc1_level) + { + //[UserSliderCode_m_slider_osc1_level] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_osc1_level] + } + else if (sliderThatWasMoved == m_slider_noise_level) + { + //[UserSliderCode_m_slider_noise_level] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_noise_level] + } + else if (sliderThatWasMoved == m_slider_master_tune) + { + //[UserSliderCode_m_slider_master_tune] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_master_tune] + } + else if (sliderThatWasMoved == m_slider_portamento_time) + { + //[UserSliderCode_m_slider_portamento_time] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_portamento_time] + } + else if (sliderThatWasMoved == m_slider_humanize_var_vco) + { + //[UserSliderCode_m_slider_humanize_var_vco] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_humanize_var_vco] + } + else if (sliderThatWasMoved == m_slider_voice_pan_spread) + { + //[UserSliderCode_m_slider_voice_pan_spread] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_voice_pan_spread] + } + else if (sliderThatWasMoved == m_slider_humanize_var_vcf) + { + //[UserSliderCode_m_slider_humanize_var_vcf] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_humanize_var_vcf] + } + else if (sliderThatWasMoved == m_slider_humanize_var_env) + { + //[UserSliderCode_m_slider_humanize_var_env] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_humanize_var_env] + } + else if (sliderThatWasMoved == m_slider_osc1_am_amt0) + { + //[UserSliderCode_m_slider_osc1_am_amt0] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_osc1_am_amt0] + } + else if (sliderThatWasMoved == m_slider_osc0_am_amt0) + { + //[UserSliderCode_m_slider_osc0_am_amt0] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_osc0_am_amt0] + } + else if (sliderThatWasMoved == m_slider_env2_attack) + { + //[UserSliderCode_m_slider_env2_attack] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_env2_attack] + } + else if (sliderThatWasMoved == m_slider_env2_decay) + { + //[UserSliderCode_m_slider_env2_decay] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_env2_decay] + } + else if (sliderThatWasMoved == m_slider_env2_release) + { + //[UserSliderCode_m_slider_env2_release] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_env2_release] + } + else if (sliderThatWasMoved == m_slider_env2_sustain) + { + //[UserSliderCode_m_slider_env2_sustain] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_env2_sustain] + } + else if (sliderThatWasMoved == m_slider_env3_attack) + { + //[UserSliderCode_m_slider_env3_attack] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_env3_attack] + } + else if (sliderThatWasMoved == m_slider_env3_decay) + { + //[UserSliderCode_m_slider_env3_decay] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_env3_decay] + } + else if (sliderThatWasMoved == m_slider_env3_release) + { + //[UserSliderCode_m_slider_env3_release] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_env3_release] + } + else if (sliderThatWasMoved == m_slider_env3_sustain) + { + //[UserSliderCode_m_slider_env3_sustain] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_env3_sustain] + } + else if (sliderThatWasMoved == m_slider_vcf_q_amt0) + { + //[UserSliderCode_m_slider_vcf_q_amt0] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_vcf_q_amt0] + } + else if (sliderThatWasMoved == m_slider_lfo0_delay) + { + //[UserSliderCode_m_slider_lfo0_delay] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_lfo0_delay] + } + else if (sliderThatWasMoved == m_slider_lfo0_attack) + { + //[UserSliderCode_m_slider_lfo0_attack] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_lfo0_attack] + } + else if (sliderThatWasMoved == m_slider_lfo1_delay) + { + //[UserSliderCode_m_slider_lfo1_delay] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_lfo1_delay] + } + else if (sliderThatWasMoved == m_slider_lfo1_attack) + { + //[UserSliderCode_m_slider_lfo1_attack] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_lfo1_attack] + } + else if (sliderThatWasMoved == m_slider_lfo2_delay) + { + //[UserSliderCode_m_slider_lfo2_delay] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_lfo2_delay] + } + else if (sliderThatWasMoved == m_slider_lfo2_attack) + { + //[UserSliderCode_m_slider_lfo2_attack] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_lfo2_attack] + } + else if (sliderThatWasMoved == m_slider_lfo3_delay) + { + //[UserSliderCode_m_slider_lfo3_delay] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_lfo3_delay] + } + else if (sliderThatWasMoved == m_slider_lfo3_attack) + { + //[UserSliderCode_m_slider_lfo3_attack] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_lfo3_attack] + } + else if (sliderThatWasMoved == m_slider_lfo0_symmetry) + { + //[UserSliderCode_m_slider_lfo0_symmetry] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_lfo0_symmetry] + } + else if (sliderThatWasMoved == m_slider_lfo1_symmetry) + { + //[UserSliderCode_m_slider_lfo1_symmetry] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_lfo1_symmetry] + } + else if (sliderThatWasMoved == m_slider_lfo2_symmetry) + { + //[UserSliderCode_m_slider_lfo2_symmetry] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_lfo2_symmetry] + } + else if (sliderThatWasMoved == m_slider_lfo3_symmetry) + { + //[UserSliderCode_m_slider_lfo3_symmetry] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_lfo3_symmetry] + } + else if (sliderThatWasMoved == m_slider_osc0_fm_amt1) + { + //[UserSliderCode_m_slider_osc0_fm_amt1] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_osc0_fm_amt1] + } + else if (sliderThatWasMoved == m_slider_osc0_pwm_amt1) + { + //[UserSliderCode_m_slider_osc0_pwm_amt1] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_osc0_pwm_amt1] + } + else if (sliderThatWasMoved == m_slider_osc0_am_amt1) + { + //[UserSliderCode_m_slider_osc0_am_amt1] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_osc0_am_amt1] + } + else if (sliderThatWasMoved == m_slider_osc1_fm_amt1) + { + //[UserSliderCode_m_slider_osc1_fm_amt1] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_osc1_fm_amt1] + } + else if (sliderThatWasMoved == m_slider_osc1_pwm_amt1) + { + //[UserSliderCode_m_slider_osc1_pwm_amt1] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_osc1_pwm_amt1] + } + else if (sliderThatWasMoved == m_slider_osc1_am_amt1) + { + //[UserSliderCode_m_slider_osc1_am_amt1] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_osc1_am_amt1] + } + else if (sliderThatWasMoved == m_slider_vcf_f_amt1) + { + //[UserSliderCode_m_slider_vcf_f_amt1] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_vcf_f_amt1] + } + else if (sliderThatWasMoved == m_slider_vcf_q_amt1) + { + //[UserSliderCode_m_slider_vcf_q_amt1] -- add your slider handling code here.. + //[/UserSliderCode_m_slider_vcf_q_amt1] + } + + //[UsersliderValueChanged_Post] + //[/UsersliderValueChanged_Post] +} + +void JaySynthAudioProcessorEditor::labelTextChanged (Label* labelThatHasChanged) +{ + //[UserlabelTextChanged_Pre] + int paramID; + float value; + + if (labelThatHasChanged == m_label_patch_name) + { + getProcessor()->setCurrentProgramName(labelThatHasChanged->getText()); + labelThatHasChanged->setText(getProcessor()->getCurrentProgramName(), false); + return; + } + else if (labelThatHasChanged == m_label_patch_number) + { + getProcessor()->setCurrentProgram(labelThatHasChanged->getText().getIntValue()); + return; + } + + paramID = (int)(labelThatHasChanged->getComponentID()).getTrailingIntValue(); + value = (float)String(labelThatHasChanged->getText()).getFloatValue(); + getProcessor()->setParam(paramID, value, true, true); + + if (labelThatHasChanged == m_label_unisono_num_voices) + { + getProcessor()->unisonoModeChanged(); + } + else if (labelThatHasChanged == m_label_max_num_voices) + { + getProcessor()->unisonoModeChanged(); + } + else if (labelThatHasChanged == m_label_humanize_var_vco) + { + getProcessor()->humanizeVarianceChanged_VCO(); + } + else if (labelThatHasChanged == m_label_humanize_var_vcf) + { + getProcessor()->humanizeVarianceChanged_VCF(); + } + else if (labelThatHasChanged == m_label_humanize_var_env) + { + getProcessor()->humanizeVarianceChanged_ENV(); + } + return; + //[/UserlabelTextChanged_Pre] + + if (labelThatHasChanged == m_label_vcf_env_attack) + { + //[UserLabelCode_m_label_vcf_env_attack] -- add your label text handling code here.. + //[/UserLabelCode_m_label_vcf_env_attack] + } + else if (labelThatHasChanged == m_label_vcf_f) + { + //[UserLabelCode_m_label_vcf_f] -- add your label text handling code here.. + //[/UserLabelCode_m_label_vcf_f] + } + else if (labelThatHasChanged == m_label_vca_env_attack) + { + //[UserLabelCode_m_label_vca_env_attack] -- add your label text handling code here.. + //[/UserLabelCode_m_label_vca_env_attack] + } + else if (labelThatHasChanged == m_label_vca_env_decay) + { + //[UserLabelCode_m_label_vca_env_decay] -- add your label text handling code here.. + //[/UserLabelCode_m_label_vca_env_decay] + } + else if (labelThatHasChanged == m_label_vca_env_sustain) + { + //[UserLabelCode_m_label_vca_env_sustain] -- add your label text handling code here.. + //[/UserLabelCode_m_label_vca_env_sustain] + } + else if (labelThatHasChanged == m_label_vca_env_release) + { + //[UserLabelCode_m_label_vca_env_release] -- add your label text handling code here.. + //[/UserLabelCode_m_label_vca_env_release] + } + else if (labelThatHasChanged == m_label_vcf_env_decay) + { + //[UserLabelCode_m_label_vcf_env_decay] -- add your label text handling code here.. + //[/UserLabelCode_m_label_vcf_env_decay] + } + else if (labelThatHasChanged == m_label_vcf_env_sustain) + { + //[UserLabelCode_m_label_vcf_env_sustain] -- add your label text handling code here.. + //[/UserLabelCode_m_label_vcf_env_sustain] + } + else if (labelThatHasChanged == m_label_vcf_env_release) + { + //[UserLabelCode_m_label_vcf_env_release] -- add your label text handling code here.. + //[/UserLabelCode_m_label_vcf_env_release] + } + else if (labelThatHasChanged == m_label_vcf_q) + { + //[UserLabelCode_m_label_vcf_q] -- add your label text handling code here.. + //[/UserLabelCode_m_label_vcf_q] + } + else if (labelThatHasChanged == m_label_vcf_env_amount) + { + //[UserLabelCode_m_label_vcf_env_amount] -- add your label text handling code here.. + //[/UserLabelCode_m_label_vcf_env_amount] + } + else if (labelThatHasChanged == m_label_master_volume) + { + //[UserLabelCode_m_label_master_volume] -- add your label text handling code here.. + //[/UserLabelCode_m_label_master_volume] + } + else if (labelThatHasChanged == m_label_osc0_transpose) + { + //[UserLabelCode_m_label_osc0_transpose] -- add your label text handling code here.. + //[/UserLabelCode_m_label_osc0_transpose] + } + else if (labelThatHasChanged == m_label_osc1_transpose) + { + //[UserLabelCode_m_label_osc1_transpose] -- add your label text handling code here.. + //[/UserLabelCode_m_label_osc1_transpose] + } + else if (labelThatHasChanged == m_label_osc0_det) + { + //[UserLabelCode_m_label_osc0_det] -- add your label text handling code here.. + //[/UserLabelCode_m_label_osc0_det] + } + else if (labelThatHasChanged == m_label_osc1_det) + { + //[UserLabelCode_m_label_osc1_det] -- add your label text handling code here.. + //[/UserLabelCode_m_label_osc1_det] + } + else if (labelThatHasChanged == m_label_vca_env_amount) + { + //[UserLabelCode_m_label_vca_env_amount] -- add your label text handling code here.. + //[/UserLabelCode_m_label_vca_env_amount] + } + else if (labelThatHasChanged == m_label_osc0_dutycycle) + { + //[UserLabelCode_m_label_osc0_dutycycle] -- add your label text handling code here.. + //[/UserLabelCode_m_label_osc0_dutycycle] + } + else if (labelThatHasChanged == m_label_osc1_dutycycle) + { + //[UserLabelCode_m_label_osc1_dutycycle] -- add your label text handling code here.. + //[/UserLabelCode_m_label_osc1_dutycycle] + } + else if (labelThatHasChanged == m_label_lfo0_speed) + { + //[UserLabelCode_m_label_lfo0_speed] -- add your label text handling code here.. + //[/UserLabelCode_m_label_lfo0_speed] + } + else if (labelThatHasChanged == m_label_osc0_fm_amt0) + { + //[UserLabelCode_m_label_osc0_fm_amt0] -- add your label text handling code here.. + //[/UserLabelCode_m_label_osc0_fm_amt0] + } + else if (labelThatHasChanged == m_label_osc1_fm_amt0) + { + //[UserLabelCode_m_label_osc1_fm_amt0] -- add your label text handling code here.. + //[/UserLabelCode_m_label_osc1_fm_amt0] + } + else if (labelThatHasChanged == m_label_vcf_f_amt0) + { + //[UserLabelCode_m_label_vcf_f_amt0] -- add your label text handling code here.. + //[/UserLabelCode_m_label_vcf_f_amt0] + } + else if (labelThatHasChanged == m_label_lfo1_speed) + { + //[UserLabelCode_m_label_lfo1_speed] -- add your label text handling code here.. + //[/UserLabelCode_m_label_lfo1_speed] + } + else if (labelThatHasChanged == m_label_lfo2_speed) + { + //[UserLabelCode_m_label_lfo2_speed] -- add your label text handling code here.. + //[/UserLabelCode_m_label_lfo2_speed] + } + else if (labelThatHasChanged == m_label_lfo3_speed) + { + //[UserLabelCode_m_label_lfo3_speed] -- add your label text handling code here.. + //[/UserLabelCode_m_label_lfo3_speed] + } + else if (labelThatHasChanged == m_label_vca_am_amt0) + { + //[UserLabelCode_m_label_vca_am_amt0] -- add your label text handling code here.. + //[/UserLabelCode_m_label_vca_am_amt0] + } + else if (labelThatHasChanged == m_label_vca_pan_amt0) + { + //[UserLabelCode_m_label_vca_pan_amt0] -- add your label text handling code here.. + //[/UserLabelCode_m_label_vca_pan_amt0] + } + else if (labelThatHasChanged == m_label_lfo1_smooth) + { + //[UserLabelCode_m_label_lfo1_smooth] -- add your label text handling code here.. + //[/UserLabelCode_m_label_lfo1_smooth] + } + else if (labelThatHasChanged == m_label_lfo0_smooth) + { + //[UserLabelCode_m_label_lfo0_smooth] -- add your label text handling code here.. + //[/UserLabelCode_m_label_lfo0_smooth] + } + else if (labelThatHasChanged == m_label_lfo2_smooth) + { + //[UserLabelCode_m_label_lfo2_smooth] -- add your label text handling code here.. + //[/UserLabelCode_m_label_lfo2_smooth] + } + else if (labelThatHasChanged == m_label_lfo3_smooth) + { + //[UserLabelCode_m_label_lfo3_smooth] -- add your label text handling code here.. + //[/UserLabelCode_m_label_lfo3_smooth] + } + else if (labelThatHasChanged == m_label_osc0_pwm_amt0) + { + //[UserLabelCode_m_label_osc0_pwm_amt0] -- add your label text handling code here.. + //[/UserLabelCode_m_label_osc0_pwm_amt0] + } + else if (labelThatHasChanged == m_label_osc1_pwm_amt0) + { + //[UserLabelCode_m_label_osc1_pwm_amt0] -- add your label text handling code here.. + //[/UserLabelCode_m_label_osc1_pwm_amt0] + } + else if (labelThatHasChanged == m_label_osc0_level) + { + //[UserLabelCode_m_label_osc0_level] -- add your label text handling code here.. + //[/UserLabelCode_m_label_osc0_level] + } + else if (labelThatHasChanged == m_label_osc1_level) + { + //[UserLabelCode_m_label_osc1_level] -- add your label text handling code here.. + //[/UserLabelCode_m_label_osc1_level] + } + else if (labelThatHasChanged == m_label_noise_level) + { + //[UserLabelCode_m_label_noise_level] -- add your label text handling code here.. + //[/UserLabelCode_m_label_noise_level] + } + else if (labelThatHasChanged == m_label_patch_name) + { + //[UserLabelCode_m_label_patch_name] -- add your label text handling code here.. + //[/UserLabelCode_m_label_patch_name] + } + else if (labelThatHasChanged == m_label_patch_number) + { + //[UserLabelCode_m_label_patch_number] -- add your label text handling code here.. + //[/UserLabelCode_m_label_patch_number] + } + else if (labelThatHasChanged == m_label_osc1_pb_min) + { + //[UserLabelCode_m_label_osc1_pb_min] -- add your label text handling code here.. + //[/UserLabelCode_m_label_osc1_pb_min] + } + else if (labelThatHasChanged == m_label_osc1_pb_max) + { + //[UserLabelCode_m_label_osc1_pb_max] -- add your label text handling code here.. + //[/UserLabelCode_m_label_osc1_pb_max] + } + else if (labelThatHasChanged == m_label_osc0_pb_max) + { + //[UserLabelCode_m_label_osc0_pb_max] -- add your label text handling code here.. + //[/UserLabelCode_m_label_osc0_pb_max] + } + else if (labelThatHasChanged == m_label_osc0_pb_min) + { + //[UserLabelCode_m_label_osc0_pb_min] -- add your label text handling code here.. + //[/UserLabelCode_m_label_osc0_pb_min] + } + else if (labelThatHasChanged == m_label_master_tune) + { + //[UserLabelCode_m_label_master_tune] -- add your label text handling code here.. + //[/UserLabelCode_m_label_master_tune] + } + else if (labelThatHasChanged == m_label_portamento_time) + { + //[UserLabelCode_m_label_portamento_time] -- add your label text handling code here.. + //[/UserLabelCode_m_label_portamento_time] + } + else if (labelThatHasChanged == m_label_voice_pan_spread) + { + //[UserLabelCode_m_label_voice_pan_spread] -- add your label text handling code here.. + //[/UserLabelCode_m_label_voice_pan_spread] + } + else if (labelThatHasChanged == m_label_unisono_num_voices) + { + //[UserLabelCode_m_label_unisono_num_voices] -- add your label text handling code here.. + //[/UserLabelCode_m_label_unisono_num_voices] + } + else if (labelThatHasChanged == m_label_osc1_am_amt0) + { + //[UserLabelCode_m_label_osc1_am_amt0] -- add your label text handling code here.. + //[/UserLabelCode_m_label_osc1_am_amt0] + } + else if (labelThatHasChanged == m_label_osc0_am_amt0) + { + //[UserLabelCode_m_label_osc0_am_amt0] -- add your label text handling code here.. + //[/UserLabelCode_m_label_osc0_am_amt0] + } + else if (labelThatHasChanged == m_label_env2_attack) + { + //[UserLabelCode_m_label_env2_attack] -- add your label text handling code here.. + //[/UserLabelCode_m_label_env2_attack] + } + else if (labelThatHasChanged == m_label_env2_decay) + { + //[UserLabelCode_m_label_env2_decay] -- add your label text handling code here.. + //[/UserLabelCode_m_label_env2_decay] + } + else if (labelThatHasChanged == m_label_env2_sustain) + { + //[UserLabelCode_m_label_env2_sustain] -- add your label text handling code here.. + //[/UserLabelCode_m_label_env2_sustain] + } + else if (labelThatHasChanged == m_label_env2_release) + { + //[UserLabelCode_m_label_env2_release] -- add your label text handling code here.. + //[/UserLabelCode_m_label_env2_release] + } + else if (labelThatHasChanged == m_label_env3_attack) + { + //[UserLabelCode_m_label_env3_attack] -- add your label text handling code here.. + //[/UserLabelCode_m_label_env3_attack] + } + else if (labelThatHasChanged == m_label_env3_decay) + { + //[UserLabelCode_m_label_env3_decay] -- add your label text handling code here.. + //[/UserLabelCode_m_label_env3_decay] + } + else if (labelThatHasChanged == m_label_env3_sustain) + { + //[UserLabelCode_m_label_env3_sustain] -- add your label text handling code here.. + //[/UserLabelCode_m_label_env3_sustain] + } + else if (labelThatHasChanged == m_label_env3_release) + { + //[UserLabelCode_m_label_env3_release] -- add your label text handling code here.. + //[/UserLabelCode_m_label_env3_release] + } + else if (labelThatHasChanged == m_label_vcf_q_amt0) + { + //[UserLabelCode_m_label_vcf_q_amt0] -- add your label text handling code here.. + //[/UserLabelCode_m_label_vcf_q_amt0] + } + else if (labelThatHasChanged == m_label_humanize_var_vco) + { + //[UserLabelCode_m_label_humanize_var_vco] -- add your label text handling code here.. + //[/UserLabelCode_m_label_humanize_var_vco] + } + else if (labelThatHasChanged == m_label_humanize_var_vcf) + { + //[UserLabelCode_m_label_humanize_var_vcf] -- add your label text handling code here.. + //[/UserLabelCode_m_label_humanize_var_vcf] + } + else if (labelThatHasChanged == m_label_humanize_var_env) + { + //[UserLabelCode_m_label_humanize_var_env] -- add your label text handling code here.. + //[/UserLabelCode_m_label_humanize_var_env] + } + else if (labelThatHasChanged == m_label_lfo0_delay) + { + //[UserLabelCode_m_label_lfo0_delay] -- add your label text handling code here.. + //[/UserLabelCode_m_label_lfo0_delay] + } + else if (labelThatHasChanged == m_label_lfo0_attack) + { + //[UserLabelCode_m_label_lfo0_attack] -- add your label text handling code here.. + //[/UserLabelCode_m_label_lfo0_attack] + } + else if (labelThatHasChanged == m_label_lfo1_delay) + { + //[UserLabelCode_m_label_lfo1_delay] -- add your label text handling code here.. + //[/UserLabelCode_m_label_lfo1_delay] + } + else if (labelThatHasChanged == m_label_lfo1_attack) + { + //[UserLabelCode_m_label_lfo1_attack] -- add your label text handling code here.. + //[/UserLabelCode_m_label_lfo1_attack] + } + else if (labelThatHasChanged == m_label_lfo2_delay) + { + //[UserLabelCode_m_label_lfo2_delay] -- add your label text handling code here.. + //[/UserLabelCode_m_label_lfo2_delay] + } + else if (labelThatHasChanged == m_label_lfo2_attack) + { + //[UserLabelCode_m_label_lfo2_attack] -- add your label text handling code here.. + //[/UserLabelCode_m_label_lfo2_attack] + } + else if (labelThatHasChanged == m_label_lfo3_delay) + { + //[UserLabelCode_m_label_lfo3_delay] -- add your label text handling code here.. + //[/UserLabelCode_m_label_lfo3_delay] + } + else if (labelThatHasChanged == m_label_lfo3_attack) + { + //[UserLabelCode_m_label_lfo3_attack] -- add your label text handling code here.. + //[/UserLabelCode_m_label_lfo3_attack] + } + else if (labelThatHasChanged == m_label_lfo0_symmetry) + { + //[UserLabelCode_m_label_lfo0_symmetry] -- add your label text handling code here.. + //[/UserLabelCode_m_label_lfo0_symmetry] + } + else if (labelThatHasChanged == m_label_lfo1_symmetry) + { + //[UserLabelCode_m_label_lfo1_symmetry] -- add your label text handling code here.. + //[/UserLabelCode_m_label_lfo1_symmetry] + } + else if (labelThatHasChanged == m_label_lfo2_symmetry) + { + //[UserLabelCode_m_label_lfo2_symmetry] -- add your label text handling code here.. + //[/UserLabelCode_m_label_lfo2_symmetry] + } + else if (labelThatHasChanged == m_label_lfo3_symmetry) + { + //[UserLabelCode_m_label_lfo3_symmetry] -- add your label text handling code here.. + //[/UserLabelCode_m_label_lfo3_symmetry] + } + else if (labelThatHasChanged == m_label_osc0_fm_amt1) + { + //[UserLabelCode_m_label_osc0_fm_amt1] -- add your label text handling code here.. + //[/UserLabelCode_m_label_osc0_fm_amt1] + } + else if (labelThatHasChanged == m_label_osc0_pwm_amt1) + { + //[UserLabelCode_m_label_osc0_pwm_amt1] -- add your label text handling code here.. + //[/UserLabelCode_m_label_osc0_pwm_amt1] + } + else if (labelThatHasChanged == m_label_osc0_am_amt1) + { + //[UserLabelCode_m_label_osc0_am_amt1] -- add your label text handling code here.. + //[/UserLabelCode_m_label_osc0_am_amt1] + } + else if (labelThatHasChanged == m_label_osc1_fm_amt1) + { + //[UserLabelCode_m_label_osc1_fm_amt1] -- add your label text handling code here.. + //[/UserLabelCode_m_label_osc1_fm_amt1] + } + else if (labelThatHasChanged == m_label_osc1_pwm_amt1) + { + //[UserLabelCode_m_label_osc1_pwm_amt1] -- add your label text handling code here.. + //[/UserLabelCode_m_label_osc1_pwm_amt1] + } + else if (labelThatHasChanged == m_label_osc1_am_amt1) + { + //[UserLabelCode_m_label_osc1_am_amt1] -- add your label text handling code here.. + //[/UserLabelCode_m_label_osc1_am_amt1] + } + else if (labelThatHasChanged == m_label_vcf_f_amt1) + { + //[UserLabelCode_m_label_vcf_f_amt1] -- add your label text handling code here.. + //[/UserLabelCode_m_label_vcf_f_amt1] + } + else if (labelThatHasChanged == m_label_vcf_q_amt1) + { + //[UserLabelCode_m_label_vcf_q_amt1] -- add your label text handling code here.. + //[/UserLabelCode_m_label_vcf_q_amt1] + } + else if (labelThatHasChanged == m_label_max_num_voices) + { + //[UserLabelCode_m_label_max_num_voices] -- add your label text handling code here.. + //[/UserLabelCode_m_label_max_num_voices] + } + else if (labelThatHasChanged == m_label_num_voices_playing) + { + //[UserLabelCode_m_label_num_voices_playing] -- add your label text handling code here.. + //[/UserLabelCode_m_label_num_voices_playing] + } + + //[UserlabelTextChanged_Post] + //[/UserlabelTextChanged_Post] +} + +void JaySynthAudioProcessorEditor::comboBoxChanged (ComboBox* comboBoxThatHasChanged) +{ + //[UsercomboBoxChanged_Pre] + int paramID, srcID, opID; + float value; + param_info_t *pParamInfo; + + paramID = (int)(comboBoxThatHasChanged->getComponentID()).getTrailingIntValue(); + value = (float)(comboBoxThatHasChanged->getSelectedId()-1); + pParamInfo = getParamInfo(paramID); + if (pParamInfo) + getProcessor()->setParam(paramID, (synth_float_t)value, true, true); + + if (comboBoxThatHasChanged == m_comboBox_osc0_fm_src0) + { + srcID = ModSrc0_findByName(comboBoxThatHasChanged->getText()); + if (srcID >= 0) + getProcessor()->setParam(paramID, (synth_float_t)srcID, true, true); + } + else if (comboBoxThatHasChanged == m_comboBox_osc1_fm_src0) + { + srcID = ModSrc0_findByName(comboBoxThatHasChanged->getText()); + if (srcID >= 0) + getProcessor()->setParam(paramID, (synth_float_t)srcID, true, true); + } + else if (comboBoxThatHasChanged == m_comboBox_osc0_pwm_src0) + { + srcID = ModSrc0_findByName(comboBoxThatHasChanged->getText()); + if (srcID >= 0) + getProcessor()->setParam(paramID, (synth_float_t)srcID, true, true); + } + else if (comboBoxThatHasChanged == m_comboBox_osc1_pwm_src0) + { + srcID = ModSrc0_findByName(comboBoxThatHasChanged->getText()); + if (srcID >= 0) + getProcessor()->setParam(paramID, (synth_float_t)srcID, true, true); + } + else if (comboBoxThatHasChanged == m_comboBox_osc0_am_src0) + { + srcID = ModSrc0_findByName(comboBoxThatHasChanged->getText()); + if (srcID >= 0) + getProcessor()->setParam(paramID, (synth_float_t)srcID, true, true); + } + else if (comboBoxThatHasChanged == m_comboBox_osc1_am_src0) + { + srcID = ModSrc0_findByName(comboBoxThatHasChanged->getText()); + if (srcID >= 0) + getProcessor()->setParam(paramID, (synth_float_t)srcID, true, true); + } + else if (comboBoxThatHasChanged == m_comboBox_vcf_f_src0) + { + srcID = ModSrc0_findByName(comboBoxThatHasChanged->getText()); + if (srcID >= 0) + getProcessor()->setParam(paramID, (synth_float_t)srcID, true, true); + } + else if (comboBoxThatHasChanged == m_comboBox_vcf_q_src0) + { + srcID = ModSrc0_findByName(comboBoxThatHasChanged->getText()); + if (srcID >= 0) + getProcessor()->setParam(paramID, (synth_float_t)srcID, true, true); + } + else if (comboBoxThatHasChanged == m_comboBox_vca_am_src0) + { + srcID = ModSrc0_findByName(comboBoxThatHasChanged->getText()); + if (srcID >= 0) + getProcessor()->setParam(paramID, (synth_float_t)srcID, true, true); + } + else if (comboBoxThatHasChanged == m_comboBox_vca_pan_src0) + { + srcID = ModSrc0_findByName(comboBoxThatHasChanged->getText()); + if (srcID >= 0) + getProcessor()->setParam(paramID, (synth_float_t)srcID, true, true); + } + else if (comboBoxThatHasChanged == m_comboBox_osc0_fm_src1) + { + srcID = ModSrc1_findByName(comboBoxThatHasChanged->getText()); + if (srcID >= 0) + getProcessor()->setParam(paramID, (synth_float_t)srcID, true, true); + + opID = ModSrcOP_findByName(comboBoxThatHasChanged->getText()); + if (opID >= 0) + getProcessor()->setParam(SYNTH_PARAM_OSC_0_FM_SRC_OP, (synth_float_t)opID, true, true); + } + else if (comboBoxThatHasChanged == m_comboBox_osc1_fm_src1) + { + srcID = ModSrc1_findByName(comboBoxThatHasChanged->getText()); + if (srcID >= 0) + getProcessor()->setParam(paramID, (synth_float_t)srcID, true, true); + + opID = ModSrcOP_findByName(comboBoxThatHasChanged->getText()); + if (opID >= 0) + getProcessor()->setParam(SYNTH_PARAM_OSC_1_FM_SRC_OP, (synth_float_t)opID, true, true); + } + else if (comboBoxThatHasChanged == m_comboBox_osc0_pwm_src1) + { + srcID = ModSrc1_findByName(comboBoxThatHasChanged->getText()); + if (srcID >= 0) + getProcessor()->setParam(paramID, (synth_float_t)srcID, true, true); + + opID = ModSrcOP_findByName(comboBoxThatHasChanged->getText()); + if (opID >= 0) + getProcessor()->setParam(SYNTH_PARAM_OSC_0_PWM_SRC_OP, (synth_float_t)opID, true, true); + } + else if (comboBoxThatHasChanged == m_comboBox_osc1_pwm_src1) + { + srcID = ModSrc1_findByName(comboBoxThatHasChanged->getText()); + if (srcID >= 0) + getProcessor()->setParam(paramID, (synth_float_t)srcID, true, true); + + opID = ModSrcOP_findByName(comboBoxThatHasChanged->getText()); + if (opID >= 0) + getProcessor()->setParam(SYNTH_PARAM_OSC_1_PWM_SRC_OP, (synth_float_t)opID, true, true); + } + else if (comboBoxThatHasChanged == m_comboBox_osc0_am_src1) + { + srcID = ModSrc1_findByName(comboBoxThatHasChanged->getText()); + if (srcID >= 0) + getProcessor()->setParam(paramID, (synth_float_t)srcID, true, true); + + opID = ModSrcOP_findByName(comboBoxThatHasChanged->getText()); + if (opID >= 0) + getProcessor()->setParam(SYNTH_PARAM_OSC_0_AM_SRC_OP, (synth_float_t)opID, true, true); + } + else if (comboBoxThatHasChanged == m_comboBox_osc1_am_src1) + { + srcID = ModSrc1_findByName(comboBoxThatHasChanged->getText()); + if (srcID >= 0) + getProcessor()->setParam(paramID, (synth_float_t)srcID, true, true); + + opID = ModSrcOP_findByName(comboBoxThatHasChanged->getText()); + if (opID >= 0) + getProcessor()->setParam(SYNTH_PARAM_OSC_1_AM_SRC_OP, (synth_float_t)opID, true, true); + } + else if (comboBoxThatHasChanged == m_comboBox_vcf_f_src1) + { + srcID = ModSrc1_findByName(comboBoxThatHasChanged->getText()); + if (srcID >= 0) + getProcessor()->setParam(paramID, (synth_float_t)srcID, true, true); + + opID = ModSrcOP_findByName(comboBoxThatHasChanged->getText()); + if (opID >= 0) + getProcessor()->setParam(SYNTH_PARAM_VCF_F_SRC_OP, (synth_float_t)opID, true, true); + } + else if (comboBoxThatHasChanged == m_comboBox_vcf_q_src1) + { + srcID = ModSrc1_findByName(comboBoxThatHasChanged->getText()); + if (srcID >= 0) + getProcessor()->setParam(paramID, (synth_float_t)srcID, true, true); + + opID = ModSrcOP_findByName(comboBoxThatHasChanged->getText()); + if (opID >= 0) + getProcessor()->setParam(SYNTH_PARAM_VCF_Q_SRC_OP, (synth_float_t)opID, true, true); + } + return; + //[/UsercomboBoxChanged_Pre] + + if (comboBoxThatHasChanged == m_comboBox_osc0_shape) + { + //[UserComboBoxCode_m_comboBox_osc0_shape] -- add your combo box handling code here.. + //[/UserComboBoxCode_m_comboBox_osc0_shape] + } + else if (comboBoxThatHasChanged == m_comboBox_osc1_shape) + { + //[UserComboBoxCode_m_comboBox_osc1_shape] -- add your combo box handling code here.. + //[/UserComboBoxCode_m_comboBox_osc1_shape] + } + else if (comboBoxThatHasChanged == m_comboBox_lfo0_shape) + { + //[UserComboBoxCode_m_comboBox_lfo0_shape] -- add your combo box handling code here.. + //[/UserComboBoxCode_m_comboBox_lfo0_shape] + } + else if (comboBoxThatHasChanged == m_comboBox_lfo1_shape) + { + //[UserComboBoxCode_m_comboBox_lfo1_shape] -- add your combo box handling code here.. + //[/UserComboBoxCode_m_comboBox_lfo1_shape] + } + else if (comboBoxThatHasChanged == m_comboBox_lfo2_shape) + { + //[UserComboBoxCode_m_comboBox_lfo2_shape] -- add your combo box handling code here.. + //[/UserComboBoxCode_m_comboBox_lfo2_shape] + } + else if (comboBoxThatHasChanged == m_comboBox_lfo3_shape) + { + //[UserComboBoxCode_m_comboBox_lfo3_shape] -- add your combo box handling code here.. + //[/UserComboBoxCode_m_comboBox_lfo3_shape] + } + else if (comboBoxThatHasChanged == m_comboBox_vcf_f_src0) + { + //[UserComboBoxCode_m_comboBox_vcf_f_src0] -- add your combo box handling code here.. + //[/UserComboBoxCode_m_comboBox_vcf_f_src0] + } + else if (comboBoxThatHasChanged == m_comboBox_osc0_fm_src0) + { + //[UserComboBoxCode_m_comboBox_osc0_fm_src0] -- add your combo box handling code here.. + //[/UserComboBoxCode_m_comboBox_osc0_fm_src0] + } + else if (comboBoxThatHasChanged == m_comboBox_osc1_fm_src0) + { + //[UserComboBoxCode_m_comboBox_osc1_fm_src0] -- add your combo box handling code here.. + //[/UserComboBoxCode_m_comboBox_osc1_fm_src0] + } + else if (comboBoxThatHasChanged == m_comboBox_vca_am_src0) + { + //[UserComboBoxCode_m_comboBox_vca_am_src0] -- add your combo box handling code here.. + //[/UserComboBoxCode_m_comboBox_vca_am_src0] + } + else if (comboBoxThatHasChanged == m_comboBox_vca_pan_src0) + { + //[UserComboBoxCode_m_comboBox_vca_pan_src0] -- add your combo box handling code here.. + //[/UserComboBoxCode_m_comboBox_vca_pan_src0] + } + else if (comboBoxThatHasChanged == m_comboBox_vcf_type) + { + //[UserComboBoxCode_m_comboBox_vcf_type] -- add your combo box handling code here.. + //[/UserComboBoxCode_m_comboBox_vcf_type] + } + else if (comboBoxThatHasChanged == m_comboBox_osc0_pwm_src0) + { + //[UserComboBoxCode_m_comboBox_osc0_pwm_src0] -- add your combo box handling code here.. + //[/UserComboBoxCode_m_comboBox_osc0_pwm_src0] + } + else if (comboBoxThatHasChanged == m_comboBox_osc1_pwm_src0) + { + //[UserComboBoxCode_m_comboBox_osc1_pwm_src0] -- add your combo box handling code here.. + //[/UserComboBoxCode_m_comboBox_osc1_pwm_src0] + } + else if (comboBoxThatHasChanged == m_comboBox_noise_shape) + { + //[UserComboBoxCode_m_comboBox_noise_shape] -- add your combo box handling code here.. + //[/UserComboBoxCode_m_comboBox_noise_shape] + } + else if (comboBoxThatHasChanged == m_comboBox_vcf_order) + { + //[UserComboBoxCode_m_comboBox_vcf_order] -- add your combo box handling code here.. + //[/UserComboBoxCode_m_comboBox_vcf_order] + } + else if (comboBoxThatHasChanged == m_comboBox_osc1_fm_src1) + { + //[UserComboBoxCode_m_comboBox_osc1_fm_src1] -- add your combo box handling code here.. + //[/UserComboBoxCode_m_comboBox_osc1_fm_src1] + } + else if (comboBoxThatHasChanged == m_comboBox_osc1_pwm_src1) + { + //[UserComboBoxCode_m_comboBox_osc1_pwm_src1] -- add your combo box handling code here.. + //[/UserComboBoxCode_m_comboBox_osc1_pwm_src1] + } + else if (comboBoxThatHasChanged == m_comboBox_osc0_fm_src1) + { + //[UserComboBoxCode_m_comboBox_osc0_fm_src1] -- add your combo box handling code here.. + //[/UserComboBoxCode_m_comboBox_osc0_fm_src1] + } + else if (comboBoxThatHasChanged == m_comboBox_osc0_pwm_src1) + { + //[UserComboBoxCode_m_comboBox_osc0_pwm_src1] -- add your combo box handling code here.. + //[/UserComboBoxCode_m_comboBox_osc0_pwm_src1] + } + else if (comboBoxThatHasChanged == m_comboBox_osc1_am_src0) + { + //[UserComboBoxCode_m_comboBox_osc1_am_src0] -- add your combo box handling code here.. + //[/UserComboBoxCode_m_comboBox_osc1_am_src0] + } + else if (comboBoxThatHasChanged == m_comboBox_osc1_am_src1) + { + //[UserComboBoxCode_m_comboBox_osc1_am_src1] -- add your combo box handling code here.. + //[/UserComboBoxCode_m_comboBox_osc1_am_src1] + } + else if (comboBoxThatHasChanged == m_comboBox_osc0_am_src0) + { + //[UserComboBoxCode_m_comboBox_osc0_am_src0] -- add your combo box handling code here.. + //[/UserComboBoxCode_m_comboBox_osc0_am_src0] + } + else if (comboBoxThatHasChanged == m_comboBox_osc0_am_src1) + { + //[UserComboBoxCode_m_comboBox_osc0_am_src1] -- add your combo box handling code here.. + //[/UserComboBoxCode_m_comboBox_osc0_am_src1] + } + else if (comboBoxThatHasChanged == m_comboBox_vcf_f_src1) + { + //[UserComboBoxCode_m_comboBox_vcf_f_src1] -- add your combo box handling code here.. + //[/UserComboBoxCode_m_comboBox_vcf_f_src1] + } + else if (comboBoxThatHasChanged == m_comboBox_vcf_q_src0) + { + //[UserComboBoxCode_m_comboBox_vcf_q_src0] -- add your combo box handling code here.. + //[/UserComboBoxCode_m_comboBox_vcf_q_src0] + } + else if (comboBoxThatHasChanged == m_comboBox_vcf_q_src1) + { + //[UserComboBoxCode_m_comboBox_vcf_q_src1] -- add your combo box handling code here.. + //[/UserComboBoxCode_m_comboBox_vcf_q_src1] + } + + //[UsercomboBoxChanged_Post] + //[/UsercomboBoxChanged_Post] +} + + + +//[MiscUserCode] You can add your own definitions of your custom methods or any other code here... +int JaySynthAudioProcessorEditor::ModSrc0_findByName(String name) +{ + int i; + + for (i=0; i < VOICE_NUM_MOD_SOURCES_0; i++) + { + if (name.contains(m_mod_src0_names[i])) + break; + } + + if (i == VOICE_NUM_MOD_SOURCES_0) + return -1; + + return i; +} + +int JaySynthAudioProcessorEditor::ModSrc1_findByName(String name) +{ + int i; + + for (i=0; i < VOICE_NUM_MOD_SOURCES_1; i++) + { + if (name.contains(m_mod_src1_names[i])) + break; + } + + if (i == VOICE_NUM_MOD_SOURCES_1) + return -1; + + return i; +} + +int JaySynthAudioProcessorEditor::ModSrcOP_findByName(String name) +{ + int i; + + for (i=0; i < VOICE_NUM_MOD_OPS; i++) + { + if (name.substring(0, 2).contains(m_mod_src_op_names[i])) + break; + } + + if (i == VOICE_NUM_MOD_OPS) + return -1; + + return i; +} + +int JaySynthAudioProcessorEditor::ModSrc1_CB_getIndex(int srcID, int opID) +{ + if (srcID == 0) + return 1; + + return 1 + opID*(VOICE_NUM_MOD_SOURCES_1-1) + srcID; +} + +void JaySynthAudioProcessorEditor::buttonClicked (Button* buttonThatWasClicked) +{ + int paramID; + float value; + param_info_t *pParamInfo; + + if (buttonThatWasClicked == m_button_patch_incr) + { + getProcessor()->setCurrentProgram(getProcessor()->getCurrentProgram()+1); + return; + } + else if (buttonThatWasClicked == m_button_patch_decr) + { + getProcessor()->setCurrentProgram(getProcessor()->getCurrentProgram()-1); + return; + } + + paramID = (int)(buttonThatWasClicked->getComponentID()).getTrailingIntValue(); + value = (float)buttonThatWasClicked->getToggleState(); + pParamInfo = getParamInfo(paramID); + if (pParamInfo) + getProcessor()->setParam(paramID, toParam(pParamInfo, (synth_float_t)value), true, true); + + if (buttonThatWasClicked == m_button_humanize_enable) + { + getProcessor()->humanizeModeChanged(); + } + + if (buttonThatWasClicked == m_button_unisono_enable) + { + getProcessor()->unisonoModeChanged(); + } + + if (buttonThatWasClicked == m_button_mono_enable) + { + getProcessor()->unisonoModeChanged(); + } + +} + +void JaySynthAudioProcessorEditor::mouseDown (const MouseEvent &m) +{ + int paramID; + Component *componentThatWasClicked = (Component*)m.eventComponent; + paramID = componentThatWasClicked->getComponentID().getTrailingIntValue(); + + if (m.mods.isRightButtonDown() && !m.mods.isShiftDown()) + { + if (componentThatWasClicked->getComponentID().contains(L"SLIDER")) + { + switch (paramID) + { + // These parameters don't support per voice modulation + case SYNTH_PARAM_VOLUME: + case SYNTH_PARAM_TUNE: + case SYNTH_PARAM_VOICE_PAN_SPREAD: + case SYNTH_PARAM_HUMANIZE_VAR_VCO: + case SYNTH_PARAM_HUMANIZE_VAR_VCF: + case SYNTH_PARAM_HUMANIZE_VAR_ENV: + case SYNTH_PARAM_PORTAMENTO_TIME: + return; + + default: + break; + } + VelKey_PopUp_show(componentThatWasClicked); + } + } + + if (m.mods.isRightButtonDown() && m.mods.isShiftDown()) + { + // Comboboxes don't support midicontroller assignments + if (componentThatWasClicked->getComponentID().contains(L"COMBOBOX")) + { + return; + } + MidiCC_PopUp_show(componentThatWasClicked); + } +} + +void JaySynthAudioProcessorEditor::mouseDoubleClick (const MouseEvent &/*m*/) +{ +} + +void JaySynthAudioProcessorEditor::VelKey_PopUp_show(Component *componentThatWasClicked) +{ + int paramID, compX, compY, mainSizeX, mainSizeY, popupSizeX, popupSizeY; + synth_float_t currentParamValue; + JaySynthMidiCC *pMidiCC; + JaySynth::midi_note_info_t *pCurrentMidiNoteInfo; + + if (m_VelKey_PopUp) + return; + + if (componentThatWasClicked->getName().isEmpty()) + return; + + paramID = (int)(componentThatWasClicked->getComponentID()).getTrailingIntValue(); + currentParamValue = getProcessor()->getParam(paramID); + pCurrentMidiNoteInfo = getProcessor()->getLastMidiNoteInfos(); + + pMidiCC = getProcessor()->getMidiCC_editBuffer(); + addChildComponent (m_VelKey_PopUp = new VelKey_PopUp(pMidiCC, paramID, currentParamValue, pCurrentMidiNoteInfo, componentThatWasClicked->getName(), this)); + + compX = componentThatWasClicked->getX(); + compY = componentThatWasClicked->getY(); + mainSizeX = this->getWidth(); + mainSizeY = this->getHeight(); + popupSizeX = m_VelKey_PopUp->getWidth(); + popupSizeY = m_VelKey_PopUp->getHeight(); + + if ((compX + popupSizeX) > mainSizeX) + compX = mainSizeX - popupSizeX; + + if ((compY + popupSizeY) > mainSizeY) + compY = mainSizeY - popupSizeY; + + m_VelKey_PopUp->setBounds(compX, compY, popupSizeX, popupSizeY); + m_VelKey_PopUp->show(); +// m_VelKey_PopUp->enterModalState(); + +} + +void JaySynthAudioProcessorEditor::VelKey_PopUp_event(int event) +{ + int paramID; + switch (event) + { + case VelKey_PopUp::POPUP_OK: + paramID = m_VelKey_PopUp->getParamID(); + m_label_patch_name->setText(getProcessor()->getCurrentProgramName(), false); + paramUpdate(paramID, false); + deleteAndZero (m_VelKey_PopUp); + break; + + case VelKey_PopUp::POPUP_PARAM_CHANGED: + paramID = m_VelKey_PopUp->getParamID(); + m_label_patch_name->setText(getProcessor()->getCurrentProgramName(), false); + getProcessor()->perVoiceControlChanged(paramID); + paramUpdate(paramID, false); + break; + + default: + break; + } +}; + +void JaySynthAudioProcessorEditor::MidiCC_PopUp_show(Component *componentThatWasClicked) +{ + int paramID, compX, compY, mainSizeX, mainSizeY, popupSizeX, popupSizeY; + synth_float_t currentParamValue; + JaySynthMidiCC *pMidiCC; + JaySynth::midiCC_info_t *pCurrentMidiCCinfo; + + if (m_MidiCC_PopUp) + return; + + if (componentThatWasClicked->getName().isEmpty()) + return; + + paramID = (int)(componentThatWasClicked->getComponentID()).getTrailingIntValue(); + currentParamValue = getProcessor()->getParam(paramID); + pCurrentMidiCCinfo = getProcessor()->getLastMidiControllers(); + + pMidiCC = getProcessor()->getMidiCC_editBuffer(); + addChildComponent (m_MidiCC_PopUp = new MidiCC_PopUp(pMidiCC, paramID, currentParamValue, pCurrentMidiCCinfo, componentThatWasClicked->getName(), this)); + compX = componentThatWasClicked->getX(); + compY = componentThatWasClicked->getY(); + mainSizeX = this->getWidth(); + mainSizeY = this->getHeight(); + popupSizeX = m_MidiCC_PopUp->getWidth(); + popupSizeY = m_MidiCC_PopUp->getHeight(); + + if ((compX + popupSizeX) > mainSizeX) + compX = mainSizeX - popupSizeX; + + if ((compY + popupSizeY) > mainSizeY) + compY = mainSizeY - popupSizeY; + + m_MidiCC_PopUp->setBounds(compX, compY, popupSizeX, popupSizeY); + m_MidiCC_PopUp->show(); +// m_MidiCC_PopUp->enterModalState(); + +} + +void JaySynthAudioProcessorEditor::MidiCC_PopUp_event(int event) +{ + int paramID; + switch (event) + { + case MidiCC_PopUp::POPUP_OK: + paramID = m_MidiCC_PopUp->getParamID(); + getProcessor()->setParam(paramID, m_MidiCC_PopUp->getCurrentParamValue(), false, false); + getProcessor()->controlParam(paramID, m_MidiCC_PopUp->getCurrentControlValue()); + m_label_patch_name->setText(getProcessor()->getCurrentProgramName(), false); + deleteAndZero (m_MidiCC_PopUp); + break; + + case MidiCC_PopUp::POPUP_PARAM_CHANGED: + paramID = m_MidiCC_PopUp->getParamID(); + getProcessor()->setParam(paramID, m_MidiCC_PopUp->getCurrentParamValue(), false, false); + getProcessor()->controlParam(paramID, m_MidiCC_PopUp->getCurrentControlValue()); + break; + + default: + break; + } +}; + +void JaySynthAudioProcessorEditor::actionListenerCallback (const String &message) +{ + int type, paramID, note, limiter_on; + String key, value; + StringPairArray spa; + String s = message; + float velocity; + + do + { + key = s.substring(0, s.indexOfChar('=')); + s = s.trimCharactersAtStart(key + "="); + value = s.substring(0, s.indexOfChar(' ')); + s = s.trimCharactersAtStart(value + "="); + spa.set(key, value); + s = s.substring(s.indexOfChar(' ')+1); + + } while (s != String::empty); + + type = spa.getValue("type", "-1").getIntValue(); + switch (type) + { + case JaySynthActionListener::JAYSYNTH_CHANGED_PARAM: + paramID = spa.getValue("paramID", "-1").getIntValue(); + if (paramID < 0) + break; + paramUpdate(paramID, false); + m_label_patch_name->setText(getProcessor()->getCurrentProgramName(), false); + if (m_VelKey_PopUp) + m_VelKey_PopUp->setCurrParam(paramID, (float)getProcessor()->getParam(paramID)); + break; + + case JaySynthActionListener::JAYSYNTH_CHANGED_MIDICC: + JaySynth::midiCC_info_t midi_info; + midi_info.channel = spa.getValue("ch", "-1").getIntValue(); + midi_info.ID = spa.getValue("id", "-1").getIntValue(); + midi_info.value = spa.getValue("value", "-1").getFloatValue(); + + if (m_MidiCC_PopUp) + m_MidiCC_PopUp->setControllerID(midi_info.ID); + + break; + + case JaySynthActionListener::JAYSYNTH_CHANGED_NOTE_PRESSED: + note = spa.getValue("note", "-1").getIntValue(); + velocity = spa.getValue("velocity", "-1").getFloatValue(); + + if (m_VelKey_PopUp) + m_VelKey_PopUp->setKeyVel(note, velocity); + + break; + + case JaySynthActionListener::JAYSYNTH_CHANGED_NOTE_RELEASED: + note = spa.getValue("note", "-1").getIntValue(); + velocity = spa.getValue("velocity", "-1").getFloatValue(); + + break; + + case JaySynthActionListener::JAYSYNTH_CHANGED_PROGRAM: + m_label_patch_name->setText(getProcessor()->getCurrentProgramName(), false); + m_label_patch_number->setText(String::formatted("%02d", getProcessor()->getCurrentProgram()), false); + break; + + case JaySynthActionListener::JAYSYNTH_CHANGED_LIMITER: + limiter_on = spa.getValue("value", "-1").getIntValue(); + m_btn_limiter_led->setToggleState(limiter_on != 0, false); + break; + + case JaySynthActionListener::JAYSYNTH_CHANGED_NUM_VOICES_PLAYING: + paramID = spa.getValue("value", "-1").getIntValue(); + if (paramID < 0) + break; + m_label_num_voices_playing->setText(String::formatted("%d", paramID), false); + break; + + default: + break; + } +} + +void JaySynthAudioProcessorEditor::paramUpdate(int paramID, bool doHostUpdate) +{ + Slider *pSlider; + Label *pLabel; + ComboBox *pComboBox; + Button *pButton; + JaySynthMidiCC *pMidiCC; + midiCC_container_t *pMidiCC_container; + Colour slider_colour; + Colour label_colour; + Colour combobox_colour; + + pMidiCC = getProcessor()->getMidiCC_editBuffer(); + pMidiCC_container = pMidiCC->getAtParamID(paramID); + + if (doHostUpdate) + getProcessor()->sendParamChangeToHost(paramID, getProcessor()->getParameter(paramID)); + + combobox_colour = Colour(0xffffffff); + slider_colour = Colour(0x7fffffff); + label_colour = Colour(0xff000000); + if (pMidiCC->isAssigned(pMidiCC_container)) + { + combobox_colour = Colour(0xffffff00); + slider_colour = Colour(0xffffff00); + if (pMidiCC->doChangeParameter(pMidiCC_container)) + { + combobox_colour = Colour(0xffffff00); + slider_colour = Colour(0xffffff00); + } + } + if (pMidiCC->isAssignedVel(pMidiCC_container)) + { + label_colour = Colour(0xffffff00); + } + if (pMidiCC->isAssignedKey(pMidiCC_container)) + { + label_colour = Colour(0xffffff00); + } + + pSlider = (Slider*)findChildWithID(String("SLIDER ") + String(paramID)); + if (pSlider) + { + pSlider->setValue(getProcessor()->getParameter(paramID), false); + pSlider->setColour (Slider::rotarySliderFillColourId, slider_colour); + } + + pLabel = (Label*)findChildWithID(String("LABEL ") + String(paramID)); + if (pLabel) + { + pLabel->setText((String)getProcessor()->getParameterText(paramID), false); + pLabel->setColour (Label::textColourId, label_colour); + } + + pComboBox = (ComboBox*)findChildWithID(String("COMBOBOX ") + String(paramID)); + if (pComboBox) + { + switch(paramID) + { + case SYNTH_PARAM_OSC_0_FM_SRC_1: + pComboBox->setSelectedId(ModSrc1_CB_getIndex((int)getProcessor()->getParam(paramID), (int)getProcessor()->getParam(SYNTH_PARAM_OSC_0_FM_SRC_OP)), true); + break; + case SYNTH_PARAM_OSC_1_FM_SRC_1: + pComboBox->setSelectedId(ModSrc1_CB_getIndex((int)getProcessor()->getParam(paramID), (int)getProcessor()->getParam(SYNTH_PARAM_OSC_1_FM_SRC_OP)), true); + break; + case SYNTH_PARAM_OSC_0_AM_SRC_1: + pComboBox->setSelectedId(ModSrc1_CB_getIndex((int)getProcessor()->getParam(paramID), (int)getProcessor()->getParam(SYNTH_PARAM_OSC_0_AM_SRC_OP)), true); + break; + case SYNTH_PARAM_OSC_1_AM_SRC_1: + pComboBox->setSelectedId(ModSrc1_CB_getIndex((int)getProcessor()->getParam(paramID), (int)getProcessor()->getParam(SYNTH_PARAM_OSC_1_AM_SRC_OP)), true); + break; + case SYNTH_PARAM_OSC_0_PWM_SRC_1: + pComboBox->setSelectedId(ModSrc1_CB_getIndex((int)getProcessor()->getParam(paramID), (int)getProcessor()->getParam(SYNTH_PARAM_OSC_0_PWM_SRC_OP)), true); + break; + case SYNTH_PARAM_OSC_1_PWM_SRC_1: + pComboBox->setSelectedId(ModSrc1_CB_getIndex((int)getProcessor()->getParam(paramID), (int)getProcessor()->getParam(SYNTH_PARAM_OSC_1_PWM_SRC_OP)), true); + break; + case SYNTH_PARAM_VCF_F_SRC_1: + pComboBox->setSelectedId(ModSrc1_CB_getIndex((int)getProcessor()->getParam(paramID), (int)getProcessor()->getParam(SYNTH_PARAM_VCF_F_SRC_OP)), true); + break; + case SYNTH_PARAM_VCF_Q_SRC_1: + pComboBox->setSelectedId(ModSrc1_CB_getIndex((int)getProcessor()->getParam(paramID), (int)getProcessor()->getParam(SYNTH_PARAM_VCF_Q_SRC_OP)), true); + break; + + default: + pComboBox->setSelectedId(1 + (int)getProcessor()->getParam(paramID), true); + break; + } + pComboBox->setColour (ComboBox:: backgroundColourId, combobox_colour); + } + + pButton = (Button*)findChildWithID(String("BUTTON ") + String(paramID)); + if (pButton) + { + pButton->setToggleState(getProcessor()->getParameter(paramID) > 0.5, false); + } + +} + +// This timer periodically checks whether any of the vcf's parameters have changed... +void JaySynthAudioProcessorEditor::timerCallback() +{ +} +//[/MiscUserCode] + + +//============================================================================== +#if 0 +/* -- Jucer information section -- + + This is where the Jucer puts all of its metadata, so don't change anything in here! + +BEGIN_JUCER_METADATA + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +END_JUCER_METADATA +*/ +#endif + +//============================================================================== +// Binary resources - be careful not to edit any of these sections! + +// JUCER_RESOURCE: led_23_red_png, 820, "C:/Users/jens/Pictures/led_23_red.png" +static const unsigned char resource_JaySynthAudioProcessorEditor_led_23_red_png[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,32,0,0,0,32,8,6,0,0,0,115,122,122,244,0,0,0,1,115,82,71,66,0,174, +206,28,233,0,0,0,4,103,65,77,65,0,0,177,143,11,252,97,5,0,0,0,9,112,72,89,115,0,0,14,195,0,0,14,195,1,199,111,168,100,0,0,2,201,73,68,65,84,88,71,237,84,77,79,26,81,20,125,51,128,56,200,48,10,242,49,45, +6,148,50,72,45,137,74,213,64,210,16,43,196,208,32,154,74,109,218,212,29,38,74,237,166,11,235,166,254,0,22,46,92,179,169,174,26,211,96,93,117,221,244,159,116,103,210,29,173,216,152,156,222,59,66,226,162, +59,199,38,77,120,201,201,187,51,239,222,123,206,189,239,67,136,222,232,117,160,215,129,94,7,254,215,14,36,18,9,111,50,153,124,96,24,70,238,159,214,80,169,84,222,44,46,46,54,106,181,218,175,157,157,29, +108,111,111,131,190,207,253,126,255,161,162,40,183,43,38,151,203,45,111,109,109,181,26,141,6,154,205,38,78,78,154,56,58,58,66,189,94,71,181,90,133,174,235,63,169,27,43,183,210,145,124,62,159,221,216,216, +104,29,28,28,224,248,248,35,90,173,31,56,59,251,142,201,201,73,238,0,214,215,215,81,40,20,160,170,42,139,120,111,181,8,185,88,44,30,238,238,238,98,111,111,15,167,167,159,112,121,217,194,254,126,29,195, +195,195,112,58,157,112,187,221,72,167,211,136,70,163,32,242,15,4,217,74,17,246,181,181,181,246,230,230,38,150,150,150,48,59,59,131,233,233,105,208,190,131,246,29,146,36,193,227,81,77,17,154,166,241,119, +155,200,251,173,18,32,5,131,65,163,84,42,161,92,46,155,196,99,99,99,8,4,2,112,185,92,144,108,14,24,70,2,153,204,44,188,222,33,174,190,139,123,100,75,86,136,112,208,190,38,178,217,44,166,166,166,16,139, +197,64,130,224,86,61,144,6,52,40,129,48,50,243,5,100,30,229,232,16,222,185,46,96,142,200,29,86,8,112,201,178,60,154,74,165,218,76,30,10,133,160,122,60,176,15,250,209,63,18,135,158,158,67,118,245,41,50, +165,34,84,22,208,215,199,34,46,8,35,4,197,10,1,78,74,18,165,170,63,155,228,170,10,89,113,195,17,140,32,52,147,65,120,225,49,178,47,159,35,62,159,131,208,117,8,218,22,242,255,194,49,4,142,189,241,232,227, +100,118,187,125,153,200,207,109,202,0,132,234,131,8,142,64,142,39,32,167,82,38,132,97,116,5,240,1,92,237,8,224,216,27,15,62,205,119,9,51,66,150,223,9,215,96,91,120,67,16,209,81,136,241,113,136,137,137, +171,153,175,159,207,119,97,250,176,239,85,140,37,91,96,167,68,94,194,4,161,64,4,175,133,170,125,19,225,240,111,17,137,64,140,146,16,182,53,237,43,173,213,76,159,43,95,142,225,216,27,15,126,80,184,146, +48,225,33,225,9,225,25,225,133,176,217,222,154,130,132,120,213,249,199,107,236,195,190,28,99,217,99,100,163,100,30,66,164,67,144,167,185,68,88,233,128,237,133,206,26,251,176,175,37,213,119,219,199,15, +10,39,228,196,92,221,125,66,154,192,119,157,193,118,146,192,251,222,37,183,228,17,234,10,224,153,19,114,39,184,181,67,4,157,192,119,157,193,54,255,227,53,246,177,156,252,111,66,248,142,51,33,131,237,91, +39,190,46,162,103,247,58,96,89,7,254,0,38,229,208,224,232,174,221,11,0,0,0,0,73,69,78,68,174,66,96,130,0,0}; + +const char* JaySynthAudioProcessorEditor::led_23_red_png = (const char*) resource_JaySynthAudioProcessorEditor_led_23_red_png; +const int JaySynthAudioProcessorEditor::led_23_red_pngSize = 820; + +// JUCER_RESOURCE: led_23_red1_png, 1556, "C:/Users/jens/Pictures/led_23_red1.png" +static const unsigned char resource_JaySynthAudioProcessorEditor_led_23_red1_png[] = { 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,32,0,0,0,32,8,6,0,0,0,115,122,122,244,0,0,0,1,115,82,71,66,0, +174,206,28,233,0,0,0,4,103,65,77,65,0,0,177,143,11,252,97,5,0,0,0,9,112,72,89,115,0,0,14,195,0,0,14,195,1,199,111,168,100,0,0,5,169,73,68,65,84,88,71,197,87,11,80,148,85,20,62,139,15,18,36,205,23,246, +82,18,199,28,84,124,101,78,22,154,142,212,48,105,54,49,162,77,106,84,44,67,142,137,174,38,141,137,173,248,66,69,99,65,217,101,97,5,97,137,76,5,241,177,147,47,124,84,12,96,234,16,249,200,199,84,128,89, +12,54,129,153,186,66,167,243,237,254,59,187,12,168,187,232,232,206,124,243,223,189,247,124,223,61,247,156,123,207,127,127,162,182,252,204,172,34,51,123,9,218,43,64,91,213,22,41,247,57,206,9,189,101,50, +31,129,159,160,139,2,180,209,135,49,56,229,229,190,240,189,44,157,19,119,82,38,237,38,79,127,193,83,130,103,21,160,141,62,140,193,25,216,62,0,71,204,220,78,132,58,10,58,11,158,80,38,121,70,158,207,9,158, +23,12,82,128,54,250,48,6,71,96,11,14,184,237,238,181,198,150,227,246,28,99,114,132,20,43,234,46,120,82,208,87,48,64,48,88,48,66,240,162,2,180,209,135,49,216,192,22,28,112,161,1,45,15,246,136,61,236,32, +98,21,8,43,4,3,4,88,105,176,96,148,224,21,193,4,5,104,163,15,99,176,129,45,56,224,66,3,90,110,238,11,251,228,29,4,216,84,93,5,8,105,31,1,86,135,9,176,234,177,130,80,193,36,5,104,163,15,99,176,129,45,56, +224,66,3,90,208,188,135,19,45,67,223,67,72,200,107,127,1,66,140,85,134,8,94,19,188,41,152,170,0,109,244,97,12,54,176,5,7,92,104,184,153,10,187,3,174,171,239,45,255,145,211,129,130,225,130,49,130,137,130, +201,202,196,51,229,9,192,17,244,97,12,54,176,5,7,92,104,184,70,225,14,123,193,89,92,28,187,30,155,232,105,65,160,178,34,132,247,85,65,152,32,92,149,125,235,189,246,250,63,230,119,72,253,45,78,254,207, +64,159,50,6,27,216,34,10,224,66,3,90,142,83,113,135,162,213,60,252,143,11,161,167,0,231,28,249,28,166,172,108,98,39,99,109,100,96,252,206,67,225,171,205,214,168,141,5,60,107,195,87,60,70,163,179,250,168, +211,143,169,82,170,163,92,162,0,14,184,208,128,22,52,239,114,34,236,14,160,120,60,38,64,133,235,37,112,132,127,164,180,67,186,166,94,212,76,209,26,111,36,237,40,102,243,225,147,156,127,172,130,51,247, +31,231,21,249,7,57,114,195,86,238,253,238,202,155,180,230,140,6,182,2,112,28,105,128,22,52,161,141,57,90,73,67,243,138,135,156,33,119,40,46,65,130,81,157,13,191,79,157,188,56,245,70,66,174,133,179,246, +151,242,181,127,235,249,207,134,191,57,104,237,81,126,93,119,128,103,164,236,226,80,109,14,251,69,44,191,73,186,234,8,112,20,46,52,28,251,224,46,21,178,249,6,68,37,195,57,238,39,24,76,57,77,163,135,44, +48,238,139,94,151,205,115,245,5,188,253,196,69,110,108,186,206,73,37,85,220,99,77,57,251,45,59,202,221,227,10,121,228,146,124,14,152,99,98,138,249,250,27,112,108,92,187,6,180,160,233,56,142,173,70,192, +245,4,192,24,245,29,155,104,8,25,235,95,158,16,187,214,26,161,53,240,248,181,22,30,170,175,224,96,253,143,220,99,221,9,246,91,85,206,222,203,75,185,95,82,9,251,125,178,151,187,104,138,88,165,206,179,82, +90,237,56,27,215,174,1,45,143,28,64,5,179,59,176,229,118,176,111,66,201,180,49,177,201,28,178,40,93,66,126,132,251,126,113,130,123,38,157,100,223,245,167,217,75,247,11,79,179,92,102,109,73,13,7,233,79, +49,105,15,49,45,42,100,250,188,100,42,184,46,14,64,211,237,8,56,29,48,93,31,214,241,211,125,211,131,230,108,226,192,185,153,220,119,213,17,246,151,149,251,232,46,178,42,163,150,123,110,187,202,218,74, +65,197,21,126,169,232,28,83,198,247,76,73,22,166,184,61,31,146,112,219,234,128,51,5,134,186,225,180,96,247,219,1,243,54,91,123,47,200,99,255,101,7,217,87,119,129,189,179,235,56,192,210,192,227,203,235, +57,225,82,29,107,207,95,230,62,187,43,152,204,135,153,210,10,111,211,66,203,20,50,92,69,65,106,83,10,156,155,48,165,102,4,205,43,120,171,91,108,206,119,254,241,22,246,75,252,129,85,250,106,238,181,243, +47,142,168,104,224,119,42,235,120,197,133,43,28,94,122,129,41,79,86,111,148,213,47,205,42,3,135,192,245,96,19,58,174,88,56,42,206,99,152,82,51,140,98,119,76,105,23,101,252,204,119,245,113,171,215,198, +159,153,114,107,88,181,187,150,125,14,93,225,78,251,126,229,142,69,103,152,190,44,99,202,60,192,148,188,205,74,234,180,120,112,196,1,164,192,163,99,216,178,16,25,174,14,150,20,132,209,7,233,106,138,49, +153,200,120,214,74,5,85,76,7,4,123,46,49,21,96,242,114,38,83,49,83,202,206,219,20,157,106,18,219,104,210,236,10,35,67,29,142,33,138,153,91,133,200,245,18,226,44,197,166,235,3,41,254,219,113,20,179,101, +6,205,212,197,81,148,222,64,169,71,206,81,209,233,70,218,46,57,207,147,201,51,138,27,73,155,127,150,222,215,25,108,54,176,5,7,92,15,75,49,210,208,252,101,148,211,216,159,146,206,191,64,11,247,78,38,245, +230,24,154,149,186,148,34,211,214,83,84,230,38,250,56,103,43,205,222,146,39,109,189,173,15,99,176,129,45,56,224,186,253,50,194,197,236,78,175,227,140,134,65,180,242,84,136,8,135,83,76,206,108,82,155,226, +41,58,43,145,62,50,39,219,128,182,122,243,18,138,201,157,109,179,129,173,177,30,247,69,15,94,199,78,7,92,239,130,246,11,73,110,83,127,210,203,113,76,172,28,79,139,139,195,73,83,164,166,249,133,26,201, +243,98,27,236,237,40,219,24,108,96,11,142,199,23,18,187,19,173,95,201,114,155,6,80,230,181,225,164,171,10,161,213,149,147,40,161,124,58,45,43,139,180,1,237,196,159,222,176,141,153,254,193,228,109,188, +146,57,238,199,119,187,148,230,254,55,148,178,111,141,150,13,54,86,28,10,181,1,109,244,97,236,190,47,165,173,167,226,33,95,203,157,145,120,68,31,38,174,159,42,143,244,211,172,117,71,30,242,199,105,107, +31,118,15,240,243,252,127,1,108,76,65,198,225,150,95,0,0,0,0,73,69,78,68,174,66,96,130,0,0}; + +const char* JaySynthAudioProcessorEditor::led_23_red1_png = (const char*) resource_JaySynthAudioProcessorEditor_led_23_red1_png; +const int JaySynthAudioProcessorEditor::led_23_red1_pngSize = 1556; diff --git a/Source/JaySynthAudioProcessorEditor.h b/Source/JaySynthAudioProcessorEditor.h new file mode 100644 index 0000000..4e90e97 --- /dev/null +++ b/Source/JaySynthAudioProcessorEditor.h @@ -0,0 +1,330 @@ +/* + ============================================================================== + + This is an automatically generated file created by the Jucer! + + Creation date: 31 Mar 2014 12:38:24pm + + Be careful when adding custom code to these files, as only the code within + the "//[xyz]" and "//[/xyz]" sections will be retained when the file is loaded + and re-saved. + + Jucer version: 1.12 + + ------------------------------------------------------------------------------ + + The Jucer is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-6 by Raw Material Software ltd. + + ============================================================================== +*/ + +#ifndef __JUCER_HEADER_JAYSYNTHAUDIOPROCESSOREDITOR_JAYSYNTHAUDIOPROCESSOREDITOR_1F0BC626__ +#define __JUCER_HEADER_JAYSYNTHAUDIOPROCESSOREDITOR_JAYSYNTHAUDIOPROCESSOREDITOR_1F0BC626__ + +//[Headers] -- You can add your own extra header files here -- +#include "../JuceLibraryCode/JuceHeader.h" +#include "PluginProcessor.h" +#include "ButtonLED.h" +#include "MidiCC_PopUp.h" +#include "VelKey_PopUp.h" +//[/Headers] + +#include "ButtonLED.h" + + +//============================================================================== +/** + //[Comments] + An auto-generated component, created by the Jucer. + + Describe your class and how it works here! + //[/Comments] +*/ +class JaySynthAudioProcessorEditor : public AudioProcessorEditor, + public Timer, + public ButtonListener, + public ActionListener, + public MidiCC_PopUp_Listener, + public VelKey_PopUp_Listener, + public SliderListener, + public LabelListener, + public ComboBoxListener +{ +public: + //============================================================================== + JaySynthAudioProcessorEditor (JaySynthAudioProcessor* ownerFilter, bool has_wt); + ~JaySynthAudioProcessorEditor(); + + //============================================================================== + //[UserMethods] -- You can add your own custom methods in this section. + void timerCallback(); + void update_sliders(); + void paramUpdate(int paramID, bool doHostUpdate); + void buttonClicked (Button* buttonThatWasClicked); + void mouseDoubleClick (const MouseEvent &m); + void mouseDown (const MouseEvent &m); + void changeListenerCallback (ChangeBroadcaster* source); + void actionListenerCallback (const String &message); + void MidiCC_PopUp_event(int event); + void VelKey_PopUp_event(int event); + void MidiCC_PopUp_show(Component *componentThatWasClicked); + void VelKey_PopUp_show(Component *componentThatWasClicked); + int ModSrc0_findByName(String name); + int ModSrc1_findByName(String name); + int ModSrcOP_findByName(String name); + int ModSrc1_CB_getIndex(int srcID, int opID); + + //[/UserMethods] + + void paint (Graphics& g); + void resized(); + void sliderValueChanged (Slider* sliderThatWasMoved); + void labelTextChanged (Label* labelThatHasChanged); + void comboBoxChanged (ComboBox* comboBoxThatHasChanged); + + // Binary resources: + static const char* led_23_red_png; + static const int led_23_red_pngSize; + static const char* led_23_red1_png; + static const int led_23_red1_pngSize; + + + //============================================================================== + juce_UseDebuggingNewOperator + +private: + //[UserVariables] -- You can add your own custom variables in this section. + JaySynthAudioProcessor* getProcessor() const + { + return static_cast (getAudioProcessor()); + } + TooltipWindow *m_tooltipWindow; + MidiCC_PopUp *m_MidiCC_PopUp; + VelKey_PopUp *m_VelKey_PopUp; + String m_mod_src0_names[VOICE_NUM_MOD_SOURCES_0]; + String m_mod_src1_names[VOICE_NUM_MOD_SOURCES_1]; + String m_mod_src_op_names[VOICE_NUM_MOD_OPS]; + String m_mod_src0_cb_names[VOICE_NUM_MOD_SOURCES_0]; + String m_mod_src1_cb_names[(VOICE_NUM_MOD_SOURCES_1-1)*VOICE_NUM_MOD_OPS + 1]; + //[/UserVariables] + + //============================================================================== + Label* m_label_colon; + Slider* m_slider_master_volume; + Slider* m_slider_vcf_f; + Slider* m_slider_vcf_q; + Slider* m_slider_osc0_det; + Slider* m_slider_osc1_det; + Slider* m_slider_osc0_transpose; + Slider* m_slider_osc1_transpose; + Slider* m_slider_vca_env_attack; + Slider* m_slider_vca_env_decay; + Slider* m_slider_vca_env_release; + Slider* m_slider_vca_env_sustain; + Slider* m_slider_vcf_env_attack; + Slider* m_slider_vcf_env_decay; + Slider* m_slider_vcf_env_release; + Slider* m_slider_vcf_env_sustain; + Slider* m_slider_vcf_env_amount; + Label* m_label_vcf_env_attack; + Label* m_label_vcf_f; + Label* m_label_vca_env_attack; + Label* m_label_vca_env_decay; + Label* m_label_vca_env_sustain; + Label* m_label_vca_env_release; + Label* m_label_vcf_env_decay; + Label* m_label_vcf_env_sustain; + Label* m_label_vcf_env_release; + Label* m_label_vcf_q; + Label* m_label_vcf_env_amount; + Label* m_label_master_volume; + Label* m_label_osc0_transpose; + Label* m_label_osc1_transpose; + Label* m_label_osc0_det; + Label* m_label_osc1_det; + Slider* m_slider_vca_env_amount; + Label* m_label_vca_env_amount; + Slider* m_slider_osc0_dutycycle; + Slider* m_slider_osc1_dutycycle; + Label* m_label_osc0_dutycycle; + Label* m_label_osc1_dutycycle; + Slider* m_slider_lfo0_speed; + Slider* m_slider_osc1_fm_amt0; + Slider* m_slider_osc0_fm_amt0; + Label* m_label_lfo0_speed; + Label* m_label_osc0_fm_amt0; + Label* m_label_osc1_fm_amt0; + Slider* m_slider_vcf_f_amt0; + Label* m_label_vcf_f_amt0; + Slider* m_slider_lfo1_speed; + Label* m_label_lfo1_speed; + ComboBox* m_comboBox_osc0_shape; + ComboBox* m_comboBox_osc1_shape; + ComboBox* m_comboBox_lfo0_shape; + ComboBox* m_comboBox_lfo1_shape; + Slider* m_slider_lfo2_speed; + Slider* m_slider_lfo3_speed; + ComboBox* m_comboBox_lfo2_shape; + ComboBox* m_comboBox_lfo3_shape; + Label* m_label_lfo2_speed; + Label* m_label_lfo3_speed; + ComboBox* m_comboBox_vcf_f_src0; + ComboBox* m_comboBox_osc0_fm_src0; + ComboBox* m_comboBox_osc1_fm_src0; + Slider* m_slider_vca_am_amt0; + Label* m_label_vca_am_amt0; + ComboBox* m_comboBox_vca_am_src0; + Slider* m_slider_vca_pan_amt0; + Label* m_label_vca_pan_amt0; + ComboBox* m_comboBox_vca_pan_src0; + Label* m_label_synth_name; + Label* m_label_synth_version; + ComboBox* m_comboBox_vcf_type; + Slider* m_slider_lfo1_smooth; + Label* m_label_lfo1_smooth; + Slider* m_slider_lfo0_smooth; + Label* m_label_lfo0_smooth; + Slider* m_slider_lfo2_smooth; + Label* m_label_lfo2_smooth; + Slider* m_slider_lfo3_smooth; + Label* m_label_lfo3_smooth; + Slider* m_slider_osc0_pwm_amt0; + Label* m_label_osc0_pwm_amt0; + Slider* m_slider_osc1_pwm_amt0; + Label* m_label_osc1_pwm_amt0; + ComboBox* m_comboBox_osc0_pwm_src0; + ComboBox* m_comboBox_osc1_pwm_src0; + Slider* m_slider_osc0_level; + Label* m_label_osc0_level; + Slider* m_slider_osc1_level; + Label* m_label_osc1_level; + Slider* m_slider_noise_level; + Label* m_label_noise_level; + ComboBox* m_comboBox_noise_shape; + ButtonLED* m_btn_noise_enable_led; + ButtonLED* m_btn_osc0_enable; + ButtonLED* m_btn_osc1_enable; + Label* m_label_patch_name; + TextButton* m_button_patch_incr; + TextButton* m_button_patch_decr; + Label* m_label_patch_number; + Label* m_label_osc1_pb_min; + Label* m_label_osc1_pb_max; + Label* m_label_osc0_pb_max; + Label* m_label_osc0_pb_min; + Slider* m_slider_master_tune; + Label* m_label_master_tune; + ToggleButton* m_button_humanize_enable; + ComboBox* m_comboBox_vcf_order; + Slider* m_slider_portamento_time; + Label* m_label_portamento_time; + ToggleButton* m_button_unisono_enable; + Slider* m_slider_humanize_var_vco; + Slider* m_slider_voice_pan_spread; + Label* m_label_voice_pan_spread; + Slider* m_slider_humanize_var_vcf; + Slider* m_slider_humanize_var_env; + Label* m_label_unisono_num_voices; + ToggleButton* m_button_osc0_restart_enable; + ToggleButton* m_button_osc1_restart_enable; + ToggleButton* m_button_mono_enable; + ComboBox* m_comboBox_osc1_fm_src1; + ComboBox* m_comboBox_osc1_pwm_src1; + ComboBox* m_comboBox_osc0_fm_src1; + ComboBox* m_comboBox_osc0_pwm_src1; + ComboBox* m_comboBox_osc1_am_src0; + ComboBox* m_comboBox_osc1_am_src1; + Slider* m_slider_osc1_am_amt0; + Label* m_label_osc1_am_amt0; + ComboBox* m_comboBox_osc0_am_src0; + ComboBox* m_comboBox_osc0_am_src1; + Slider* m_slider_osc0_am_amt0; + Label* m_label_osc0_am_amt0; + Slider* m_slider_env2_attack; + Slider* m_slider_env2_decay; + Slider* m_slider_env2_release; + Slider* m_slider_env2_sustain; + Label* m_label_env2_attack; + Label* m_label_env2_decay; + Label* m_label_env2_sustain; + Label* m_label_env2_release; + Slider* m_slider_env3_attack; + Slider* m_slider_env3_decay; + Slider* m_slider_env3_release; + Slider* m_slider_env3_sustain; + Label* m_label_env3_attack; + Label* m_label_env3_decay; + Label* m_label_env3_sustain; + Label* m_label_env3_release; + ComboBox* m_comboBox_vcf_f_src1; + Slider* m_slider_vcf_q_amt0; + Label* m_label_vcf_q_amt0; + ComboBox* m_comboBox_vcf_q_src0; + ComboBox* m_comboBox_vcf_q_src1; + Label* m_label_humanize_var_vco; + Label* m_label_humanize_var_vcf; + Label* m_label_humanize_var_env; + ButtonLED* m_btn_limiter_led; + Label* m_label_limiter_led; + Slider* m_slider_lfo0_delay; + Label* m_label_lfo0_delay; + Slider* m_slider_lfo0_attack; + Label* m_label_lfo0_attack; + Slider* m_slider_lfo1_delay; + Label* m_label_lfo1_delay; + Slider* m_slider_lfo1_attack; + Label* m_label_lfo1_attack; + Slider* m_slider_lfo2_delay; + Label* m_label_lfo2_delay; + Slider* m_slider_lfo2_attack; + Label* m_label_lfo2_attack; + Slider* m_slider_lfo3_delay; + Label* m_label_lfo3_delay; + Slider* m_slider_lfo3_attack; + Label* m_label_lfo3_attack; + ToggleButton* m_button_lfo0_restart_enable; + ToggleButton* m_button_lfo0_individual_enable; + Slider* m_slider_lfo0_symmetry; + Label* m_label_lfo0_symmetry; + Slider* m_slider_lfo1_symmetry; + Label* m_label_lfo1_symmetry; + ToggleButton* m_button_lfo1_restart_enable; + ToggleButton* m_button_lfo1_individual_enable; + ToggleButton* m_button_lfo2_restart_enable; + ToggleButton* m_button_lfo2_individual_enable; + Slider* m_slider_lfo2_symmetry; + Label* m_label_lfo2_symmetry; + Slider* m_slider_lfo3_symmetry; + Label* m_label_lfo3_symmetry; + ToggleButton* m_button_lfo3_restart_enable; + ToggleButton* m_button_lfo3_individual_enable; + Slider* m_slider_osc0_fm_amt1; + Label* m_label_osc0_fm_amt1; + Slider* m_slider_osc0_pwm_amt1; + Label* m_label_osc0_pwm_amt1; + Slider* m_slider_osc0_am_amt1; + Label* m_label_osc0_am_amt1; + Slider* m_slider_osc1_fm_amt1; + Label* m_label_osc1_fm_amt1; + Slider* m_slider_osc1_pwm_amt1; + Label* m_label_osc1_pwm_amt1; + Slider* m_slider_osc1_am_amt1; + Label* m_label_osc1_am_amt1; + Slider* m_slider_vcf_f_amt1; + Label* m_label_vcf_f_amt1; + Slider* m_slider_vcf_q_amt1; + Label* m_label_vcf_q_amt1; + ToggleButton* m_button_mono_retrigger; + Label* m_label_max_num_voices; + Label* m_label_num_voices_playing; + + + //============================================================================== + // (prevent copy constructor and operator= being generated..) + JaySynthAudioProcessorEditor (const JaySynthAudioProcessorEditor&); + const JaySynthAudioProcessorEditor& operator= (const JaySynthAudioProcessorEditor&); +}; + + +#endif // __JUCER_HEADER_JAYSYNTHAUDIOPROCESSOREDITOR_JAYSYNTHAUDIOPROCESSOREDITOR_1F0BC626__ diff --git a/Source/JaySynthMidiCC.cpp b/Source/JaySynthMidiCC.cpp new file mode 100644 index 0000000..a93d89d --- /dev/null +++ b/Source/JaySynthMidiCC.cpp @@ -0,0 +1,741 @@ +/* + ============================================================================== + + This file was auto-generated! + + It contains the basic startup code for a Juce application. + + ============================================================================== +*/ +#include "../JuceLibraryCode/JuceHeader.h" +#include "synth_defs.h" +#include "JaySynthMidiCC.h" + +//============================================================================== +JaySynthMidiCC::JaySynthMidiCC() +{ + int i; + param_info_t *pConstraints; + + for (i=0; i < SYNTH_NUM_PARAMS; i++) + { + pConstraints = getParamInfo(i); + + // Constraints + paramInfoInit(&midiCC_containers[i].constraints, i, pConstraints->pName); + paramInfoSet(&midiCC_containers[i].constraints, + /*base*/pConstraints->base, + /*kexp*/pConstraints->kexp, + /*scenter*/pConstraints->scenter, + /*pmin*/pConstraints->pmin, + /*pcenter*/pConstraints->pcenter, + /*pmax*/pConstraints->pmax, + /*pinterval*/pConstraints->pinterval); + + // Control + paramInfoInit(&midiCC_containers[i].control, i, pConstraints->pName); + paramInfoSet(&midiCC_containers[i].control, + /*base*/1, + /*kexp*/1, + /*scenter*/0.5, + /*pmin*/0, + /*pcenter*/-1E18, + /*pmax*/pConstraints->pmax, + /*pinterval*/pConstraints->pinterval); + + // Parameters + paramInfoInit(&midiCC_containers[i].param, i, pConstraints->pName); + paramInfoSet(&midiCC_containers[i].param, + /*base*/pConstraints->base, + /*kexp*/pConstraints->kexp, + /*scenter*/pConstraints->scenter, + /*pmin*/pConstraints->pmin, + /*pcenter*/-1E18, + /*pmax*/pConstraints->pmax, + /*pinterval*/pConstraints->pinterval); + + midiCC_containers[i].doChangeParameter = false; + midiCC_containers[i].controllerID = 0; + midiCC_containers[i].isAssigned = false; + midiCC_containers[i].doApplyOnPatchInit = false; + + // Velocity + paramInfoInit(&midiCC_containers[i].curve_vel, i, pConstraints->pName); + paramInfoSet(&midiCC_containers[i].curve_vel, + /*base*/exp(1.0), + /*kexp*/0, + /*scenter*/0.0, + /*pmin*/0, + /*pcenter*/-1E18, + /*pmax*/1, + /*pinterval*/0); + + // Key follow + paramInfoInit(&midiCC_containers[i].curve_key, i, pConstraints->pName); + paramInfoSet(&midiCC_containers[i].curve_key, + /*base*/exp(1.0), + /*kexp*/0, + /*scenter*/0.0, + /*pmin*/0, + /*pcenter*/-1E18, + /*pmax*/1, + /*pinterval*/0); + + midiCC_containers[i].isVelAssigned = false; + midiCC_containers[i].isKeyAssigned = false; + midiCC_containers[i].velKeyCombineOP = VELKEY_OP_ADD; + + isModified = false; + paramNamedValueSet.set(toParameterNameXML(String(pConstraints->pName)), var(i)); + } +} +JaySynthMidiCC::~JaySynthMidiCC() +{ + int i; + + for (i=0; i < SYNTH_NUM_PARAMS; i++) + { + paramInfoFree(&midiCC_containers[i].constraints); + paramInfoFree(&midiCC_containers[i].control); + paramInfoFree(&midiCC_containers[i].param); + paramInfoFree(&midiCC_containers[i].curve_vel); + paramInfoFree(&midiCC_containers[i].curve_key); + } + + for (i=0; i < NUM_MIDI_CONTROLLERS; i++) + removeDestinations(i); +} + +JaySynthMidiCC& JaySynthMidiCC::operator= (JaySynthMidiCC& other) +{ + if (this != &other) + { + this->copyMidiCC(&other); + } + return *this; +} + +void JaySynthMidiCC::copyMidiCC(JaySynthMidiCC *pSrc) +{ + int i; + midiCC_container_t *pMidiContainerSrc, *pMidiContainerDst; + + for (i=0; i < NUM_MIDI_CONTROLLERS; i++) + removeDestinations(i); + + pMidiContainerSrc = pSrc->midiCC_containers; + pMidiContainerDst = this->midiCC_containers; + for (i=0; i < SYNTH_NUM_PARAMS; i++) + { + paramInfoCopy(&pMidiContainerDst[i].constraints, &pMidiContainerSrc[i].constraints); + paramInfoCopy(&pMidiContainerDst[i].control, &pMidiContainerSrc[i].control); + paramInfoCopy(&pMidiContainerDst[i].param, &pMidiContainerSrc[i].param); + pMidiContainerDst[i].doChangeParameter = pMidiContainerSrc[i].doChangeParameter; + pMidiContainerDst[i].doApplyOnPatchInit = pMidiContainerSrc[i].doApplyOnPatchInit; + pMidiContainerDst[i].controllerID = pMidiContainerSrc[i].controllerID; + pMidiContainerDst[i].isAssigned = 0; + + if (pMidiContainerSrc[i].isAssigned) + { + add(&pMidiContainerDst[i], pMidiContainerSrc[i].controllerID); + } + } + + for (i=0; i < SYNTH_NUM_PARAMS; i++) + { + paramInfoCopy(&pMidiContainerDst[i].curve_vel, &pMidiContainerSrc[i].curve_vel); + paramInfoCopy(&pMidiContainerDst[i].curve_key, &pMidiContainerSrc[i].curve_key); + pMidiContainerDst[i].isVelAssigned = pMidiContainerSrc[i].isVelAssigned; + pMidiContainerDst[i].isKeyAssigned = pMidiContainerSrc[i].isKeyAssigned; + pMidiContainerDst[i].velKeyCombineOP = pMidiContainerSrc[i].velKeyCombineOP; + } + + isModified = false; +} + +bool JaySynthMidiCC::isMidiCCmodified(void) +{ + return isModified; +} + +JaySynthMidiCC* JaySynthMidiCC::getMidiCC(void) +{ + return this; +} + +const String JaySynthMidiCC::toParameterNameXML (String name) +{ + name = name.removeCharacters (String(".")); + name = name.replaceCharacter (' ','_'); + + return name; +} + +int JaySynthMidiCC::findParamID_byName(String name) +{ + return (int)paramNamedValueSet.getWithDefault (toParameterNameXML(name), var(-1)); +} + +void JaySynthMidiCC::exportXML(String name) +{ + File file(name); + XmlElement xml ("JSYNTH_MIDICC_TABLE_FILE"); + + exportXML(&xml); + + file.create(); + xml.writeToFile (/*const File &destinationFile*/file, /*const String &dtdToUse*/"JSYNTH_MIDICC_TABLE_FILE" /*, const String &encodingType="UTF-8", int lineWrapLength=60*/); +} + +void JaySynthMidiCC::exportXML(XmlElement *pXML_doc) +{ + int paramID; + midiCC_container_t *pMidiContainer; + XmlElement *pXML, *pXML_root, *pXML_PARAM, *pXML_PARAM_INFO; + + // Store controller and slider infos + pXML_root = pXML_doc->createNewChildElement (String("JSYNTH_MIDICONTROLLER_TABLE")); + pXML = pXML_root->createNewChildElement (String("TARGETS")); + for (paramID=0; paramID < SYNTH_NUM_PARAMS; paramID++) + { + pMidiContainer = &midiCC_containers[paramID]; + pXML_PARAM = pXML->createNewChildElement (String("PARAM_") + String(paramID)); + pXML_PARAM->setAttribute ("NAME", toParameterNameXML(pMidiContainer->constraints.pName)); + pXML_PARAM->setAttribute ("IS_ASSIGNED", pMidiContainer->isAssigned); + pXML_PARAM->setAttribute ("IS_ABSOLUTE", pMidiContainer->doChangeParameter); + pXML_PARAM->setAttribute ("DO_APPLY_ON_PATCH_INIT", pMidiContainer->doApplyOnPatchInit); + pXML_PARAM->setAttribute ("CONTROLLER_ID", pMidiContainer->controllerID); + + pXML_PARAM->setAttribute ("IS_VELOCITY_ASSIGNED", pMidiContainer->isVelAssigned); + pXML_PARAM->setAttribute ("IS_KEYFOLLOW_ASSIGNED", pMidiContainer->isKeyAssigned); + pXML_PARAM->setAttribute ("VELKEY_COMBINE_OP", pMidiContainer->velKeyCombineOP); + + pXML_PARAM_INFO = pXML_PARAM->createNewChildElement (String("RELATIVE")); +// pXML_PARAM_INFO->setAttribute ("BASE", String(pMidiContainer->control.base, 10)); +// pXML_PARAM_INFO->setAttribute ("KEXP", String(pMidiContainer->control.kexp, 10)); +// pXML_PARAM_INFO->setAttribute ("SCENTER", String(pMidiContainer->control.scenter, 10)); + pXML_PARAM_INFO->setAttribute ("PMIN", String(pMidiContainer->control.pmin, 10)); + pXML_PARAM_INFO->setAttribute ("PMAX", String(pMidiContainer->control.pmax, 10)); +// pXML_PARAM_INFO->setAttribute ("PINTERVAL", String(pMidiContainer->control.pinterval, 10)); + + pXML_PARAM_INFO = pXML_PARAM->createNewChildElement (String("ABSOLUTE")); +// pXML_PARAM_INFO->setAttribute ("BASE", String(pMidiContainer->param.base, 10)); +// pXML_PARAM_INFO->setAttribute ("KEXP", String(pMidiContainer->param.kexp, 10)); +// pXML_PARAM_INFO->setAttribute ("SCENTER", String(pMidiContainer->param.scenter, 10)); + pXML_PARAM_INFO->setAttribute ("PMIN", String(pMidiContainer->param.pmin, 10)); + pXML_PARAM_INFO->setAttribute ("PMAX", String(pMidiContainer->param.pmax, 10)); +// pXML_PARAM_INFO->setAttribute ("PINTERVAL", String(pMidiContainer->param.pinterval, 10)); + + pXML_PARAM_INFO = pXML_PARAM->createNewChildElement (String("VELOCITY_CURVE")); +// pXML_PARAM_INFO->setAttribute ("BASE", String(pMidiContainer->curve_vel.base, 10)); + pXML_PARAM_INFO->setAttribute ("KEXP", String(pMidiContainer->curve_vel.kexp, 10)); + pXML_PARAM_INFO->setAttribute ("SCENTER", String(pMidiContainer->curve_vel.scenter, 10)); + pXML_PARAM_INFO->setAttribute ("PMIN", String(pMidiContainer->curve_vel.pmin, 10)); + pXML_PARAM_INFO->setAttribute ("PMAX", String(pMidiContainer->curve_vel.pmax, 10)); + pXML_PARAM_INFO->setAttribute ("PINTERVAL", String(pMidiContainer->curve_vel.pinterval, 10)); + + pXML_PARAM_INFO = pXML_PARAM->createNewChildElement (String("KEYFOLLOW_CURVE")); +// pXML_PARAM_INFO->setAttribute ("BASE", String(pMidiContainer->curve_key.base, 10)); + pXML_PARAM_INFO->setAttribute ("KEXP", String(pMidiContainer->curve_key.kexp, 10)); + pXML_PARAM_INFO->setAttribute ("SCENTER", String(pMidiContainer->curve_key.scenter, 10)); + pXML_PARAM_INFO->setAttribute ("PMIN", String(pMidiContainer->curve_key.pmin, 10)); + pXML_PARAM_INFO->setAttribute ("PMAX", String(pMidiContainer->curve_key.pmax, 10)); + pXML_PARAM_INFO->setAttribute ("PINTERVAL", String(pMidiContainer->curve_key.pinterval, 10)); + } + +/* + { + int i, controllerID, numDst; + XmlElement *pXML_dst, *pXML_MIDICC; + + // todo: romove that in future versions + pXML = pXML_root->createNewChildElement (String("CONTROLLERS")); + // Store MIDI controller assignments + for (controllerID=0; controllerID < NUM_MIDI_CONTROLLERS; controllerID++) + { + pXML_MIDICC = pXML->createNewChildElement (String("MIDICC_") + String(controllerID)); + pXML_MIDICC->setAttribute ("ID", controllerID); + + pXML_dst = pXML_MIDICC->createNewChildElement (String("TARGETS")); + numDst = getNumDestinations(controllerID); + for (i=0; i < numDst; i++) + { + pMidiContainer = getDestination(controllerID, i); + pXML_dst->setAttribute (String("PARAM") + String(pMidiContainer->constraints.id), pMidiContainer->constraints.pName); + } + } + } + // todo: romove that in future versions +*/ +} + +int JaySynthMidiCC::importXML(String name) +{ + File file(name); + XmlDocument xml(file); + + ScopedPointer pXML_root (xml.getDocumentElement()); + + return importXML(pXML_root); +} + +int JaySynthMidiCC::importXML(XmlElement *pXML_doc) +{ + int i, paramID; + midiCC_container_t *pMidiContainer; + XmlElement *pXML, *pXML_root, *pXML_PARAM, *pXML_PARAM_INFO; + + for (i=0; i < NUM_MIDI_CONTROLLERS; i++) + removeDestinations(i); + + pXML_root = pXML_doc->getChildByName ("JSYNTH_MIDICONTROLLER_TABLE"); + // make sure that it's actually our type of XML object.. + if (pXML_root) + { + pXML = pXML_root->getFirstChildElement(); + while(pXML) + { + pXML_PARAM = pXML->getFirstChildElement(); + while(pXML_PARAM) + { + paramID = findParamID_byName(pXML_PARAM->getStringAttribute("NAME")); + if (paramID < 0) + { + pXML_PARAM = pXML_PARAM->getNextElement(); + continue; + } + + pMidiContainer = &midiCC_containers[paramID]; + pMidiContainer->doChangeParameter = pXML_PARAM->getIntAttribute("IS_ABSOLUTE", pXML_PARAM->getIntAttribute("DO_CHANGE_PARAMETER", 0)) != 0; + pMidiContainer->doApplyOnPatchInit = pXML_PARAM->getIntAttribute("DO_APPLY_ON_PATCH_INIT", 0) != 0; + + pMidiContainer->isVelAssigned = pXML_PARAM->getIntAttribute("IS_VELOCITY_ASSIGNED", 0) != 0; + pMidiContainer->isKeyAssigned = pXML_PARAM->getIntAttribute("IS_KEYFOLLOW_ASSIGNED", 0) != 0; + pMidiContainer->velKeyCombineOP = pXML_PARAM->getIntAttribute("VELKEY_COMBINE_OP", VELKEY_OP_ADD); + + pXML_PARAM_INFO = pXML_PARAM->getChildByName(String("RELATIVE")); + if (pXML_PARAM_INFO) + { +// pMidiContainer->control.base = pXML_PARAM_INFO->getDoubleAttribute("BASE", pMidiContainer->constraints.base); +// pMidiContainer->control.kexp = pXML_PARAM_INFO->getDoubleAttribute("KEXP", pMidiContainer->constraints.kexp); +// pMidiContainer->control.scenter = pXML_PARAM_INFO->getDoubleAttribute("SCENTER", pMidiContainer->constraints.scenter); + pMidiContainer->control.pmin = pXML_PARAM_INFO->getDoubleAttribute("PMIN", pMidiContainer->constraints.pmin); + pMidiContainer->control.pmax = pXML_PARAM_INFO->getDoubleAttribute("PMAX", pMidiContainer->constraints.pmax); +// pMidiContainer->control.pinterval = pXML_PARAM_INFO->getDoubleAttribute("PINTERVAL", pMidiContainer->constraints.pinterval); + } + + pXML_PARAM_INFO = pXML_PARAM->getChildByName(String("ABSOLUTE")); + if (pXML_PARAM_INFO) + { +// pMidiContainer->param.base = pXML_PARAM_INFO->getDoubleAttribute("BASE", pMidiContainer->constraints.base); +// pMidiContainer->param.kexp = pXML_PARAM_INFO->getDoubleAttribute("KEXP", pMidiContainer->constraints.kexp); +// pMidiContainer->param.scenter = pXML_PARAM_INFO->getDoubleAttribute("SCENTER", pMidiContainer->constraints.scenter); + pMidiContainer->param.pmin = pXML_PARAM_INFO->getDoubleAttribute("PMIN", pMidiContainer->constraints.pmin); + pMidiContainer->param.pmax = pXML_PARAM_INFO->getDoubleAttribute("PMAX", pMidiContainer->constraints.pmax); +// pMidiContainer->param.pinterval = pXML_PARAM_INFO->getDoubleAttribute("PINTERVAL", pMidiContainer->constraints.pinterval); + } + + pXML_PARAM_INFO = pXML_PARAM->getChildByName(String("VELOCITY_CURVE")); + if (pXML_PARAM_INFO) + { +// pMidiContainer->curve_vel.base = pXML_PARAM_INFO->getDoubleAttribute("BASE", exp(1.0)); + pMidiContainer->curve_vel.kexp = pXML_PARAM_INFO->getDoubleAttribute("KEXP", 0); + pMidiContainer->curve_vel.scenter = pXML_PARAM_INFO->getDoubleAttribute("SCENTER", 0.5); + pMidiContainer->curve_vel.pmin = pXML_PARAM_INFO->getDoubleAttribute("PMIN", 0); + pMidiContainer->curve_vel.pmax = pXML_PARAM_INFO->getDoubleAttribute("PMAX", 1); +// pMidiContainer->curve_vel.pinterval = pXML_PARAM_INFO->getDoubleAttribute("PINTERVAL", 0); + } + + pXML_PARAM_INFO = pXML_PARAM->getChildByName(String("KEYFOLLOW_CURVE")); + if (pXML_PARAM_INFO) + { +// pMidiContainer->curve_key.base = pXML_PARAM_INFO->getDoubleAttribute("BASE", exp(1.0)); + pMidiContainer->curve_key.kexp = pXML_PARAM_INFO->getDoubleAttribute("KEXP", 0); + pMidiContainer->curve_key.scenter = pXML_PARAM_INFO->getDoubleAttribute("SCENTER", 0.5); + pMidiContainer->curve_key.pmin = pXML_PARAM_INFO->getDoubleAttribute("PMIN", 0); + pMidiContainer->curve_key.pmax = pXML_PARAM_INFO->getDoubleAttribute("PMAX", 1); +// pMidiContainer->curve_key.pinterval = pXML_PARAM_INFO->getDoubleAttribute("PINTERVAL", 0); + } + + if (pXML_PARAM->getIntAttribute("IS_ASSIGNED", 0)) + add(pMidiContainer, pXML_PARAM->getIntAttribute("CONTROLLER_ID", 0)); + + pXML_PARAM = pXML_PARAM->getNextElement(); + } + + // todo: romove that in future versions + { + int controllerID; + XmlElement *pXML_MIDICC, *pXML_DST; + + pXML = pXML->getNextElement(); + while(pXML) + { + pXML_MIDICC = pXML->getFirstChildElement(); + while(pXML_MIDICC) + { + controllerID = pXML_MIDICC->getIntAttribute("ID"); + pXML_DST = pXML_MIDICC->getFirstChildElement(); + if (pXML_DST) + { + for (i=0; i < pXML_DST->getNumAttributes(); i++) + { + paramID = findParamID_byName(pXML_DST->getAttributeValue(i)); + if (paramID < 0) + break; + pMidiContainer = &midiCC_containers[paramID]; + add(pMidiContainer, controllerID); + } + } + pXML_MIDICC = pXML_MIDICC->getNextElement(); + } + pXML = pXML->getNextElement(); + } + } + // todo: romove that in future versions + } + } + isModified = false; + return 0; +} + +void JaySynthMidiCC::add(midiCC_container_t *pObj, int controllerID) +{ + if (controllerID >= NUM_MIDI_CONTROLLERS) + return; + + remove(pObj, pObj->controllerID); + + if (midiCC_dest[controllerID].contains(pObj)) + return; + + pObj->isAssigned = 1; + pObj->controllerID = controllerID; + midiCC_dest[controllerID].append(pObj); + isModified = true; +} + +void JaySynthMidiCC::remove(midiCC_container_t *pObj, int controllerID) +{ + if (controllerID >= NUM_MIDI_CONTROLLERS) + return; + + pObj->isAssigned = 0; + if (midiCC_dest[controllerID].contains(pObj)) + { + midiCC_dest[controllerID].remove(pObj); + } + isModified = true; +} + +struct midiCC_container_t* JaySynthMidiCC::getAtParamID(int paramID) +{ + if (paramID >= SYNTH_NUM_PARAMS) + return NULL; + + return &midiCC_containers[paramID]; +} + +int JaySynthMidiCC::getNumDestinations(int controllerID) +{ + if (controllerID >= NUM_MIDI_CONTROLLERS) + return 0; + + return midiCC_dest[controllerID].size(); +} + +void JaySynthMidiCC::removeDestinations(int controllerID) +{ + int i; + + if (controllerID >= NUM_MIDI_CONTROLLERS) + return; + + int numDst = getNumDestinations(controllerID); + midiCC_container_t *pDst; + + for (i=0; i < numDst; i++) + { + pDst = getDestination(controllerID, 0); + remove(pDst, controllerID); + } + midiCC_dest[controllerID].deleteAll(); + isModified = true; +} + +midiCC_container_t* JaySynthMidiCC::getDestination(int controllerID, int index) +{ + if (controllerID >= NUM_MIDI_CONTROLLERS) + return NULL; + + midiCC_container_t *pDst; + if (index >= getNumDestinations(controllerID)) + return NULL; + + pDst = midiCC_dest[controllerID][index].get(); + return pDst; +} + +int JaySynthMidiCC::getParamID(midiCC_container_t *pObj) +{ + return pObj->constraints.id; +} + +int JaySynthMidiCC::getControllerID(midiCC_container_t *pObj) +{ + return pObj->controllerID; +} + +void JaySynthMidiCC::setControllerID(midiCC_container_t *pObj, int controllerID) +{ + if (controllerID >= NUM_MIDI_CONTROLLERS) + return; + + if(isAssigned(pObj)) + { + remove(pObj, pObj->controllerID); + add(pObj, controllerID); + } + pObj->controllerID = controllerID; + isModified = true; +} + +bool JaySynthMidiCC::isAssigned(midiCC_container_t *pObj) +{ + return pObj->isAssigned; +} + +void JaySynthMidiCC::setDoChangeParameter(midiCC_container_t *pObj, bool doChangeParameter) +{ + pObj->doChangeParameter = doChangeParameter; + isModified = true; +} + +bool JaySynthMidiCC::doChangeParameter(midiCC_container_t *pObj) +{ + return pObj->doChangeParameter; +} + +void JaySynthMidiCC::setDoApplyOnPatchInit(midiCC_container_t *pObj, bool doApplyOnPatchInit) +{ + pObj->doApplyOnPatchInit = doApplyOnPatchInit; + isModified = true; +} + +bool JaySynthMidiCC::doApplyOnPatchInit(midiCC_container_t *pObj) +{ + return pObj->doApplyOnPatchInit; +} + +synth_float_t JaySynthMidiCC::getConstraintsMin(midiCC_container_t *pObj) +{ + return pObj->constraints.pmin; +} + +synth_float_t JaySynthMidiCC::getConstraintsMax(midiCC_container_t *pObj) +{ + return pObj->constraints.pmax; +} + +param_info_t* JaySynthMidiCC::getConstraints(midiCC_container_t *pObj) +{ + return &pObj->constraints; +} + +synth_float_t JaySynthMidiCC::getControlMin(midiCC_container_t *pObj) +{ + return pObj->control.pmin; +} + +void JaySynthMidiCC::setControlMin(midiCC_container_t *pObj, synth_float_t value) +{ + pObj->control.pmin = value; + isModified = true; +} + +synth_float_t JaySynthMidiCC::getControlMax(midiCC_container_t *pObj) +{ + return pObj->control.pmax; +} + +void JaySynthMidiCC::setControlMax(midiCC_container_t *pObj, synth_float_t value) +{ + pObj->control.pmax = value; + isModified = true; +} + +param_info_t* JaySynthMidiCC::getControl(midiCC_container_t *pObj) +{ + return &pObj->control; +} + +synth_float_t JaySynthMidiCC::getParamMin(midiCC_container_t *pObj) +{ + return pObj->param.pmin; +} + +void JaySynthMidiCC::setParamMin(midiCC_container_t *pObj, synth_float_t value) +{ + pObj->param.pmin = value; + isModified = true; +} + +synth_float_t JaySynthMidiCC::getParamMax(midiCC_container_t *pObj) +{ + return pObj->param.pmax; +} + +void JaySynthMidiCC::setParamMax(midiCC_container_t *pObj, synth_float_t value) +{ + pObj->param.pmax = value; + isModified = true; +} + +param_info_t* JaySynthMidiCC::getParam(midiCC_container_t *pObj) +{ + return &pObj->param; +} + +param_info_t* JaySynthMidiCC::getVelCurve(midiCC_container_t *pObj) +{ + return &pObj->curve_vel; +} + +void JaySynthMidiCC::setVelCurveMin(midiCC_container_t *pObj, synth_float_t value) +{ + pObj->curve_vel.pmin = value; + isModified = true; +} + +void JaySynthMidiCC::setVelCurveMax(midiCC_container_t *pObj, synth_float_t value) +{ + pObj->curve_vel.pmax = value; + isModified = true; +} + +void JaySynthMidiCC::setVelCurveSkew(midiCC_container_t *pObj, synth_float_t value) +{ + pObj->curve_vel.scenter = value; + isModified = true; +} + +void JaySynthMidiCC::setVelCurveShape(midiCC_container_t *pObj, synth_float_t value) +{ + pObj->curve_vel.kexp = value; + isModified = true; +} + +param_info_t* JaySynthMidiCC::getKeyCurve(midiCC_container_t *pObj) +{ + return &pObj->curve_key; +} + +void JaySynthMidiCC::setKeyCurveMin(midiCC_container_t *pObj, synth_float_t value) +{ + pObj->curve_key.pmin = value; + isModified = true; +} + +void JaySynthMidiCC::setKeyCurveMax(midiCC_container_t *pObj, synth_float_t value) +{ + pObj->curve_key.pmax = value; + isModified = true; +} + +void JaySynthMidiCC::setKeyCurveSkew(midiCC_container_t *pObj, synth_float_t value) +{ + pObj->curve_key.scenter = value; + isModified = true; +} + +void JaySynthMidiCC::setKeyCurveShape(midiCC_container_t *pObj, synth_float_t value) +{ + pObj->curve_key.kexp = value; + isModified = true; +} + +bool JaySynthMidiCC::isAssignedVel(midiCC_container_t *pObj) +{ + return pObj->isVelAssigned; +} + +bool JaySynthMidiCC::isAssignedKey(midiCC_container_t *pObj) +{ + return pObj->isKeyAssigned; +} + +void JaySynthMidiCC::setAssignedVel(midiCC_container_t *pObj, bool active) +{ + pObj->isVelAssigned = active; + isModified = true; +} + +void JaySynthMidiCC::setAssignedKey(midiCC_container_t *pObj, bool active) +{ + pObj->isKeyAssigned = active; + isModified = true; +} + +int JaySynthMidiCC::getVelKeyCombineOP(midiCC_container_t *pObj) +{ + return pObj->velKeyCombineOP; +} + +void JaySynthMidiCC::setVelKeyCombineOP(midiCC_container_t *pObj, int combineOP) +{ + if (combineOP >= VELKEY_NUM_OPS) + return; + + pObj->velKeyCombineOP = combineOP; + isModified = true; +} + +bool JaySynthMidiCC::isAssignedVelKeyControl(int paramID) +{ + return isAssignedVel(&midiCC_containers[paramID]) || isAssignedKey(&midiCC_containers[paramID]); +} + +synth_float_t JaySynthMidiCC::getVelKeyControl(int paramID, synth_float_t vel, synth_float_t key) +{ + synth_float_t result, result_vel, result_key; + + result_vel = 0; + result_key = 0; + result = 0; + + if (isAssignedVel(&midiCC_containers[paramID])) + result_vel = toParam(&midiCC_containers[paramID].curve_vel, vel); + + if (isAssignedKey(&midiCC_containers[paramID])) + result_key = toParam(&midiCC_containers[paramID].curve_key, key/127); + + switch (midiCC_containers[paramID].velKeyCombineOP) + { + case VELKEY_OP_ADD: + result = min(1, max(-1, result_vel + result_key)); + break; + + case VELKEY_OP_SUB: + result = min(1, max(-1, result_vel - result_key)); + break; + + case VELKEY_OP_MUL: + if (!isAssignedVel(&midiCC_containers[paramID])) + { + result = result_key; + break; + } + if (!isAssignedKey(&midiCC_containers[paramID])) + { + result = result_vel; + break; + } + result = result_vel * result_key; + break; + + default: + break; + } + + return midiCC_containers[paramID].constraints.pmax*result; +} diff --git a/Source/JaySynthMidiCC.h b/Source/JaySynthMidiCC.h new file mode 100644 index 0000000..560fd82 --- /dev/null +++ b/Source/JaySynthMidiCC.h @@ -0,0 +1,116 @@ +/* + ============================================================================== + + This file was auto-generated! + + It contains the basic startup code for a Juce application. + + ============================================================================== +*/ + +#ifndef _JAYSYNTH_MIDICC_ +#define _JAYSYNTH_MIDICC_ + +#include "../JuceLibraryCode/JuceHeader.h" +#include "synth_defs.h" + +//============================================================================== +#define MIDICONTROLLER_TYPE_VELKEY 0x00000080 + +typedef struct midiCC_container_t +{ + int controllerID; + bool isAssigned; + bool doChangeParameter; + bool doApplyOnPatchInit; + param_info_t constraints; + param_info_t control; + param_info_t param; + bool isVelAssigned; + bool isKeyAssigned; + param_info_t curve_vel; + param_info_t curve_key; + int velKeyCombineOP; + LinkedListPointer nextListItem; +} midiCC_container_t; + +class JaySynthMidiCC +{ +public: + + JaySynthMidiCC(); + ~JaySynthMidiCC(); + + JaySynthMidiCC& operator= (JaySynthMidiCC& other); + void copyMidiCC(JaySynthMidiCC *pSrc); + JaySynthMidiCC* getMidiCC(void); + bool isMidiCCmodified(void); + const String toParameterNameXML (String name); + int findParamID_byName(String name); + void exportXML(String name); + void exportXML(XmlElement *pXML_doc); + int importXML(String name); + int importXML(XmlElement *pXML_doc); + void add(midiCC_container_t *pObj, int controllerID); + void remove(midiCC_container_t *pObj, int controllerID); + struct midiCC_container_t* getAtParamID(int paramID); + int getNumDestinations(int controllerID); + void removeDestinations(int controllerID); + midiCC_container_t* getDestination(int controllerID, int index); + int getParamID(midiCC_container_t *pObj); + int getControllerID(midiCC_container_t *pObj); + void setControllerID(midiCC_container_t *pObj, int controllerID); + bool isAssigned(midiCC_container_t *pObj); + void setDoChangeParameter(midiCC_container_t *pObj, bool doChangeParameter); + bool doChangeParameter(midiCC_container_t *pObj); + void setDoApplyOnPatchInit(midiCC_container_t *pObj, bool doApplyOnPatchInit); + bool doApplyOnPatchInit(midiCC_container_t *pObj); + synth_float_t getConstraintsMin(midiCC_container_t *pObj); + synth_float_t getConstraintsMax(midiCC_container_t *pObj); + param_info_t* getConstraints(midiCC_container_t *pObj); + synth_float_t getControlMin(midiCC_container_t *pObj); + void setControlMin(midiCC_container_t *pObj, synth_float_t value); + synth_float_t getControlMax(midiCC_container_t *pObj); + void setControlMax(midiCC_container_t *pObj, synth_float_t value); + param_info_t* getControl(midiCC_container_t *pObj); + synth_float_t getParamMin(midiCC_container_t *pObj); + void setParamMin(midiCC_container_t *pObj, synth_float_t value); + synth_float_t getParamMax(midiCC_container_t *pObj); + void setParamMax(midiCC_container_t *pObj, synth_float_t value); + param_info_t* getParam(midiCC_container_t *pObj); + param_info_t* getVelCurve(midiCC_container_t *pObj); + void setVelCurveMin(midiCC_container_t *pObj, synth_float_t value); + void setVelCurveMax(midiCC_container_t *pObj, synth_float_t value); + void setVelCurveSkew(midiCC_container_t *pObj, synth_float_t value); + void setVelCurveShape(midiCC_container_t *pObj, synth_float_t value); + param_info_t* getKeyCurve(midiCC_container_t *pObj); + void setKeyCurveMin(midiCC_container_t *pObj, synth_float_t value); + void setKeyCurveMax(midiCC_container_t *pObj, synth_float_t value); + void setKeyCurveSkew(midiCC_container_t *pObj, synth_float_t value); + void setKeyCurveShape(midiCC_container_t *pObj, synth_float_t value); + bool isAssignedVel(midiCC_container_t *pObj); + bool isAssignedKey(midiCC_container_t *pObj); + void setAssignedVel(midiCC_container_t *pObj, bool active); + void setAssignedKey(midiCC_container_t *pObj, bool active); + int getVelKeyCombineOP(midiCC_container_t *pObj); + void setVelKeyCombineOP(midiCC_container_t *pObj, int combineOP); + bool isAssignedVelKeyControl(int paramID); + synth_float_t getVelKeyControl(int paramID, synth_float_t vel, synth_float_t key); + + enum + { + VELKEY_OP_ADD = 0, + VELKEY_OP_SUB, + VELKEY_OP_MUL, + VELKEY_NUM_OPS + }; + +private: + midiCC_container_t midiCC_containers[SYNTH_NUM_PARAMS]; + LinkedListPointer midiCC_dest[NUM_MIDI_CONTROLLERS]; + NamedValueSet paramNamedValueSet; + bool isModified; + +}; + +#endif // _JAYSYNTH_MIDICC_ diff --git a/Source/JaySynthMonophonicMGR.cpp b/Source/JaySynthMonophonicMGR.cpp new file mode 100644 index 0000000..cc2311f --- /dev/null +++ b/Source/JaySynthMonophonicMGR.cpp @@ -0,0 +1,136 @@ +/* + ============================================================================== + + This file was generated by user! + + ============================================================================== +*/ + +#include +#include +#include +#include + +#include "synth_defs.h" +#include "JaySynthMonophonicMGR.h" + +/** A JaySynth voice that just plays incredible sounds.. */ +JaySynthMonophonicMGR::JaySynthMonophonicMGR() +{ + init(); +} + +JaySynthMonophonicMGR::~JaySynthMonophonicMGR() +{ +} + +void JaySynthMonophonicMGR::init(void) +{ + int i; + + memset (keys, 0, sizeof(keys)); + for (i=0; i < 128; i++) + keys[i].note = i; + + pLatest = NULL; +} + +void JaySynthMonophonicMGR::add(int note, float vel) +{ + if ((note < 0) || (note > 127)) + return; + + // Delete if velocity == 0 + if (vel == 0) + { + del(note); + return; + } + + // Delete first if note already exists + if (keys[note].vel > 0) + del(note); + + // Add key + keys[note].vel = vel; + + keys[note].pPrev = NULL; + keys[note].pNext = pLatest; + + if (pLatest) + pLatest->pPrev = &keys[note]; + + pLatest = &keys[note]; + +} + +void JaySynthMonophonicMGR::del(int note) +{ + if ((note < 0) || (note > 127)) + return; + + if (keys[note].pPrev) + keys[note].pPrev->pNext = keys[note].pNext; + + if (keys[note].pNext) + keys[note].pNext->pPrev = keys[note].pPrev; + + // Do I delete the newest note + if (!keys[note].pPrev) + pLatest = keys[note].pNext; + + keys[note].vel = 0; + keys[note].pPrev = NULL; + keys[note].pNext = NULL; + +} + +int JaySynthMonophonicMGR::getNumNotes(void) +{ + key_linkedlist_t *pKey = pLatest; + int num_notes = 0; + + while(pKey) + { + num_notes++; + pKey = pKey->pNext; + } + + return num_notes; + +} + +int JaySynthMonophonicMGR::getLatestNote(void) +{ + if (!pLatest) + return -1; + + return pLatest->note; +} + +int JaySynthMonophonicMGR::getHighestNote(void) +{ + key_linkedlist_t *pKey = pLatest; + int note = -1; + + while(pKey) + { + if (note < pKey->note) + note = pKey->note; + + pKey = pKey->pNext; + } + + if (note < 0) + return -1; + + return keys[note].note; +} + +float JaySynthMonophonicMGR::getVel(int note) +{ + if ((note < 0) || (note > 127)) + return 0; + + return keys[note].vel; +} diff --git a/Source/JaySynthMonophonicMGR.h b/Source/JaySynthMonophonicMGR.h new file mode 100644 index 0000000..a7a0f8a --- /dev/null +++ b/Source/JaySynthMonophonicMGR.h @@ -0,0 +1,41 @@ +/* + ============================================================================== + + This file was generated by user! + + ============================================================================== +*/ + +#ifndef _JAYSYNTHMONOPHONICMGR_H_ +#define _JAYSYNTHMONOPHONICMGR_H_ + +//#include "../JuceLibraryCode/JuceHeader.h" +#include "synth_defs.h" + +class JaySynthMonophonicMGR +{ +public: + JaySynthMonophonicMGR(); + ~JaySynthMonophonicMGR(); + void init(void); + void add(int note, float vel); + void del(int note); + int getNumNotes(void); + int getLatestNote(void); + int getHighestNote(void); + float getVel(int note); + +private: + +typedef struct _skey_linkedlist_t +{ + int note; + float vel; + struct _skey_linkedlist_t *pPrev, *pNext; + +} key_linkedlist_t; + + key_linkedlist_t keys[128]; + key_linkedlist_t *pLatest; +}; +#endif // _JAYSYNTHMONOPHONICMGR_H_ diff --git a/Source/JaySynthSound.cpp b/Source/JaySynthSound.cpp new file mode 100644 index 0000000..eff000d --- /dev/null +++ b/Source/JaySynthSound.cpp @@ -0,0 +1,177 @@ +/* + ============================================================================== + + This file was generated by user! + + ============================================================================== +*/ + +#include + +#include "synth_defs.h" +#include "JaySynthSound.h" + +JaySynthSound::JaySynthSound() +{ + name = String("Default"); + + // Default is "Jump" sound + setParameter(SYNTH_PARAM_VOLUME, 100); + setParameter(SYNTH_PARAM_VOICE_PAN_SPREAD, 50); + setParameter(SYNTH_PARAM_TUNE, 0); + setParameter(SYNTH_PARAM_TOTAL_NUM_VOICES, MAX_POLYPHONY); + setParameter(SYNTH_PARAM_HUMANIZE_ENABLE, 0); + setParameter(SYNTH_PARAM_HUMANIZE_VAR_VCO, 0); + setParameter(SYNTH_PARAM_HUMANIZE_VAR_VCF, 0); + setParameter(SYNTH_PARAM_HUMANIZE_VAR_ENV, 0); + setParameter(SYNTH_PARAM_MONOPHONIC_ENABLE, 0); + setParameter(SYNTH_PARAM_MONOPHONIC_RETRIGGER_ENABLE, 0); + setParameter(SYNTH_PARAM_UNISONO_ENABLE, 0); + setParameter(SYNTH_PARAM_UNISONO_NUM_VOICES, 8); + setParameter(SYNTH_PARAM_PORTAMENTO_TIME, 0.0); + setParameter(SYNTH_PARAM_OSC_0_ENABLE, 1); + setParameter(SYNTH_PARAM_OSC_1_ENABLE, 1); + setParameter(SYNTH_PARAM_OSC_0_RESTART_ON_TRIGGER, 0); + setParameter(SYNTH_PARAM_OSC_1_RESTART_ON_TRIGGER, 0); + setParameter(SYNTH_PARAM_OSC_0_LEVEL, 100); + setParameter(SYNTH_PARAM_OSC_1_LEVEL, 100); + setParameter(SYNTH_PARAM_OSC_0_DUTYCYCLE, 50); + setParameter(SYNTH_PARAM_OSC_1_DUTYCYCLE, 50); + setParameter(SYNTH_PARAM_OSC_0_DETUNE, -4); + setParameter(SYNTH_PARAM_OSC_1_DETUNE, +4); + setParameter(SYNTH_PARAM_OSC_0_TRANSPOSE, 0); + setParameter(SYNTH_PARAM_OSC_1_TRANSPOSE, 0); + setParameter(SYNTH_PARAM_OSC_0_WAVEFORM, 0); + setParameter(SYNTH_PARAM_OSC_1_WAVEFORM, 0); + setParameter(SYNTH_PARAM_OSC_0_PB_RANGE_MIN, -12); + setParameter(SYNTH_PARAM_OSC_1_PB_RANGE_MIN, -12); + setParameter(SYNTH_PARAM_OSC_0_PB_RANGE_MAX, +12); + setParameter(SYNTH_PARAM_OSC_1_PB_RANGE_MAX, +12); + setParameter(SYNTH_PARAM_OSC_0_FM_AMT_0, 0); + setParameter(SYNTH_PARAM_OSC_1_FM_AMT_0, 0); + setParameter(SYNTH_PARAM_OSC_0_FM_AMT_1, 0); + setParameter(SYNTH_PARAM_OSC_1_FM_AMT_1, 0); + setParameter(SYNTH_PARAM_OSC_0_FM_SRC_0, 0); + setParameter(SYNTH_PARAM_OSC_1_FM_SRC_0, 0); + setParameter(SYNTH_PARAM_OSC_0_FM_SRC_1, 0); + setParameter(SYNTH_PARAM_OSC_1_FM_SRC_1, 0); + setParameter(SYNTH_PARAM_OSC_0_FM_SRC_OP, VOICE_MOD_SRC_OP_ADD); + setParameter(SYNTH_PARAM_OSC_1_FM_SRC_OP, VOICE_MOD_SRC_OP_ADD); + setParameter(SYNTH_PARAM_OSC_0_AM_AMT_0, 0); + setParameter(SYNTH_PARAM_OSC_1_AM_AMT_0, 0); + setParameter(SYNTH_PARAM_OSC_0_AM_AMT_1, 0); + setParameter(SYNTH_PARAM_OSC_1_AM_AMT_1, 0); + setParameter(SYNTH_PARAM_OSC_0_AM_SRC_0, 0); + setParameter(SYNTH_PARAM_OSC_1_AM_SRC_0, 0); + setParameter(SYNTH_PARAM_OSC_0_AM_SRC_1, 0); + setParameter(SYNTH_PARAM_OSC_1_AM_SRC_1, 0); + setParameter(SYNTH_PARAM_OSC_0_AM_SRC_OP, VOICE_MOD_SRC_OP_ADD); + setParameter(SYNTH_PARAM_OSC_1_AM_SRC_OP, VOICE_MOD_SRC_OP_ADD); + setParameter(SYNTH_PARAM_OSC_0_PWM_AMT_0, 0); + setParameter(SYNTH_PARAM_OSC_1_PWM_AMT_0, 0); + setParameter(SYNTH_PARAM_OSC_0_PWM_AMT_1, 0); + setParameter(SYNTH_PARAM_OSC_1_PWM_AMT_1, 0); + setParameter(SYNTH_PARAM_OSC_0_PWM_SRC_0, 0); + setParameter(SYNTH_PARAM_OSC_1_PWM_SRC_0, 0); + setParameter(SYNTH_PARAM_OSC_0_PWM_SRC_1, 0); + setParameter(SYNTH_PARAM_OSC_1_PWM_SRC_1, 0); + setParameter(SYNTH_PARAM_OSC_0_PWM_SRC_OP, VOICE_MOD_SRC_OP_ADD); + setParameter(SYNTH_PARAM_OSC_1_PWM_SRC_OP, VOICE_MOD_SRC_OP_ADD); + setParameter(SYNTH_PARAM_NOISE_ENABLE, 0); + setParameter(SYNTH_PARAM_NOISE_LEVEL, 50); + setParameter(SYNTH_PARAM_NOISE_SHAPE, VOICE_NOISE_SHAPE_WHITE); + setParameter(SYNTH_PARAM_VCA_ENV_AMT, 100); + setParameter(SYNTH_PARAM_VCA_ENV_A, 1); + setParameter(SYNTH_PARAM_VCA_ENV_D, 1000); + setParameter(SYNTH_PARAM_VCA_ENV_S, 100); + setParameter(SYNTH_PARAM_VCA_ENV_R, 150); + setParameter(SYNTH_PARAM_VCF_ENV_A, 1); + setParameter(SYNTH_PARAM_VCF_ENV_D, 1000); + setParameter(SYNTH_PARAM_VCF_ENV_S, 100); + setParameter(SYNTH_PARAM_VCF_ENV_R, 500); + setParameter(SYNTH_PARAM_ENV_2_A, 1); + setParameter(SYNTH_PARAM_ENV_2_D, 1000); + setParameter(SYNTH_PARAM_ENV_2_S, 100); + setParameter(SYNTH_PARAM_ENV_2_R, 500); + setParameter(SYNTH_PARAM_ENV_3_A, 1); + setParameter(SYNTH_PARAM_ENV_3_D, 1000); + setParameter(SYNTH_PARAM_ENV_3_S, 100); + setParameter(SYNTH_PARAM_ENV_3_R, 500); + setParameter(SYNTH_PARAM_VCF_TYPE, VCF_FILTERTYPE_LOWPASS); + setParameter(SYNTH_PARAM_VCF_ORDER, VCF_FILTERORDER_4); + setParameter(SYNTH_PARAM_VCF_F, FILTER_F_MAX); + setParameter(SYNTH_PARAM_VCF_Q, 1.0); + setParameter(SYNTH_PARAM_VCF_ENV_AMT, 0); + setParameter(SYNTH_PARAM_LFO_0_SPEED, 1.f); + setParameter(SYNTH_PARAM_LFO_1_SPEED, 1.f); + setParameter(SYNTH_PARAM_LFO_2_SPEED, 1.f); + setParameter(SYNTH_PARAM_LFO_3_SPEED, 1.f); + setParameter(SYNTH_PARAM_LFO_0_SMOOTH, 0.0); + setParameter(SYNTH_PARAM_LFO_1_SMOOTH, 0.0); + setParameter(SYNTH_PARAM_LFO_2_SMOOTH, 0.0); + setParameter(SYNTH_PARAM_LFO_3_SMOOTH, 0.0); + setParameter(SYNTH_PARAM_LFO_0_DELAY, 0.0); + setParameter(SYNTH_PARAM_LFO_1_DELAY, 0.0); + setParameter(SYNTH_PARAM_LFO_2_DELAY, 0.0); + setParameter(SYNTH_PARAM_LFO_3_DELAY, 0.0); + setParameter(SYNTH_PARAM_LFO_0_ATTACK, 0.0); + setParameter(SYNTH_PARAM_LFO_1_ATTACK, 0.0); + setParameter(SYNTH_PARAM_LFO_2_ATTACK, 0.0); + setParameter(SYNTH_PARAM_LFO_3_ATTACK, 0.0); + setParameter(SYNTH_PARAM_LFO_0_SHAPE, LFO_WAVEFORM_SINE); + setParameter(SYNTH_PARAM_LFO_1_SHAPE, LFO_WAVEFORM_SINE); + setParameter(SYNTH_PARAM_LFO_2_SHAPE, LFO_WAVEFORM_SINE); + setParameter(SYNTH_PARAM_LFO_3_SHAPE, LFO_WAVEFORM_SINE); + setParameter(SYNTH_PARAM_LFO_0_MODE, VOICE_LFO_MODE_GLOBAL); + setParameter(SYNTH_PARAM_LFO_1_MODE, VOICE_LFO_MODE_GLOBAL); + setParameter(SYNTH_PARAM_LFO_2_MODE, VOICE_LFO_MODE_GLOBAL); + setParameter(SYNTH_PARAM_LFO_3_MODE, VOICE_LFO_MODE_GLOBAL); + setParameter(SYNTH_PARAM_LFO_0_SYNC, VOICE_LFO_SYNC_FREE); + setParameter(SYNTH_PARAM_LFO_1_SYNC, VOICE_LFO_SYNC_FREE); + setParameter(SYNTH_PARAM_LFO_2_SYNC, VOICE_LFO_SYNC_FREE); + setParameter(SYNTH_PARAM_LFO_3_SYNC, VOICE_LFO_SYNC_FREE); + setParameter(SYNTH_PARAM_LFO_0_SYMMETRY, 0); + setParameter(SYNTH_PARAM_LFO_1_SYMMETRY, 0); + setParameter(SYNTH_PARAM_LFO_2_SYMMETRY, 0); + setParameter(SYNTH_PARAM_LFO_3_SYMMETRY, 0); + setParameter(SYNTH_PARAM_VCF_F_AMT_0, 0); + setParameter(SYNTH_PARAM_VCF_F_AMT_1, 0); + setParameter(SYNTH_PARAM_VCF_F_SRC_0, 0); + setParameter(SYNTH_PARAM_VCF_F_SRC_1, 0); + setParameter(SYNTH_PARAM_VCF_F_SRC_OP, 0); + setParameter(SYNTH_PARAM_VCF_Q_AMT_0, 0); + setParameter(SYNTH_PARAM_VCF_Q_AMT_1, 0); + setParameter(SYNTH_PARAM_VCF_Q_SRC_0, 0); + setParameter(SYNTH_PARAM_VCF_Q_SRC_1, 0); + setParameter(SYNTH_PARAM_VCF_Q_SRC_OP, 0); + setParameter(SYNTH_PARAM_VCA_AM_AMT_0, 0); + setParameter(SYNTH_PARAM_VCA_AM_SRC_0, 0); + setParameter(SYNTH_PARAM_VCA_PAN_AMT_0, 0); + setParameter(SYNTH_PARAM_VCA_PAN_SRC_0, 0); + +} + +JaySynthSound::~JaySynthSound() +{ +} + +void JaySynthSound::setName(String ProgramName) +{ + name = ProgramName; +} + +String JaySynthSound::getName(void) +{ + return name; +} + +void JaySynthSound::setParameter(int index, synth_float_t param) +{ + parameter[index] = param; +} + +synth_float_t JaySynthSound::getParameter(int index) +{ + return parameter[index]; +} + diff --git a/Source/JaySynthSound.h b/Source/JaySynthSound.h new file mode 100644 index 0000000..c2082eb --- /dev/null +++ b/Source/JaySynthSound.h @@ -0,0 +1,37 @@ +/* + ============================================================================== + + This file was generated by user! + + ============================================================================== +*/ + +#ifndef _JAYSYNTHSOUND_H_ +#define _JAYSYNTHSOUND_H_ + +#include "../JuceLibraryCode/JuceHeader.h" +#include "synth_defs.h" +#include "JaySynthMidiCC.h" + +//============================================================================== +/** A synth sound that's just a bunch of parameters that makes an incredible sound.. */ +class JaySynthSound : public SynthesiserSound, public JaySynthMidiCC +{ +public: + synth_float_t parameter[SYNTH_NUM_PARAMS]; + String name; + + JaySynthSound(); + ~JaySynthSound(); + + void setName(String ProgramName); + String getName(void); + void setParameter(int index, synth_float_t param); + synth_float_t getParameter(int index); + void initParameter(int index, synth_float_t param); + bool appliesToNote (const int /*midiNoteNumber*/) { return true; } + bool appliesToChannel (const int /*midiChannel*/) { return true; } + +}; + +#endif // _JAYSYNTHSOUND_H_ diff --git a/Source/JaySynthVoice.cpp b/Source/JaySynthVoice.cpp new file mode 100644 index 0000000..6e47a0e --- /dev/null +++ b/Source/JaySynthVoice.cpp @@ -0,0 +1,105 @@ +/* + ============================================================================== + + This file was generated by user! + + ============================================================================== +*/ + +#include + +#include "synth_defs.h" +#include "JaySynthSound.h" +#include "JaySynthVoice.h" + +/** A JaySynth voice that just plays incredible sounds.. */ +JaySynthVoice::JaySynthVoice(voice_t *pVoice, int id, voice_common_t *pCom) +{ + m_pVoice = pVoice; + VoiceInit(pVoice, pCom, id, 44100); +} + +JaySynthVoice::~JaySynthVoice() +{ + VoiceFree(m_pVoice); +} + +void JaySynthVoice::setSampleRate (synth_float_t sampleRate) +{ + VoiceSetFS(m_pVoice, sampleRate); +} + +void JaySynthVoice::setBufsize (int bufsize) +{ + VoiceSetBufsize(m_pVoice, bufsize); +} + +bool JaySynthVoice::canPlaySound (SynthesiserSound* sound) +{ + return dynamic_cast (sound) != 0; +} + +void JaySynthVoice::startNote (const int midiNoteNumber, const float velocity, + SynthesiserSound* sound, const int /*currentPitchWheelPosition*/) +{ + + VoiceEvent(m_pVoice, voice_event_trigger); + return; + +/* + if (m_pVoice->state == note_state_idle) + { + VoiceEvent(m_pVoice, voice_event_trigger); + } + else + { + VoiceEvent(m_pVoice, voice_event_retrigger); + } +*/ +} + +void JaySynthVoice::stopNote (const bool allowTailOff) +{ + if (allowTailOff) + { + VoiceEvent(m_pVoice, voice_event_release); + } + else + { + // we're being told to stop playing immediately, so reset everything.. + VoiceEvent(m_pVoice, voice_event_release); + clearCurrentNote(); + } +} + +void JaySynthVoice::pitchWheelMoved (const int /*newValue*/) +{ +} + +void JaySynthVoice::controllerMoved (const int /*controllerNumber*/, const int /*newValue*/) +{ +} + +void JaySynthVoice::renderNextBlock (AudioSampleBuffer& outputBuffer, int startSample, int numSamples) +{ +/* Done in JaySynth::renderNextBlock() + + float *buf1 = outputBuffer.getSampleData (0, startSample); + float *buf2 = outputBuffer.getSampleData (1, startSample); + + VoiceProcessDataV_Common(m_pVoice, buf1, buf2, numSamples); + + if (m_pVoice->state == note_state_idle) + return; + + VoiceProcessDataV(m_pVoice, buf1, buf2, numSamples); + + if (m_pVoice->state == note_state_idle) + clearCurrentNote(); +*/ +} + +void JaySynthVoice::setParameter(int index, synth_float_t value) +{ + VoiceParam2Set(m_pVoice, index, value); +} diff --git a/Source/JaySynthVoice.h b/Source/JaySynthVoice.h new file mode 100644 index 0000000..dbba3b6 --- /dev/null +++ b/Source/JaySynthVoice.h @@ -0,0 +1,79 @@ +/* + ============================================================================== + + This file was generated by user! + + ============================================================================== +*/ + +#ifndef _JAYSYNTHVOICE_H_ +#define _JAYSYNTHVOICE_H_ + +#include "../JuceLibraryCode/JuceHeader.h" +#include "synth_defs.h" + +class JaySynthVoice +{ +public: + JaySynthVoice(voice_t *pVoice, int id, voice_common_t *pCom); + ~JaySynthVoice(); + void setSampleRate (synth_float_t sampleRate); + void setBufsize (int bufsize); + bool canPlaySound (SynthesiserSound* sound); + void startNote (const int midiNoteNumber, const float velocity, + SynthesiserSound* /*sound*/, const int /*currentPitchWheelPosition*/); + + void stopNote (const bool allowTailOff); + void pitchWheelMoved (const int newValue); + void controllerMoved (const int controllerNumber, const int newValue); + void renderNextBlock (AudioSampleBuffer& outputBuffer, int startSample, int numSamples); + void setParameter(int index, synth_float_t value); + + + int getCurrentlyPlayingNote() const + { + return currentlyPlayingNote; + } + + SynthesiserSound::Ptr getCurrentlyPlayingSound() const + { + return currentlyPlayingSound; + } + + bool isPlayingChannel (int midiChannel) const + { + return currentlyPlayingSound != nullptr + && currentlyPlayingSound->appliesToChannel (midiChannel); + } + + void setCurrentPlaybackSampleRate (double newRate) + { + currentSampleRate = newRate; + } + + double getSampleRate() const + { + return currentSampleRate; + } + + void clearCurrentNote() + { + currentlyPlayingNote = -1; + currentlyPlayingSound = nullptr; + } + +private: + + friend class JaySynth; + voice_t *m_pVoice; + synth_float_t note_on_time; + + double currentSampleRate; + int currentlyPlayingNote; + uint32 noteOnTime; + SynthesiserSound::Ptr currentlyPlayingSound; + bool keyIsDown; // the voice may still be playing when the key is not down (i.e. sustain pedal) + bool sostenutoPedalDown; +}; + +#endif // _JAYSYNTHVOICE_H_ diff --git a/Source/MidiCC_PopUp.cpp b/Source/MidiCC_PopUp.cpp new file mode 100644 index 0000000..0967787 --- /dev/null +++ b/Source/MidiCC_PopUp.cpp @@ -0,0 +1,618 @@ +/* + ============================================================================== + + This is an automatically generated file created by the Jucer! + + Creation date: 19 Aug 2012 10:54:59am + + Be careful when adding custom code to these files, as only the code within + the "//[xyz]" and "//[/xyz]" sections will be retained when the file is loaded + and re-saved. + + Jucer version: 1.12 + + ------------------------------------------------------------------------------ + + The Jucer is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-6 by Raw Material Software ltd. + + ============================================================================== +*/ + +//[Headers] You can add your own extra header files here... +#include "param_scale.h" +//[/Headers] + +#include "MidiCC_PopUp.h" + + +//[MiscUserDefs] You can add your own user definitions and misc code here... +//[/MiscUserDefs] + +//============================================================================== +MidiCC_PopUp::MidiCC_PopUp (JaySynthMidiCC *pMidiCC, int paramID, synth_float_t currParamValue, JaySynth::midiCC_info_t *pCurrMidiCCinfo, String name, MidiCC_PopUp_Listener *listener) + : Component (L"MidiCC PopUp"), + textButton_OK (0), + label_MidiCC_ID (0), + label_control_min (0), + label_control_max (0), + slider_test (0), + button_move_sliders_enable (0), + button_assign_enable (0), + button_midi_learn (0), + label_parameter_name (0), + button_apply_on_patch_init (0) +{ + addAndMakeVisible (textButton_OK = new TextButton (L"OK")); + textButton_OK->addListener (this); + + addAndMakeVisible (label_MidiCC_ID = new Label (L"MidiCC ID", + L"0")); + label_MidiCC_ID->setTooltip (L"This is the Midi-Controller Number"); + label_MidiCC_ID->setFont (Font (15.0000f, Font::plain)); + label_MidiCC_ID->setJustificationType (Justification::centredRight); + label_MidiCC_ID->setEditable (true, true, false); + label_MidiCC_ID->setColour (Label::textColourId, Colours::white); + label_MidiCC_ID->setColour (TextEditor::textColourId, Colours::black); + label_MidiCC_ID->setColour (TextEditor::backgroundColourId, Colour (0x0)); + label_MidiCC_ID->setColour (TextEditor::highlightColourId, Colours::yellow); + label_MidiCC_ID->addListener (this); + + addAndMakeVisible (label_control_min = new Label (L"Control Min", + L"0")); + label_control_min->setTooltip (L"Parameter minimum value"); + label_control_min->setFont (Font (15.0000f, Font::plain)); + label_control_min->setJustificationType (Justification::centredRight); + label_control_min->setEditable (true, true, false); + label_control_min->setColour (Label::textColourId, Colours::white); + label_control_min->setColour (TextEditor::textColourId, Colours::black); + label_control_min->setColour (TextEditor::backgroundColourId, Colour (0x0)); + label_control_min->setColour (TextEditor::highlightColourId, Colours::yellow); + label_control_min->addListener (this); + + addAndMakeVisible (label_control_max = new Label (L"Control Max", + L"0")); + label_control_max->setTooltip (L"Parameter maximum value"); + label_control_max->setFont (Font (15.0000f, Font::plain)); + label_control_max->setJustificationType (Justification::centredRight); + label_control_max->setEditable (true, true, false); + label_control_max->setColour (Label::textColourId, Colours::white); + label_control_max->setColour (TextEditor::textColourId, Colours::black); + label_control_max->setColour (TextEditor::backgroundColourId, Colour (0x0)); + label_control_max->setColour (TextEditor::highlightColourId, Colours::yellow); + label_control_max->addListener (this); + + addAndMakeVisible (slider_test = new Slider (L"Test Slider")); + slider_test->setTooltip (L"Test Slider"); + slider_test->setRange (0, 1, 0); + slider_test->setSliderStyle (Slider::LinearHorizontal); + slider_test->setTextBoxStyle (Slider::NoTextBox, true, 80, 20); + slider_test->addListener (this); + + addAndMakeVisible (button_move_sliders_enable = new ToggleButton (L"MoveParams Enable")); + button_move_sliders_enable->setTooltip (L"If \'Absolute = no\', the parameter is alterered relatively from the given slider position on the main window in the specified range. If \'\'Absolute = yes\', the midi controller alters parameter absolutely in the specified range. In this mode sliders really move on the main window."); + button_move_sliders_enable->setButtonText (String::empty); + button_move_sliders_enable->addListener (this); + + addAndMakeVisible (button_assign_enable = new ToggleButton (L"Assign Enable")); + button_assign_enable->setTooltip (L"Set this to make MIDI-Controller assignment active"); + button_assign_enable->setButtonText (String::empty); + button_assign_enable->addListener (this); + + addAndMakeVisible (button_midi_learn = new ToggleButton (L"Midi Learn Button")); + button_midi_learn->setTooltip (L"Set this to learn MIDI-Controller number from MIDI-controller movement"); + button_midi_learn->setButtonText (String::empty); + button_midi_learn->addListener (this); + button_midi_learn->setColour (ToggleButton::textColourId, Colours::white); + + addAndMakeVisible (label_parameter_name = new Label (L"Parameter Name", + L"Parameter Name")); + label_parameter_name->setFont (Font (20.0000f, Font::plain)); + label_parameter_name->setJustificationType (Justification::centred); + label_parameter_name->setEditable (false, false, false); + label_parameter_name->setColour (Label::textColourId, Colours::white); + label_parameter_name->setColour (TextEditor::textColourId, Colours::black); + label_parameter_name->setColour (TextEditor::backgroundColourId, Colour (0x0)); + + addAndMakeVisible (button_apply_on_patch_init = new ToggleButton (L"Apply on Patch Init Enable")); + button_apply_on_patch_init->setTooltip (L"Set this to apply current Midi-Controller position on initialization of this patch (e.g. Program change)"); + button_apply_on_patch_init->setButtonText (String::empty); + button_apply_on_patch_init->addListener (this); + + + //[UserPreSize] + //[/UserPreSize] + + setSize (248, 280); + + + //[Constructor] You can add your own custom stuff here.. + this->pMidiCC = pMidiCC; + pSavedMidiCCinfo = pCurrMidiCCinfo; + pMidiCC_container = pMidiCC->getAtParamID(paramID); + + savedParamValue = currParamValue; + lastMidiCCvalue = pSavedMidiCCinfo[pMidiCC->getControllerID(pMidiCC_container)].value; + + this->currentParamValue = savedParamValue; + this->currentControlValue = 0; + if (isEnabled()) + { + this->currentParamValue = toParam(pMidiCC->getParam(pMidiCC_container), (synth_float_t)lastMidiCCvalue); + this->currentControlValue = toParam(pMidiCC->getControl(pMidiCC_container), (synth_float_t)lastMidiCCvalue); + } + lastParamValue = this->currentParamValue; + lastControlValue = this->currentControlValue; + GetMin(); + GetMax(); + restoreTestSlider(); + + label_MidiCC_ID->setText(String(pMidiCC->getControllerID(pMidiCC_container)), false); + label_parameter_name->setText(name, false); + + button_assign_enable->setToggleState(pMidiCC->isAssigned(pMidiCC_container), false); + button_move_sliders_enable->setToggleState(pMidiCC->doChangeParameter(pMidiCC_container), false); + button_apply_on_patch_init->setToggleState(pMidiCC->doApplyOnPatchInit(pMidiCC_container), false); + + button_assign_enable->setTriggeredOnMouseDown (true); + button_assign_enable->setClickingTogglesState(true); + button_move_sliders_enable->setTriggeredOnMouseDown (true); + button_move_sliders_enable->setClickingTogglesState(true); + button_midi_learn->setTriggeredOnMouseDown (true); + button_midi_learn->setClickingTogglesState(true); + button_apply_on_patch_init->setTriggeredOnMouseDown (true); + button_apply_on_patch_init->setClickingTogglesState(true); + + addListener(listener); + listeners.call (&MidiCC_PopUp_Listener::MidiCC_PopUp_event, POPUP_CREATED); + //[/Constructor] +} + +MidiCC_PopUp::~MidiCC_PopUp() +{ + //[Destructor_pre]. You can add your own custom destruction code here.. + //[/Destructor_pre] + + deleteAndZero (textButton_OK); + deleteAndZero (label_MidiCC_ID); + deleteAndZero (label_control_min); + deleteAndZero (label_control_max); + deleteAndZero (slider_test); + deleteAndZero (button_move_sliders_enable); + deleteAndZero (button_assign_enable); + deleteAndZero (button_midi_learn); + deleteAndZero (label_parameter_name); + deleteAndZero (button_apply_on_patch_init); + + + //[Destructor]. You can add your own custom destruction code here.. + //[/Destructor] +} + +//============================================================================== +void MidiCC_PopUp::paint (Graphics& g) +{ + //[UserPrePaint] Add your own custom painting code here.. + //[/UserPrePaint] + + g.setColour (Colour (0xff2a64a5)); + g.fillRoundedRectangle (0.0f, 4.0f, 244.0f, 274.0f, 10.0000f); + + g.setColour (Colours::white); + g.drawRoundedRectangle (2.0f, 3.0f, 243.0f, 274.0f, 7.0000f, 4.0000f); + + g.setColour (Colours::white); + g.setFont (Font (15.0000f, Font::plain)); + g.drawText (L"Midi Controller", + 16, 122, 94, 20, + Justification::centredLeft, true); + + g.setColour (Colours::white); + g.setFont (Font (15.0000f, Font::plain)); + g.drawText (L"Active", + 16, 48, 62, 20, + Justification::centredLeft, true); + + g.setColour (Colours::white); + g.setFont (Font (15.0000f, Font::plain)); + g.drawText (L"Absolute", + 16, 68, 59, 20, + Justification::centredLeft, true); + + g.setColour (Colours::white); + g.setFont (Font (15.0000f, Font::plain)); + g.drawText (L"Minimum", + 16, 142, 75, 20, + Justification::centredLeft, true); + + g.setColour (Colours::white); + g.setFont (Font (15.0000f, Font::plain)); + g.drawText (L"Maximum", + 16, 162, 75, 20, + Justification::centredLeft, true); + + g.setColour (Colours::white); + g.setFont (Font (15.0000f, Font::plain)); + g.drawText (L"Test it", + 18, 194, 46, 20, + Justification::centredLeft, true); + + g.setColour (Colours::white); + g.setFont (Font (15.0000f, Font::plain)); + g.drawText (L"Learn", + 192, 122, 38, 20, + Justification::centredLeft, true); + + g.setColour (Colours::white); + g.setFont (Font (15.0000f, Font::plain)); + g.drawText (L"Apply on patch init", + 16, 88, 120, 20, + Justification::centredLeft, true); + + //[UserPaint] Add your own custom painting code here.. + //[/UserPaint] +} + +void MidiCC_PopUp::resized() +{ + textButton_OK->setBounds (22, 238, 202, 22); + label_MidiCC_ID->setBounds (135, 122, 32, 20); + label_control_min->setBounds (103, 144, 64, 20); + label_control_max->setBounds (103, 166, 64, 20); + slider_test->setBounds (64, 192, 168, 26); + button_move_sliders_enable->setBounds (148, 68, 20, 20); + button_assign_enable->setBounds (148, 48, 20, 20); + button_midi_learn->setBounds (172, 122, 20, 20); + label_parameter_name->setBounds (12, 12, 212, 24); + button_apply_on_patch_init->setBounds (148, 88, 20, 20); + //[UserResized] Add your own custom resize handling here.. + //[/UserResized] +} + +void MidiCC_PopUp::buttonClicked (Button* buttonThatWasClicked) +{ + //[UserbuttonClicked_Pre] + bool state; + //[/UserbuttonClicked_Pre] + + if (buttonThatWasClicked == textButton_OK) + { + //[UserButtonCode_textButton_OK] -- add your button handler code here.. + currentControlValue = 0; + if (isEnabled() && !doChangeParameter()) + currentControlValue = toParam(pMidiCC->getControl(pMidiCC_container), (synth_float_t)lastMidiCCvalue); + + currentParamValue = savedParamValue; + if (isEnabled() && doChangeParameter()) + currentParamValue = toParam(pMidiCC->getParam(pMidiCC_container), (synth_float_t)lastMidiCCvalue); + + listeners.call (&MidiCC_PopUp_Listener::MidiCC_PopUp_event, POPUP_OK); + //[/UserButtonCode_textButton_OK] + } + else if (buttonThatWasClicked == button_move_sliders_enable) + { + //[UserButtonCode_button_move_sliders_enable] -- add your button handler code here.. + state = buttonThatWasClicked->getToggleState(); + pMidiCC->setDoChangeParameter(pMidiCC_container, state); + if (state) + { + currentParamValue = lastParamValue; + lastControlValue = currentControlValue; + } + else + { + currentControlValue = lastControlValue; + lastParamValue = currentParamValue; + } + GetMin(); + GetMax(); + restoreTestSlider(); + TestValueUpdate(); + //[/UserButtonCode_button_move_sliders_enable] + } + else if (buttonThatWasClicked == button_assign_enable) + { + //[UserButtonCode_button_assign_enable] -- add your button handler code here.. + if (buttonThatWasClicked->getToggleState()) + pMidiCC->add(pMidiCC_container, label_MidiCC_ID->getText().getIntValue()); + else + pMidiCC->remove(pMidiCC_container, label_MidiCC_ID->getText().getIntValue()); + + if (isEnabled()) + { + currentParamValue = toParam(pMidiCC->getParam(pMidiCC_container), (synth_float_t)lastMidiCCvalue); + currentControlValue = toParam(pMidiCC->getControl(pMidiCC_container), (synth_float_t)lastMidiCCvalue); + } + restoreTestSlider(); + TestValueUpdate(); + //[/UserButtonCode_button_assign_enable] + } + else if (buttonThatWasClicked == button_midi_learn) + { + //[UserButtonCode_button_midi_learn] -- add your button handler code here.. + //[/UserButtonCode_button_midi_learn] + } + else if (buttonThatWasClicked == button_apply_on_patch_init) + { + //[UserButtonCode_button_apply_on_patch_init] -- add your button handler code here.. + state = buttonThatWasClicked->getToggleState(); + pMidiCC->setDoApplyOnPatchInit(pMidiCC_container, state); + restoreTestSlider(); + TestValueUpdate(); + //[/UserButtonCode_button_apply_on_patch_init] + } + + //[UserbuttonClicked_Post] + //[/UserbuttonClicked_Post] +} + +void MidiCC_PopUp::labelTextChanged (Label* labelThatHasChanged) +{ + //[UserlabelTextChanged_Pre] + //[/UserlabelTextChanged_Pre] + + if (labelThatHasChanged == label_MidiCC_ID) + { + //[UserLabelCode_label_MidiCC_ID] -- add your label text handling code here.. + pMidiCC->setControllerID(pMidiCC_container, label_MidiCC_ID->getText().getIntValue()); + label_MidiCC_ID->setText(String(pMidiCC->getControllerID(pMidiCC_container)), false); + button_midi_learn->setToggleState(false, false); + lastMidiCCvalue = pSavedMidiCCinfo[pMidiCC->getControllerID(pMidiCC_container)].value; + if (isEnabled()) + { + currentParamValue = toParam(pMidiCC->getParam(pMidiCC_container), (synth_float_t)lastMidiCCvalue); + currentControlValue = toParam(pMidiCC->getControl(pMidiCC_container), (synth_float_t)lastMidiCCvalue); + } + restoreTestSlider(); + TestValueUpdate(); + //[/UserLabelCode_label_MidiCC_ID] + } + else if (labelThatHasChanged == label_control_min) + { + //[UserLabelCode_label_control_min] -- add your label text handling code here.. + SetMin(); + restoreTestSlider(); + TestValueUpdate(); + //[/UserLabelCode_label_control_min] + } + else if (labelThatHasChanged == label_control_max) + { + //[UserLabelCode_label_control_max] -- add your label text handling code here.. + SetMax(); + restoreTestSlider(); + TestValueUpdate(); + //[/UserLabelCode_label_control_max] + } + + //[UserlabelTextChanged_Post] + //[/UserlabelTextChanged_Post] +} + +void MidiCC_PopUp::sliderValueChanged (Slider* sliderThatWasMoved) +{ + //[UsersliderValueChanged_Pre] + //[/UsersliderValueChanged_Pre] + + if (sliderThatWasMoved == slider_test) + { + //[UserSliderCode_slider_test] -- add your slider handling code here.. + if (doChangeParameter()) + { + slider_test->setTooltip (String(toParam(pMidiCC->getParam(pMidiCC_container), (synth_float_t)slider_test->getValue()))); + } + else + { + if (lastControlValue == 0) + slider_test->setTooltip (L"0.0"); + else + slider_test->setTooltip (String(toParam(pMidiCC->getControl(pMidiCC_container), (synth_float_t)slider_test->getValue()))); + } + TestValueUpdate(); + //[/UserSliderCode_slider_test] + } + + //[UsersliderValueChanged_Post] + //[/UsersliderValueChanged_Post] +} + + + +//[MiscUserCode] You can add your own definitions of your custom methods or any other code here... +void MidiCC_PopUp::mouseWheelMove(const MouseEvent &/*event*/, const MouseWheelDetails &/*wheel*/) +{ +} + +void MidiCC_PopUp::GetMin() +{ + if (doChangeParameter()) + { + label_control_min->setText(String(pMidiCC->getParamMin(pMidiCC_container)), false); + } + else + { + label_control_min->setText(String(pMidiCC->getControlMin(pMidiCC_container)), false); + } +} + +void MidiCC_PopUp::GetMax() +{ + if (doChangeParameter()) + { + label_control_max->setText(String(pMidiCC->getParamMax(pMidiCC_container)), false); + } + else + { + label_control_max->setText(String(pMidiCC->getControlMax(pMidiCC_container)), false); + } +} + +void MidiCC_PopUp::SetMin() +{ + synth_float_t value; + param_info_t *pConstraints = pMidiCC->getConstraints(pMidiCC_container); + param_info_t *pInfo = NULL; + + value = (synth_float_t)label_control_min->getText().getFloatValue(); + while (doChangeParameter()) + { + pInfo = pMidiCC->getParam(pMidiCC_container); + if (value < pConstraints->pmin) + value = pConstraints->pmin; + + if (value > pInfo->pmax) + value = pInfo->pmax; + + // Min == Max => crash + if (value == pMidiCC->getParamMax(pMidiCC_container)) + break; + + pMidiCC->setParamMin(pMidiCC_container, value); + break; + } + + while (!doChangeParameter()) + { + pInfo = pMidiCC->getControl(pMidiCC_container); + if (fabs(value) > fabs(pConstraints->pmax)) + value = pConstraints->pmax*fabs(value)/value; + + // Min == Max => crash + if (value == pMidiCC->getControlMax(pMidiCC_container)) + break; + + pMidiCC->setControlMin(pMidiCC_container, value); + break; + } + + label_control_min->setText(String(pInfo->pmin), false); +} + +void MidiCC_PopUp::SetMax() +{ + synth_float_t value; + param_info_t *pConstraints = pMidiCC->getConstraints(pMidiCC_container); + param_info_t *pInfo = NULL; + + value = (synth_float_t)label_control_max->getText().getFloatValue(); + while (doChangeParameter()) + { + pInfo = pMidiCC->getParam(pMidiCC_container); + if (value > pConstraints->pmax) + value = pConstraints->pmax; + + if (value < pInfo->pmin) + value = pInfo->pmin; + + // Min == Max => crash + if (value == pMidiCC->getParamMin(pMidiCC_container)) + break; + + pMidiCC->setParamMax(pMidiCC_container, value); + break; + } + + while (!doChangeParameter()) + { + pInfo = pMidiCC->getControl(pMidiCC_container); + value = (synth_float_t)label_control_max->getText().getFloatValue(); + if (fabs(value) > fabs(pConstraints->pmax)) + value = pConstraints->pmax*fabs(value)/value; + + // Min == Max => crash + if (value == pMidiCC->getControlMin(pMidiCC_container)) + break; + + pMidiCC->setControlMax(pMidiCC_container, value); + break; + } + + label_control_max->setText(String(pInfo->pmax), false); +} +//[/MiscUserCode] + + +//============================================================================== +#if 0 +/* -- Jucer information section -- + + This is where the Jucer puts all of its metadata, so don't change anything in here! + +BEGIN_JUCER_METADATA + + + + + + + + + + + + + + + + + +END_JUCER_METADATA +*/ +#endif diff --git a/Source/MidiCC_PopUp.h b/Source/MidiCC_PopUp.h new file mode 100644 index 0000000..39e9b7f --- /dev/null +++ b/Source/MidiCC_PopUp.h @@ -0,0 +1,203 @@ +/* + ============================================================================== + + This is an automatically generated file created by the Jucer! + + Creation date: 19 Aug 2012 10:54:59am + + Be careful when adding custom code to these files, as only the code within + the "//[xyz]" and "//[/xyz]" sections will be retained when the file is loaded + and re-saved. + + Jucer version: 1.12 + + ------------------------------------------------------------------------------ + + The Jucer is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-6 by Raw Material Software ltd. + + ============================================================================== +*/ + +#ifndef __JUCER_HEADER_MIDICCPOPUP_MIDICCPOPUP_EA70576__ +#define __JUCER_HEADER_MIDICCPOPUP_MIDICCPOPUP_EA70576__ + +//[Headers] -- You can add your own extra header files here -- +#include "../JuceLibraryCode/JuceHeader.h" +#include "PluginProcessor.h" +//#include "juce.h" + +class MidiCC_PopUp_Listener +{ +public: + virtual void MidiCC_PopUp_event(int /*event*/) {}; +}; +//[/Headers] + + + +//============================================================================== +/** + //[Comments] + An auto-generated component, created by the Jucer. + + Describe your class and how it works here! + //[/Comments] +*/ +class MidiCC_PopUp : public Component, + public ButtonListener, + public LabelListener, + public SliderListener +{ +public: + //============================================================================== + MidiCC_PopUp (JaySynthMidiCC *pMidiCC, int paramID, synth_float_t currParamValue, JaySynth::midiCC_info_t *pCurrMidiCCinfo, String name, MidiCC_PopUp_Listener *listener); + ~MidiCC_PopUp(); + + //============================================================================== + //[UserMethods] -- You can add your own custom methods in this section. + enum + { + POPUP_DELETED = 0, + POPUP_CREATED, + POPUP_SHOW, + POPUP_PARAM_CHANGED, + POPUP_OK + + }; + void addListener(MidiCC_PopUp_Listener *listener) + { + listeners.add (listener); + } + void show(void) + { + this->setVisible(true); + listeners.call (&MidiCC_PopUp_Listener::MidiCC_PopUp_event, POPUP_SHOW); + } + bool isEnabled(void) + { + return pMidiCC->isAssigned(pMidiCC_container); + } + bool doChangeParameter(void) + { + return pMidiCC->doChangeParameter(pMidiCC_container); + } + void setControllerID(int controllerID) + { + lastMidiCCvalue = pSavedMidiCCinfo[pMidiCC->getControllerID(pMidiCC_container)].value; + if (isEnabled()) + { + currentParamValue = toParam(pMidiCC->getParam(pMidiCC_container), (synth_float_t)lastMidiCCvalue); + currentControlValue = toParam(pMidiCC->getControl(pMidiCC_container), (synth_float_t)lastMidiCCvalue); + } + restoreTestSlider(); + TestValueUpdate(); + + if (!button_midi_learn->getToggleState()) + return; + + label_MidiCC_ID->setText(String(controllerID), true); + } + synth_float_t getCurrentControlValue(void) + { + return currentControlValue; + } + synth_float_t getCurrentParamValue(void) + { + return currentParamValue; + } + int getParamID(void) + { + return pMidiCC->getParamID(pMidiCC_container); + } + void TestValueUpdate() + { + if (doChangeParameter()) + { + currentControlValue = 0; + currentParamValue = toParam(pMidiCC->getParam(pMidiCC_container), (synth_float_t)slider_test->getValue()); + } + else + { + currentParamValue = savedParamValue; + currentControlValue = toParam(pMidiCC->getControl(pMidiCC_container), (synth_float_t)slider_test->getValue()); + } + listeners.call (&MidiCC_PopUp_Listener::MidiCC_PopUp_event, POPUP_PARAM_CHANGED); + } + void restoreTestSlider() + { + if (doChangeParameter()) + { + slider_test->setValue(toSlider(pMidiCC->getParam(pMidiCC_container), (synth_float_t)currentParamValue), true); + } + else + { + slider_test->setValue(toSlider(pMidiCC->getControl(pMidiCC_container), (synth_float_t)currentControlValue), true); + } + } + void GetMin(); + void GetMax(); + void SetMin(); + void SetMax(); + + ComponentDragger myDragger; + void mouseDown (const MouseEvent& e) + { + myDragger.startDraggingComponent (this, e); + } + + void mouseDrag (const MouseEvent& e) + { + myDragger.dragComponent (this, e, nullptr); + } + + void mouseWheelMove(const MouseEvent &event, const MouseWheelDetails &wheel); + //[/UserMethods] + + void paint (Graphics& g); + void resized(); + void buttonClicked (Button* buttonThatWasClicked); + void labelTextChanged (Label* labelThatHasChanged); + void sliderValueChanged (Slider* sliderThatWasMoved); + + + + //============================================================================== + juce_UseDebuggingNewOperator + +private: + //[UserVariables] -- You can add your own custom variables in this section. + + JaySynthMidiCC *pMidiCC; + midiCC_container_t *pMidiCC_container; + ListenerList listeners; + JaySynth::midiCC_info_t *pSavedMidiCCinfo; + synth_float_t lastMidiCCvalue; + synth_float_t savedParamValue; + synth_float_t currentParamValue; + synth_float_t currentControlValue; + synth_float_t lastControlValue; + synth_float_t lastParamValue; + //[/UserVariables] + + //============================================================================== + TextButton* textButton_OK; + Label* label_MidiCC_ID; + Label* label_control_min; + Label* label_control_max; + Slider* slider_test; + ToggleButton* button_move_sliders_enable; + ToggleButton* button_assign_enable; + ToggleButton* button_midi_learn; + Label* label_parameter_name; + ToggleButton* button_apply_on_patch_init; + + + //============================================================================== + // (prevent copy constructor and operator= being generated..) + MidiCC_PopUp (const MidiCC_PopUp&); + const MidiCC_PopUp& operator= (const MidiCC_PopUp&); +}; + + +#endif // __JUCER_HEADER_MIDICCPOPUP_MIDICCPOPUP_EA70576__ diff --git a/Source/PluginProcessor.cpp b/Source/PluginProcessor.cpp new file mode 100644 index 0000000..7462ba3 --- /dev/null +++ b/Source/PluginProcessor.cpp @@ -0,0 +1,879 @@ +/* + ============================================================================== + + This file was auto-generated! + + It contains the basic startup code for a Juce application. + + ============================================================================== +*/ +#include + +#include "PluginProcessor.h" +#include "JaySynthAudioProcessorEditor.h" +#include "vector_utils.h" + +JaySynthAudioProcessorEditor* getEditor(JaySynthAudioProcessor *pThis) +{ + return dynamic_cast(pThis->getActiveEditor()); +} + +//============================================================================== +JaySynthAudioProcessor::JaySynthAudioProcessor() +{ + currProgram = 0; + currpatch = &patches[currProgram]; + the_editor = NULL; + + m_isWavesAvailable = isWavesAvailable(); + + // Initialise the synth... + pSynth = new JaySynth(MAX_POLYPHONY, wavesGetPath()); + pSynth->setNoteStealingEnabled(true); + pSynth->addListener(this); + + setCurrentProgram(0); + + m_limiter_env = 0; + startTimer (10); + +#ifdef DEBUG + SynthDebug ("Jay Synth V %s (DEBUG) initialized.\n", JucePlugin_VersionString); +#else + SynthDebug ("Jay Synth V %s initialized.\n", JucePlugin_VersionString); +#endif + + +} + +JaySynthAudioProcessor::~JaySynthAudioProcessor() +{ + delete (pSynth); +} + +void JaySynthAudioProcessor::timerCallback() +{ + if (getEditor(this)) + actionListener.callLimiterChanged(m_limiter_active); +} + +String JaySynthAudioProcessor::wavesGetPath() +{ + bool isExistent, isValid; + + File pluginfile = File::getSpecialLocation (File::currentExecutableFile).getParentDirectory(); + String wavespath = pluginfile.getFullPathName() + String("\\waves.bin"); + File wavesfile = File(wavespath); + + isExistent = wavesfile.existsAsFile(); + isValid = true; + + if (isExistent && isValid) + return wavespath; + + return String::empty; +} + +bool JaySynthAudioProcessor::isWavesAvailable() +{ + return (wavesGetPath() != String::empty); +} + +//============================================================================== +const String JaySynthAudioProcessor::getName() const +{ + return JucePlugin_Name; +} + +int JaySynthAudioProcessor::getNumParameters() +{ + return SYNTH_NUM_PARAMS; +} + +void JaySynthAudioProcessor::applyCurrentMidiControllers(void) +{ + JaySynth::midiCC_info_t *pMidiCC_info; + int i; + + for (i=0; i < NUM_MIDI_CONTROLLERS; i++) + { + pMidiCC_info = pSynth->getLastMidiCC_info(i); + if (pMidiCC_info) + applyMidiController(pMidiCC_info, false); + } + +} + +void JaySynthAudioProcessor::applyMidiController(JaySynth::midiCC_info_t *pMidiCC_info, bool forceApply) +{ + int i, numDst, paramID; + + midiCC_container_t *pMidi_container; + + numDst = midCC_editBuffer.getNumDestinations(pMidiCC_info->ID); + for (i=0; i < numDst; i++) + { + pMidi_container = midCC_editBuffer.getDestination(pMidiCC_info->ID, i); + paramID = midCC_editBuffer.getParamID(pMidi_container); + if (midCC_editBuffer.doApplyOnPatchInit(pMidi_container) || forceApply) + { + if (midCC_editBuffer.doChangeParameter(pMidi_container)) + { + setParam(paramID, toParam(midCC_editBuffer.getParam(pMidi_container), pMidiCC_info->value), false, false); + } + else + { + controlParam(midCC_editBuffer.getParamID(pMidi_container), toParam(midCC_editBuffer.getControl(pMidi_container), pMidiCC_info->value)); + } + } + } + +} + +void JaySynthAudioProcessor::synthChanged(int type, void *pData) +{ + JaySynth::midiCC_info_t *pMidiCC_info; + JaySynth::midi_note_info_t *pMidi_note_info; + + switch(type) + { + case JaySynth::SYNTH_CHANGED_PARAM: + if (getEditor(this) != NULL) + actionListener.callParamChanged(*((int*)pData)); + break; + + case JaySynth::SYNTH_CHANGED_MIDICC: + pMidiCC_info = (JaySynth::midiCC_info_t*)pData; + applyMidiController(pMidiCC_info, true); + if (getEditor(this) != NULL) + actionListener.callMidiControllerChanged(pMidiCC_info->channel, pMidiCC_info->ID, (float)pMidiCC_info->value); + break; + + case JaySynth::SYNTH_CHANGED_NOTE_PRESSED: + pMidi_note_info = (JaySynth::midi_note_info_t*)pData; + if (getEditor(this) != NULL) + actionListener.callMidiNotePressed(pMidi_note_info->note, (float)pMidi_note_info->velocity); + break; + + case JaySynth::SYNTH_CHANGED_NOTE_RELEASED: + pMidi_note_info = (JaySynth::midi_note_info_t*)pData; + if (getEditor(this) != NULL) + actionListener.callMidiNoteReleased(pMidi_note_info->note, (float)pMidi_note_info->velocity); + break; + + case JaySynth::SYNTH_CHANGED_NUM_VOICES_PLAYING: + if (getEditor(this) != NULL) + actionListener.callNumVoicesPlaying(*((int*)pData)); + break; + + default: + break; + } + + +}; + +float JaySynthAudioProcessor::getParameter (int index) +{ + param_info_t *pParamInfo = getParamInfo(index); + + if (!pParamInfo) + return 0; + + return (float)toSlider(pParamInfo, pSynth->getParameter(index)); +} + +void JaySynthAudioProcessor::setParameter (int index, float newValue) +{ + param_info_t *pParamInfo = getParamInfo(index); + + if (!pParamInfo) + return; + + setParam(index, toParam(pParamInfo, (synth_float_t)newValue), true, false); + +} + +synth_float_t JaySynthAudioProcessor::getParam(int index) +{ + return (synth_float_t)pSynth->getParameter(index); +} + +void JaySynthAudioProcessor::setParam(int index, synth_float_t param, bool doModifyPatch, bool doNotifyHost) +{ + param_info_t *pParamInfo = getParamInfo(index); + + if (!pParamInfo) + return; + + if (doModifyPatch) + { + setPatchModified(); + } + + if (doNotifyHost) + sendParamChangeToHost(index, (float)toSlider(pParamInfo, param)); + + pSynth->setParameter(index, clampParam(pParamInfo, param)); + +} + +void JaySynthAudioProcessor::controlParam(int index, synth_float_t param) +{ + pSynth->setControl(index, param); +} + +const String JaySynthAudioProcessor::getParameterName (int index) +{ + param_info_t *pParamInfo = getParamInfo(index); + + if (pParamInfo) + return pParamInfo->pName; + + return String::empty; +} + +const String JaySynthAudioProcessor::getParameterText (int index) +{ + param_info_t *pParamInfo = getParamInfo(index); + + switch (index) + { + case SYNTH_PARAM_VCF_TYPE: + switch ((int)pSynth->getParameter(index)) + { + case VCF_FILTERTYPE_LOWPASS: + return "LPF"; + case VCF_FILTERTYPE_HIGHPASS: + return "HPF"; + case VCF_FILTERTYPE_BANDPASS: + return "BPF"; + default: + return "Unknown (" + String((int)pSynth->getParameter(index)) + ")"; + } + + case SYNTH_PARAM_NOISE_ENABLE: + case SYNTH_PARAM_OSC_0_ENABLE: + case SYNTH_PARAM_OSC_1_ENABLE: + if (!(int)pSynth->getParameter(index)) + return "Off"; + return "On"; + + case SYNTH_PARAM_NOISE_SHAPE: + switch ((int)pSynth->getParameter(index)) + { + case VOICE_NOISE_SHAPE_WHITE: + return "Uniform"; + case VOICE_NOISE_SHAPE_PINK: + return "Gauss"; + default: + return "Unknown (" + String((int)pSynth->getParameter(index)) + ")"; + } + + case SYNTH_PARAM_OSC_0_WAVEFORM: + case SYNTH_PARAM_OSC_1_WAVEFORM: + switch ((int)pSynth->getParameter(index)) + { + case OSC_WAVEFORM_SAWTOOTH: + return "Saw"; + case OSC_WAVEFORM_SQUARE: + return "Pulse"; + case OSC_WAVEFORM_TRIANGLE: + return "Tri"; + case OSC_WAVEFORM_SINE: + return "Sine"; + default: + return "Unknown (" + String((int)pSynth->getParameter(index)) + ")"; + } + + case SYNTH_PARAM_LFO_0_SHAPE: + case SYNTH_PARAM_LFO_1_SHAPE: + case SYNTH_PARAM_LFO_2_SHAPE: + case SYNTH_PARAM_LFO_3_SHAPE: + switch ((int)pSynth->getParameter(index)) + { + case LFO_WAVEFORM_SINE: + return "Sine"; + case LFO_WAVEFORM_COSINE: + return "Cosine"; + case LFO_WAVEFORM_SAW: + return "Saw"; + case LFO_WAVEFORM_SQUARE: + return "Square"; + case LFO_WAVEFORM_TRIANGLE: + return "Tri"; + case LFO_WAVEFORM_SH_UNI: + return "S/H 1"; + case LFO_WAVEFORM_SH_GAUSS: + return "S/H 2"; + default: + return "Unknown (" + String((int)pSynth->getParameter(index)) + ")"; + } + + case SYNTH_PARAM_OSC_0_AM_SRC_0: + case SYNTH_PARAM_OSC_1_AM_SRC_0: + case SYNTH_PARAM_OSC_0_FM_SRC_0: + case SYNTH_PARAM_OSC_1_FM_SRC_0: + case SYNTH_PARAM_OSC_0_PWM_SRC_0: + case SYNTH_PARAM_OSC_1_PWM_SRC_0: + case SYNTH_PARAM_VCF_F_SRC_0: + case SYNTH_PARAM_VCF_Q_SRC_0: + case SYNTH_PARAM_VCA_AM_SRC_0: + case SYNTH_PARAM_VCA_PAN_SRC_0: + case SYNTH_PARAM_OSC_0_AM_SRC_1: + case SYNTH_PARAM_OSC_1_AM_SRC_1: + case SYNTH_PARAM_OSC_0_FM_SRC_1: + case SYNTH_PARAM_OSC_1_FM_SRC_1: + case SYNTH_PARAM_OSC_0_PWM_SRC_1: + case SYNTH_PARAM_OSC_1_PWM_SRC_1: + case SYNTH_PARAM_VCF_F_SRC_1: + case SYNTH_PARAM_VCF_Q_SRC_1: + switch ((int)pSynth->getParameter(index)) + { + case 0: + return "Off"; + case 1: + return "LFO 1"; + case 2: + return "LFO 2"; + case 3: + return "LFO 3"; + case 4: + return "LFO 4"; + default: + return "Unknown (" + String((int)pSynth->getParameter(index)) + ")"; + } + + case SYNTH_PARAM_LFO_0_MODE: + case SYNTH_PARAM_LFO_1_MODE: + case SYNTH_PARAM_LFO_2_MODE: + case SYNTH_PARAM_LFO_3_MODE: + switch ((int)pSynth->getParameter(index)) + { + case VOICE_LFO_MODE_GLOBAL: + return "Global"; + case VOICE_LFO_MODE_INDIVIDUAL: + return "Individual"; + default: + return "Unknown (" + String((int)pSynth->getParameter(index)) + ")"; + } + + case SYNTH_PARAM_LFO_0_SYNC: + case SYNTH_PARAM_LFO_1_SYNC: + case SYNTH_PARAM_LFO_2_SYNC: + case SYNTH_PARAM_LFO_3_SYNC: + switch ((int)pSynth->getParameter(index)) + { + case VOICE_LFO_SYNC_FREE: + return "Free"; + case VOICE_LFO_SYNC_RESTART: + return "Restart"; + default: + return "Unknown (" + String((int)pSynth->getParameter(index)) + ")"; + } + + default: + if (pParamInfo->pinterval == 0.0) + return String (pSynth->getParameter(index)); + else + return String (pSynth->getParameter(index), (int)(-log(pParamInfo->pinterval)/log(10.0) + 0.5)); + } +} + +const String JaySynthAudioProcessor::getInputChannelName (int channelIndex) const +{ + return String (channelIndex + 1); +} + +const String JaySynthAudioProcessor::getOutputChannelName (int channelIndex) const +{ + return String (channelIndex + 1); +} + +bool JaySynthAudioProcessor::isInputChannelStereoPair (int /*index*/) const +{ + return true; +} + +bool JaySynthAudioProcessor::isOutputChannelStereoPair (int /*index*/) const +{ + return true; +} + +bool JaySynthAudioProcessor::acceptsMidi() const +{ +#if JucePlugin_WantsMidiInput + return true; +#else + return false; +#endif +} + +bool JaySynthAudioProcessor::producesMidi() const +{ +#if JucePlugin_ProducesMidiOutput + return true; +#else + return false; +#endif +} + +int JaySynthAudioProcessor::getNumPrograms() +{ + return NUM_PROGRAMS; +} + +int JaySynthAudioProcessor::getCurrentProgram() +{ + return currProgram; +} + +void JaySynthAudioProcessor::setCurrentProgram (int index) +{ + int i; + + param_info_t *pParamInfo; + + if ((unsigned)index >= NUM_PROGRAMS) + index = 0; + + currProgram = index; + currpatch = &patches[index]; + + // Set SYNTH_PARAM_TOTAL_NUM_VOICES first + setParam(SYNTH_PARAM_TOTAL_NUM_VOICES, currpatch->getParameter(SYNTH_PARAM_TOTAL_NUM_VOICES), false, false); + + midCC_editBuffer = *currpatch->getMidiCC(); + + pSynth->setMidiCC_editBuffer(&midCC_editBuffer); + pSynth->ClearControls(); + for (i=0; i < SYNTH_NUM_PARAMS; i++) + { + pParamInfo = getParamInfo(i); + setParam(i, currpatch->getParameter(i), false, true); + } + unisonoModeChanged(); + humanizeModeChanged(); + humanizeVarianceChanged_VCO(); + humanizeVarianceChanged_VCF(); + humanizeVarianceChanged_ENV(); + perVoiceControlsChanged(); + + clearPatchModified(); + + // toDo: do this by synth->setParam via message + if (getEditor(this)) + { + actionListener.callProgramChanged(); + for (i=0; i < SYNTH_NUM_PARAMS; i++) + getEditor(this)->paramUpdate(i, false); + } + applyCurrentMidiControllers(); + updateHostDisplay(); +} + +const String JaySynthAudioProcessor::getProgramName (int index) +{ + return patches[index].getName(); +} + +void JaySynthAudioProcessor::changeProgramName (int index, const String& newName) +{ + patches[index].setName(newName); + if (getEditor(this)) + { + actionListener.callProgramChanged(); + } +} + +//============================================================================== +void JaySynthAudioProcessor::prepareToPlay (double sampleRate, int samplesPerBlock) +{ + // Use this method as the place to do any pre-playback + // initialisation that you need.. + m_fs = sampleRate; + pSynth->setSampleRate (sampleRate); + pSynth->setBufsize (samplesPerBlock); + keyboardState.reset(); + +} + +void JaySynthAudioProcessor::releaseResources() +{ + // When playback stops, you can use this as an opportunity to free up any + // spare memory, etc. + keyboardState.reset(); + +} + +void JaySynthAudioProcessor::processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages) +{ + const int numSamples = buffer.getNumSamples(); + int i; + float *buf1 = buffer.getSampleData (0, 0); + float *buf2 = buffer.getSampleData (1, 0); + synth_float_t limiter_env[SYNTH_MAX_BUFSIZE]; + synth_float_t limiter_gain[SYNTH_MAX_BUFSIZE]; + synth_float_t buf[2][SYNTH_MAX_BUFSIZE]; + synth_float_t x, limiter_ar, limiter_af, limiter_threshold; + float synth_gain; + + // Now pass any incoming midi messages to our keyboard state object, and let it + // add messages to the buffer if the user is clicking on the on-screen keys + keyboardState.processNextMidiBuffer (midiMessages, 0, numSamples, true); + + // First remove garbage from buffers + buffer.clear (0, 0, numSamples); + buffer.clear (1, 0, numSamples); + + // and now get the synth to process these midi events and generate its output. + // Render individual voices + pSynth->renderNextBlock (buffer, midiMessages, 0, numSamples); + + // apply master volume + synth_gain = (float)pSynth->getVolume(); + + for (i=0; i paramUpdate(i, false); + } + + return (AudioProcessorEditor*)the_editor; +} + +//============================================================================== +// magic number to identify memory blocks that we've stored as XML +const uint32 magicXmlNumber = 0x21324356; + +void JaySynthAudioProcessor::copyXmlToBinary (const XmlElement& xml, juce::MemoryBlock& destData) +{ + const String xmlString (xml.createDocument (String::empty, true, false)); + const int stringLength = xmlString.getNumBytesAsUTF8(); + + destData.setSize ((size_t) stringLength + 10); + + char* const d = static_cast (destData.getData()); + *(uint32*) d = ByteOrder::swapIfBigEndian ((const uint32) magicXmlNumber); + *(uint32*) (d + 4) = ByteOrder::swapIfBigEndian ((const uint32) stringLength); + + xmlString.copyToUTF8 (d + 8, stringLength + 1); +} + +XmlElement* JaySynthAudioProcessor::getXmlFromBinary (const void* data, + const int sizeInBytes) +{ + XmlElement *pResult = nullptr; + if (sizeInBytes > 8 + && ByteOrder::littleEndianInt (data) == magicXmlNumber) + { + const int stringLength = (int) ByteOrder::littleEndianInt (addBytesToPointer (data, 4)); + XmlDocument doc(String::fromUTF8 ((static_cast (data)) + 8, jmin ((sizeInBytes - 8), stringLength))); + + if (stringLength > 0) + pResult = doc.getDocumentElement(); + + if (doc.getLastParseError() != String::empty) + { + deleteAndZero(pResult); + } + } + return pResult; +} + +const String JaySynthAudioProcessor::getParameterNameXML (int index) +{ + String name = getParameterName(index); + name = name.removeCharacters (String(".")); + name = name.replaceCharacter (' ','_'); + + return name; +} + +void JaySynthAudioProcessor::getStateInformation (MemoryBlock& destData) +{ + int i, progID; + synth_float_t value; + JaySynthSound *pPatch; + XmlElement *pXML; + + // Create an outer XML element.. + ScopedPointerxml = new XmlElement("JSYNTH_BANK"); + + MemoryOutputStream outputStream(destData, false); + MemoryBlock tmpBlock(8192*1024, /*initialiseToZero*/true); + GZIPCompressorOutputStream GZIPEnc(&outputStream, /*compressionLevel*/0, /*deleteDestStreamWhenDestroyed*/false, /*windowBits*/0); + + if (isPatchModified() || midCC_editBuffer.isMidiCCmodified()) + { + for (i=0; i < SYNTH_NUM_PARAMS; i++) + { + value = getParam(i); + currpatch->setParameter(i, value); // Copy synth param to current program + } + currpatch->getMidiCC()->copyMidiCC(&midCC_editBuffer); // Copy MidiCC edit buffer to patch + } + + for (progID=0; progID < NUM_PROGRAMS; progID++) + { + pXML = xml->createNewChildElement (String("PATCH_") + String(progID)); + pPatch = &patches[progID]; + pXML->setAttribute ("ID", progID); + pXML->setAttribute ("NAME", pPatch->getName()); + for (i=0; i < SYNTH_NUM_PARAMS; i++) + { + value = pPatch->getParameter(i); + pXML->setAttribute (getParameterNameXML(i), String(value, 10)); + } + pPatch->getMidiCC()->exportXML(pXML); + + } + setCurrentProgram(getCurrentProgram()); + + // then use this helper function to stuff it into the binary blob and return it.. + copyXmlToBinary (*xml, tmpBlock); + GZIPEnc.write(tmpBlock.getData(), tmpBlock.getSize()); + outputStream.flush(); + +#if 0 +//#ifdef SYNTH_DEBUG + { + File file(String("C:\\Users\\jens\\JaySynth\\bank.xml")); + file.create(); + xml->writeToFile (/*const File &destinationFile*/file, /*const String &dtdToUse*/"JSYNTH_BANK_FILE" /*, const String &encodingType="UTF-8", int lineWrapLength=60*/); + } +#endif +} + +void JaySynthAudioProcessor::setStateInformation (const void* data, int sizeInBytes) +{ + int i, progID, uncompressedSize; + synth_float_t value; + JaySynthSound *pPatch; + XmlElement *pXML; + String lastError; + ScopedPointer xmlState = NULL; + void* pData; + int size; + + ScopedPointer pUncompressedData; + pUncompressedData = new char[8192*1024]; + + MemoryInputStream inputStream(data, sizeInBytes, false); + GZIPDecompressorInputStream GZIPDec(inputStream); + uncompressedSize = GZIPDec.read(pUncompressedData, 8192*1024); + + pData = (void *)data; + size = sizeInBytes; + if (uncompressedSize) + { + pData = (void *)pUncompressedData; + size = uncompressedSize; + } + xmlState = getXmlFromBinary(pData, size); + + if (xmlState != 0) + { + + // make sure that it's actually our type of XML object.. + if (xmlState->hasTagName ("JSYNTH_BANK")) + { + pXML = xmlState->getFirstChildElement(); + + while(pXML) + { + progID = pXML->getIntAttribute("ID"); + if (progID >= NUM_PROGRAMS) + break; + + pPatch = &patches[progID]; + + // ok, now pull out our parameters.. + pPatch->setName(pXML->getStringAttribute("NAME")); + for (i=0; i < SYNTH_NUM_PARAMS; i++) + { + value = (synth_float_t) pXML->getDoubleAttribute (getParameterNameXML(i), pPatch->getParameter(i)); + if (i==SYNTH_PARAM_TUNE) + { + if (value > 400.0) + { + value = 1200*log(value/440)/log(2.0); + } + } + pPatch->setParameter(i, value); + } + pPatch->getMidiCC()->importXML(pXML); + pXML = pXML->getNextElement(); + + } + } + setCurrentProgram(getCurrentProgram()); + } +} + +void JaySynthAudioProcessor::getCurrentProgramStateInformation (MemoryBlock& destData) +{ + // You should use this method to store your parameters in the memory block. + // You could do that either as raw data, or use the XML or ValueTree classes + // as intermediaries to make it easy to save and load complex data. + // You should use this method to store your parameters in the memory block. + // Here's an example of how you can use XML to make it easy and more robust: + + int i; + synth_float_t value; + MemoryOutputStream outputStream (destData, false); + MemoryBlock tmpBlock(2*65536, /*initialiseToZero*/true); + GZIPCompressorOutputStream GZIPEnc(&outputStream, /*compressionLevel*/0, /*deleteDestStreamWhenDestroyed*/false, /*windowBits*/0); + + // Create an outer XML element.. + ScopedPointerxml = new XmlElement("JSYNTH_PATCH"); + + if (isPatchModified() || midCC_editBuffer.isMidiCCmodified()) + { + for (i=0; i < SYNTH_NUM_PARAMS; i++) + { + value = getParam(i); + currpatch->setParameter(i, value); // Copy synth param to current program + } + currpatch->getMidiCC()->copyMidiCC(&midCC_editBuffer); // Copy MidiCC edit buffer to patch + } + + xml->setAttribute ("NAME", currpatch->getName()); + for (i=0; i < SYNTH_NUM_PARAMS; i++) + { + value = currpatch->getParameter(i); + xml->setAttribute (getParameterNameXML(i), String(value, 10)); + } + currpatch->getMidiCC()->exportXML(xml); + setCurrentProgram(getCurrentProgram()); + + // then use this helper function to stuff it into the binary blob and return it.. + copyXmlToBinary (*xml, tmpBlock); + GZIPEnc.write(tmpBlock.getData(), tmpBlock.getSize()); + +#if 0 +//#ifdef SYNTH_DEBUG + { + File file(String("C:\\Users\\jens\\JaySynth\\") + String(currpatch->getName()) + String(".xml")); + file.create(); + xml->writeToFile (/*const File &destinationFile*/file, /*const String &dtdToUse*/"JSYNTH_PATCH_FILE" /*, const String &encodingType="UTF-8", int lineWrapLength=60*/); + } +#endif +} + +void JaySynthAudioProcessor::setCurrentProgramStateInformation (const void* data, int sizeInBytes) +{ + // You should use this method to restore your parameters from this memory block, + // whose contents will have been created by the getStateInformation() call. + int i, uncompressedSize; + synth_float_t value; + ScopedPointer xmlState = NULL; + void* pData; + int size; + + ScopedPointer pUncompressedData; + pUncompressedData = new char[2*65536]; + + MemoryInputStream inputStream(data, sizeInBytes, false); + GZIPDecompressorInputStream GZIPDec(inputStream); + uncompressedSize = GZIPDec.read(pUncompressedData, 2*65536); + + pData = (void *)data; + size = sizeInBytes; + if (uncompressedSize) + { + pData = (void *)pUncompressedData; + size = uncompressedSize; + } + xmlState = getXmlFromBinary(pData, size); + + if (xmlState != 0) + { + // make sure that it's actually our type of XML object.. + if (xmlState->hasTagName ("JSYNTH_PATCH")) + { + // ok, now pull out our parameters.. + currpatch->setName(xmlState->getStringAttribute("NAME")); + for (i=0; i < SYNTH_NUM_PARAMS; i++) + { + value = (synth_float_t) xmlState->getDoubleAttribute (getParameterNameXML(i), currpatch->getParameter(i)); + if (i==SYNTH_PARAM_TUNE) + { + if (value > 400.0) + { + value = 1200*log(value/440)/log(2.0); + } + } + currpatch->setParameter(i, value); + } + } + currpatch->getMidiCC()->importXML(xmlState); + setCurrentProgram(getCurrentProgram()); + } +} + +//============================================================================== +// This creates new instances of the plugin.. +AudioProcessor* JUCE_CALLTYPE createPluginFilter() +{ + return new JaySynthAudioProcessor(); +} diff --git a/Source/PluginProcessor.h b/Source/PluginProcessor.h new file mode 100644 index 0000000..d783143 --- /dev/null +++ b/Source/PluginProcessor.h @@ -0,0 +1,342 @@ +/* + ============================================================================== + + This file was auto-generated! + + It contains the basic startup code for a Juce application. + + ============================================================================== +*/ + +#ifndef __PLUGINPROCESSOR_H_20F201CA__ +#define __PLUGINPROCESSOR_H_20F201CA__ + +#include "../JuceLibraryCode/JuceHeader.h" +#include "synth_defs.h" +#include "JaySynthSound.h" +#include "JaySynth.h" + +//============================================================================== +/** +*/ +class JaySynthActionListener : public ActionBroadcaster +{ +public: + + enum + { + JAYSYNTH_CHANGED_PARAM = 0, + JAYSYNTH_CHANGED_MIDICC, + JAYSYNTH_CHANGED_NOTE_PRESSED, + JAYSYNTH_CHANGED_NOTE_RELEASED, + JAYSYNTH_CHANGED_NUM_VOICES_PLAYING, + JAYSYNTH_CHANGED_PROGRAM, + JAYSYNTH_CHANGED_LIMITER, + JAYSYNTH_CHANGED_SIZE + }; + + void callParamChanged (int paramID) + { + String s; + s = String("type=") + String(JAYSYNTH_CHANGED_PARAM); + s = s + String(" "); + s = s + String("paramID=") + String(paramID); + s = s + String(" "); + sendActionMessage(s); + } + + void callMidiControllerChanged (int channel, int controllerID, float value) + { + String s; + s = String("type=") + String(JAYSYNTH_CHANGED_MIDICC); + s = s + String(" "); + s = s + String("ch=") + String(channel); + s = s + String(" "); + s = s + String("id=") + String(controllerID); + s = s + String(" "); + s = s + String("value=") + String((float)value); + s = s + String(" "); + sendActionMessage(s); + } + + void callMidiNotePressed (int midi_note, float velocity) + { + String s; + s = String("type=") + String(JAYSYNTH_CHANGED_NOTE_PRESSED); + s = s + String(" "); + s = s + String("note=") + String(midi_note); + s = s + String(" "); + s = s + String("velocity=") + String((float)velocity); + s = s + String(" "); + sendActionMessage(s); + } + + void callMidiNoteReleased (int midi_note, float velocity) + { + String s; + s = String("type=") + String(JAYSYNTH_CHANGED_NOTE_RELEASED); + s = s + String(" "); + s = s + String("note=") + String(midi_note); + s = s + String(" "); + s = s + String("velocity=") + String((float)velocity); + s = s + String(" "); + sendActionMessage(s); + } + + void callProgramChanged(void) + { + String s; + s = String("type=") + String(JAYSYNTH_CHANGED_PROGRAM); + s = s + String(" "); + sendActionMessage(s); + } + + void callLimiterChanged (int value) + { + String s; + s = String("type=") + String(JAYSYNTH_CHANGED_LIMITER); + s = s + String(" "); + s = s + String("value=") + String(value); + s = s + String(" "); + sendActionMessage(s); + } + + void callNumVoicesPlaying (int value) + { + String s; + s = String("type=") + String(JAYSYNTH_CHANGED_NUM_VOICES_PLAYING); + s = s + String(" "); + s = s + String("value=") + String(value); + s = s + String(" "); + sendActionMessage(s); + } + + void callBinary(void *pData, int size) + { + String s; + s.createStringFromData(pData, size); + sendActionMessage(s); + } + + void add (ActionListener *listener) + { + addActionListener((ActionListener*)listener); + } + void remove (ActionListener *listener) + { + removeActionListener((ActionListener*)listener); + } + +private: +}; + +class JaySynthAudioProcessor : + public Timer, + public AudioProcessor, + public JaySynthSound, + public JaySynthListener +{ +public: + //============================================================================== + JaySynthAudioProcessor(); + ~JaySynthAudioProcessor(); + + //============================================================================== + void prepareToPlay (double sampleRate, int samplesPerBlock); + void releaseResources(); + + void processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages); + + //============================================================================== + AudioProcessorEditor* createEditor(); + bool hasEditor() const; + //============================================================================== + const String getName() const; + + int getNumParameters(); + + void setParameter (int index, float newValue); + float getParameter (int index); + void setParam(int index, synth_float_t param, bool doModifyPatch, bool doNotifyHost); + synth_float_t getParam(int index); + void controlParam(int index, synth_float_t newValue); + + const String getParameterName (int index); + const String getParameterText (int index); + + const String getInputChannelName (int channelIndex) const; + const String getOutputChannelName (int channelIndex) const; + bool isInputChannelStereoPair (int index) const; + bool isOutputChannelStereoPair (int index) const; + + bool acceptsMidi() const; + bool producesMidi() const; + + //============================================================================== + int getNumPrograms(); + int getCurrentProgram(); + void setCurrentProgram (int index); + const String getProgramName (int index); + void changeProgramName (int index, const String& newName); + + //============================================================================== + void copyXmlToBinary (const XmlElement& xml, juce::MemoryBlock& destData); + XmlElement* getXmlFromBinary (const void* data, const int sizeInBytes); + const String getParameterNameXML (int index); + void getCurrentProgramStateInformation (MemoryBlock& destData); + void setCurrentProgramStateInformation (const void* data, int sizeInBytes); + + void getStateInformation (MemoryBlock& destData); + void setStateInformation (const void* data, int sizeInBytes); + + //============================================================================== + // These properties are public so that our editor component can access them + // A bit of a hacky way to do it, but it's only a demo! Obviously in your own + // code you'll do this much more neatly.. + + // this is kept up to date with the midi messages that arrive, and the UI component + // registers with it so it can represent the incoming messages + MidiKeyboardState keyboardState; + + // this keeps a copy of the last set of time info that was acquired during an audio + // callback - the UI component will read this and display it. + AudioPlayHead::CurrentPositionInfo lastPosInfo; + + // these are used to persist the UI's size - the values are stored along with the + // filter's other parameters, and the UI component will update them when it gets + // resized. + void synthChanged(int type, void *pData); + + void addActionListener(ActionListener* listener) + { + actionListener.add(listener); + } + + void removeActionListener(ActionListener* listener) + { + actionListener.remove(listener); + } + + void sendParamChangeToHost(int index, float value) + { + AudioProcessor::sendParamChangeMessageToListeners(index, value); + } + + JaySynth::midiCC_info_t* getLastMidiControllers(void) + { + return pSynth->getLastMidiCC_infos(); + } + + JaySynth::midi_note_info_t* getLastMidiNoteInfos(void) + { + return pSynth->getLastMidiNote_infos(); + } + + void setCurrentProgramName (String name) + { + changeProgramName(getCurrentProgram(), name); + updateHostDisplay(); + } + + const String getCurrentProgramName (void) + { + String s; + + if (isPatchModified() || getMidiCC_editBuffer()->isMidiCCmodified()) + { + s = getProgramName(getCurrentProgram()) + String(" [edited]"); + } + else + { + s = getProgramName(getCurrentProgram()); + } + + return s; + }; + + bool isPatchModified(void) + { + return isModified; + } + + void clearPatchModified(void) + { + isModified = false; + } + + void setPatchModified(void) + { + isModified = true; + } + + JaySynthMidiCC *getMidiCC_editBuffer(void) + { + return &midCC_editBuffer; + } + + void applyMidiController(JaySynth::midiCC_info_t *pMidiCC_info, bool forceApply); + void applyCurrentMidiControllers(void); + + void humanizeModeChanged(void) + { + pSynth->humanizeModeChanged(); + } + + void unisonoModeChanged(void) + { + pSynth->unisonoModeChanged(); + } + + void humanizeVarianceChanged_VCO(void) + { + pSynth->humanizeVarianceChanged_VCO(); + } + + void humanizeVarianceChanged_VCF(void) + { + pSynth->humanizeVarianceChanged_VCF(); + } + + void humanizeVarianceChanged_ENV(void) + { + pSynth->humanizeVarianceChanged_ENV(); + } + + void perVoiceControlChanged(int paramID) + { + pSynth->updateParameter(paramID); + } + + void perVoiceControlsChanged(void) + { + pSynth->updateParameters(); + } + + String wavesGetPath(); + bool isWavesAvailable(); + + void timerCallback(); + +private: + // the synth! + bool isModified; + bool m_isWavesAvailable; + int lastUIWidth, lastUIHeight; + synth_float_t master_volume, m_fs; + int currProgram; + JaySynthSound patches[NUM_PROGRAMS]; + JaySynthSound *currpatch; + JaySynthActionListener actionListener; + JaySynth *pSynth; + void *the_editor; + JaySynthMidiCC midCC_editBuffer; + int m_limiter_active; + synth_float_t m_limiter_env; + //============================================================================== + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JaySynthAudioProcessor); +}; + +//typedef JaySynthAudioProcessor::Listener JaySynthAudioProcessorListener; + + +#endif // __PLUGINPROCESSOR_H_20F201CA__ diff --git a/Source/VelKey_PopUp.cpp b/Source/VelKey_PopUp.cpp new file mode 100644 index 0000000..37af4ee --- /dev/null +++ b/Source/VelKey_PopUp.cpp @@ -0,0 +1,1326 @@ +/* + ============================================================================== + + This is an automatically generated file created by the Jucer! + + Creation date: 30 Sep 2012 11:31:53am + + Be careful when adding custom code to these files, as only the code within + the "//[xyz]" and "//[/xyz]" sections will be retained when the file is loaded + and re-saved. + + Jucer version: 1.12 + + ------------------------------------------------------------------------------ + + The Jucer is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-6 by Raw Material Software ltd. + + ============================================================================== +*/ + +//[Headers] You can add your own extra header files here... +//[/Headers] + +#include "VelKey_PopUp.h" + + +//[MiscUserDefs] You can add your own user definitions and misc code here... +//[/MiscUserDefs] + +//============================================================================== +VelKey_PopUp::VelKey_PopUp (JaySynthMidiCC *pMidiCC, int paramID, synth_float_t currParamValue, JaySynth::midi_note_info_t *pCurrentMidiNoteInfo, String name, VelKey_PopUp_Listener *listener) + : Component (L"VelKey_PopUp"), + label_parameter_name (0), + groupComponent3 (0), + groupComponent (0), + groupComponent2 (0), + m_graph_vel (0), + slider_vel_kexp (0), + slider_vel_scenter (0), + label_vel_kexp (0), + label_vel_scenter (0), + label_vel_min (0), + slider_vel_min (0), + textButton_OK (0), + button_vel_assign_enable (0), + label_vel_ymin (0), + label_vel_ymax (0), + label_vel_x100 (0), + label_vel_x0 (0), + m_graph_key (0), + slider_key_kexp (0), + slider_key_scenter (0), + label_key_kexp (0), + label_vel_scenter2 (0), + label_key_min (0), + slider_key_min (0), + button_key_assign_enable (0), + label_key_ymin (0), + label_key_ymax (0), + label_key_x100 (0), + label_key_x0 (0), + comboBoxOPSel (0), + label_key (0), + label_vel (0), + slider_vel_max (0), + label_vel_max (0), + label_key_max (0), + slider_key_max (0), + label_vel_shape (0), + label_vel_skew (0), + label_key_shape (0), + label_key_skew (0), + label_vel_skew_text (0), + label_key_skew_text (0), + label_vel_shape_text (0), + label_key_shape_text (0), + label_vel_max_text (0), + label_vel_min_text (0), + label_key_min_text (0), + label_key_max_text (0), + label_vel_y (0), + label_key_y (0), + label_vel_x (0), + label_key_x (0), + m_btn_flip_vel (0), + m_btn_flip_key (0) +{ + addAndMakeVisible (label_parameter_name = new Label (L"Parameter Name", + L"Parameter Name")); + label_parameter_name->setTooltip (L"This is the parameter to modulate"); + label_parameter_name->setFont (Font (20.0000f, Font::plain)); + label_parameter_name->setJustificationType (Justification::centredLeft); + label_parameter_name->setEditable (false, false, false); + label_parameter_name->setColour (Label::textColourId, Colours::white); + label_parameter_name->setColour (TextEditor::textColourId, Colours::black); + label_parameter_name->setColour (TextEditor::backgroundColourId, Colour (0x0)); + + addAndMakeVisible (groupComponent3 = new GroupComponent (L"new group", + L"Combine Curves")); + groupComponent3->setColour (GroupComponent::outlineColourId, Colour (0x7fffffff)); + groupComponent3->setColour (GroupComponent::textColourId, Colour (0xc0ffffff)); + + addAndMakeVisible (groupComponent = new GroupComponent (L"new group", + L"Velocity Sensitivity Curve")); + groupComponent->setColour (GroupComponent::outlineColourId, Colour (0x7fffffff)); + groupComponent->setColour (GroupComponent::textColourId, Colour (0xc0ffffff)); + + addAndMakeVisible (groupComponent2 = new GroupComponent (L"new group", + L"Key Sensitivity Curve")); + groupComponent2->setColour (GroupComponent::outlineColourId, Colour (0x7fffffff)); + groupComponent2->setColour (GroupComponent::textColourId, Colour (0xc0ffffff)); + + addAndMakeVisible (m_graph_vel = new GraphWindow()); + addAndMakeVisible (slider_vel_kexp = new Slider (L"slider_vel_kexp")); + slider_vel_kexp->setTooltip (L"Velocity Curve Shape"); + slider_vel_kexp->setRange (0, 1, 0); + slider_vel_kexp->setSliderStyle (Slider::LinearHorizontal); + slider_vel_kexp->setTextBoxStyle (Slider::NoTextBox, true, 80, 20); + slider_vel_kexp->addListener (this); + + addAndMakeVisible (slider_vel_scenter = new Slider (L"slider_vel_scenter")); + slider_vel_scenter->setTooltip (L"Velocity Curve Skew"); + slider_vel_scenter->setRange (0, 1, 0); + slider_vel_scenter->setSliderStyle (Slider::LinearHorizontal); + slider_vel_scenter->setTextBoxStyle (Slider::NoTextBox, true, 80, 20); + slider_vel_scenter->addListener (this); + + addAndMakeVisible (label_vel_kexp = new Label (L"label_vel_kexp", + L"Shape")); + label_vel_kexp->setTooltip (L"Velocity Curve Shape"); + label_vel_kexp->setFont (Font (15.0000f, Font::plain)); + label_vel_kexp->setJustificationType (Justification::centredRight); + label_vel_kexp->setEditable (false, false, false); + label_vel_kexp->setColour (Label::textColourId, Colours::white); + label_vel_kexp->setColour (TextEditor::textColourId, Colours::white); + label_vel_kexp->setColour (TextEditor::backgroundColourId, Colour (0x0)); + + addAndMakeVisible (label_vel_scenter = new Label (L"label_vel_scenter", + L"Skew")); + label_vel_scenter->setTooltip (L"Velocity Curve Skew"); + label_vel_scenter->setFont (Font (15.0000f, Font::plain)); + label_vel_scenter->setJustificationType (Justification::centredRight); + label_vel_scenter->setEditable (false, false, false); + label_vel_scenter->setColour (Label::textColourId, Colours::white); + label_vel_scenter->setColour (TextEditor::textColourId, Colours::white); + label_vel_scenter->setColour (TextEditor::backgroundColourId, Colour (0x0)); + + addAndMakeVisible (label_vel_min = new Label (L"label_vel_min", + L"Low")); + label_vel_min->setTooltip (L"Parameter modulation at lowest velocity"); + label_vel_min->setFont (Font (15.0000f, Font::plain)); + label_vel_min->setJustificationType (Justification::centredRight); + label_vel_min->setEditable (false, false, false); + label_vel_min->setColour (Label::textColourId, Colours::white); + label_vel_min->setColour (TextEditor::textColourId, Colours::white); + label_vel_min->setColour (TextEditor::backgroundColourId, Colour (0x0)); + + addAndMakeVisible (slider_vel_min = new Slider (L"slider_vel_min")); + slider_vel_min->setTooltip (L"Parameter modulation at lowest velocity"); + slider_vel_min->setRange (0, 1, 0); + slider_vel_min->setSliderStyle (Slider::LinearHorizontal); + slider_vel_min->setTextBoxStyle (Slider::NoTextBox, true, 80, 20); + slider_vel_min->addListener (this); + + addAndMakeVisible (textButton_OK = new TextButton (L"OK")); + textButton_OK->setTooltip (L"Close this window"); + textButton_OK->addListener (this); + + addAndMakeVisible (button_vel_assign_enable = new ToggleButton (L"Assign Vel Enable")); + button_vel_assign_enable->setTooltip (L"Set this to make Velocity Sensitivity active"); + button_vel_assign_enable->setButtonText (L"Active"); + button_vel_assign_enable->addListener (this); + button_vel_assign_enable->setColour (ToggleButton::textColourId, Colours::white); + + addAndMakeVisible (label_vel_ymin = new Label (L"label_vel_ymin", + L"0")); + label_vel_ymin->setFont (Font (12.0000f, Font::plain)); + label_vel_ymin->setJustificationType (Justification::centredRight); + label_vel_ymin->setEditable (true, true, false); + label_vel_ymin->setColour (Label::textColourId, Colours::white); + label_vel_ymin->setColour (TextEditor::textColourId, Colours::white); + label_vel_ymin->setColour (TextEditor::backgroundColourId, Colour (0x0)); + label_vel_ymin->addListener (this); + + addAndMakeVisible (label_vel_ymax = new Label (L"label_vel_ymax", + L"100")); + label_vel_ymax->setFont (Font (12.0000f, Font::plain)); + label_vel_ymax->setJustificationType (Justification::centredRight); + label_vel_ymax->setEditable (true, true, false); + label_vel_ymax->setColour (Label::textColourId, Colours::white); + label_vel_ymax->setColour (TextEditor::textColourId, Colours::white); + label_vel_ymax->setColour (TextEditor::backgroundColourId, Colour (0x0)); + label_vel_ymax->addListener (this); + + addAndMakeVisible (label_vel_x100 = new Label (L"label_vel_x100", + L"100%")); + label_vel_x100->setFont (Font (12.0000f, Font::plain)); + label_vel_x100->setJustificationType (Justification::centred); + label_vel_x100->setEditable (false, false, false); + label_vel_x100->setColour (Label::textColourId, Colours::white); + label_vel_x100->setColour (TextEditor::textColourId, Colours::white); + label_vel_x100->setColour (TextEditor::backgroundColourId, Colour (0x0)); + + addAndMakeVisible (label_vel_x0 = new Label (L"label_vel_x0", + L"0%")); + label_vel_x0->setFont (Font (12.0000f, Font::plain)); + label_vel_x0->setJustificationType (Justification::centred); + label_vel_x0->setEditable (false, false, false); + label_vel_x0->setColour (Label::textColourId, Colours::white); + label_vel_x0->setColour (TextEditor::textColourId, Colours::white); + label_vel_x0->setColour (TextEditor::backgroundColourId, Colour (0x0)); + + addAndMakeVisible (m_graph_key = new GraphWindow()); + addAndMakeVisible (slider_key_kexp = new Slider (L"slider_key_kexp")); + slider_key_kexp->setTooltip (L"Key Curve Shape"); + slider_key_kexp->setRange (0, 1, 0); + slider_key_kexp->setSliderStyle (Slider::LinearHorizontal); + slider_key_kexp->setTextBoxStyle (Slider::NoTextBox, true, 80, 20); + slider_key_kexp->addListener (this); + + addAndMakeVisible (slider_key_scenter = new Slider (L"slider_key_scenter")); + slider_key_scenter->setTooltip (L"Key Curve Skew"); + slider_key_scenter->setRange (0, 1, 0); + slider_key_scenter->setSliderStyle (Slider::LinearHorizontal); + slider_key_scenter->setTextBoxStyle (Slider::NoTextBox, true, 80, 20); + slider_key_scenter->addListener (this); + + addAndMakeVisible (label_key_kexp = new Label (L"label_key_kexp", + L"Shape")); + label_key_kexp->setTooltip (L"Key Curve Shape"); + label_key_kexp->setFont (Font (15.0000f, Font::plain)); + label_key_kexp->setJustificationType (Justification::centredRight); + label_key_kexp->setEditable (false, false, false); + label_key_kexp->setColour (Label::textColourId, Colours::white); + label_key_kexp->setColour (TextEditor::textColourId, Colours::white); + label_key_kexp->setColour (TextEditor::backgroundColourId, Colour (0x0)); + + addAndMakeVisible (label_vel_scenter2 = new Label (L"label_vel_scenter", + L"Skew")); + label_vel_scenter2->setTooltip (L"Key Curve Skew"); + label_vel_scenter2->setFont (Font (15.0000f, Font::plain)); + label_vel_scenter2->setJustificationType (Justification::centredRight); + label_vel_scenter2->setEditable (false, false, false); + label_vel_scenter2->setColour (Label::textColourId, Colours::white); + label_vel_scenter2->setColour (TextEditor::textColourId, Colours::white); + label_vel_scenter2->setColour (TextEditor::backgroundColourId, Colour (0x0)); + + addAndMakeVisible (label_key_min = new Label (L"label_key_min", + L"Low")); + label_key_min->setTooltip (L"Parameter modulation at lowest key"); + label_key_min->setFont (Font (15.0000f, Font::plain)); + label_key_min->setJustificationType (Justification::centredRight); + label_key_min->setEditable (false, false, false); + label_key_min->setColour (Label::textColourId, Colours::white); + label_key_min->setColour (TextEditor::textColourId, Colours::white); + label_key_min->setColour (TextEditor::backgroundColourId, Colour (0x0)); + + addAndMakeVisible (slider_key_min = new Slider (L"slider_key_min")); + slider_key_min->setTooltip (L"Parameter modulation at lowest key"); + slider_key_min->setRange (0, 1, 0); + slider_key_min->setSliderStyle (Slider::LinearHorizontal); + slider_key_min->setTextBoxStyle (Slider::NoTextBox, true, 80, 20); + slider_key_min->addListener (this); + + addAndMakeVisible (button_key_assign_enable = new ToggleButton (L"Assign Key Enable")); + button_key_assign_enable->setTooltip (L"Set this to make Key Follow active"); + button_key_assign_enable->setButtonText (L"Active"); + button_key_assign_enable->addListener (this); + button_key_assign_enable->setColour (ToggleButton::textColourId, Colours::white); + + addAndMakeVisible (label_key_ymin = new Label (L"label_key_ymin", + L"0")); + label_key_ymin->setFont (Font (12.0000f, Font::plain)); + label_key_ymin->setJustificationType (Justification::centredRight); + label_key_ymin->setEditable (true, true, false); + label_key_ymin->setColour (Label::textColourId, Colours::white); + label_key_ymin->setColour (TextEditor::textColourId, Colours::white); + label_key_ymin->setColour (TextEditor::backgroundColourId, Colour (0x0)); + label_key_ymin->addListener (this); + + addAndMakeVisible (label_key_ymax = new Label (L"label_key_ymax", + L"100")); + label_key_ymax->setFont (Font (12.0000f, Font::plain)); + label_key_ymax->setJustificationType (Justification::centredRight); + label_key_ymax->setEditable (true, true, false); + label_key_ymax->setColour (Label::textColourId, Colours::white); + label_key_ymax->setColour (TextEditor::textColourId, Colours::white); + label_key_ymax->setColour (TextEditor::backgroundColourId, Colour (0x0)); + label_key_ymax->addListener (this); + + addAndMakeVisible (label_key_x100 = new Label (L"label_key_x100", + L"100%")); + label_key_x100->setFont (Font (12.0000f, Font::plain)); + label_key_x100->setJustificationType (Justification::centred); + label_key_x100->setEditable (false, false, false); + label_key_x100->setColour (Label::textColourId, Colours::white); + label_key_x100->setColour (TextEditor::textColourId, Colours::white); + label_key_x100->setColour (TextEditor::backgroundColourId, Colour (0x0)); + + addAndMakeVisible (label_key_x0 = new Label (L"label_key_x0", + L"0%")); + label_key_x0->setFont (Font (12.0000f, Font::plain)); + label_key_x0->setJustificationType (Justification::centred); + label_key_x0->setEditable (false, false, false); + label_key_x0->setColour (Label::textColourId, Colours::white); + label_key_x0->setColour (TextEditor::textColourId, Colours::white); + label_key_x0->setColour (TextEditor::backgroundColourId, Colour (0x0)); + + addAndMakeVisible (comboBoxOPSel = new ComboBox (L"comboBoxOPSel")); + comboBoxOPSel->setTooltip (L"Math operation to combine Velocity-Curve and Key-Curve"); + comboBoxOPSel->setEditableText (false); + comboBoxOPSel->setJustificationType (Justification::centredLeft); + comboBoxOPSel->setTextWhenNothingSelected (String::empty); + comboBoxOPSel->setTextWhenNoChoicesAvailable (L"(no choices)"); + comboBoxOPSel->addItem (L"Add", 1); + comboBoxOPSel->addItem (L"Sub", 2); + comboBoxOPSel->addItem (L"Mul", 3); + comboBoxOPSel->addListener (this); + + addAndMakeVisible (label_key = new Label (L"label_key", + L"Key")); + label_key->setFont (Font (15.0000f, Font::plain)); + label_key->setJustificationType (Justification::centredLeft); + label_key->setEditable (false, false, false); + label_key->setColour (Label::textColourId, Colours::white); + label_key->setColour (TextEditor::textColourId, Colours::white); + label_key->setColour (TextEditor::backgroundColourId, Colour (0x0)); + + addAndMakeVisible (label_vel = new Label (L"label_vel", + L"Velocity")); + label_vel->setFont (Font (15.0000f, Font::plain)); + label_vel->setJustificationType (Justification::centredRight); + label_vel->setEditable (false, false, false); + label_vel->setColour (Label::textColourId, Colours::white); + label_vel->setColour (TextEditor::textColourId, Colours::white); + label_vel->setColour (TextEditor::backgroundColourId, Colour (0x0)); + + addAndMakeVisible (slider_vel_max = new Slider (L"slider_vel_max")); + slider_vel_max->setTooltip (L"Parameter modulation at highest velocity"); + slider_vel_max->setRange (0, 1, 0); + slider_vel_max->setSliderStyle (Slider::LinearHorizontal); + slider_vel_max->setTextBoxStyle (Slider::NoTextBox, true, 80, 20); + slider_vel_max->addListener (this); + + addAndMakeVisible (label_vel_max = new Label (L"label_vel_max", + L"High")); + label_vel_max->setTooltip (L"Parameter modulation at highest velocity"); + label_vel_max->setFont (Font (15.0000f, Font::plain)); + label_vel_max->setJustificationType (Justification::centredRight); + label_vel_max->setEditable (false, false, false); + label_vel_max->setColour (Label::textColourId, Colours::white); + label_vel_max->setColour (TextEditor::textColourId, Colours::white); + label_vel_max->setColour (TextEditor::backgroundColourId, Colour (0x0)); + + addAndMakeVisible (label_key_max = new Label (L"label_key_max", + L"High")); + label_key_max->setTooltip (L"Parameter modulation at highest key"); + label_key_max->setFont (Font (15.0000f, Font::plain)); + label_key_max->setJustificationType (Justification::centredRight); + label_key_max->setEditable (false, false, false); + label_key_max->setColour (Label::textColourId, Colours::white); + label_key_max->setColour (TextEditor::textColourId, Colours::white); + label_key_max->setColour (TextEditor::backgroundColourId, Colour (0x0)); + + addAndMakeVisible (slider_key_max = new Slider (L"slider_key_max")); + slider_key_max->setTooltip (L"Parameter modulation at highest key"); + slider_key_max->setRange (0, 1, 0); + slider_key_max->setSliderStyle (Slider::LinearHorizontal); + slider_key_max->setTextBoxStyle (Slider::NoTextBox, true, 80, 20); + slider_key_max->addListener (this); + + addAndMakeVisible (label_vel_shape = new Label (L"label_vel_shape", + L"-100.00")); + label_vel_shape->setFont (Font (12.0000f, Font::plain)); + label_vel_shape->setJustificationType (Justification::centredLeft); + label_vel_shape->setEditable (true, true, false); + label_vel_shape->setColour (Label::textColourId, Colours::white); + label_vel_shape->setColour (TextEditor::textColourId, Colours::white); + label_vel_shape->setColour (TextEditor::backgroundColourId, Colour (0x0)); + label_vel_shape->addListener (this); + + addAndMakeVisible (label_vel_skew = new Label (L"label_vel_skew", + L"100")); + label_vel_skew->setFont (Font (12.0000f, Font::plain)); + label_vel_skew->setJustificationType (Justification::centredLeft); + label_vel_skew->setEditable (true, true, false); + label_vel_skew->setColour (Label::textColourId, Colours::white); + label_vel_skew->setColour (TextEditor::textColourId, Colours::white); + label_vel_skew->setColour (TextEditor::backgroundColourId, Colour (0x0)); + label_vel_skew->addListener (this); + + addAndMakeVisible (label_key_shape = new Label (L"label_key_shape", + L"-100.00")); + label_key_shape->setFont (Font (12.0000f, Font::plain)); + label_key_shape->setJustificationType (Justification::centredLeft); + label_key_shape->setEditable (true, true, false); + label_key_shape->setColour (Label::textColourId, Colours::white); + label_key_shape->setColour (TextEditor::textColourId, Colours::white); + label_key_shape->setColour (TextEditor::backgroundColourId, Colour (0x0)); + label_key_shape->addListener (this); + + addAndMakeVisible (label_key_skew = new Label (L"label_key_skew", + L"100")); + label_key_skew->setFont (Font (12.0000f, Font::plain)); + label_key_skew->setJustificationType (Justification::centredLeft); + label_key_skew->setEditable (true, true, false); + label_key_skew->setColour (Label::textColourId, Colours::white); + label_key_skew->setColour (TextEditor::textColourId, Colours::white); + label_key_skew->setColour (TextEditor::backgroundColourId, Colour (0x0)); + label_key_skew->addListener (this); + + addAndMakeVisible (label_vel_skew_text = new Label (L"label_vel_skew_text", + L"Skew:")); + label_vel_skew_text->setFont (Font (12.0000f, Font::plain)); + label_vel_skew_text->setJustificationType (Justification::centredRight); + label_vel_skew_text->setEditable (false, false, false); + label_vel_skew_text->setColour (Label::textColourId, Colours::white); + label_vel_skew_text->setColour (TextEditor::textColourId, Colours::white); + label_vel_skew_text->setColour (TextEditor::backgroundColourId, Colour (0x0)); + + addAndMakeVisible (label_key_skew_text = new Label (L"label_key_skew_text", + L"Skew:")); + label_key_skew_text->setFont (Font (12.0000f, Font::plain)); + label_key_skew_text->setJustificationType (Justification::centredRight); + label_key_skew_text->setEditable (false, false, false); + label_key_skew_text->setColour (Label::textColourId, Colours::white); + label_key_skew_text->setColour (TextEditor::textColourId, Colours::white); + label_key_skew_text->setColour (TextEditor::backgroundColourId, Colour (0x0)); + + addAndMakeVisible (label_vel_shape_text = new Label (L"label_vel_shape_text", + L"Shape:")); + label_vel_shape_text->setFont (Font (12.0000f, Font::plain)); + label_vel_shape_text->setJustificationType (Justification::centredLeft); + label_vel_shape_text->setEditable (false, false, false); + label_vel_shape_text->setColour (Label::textColourId, Colours::white); + label_vel_shape_text->setColour (TextEditor::textColourId, Colours::white); + label_vel_shape_text->setColour (TextEditor::backgroundColourId, Colour (0x0)); + + addAndMakeVisible (label_key_shape_text = new Label (L"label_key_shape_text", + L"Shape:")); + label_key_shape_text->setFont (Font (12.0000f, Font::plain)); + label_key_shape_text->setJustificationType (Justification::centredLeft); + label_key_shape_text->setEditable (false, false, false); + label_key_shape_text->setColour (Label::textColourId, Colours::white); + label_key_shape_text->setColour (TextEditor::textColourId, Colours::white); + label_key_shape_text->setColour (TextEditor::backgroundColourId, Colour (0x0)); + + addAndMakeVisible (label_vel_max_text = new Label (L"label_vel_max_text", + L"High")); + label_vel_max_text->setFont (Font (12.0000f, Font::plain)); + label_vel_max_text->setJustificationType (Justification::centred); + label_vel_max_text->setEditable (false, false, false); + label_vel_max_text->setColour (Label::textColourId, Colours::white); + label_vel_max_text->setColour (TextEditor::textColourId, Colours::white); + label_vel_max_text->setColour (TextEditor::backgroundColourId, Colour (0x0)); + + addAndMakeVisible (label_vel_min_text = new Label (L"label_vel_min_text", + L"Low")); + label_vel_min_text->setFont (Font (12.0000f, Font::plain)); + label_vel_min_text->setJustificationType (Justification::centred); + label_vel_min_text->setEditable (false, false, false); + label_vel_min_text->setColour (Label::textColourId, Colours::white); + label_vel_min_text->setColour (TextEditor::textColourId, Colours::white); + label_vel_min_text->setColour (TextEditor::backgroundColourId, Colour (0x0)); + + addAndMakeVisible (label_key_min_text = new Label (L"label_key_min_text", + L"Low")); + label_key_min_text->setFont (Font (12.0000f, Font::plain)); + label_key_min_text->setJustificationType (Justification::centred); + label_key_min_text->setEditable (false, false, false); + label_key_min_text->setColour (Label::textColourId, Colours::white); + label_key_min_text->setColour (TextEditor::textColourId, Colours::white); + label_key_min_text->setColour (TextEditor::backgroundColourId, Colour (0x0)); + + addAndMakeVisible (label_key_max_text = new Label (L"label_key_max_text", + L"High")); + label_key_max_text->setFont (Font (12.0000f, Font::plain)); + label_key_max_text->setJustificationType (Justification::centred); + label_key_max_text->setEditable (false, false, false); + label_key_max_text->setColour (Label::textColourId, Colours::white); + label_key_max_text->setColour (TextEditor::textColourId, Colours::white); + label_key_max_text->setColour (TextEditor::backgroundColourId, Colour (0x0)); + + addAndMakeVisible (label_vel_y = new Label (L"label_vel_y", + L"0")); + label_vel_y->setFont (Font (12.0000f, Font::plain)); + label_vel_y->setJustificationType (Justification::centredRight); + label_vel_y->setEditable (false, false, false); + label_vel_y->setColour (Label::textColourId, Colours::silver); + label_vel_y->setColour (TextEditor::textColourId, Colours::white); + label_vel_y->setColour (TextEditor::backgroundColourId, Colour (0x0)); + + addAndMakeVisible (label_key_y = new Label (L"label_key_y", + L"0")); + label_key_y->setFont (Font (12.0000f, Font::plain)); + label_key_y->setJustificationType (Justification::centredRight); + label_key_y->setEditable (false, false, false); + label_key_y->setColour (Label::textColourId, Colours::silver); + label_key_y->setColour (TextEditor::textColourId, Colours::white); + label_key_y->setColour (TextEditor::backgroundColourId, Colour (0x0)); + + addAndMakeVisible (label_vel_x = new Label (L"label_vel_x", + L"0")); + label_vel_x->setFont (Font (12.0000f, Font::plain)); + label_vel_x->setJustificationType (Justification::centred); + label_vel_x->setEditable (false, false, false); + label_vel_x->setColour (Label::textColourId, Colours::silver); + label_vel_x->setColour (TextEditor::textColourId, Colours::white); + label_vel_x->setColour (TextEditor::backgroundColourId, Colour (0x0)); + + addAndMakeVisible (label_key_x = new Label (L"label_key_x", + L"0")); + label_key_x->setFont (Font (12.0000f, Font::plain)); + label_key_x->setJustificationType (Justification::centred); + label_key_x->setEditable (false, false, false); + label_key_x->setColour (Label::textColourId, Colours::silver); + label_key_x->setColour (TextEditor::textColourId, Colours::white); + label_key_x->setColour (TextEditor::backgroundColourId, Colour (0x0)); + + addAndMakeVisible (m_btn_flip_vel = new TextButton (L"m_btn_flip_vel")); + m_btn_flip_vel->setTooltip (L"Quick swap of Low and High values"); + m_btn_flip_vel->setButtonText (L"High <> Low"); + m_btn_flip_vel->addListener (this); + + addAndMakeVisible (m_btn_flip_key = new TextButton (L"m_btn_flip_key")); + m_btn_flip_key->setTooltip (L"Quick swap of Low and High values"); + m_btn_flip_key->setButtonText (L"High <> Low"); + m_btn_flip_key->addListener (this); + + + //[UserPreSize] + //[/UserPreSize] + + setSize (520, 520); + + + //[Constructor] You can add your own custom stuff here.. + createNoteNameTbl(); + m_isFlipped_vel = false; + m_isFlipped_key = false; + paramInfoInit(&m_shape_xform , 0, "shape_xform"); + paramInfoInit(&m_skew_xform , 0, "skew_xform"); + paramInfoSet(&m_shape_xform, 100, 1, 0.5, -100, 0, 100, 0.01); + paramInfoSet(&m_skew_xform, 1, 1, 0.0, 0, -1, 1, 0.001); + m_text_vel_min = label_vel_min_text->getText(); + m_text_vel_max = label_vel_max_text->getText(); + m_text_key_min = label_key_min_text->getText(); + m_text_key_max = label_key_max_text->getText(); + + this->pMidiCC = pMidiCC; + m_currParamValue = currParamValue; + m_paramID = paramID; + m_currentMidiNoteInfo = *pCurrentMidiNoteInfo; + pMidiCC_container = pMidiCC->getAtParamID(m_paramID); + paramInfoInit(&m_velKey_constraints, 0, pMidiCC->getConstraints(pMidiCC_container)->pName); + paramInfoCopy(&m_velKey_constraints, pMidiCC->getConstraints(pMidiCC_container)); + m_velKey_constraints.pmax = max(fabs(pMidiCC->getConstraints(pMidiCC_container)->pmin), fabs(pMidiCC->getConstraints(pMidiCC_container)->pmax)); + m_velKey_constraints.pmin = -m_velKey_constraints.pmax; + m_velKey_constraints.scenter = 0.5; + m_velKey_constraints.pcenter = -1E18; + + label_parameter_name->setText(name, false); + comboBoxOPSel->setSelectedId(1 + pMidiCC->getVelKeyCombineOP(pMidiCC_container), true); + + slider_vel_kexp->setValue(toSlider(&m_shape_xform, pMidiCC->getVelCurve(pMidiCC_container)->kexp), false); + slider_vel_scenter->setValue(toSlider(&m_skew_xform, pMidiCC->getVelCurve(pMidiCC_container)->scenter), false); + slider_vel_max->setValue(toSlider(&m_velKey_constraints, pMidiCC->getVelCurve(pMidiCC_container)->pmax*m_velKey_constraints.pmax), false); + slider_vel_min->setValue(toSlider(&m_velKey_constraints, pMidiCC->getVelCurve(pMidiCC_container)->pmin*m_velKey_constraints.pmax), false); + button_vel_assign_enable->setToggleState(pMidiCC->isAssignedVel(pMidiCC_container), false); + + slider_key_kexp->setValue(toSlider(&m_shape_xform, pMidiCC->getKeyCurve(pMidiCC_container)->kexp), false); + slider_key_scenter->setValue(toSlider(&m_skew_xform, pMidiCC->getKeyCurve(pMidiCC_container)->scenter), false); + slider_key_max->setValue(toSlider(&m_velKey_constraints, pMidiCC->getKeyCurve(pMidiCC_container)->pmax*m_velKey_constraints.pmax), false); + slider_key_min->setValue(toSlider(&m_velKey_constraints, pMidiCC->getKeyCurve(pMidiCC_container)->pmin*m_velKey_constraints.pmax), false); + button_key_assign_enable->setToggleState(pMidiCC->isAssignedKey(pMidiCC_container), false); + + addListener(listener); + listeners.call (&VelKey_PopUp_Listener::VelKey_PopUp_event, POPUP_CREATED); + + m_label_prec = 3; + if (pMidiCC->getConstraints(pMidiCC_container)->pinterval > 0) + m_label_prec = max(1, (int)(-log(pMidiCC->getConstraints(pMidiCC_container)->pinterval)/log(10.0) + 0.5)); + + m_label_shape_prec = 3; + if (m_shape_xform.pinterval > 0) + m_label_shape_prec = max(1, (int)(-log(m_shape_xform.pinterval)/log(10.0) + 0.5)); + + m_label_skew_prec = 3; + if (m_skew_xform.pinterval > 0) + m_label_skew_prec = max(1, (int)(-log(m_skew_xform.pinterval)/log(10.0) + 0.5)); + + displayUpdate(); + //[/Constructor] +} + +VelKey_PopUp::~VelKey_PopUp() +{ + //[Destructor_pre]. You can add your own custom destruction code here.. + //[/Destructor_pre] + + deleteAndZero (label_parameter_name); + deleteAndZero (groupComponent3); + deleteAndZero (groupComponent); + deleteAndZero (groupComponent2); + deleteAndZero (m_graph_vel); + deleteAndZero (slider_vel_kexp); + deleteAndZero (slider_vel_scenter); + deleteAndZero (label_vel_kexp); + deleteAndZero (label_vel_scenter); + deleteAndZero (label_vel_min); + deleteAndZero (slider_vel_min); + deleteAndZero (textButton_OK); + deleteAndZero (button_vel_assign_enable); + deleteAndZero (label_vel_ymin); + deleteAndZero (label_vel_ymax); + deleteAndZero (label_vel_x100); + deleteAndZero (label_vel_x0); + deleteAndZero (m_graph_key); + deleteAndZero (slider_key_kexp); + deleteAndZero (slider_key_scenter); + deleteAndZero (label_key_kexp); + deleteAndZero (label_vel_scenter2); + deleteAndZero (label_key_min); + deleteAndZero (slider_key_min); + deleteAndZero (button_key_assign_enable); + deleteAndZero (label_key_ymin); + deleteAndZero (label_key_ymax); + deleteAndZero (label_key_x100); + deleteAndZero (label_key_x0); + deleteAndZero (comboBoxOPSel); + deleteAndZero (label_key); + deleteAndZero (label_vel); + deleteAndZero (slider_vel_max); + deleteAndZero (label_vel_max); + deleteAndZero (label_key_max); + deleteAndZero (slider_key_max); + deleteAndZero (label_vel_shape); + deleteAndZero (label_vel_skew); + deleteAndZero (label_key_shape); + deleteAndZero (label_key_skew); + deleteAndZero (label_vel_skew_text); + deleteAndZero (label_key_skew_text); + deleteAndZero (label_vel_shape_text); + deleteAndZero (label_key_shape_text); + deleteAndZero (label_vel_max_text); + deleteAndZero (label_vel_min_text); + deleteAndZero (label_key_min_text); + deleteAndZero (label_key_max_text); + deleteAndZero (label_vel_y); + deleteAndZero (label_key_y); + deleteAndZero (label_vel_x); + deleteAndZero (label_key_x); + deleteAndZero (m_btn_flip_vel); + deleteAndZero (m_btn_flip_key); + + + //[Destructor]. You can add your own custom destruction code here.. + paramInfoFree(&m_velKey_constraints); + paramInfoFree(&m_shape_xform); + paramInfoFree(&m_skew_xform); + //[/Destructor] +} + +//============================================================================== +void VelKey_PopUp::paint (Graphics& g) +{ + //[UserPrePaint] Add your own custom painting code here.. + //[/UserPrePaint] + + g.setColour (Colour (0xff2a64a5)); + g.fillRoundedRectangle (4.0f, 4.0f, 515.0f, 515.0f, 10.0000f); + + g.setColour (Colours::white); + g.drawRoundedRectangle (3.0f, 3.0f, 515.0f, 515.0f, 10.0000f, 4.0000f); + + //[UserPaint] Add your own custom painting code here.. + //[/UserPaint] +} + +void VelKey_PopUp::resized() +{ + label_parameter_name->setBounds (16, 24, 280, 24); + groupComponent3->setBounds (16, 424, 228, 68); + groupComponent->setBounds (16, 64, 228, 164); + groupComponent2->setBounds (16, 244, 228, 164); + m_graph_vel->setBounds (296, 88, 171, 121); + slider_vel_kexp->setBounds (100, 88, 130, 24); + slider_vel_scenter->setBounds (100, 112, 130, 24); + label_vel_kexp->setBounds (24, 88, 70, 24); + label_vel_scenter->setBounds (24, 112, 70, 24); + label_vel_min->setBounds (24, 160, 70, 24); + slider_vel_min->setBounds (100, 160, 130, 24); + textButton_OK->setBounds (304, 452, 150, 24); + button_vel_assign_enable->setBounds (28, 192, 56, 24); + label_vel_ymin->setBounds (244, 188, 50, 20); + label_vel_ymax->setBounds (244, 84, 50, 20); + label_vel_x100->setBounds (444, 212, 48, 12); + label_vel_x0->setBounds (284, 212, 50, 12); + m_graph_key->setBounds (296, 268, 171, 121); + slider_key_kexp->setBounds (100, 268, 130, 24); + slider_key_scenter->setBounds (100, 292, 130, 24); + label_key_kexp->setBounds (24, 268, 70, 24); + label_vel_scenter2->setBounds (24, 292, 70, 24); + label_key_min->setBounds (24, 340, 70, 24); + slider_key_min->setBounds (100, 340, 130, 24); + button_key_assign_enable->setBounds (28, 372, 56, 24); + label_key_ymin->setBounds (244, 368, 50, 20); + label_key_ymax->setBounds (245, 264, 50, 20); + label_key_x100->setBounds (444, 392, 48, 12); + label_key_x0->setBounds (284, 392, 50, 12); + comboBoxOPSel->setBounds (88, 452, 64, 20); + label_key->setBounds (160, 452, 70, 20); + label_vel->setBounds (12, 452, 70, 20); + slider_vel_max->setBounds (100, 136, 130, 24); + label_vel_max->setBounds (24, 136, 70, 24); + label_key_max->setBounds (24, 316, 70, 24); + slider_key_max->setBounds (100, 316, 130, 24); + label_vel_shape->setBounds (336, 68, 56, 20); + label_vel_skew->setBounds (436, 68, 40, 20); + label_key_shape->setBounds (336, 248, 56, 20); + label_key_skew->setBounds (436, 248, 40, 20); + label_vel_skew_text->setBounds (396, 68, 44, 20); + label_key_skew_text->setBounds (396, 248, 44, 20); + label_vel_shape_text->setBounds (296, 68, 48, 20); + label_key_shape_text->setBounds (296, 248, 48, 20); + label_vel_max_text->setBounds (260, 100, 40, 20); + label_vel_min_text->setBounds (260, 172, 40, 20); + label_key_min_text->setBounds (260, 352, 40, 20); + label_key_max_text->setBounds (260, 280, 40, 20); + label_vel_y->setBounds (244, 136, 50, 20); + label_key_y->setBounds (244, 316, 50, 20); + label_vel_x->setBounds (356, 208, 50, 20); + label_key_x->setBounds (356, 388, 50, 20); + m_btn_flip_vel->setBounds (100, 194, 84, 20); + m_btn_flip_key->setBounds (100, 374, 84, 20); + //[UserResized] Add your own custom resize handling here.. + //[/UserResized] +} + +void VelKey_PopUp::sliderValueChanged (Slider* sliderThatWasMoved) +{ + //[UsersliderValueChanged_Pre] + float value; + //[/UsersliderValueChanged_Pre] + + if (sliderThatWasMoved == slider_vel_kexp) + { + //[UserSliderCode_slider_vel_kexp] -- add your slider handling code here.. + pMidiCC->setVelCurveShape(pMidiCC_container, toParam(&m_shape_xform, sliderThatWasMoved->getValue())); + //[/UserSliderCode_slider_vel_kexp] + } + else if (sliderThatWasMoved == slider_vel_scenter) + { + //[UserSliderCode_slider_vel_scenter] -- add your slider handling code here.. + pMidiCC->setVelCurveSkew(pMidiCC_container, toParam(&m_skew_xform, sliderThatWasMoved->getValue())); + //[/UserSliderCode_slider_vel_scenter] + } + else if (sliderThatWasMoved == slider_vel_min) + { + //[UserSliderCode_slider_vel_min] -- add your slider handling code here.. + value = toParam(&m_velKey_constraints, sliderThatWasMoved->getValue())/m_velKey_constraints.pmax; + pMidiCC->setVelCurveMin(pMidiCC_container, value); + //[/UserSliderCode_slider_vel_min] + } + else if (sliderThatWasMoved == slider_key_kexp) + { + //[UserSliderCode_slider_key_kexp] -- add your slider handling code here.. + pMidiCC->setKeyCurveShape(pMidiCC_container, toParam(&m_shape_xform, sliderThatWasMoved->getValue())); + //[/UserSliderCode_slider_key_kexp] + } + else if (sliderThatWasMoved == slider_key_scenter) + { + //[UserSliderCode_slider_key_scenter] -- add your slider handling code here.. + pMidiCC->setKeyCurveSkew(pMidiCC_container, toParam(&m_skew_xform, sliderThatWasMoved->getValue())); + //[/UserSliderCode_slider_key_scenter] + } + else if (sliderThatWasMoved == slider_key_min) + { + //[UserSliderCode_slider_key_min] -- add your slider handling code here.. + value = toParam(&m_velKey_constraints, sliderThatWasMoved->getValue())/m_velKey_constraints.pmax; + pMidiCC->setKeyCurveMin(pMidiCC_container, value); + //[/UserSliderCode_slider_key_min] + } + else if (sliderThatWasMoved == slider_vel_max) + { + //[UserSliderCode_slider_vel_max] -- add your slider handling code here.. + value = toParam(&m_velKey_constraints, sliderThatWasMoved->getValue())/m_velKey_constraints.pmax; + pMidiCC->setVelCurveMax(pMidiCC_container, value); + //[/UserSliderCode_slider_vel_max] + } + else if (sliderThatWasMoved == slider_key_max) + { + //[UserSliderCode_slider_key_max] -- add your slider handling code here.. + value = toParam(&m_velKey_constraints, sliderThatWasMoved->getValue())/m_velKey_constraints.pmax; + pMidiCC->setKeyCurveMax(pMidiCC_container, value); + //[/UserSliderCode_slider_key_max] + } + + //[UsersliderValueChanged_Post] + displayUpdate(); + listeners.call (&VelKey_PopUp_Listener::VelKey_PopUp_event, POPUP_PARAM_CHANGED); + + //[/UsersliderValueChanged_Post] +} + +void VelKey_PopUp::buttonClicked (Button* buttonThatWasClicked) +{ + //[UserbuttonClicked_Pre] + synth_float_t curve_min, curve_max; + //[/UserbuttonClicked_Pre] + + if (buttonThatWasClicked == textButton_OK) + { + //[UserButtonCode_textButton_OK] -- add your button handler code here.. + listeners.call (&VelKey_PopUp_Listener::VelKey_PopUp_event, POPUP_OK); + //[/UserButtonCode_textButton_OK] + } + else if (buttonThatWasClicked == button_vel_assign_enable) + { + //[UserButtonCode_button_vel_assign_enable] -- add your button handler code here.. + pMidiCC->setAssignedVel(pMidiCC_container, buttonThatWasClicked->getToggleState()); + listeners.call (&VelKey_PopUp_Listener::VelKey_PopUp_event, POPUP_PARAM_CHANGED); + //[/UserButtonCode_button_vel_assign_enable] + } + else if (buttonThatWasClicked == button_key_assign_enable) + { + //[UserButtonCode_button_key_assign_enable] -- add your button handler code here.. + pMidiCC->setAssignedKey(pMidiCC_container, buttonThatWasClicked->getToggleState()); + listeners.call (&VelKey_PopUp_Listener::VelKey_PopUp_event, POPUP_PARAM_CHANGED); + //[/UserButtonCode_button_key_assign_enable] + } + else if (buttonThatWasClicked == m_btn_flip_vel) + { + //[UserButtonCode_m_btn_flip_vel] -- add your button handler code here.. + curve_min = pMidiCC->getVelCurve(pMidiCC_container)->pmin; + curve_max = pMidiCC->getVelCurve(pMidiCC_container)->pmax; + pMidiCC->setVelCurveMin(pMidiCC_container, curve_max); + pMidiCC->setVelCurveMax(pMidiCC_container, curve_min); + slider_vel_max->setValue(toSlider(&m_velKey_constraints, pMidiCC->getVelCurve(pMidiCC_container)->pmax*m_velKey_constraints.pmax), false); + slider_vel_min->setValue(toSlider(&m_velKey_constraints, pMidiCC->getVelCurve(pMidiCC_container)->pmin*m_velKey_constraints.pmax), false); + + displayUpdate(); + listeners.call (&VelKey_PopUp_Listener::VelKey_PopUp_event, POPUP_PARAM_CHANGED); + //[/UserButtonCode_m_btn_flip_vel] + } + else if (buttonThatWasClicked == m_btn_flip_key) + { + //[UserButtonCode_m_btn_flip_key] -- add your button handler code here.. + curve_min = pMidiCC->getKeyCurve(pMidiCC_container)->pmin; + curve_max = pMidiCC->getKeyCurve(pMidiCC_container)->pmax; + pMidiCC->setKeyCurveMin(pMidiCC_container, curve_max); + pMidiCC->setKeyCurveMax(pMidiCC_container, curve_min); + slider_key_max->setValue(toSlider(&m_velKey_constraints, pMidiCC->getKeyCurve(pMidiCC_container)->pmax*m_velKey_constraints.pmax), false); + slider_key_min->setValue(toSlider(&m_velKey_constraints, pMidiCC->getKeyCurve(pMidiCC_container)->pmin*m_velKey_constraints.pmax), false); + + displayUpdate(); + listeners.call (&VelKey_PopUp_Listener::VelKey_PopUp_event, POPUP_PARAM_CHANGED); + //[/UserButtonCode_m_btn_flip_key] + } + + //[UserbuttonClicked_Post] + //[/UserbuttonClicked_Post] +} + +void VelKey_PopUp::labelTextChanged (Label* labelThatHasChanged) +{ + //[UserlabelTextChanged_Pre] + //[/UserlabelTextChanged_Pre] + + if (labelThatHasChanged == label_vel_ymin) + { + //[UserLabelCode_label_vel_ymin] -- add your label text handling code here.. + if (!m_isFlipped_vel) + slider_vel_min->setValue(toSlider(&m_velKey_constraints, String(labelThatHasChanged->getText()).getFloatValue()), true); + else + slider_vel_max->setValue(toSlider(&m_velKey_constraints, String(labelThatHasChanged->getText()).getFloatValue()), true); + //[/UserLabelCode_label_vel_ymin] + } + else if (labelThatHasChanged == label_vel_ymax) + { + //[UserLabelCode_label_vel_ymax] -- add your label text handling code here.. + if (!m_isFlipped_vel) + slider_vel_max->setValue(toSlider(&m_velKey_constraints, String(labelThatHasChanged->getText()).getFloatValue()), true); + else + slider_vel_min->setValue(toSlider(&m_velKey_constraints, String(labelThatHasChanged->getText()).getFloatValue()), true); + //[/UserLabelCode_label_vel_ymax] + } + else if (labelThatHasChanged == label_key_ymin) + { + //[UserLabelCode_label_key_ymin] -- add your label text handling code here.. + if (!m_isFlipped_key) + slider_key_min->setValue(toSlider(&m_velKey_constraints, String(labelThatHasChanged->getText()).getFloatValue()), true); + else + slider_key_max->setValue(toSlider(&m_velKey_constraints, String(labelThatHasChanged->getText()).getFloatValue()), true); + + //[/UserLabelCode_label_key_ymin] + } + else if (labelThatHasChanged == label_key_ymax) + { + //[UserLabelCode_label_key_ymax] -- add your label text handling code here.. + if (!m_isFlipped_key) + slider_key_max->setValue(toSlider(&m_velKey_constraints, String(labelThatHasChanged->getText()).getFloatValue()), true); + else + slider_key_min->setValue(toSlider(&m_velKey_constraints, String(labelThatHasChanged->getText()).getFloatValue()), true); + //[/UserLabelCode_label_key_ymax] + } + else if (labelThatHasChanged == label_vel_shape) + { + //[UserLabelCode_label_vel_shape] -- add your label text handling code here.. + slider_vel_kexp->setValue(toSlider(&m_shape_xform, String(labelThatHasChanged->getText()).getFloatValue()), true); + //[/UserLabelCode_label_vel_shape] + } + else if (labelThatHasChanged == label_vel_skew) + { + //[UserLabelCode_label_vel_skew] -- add your label text handling code here.. + slider_vel_scenter->setValue(toSlider(&m_skew_xform, String(labelThatHasChanged->getText()).getFloatValue()/100), true); + //[/UserLabelCode_label_vel_skew] + } + else if (labelThatHasChanged == label_key_shape) + { + //[UserLabelCode_label_key_shape] -- add your label text handling code here.. + slider_key_kexp->setValue(toSlider(&m_shape_xform, String(labelThatHasChanged->getText()).getFloatValue()), true); + //[/UserLabelCode_label_key_shape] + } + else if (labelThatHasChanged == label_key_skew) + { + //[UserLabelCode_label_key_skew] -- add your label text handling code here.. + slider_key_scenter->setValue(toSlider(&m_skew_xform, String(labelThatHasChanged->getText()).getFloatValue()/100), true); + //[/UserLabelCode_label_key_skew] + } + + //[UserlabelTextChanged_Post] + displayUpdate(); + listeners.call (&VelKey_PopUp_Listener::VelKey_PopUp_event, POPUP_PARAM_CHANGED); + //[/UserlabelTextChanged_Post] +} + +void VelKey_PopUp::comboBoxChanged (ComboBox* comboBoxThatHasChanged) +{ + //[UsercomboBoxChanged_Pre] + //[/UsercomboBoxChanged_Pre] + + if (comboBoxThatHasChanged == comboBoxOPSel) + { + //[UserComboBoxCode_comboBoxOPSel] -- add your combo box handling code here.. + pMidiCC->setVelKeyCombineOP(pMidiCC_container, comboBoxThatHasChanged->getSelectedId()-1); + //[/UserComboBoxCode_comboBoxOPSel] + } + + //[UsercomboBoxChanged_Post] + displayUpdate(); + listeners.call (&VelKey_PopUp_Listener::VelKey_PopUp_event, POPUP_PARAM_CHANGED); + //[/UsercomboBoxChanged_Post] +} + + + +//[MiscUserCode] You can add your own definitions of your custom methods or any other code here... +void VelKey_PopUp::setKeyVel(int note, float velocity) +{ + m_currentMidiNoteInfo.note = note; + m_currentMidiNoteInfo.velocity = velocity; + displayUpdate(); +} + +void VelKey_PopUp::displayUpdate(void) +{ + float y1, y2; + + y1 = m_velKey_constraints.pmax*pMidiCC->getVelCurve(pMidiCC_container)->pmin; + y2 = m_velKey_constraints.pmax*pMidiCC->getVelCurve(pMidiCC_container)->pmax; + + if (y1 < y2) + { + label_vel_ymin->setText(String(y1, m_label_prec), false); + label_vel_ymax->setText(String(y2, m_label_prec), false); + label_vel_max_text->setText(m_text_vel_max, false); + label_vel_min_text->setText(m_text_vel_min, false); + m_isFlipped_vel = false; + } + else + { + label_vel_ymin->setText(String(y2, m_label_prec), false); + label_vel_ymax->setText(String(y1, m_label_prec), false); + label_vel_max_text->setText(m_text_vel_min, false); + label_vel_min_text->setText(m_text_vel_max, false); + m_isFlipped_vel = true; + } + label_vel_shape->setText(String(pMidiCC->getVelCurve(pMidiCC_container)->kexp, m_label_shape_prec), false); + label_vel_skew->setText(String(100*pMidiCC->getVelCurve(pMidiCC_container)->scenter, 1), false); + label_vel_x->setText(String(100*m_currentMidiNoteInfo.velocity, 1), false); + label_vel_y->setText(String(pMidiCC->getConstraints(pMidiCC_container)->pmax*toParam(pMidiCC->getVelCurve(pMidiCC_container), m_currentMidiNoteInfo.velocity), m_label_prec), false); + + m_graph_vel->SetMarkerX(m_currentMidiNoteInfo.velocity); + m_graph_vel->Draw(pMidiCC->getVelCurve(pMidiCC_container)->pmin, pMidiCC->getVelCurve(pMidiCC_container)->pmax, pMidiCC->getVelCurve(pMidiCC_container)); + + y1 = m_velKey_constraints.pmax*pMidiCC->getKeyCurve(pMidiCC_container)->pmin; + y2 = m_velKey_constraints.pmax*pMidiCC->getKeyCurve(pMidiCC_container)->pmax; + + if (y1 < y2) + { + label_key_ymin->setText(String(y1, m_label_prec), false); + label_key_ymax->setText(String(y2, m_label_prec), false); + label_key_max_text->setText(m_text_key_max, false); + label_key_min_text->setText(m_text_key_min, false); + m_isFlipped_key = false; + } + else + { + label_key_ymin->setText(String(y2, m_label_prec), false); + label_key_ymax->setText(String(y1, m_label_prec), false); + label_key_max_text->setText(m_text_key_min, false); + label_key_min_text->setText(m_text_key_max, false); + m_isFlipped_key = true; + } + label_key_shape->setText(String(pMidiCC->getKeyCurve(pMidiCC_container)->kexp, m_label_shape_prec), false); + label_key_skew->setText(String(100*pMidiCC->getKeyCurve(pMidiCC_container)->scenter, 1), false); +// label_key_x->setText(String(100*(float)m_currentMidiNoteInfo.note/127, 1), false); + label_key_x0->setText(getNoteName(0), false); + label_key_x100->setText(getNoteName(127), false); + label_key_x->setText(getNoteName(m_currentMidiNoteInfo.note), false); + label_key_y->setText(String(pMidiCC->getConstraints(pMidiCC_container)->pmax*toParam(pMidiCC->getKeyCurve(pMidiCC_container), (float)m_currentMidiNoteInfo.note/127), m_label_prec), false); + + m_graph_key->SetMarkerX((float)m_currentMidiNoteInfo.note/127); + m_graph_key->Draw(pMidiCC->getKeyCurve(pMidiCC_container)->pmin, pMidiCC->getKeyCurve(pMidiCC_container)->pmax, pMidiCC->getKeyCurve(pMidiCC_container)); +} + +void VelKey_PopUp::setCurrParam(int paramID, float param) +{ + if (paramID != m_paramID) + return; + + m_currParamValue = param; + displayUpdate(); +} + +void VelKey_PopUp::createNoteNameTbl(void) +{ + int i, ni, nn; + String notes[12] = {"C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B" }; + + for (i=0; i < 128; i++) + { + ni = i%12; + nn = (i/12)-2; + notename_tbl[i] = notes[ni] + String(nn); + } +} + +const String VelKey_PopUp::getNoteName(int midinotnumber) +{ + return notename_tbl[midinotnumber]; +} + +//[/MiscUserCode] + + +//============================================================================== +#if 0 +/* -- Jucer information section -- + + This is where the Jucer puts all of its metadata, so don't change anything in here! + +BEGIN_JUCER_METADATA + + + + + + + + +END_JUCER_METADATA +*/ +#endif diff --git a/Source/VelKey_PopUp.h b/Source/VelKey_PopUp.h new file mode 100644 index 0000000..6dd59cb --- /dev/null +++ b/Source/VelKey_PopUp.h @@ -0,0 +1,194 @@ +/* + ============================================================================== + + This is an automatically generated file created by the Jucer! + + Creation date: 30 Sep 2012 11:31:53am + + Be careful when adding custom code to these files, as only the code within + the "//[xyz]" and "//[/xyz]" sections will be retained when the file is loaded + and re-saved. + + Jucer version: 1.12 + + ------------------------------------------------------------------------------ + + The Jucer is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-6 by Raw Material Software ltd. + + ============================================================================== +*/ + +#ifndef __JUCER_HEADER_VELKEYPOPUP_VELKEYPOPUP_9719552A__ +#define __JUCER_HEADER_VELKEYPOPUP_VELKEYPOPUP_9719552A__ + +//[Headers] -- You can add your own extra header files here -- +#include "../JuceLibraryCode/JuceHeader.h" +#include "synth_defs.h" +#include "PluginProcessor.h" +class VelKey_PopUp_Listener +{ +public: + virtual void VelKey_PopUp_event(int /*event*/) {}; +}; +//[/Headers] + +#include "graph_window.h" + + +//============================================================================== +/** + //[Comments] + An auto-generated component, created by the Jucer. + + Describe your class and how it works here! + //[/Comments] +*/ +class VelKey_PopUp : public Component, + public SliderListener, + public ButtonListener, + public LabelListener, + public ComboBoxListener +{ +public: + //============================================================================== + VelKey_PopUp (JaySynthMidiCC *pMidiCC, int paramID, synth_float_t currParamValue, JaySynth::midi_note_info_t *pCurrentMidiNoteInfo, String name, VelKey_PopUp_Listener *listener); + ~VelKey_PopUp(); + + //============================================================================== + //[UserMethods] -- You can add your own custom methods in this section. + enum + { + POPUP_DELETED = 0, + POPUP_CREATED, + POPUP_SHOW, + POPUP_PARAM_CHANGED, + POPUP_OK + + }; + + void setKeyVel(int note, float velocity); + void addListener(VelKey_PopUp_Listener *listener) + { + listeners.add (listener); + } + void show(void) + { + this->setVisible(true); + listeners.call (&VelKey_PopUp_Listener::VelKey_PopUp_event, POPUP_SHOW); + } + int getParamID(void) + { + return m_paramID; + } + + ComponentDragger myDragger; + void mouseDown (const MouseEvent& e) + { + myDragger.startDraggingComponent (this, e); + } + + void mouseDrag (const MouseEvent& e) + { + myDragger.dragComponent (this, e, nullptr); + } + void createNoteNameTbl(void); + const String getNoteName(int midinotnumber); + void displayUpdate(void); + void setCurrParam(int paramID, float param); + //[/UserMethods] + + void paint (Graphics& g); + void resized(); + void sliderValueChanged (Slider* sliderThatWasMoved); + void buttonClicked (Button* buttonThatWasClicked); + void labelTextChanged (Label* labelThatHasChanged); + void comboBoxChanged (ComboBox* comboBoxThatHasChanged); + + + + //============================================================================== + juce_UseDebuggingNewOperator + +private: + //[UserVariables] -- You can add your own custom variables in this section. + param_info_t m_velKey_constraints; + param_info_t m_shape_xform, m_skew_xform; + JaySynthMidiCC *pMidiCC; + midiCC_container_t *pMidiCC_container; + ListenerList listeners; + synth_float_t m_currParamValue; + int m_paramID; + int m_label_prec, m_label_shape_prec, m_label_skew_prec; + JaySynth::midi_note_info_t m_currentMidiNoteInfo; + bool m_isFlipped_vel, m_isFlipped_key; + String m_text_vel_min, m_text_vel_max; + String m_text_key_min, m_text_key_max; + String notename_tbl[128]; + //[/UserVariables] + + //============================================================================== + Label* label_parameter_name; + GroupComponent* groupComponent3; + GroupComponent* groupComponent; + GroupComponent* groupComponent2; + GraphWindow* m_graph_vel; + Slider* slider_vel_kexp; + Slider* slider_vel_scenter; + Label* label_vel_kexp; + Label* label_vel_scenter; + Label* label_vel_min; + Slider* slider_vel_min; + TextButton* textButton_OK; + ToggleButton* button_vel_assign_enable; + Label* label_vel_ymin; + Label* label_vel_ymax; + Label* label_vel_x100; + Label* label_vel_x0; + GraphWindow* m_graph_key; + Slider* slider_key_kexp; + Slider* slider_key_scenter; + Label* label_key_kexp; + Label* label_vel_scenter2; + Label* label_key_min; + Slider* slider_key_min; + ToggleButton* button_key_assign_enable; + Label* label_key_ymin; + Label* label_key_ymax; + Label* label_key_x100; + Label* label_key_x0; + ComboBox* comboBoxOPSel; + Label* label_key; + Label* label_vel; + Slider* slider_vel_max; + Label* label_vel_max; + Label* label_key_max; + Slider* slider_key_max; + Label* label_vel_shape; + Label* label_vel_skew; + Label* label_key_shape; + Label* label_key_skew; + Label* label_vel_skew_text; + Label* label_key_skew_text; + Label* label_vel_shape_text; + Label* label_key_shape_text; + Label* label_vel_max_text; + Label* label_vel_min_text; + Label* label_key_min_text; + Label* label_key_max_text; + Label* label_vel_y; + Label* label_key_y; + Label* label_vel_x; + Label* label_key_x; + TextButton* m_btn_flip_vel; + TextButton* m_btn_flip_key; + + + //============================================================================== + // (prevent copy constructor and operator= being generated..) + VelKey_PopUp (const VelKey_PopUp&); + const VelKey_PopUp& operator= (const VelKey_PopUp&); +}; + + +#endif // __JUCER_HEADER_VELKEYPOPUP_VELKEYPOPUP_9719552A__ diff --git a/Source/graph_window.cpp b/Source/graph_window.cpp new file mode 100644 index 0000000..ed63836 --- /dev/null +++ b/Source/graph_window.cpp @@ -0,0 +1,172 @@ +/* + ============================================================================== + + This is an automatically generated file created by the Jucer! + + Creation date: 18 Sep 2012 6:24:20am + + Be careful when adding custom code to these files, as only the code within + the "//[xyz]" and "//[/xyz]" sections will be retained when the file is loaded + and re-saved. + + Jucer version: 1.12 + + ------------------------------------------------------------------------------ + + The Jucer is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-6 by Raw Material Software ltd. + + ============================================================================== +*/ + +//[Headers] You can add your own extra header files here... +//[/Headers] + +#include "graph_window.h" + + +//[MiscUserDefs] You can add your own user definitions and misc code here... +#ifndef max +#define max(a,b) (((a) > (b)) ? (a) : (b)) +#endif + +#ifndef min +#define min(a,b) (((a) < (b)) ? (a) : (b)) +#endif +//[/MiscUserDefs] + +//============================================================================== +GraphWindow::GraphWindow () + : Component (L"graph_window") +{ + + //[UserPreSize] + //[/UserPreSize] + + setSize (160, 120); + + + //[Constructor] You can add your own custom stuff here.. + frame_width = 1; + m_markerX = 0; + paramInfoInit(&curve, 0, NULL); + paramInfoSet(&curve, 1, 1, 0.5, -1, 0, +1, 0); + + //[/Constructor] +} + +GraphWindow::~GraphWindow() +{ + //[Destructor_pre]. You can add your own custom destruction code here.. + //[/Destructor_pre] + + //[Destructor]. You can add your own custom destruction code here.. + paramInfoFree(&curve); + //[/Destructor] +} + +//============================================================================== +void GraphWindow::paint (Graphics& g) +{ + //[UserPrePaint] Add your own custom painting code here.. + goto skip; + //[/UserPrePaint] + + g.setColour (Colours::white); + g.drawRoundedRectangle (3.0f, 3.0f, 156.0f, 116.0f, 1.0000f, 2.0000f); + + //[UserPaint] Add your own custom painting code here.. + +skip: + int minX = 0; + int minY = frame_width; + int maxX = getWidth(); + int maxY = getHeight()-frame_width; + int sizeX = maxX-minX; + int sizeY = maxY-minY; + + g.setColour (Colour(0xFFB0B0B0)); + g.drawLine(minX, (int)((1-evalCurve(m_markerX))*sizeY) + 1.5*minY, maxX, (int)((1-evalCurve(m_markerX))*sizeY) + 1.5*minY); + g.drawLine(m_markerX*sizeX, minY, m_markerX*sizeX, maxY); + + g.setColour (Colours::white); + + float dx = 1.0/sizeX; + float x0 = 0; + float x1 = dx; + float y0, y1; + + for (int i=minX+1; i <= maxX; i++) + { + y0 = evalCurve(x0); + y1 = evalCurve(x1); + x0 = x1; + x1 += dx; + g.drawLine(i-1, /*(1-0.5*(1+y0))*sizeY*/(1-y0)*sizeY + minY, i, /*(1-0.5*(1+y1))*sizeY*/(1-y1)*sizeY + minY); + } + + g.setColour (Colours::white); + g.drawRect (0.0, 0.0, (float)getWidth(), (float)getHeight(), frame_width); + + //[/UserPaint] +} + +void GraphWindow::resized() +{ + //[UserResized] Add your own custom resize handling here.. + repaint(); + //[/UserResized] +} + + +float GraphWindow::evalCurve(float x) +{ +// return min(m_max, max(m_min, toParam(&curve, x))); + + if (m_max > m_min) + return (toParam(&curve, x)-m_min)/(m_max - m_min); + else + return (toParam(&curve, x)-m_max)/(m_min - m_max); + +} + +//[MiscUserCode] You can add your own definitions of your custom methods or any other code here... +void GraphWindow::Draw(float minimum, float maximum, param_info_t *pParamInfo) +{ + m_min = minimum; + m_max = maximum; + paramInfoCopy(&curve, pParamInfo); + repaint(); +} + +void GraphWindow::SetMarkerX(float x) +{ + m_markerX = x; + repaint(); + +} + +//[/MiscUserCode] + + +//============================================================================== +#if 0 +/* -- Jucer information section -- + + This is where the Jucer puts all of its metadata, so don't change anything in here! + +BEGIN_JUCER_METADATA + + + + + + + +END_JUCER_METADATA +*/ +#endif diff --git a/Source/graph_window.h b/Source/graph_window.h new file mode 100644 index 0000000..d1ae3ad --- /dev/null +++ b/Source/graph_window.h @@ -0,0 +1,82 @@ +/* + ============================================================================== + + This is an automatically generated file created by the Jucer! + + Creation date: 18 Sep 2012 6:24:20am + + Be careful when adding custom code to these files, as only the code within + the "//[xyz]" and "//[/xyz]" sections will be retained when the file is loaded + and re-saved. + + Jucer version: 1.12 + + ------------------------------------------------------------------------------ + + The Jucer is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-6 by Raw Material Software ltd. + + ============================================================================== +*/ + +#ifndef __JUCER_HEADER_GRAPHWINDOW_GRAPHWINDOW_E0AFC61E__ +#define __JUCER_HEADER_GRAPHWINDOW_GRAPHWINDOW_E0AFC61E__ + +//[Headers] -- You can add your own extra header files here -- +#include "../JuceLibraryCode/JuceHeader.h" +#include "synth_defs.h" +//[/Headers] + + + +//============================================================================== +/** + //[Comments] + An auto-generated component, created by the Jucer. + + Describe your class and how it works here! + //[/Comments] +*/ +class GraphWindow : public Component +{ +public: + //============================================================================== + GraphWindow (); + ~GraphWindow(); + + //============================================================================== + //[UserMethods] -- You can add your own custom methods in this section. + void Draw(float minimum, float maximum, param_info_t *pParamInfo); + void SetMarkerX(float x); + float evalCurve(float x); + //[/UserMethods] + + void paint (Graphics& g); + void resized(); + + + + //============================================================================== + juce_UseDebuggingNewOperator + +private: + //[UserVariables] -- You can add your own custom variables in this section. + float frame_width; + float m_min; + float m_max; + float m_markerX; + param_info_t curve; + + //[/UserVariables] + + //============================================================================== + + + //============================================================================== + // (prevent copy constructor and operator= being generated..) + GraphWindow (const GraphWindow&); + const GraphWindow& operator= (const GraphWindow&); +}; + + +#endif // __JUCER_HEADER_GRAPHWINDOW_GRAPHWINDOW_E0AFC61E__ diff --git a/Source/resources/led_24_blue.png b/Source/resources/led_24_blue.png new file mode 100644 index 0000000..8115fd7 Binary files /dev/null and b/Source/resources/led_24_blue.png differ diff --git a/Source/resources/led_24_blue1.png b/Source/resources/led_24_blue1.png new file mode 100644 index 0000000..756eca9 Binary files /dev/null and b/Source/resources/led_24_blue1.png differ diff --git a/Source/resources/led_24_red.png b/Source/resources/led_24_red.png new file mode 100644 index 0000000..c3737f3 Binary files /dev/null and b/Source/resources/led_24_red.png differ diff --git a/Source/resources/led_24_red1.png b/Source/resources/led_24_red1.png new file mode 100644 index 0000000..75d1b22 Binary files /dev/null and b/Source/resources/led_24_red1.png differ diff --git a/Source/synth/blit.c b/Source/synth/blit.c new file mode 100644 index 0000000..448f690 --- /dev/null +++ b/Source/synth/blit.c @@ -0,0 +1,433 @@ +// -------------------------------------------------------------- +// -------------------------------------------------------------- + + +#include +#include +#include + +#include "synth_defs.h" +#include "blit.h" +#include "fir/fir2.h" +#include "vector_utils.h" + +// -------------------------------------------------------------- +// internal funcs +// -------------------------------------------------------------- +INT32 smin(INT32 x, INT32 y) +{ + if (x < y) + return x; + + return y; +} + +INT32 smax(INT32 x, INT32 y) +{ + if (x > y) + return x; + + return y; +} + +UINT32 umin(UINT32 x, UINT32 y) +{ + if (x < y) + return x; + + return y; +} + +UINT32 umax(UINT32 x, UINT32 y) +{ + if (x > y) + return x; + + return y; +} + +void IP_ModInit(blit_common_t *pCom) +{ + INT32 n, k; + synth_float_t *pN_K = pCom->N_K; + synth_float_t *pK = pCom->K; + + for (n=0; n <= BLIT_INTEROLATION_ORDER; n++) + { + for (k=0; k <= BLIT_INTEROLATION_ORDER; k++) + { + if (k == n) + continue; + + *(pN_K++) = (synth_float_t)1 / (n-k); + *(pK++) = (synth_float_t)k; + } + } +} + +synth_float_t IP_Process(blit_t *pObj, synth_float_t *pLUT, synth_float_t m) +{ + INT32 mi, j; + INT32 n, k; + synth_float_t hn, y = 0, delay; + synth_float_t *pN_K = pObj->pCom->N_K; + synth_float_t *pK = pObj->pCom->K; + + mi = (INT32)m; + delay = m - (synth_float_t)mi; + + j = (INT32)BLIT_INTEROLATION_ORDER; + for (n=0; n <= BLIT_INTEROLATION_ORDER; n++) + { + hn = (synth_float_t)1; + for (k=0; k < BLIT_INTEROLATION_ORDER; k++) + { + hn *= (*(pN_K++) * (delay - *(pK++))); + } + y += hn*pLUT[smax(0, mi-j)]; + j--; + } + return y; +} + +void BLIT_freq_update(blit_t *pObj, synth_float_t scale) +{ + synth_float_t p; + + pObj->freq_update_req = 0; + +// p = pObj->fs/(pObj->f*scale*pObj->fm); + p = pObj->fs/(scale*pObj->fm); + + pObj->dx = (synth_float_t)1.0/p; + pObj->m = umin(BLIT_NUM_HARM_MAX-1, (UINT32)((synth_float_t)SYNTH_BANDWIDTH*2.0*(int)((p/2)) + 0)); +} + +// -------------------------------------------------------------- +// Exported functions +// -------------------------------------------------------------- +void BLIT_ModInit(blit_common_t *pCom) +{ + int m, n; + synth_float_t **ppKaiser; + synth_float_t x, dx, a, b, blit, blep; + + // Calculate table sizes + pCom->pTableSizes = (UINT32*)malloc(BLIT_NUM_HARM_MAX*sizeof(UINT32)); + for (m=0; m < BLIT_NUM_HARM_MAX; m++) + { + pCom->pTableSizes[m] = m*BLIT_TABLE_OVERSAMPLING; + if (pCom->pTableSizes[m] < BLIT_TABLE_SIZE_MIN) + pCom->pTableSizes[m] = BLIT_TABLE_SIZE_MIN; + } + + // Generate Kaiser window + ppKaiser = (synth_float_t**)malloc(BLIT_NUM_HARM_MAX*sizeof(synth_float_t*)); + for (m=0; m < BLIT_NUM_HARM_MAX; m++) + { + ppKaiser[m] = (synth_float_t*)malloc(pCom->pTableSizes[m]*sizeof(synth_float_t)); + CalcKaiser(NULL, ppKaiser[m], 8.f, pCom->pTableSizes[m]); + } + + // Allocate BLIT table + pCom->ppBLEP = (synth_float_t**)malloc(BLIT_NUM_HARM_MAX*sizeof(synth_float_t*)); + for (m=0; m < BLIT_NUM_HARM_MAX; m++) + { + pCom->ppBLEP[m] = (synth_float_t*)malloc(pCom->pTableSizes[m]*sizeof(synth_float_t)); + } + + // Generate BLIT + for (m=0; m < BLIT_NUM_HARM_MAX; m++) + { + dx = (synth_float_t)1/(pCom->pTableSizes[m]); + x = -0.5; + blep = 0; + for (n=0; n < pCom->pTableSizes[m]; n++) + { + a = sin(x*pi); + b = sin(m*x*pi); + if (a == 0) + blit = (synth_float_t)m; + else + blit = b/a * ppKaiser[m][n]; + + blep += blit; + pCom->ppBLEP[m][n] = blep/(pCom->pTableSizes[m]); + x += dx; + } + } + +/* + m = BLIT_NUM_HARM_MAX/2; + for (n=0; n < BLIT_TABLE_SIZE; n++) + { + SynthDebug("BLEP[%d][%d] = %.14f\n", m, n, pCom->ppBLEP[m][n]); + } + + for (n=0; n < BLIT_TABLE_SIZE; n++) + { + SynthDebug("Kaiser[%d] = %.14f\n", n, pKaiser[n]); + } +*/ + for (m=0; m < BLIT_NUM_HARM_MAX; m++) + { + free(ppKaiser[m]); + } + free(ppKaiser); + + // Precalculate Interpolation constants + IP_ModInit(pCom); +} + +void BLIT_ModFree(blit_common_t *pCom) +{ + int m; + + if (pCom->ppBLEP) + { + for (m=0; m < BLIT_NUM_HARM_MAX; m++) + { + free(pCom->ppBLEP[m]); + } + free(pCom->ppBLEP); + } + free(pCom->pTableSizes); +} + +void BLIT_Init(blit_t *pObj, blit_common_t *pCom, synth_float_t fs) +{ + pObj->pCom = pCom; + + pObj->fs = fs; + pObj->dutycycle = 0.5; + BLIT_Reset(pObj, 0); + pObj->bufsize = 0; + BLIT_SetBufsize(pObj, SYNTH_MAX_BUFSIZE); + BLIT_Prepare(pObj, SYNTH_MAX_BUFSIZE); +} + +void BLIT_Free(blit_t *pObj) +{ + BLIT_SetBufsize(pObj, 0); +} + +void BLIT_SetBufsize(blit_t *pObj, UINT32 size) +{ + if (pObj->bufsize == size) + return; + + pObj->bufsize = size; + + if (!size) + return; + +} + +void BLIT_SetFS(blit_t *pObj, synth_float_t fs) +{ + pObj->fs = fs; + pObj->freq_update_req = 1; +} + +void BLIT_Prepare(blit_t *pObj, UINT32 len) +{ + synth_float_t pitch_buf[SYNTH_MAX_BUFSIZE]; + synth_float_t out_buf[SYNTH_MAX_BUFSIZE]; + + len = min(len, SYNTH_MAX_BUFSIZE); + + // Let Oscillators run with different pitches to randomize phase + Add_inplace_VS(pitch_buf, 0, 8*440.0*(1+0.01*(synth_float_t)rand()/RAND_MAX), len); + BLIT_Process_SAW_Vector(pObj, pitch_buf, NULL, NULL, NULL, out_buf, len); + BLIT_Process_SQR_Vector(pObj, pitch_buf, NULL, NULL, NULL, NULL, out_buf, len); + BLIT_Process_TRI_Vector(pObj, pitch_buf, NULL, NULL, NULL, out_buf, len); +} + +void BLIT_Reset(blit_t *pObj, synth_float_t phase) +{ + pObj->saw_x = fmod(0.5f + phase, 1); + pObj->sqr_x1 = fmod(0.5f + phase, 1); + pObj->sqr_x2 = fmod(0.5f + phase, 1); + pObj->sqr_pol1 = 1; // ToDo: Adjust according to phase + pObj->sqr_pol2 = 1; // ToDo: Adjust according to phase + pObj->tri_x = fmod(0.5f + phase, 1); + pObj->tri_sum = 0; // ToDo: Adjust according to phase + pObj->tri_pol = 1; // ToDo: Adjust according to phase + pObj->fm = 1; + pObj->pwm = 0; + pObj->pulse_offset = 0; // ToDo: Adjust according to phase +} + +void BLIT_Start(blit_t *pObj) +{ + pObj->freq_update_req = 1; +} + +void BLIT_SetDutyCycle(blit_t *pObj, synth_float_t duty_cycle) +{ + pObj->dutycycle = duty_cycle; +} + +void BLIT_Process_SAW_Vector(blit_t *pObj, synth_float_t *pPitch, synth_float_t *pCV_fm, UINT32 *pSyncIn, UINT32 *pSyncOut, synth_float_t *pOut, UINT32 len) +{ + UINT32 i, is_slave, m; + synth_float_t out; + synth_float_t blep, n; + blit_common_t *pCom = pObj->pCom; + + is_slave = (pSyncIn != NULL) && (pSyncOut == NULL); + + if (pSyncOut) + memset(pSyncOut, 0, len*sizeof(synth_float_t)); + + // Create output + for (i=0; i< len; i++) + { + if (pObj->freq_update_req) + { + BLIT_freq_update(pObj, pPitch[i]); + } + + if (pObj->saw_x >= (synth_float_t)0.5) + { + pObj->saw_x -= 1; + if (pCV_fm) + { + pObj->fm = (synth_float_t)pow((synth_float_t)2, pCV_fm[i]); + } + BLIT_freq_update(pObj, pPitch[i]); + } + + m = pObj->m; + + // Lagrange interpolation + n = (pObj->saw_x+0.5)*((pCom->pTableSizes[m])-1); + blep = IP_Process(pObj, &pCom->ppBLEP[m][0], n); + + out = pObj->saw_x - blep; + pObj->saw_x += pObj->dx; + + *(pOut++) = 2*(out+0.5); + } +} + +void BLIT_Process_SQR_Vector(blit_t *pObj, synth_float_t *pPitch, synth_float_t *pCV_fm, synth_float_t *pCV_pwm, UINT32 *pSyncIn, UINT32 *pSyncOut, synth_float_t *pOut, UINT32 len) +{ + UINT32 i, is_slave, m; + synth_float_t blep1, blep2, n; + synth_float_t dutycycle; + blit_common_t *pCom = pObj->pCom; + + is_slave = (pSyncIn != NULL) && (pSyncOut == NULL); + + if (pSyncOut) + memset(pSyncOut, 0, len*sizeof(synth_float_t)); + + // Create output + for (i=0; i< len; i++) + { + if (pObj->freq_update_req) + { + BLIT_freq_update(pObj, pPitch[i]); + } + + if (pObj->sqr_x1 >= (synth_float_t)0.5) + { + pObj->sqr_x1 -= 1; + pObj->sqr_pol1 = !pObj->sqr_pol1; + if (pCV_fm) + { + pObj->fm = (synth_float_t)pow((synth_float_t)2, pCV_fm[i]); + } + if (pCV_pwm) + { + pObj->pwm = (synth_float_t)pCV_pwm[i]; + } + dutycycle = min(1, max(0, pObj->dutycycle + pObj->pwm)); + pObj->pulse_offset = 2*(dutycycle-0.5); + pObj->sqr_x2 = pObj->sqr_x1 + dutycycle - 1; + pObj->sqr_pol2 = pObj->sqr_pol1; + BLIT_freq_update(pObj, pPitch[i]); + } + while (pObj->sqr_x2 >= (synth_float_t)0.5) + { + pObj->sqr_pol2 = !pObj->sqr_pol2; + pObj->sqr_x2 -= 1; + } + while (pObj->sqr_x2 < (synth_float_t)-0.5) + { + pObj->sqr_pol2 = !pObj->sqr_pol2; + pObj->sqr_x2 += 1; + } + m = pObj->m; + + // Lagrange interpolation + n = (pObj->sqr_x1+0.5)*((pCom->pTableSizes[m])-1); + blep1 = IP_Process(pObj, &pCom->ppBLEP[m][0], n); + + if (pObj->sqr_pol1) + blep1 = 1 - blep1; + + n = (pObj->sqr_x2+0.5)*((pCom->pTableSizes[m])-1); + blep2 = IP_Process(pObj, &pCom->ppBLEP[m][0], n); + + if (pObj->sqr_pol2) + blep2 = 1 - blep2; + + *(pOut++) = 4*(blep1-0.5)*(blep2-0.5) - pObj->pulse_offset; + + pObj->sqr_x1 += pObj->dx; + pObj->sqr_x2 += pObj->dx; + } +} + +void BLIT_Process_TRI_Vector(blit_t *pObj, synth_float_t *pPitch, synth_float_t *pCV_fm, UINT32 *pSyncIn, UINT32 *pSyncOut, synth_float_t *pOut, UINT32 len) +{ + UINT32 i, is_slave, m; + synth_float_t out; + synth_float_t blep, n; + blit_common_t *pCom = pObj->pCom; + + is_slave = (pSyncIn != NULL) && (pSyncOut == NULL); + + if (pSyncOut) + memset(pSyncOut, 0, len*sizeof(synth_float_t)); + + for (i=0; i< len; i++) + { + if (pObj->freq_update_req) + { + BLIT_freq_update(pObj, pPitch[i]); + } + + if (pObj->tri_x >= (synth_float_t)0.5) + { + pObj->tri_x -= 1; + pObj->tri_pol = !pObj->tri_pol; + if (pCV_fm) + { + pObj->fm = (synth_float_t)pow((synth_float_t)2, pCV_fm[i]); + } + BLIT_freq_update(pObj, 2*pPitch[i]); + } + m = pObj->m; + + // Lagrange interpolation + n = (pObj->tri_x+0.5)*((pCom->pTableSizes[m])-1); +// blep = IP_Process(&_sg_ppBLEP[m][0], n); + + // No interpolation + blep = pCom->ppBLEP[m][(UINT32)n]; + + if (pObj->tri_pol) + out = 1 - blep; + else + out = blep; + + pObj->tri_sum += 4*(out-0.5)*pObj->dx; + *(pOut++) = pObj->tri_sum; + + pObj->tri_x += pObj->dx; + + } +} diff --git a/Source/synth/blit.h b/Source/synth/blit.h new file mode 100644 index 0000000..e2b59f3 --- /dev/null +++ b/Source/synth/blit.h @@ -0,0 +1,61 @@ +// -------------------------------------------------------------- +// -------------------------------------------------------------- +#ifndef _BLIT_H_ +#define _BLIT_H_ + +#include "synth_defs.h" + +// -------------------------------------------------------------- +// Types +// -------------------------------------------------------------- +typedef struct _sblit_common_t +{ + UINT32 *pTableSizes; + synth_float_t **ppBLEP; + synth_float_t N_K[(BLIT_INTEROLATION_ORDER+0)*(BLIT_INTEROLATION_ORDER+1)]; + synth_float_t K[(BLIT_INTEROLATION_ORDER+0)*(BLIT_INTEROLATION_ORDER+1)]; + +} blit_common_t; + + +typedef struct _sblit_t +{ + blit_common_t *pCom; + synth_float_t fs, fm, pwm, dutycycle, pulse_offset; + synth_float_t saw_x, x2, dx; + synth_float_t sqr_x1, sqr_x2, tri; + synth_float_t tri_x, tri_sum; + UINT32 m, tri_pol, sqr_pol1, sqr_pol2; + UINT32 freq_update_req, bufsize; + +} blit_t; + +// -------------------------------------------------------------- +#if defined(__cplusplus) +extern "C" { +#endif + +// -------------------------------------------------------------- +// Exported functions +// -------------------------------------------------------------- +void BLIT_ModInit(blit_common_t *pCom); +void BLIT_ModFree(blit_common_t *pCom); +void BLIT_Init(blit_t *pObj, blit_common_t *pCom, synth_float_t fs); +void BLIT_Free(blit_t *pObj); +void BLIT_SetBufsize(blit_t *pObj, UINT32 size); +void BLIT_SetFS(blit_t *pObj, synth_float_t fs); +void BLIT_Reset(blit_t *pObj, synth_float_t phase); +void BLIT_Start(blit_t *pObj); +void BLIT_Prepare(blit_t *pObj, UINT32 len); +void BLIT_SetDutyCycle(blit_t *pObj, synth_float_t duty_cycle); +void BLIT_Process_SAW_Vector(blit_t *pObj, synth_float_t *pPitch, synth_float_t *pCV_fm, UINT32 *pSyncIn, UINT32 *pSyncOut, synth_float_t *pOut, UINT32 len); +void BLIT_Process_SQR_Vector(blit_t *pObj, synth_float_t *pPitch, synth_float_t *pCV_fm, synth_float_t *pCV_pwm, UINT32 *pSyncIn, UINT32 *pSyncOut, synth_float_t *pOut, UINT32 len); +void BLIT_Process_TRI_Vector(blit_t *pObj, synth_float_t *pPitch, synth_float_t *pCV_fm, UINT32 *pSyncIn, UINT32 *pSyncOut, synth_float_t *pOut, UINT32 len); + +#if defined(__cplusplus) +} + +#endif +// -------------------------------------------------------------- + +#endif // _BLIT_H_ diff --git a/Source/synth/env.c b/Source/synth/env.c new file mode 100644 index 0000000..0be8103 --- /dev/null +++ b/Source/synth/env.c @@ -0,0 +1,208 @@ +// -------------------------------------------------------------- +// -------------------------------------------------------------- +#include +#include +#include + +#include "synth_defs.h" +#include "env.h" + +// -------------------------------------------------------------- +// Exported functions +// -------------------------------------------------------------- +void ENV_Init(envgen_t *pObj, synth_float_t fs) +{ + pObj->fs = fs; + ENV_Reset(pObj); + ENV_Param2Set(pObj, ENV_PARAM2_A, 0.001); + ENV_Param2Set(pObj, ENV_PARAM2_D, 1.000); + ENV_Param2Set(pObj, ENV_PARAM2_S, 1.000); + ENV_Param2Set(pObj, ENV_PARAM2_R, 1.000); + pObj->bufsize = 0; + pObj->pOut = NULL; + ENV_SetBufsize(pObj, SYNTH_MAX_BUFSIZE); +} + +void ENV_Free(envgen_t *pObj) +{ + ENV_SetBufsize(pObj, 0); +} + +void ENV_SetBufsize(envgen_t *pObj, UINT32 size) +{ + if (pObj->bufsize == size) + return; + + pObj->bufsize = size; + + if (pObj->pOut) + free(pObj->pOut); + + pObj->pOut = NULL; + + if (!size) + return; + + pObj->pOut = (synth_float_t*)malloc(pObj->bufsize*sizeof(synth_float_t)); +} + +void ENV_SetFS(envgen_t *pObj, synth_float_t fs) +{ + pObj->fs = fs; +} + +void ENV_Reset(envgen_t *pObj) +{ + pObj->state = env_state_idle; + pObj->s = 0; + pObj->k = (synth_float_t)1/ENV_KE; +} + +void ENV_Event(envgen_t *pObj, UINT32 type) +{ + + switch(type) + { + case env_event_trigger: + case env_event_retrigger: +// pObj->sr = 0; + pObj->state = env_state_attack; +// pObj->k = (synth_float_t)1/ENV_KE; +// if (type == env_event_retrigger) +// { +// pObj->a_r = 1.f/(0.001*pObj->fs); +// pObj->b_r = 1.f - pObj->a_r; +// pObj->state = env_state_attack_retrigger; +// +// } + break; + + case env_event_release: + if (pObj->state == env_state_idle) + break; + +// if (pObj->state == env_state_attack) +// pObj->sf = pObj->sr; + +// if (pObj->state == env_state_sustain) +// pObj->sf = pObj->param.Vs/pObj->k; + + pObj->state = env_state_release; + break; + + default: + break; + } + +}; + +void ENV_Param2Set(envgen_t *pObj, UINT32 type, synth_float_t value) +{ + + switch(type) + { + case ENV_PARAM2_A: + pObj->param.Ta = max(ENV_MIN_A, value); + pObj->a_a = 1.f/(pObj->param.Ta*pObj->fs); + pObj->b_a = 1.f - pObj->a_a; + break; + + case ENV_PARAM2_D: + pObj->param.Td = max(ENV_MIN_D, value); + pObj->a_d = 5.f/(pObj->param.Td*pObj->fs); + pObj->b_d = 1.f - pObj->a_d; + + break; + + case ENV_PARAM2_S: + pObj->param.Vs = value; + break; + + case ENV_PARAM2_R: + pObj->param.Tr = max(ENV_MIN_R, value); + pObj->a_r = 5.f/(pObj->param.Tr*pObj->fs); + pObj->b_r = 1.f - pObj->a_r; + break; + + default: + break; + } +} + +UINT32 ENV_ParamGet(envgen_t *pObj, UINT32 type) +{ + return 0; +} + +INT32 ENV_IsIdle(envgen_t *pObj) +{ + return pObj->state == env_state_idle; +} + +synth_float_t* ENV_ProcessDataV(envgen_t *pObj, UINT32 len) +{ + synth_float_t *pX, y; + + pX = pObj->pOut; + while(len) + { + + y = pObj->k*pObj->s; + + switch (pObj->state) + { + case env_state_idle: + break; + + case env_state_attack: +// y = pObj->k*pObj->sr; + if (y >= 1.0) + { +// pObj->af = 5.f/(pObj->param.Td*pObj->fs); +// pObj->bf = 1.f - pObj->af; +// pObj->k = (synth_float_t)1/ENV_KE; +// pObj->sf = pObj->sr; + pObj->state = env_state_decay; + } + pObj->s = pObj->a_a + pObj->b_a*pObj->s; + break; + + case env_state_attack_retrigger: + pObj->sf = pObj->b_r*pObj->sf; + if (pObj->sf <= ENV_TOL) + { + pObj->a_r = 5.f/(pObj->param.Tr*pObj->fs); + pObj->b_r = 1.f - pObj->a_r; + pObj->state = env_state_attack; + } + break; + + case env_state_decay: + if (y <= pObj->param.Vs) + { + pObj->state = env_state_sustain; + } + pObj->s = pObj->b_d*pObj->s; + break; + + case env_state_sustain: + y = pObj->param.Vs; + break; + + case env_state_release: + if (y <= ENV_TOL) + { + pObj->state = env_state_idle; + } + pObj->s = pObj->b_r*pObj->s; + break; + + default: + break; + } + + *(pX++) = y; + len--; + } + return pObj->pOut; +} diff --git a/Source/synth/env.h b/Source/synth/env.h new file mode 100644 index 0000000..7f03df8 --- /dev/null +++ b/Source/synth/env.h @@ -0,0 +1,94 @@ +// -------------------------------------------------------------- +// -------------------------------------------------------------- +#ifndef _ENV_H_ +#define _ENV_H_ + +#include "synth_defs.h" + +#define ENV_TOL ((synth_float_t)(1E-4)) +#define ENV_KE ((synth_float_t)(1-exp(-1))) + +#define ENV_MIN_A (0.001) // s +#define ENV_MIN_D (0.005) // s +#define ENV_MIN_R (0.005) // s + +// -------------------------------------------------------------- +// Types +// -------------------------------------------------------------- +enum +{ + ENV_PARAM2_A, + ENV_PARAM2_D, + ENV_PARAM2_S, + ENV_PARAM2_R, + ENV_PARAM2_END +}; + +enum +{ + env_state_idle = 0, + env_state_attack, + env_state_attack_retrigger, + env_state_decay, + env_state_sustain, + env_state_release +}; + +enum +{ + env_event_trigger = 0, + env_event_retrigger, + env_event_release, +}; + +typedef struct _senv_param_t +{ + synth_float_t Ta; + synth_float_t Td; + synth_float_t Vs; + synth_float_t Tr; + +} env_param_t; + +typedef struct _senvgen_t +{ + synth_float_t fs; + UINT32 bufsize; + UINT32 state; + env_param_t param; + synth_float_t k, s, sr, sf; + synth_float_t a_a, b_a; + synth_float_t a_d, b_d; + synth_float_t a_r, b_r; + synth_float_t *pOut; + +} envgen_t; + +// -------------------------------------------------------------- +#if defined(__cplusplus) +extern "C" { +#endif + +// -------------------------------------------------------------- +// Exported functions +// -------------------------------------------------------------- +void ENV_Init(envgen_t *pObj, synth_float_t fs); +void ENV_Free(envgen_t *pObj); +void ENV_Reset(envgen_t *pObj); +void ENV_SetBufsize(envgen_t *pObj, UINT32 size); +void ENV_SetFS(envgen_t *pObj, synth_float_t fs); +void ENV_Event(envgen_t *pObj, UINT32 type); +void ENV_Param2Set(envgen_t *pObj, UINT32 type, synth_float_t value); +UINT32 ENV_ParamGet(envgen_t *pObj, UINT32 type); + +INT32 ENV_IsIdle(envgen_t *pObj); +INT32 ENV_IsStage(envgen_t *pObj, UINT32 stage_num); +synth_float_t* ENV_ProcessDataV(envgen_t *pObj, UINT32 len); + +#if defined(__cplusplus) +} + +#endif +// -------------------------------------------------------------- + +#endif // _ENV_H_ diff --git a/Source/synth/lfo.c b/Source/synth/lfo.c new file mode 100644 index 0000000..0103b36 --- /dev/null +++ b/Source/synth/lfo.c @@ -0,0 +1,542 @@ +// -------------------------------------------------------------- +// -------------------------------------------------------------- + +#include +#include +#include +#include + +#include "synth_defs.h" +#include "lfo.h" + +// -------------------------------------------------------------- +// internal funcs +// -------------------------------------------------------------- +void LFO_freq_update(lfo_t *pObj) +{ + synth_float_t f; + + f = pObj->param[LFO_PARAM2_FREQ]; + pObj->b = 2.0 * sin(f*pi / pObj->fs); + pObj->dx = f/pObj->fs; + + if (pObj->param[LFO_PARAM2_DELAY] > 0) + { + pObj->delay_dx = 1.0/(pObj->fs*pObj->param[LFO_PARAM2_DELAY]); + } + else + { + pObj->delay_dx = 1.0; + } + + pObj->attack_a = 1.0/(pObj->fs*pObj->param[LFO_PARAM2_ATTACK]*LFO_KE); + +} + +void LFO_smmother_update(lfo_t *pObj) +{ + pObj->smooth_is_negative = (pObj->param[LFO_PARAM2_SMOOTH] < 0); + + if (fabs(pObj->param[LFO_PARAM2_SMOOTH]) < 0.001) + { + pObj->smooth_b = 1; + pObj->smooth_is_negative = 0; + } + else + { + pObj->smooth_b = fabs((synth_float_t)5/(pObj->param[LFO_PARAM2_SMOOTH]*pObj->fs)); + } + + pObj->smooth_a = 1 - pObj->smooth_b; + +} + +// -------------------------------------------------------------- +// Exported functions +// -------------------------------------------------------------- +void LFO_Init(lfo_t *pObj, synth_float_t fs) +{ + pObj->fs = fs; + pObj->pOut = NULL; + pObj->bufsize = 0; + + pObj->param[LFO_PARAM2_WAVEFORM] = LFO_WAVEFORM_SINE; + pObj->param[LFO_PARAM2_FREQ] = 1; + pObj->param[LFO_PARAM2_SMOOTH] = 0.001; // seconds + pObj->param[LFO_PARAM2_DELAY] = 0; // seconds + pObj->param[LFO_PARAM2_ATTACK] = 0; // seconds + + pObj->sh_sample = 0; + pObj->out = 0; + pObj->sqr = 0; + pObj->tri = 0; + pObj->gain = 1; + pObj->offset = 0.5; + + LFO_Reset(pObj, 0); + + pObj->freq_update_req = 0; + LFO_SetBufsize(pObj, SYNTH_MAX_BUFSIZE); + + Noise_Init(&pObj->noise, 1+(UINT32)clock() * (UINT32)clock()); +} + +void LFO_Free(lfo_t *pObj) +{ + LFO_SetBufsize(pObj, 0); +} + +void LFO_SetBufsize(lfo_t *pObj, UINT32 size) +{ + if (pObj->bufsize == size) + return; + + pObj->bufsize = size; + + if (pObj->pOut) + free(pObj->pOut); + + pObj->pOut = NULL; + + if (!size) + return; + + pObj->pOut = (synth_float_t*)malloc(pObj->bufsize*sizeof(synth_float_t)); +} + +void LFO_SetFS(lfo_t *pObj, synth_float_t fs) +{ + pObj->fs = fs; + LFO_freq_update(pObj); +} + +void LFO_Reset(lfo_t *pObj, synth_float_t initial_phase) +{ + pObj->a = 0.5; + pObj->y[0] = pObj->a*cos(2*pi*initial_phase); + pObj->y[1] = pObj->a*sin(2*pi*initial_phase); + pObj->x = initial_phase; + pObj->out = 0; + pObj->sqr = 0; + pObj->tri = 0; + pObj->delay_x = 0; + pObj->attack_y = 0; + LFO_freq_update(pObj); + LFO_smmother_update(pObj); + +} + +void LFO_Param2Set(lfo_t *pObj, UINT32 type, synth_float_t value) +{ + switch(type) + { + case LFO_PARAM2_WAVEFORM: + if (pObj->param[type] == (UINT32)value) + break; + pObj->param[type] = (UINT32)value; + pObj->freq_update_req = 1; + break; + + case LFO_PARAM2_FREQ: + pObj->param[type] = value; + pObj->freq_update_req = 1; + break; + + case LFO_PARAM2_SMOOTH: + pObj->param[type] = value; + LFO_smmother_update(pObj); + break; + + case LFO_PARAM2_DELAY: + pObj->param[type] = value; + pObj->freq_update_req = 1; + break; + + case LFO_PARAM2_ATTACK: + pObj->param[type] = value; + pObj->freq_update_req = 1; + break; + + case LFO_PARAM2_SYMMETRY: + pObj->param[type] = value; + pObj->gain = 1; + pObj->offset = 0.5 *(1 + value) - 1; + break; + + default: + break; + } +} + +synth_float_t* LFO_ProcessDataV(lfo_t *pObj, UINT32 len) +{ + synth_float_t *pOut, out, in; + UINT32 i, i0; + + pOut = pObj->pOut; + + // Process Delay + for (i=0; i< len; i++) + { + pObj->delay_x += pObj->delay_dx; + + if (pObj->delay_x >= 1.0) + break; + + in = (synth_float_t)0; + pObj->out = pObj->smooth_a*pObj->out + pObj->smooth_b*in; + out = pObj->out; + if (pObj->smooth_is_negative) + out = 2*in - pObj->out; + + *(pOut++) = out; + + if (pObj->freq_update_req) + { + pObj->freq_update_req = 0; + LFO_freq_update(pObj); + } + } + i0 = i; + + if (pObj->param[LFO_PARAM2_WAVEFORM] == LFO_WAVEFORM_SAW) + { + // Create phase + for (i=i0; i< len; i++) + { + in = pObj->x + pObj->offset; + pObj->out = pObj->smooth_a*pObj->out + pObj->smooth_b*in; + out = pObj->out; + if (pObj->smooth_is_negative) + out = 2*in - pObj->out; + + *(pOut++) = out*pObj->attack_y; + pObj->attack_y += pObj->attack_a*(1-pObj->attack_y); + + pObj->x += pObj->dx; + if (pObj->x >= 1.f) + { + pObj->x -= 1.f; + } + + if (pObj->freq_update_req) + { + pObj->freq_update_req = 0; + LFO_freq_update(pObj); + } + } + } + + if (pObj->param[LFO_PARAM2_WAVEFORM] == LFO_WAVEFORM_ONE_MINUS_SAW) + { + // Create phase + for (i=i0; i< len; i++) + { + in = (1-pObj->x) + pObj->offset; + pObj->out = pObj->smooth_a*pObj->out + pObj->smooth_b*in; + out = pObj->out; + if (pObj->smooth_is_negative) + out = 2*in - pObj->out; + + *(pOut++) = out*pObj->attack_y; + pObj->attack_y += pObj->attack_a*(1-pObj->attack_y); + + pObj->x += pObj->dx; + if (pObj->x >= 1.f) + { + pObj->x -= 1.f; + } + + if (pObj->freq_update_req) + { + pObj->freq_update_req = 0; + LFO_freq_update(pObj); + } + } + } + + if (pObj->param[LFO_PARAM2_WAVEFORM] == LFO_WAVEFORM_SH_UNI) + { + // Create phase for S/H + for (i=i0; i< len; i++) + { + if (pObj->x >= 1.f) + { + pObj->x -= 1.f; + pObj->sh_sample = Noise_Uniform(&pObj->noise, 1, 0.5); + } + in = pObj->sh_sample + pObj->offset; + pObj->out = pObj->smooth_a*pObj->out + pObj->smooth_b*in; + out = pObj->out; + if (pObj->smooth_is_negative) + out = 2*in - pObj->out; + + *(pOut++) = out*pObj->attack_y; + pObj->attack_y += pObj->attack_a*(1-pObj->attack_y); + + pObj->x += pObj->dx; + + if (pObj->freq_update_req) + { + pObj->freq_update_req = 0; + LFO_freq_update(pObj); + } + } + } + + if (pObj->param[LFO_PARAM2_WAVEFORM] == LFO_WAVEFORM_SH_GAUSS) + { + // Create phase for S/H + for (i=i0; i< len; i++) + { + if (pObj->x >= 1.f) + { + pObj->x -= 1.f; + do + { + pObj->sh_sample = Noise_Gaussian(&pObj->noise, sqrt(1.f/36), 0.5); + + } while ((pObj->sh_sample < 0) || (pObj->sh_sample > 1.f)); + } + in = pObj->sh_sample + pObj->offset; + pObj->out = pObj->smooth_a*pObj->out + pObj->smooth_b*in; + out = pObj->out; + if (pObj->smooth_is_negative) + out = 2*in - pObj->out; + + *(pOut++) = out*pObj->attack_y; + pObj->attack_y += pObj->attack_a*(1-pObj->attack_y); + + pObj->x += pObj->dx; + + if (pObj->freq_update_req) + { + pObj->freq_update_req = 0; + LFO_freq_update(pObj); + } + } + } + + // Create output + if (pObj->param[LFO_PARAM2_WAVEFORM] == LFO_WAVEFORM_SINE) + { + for (i=i0; i< len; i++) + { + in = pObj->y[1]+pObj->a + pObj->offset; + pObj->out = pObj->smooth_a*pObj->out + pObj->smooth_b*in; + out = pObj->out; + if (pObj->smooth_is_negative) + out = 2*in - pObj->out; + + *(pOut++) = out*pObj->attack_y; + pObj->attack_y += pObj->attack_a*(1-pObj->attack_y); + + pObj->y[0] = pObj->y[0] - pObj->b*pObj->y[1]; + pObj->y[1] = pObj->y[1] + pObj->b*pObj->y[0]; + + if (pObj->freq_update_req) + { + pObj->freq_update_req = 0; + LFO_freq_update(pObj); + } + } + } + + if (pObj->param[LFO_PARAM2_WAVEFORM] == LFO_WAVEFORM_ONE_MINUS_SINE) + { + for (i=i0; i< len; i++) + { + in = (1-(pObj->y[1]+pObj->a)) + pObj->offset; + pObj->out = pObj->smooth_a*pObj->out + pObj->smooth_b*in; + out = pObj->out; + if (pObj->smooth_is_negative) + out = 2*in - pObj->out; + + *(pOut++) = out*pObj->attack_y; + pObj->attack_y += pObj->attack_a*(1-pObj->attack_y); + + pObj->y[0] = pObj->y[0] - pObj->b*pObj->y[1]; + pObj->y[1] = pObj->y[1] + pObj->b*pObj->y[0]; + + if (pObj->freq_update_req) + { + pObj->freq_update_req = 0; + LFO_freq_update(pObj); + } + } + } + + if (pObj->param[LFO_PARAM2_WAVEFORM] == LFO_WAVEFORM_COSINE) + { + for (i=i0; i< len; i++) + { + in = pObj->y[0]+pObj->a + pObj->offset; + pObj->out = pObj->smooth_a*pObj->out + pObj->smooth_b*in; + out = pObj->out; + if (pObj->smooth_is_negative) + out = 2*in - pObj->out; + + *(pOut++) = out*pObj->attack_y; + pObj->attack_y += pObj->attack_a*(1-pObj->attack_y); + + pObj->y[0] = pObj->y[0] - pObj->b*pObj->y[1]; + pObj->y[1] = pObj->y[1] + pObj->b*pObj->y[0]; + + if (pObj->freq_update_req) + { + pObj->freq_update_req = 0; + LFO_freq_update(pObj); + } + } + } + + if (pObj->param[LFO_PARAM2_WAVEFORM] == LFO_WAVEFORM_ONE_MINUS_COSINE) + { + for (i=i0; i< len; i++) + { + in = (1-(pObj->y[0]+pObj->a)) + pObj->offset; + pObj->out = pObj->smooth_a*pObj->out + pObj->smooth_b*in; + out = pObj->out; + if (pObj->smooth_is_negative) + out = 2*in - pObj->out; + + *(pOut++) = out*pObj->attack_y; + pObj->attack_y += pObj->attack_a*(1-pObj->attack_y); + + pObj->y[0] = pObj->y[0] - pObj->b*pObj->y[1]; + pObj->y[1] = pObj->y[1] + pObj->b*pObj->y[0]; + + if (pObj->freq_update_req) + { + pObj->freq_update_req = 0; + LFO_freq_update(pObj); + } + } + } + + if (pObj->param[LFO_PARAM2_WAVEFORM] == LFO_WAVEFORM_SQUARE) + { + // Create phase + for (i=i0; i< len; i++) + { + in = (synth_float_t)pObj->sqr + pObj->offset; + pObj->out = pObj->smooth_a*pObj->out + pObj->smooth_b*in; + out = pObj->out; + if (pObj->smooth_is_negative) + out = 2*in - pObj->out; + + *(pOut++) = out*pObj->attack_y; + pObj->attack_y += pObj->attack_a*(1-pObj->attack_y); + + pObj->x += 2*pObj->dx; + if (pObj->x >= 1.f) + { + pObj->x -= 1.f; + pObj->sqr = !pObj->sqr; + } + + if (pObj->freq_update_req) + { + pObj->freq_update_req = 0; + LFO_freq_update(pObj); + } + } + } + + if (pObj->param[LFO_PARAM2_WAVEFORM] == LFO_WAVEFORM_ONE_MINUS_SQUARE) + { + // Create phase + for (i=i0; i< len; i++) + { + in = (1-((synth_float_t)pObj->sqr)) + pObj->offset; + pObj->out = pObj->smooth_a*pObj->out + pObj->smooth_b*in; + out = pObj->out; + if (pObj->smooth_is_negative) + out = 2*in - pObj->out; + + *(pOut++) = out*pObj->attack_y; + pObj->attack_y += pObj->attack_a*(1-pObj->attack_y); + + pObj->x += 2*pObj->dx; + if (pObj->x >= 1.f) + { + pObj->x -= 1.f; + pObj->sqr = !pObj->sqr; + } + + if (pObj->freq_update_req) + { + pObj->freq_update_req = 0; + LFO_freq_update(pObj); + } + } + } + + if (pObj->param[LFO_PARAM2_WAVEFORM] == LFO_WAVEFORM_TRIANGLE) + { + // Create phase + for (i=i0; i< len; i++) + { + in = (synth_float_t)pObj->tri + pObj->offset; + pObj->out = pObj->smooth_a*pObj->out + pObj->smooth_b*in; + out = pObj->out; + if (pObj->smooth_is_negative) + out = 2*in - pObj->out; + + *(pOut++) = out*pObj->attack_y; + pObj->attack_y += pObj->attack_a*(1-pObj->attack_y); + + if (pObj->x < 0.5) + pObj->tri = 2*pObj->x; + else + pObj->tri = 2*(1-pObj->x); + + pObj->x += pObj->dx; + if (pObj->x >= 1.f) + { + pObj->x -= 1.f; + } + + if (pObj->freq_update_req) + { + pObj->freq_update_req = 0; + LFO_freq_update(pObj); + } + } + } + + if (pObj->param[LFO_PARAM2_WAVEFORM] == LFO_WAVEFORM_ONE_MINUS_TRIANGLE) + { + // Create phase + for (i=i0; i< len; i++) + { + in = (1-((synth_float_t)pObj->tri)) + pObj->offset; + pObj->out = pObj->smooth_a*pObj->out + pObj->smooth_b*in; + out = pObj->out; + if (pObj->smooth_is_negative) + out = 2*in - pObj->out; + + *(pOut++) = out*pObj->attack_y; + pObj->attack_y += pObj->attack_a*(1-pObj->attack_y); + + if (pObj->x < 0.5) + pObj->tri = 2*pObj->x; + else + pObj->tri = 2*(1-pObj->x); + + pObj->x += pObj->dx; + if (pObj->x >= 1.f) + { + pObj->x -= 1.f; + } + + if (pObj->freq_update_req) + { + pObj->freq_update_req = 0; + LFO_freq_update(pObj); + } + } + } + + return pObj->pOut; +} diff --git a/Source/synth/lfo.h b/Source/synth/lfo.h new file mode 100644 index 0000000..434d911 --- /dev/null +++ b/Source/synth/lfo.h @@ -0,0 +1,81 @@ +// -------------------------------------------------------------- +// -------------------------------------------------------------- +#ifndef _LFO_H_ +#define _LFO_H_ + +#include "synth_defs.h" +#include "noise.h" + +#define LFO_SH_ALPHA 0.002 // S&H smoothing +#define LFO_KE ((synth_float_t)(1-exp(-1))) + +// -------------------------------------------------------------- +// Types +// -------------------------------------------------------------- +enum +{ + LFO_WAVEFORM_SINE, + LFO_WAVEFORM_COSINE, + LFO_WAVEFORM_SAW, + LFO_WAVEFORM_SQUARE, + LFO_WAVEFORM_TRIANGLE, + LFO_WAVEFORM_SH_UNI, + LFO_WAVEFORM_SH_GAUSS, + LFO_WAVEFORM_ONE_MINUS_SINE, + LFO_WAVEFORM_ONE_MINUS_COSINE, + LFO_WAVEFORM_ONE_MINUS_SAW, + LFO_WAVEFORM_ONE_MINUS_SQUARE, + LFO_WAVEFORM_ONE_MINUS_TRIANGLE, + LFO_NUM_WAVEFORMS +}; + +enum +{ + LFO_PARAM2_WAVEFORM, + LFO_PARAM2_FREQ, + LFO_PARAM2_SMOOTH, + LFO_PARAM2_DELAY, + LFO_PARAM2_ATTACK, + LFO_PARAM2_SYMMETRY, + LFO_NUM_PARAMS +}; + +typedef struct _slfo_t +{ + synth_float_t param[LFO_NUM_PARAMS]; + synth_float_t fs; + synth_float_t a, b, y[2], x, dx, out, sh_sample, tri; + int freq_update_req, sqr; + synth_float_t *pOut; + UINT32 bufsize; + noise_gen_t noise; + synth_float_t smooth_a, smooth_b; + UINT32 smooth_is_negative; + synth_float_t delay_x, delay_dx, attack_y, attack_a; + synth_float_t gain, offset; + +} lfo_t; + +// -------------------------------------------------------------- +#if defined(__cplusplus) +extern "C" { +#endif + +// -------------------------------------------------------------- +// Exported functions +// -------------------------------------------------------------- +void LFO_Init(lfo_t *pObj, synth_float_t fs); +void LFO_Free(lfo_t *pObj); +void LFO_SetFS(lfo_t *pObj, synth_float_t fs); +void LFO_SetBufsize(lfo_t *pObj, UINT32 bufsize); +void LFO_Reset(lfo_t *pObj, synth_float_t initial_phase); +void LFO_Param2Set(lfo_t *pObj, UINT32 type, synth_float_t value); +synth_float_t* LFO_ProcessDataV(lfo_t *pObj, UINT32 len); + +#if defined(__cplusplus) +} + +#endif +// -------------------------------------------------------------- + +#endif // _LFO_H_ diff --git a/Source/synth/mw_wave_data.c b/Source/synth/mw_wave_data.c new file mode 100644 index 0000000..cfcf663 --- /dev/null +++ b/Source/synth/mw_wave_data.c @@ -0,0 +1,3250 @@ +#include "wavetable.h" + +// ------------------------------------------------------------------------ +const unsigned char _g_wave_rawdata[38400] = { + 0x01, 0x80, 0x11, 0x00, 0x1E, 0x00, 0x26, 0x80, 0x29, 0x80, 0x28, 0x00, + 0x22, 0x00, 0x1A, 0x80, 0x12, 0x00, 0x0B, 0x00, 0x06, 0x80, 0x03, 0x00, + 0x02, 0x00, 0xFF, 0x00, 0xFB, 0x80, 0xF6, 0x00, 0xF0, 0x00, 0xE9, 0x00, + 0xE3, 0x00, 0xE0, 0x80, 0xE2, 0x00, 0xE8, 0x80, 0xF2, 0x80, 0xFE, 0x80, + 0x0A, 0x80, 0x13, 0x80, 0x19, 0x00, 0x19, 0x00, 0x14, 0x80, 0x0D, 0x00, + 0x03, 0x00, 0xF9, 0x80, 0xF3, 0x80, 0xF0, 0x80, 0xF1, 0x00, 0xF4, 0x80, + 0xF9, 0x00, 0xFD, 0x00, 0xFF, 0x80, 0x00, 0x80, 0xFF, 0x80, 0xFF, 0x00, + 0xFE, 0x80, 0x01, 0x00, 0x07, 0x00, 0x0E, 0x00, 0x15, 0x80, 0x1D, 0x00, + 0x21, 0x00, 0x20, 0x80, 0x1B, 0x00, 0x10, 0x80, 0x02, 0x00, 0xF3, 0x00, + 0xE5, 0x80, 0xDB, 0x00, 0xD6, 0x80, 0xD7, 0x80, 0xDB, 0x80, 0xE3, 0x80, + 0xEB, 0x80, 0xF3, 0x80, 0xF9, 0x00, 0xFE, 0x00, 0x00, 0x80, 0x13, 0x80, + 0x22, 0x00, 0x2A, 0x80, 0x2D, 0x80, 0x2B, 0x80, 0x24, 0x80, 0x1C, 0x80, + 0x14, 0x80, 0x0E, 0x00, 0x09, 0x80, 0x07, 0x00, 0x05, 0x80, 0x03, 0x80, + 0x01, 0x00, 0xFE, 0x00, 0xFB, 0x00, 0xF9, 0x80, 0xF9, 0x80, 0xFC, 0x00, + 0x00, 0x00, 0x06, 0x00, 0x0B, 0x00, 0x0E, 0x00, 0x10, 0x80, 0x10, 0x00, + 0x0D, 0x80, 0x0A, 0x80, 0x06, 0x00, 0x03, 0x00, 0xFF, 0x80, 0xFE, 0x00, + 0xFC, 0x80, 0xFB, 0x80, 0xFB, 0x80, 0xFB, 0x80, 0xFB, 0x80, 0xFA, 0x80, + 0xFA, 0x80, 0xF9, 0x80, 0xF8, 0x80, 0xF6, 0x00, 0xF4, 0x00, 0xF3, 0x80, + 0xF3, 0x80, 0xF7, 0x80, 0xFC, 0x80, 0x03, 0x00, 0x0A, 0x00, 0x0F, 0x80, + 0x10, 0x80, 0x0C, 0x00, 0x04, 0x00, 0xF8, 0x00, 0xEC, 0x00, 0xDF, 0x80, + 0xD7, 0x80, 0xD4, 0x80, 0xD5, 0x80, 0xDC, 0x00, 0xE3, 0x80, 0xEC, 0x00, + 0xF3, 0x80, 0xFB, 0x00, 0x01, 0x00, 0x12, 0x00, 0x20, 0x00, 0x2B, 0x00, + 0x30, 0x80, 0x31, 0x80, 0x2F, 0x80, 0x29, 0x00, 0x21, 0x00, 0x19, 0x00, + 0x11, 0x00, 0x0B, 0x00, 0x06, 0x80, 0x04, 0x00, 0x03, 0x00, 0x02, 0x80, + 0x03, 0x00, 0x02, 0x80, 0x05, 0x00, 0x07, 0x00, 0x09, 0x00, 0x0B, 0x80, + 0x0E, 0x80, 0x10, 0x80, 0x11, 0x80, 0x11, 0x80, 0x10, 0x00, 0x0D, 0x00, + 0x08, 0x80, 0x05, 0x80, 0x02, 0x80, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x03, 0x80, 0x04, 0x00, 0x03, 0x00, 0x01, 0x00, 0xFD, 0x80, + 0xFA, 0x00, 0xF6, 0x80, 0xF3, 0x00, 0xF3, 0x00, 0xF5, 0x00, 0xFA, 0x00, + 0xFF, 0x80, 0x05, 0x00, 0x0A, 0x80, 0x0C, 0x00, 0x0B, 0x80, 0x06, 0x80, + 0x00, 0x00, 0xF5, 0x00, 0xEB, 0x00, 0xE1, 0x00, 0xD9, 0x00, 0xD5, 0x00, + 0xD3, 0x00, 0xD5, 0x80, 0xDA, 0x80, 0xE2, 0x80, 0xEC, 0x00, 0xF6, 0x00, + 0xFE, 0x80, 0xF8, 0x80, 0xF1, 0x80, 0xED, 0x80, 0xEF, 0x00, 0xF3, 0x00, + 0xF9, 0x00, 0xFF, 0x00, 0x07, 0x00, 0x11, 0x80, 0x18, 0x80, 0x1B, 0x80, + 0x1A, 0x00, 0x19, 0x80, 0x14, 0x00, 0x05, 0x00, 0xF6, 0x80, 0xEA, 0x80, + 0xE6, 0x00, 0xE3, 0x00, 0xE2, 0x00, 0xE6, 0x00, 0xEF, 0x80, 0xFE, 0x00, + 0x07, 0x80, 0x0D, 0x00, 0x0F, 0x80, 0x0F, 0x00, 0x09, 0x00, 0x00, 0x00, + 0xF9, 0x80, 0xF3, 0x80, 0xF1, 0x80, 0xF1, 0x00, 0xF3, 0x00, 0xF8, 0x80, + 0xFE, 0x00, 0x07, 0x80, 0x11, 0x00, 0x15, 0x00, 0x10, 0x80, 0x0B, 0x00, + 0x05, 0x00, 0xFB, 0x00, 0xEF, 0x00, 0xE1, 0x80, 0xD8, 0x00, 0xD1, 0x80, + 0xCE, 0x00, 0xCE, 0x00, 0xD1, 0x80, 0xDC, 0x80, 0xE8, 0x80, 0xF0, 0x80, + 0xF9, 0x80, 0x04, 0x00, 0x12, 0x00, 0x1A, 0x80, 0x1B, 0x00, 0x19, 0x00, + 0x17, 0x80, 0x17, 0x80, 0x11, 0x80, 0x06, 0x00, 0xFE, 0x80, 0xF9, 0x00, + 0xF4, 0x80, 0xF2, 0x00, 0xF3, 0x80, 0xF6, 0x80, 0xFB, 0x00, 0xFF, 0x80, + 0x05, 0x80, 0x0E, 0x80, 0x15, 0x00, 0x16, 0x80, 0x15, 0x00, 0x13, 0x80, + 0x0E, 0x80, 0x01, 0x80, 0xF3, 0x80, 0xE9, 0x80, 0xE6, 0x00, 0xE7, 0x00, + 0xEA, 0x80, 0xF1, 0x00, 0xFA, 0x80, 0x04, 0x80, 0x0A, 0x80, 0x0E, 0x00, + 0x10, 0x00, 0x0D, 0x00, 0x00, 0x80, 0xF3, 0x80, 0xEB, 0x00, 0xE7, 0x80, + 0xE7, 0x80, 0xE9, 0x00, 0xEB, 0x00, 0xF2, 0x80, 0xFF, 0x80, 0x10, 0x80, + 0x1F, 0x80, 0x25, 0x80, 0x22, 0x00, 0x1A, 0x80, 0x10, 0x80, 0x01, 0x80, + 0xF0, 0x80, 0xDE, 0x80, 0xD0, 0x00, 0xC5, 0x00, 0xC0, 0x80, 0xC2, 0x80, + 0xCC, 0x00, 0xDB, 0x80, 0xEB, 0x00, 0xF6, 0x00, 0xFF, 0x80, 0x0C, 0x00, + 0x1A, 0x00, 0x20, 0x00, 0x1A, 0x80, 0x11, 0x00, 0x0E, 0x00, 0x11, 0x00, + 0x10, 0x80, 0x07, 0x00, 0x01, 0x00, 0x0C, 0x00, 0x14, 0x80, 0x1C, 0x80, + 0x22, 0x80, 0x26, 0x80, 0x27, 0x00, 0x26, 0x00, 0x22, 0x00, 0x1C, 0x80, + 0x16, 0x00, 0x0F, 0x80, 0x08, 0x80, 0x02, 0x00, 0xFE, 0x00, 0xFB, 0x80, + 0xFA, 0x80, 0xFC, 0x80, 0x01, 0x00, 0x06, 0x80, 0x0E, 0x80, 0x16, 0x80, + 0x1F, 0x00, 0x27, 0x00, 0x2D, 0x00, 0x31, 0x00, 0x33, 0x00, 0x33, 0x00, + 0x30, 0x00, 0x2B, 0x00, 0x23, 0x80, 0x1A, 0x80, 0x12, 0x00, 0x09, 0x00, + 0x00, 0x80, 0xF9, 0x80, 0xF4, 0x80, 0xF0, 0x80, 0xF1, 0x00, 0xF2, 0x80, + 0xF6, 0x80, 0xFC, 0x80, 0x03, 0x80, 0x0B, 0x80, 0x11, 0x80, 0x18, 0x80, + 0x1C, 0x80, 0x1F, 0x80, 0x20, 0x80, 0x1E, 0x00, 0x19, 0x80, 0x13, 0x80, + 0x0C, 0x80, 0x03, 0x00, 0xFA, 0x00, 0xF1, 0x80, 0xEC, 0x00, 0xE7, 0x00, + 0xE4, 0x00, 0xE4, 0x00, 0xE6, 0x80, 0xEA, 0x80, 0xF0, 0x80, 0xF8, 0x80, + 0x02, 0x00, 0x10, 0x00, 0x1C, 0x80, 0x25, 0x80, 0x29, 0x80, 0x29, 0x80, + 0x25, 0x00, 0x1F, 0x00, 0x18, 0x80, 0x13, 0x80, 0x10, 0x80, 0x10, 0x00, + 0x13, 0x00, 0x16, 0x00, 0x19, 0x00, 0x1B, 0x00, 0x1B, 0x00, 0x18, 0x00, + 0x13, 0x00, 0x0D, 0x80, 0x09, 0x00, 0x05, 0x00, 0x04, 0x00, 0x06, 0x00, + 0x0B, 0x00, 0x11, 0x00, 0x17, 0x00, 0x1C, 0x00, 0x1D, 0x00, 0x1A, 0x80, + 0x13, 0x00, 0x0A, 0x80, 0xFF, 0x00, 0xF4, 0x80, 0xEC, 0x80, 0xE9, 0x00, + 0xE9, 0x80, 0xED, 0x80, 0xF6, 0x00, 0x00, 0x80, 0x0B, 0x00, 0x13, 0x80, + 0x1A, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1D, 0x00, 0x1B, 0x00, 0x1A, 0x80, + 0x1B, 0x00, 0x1C, 0x80, 0x20, 0x80, 0x25, 0x00, 0x27, 0x80, 0x28, 0x80, + 0x25, 0x80, 0x20, 0x00, 0x17, 0x80, 0x0D, 0x00, 0x02, 0x00, 0xF9, 0x00, + 0xF3, 0x80, 0xF0, 0x80, 0xF3, 0x80, 0xF9, 0x00, 0xFE, 0x80, 0xFA, 0x80, + 0xF6, 0x00, 0xF3, 0x00, 0xF3, 0x80, 0xF6, 0x00, 0xFB, 0x80, 0xFF, 0x80, + 0x04, 0x80, 0x0B, 0x80, 0x11, 0x80, 0x14, 0x00, 0x13, 0x00, 0x11, 0x80, + 0x0C, 0x00, 0x01, 0x80, 0xF7, 0x00, 0xED, 0x80, 0xEB, 0x00, 0xEA, 0x00, + 0xEC, 0x80, 0xF1, 0x80, 0xF9, 0x00, 0x02, 0x00, 0x08, 0x80, 0x0D, 0x00, + 0x0D, 0x00, 0x09, 0x80, 0x00, 0x00, 0xF4, 0x80, 0xEC, 0x80, 0xE7, 0x00, + 0xE7, 0x00, 0xE8, 0x00, 0xEB, 0x00, 0xF4, 0x00, 0x00, 0x00, 0x10, 0x80, + 0x1D, 0x80, 0x23, 0x80, 0x21, 0x80, 0x1A, 0x00, 0x10, 0x80, 0x01, 0x80, + 0xF2, 0x00, 0xE1, 0x00, 0xD2, 0x80, 0xC9, 0x00, 0xC4, 0x00, 0xC6, 0x00, + 0xCD, 0x80, 0xDB, 0x80, 0xEB, 0x00, 0xF6, 0x80, 0x01, 0x00, 0x0C, 0x00, + 0x18, 0x80, 0x1E, 0x80, 0x1B, 0x80, 0x16, 0x00, 0x12, 0x00, 0x12, 0x00, + 0x0F, 0x00, 0x05, 0x80, 0x02, 0x00, 0x20, 0x80, 0x34, 0x80, 0x3A, 0x80, + 0x36, 0x80, 0x2F, 0x80, 0x29, 0x80, 0x26, 0x00, 0x24, 0x80, 0x22, 0x00, + 0x1E, 0x00, 0x1B, 0x80, 0x18, 0x80, 0x15, 0x80, 0x15, 0x00, 0x16, 0x00, + 0x18, 0x80, 0x1A, 0x00, 0x19, 0x80, 0x13, 0x00, 0x0E, 0x80, 0x09, 0x00, + 0x07, 0x80, 0x09, 0x80, 0x0A, 0x80, 0x0A, 0x00, 0x06, 0x80, 0x01, 0x00, + 0xFC, 0x80, 0xFC, 0x80, 0xFE, 0x00, 0x06, 0x80, 0x11, 0x00, 0x19, 0x00, + 0x1C, 0x00, 0x19, 0x00, 0x13, 0x00, 0x0B, 0x00, 0x06, 0x80, 0x05, 0x80, + 0x07, 0x00, 0x08, 0x80, 0x07, 0x00, 0x03, 0x80, 0xFE, 0x80, 0xF9, 0x80, + 0xF7, 0x80, 0xF8, 0x00, 0xFC, 0x00, 0x01, 0x00, 0x06, 0x80, 0x07, 0x00, + 0x05, 0x80, 0x03, 0x00, 0x00, 0x80, 0x01, 0x00, 0xFE, 0x00, 0xF6, 0x80, + 0xEE, 0x80, 0xE5, 0x00, 0xDF, 0x00, 0xE3, 0x00, 0xEA, 0x00, 0xF5, 0x80, + 0x00, 0x00, 0xFE, 0x00, 0xFD, 0x00, 0xFB, 0x80, 0xFD, 0x80, 0xFD, 0x80, + 0xF9, 0x80, 0xF5, 0x00, 0xF5, 0x80, 0xFA, 0x80, 0xFB, 0x00, 0xF5, 0x80, + 0xF1, 0x00, 0xF7, 0x80, 0xFF, 0x00, 0xFC, 0x00, 0xF5, 0x80, 0xF5, 0x00, + 0xFD, 0x80, 0x02, 0x80, 0x00, 0x80, 0xFD, 0x00, 0x01, 0x00, 0x0A, 0x80, + 0x0C, 0x00, 0x08, 0x00, 0x07, 0x80, 0x0F, 0x00, 0x11, 0x00, 0x0D, 0x00, + 0x08, 0x00, 0x07, 0x80, 0x0D, 0x00, 0x10, 0x00, 0x08, 0x80, 0x00, 0x80, + 0xFC, 0x80, 0xFE, 0x80, 0x00, 0x00, 0xFB, 0x00, 0xF2, 0x00, 0xEE, 0x80, + 0xED, 0x00, 0xE8, 0x00, 0xE1, 0x00, 0xDA, 0x80, 0xDC, 0x00, 0xDE, 0x80, + 0xD8, 0x80, 0xCE, 0x80, 0xCA, 0x00, 0xD4, 0x00, 0xDF, 0x00, 0xDB, 0x00, + 0xD1, 0x80, 0xD1, 0x00, 0xE1, 0x80, 0xEF, 0x00, 0xEA, 0x80, 0xDF, 0x80, + 0xE1, 0x00, 0xF6, 0x00, 0x08, 0x00, 0x06, 0x80, 0x03, 0x00, 0x00, 0x00, + 0xFC, 0x80, 0xF6, 0x80, 0xFA, 0x80, 0xFE, 0x00, 0xFB, 0x00, 0xF5, 0x00, + 0xF1, 0x80, 0xF6, 0x00, 0xF8, 0x00, 0xF6, 0x00, 0xF4, 0x80, 0xFA, 0x00, + 0xFC, 0x80, 0xF7, 0x80, 0xF2, 0x00, 0xF5, 0x00, 0xFF, 0x80, 0x02, 0x00, + 0xFE, 0x00, 0xFB, 0x00, 0x00, 0x00, 0x09, 0x80, 0x0B, 0x00, 0x07, 0x80, + 0x09, 0x80, 0x11, 0x80, 0x10, 0x80, 0x0A, 0x80, 0x04, 0x00, 0x08, 0x00, + 0x13, 0x00, 0x16, 0x80, 0x0B, 0x00, 0xFF, 0x80, 0xFC, 0x00, 0x03, 0x00, + 0x08, 0x80, 0x00, 0x80, 0xF6, 0x80, 0xF4, 0x00, 0xF3, 0x00, 0xEA, 0x80, + 0xE0, 0x80, 0xDE, 0x80, 0xE6, 0x80, 0xE6, 0x00, 0xD8, 0x80, 0xCA, 0x00, + 0xCD, 0x00, 0xDE, 0x80, 0xE8, 0x00, 0xDA, 0x80, 0xCC, 0x00, 0xD0, 0x80, + 0xEA, 0x00, 0xF9, 0x80, 0xEC, 0x00, 0xD9, 0x00, 0xDB, 0x80, 0xFB, 0x80, + 0x13, 0x00, 0x0D, 0x00, 0x00, 0x80, 0x1D, 0x00, 0x2F, 0x80, 0x36, 0x80, + 0x32, 0x80, 0x29, 0x00, 0x19, 0x00, 0x0C, 0x00, 0xFD, 0x80, 0xF3, 0x00, + 0xF0, 0x00, 0xF1, 0x00, 0xF6, 0x00, 0xFC, 0x80, 0x01, 0x00, 0x04, 0x00, + 0x05, 0x80, 0x06, 0x00, 0x04, 0x00, 0x00, 0x80, 0xFE, 0x00, 0xFD, 0x80, + 0xFB, 0x80, 0xFD, 0x00, 0xFC, 0x80, 0xFD, 0x80, 0xFE, 0x00, 0x00, 0x00, + 0x03, 0x80, 0x05, 0x00, 0x09, 0x00, 0x09, 0x80, 0x0A, 0x00, 0x09, 0x80, + 0x08, 0x00, 0x07, 0x00, 0x03, 0x00, 0x03, 0x80, 0x00, 0x00, 0xFC, 0x80, + 0xFA, 0x00, 0xF8, 0x80, 0xFB, 0x80, 0xFB, 0x80, 0xFF, 0x80, 0x03, 0x00, + 0x06, 0x00, 0x06, 0x00, 0x07, 0x00, 0x04, 0x00, 0xFE, 0x80, 0xF8, 0x00, + 0xF4, 0x00, 0xEE, 0x80, 0xF0, 0x00, 0xF5, 0x00, 0x00, 0x00, 0x0E, 0x80, + 0x1E, 0x00, 0x27, 0x80, 0x2C, 0x00, 0x26, 0x80, 0x1A, 0x00, 0x0E, 0x80, + 0x01, 0x80, 0x10, 0x00, 0x1C, 0x00, 0x27, 0x00, 0x2F, 0x80, 0x36, 0x00, + 0x39, 0x00, 0x3A, 0x00, 0x38, 0x00, 0x33, 0x80, 0x2E, 0x00, 0x26, 0x80, + 0x1F, 0x00, 0x16, 0x00, 0x0F, 0x00, 0x07, 0x80, 0x02, 0x80, 0xFE, 0x00, + 0xFA, 0x80, 0xF9, 0x00, 0xF9, 0x00, 0xF9, 0x00, 0xF9, 0x80, 0xFB, 0x80, + 0xFD, 0x80, 0xFE, 0x80, 0x00, 0x80, 0x01, 0x80, 0x03, 0x00, 0x03, 0x80, + 0x03, 0x80, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x80, 0x03, 0x00, + 0x02, 0x80, 0x01, 0x80, 0x00, 0x80, 0xFE, 0x00, 0xFD, 0x80, 0xFB, 0x00, + 0xFA, 0x80, 0xF9, 0x00, 0xF9, 0x00, 0xF9, 0x80, 0xFC, 0x00, 0xFF, 0x00, + 0x03, 0x00, 0x09, 0x00, 0x10, 0x00, 0x17, 0x80, 0x20, 0x00, 0x27, 0x80, + 0x2E, 0x80, 0x34, 0x00, 0x37, 0x80, 0x39, 0x00, 0x38, 0x00, 0x33, 0x80, + 0x2D, 0x80, 0x23, 0x80, 0x18, 0x80, 0x0C, 0x80, 0x03, 0x00, 0x11, 0x00, + 0x0E, 0x80, 0x32, 0x80, 0x02, 0x00, 0x12, 0x80, 0x12, 0x80, 0xEB, 0x80, + 0xE3, 0x80, 0x13, 0x80, 0x38, 0x00, 0x24, 0x00, 0x03, 0x80, 0x0A, 0x00, + 0x24, 0x80, 0x28, 0x00, 0x17, 0x80, 0x0A, 0x00, 0xFF, 0x80, 0xEB, 0x80, + 0xDE, 0x00, 0xE9, 0x00, 0x05, 0x00, 0x13, 0x00, 0x0F, 0x00, 0x0C, 0x00, + 0x09, 0x80, 0xF7, 0x00, 0xD9, 0x80, 0xCF, 0x00, 0xE6, 0x00, 0x06, 0x80, + 0x0E, 0x00, 0x00, 0x00, 0xFB, 0x80, 0x0E, 0x80, 0x15, 0x00, 0x06, 0x80, + 0xF6, 0x00, 0xFC, 0x80, 0x0C, 0x00, 0x0C, 0x00, 0xF9, 0x00, 0xED, 0x80, + 0xFA, 0x80, 0x11, 0x80, 0x1E, 0x00, 0x15, 0x80, 0x03, 0x80, 0xF0, 0x80, + 0xEC, 0x00, 0xF3, 0x80, 0xFD, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0E, 0x80, + 0x0B, 0x00, 0xF3, 0x00, 0xE2, 0x00, 0xED, 0x00, 0x02, 0x80, 0xFC, 0x80, + 0xDD, 0x80, 0xD8, 0x80, 0x01, 0x80, 0xFF, 0x80, 0xFB, 0x80, 0xF6, 0x80, + 0xF9, 0x80, 0xFA, 0x80, 0xF8, 0x00, 0xF2, 0x00, 0xF0, 0x00, 0xF6, 0x80, + 0xFA, 0x80, 0xF5, 0x80, 0xF0, 0x00, 0xF5, 0x00, 0xFD, 0x00, 0xFA, 0x80, + 0xF4, 0x00, 0xF2, 0x00, 0xF8, 0x80, 0xFE, 0x00, 0xFD, 0x00, 0xF9, 0x80, + 0xFC, 0x00, 0x04, 0x80, 0x07, 0x00, 0x04, 0x00, 0x03, 0x00, 0x0A, 0x80, + 0x0A, 0x80, 0x09, 0x80, 0x07, 0x80, 0x07, 0x80, 0x0B, 0x00, 0x0D, 0x80, + 0x08, 0x00, 0x03, 0x00, 0xFE, 0x00, 0xFF, 0x00, 0x01, 0x80, 0xFF, 0x00, + 0xF6, 0x80, 0xF1, 0x00, 0xED, 0x80, 0xE8, 0x00, 0xE4, 0x00, 0xE0, 0x00, + 0xDF, 0x80, 0xDD, 0x00, 0xD7, 0x80, 0xD0, 0x80, 0xCE, 0x00, 0xD7, 0x00, + 0xDF, 0x00, 0xD8, 0x80, 0xCF, 0x00, 0xCF, 0x80, 0xE0, 0x00, 0xED, 0x00, + 0xE9, 0x80, 0xE0, 0x00, 0xE2, 0x80, 0xF5, 0x80, 0x05, 0x00, 0x04, 0x00, + 0x05, 0x80, 0x06, 0x80, 0x03, 0x00, 0xFD, 0x80, 0x02, 0x00, 0x07, 0x80, + 0x07, 0x80, 0x05, 0x00, 0x04, 0x80, 0x0A, 0x80, 0x07, 0x80, 0x03, 0x80, + 0x03, 0x00, 0x0C, 0x00, 0x10, 0x80, 0x07, 0x80, 0x00, 0x00, 0x01, 0x00, + 0x0E, 0x00, 0x0E, 0x00, 0x04, 0x80, 0x00, 0x00, 0x04, 0x80, 0x0C, 0x80, + 0x04, 0x80, 0xFE, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x08, 0x00, 0xFA, 0x80, + 0xF3, 0x80, 0xFA, 0x00, 0x06, 0x00, 0x03, 0x80, 0xF3, 0x00, 0xE9, 0x00, + 0xEE, 0x00, 0xFC, 0x80, 0xFA, 0x80, 0xEB, 0x00, 0xE0, 0x80, 0xE7, 0x00, + 0xF3, 0x80, 0xEC, 0x00, 0xDD, 0x00, 0xD6, 0x80, 0xE5, 0x00, 0xEF, 0x00, + 0xE6, 0x00, 0xD2, 0x80, 0xD0, 0x80, 0xE5, 0x00, 0xF5, 0x00, 0xEA, 0x00, + 0xD5, 0x80, 0xD4, 0x80, 0xEC, 0x00, 0xFD, 0x80, 0xF6, 0x00, 0xE5, 0x80, + 0xE4, 0x80, 0xFA, 0x00, 0x09, 0x00, 0x08, 0x00, 0x06, 0x00, 0x09, 0x80, + 0x03, 0x80, 0xFC, 0x80, 0xFF, 0x80, 0x06, 0x80, 0x0A, 0x80, 0x07, 0x00, + 0x05, 0x00, 0x09, 0x80, 0x0A, 0x00, 0x05, 0x00, 0x03, 0x00, 0x0E, 0x00, + 0x16, 0x80, 0x0D, 0x00, 0x00, 0x00, 0xFD, 0x80, 0x0C, 0x00, 0x14, 0x00, + 0x0D, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x08, 0x80, 0x0A, 0x00, 0x04, 0x80, + 0x02, 0x80, 0x07, 0x00, 0x03, 0x00, 0xFA, 0x80, 0xF5, 0x00, 0xFA, 0x80, + 0x02, 0x00, 0x01, 0x00, 0xF3, 0x00, 0xEA, 0x00, 0xEA, 0x00, 0xF3, 0x80, + 0xF5, 0x80, 0xEC, 0x00, 0xE1, 0x80, 0xE3, 0x00, 0xE9, 0x00, 0xE4, 0x00, + 0xDB, 0x00, 0xD8, 0x00, 0xE2, 0x80, 0xE7, 0x80, 0xDE, 0x80, 0xCE, 0x80, + 0xCF, 0x00, 0xE2, 0x00, 0xF1, 0x00, 0xE7, 0x00, 0xD3, 0x00, 0xD2, 0x00, + 0xE9, 0x80, 0xFD, 0x00, 0xF5, 0x00, 0xE3, 0x00, 0xE1, 0x80, 0xF9, 0x00, + 0x0C, 0x80, 0x09, 0x00, 0x00, 0x80, 0x01, 0x80, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x80, 0x01, 0x80, 0x03, 0x00, 0x02, 0x80, 0x01, 0x80, 0x02, 0x80, + 0x01, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0xFC, 0x00, + 0xF8, 0x80, 0xF5, 0x80, 0xF5, 0x00, 0xF4, 0x80, 0xF2, 0x80, 0xF2, 0x00, + 0xF2, 0x00, 0xF4, 0x80, 0xF7, 0x80, 0xF9, 0x80, 0xFD, 0x80, 0x01, 0x80, + 0x03, 0x80, 0x07, 0x80, 0x0B, 0x00, 0x10, 0x00, 0x13, 0x80, 0x14, 0x00, + 0x14, 0x00, 0x12, 0x80, 0x10, 0x00, 0x0E, 0x00, 0x0A, 0x00, 0x04, 0x00, + 0xFB, 0x80, 0xF3, 0x00, 0xEA, 0x80, 0xE1, 0x80, 0xDA, 0x80, 0xD2, 0x00, + 0xCC, 0x00, 0xC6, 0x80, 0xC3, 0x00, 0xC2, 0x80, 0xC1, 0x80, 0xC4, 0x80, + 0xC9, 0x80, 0xCC, 0x00, 0xD1, 0x00, 0xD4, 0x80, 0xDC, 0x80, 0xE4, 0x00, + 0xE7, 0x80, 0xEC, 0x00, 0xEF, 0x00, 0xF7, 0x00, 0xFD, 0x00, 0xFF, 0x80, + 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x80, 0x01, 0x00, + 0x01, 0x80, 0x00, 0x80, 0x00, 0x00, 0x01, 0x80, 0x01, 0x00, 0xFF, 0x80, + 0xFD, 0x80, 0xFE, 0x00, 0xFE, 0x00, 0xFA, 0x80, 0xF6, 0x00, 0xF3, 0x80, + 0xF3, 0x80, 0xF4, 0x00, 0xF3, 0x00, 0xF1, 0x80, 0xF1, 0x80, 0xF4, 0x80, + 0xF7, 0x80, 0xFA, 0x00, 0xFD, 0x80, 0x02, 0x00, 0x05, 0x80, 0x09, 0x00, + 0x0C, 0x00, 0x10, 0x80, 0x15, 0x00, 0x16, 0x80, 0x15, 0x80, 0x13, 0x80, + 0x11, 0x80, 0x0F, 0x80, 0x0A, 0x80, 0x03, 0x80, 0xFC, 0x80, 0xF5, 0x00, + 0xEC, 0x00, 0xE2, 0x80, 0xDA, 0x80, 0xD3, 0x80, 0xCE, 0x00, 0xC8, 0x80, + 0xC2, 0x80, 0xC0, 0x80, 0xC1, 0x00, 0xC4, 0x80, 0xC7, 0x00, 0xC9, 0x00, + 0xCD, 0x00, 0xD3, 0x00, 0xDA, 0x80, 0xE0, 0x80, 0xE5, 0x00, 0xEA, 0x00, + 0xEF, 0x80, 0xF5, 0x80, 0xFA, 0x80, 0xFE, 0x80, 0x01, 0x00, 0x02, 0x00, + 0x03, 0x80, 0x04, 0x00, 0x05, 0x80, 0x06, 0x00, 0x06, 0x80, 0x07, 0x00, + 0x06, 0x80, 0x07, 0x00, 0x07, 0x00, 0x07, 0x80, 0x06, 0x80, 0x07, 0x00, + 0x06, 0x80, 0x05, 0x00, 0x04, 0x00, 0x03, 0x00, 0x02, 0x00, 0x01, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, + 0xFF, 0x00, 0xFF, 0x00, 0xFD, 0x00, 0xFC, 0x00, 0xFC, 0x80, 0xFC, 0x00, + 0xFB, 0x00, 0xFA, 0x00, 0xF7, 0x00, 0xF6, 0x00, 0xF3, 0x00, 0xF0, 0x80, + 0xEE, 0x00, 0xEA, 0x00, 0xE4, 0x80, 0xE0, 0x80, 0xDB, 0x80, 0xD6, 0x00, + 0xD2, 0x00, 0xCE, 0x00, 0xCA, 0x80, 0xC7, 0x00, 0xC4, 0x80, 0xC3, 0x00, + 0xC3, 0x00, 0xC4, 0x80, 0xC7, 0x00, 0xC9, 0x00, 0xCB, 0x80, 0xCF, 0x00, + 0xD4, 0x80, 0xD9, 0x80, 0xDF, 0x00, 0xE4, 0x80, 0xE9, 0x80, 0xF1, 0x80, + 0xF7, 0x80, 0xFD, 0x80, 0x01, 0x00, 0x01, 0x80, 0x02, 0x80, 0x03, 0x00, + 0x04, 0x00, 0x04, 0x80, 0x05, 0x80, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, + 0x05, 0x80, 0x05, 0x80, 0x04, 0x80, 0x05, 0x00, 0x05, 0x00, 0x03, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x80, + 0xFF, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0xFF, 0x80, 0xFF, 0x00, 0xFF, 0x80, 0xFE, 0x80, 0xFD, 0x80, 0xFC, 0x80, + 0xF9, 0x80, 0xF7, 0x80, 0xF4, 0x00, 0xF1, 0x00, 0xEE, 0x00, 0xEB, 0x00, + 0xE5, 0x00, 0xE0, 0x80, 0xDB, 0x80, 0xD5, 0x80, 0xD1, 0x80, 0xCD, 0x80, + 0xCA, 0x00, 0xC7, 0x00, 0xC5, 0x00, 0xC3, 0x80, 0xC4, 0x00, 0xC5, 0x80, + 0xC8, 0x00, 0xCA, 0x80, 0xCD, 0x80, 0xD1, 0x00, 0xD7, 0x00, 0xDB, 0x80, + 0xDF, 0x80, 0xE5, 0x80, 0xEA, 0x80, 0xF2, 0x00, 0xF8, 0x00, 0xFD, 0x80, + 0x01, 0x00, 0x25, 0x80, 0x39, 0x80, 0x38, 0x00, 0x22, 0x00, 0x03, 0x80, + 0xE9, 0x00, 0xD9, 0x80, 0xDB, 0x00, 0xEA, 0x00, 0x01, 0x00, 0x19, 0x00, + 0x2A, 0x80, 0x2C, 0x80, 0x22, 0x00, 0x0D, 0x00, 0xFA, 0x00, 0xEE, 0x80, + 0xEF, 0x00, 0xF8, 0x80, 0x06, 0x00, 0x13, 0x80, 0x1D, 0x80, 0x1E, 0x00, + 0x18, 0x80, 0x0C, 0x80, 0x01, 0x00, 0xF9, 0x00, 0xFA, 0x80, 0x01, 0x80, + 0x0B, 0x00, 0x13, 0x00, 0x17, 0x00, 0x15, 0x00, 0x0E, 0x00, 0x03, 0x00, + 0xFC, 0x80, 0xF9, 0x00, 0xFA, 0x80, 0x02, 0x00, 0x0B, 0x00, 0x12, 0x00, + 0x14, 0x80, 0x10, 0x80, 0x08, 0x80, 0xFF, 0x80, 0xF8, 0x80, 0xF6, 0x00, + 0xF8, 0x00, 0x00, 0x00, 0x09, 0x00, 0x0E, 0x80, 0x10, 0x00, 0x0D, 0x00, + 0x04, 0x80, 0xFA, 0x80, 0xF6, 0x80, 0xF3, 0x80, 0xF9, 0x00, 0xFE, 0x80, + 0x05, 0x80, 0x09, 0x80, 0x0A, 0x00, 0x07, 0x00, 0x00, 0x80, 0x1D, 0x00, + 0x2E, 0x80, 0x31, 0x80, 0x28, 0x80, 0x16, 0x00, 0x03, 0x00, 0xF1, 0x80, + 0xE9, 0x00, 0xE4, 0x80, 0xEC, 0x00, 0xF6, 0x80, 0x07, 0x00, 0x14, 0x00, + 0x1C, 0x00, 0x1C, 0x00, 0x15, 0x00, 0x09, 0x80, 0xFC, 0x80, 0xF0, 0x80, + 0xEC, 0x00, 0xED, 0x80, 0xF3, 0x80, 0xFD, 0x80, 0x0A, 0x80, 0x13, 0x00, + 0x15, 0x00, 0x12, 0x00, 0x0B, 0x80, 0x01, 0x80, 0xF8, 0x00, 0xF1, 0x80, + 0xF0, 0x80, 0xF5, 0x80, 0xFC, 0x00, 0x04, 0x00, 0x0A, 0x80, 0x0D, 0x00, + 0x0C, 0x00, 0x0A, 0x00, 0x04, 0x80, 0xFE, 0x80, 0xFD, 0x00, 0xF8, 0x80, + 0xF9, 0x80, 0xFC, 0x80, 0xFE, 0x80, 0x02, 0x00, 0x04, 0x00, 0x05, 0x80, + 0x05, 0x80, 0x05, 0x80, 0x04, 0x80, 0xFF, 0x00, 0xFB, 0x00, 0xFA, 0x80, + 0xFB, 0x00, 0xFC, 0x00, 0xFF, 0x80, 0x02, 0x80, 0x05, 0x00, 0x07, 0x80, + 0x06, 0x80, 0x03, 0x80, 0x01, 0x00, 0x1A, 0x00, 0x2D, 0x00, 0x36, 0x80, + 0x36, 0x80, 0x2E, 0x00, 0x1F, 0x00, 0x0D, 0x80, 0xFB, 0x00, 0xEC, 0x80, + 0xE1, 0x80, 0xDE, 0x80, 0xE3, 0x00, 0xEC, 0x80, 0xFA, 0x80, 0x09, 0x80, + 0x16, 0x80, 0x1F, 0x00, 0x21, 0x80, 0x1F, 0x00, 0x16, 0x80, 0x0C, 0x00, + 0x00, 0x80, 0xF4, 0x80, 0xEE, 0x00, 0xEB, 0x00, 0xED, 0x00, 0xF2, 0x80, + 0xFC, 0x00, 0x06, 0x80, 0x0D, 0x80, 0x13, 0x80, 0x16, 0x80, 0x14, 0x00, + 0x0D, 0x80, 0x06, 0x80, 0xFD, 0x80, 0xF5, 0x80, 0xF2, 0x80, 0xF2, 0x80, + 0xF5, 0x00, 0xFA, 0x00, 0xFF, 0x80, 0x06, 0x00, 0x0B, 0x80, 0x0D, 0x80, + 0x0E, 0x80, 0x0C, 0x80, 0x08, 0x00, 0x03, 0x00, 0xFD, 0x80, 0xFA, 0x80, + 0xF8, 0x00, 0xF7, 0x00, 0xF7, 0x80, 0xFA, 0x00, 0xFD, 0x00, 0x03, 0x00, + 0x08, 0x00, 0x07, 0x80, 0x08, 0x80, 0x06, 0x00, 0x03, 0x80, 0x00, 0x80, + 0x01, 0x80, 0x10, 0x00, 0x1A, 0x80, 0x26, 0x00, 0x2E, 0x80, 0x34, 0x80, + 0x38, 0x80, 0x39, 0x00, 0x38, 0x00, 0x35, 0x80, 0x30, 0x80, 0x2B, 0x00, + 0x25, 0x80, 0x1F, 0x80, 0x1B, 0x00, 0x17, 0x00, 0x13, 0x80, 0x11, 0x00, + 0x10, 0x80, 0x10, 0x00, 0x11, 0x00, 0x12, 0x80, 0x13, 0x80, 0x15, 0x00, + 0x16, 0x80, 0x15, 0x80, 0x14, 0x80, 0x13, 0x00, 0x10, 0x00, 0x0C, 0x80, + 0x09, 0x00, 0x04, 0x00, 0x00, 0x00, 0xFC, 0x00, 0xF8, 0x00, 0xF5, 0x80, + 0xF5, 0x80, 0xF5, 0x80, 0xF8, 0x80, 0xFB, 0x80, 0x01, 0x80, 0x07, 0x80, + 0x0E, 0x80, 0x14, 0x00, 0x19, 0x80, 0x1E, 0x00, 0x21, 0x80, 0x22, 0x80, + 0x22, 0x80, 0x1F, 0x00, 0x1B, 0x80, 0x16, 0x00, 0x10, 0x00, 0x0A, 0x80, + 0x04, 0x00, 0xFE, 0x80, 0xF8, 0x80, 0xF6, 0x80, 0xF4, 0x80, 0xF3, 0x80, + 0xF4, 0x80, 0xF6, 0x80, 0xF8, 0x80, 0xFC, 0x00, 0x01, 0x80, 0x12, 0x00, + 0x1F, 0x80, 0x2C, 0x00, 0x34, 0x80, 0x39, 0x80, 0x3B, 0x00, 0x37, 0x80, + 0x33, 0x80, 0x2B, 0x00, 0x21, 0x00, 0x17, 0x00, 0x0D, 0x00, 0x00, 0x80, + 0xF7, 0x00, 0xEF, 0x80, 0xE9, 0x80, 0xE4, 0x80, 0xE4, 0x80, 0xE5, 0x00, + 0xE9, 0x80, 0xEE, 0x80, 0xF5, 0x80, 0xFC, 0x80, 0x05, 0x00, 0x0C, 0x80, + 0x11, 0x80, 0x17, 0x00, 0x1C, 0x00, 0x1D, 0x80, 0x1E, 0x00, 0x1E, 0x80, + 0x1C, 0x80, 0x19, 0x00, 0x14, 0x80, 0x10, 0x00, 0x0C, 0x00, 0x06, 0x80, + 0x03, 0x00, 0xFF, 0x80, 0xFD, 0x00, 0xFB, 0x80, 0xFA, 0x80, 0xFB, 0x00, + 0xFB, 0x80, 0xFD, 0x00, 0xFE, 0x80, 0x02, 0x00, 0x04, 0x80, 0x06, 0x00, + 0x08, 0x00, 0x09, 0x00, 0x09, 0x80, 0x08, 0x80, 0x08, 0x00, 0x06, 0x00, + 0x05, 0x80, 0x04, 0x80, 0x03, 0x80, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x0D, 0x00, 0x17, 0x80, 0x1F, 0x00, + 0x27, 0x00, 0x2B, 0x80, 0x2D, 0x80, 0x2D, 0x80, 0x2D, 0x00, 0x29, 0x00, + 0x24, 0x80, 0x1F, 0x00, 0x18, 0x80, 0x12, 0x00, 0x0C, 0x00, 0x06, 0x00, + 0xFF, 0x00, 0xF9, 0x00, 0xF4, 0x00, 0xF1, 0x00, 0xEF, 0x80, 0xF0, 0x00, + 0xF1, 0x00, 0xF5, 0x00, 0xF8, 0x00, 0xFD, 0x80, 0x01, 0x80, 0x06, 0x00, + 0x09, 0x80, 0x0C, 0x80, 0x0E, 0x80, 0x0F, 0x00, 0x10, 0x00, 0x10, 0x00, + 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x0F, 0x80, 0x0F, 0x00, + 0x0D, 0x80, 0x0C, 0x80, 0x0B, 0x00, 0x09, 0x00, 0x08, 0x80, 0x07, 0x80, + 0x06, 0x80, 0x06, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x80, 0x01, 0x00, + 0xFF, 0x00, 0xFD, 0x80, 0xFC, 0x80, 0xF9, 0x80, 0xF8, 0x80, 0xF8, 0x00, + 0xF8, 0x80, 0xF8, 0x80, 0xF8, 0x80, 0xFA, 0x80, 0xFC, 0x80, 0xFD, 0x80, + 0x01, 0x80, 0x09, 0x00, 0x0F, 0x80, 0x15, 0x80, 0x1A, 0x80, 0x21, 0x00, + 0x26, 0x00, 0x2A, 0x00, 0x2E, 0x00, 0x31, 0x00, 0x34, 0x00, 0x35, 0x80, + 0x37, 0x00, 0x37, 0x00, 0x37, 0x00, 0x37, 0x00, 0x35, 0x80, 0x33, 0x00, + 0x31, 0x00, 0x2F, 0x00, 0x2C, 0x80, 0x2A, 0x00, 0x26, 0x80, 0x24, 0x00, + 0x21, 0x00, 0x1E, 0x00, 0x1B, 0x80, 0x19, 0x00, 0x16, 0x00, 0x13, 0x80, + 0x12, 0x80, 0x10, 0x00, 0x0F, 0x00, 0x0D, 0x80, 0x0C, 0x00, 0x0B, 0x80, + 0x0A, 0x80, 0x09, 0x00, 0x08, 0x80, 0x07, 0x80, 0x07, 0x00, 0x06, 0x00, + 0x05, 0x80, 0x04, 0x00, 0x03, 0x80, 0x02, 0x00, 0x01, 0x80, 0x00, 0x80, + 0x00, 0x80, 0xFF, 0x00, 0xFE, 0x00, 0xFD, 0x80, 0xFD, 0x80, 0xFC, 0x80, + 0xFC, 0x00, 0xFB, 0x80, 0xFB, 0x00, 0xFC, 0x00, 0xFC, 0x80, 0xFD, 0x00, + 0xFD, 0x80, 0xFE, 0x00, 0xFE, 0x00, 0xFF, 0x00, 0x01, 0x00, 0x06, 0x80, + 0x0B, 0x80, 0x0F, 0x00, 0x13, 0x80, 0x17, 0x80, 0x1B, 0x00, 0x1F, 0x80, + 0x21, 0x80, 0x24, 0x80, 0x25, 0x80, 0x27, 0x80, 0x29, 0x00, 0x29, 0x80, + 0x29, 0x00, 0x29, 0x80, 0x28, 0x00, 0x26, 0x80, 0x25, 0x80, 0x23, 0x00, + 0x20, 0x80, 0x1E, 0x80, 0x1B, 0x80, 0x18, 0x80, 0x16, 0x00, 0x12, 0x00, + 0x0F, 0x80, 0x0C, 0x80, 0x08, 0x80, 0x05, 0x80, 0x03, 0x80, 0x00, 0x80, + 0xFD, 0x80, 0xFB, 0x00, 0xF8, 0x80, 0xF6, 0x80, 0xF5, 0x00, 0xF2, 0x00, + 0xF1, 0x00, 0xF0, 0x00, 0xEF, 0x00, 0xEE, 0x00, 0xED, 0x80, 0xEC, 0x80, + 0xEC, 0x80, 0xEC, 0x00, 0xEC, 0x00, 0xEC, 0x00, 0xEC, 0x80, 0xEC, 0x80, + 0xED, 0x00, 0xED, 0x80, 0xEE, 0x80, 0xEF, 0x00, 0xF0, 0x80, 0xF1, 0x80, + 0xF2, 0x80, 0xF4, 0x00, 0xF5, 0x80, 0xF7, 0x80, 0xF9, 0x00, 0xFB, 0x80, + 0xFC, 0x80, 0xFE, 0x00, 0x01, 0x80, 0x06, 0x00, 0x0B, 0x80, 0x0F, 0x80, + 0x13, 0x00, 0x17, 0x00, 0x1B, 0x80, 0x1F, 0x00, 0x22, 0x80, 0x26, 0x00, + 0x29, 0x00, 0x2C, 0x00, 0x2E, 0x80, 0x30, 0x80, 0x33, 0x00, 0x34, 0x80, + 0x35, 0x80, 0x37, 0x00, 0x37, 0x80, 0x38, 0x80, 0x38, 0x00, 0x38, 0x80, + 0x37, 0x80, 0x38, 0x00, 0x37, 0x00, 0x36, 0x00, 0x34, 0x80, 0x33, 0x00, + 0x32, 0x00, 0x30, 0x80, 0x2F, 0x80, 0x2D, 0x80, 0x2B, 0x80, 0x29, 0x80, + 0x27, 0x00, 0x25, 0x80, 0x23, 0x80, 0x21, 0x80, 0x1F, 0x80, 0x1D, 0x80, + 0x1B, 0x80, 0x19, 0x80, 0x18, 0x80, 0x15, 0x80, 0x15, 0x00, 0x13, 0x80, + 0x11, 0x80, 0x10, 0x00, 0x0F, 0x00, 0x0E, 0x00, 0x0C, 0x80, 0x0B, 0x80, + 0x0A, 0x00, 0x09, 0x00, 0x08, 0x00, 0x07, 0x80, 0x05, 0x80, 0x05, 0x00, + 0x04, 0x80, 0x03, 0x80, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x06, 0x00, 0x0A, 0x80, 0x0E, 0x00, 0x12, 0x00, 0x15, 0x00, + 0x19, 0x00, 0x1D, 0x00, 0x20, 0x00, 0x23, 0x80, 0x27, 0x00, 0x2A, 0x00, + 0x2C, 0x80, 0x2F, 0x80, 0x31, 0x80, 0x34, 0x00, 0x36, 0x00, 0x38, 0x00, + 0x38, 0x80, 0x3A, 0x00, 0x3B, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x3D, 0x00, + 0x3D, 0x00, 0x3D, 0x80, 0x3C, 0x80, 0x3C, 0x80, 0x3C, 0x00, 0x3A, 0x80, + 0x3A, 0x00, 0x38, 0x80, 0x37, 0x00, 0x36, 0x00, 0x34, 0x00, 0x33, 0x00, + 0x31, 0x00, 0x2F, 0x80, 0x2D, 0x80, 0x2B, 0x00, 0x29, 0x00, 0x27, 0x00, + 0x25, 0x80, 0x23, 0x00, 0x21, 0x00, 0x1F, 0x00, 0x1E, 0x00, 0x1B, 0x80, + 0x19, 0x80, 0x17, 0x80, 0x15, 0x80, 0x13, 0x00, 0x12, 0x00, 0x10, 0x00, + 0x0E, 0x80, 0x0C, 0x80, 0x0B, 0x00, 0x09, 0x00, 0x08, 0x00, 0x07, 0x00, + 0x05, 0x00, 0x04, 0x00, 0x01, 0x80, 0x00, 0x80, 0x08, 0x00, 0x07, 0x00, + 0x0B, 0x00, 0x00, 0x00, 0x09, 0x80, 0x07, 0x80, 0x12, 0x80, 0x00, 0x00, + 0xED, 0x80, 0xED, 0x80, 0xFF, 0x00, 0x05, 0x80, 0x03, 0x80, 0xFE, 0x80, + 0x07, 0x80, 0x05, 0x80, 0x04, 0x00, 0xF9, 0x00, 0xF1, 0x80, 0xEA, 0x80, + 0xEF, 0x80, 0xF5, 0x80, 0xFF, 0x00, 0x00, 0x00, 0xFE, 0x80, 0x01, 0x00, + 0x0F, 0x80, 0x13, 0x00, 0xFE, 0x80, 0xF1, 0x00, 0xFE, 0x80, 0x10, 0x00, + 0x11, 0x80, 0x02, 0x80, 0xF3, 0x00, 0xFB, 0x00, 0xFA, 0x80, 0xF7, 0x80, + 0xF6, 0x80, 0xF6, 0x00, 0xF3, 0x80, 0xFD, 0x00, 0xF5, 0x80, 0xEC, 0x80, + 0xDF, 0x80, 0xD9, 0x80, 0xE0, 0x80, 0xE2, 0x00, 0xD8, 0x00, 0xD3, 0x80, + 0xD1, 0x80, 0xEC, 0x80, 0xF7, 0x80, 0xEF, 0x00, 0xE5, 0x00, 0xE8, 0x00, + 0xF8, 0x00, 0x03, 0x00, 0xEE, 0x80, 0xE8, 0x80, 0xE5, 0x80, 0x01, 0x80, + 0x0A, 0x00, 0x07, 0x00, 0x01, 0x80, 0x04, 0x80, 0x08, 0x00, 0x0B, 0x00, + 0x0E, 0x00, 0x10, 0x00, 0x12, 0x00, 0x15, 0x00, 0x17, 0x80, 0x1A, 0x80, + 0x1D, 0x80, 0x20, 0x00, 0x22, 0x80, 0x25, 0x00, 0x27, 0x80, 0x2A, 0x00, + 0x2C, 0x00, 0x2E, 0x00, 0x2F, 0x00, 0x30, 0x00, 0x31, 0x80, 0x33, 0x80, + 0x34, 0x80, 0x36, 0x00, 0x37, 0x00, 0x38, 0x80, 0x39, 0x00, 0x3A, 0x00, + 0x3A, 0x80, 0x3B, 0x00, 0x3B, 0x80, 0x3B, 0x80, 0x3B, 0x80, 0x3B, 0x80, + 0x3B, 0x00, 0x3A, 0x80, 0x3A, 0x00, 0x39, 0x00, 0x38, 0x80, 0x37, 0x00, + 0x36, 0x00, 0x34, 0x80, 0x33, 0x80, 0x31, 0x80, 0x30, 0x00, 0x2F, 0x00, + 0x2E, 0x00, 0x2C, 0x00, 0x2A, 0x00, 0x27, 0x80, 0x25, 0x00, 0x22, 0x80, + 0x20, 0x00, 0x1D, 0x80, 0x1A, 0x80, 0x17, 0x80, 0x15, 0x00, 0x12, 0x00, + 0x10, 0x00, 0x0E, 0x00, 0x0B, 0x00, 0x08, 0x00, 0x04, 0x80, 0x01, 0x80, + 0x01, 0x80, 0x0C, 0x00, 0x16, 0x00, 0x1E, 0x00, 0x23, 0x80, 0x27, 0x00, + 0x27, 0x00, 0x24, 0x00, 0x1F, 0x00, 0x17, 0x00, 0x0F, 0x00, 0x05, 0x80, + 0xFC, 0x80, 0xF4, 0x80, 0xEF, 0x80, 0xEC, 0x80, 0xEB, 0x80, 0xED, 0x80, + 0xF2, 0x80, 0xF9, 0x80, 0x03, 0x00, 0x0D, 0x80, 0x17, 0x80, 0x21, 0x00, + 0x2A, 0x00, 0x2F, 0x80, 0x32, 0x80, 0x33, 0x80, 0x30, 0x80, 0x2C, 0x00, + 0x24, 0x80, 0x1B, 0x00, 0x11, 0x00, 0x08, 0x00, 0xFE, 0x00, 0xF7, 0x00, + 0xF2, 0x00, 0xEF, 0x80, 0xF0, 0x80, 0xF3, 0x00, 0xF8, 0x80, 0x00, 0x80, + 0x0A, 0x00, 0x13, 0x80, 0x1C, 0x80, 0x25, 0x00, 0x2A, 0x80, 0x2E, 0x00, + 0x2F, 0x00, 0x2C, 0x80, 0x27, 0x00, 0x1F, 0x80, 0x16, 0x00, 0x0B, 0x80, + 0x00, 0x00, 0xF6, 0x80, 0xED, 0x80, 0xE7, 0x80, 0xE3, 0x80, 0xE2, 0x00, + 0xE4, 0x80, 0xE9, 0x00, 0xEF, 0x80, 0xF7, 0x80, 0x01, 0x80, 0x10, 0x00, + 0x1A, 0x80, 0x26, 0x00, 0x2E, 0x80, 0x34, 0x80, 0x38, 0x80, 0x39, 0x00, + 0x38, 0x00, 0x35, 0x80, 0x30, 0x80, 0x2B, 0x00, 0x25, 0x80, 0x1F, 0x80, + 0x1B, 0x00, 0x17, 0x00, 0x13, 0x80, 0x11, 0x00, 0x10, 0x80, 0x10, 0x00, + 0x11, 0x00, 0x12, 0x80, 0x13, 0x80, 0x15, 0x00, 0x16, 0x80, 0x15, 0x80, + 0x14, 0x80, 0x13, 0x00, 0x10, 0x00, 0x0C, 0x80, 0x09, 0x00, 0x04, 0x00, + 0x00, 0x00, 0xFC, 0x00, 0xF8, 0x00, 0xF5, 0x80, 0xF5, 0x80, 0xF5, 0x80, + 0xF8, 0x80, 0xFB, 0x80, 0x01, 0x80, 0x07, 0x80, 0x0E, 0x80, 0x14, 0x00, + 0x19, 0x80, 0x1E, 0x00, 0x21, 0x80, 0x22, 0x80, 0x22, 0x80, 0x1F, 0x00, + 0x1B, 0x80, 0x16, 0x00, 0x10, 0x00, 0x0A, 0x80, 0x04, 0x00, 0xFE, 0x80, + 0xF8, 0x80, 0xF6, 0x80, 0xF4, 0x80, 0xF3, 0x80, 0xF4, 0x80, 0xF6, 0x80, + 0xF8, 0x80, 0xFC, 0x00, 0x00, 0x00, 0x24, 0x00, 0x37, 0x00, 0x39, 0x80, + 0x2F, 0x00, 0x20, 0x80, 0x16, 0x00, 0x12, 0x00, 0x12, 0x00, 0x16, 0x80, + 0x1A, 0x00, 0x1C, 0x80, 0x1A, 0x00, 0x1A, 0x00, 0x1E, 0x80, 0x21, 0x00, + 0x26, 0x80, 0x25, 0x00, 0x21, 0x80, 0x17, 0x80, 0x0E, 0x80, 0x05, 0x00, + 0x02, 0x00, 0x06, 0x00, 0x0B, 0x80, 0x0D, 0x80, 0x08, 0x80, 0xFC, 0x80, + 0xF2, 0x80, 0xEE, 0x00, 0xEE, 0x80, 0xF4, 0x80, 0xFF, 0x80, 0x0D, 0x80, + 0x13, 0x00, 0x10, 0x80, 0x09, 0x80, 0x02, 0x00, 0xFF, 0x80, 0x03, 0x80, + 0x0A, 0x80, 0x10, 0x80, 0x12, 0x00, 0x10, 0x80, 0x0A, 0x00, 0x01, 0x80, + 0xFB, 0x00, 0xF9, 0x80, 0xFB, 0x80, 0xFE, 0x80, 0x02, 0x80, 0x03, 0x80, + 0x06, 0x00, 0x09, 0x80, 0x0D, 0x00, 0x11, 0x00, 0x10, 0x00, 0x0A, 0x00, + 0xFC, 0x80, 0xED, 0x00, 0xE1, 0x80, 0xDF, 0x80, 0xE6, 0x00, 0xF2, 0x80, + 0x00, 0x00, 0x22, 0x00, 0x34, 0x00, 0x32, 0x80, 0x25, 0x00, 0x15, 0x00, + 0x09, 0x00, 0x04, 0x00, 0x05, 0x80, 0x0B, 0x80, 0x11, 0x00, 0x12, 0x00, + 0x0E, 0x00, 0x09, 0x00, 0x07, 0x00, 0x07, 0x80, 0x0B, 0x80, 0x10, 0x00, + 0x12, 0x80, 0x10, 0x80, 0x0B, 0x00, 0x05, 0x80, 0x01, 0x80, 0x03, 0x80, + 0x05, 0x80, 0x07, 0x00, 0x05, 0x80, 0x04, 0x00, 0xFF, 0x00, 0xFC, 0x00, + 0xFC, 0x00, 0xFE, 0x00, 0x02, 0x80, 0x05, 0x80, 0x03, 0x00, 0x02, 0x80, + 0x00, 0x00, 0xFD, 0x80, 0xFE, 0x80, 0x03, 0x80, 0x07, 0x80, 0x09, 0x00, + 0x06, 0x00, 0x02, 0x00, 0xFE, 0x80, 0xFE, 0x80, 0x01, 0x80, 0x05, 0x80, + 0x09, 0x00, 0x09, 0x80, 0x06, 0x80, 0x01, 0x00, 0xFF, 0x80, 0x01, 0x80, + 0x07, 0x00, 0x0C, 0x80, 0x10, 0x80, 0x0D, 0x00, 0x01, 0x80, 0xF0, 0x80, + 0xE1, 0x80, 0xDD, 0x00, 0xE3, 0x80, 0xF1, 0x80, 0x01, 0x80, 0x0D, 0x80, + 0x18, 0x80, 0x21, 0x80, 0x2A, 0x00, 0x31, 0x80, 0x37, 0x80, 0x3A, 0x80, + 0x3D, 0x00, 0x3D, 0x00, 0x3B, 0x80, 0x38, 0x80, 0x35, 0x80, 0x30, 0x00, + 0x2C, 0x00, 0x27, 0x00, 0x22, 0x00, 0x1D, 0x00, 0x18, 0x80, 0x14, 0x80, + 0x11, 0x00, 0x0E, 0x80, 0x0B, 0x80, 0x0A, 0x80, 0x08, 0x80, 0x06, 0x80, + 0x05, 0x00, 0x03, 0x80, 0x01, 0x80, 0xFF, 0x80, 0xFD, 0x00, 0xFA, 0x80, + 0xF9, 0x80, 0xF7, 0x00, 0xF4, 0x80, 0xF4, 0x00, 0xF3, 0x00, 0xF2, 0x00, + 0xF2, 0x00, 0xF2, 0x80, 0xF3, 0x80, 0xF5, 0x80, 0xF7, 0x80, 0xF9, 0x80, + 0xFC, 0x00, 0xFD, 0x80, 0x00, 0x00, 0x01, 0x00, 0x01, 0x80, 0x02, 0x80, + 0x03, 0x00, 0x02, 0x80, 0x02, 0x00, 0x01, 0x00, 0x00, 0x80, 0xFE, 0x00, + 0xFD, 0x80, 0xFC, 0x80, 0xFC, 0x80, 0xFC, 0x80, 0xFC, 0x80, 0xFE, 0x00, + 0xFD, 0x80, 0xFF, 0x80, 0x01, 0x80, 0x18, 0x00, 0x2A, 0x80, 0x37, 0x00, + 0x3C, 0x00, 0x3B, 0x80, 0x35, 0x00, 0x2D, 0x00, 0x24, 0x00, 0x1D, 0x00, + 0x1A, 0x00, 0x1A, 0x00, 0x1D, 0x00, 0x20, 0x00, 0x20, 0x80, 0x20, 0x80, + 0x1B, 0x00, 0x13, 0x80, 0x0A, 0x00, 0xFF, 0x80, 0xF7, 0x00, 0xF0, 0x00, + 0xED, 0x80, 0xEA, 0x80, 0xEC, 0x80, 0xEE, 0x80, 0xF0, 0x00, 0xF0, 0x80, + 0xF0, 0x80, 0xF0, 0x80, 0xF1, 0x80, 0xF1, 0x00, 0xF4, 0x80, 0xF7, 0x80, + 0xFC, 0x00, 0x02, 0x00, 0x05, 0x80, 0x09, 0x00, 0x0A, 0x80, 0x0A, 0x80, + 0x08, 0x80, 0x05, 0x80, 0x02, 0x80, 0xFE, 0x00, 0xFB, 0x00, 0xF8, 0x80, + 0xF6, 0x00, 0xF5, 0x00, 0xF5, 0x00, 0xF4, 0x00, 0xF4, 0x80, 0xF5, 0x00, + 0xF6, 0x80, 0xF5, 0x80, 0xF7, 0x00, 0xF7, 0x80, 0xF8, 0x00, 0xF9, 0x80, + 0xF9, 0x00, 0xFA, 0x00, 0xFA, 0x80, 0xFB, 0x80, 0xFC, 0x80, 0xFE, 0x80, + 0x02, 0x00, 0x16, 0x00, 0x27, 0x00, 0x31, 0x80, 0x34, 0x00, 0x2F, 0x80, + 0x25, 0x80, 0x19, 0x80, 0x0E, 0x80, 0x07, 0x00, 0x04, 0x80, 0x05, 0x80, + 0x0C, 0x00, 0x10, 0x00, 0x13, 0x80, 0x16, 0x00, 0x14, 0x80, 0x11, 0x00, + 0x0D, 0x00, 0x09, 0x00, 0x09, 0x80, 0x0B, 0x80, 0x10, 0x00, 0x15, 0x00, + 0x1A, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x17, 0x00, 0x0F, 0x80, 0x07, 0x00, + 0xFF, 0x80, 0xFA, 0x80, 0xFA, 0x00, 0xFD, 0x00, 0x02, 0x00, 0x08, 0x00, + 0x0D, 0x80, 0x10, 0x00, 0x0E, 0x00, 0x09, 0x80, 0x02, 0x80, 0xFC, 0x00, + 0xF6, 0x00, 0xF4, 0x00, 0xF6, 0x80, 0xFC, 0x00, 0x03, 0x80, 0x0E, 0x00, + 0x16, 0x80, 0x1B, 0x80, 0x1D, 0x80, 0x1C, 0x80, 0x17, 0x00, 0x10, 0x00, + 0x07, 0x00, 0xFF, 0x00, 0xF9, 0x80, 0xF6, 0x80, 0xF4, 0x80, 0xF5, 0x80, + 0xF7, 0x00, 0xF9, 0x00, 0xFB, 0x00, 0xFE, 0x00, 0x01, 0x80, 0x11, 0x80, + 0x21, 0x00, 0x2D, 0x00, 0x34, 0x80, 0x3A, 0x00, 0x3A, 0x80, 0x36, 0x80, + 0x30, 0x00, 0x27, 0x00, 0x1C, 0x80, 0x12, 0x00, 0x08, 0x00, 0xFF, 0x00, + 0xF8, 0x80, 0xF5, 0x00, 0xF3, 0x80, 0xF5, 0x80, 0xF8, 0x00, 0xFC, 0x80, + 0x02, 0x80, 0x08, 0x00, 0x0D, 0x00, 0x10, 0x80, 0x13, 0x00, 0x14, 0x00, + 0x14, 0x80, 0x13, 0x80, 0x11, 0x80, 0x11, 0x00, 0x0F, 0x00, 0x0F, 0x00, + 0x0E, 0x00, 0x10, 0x00, 0x10, 0x80, 0x12, 0x80, 0x14, 0x00, 0x15, 0x80, + 0x16, 0x00, 0x14, 0x00, 0x13, 0x00, 0x10, 0x00, 0x0D, 0x00, 0x06, 0x80, + 0x02, 0x00, 0xFC, 0x80, 0xF7, 0x80, 0xF5, 0x00, 0xF3, 0x00, 0xF3, 0x00, + 0xF6, 0x00, 0xFB, 0x00, 0x01, 0x00, 0x07, 0x80, 0x0E, 0x80, 0x14, 0x80, + 0x1A, 0x80, 0x1F, 0x00, 0x21, 0x00, 0x20, 0x80, 0x1D, 0x80, 0x18, 0x80, + 0x10, 0x80, 0x09, 0x00, 0x01, 0x00, 0x0B, 0x00, 0x13, 0x00, 0x1B, 0x80, + 0x22, 0x00, 0x27, 0x00, 0x29, 0x80, 0x2A, 0x00, 0x29, 0x80, 0x27, 0x80, + 0x24, 0x80, 0x1F, 0x00, 0x1A, 0x80, 0x14, 0x80, 0x0F, 0x00, 0x0A, 0x00, + 0x06, 0x00, 0x02, 0x00, 0xFF, 0x00, 0xFC, 0x80, 0xFB, 0x00, 0xFB, 0x00, + 0xFA, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFC, 0x80, 0xFE, 0x00, 0xFF, 0x00, + 0xFF, 0x80, 0x00, 0x80, 0x00, 0x80, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0xFE, 0x80, 0xFE, 0x00, 0xFC, 0x80, + 0xFC, 0x00, 0xFB, 0x00, 0xFB, 0x80, 0xFB, 0x00, 0xFC, 0x00, 0xFD, 0x80, + 0xFF, 0x80, 0x03, 0x00, 0x06, 0x00, 0x0B, 0x00, 0x10, 0x00, 0x15, 0x80, + 0x1A, 0x80, 0x20, 0x00, 0x24, 0x80, 0x27, 0x80, 0x29, 0x00, 0x29, 0x00, + 0x28, 0x80, 0x25, 0x00, 0x20, 0x00, 0x18, 0x80, 0x10, 0x80, 0x08, 0x00, + 0x01, 0x00, 0x07, 0x80, 0x0D, 0x00, 0x12, 0x80, 0x17, 0x80, 0x1C, 0x80, + 0x21, 0x80, 0x25, 0x80, 0x29, 0x00, 0x2C, 0x80, 0x2E, 0x80, 0x30, 0x80, + 0x31, 0x80, 0x33, 0x80, 0x33, 0x00, 0x33, 0x80, 0x32, 0x80, 0x31, 0x00, + 0x2F, 0x80, 0x2E, 0x00, 0x2B, 0x80, 0x28, 0x80, 0x25, 0x80, 0x22, 0x80, + 0x1F, 0x00, 0x1B, 0x80, 0x18, 0x00, 0x14, 0x80, 0x11, 0x80, 0x0E, 0x80, + 0x0C, 0x00, 0x08, 0x00, 0x06, 0x00, 0x03, 0x00, 0x00, 0x80, 0xFE, 0x80, + 0xFC, 0x80, 0xFB, 0x80, 0xF9, 0x80, 0xF7, 0x80, 0xF7, 0x00, 0xF6, 0x00, + 0xF6, 0x00, 0xF5, 0x80, 0xF5, 0x80, 0xF5, 0x80, 0xF4, 0x80, 0xF5, 0x00, + 0xF5, 0x00, 0xF5, 0x00, 0xF6, 0x80, 0xF6, 0x00, 0xF7, 0x00, 0xF7, 0x00, + 0xF8, 0x00, 0xF9, 0x00, 0xF9, 0x80, 0xFA, 0x80, 0xFB, 0x00, 0xFC, 0x80, + 0xFC, 0x80, 0xFD, 0x80, 0xFE, 0x00, 0xFF, 0x80, 0x01, 0x80, 0x0D, 0x80, + 0x19, 0x80, 0x23, 0x80, 0x2B, 0x00, 0x30, 0x80, 0x34, 0x80, 0x37, 0x00, + 0x35, 0x00, 0x33, 0x80, 0x30, 0x80, 0x2B, 0x80, 0x27, 0x00, 0x22, 0x80, + 0x1E, 0x80, 0x1B, 0x00, 0x17, 0x00, 0x14, 0x80, 0x12, 0x80, 0x11, 0x00, + 0x0F, 0x00, 0x0E, 0x80, 0x0C, 0x80, 0x09, 0x80, 0x06, 0x00, 0x03, 0x00, + 0xFF, 0x80, 0xFC, 0x00, 0xF8, 0x80, 0xF5, 0x80, 0xF3, 0x80, 0xF1, 0x00, + 0xF1, 0x80, 0xF3, 0x80, 0xF5, 0x00, 0xF8, 0x00, 0xFB, 0x00, 0xFF, 0x00, + 0x02, 0x00, 0x05, 0x80, 0x08, 0x00, 0x09, 0x00, 0x09, 0x80, 0x07, 0x80, + 0x06, 0x00, 0x03, 0x80, 0xFF, 0x80, 0xFD, 0x00, 0xF9, 0x00, 0xF7, 0x80, + 0xF5, 0x80, 0xF5, 0x80, 0xF5, 0x80, 0xF7, 0x00, 0xF9, 0x00, 0xFB, 0x80, + 0xFE, 0x00, 0x00, 0x00, 0x01, 0x80, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, + 0x03, 0x00, 0x02, 0x00, 0x01, 0x00, 0x0E, 0x80, 0x1A, 0x00, 0x24, 0x80, + 0x2C, 0x80, 0x33, 0x80, 0x37, 0x00, 0x39, 0x80, 0x38, 0x80, 0x34, 0x80, + 0x30, 0x00, 0x2A, 0x00, 0x21, 0x00, 0x19, 0x00, 0x10, 0x80, 0x09, 0x80, + 0x01, 0x80, 0xFB, 0x00, 0xF6, 0x00, 0xF4, 0x00, 0xF2, 0x80, 0xF2, 0x80, + 0xF4, 0x00, 0xF7, 0x00, 0xFA, 0x00, 0xFE, 0x80, 0x03, 0x00, 0x06, 0x80, + 0x09, 0x00, 0x0C, 0x80, 0x0D, 0x80, 0x0E, 0x00, 0x0E, 0x80, 0x0D, 0x00, + 0x0B, 0x00, 0x09, 0x00, 0x07, 0x00, 0x04, 0x80, 0x01, 0x00, 0xFF, 0x00, + 0xFD, 0x80, 0xFC, 0x80, 0xFB, 0x80, 0xFA, 0x80, 0xFB, 0x00, 0xFB, 0x80, + 0xFB, 0x80, 0xFD, 0x80, 0xFE, 0x80, 0xFE, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0x80, 0xFF, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0x00, 0x80, + 0x01, 0x80, 0x19, 0x80, 0x2C, 0x80, 0x38, 0x00, 0x3A, 0x00, 0x34, 0x00, + 0x28, 0x00, 0x18, 0x00, 0x0B, 0x00, 0x01, 0x00, 0xFE, 0x80, 0x02, 0x00, + 0x0D, 0x00, 0x19, 0x00, 0x27, 0x00, 0x2F, 0x00, 0x31, 0x80, 0x2D, 0x00, + 0x20, 0x80, 0x10, 0x80, 0x00, 0x00, 0xF0, 0x80, 0xE6, 0x80, 0xE3, 0x00, + 0xE6, 0x00, 0xEE, 0x00, 0xFA, 0x00, 0x06, 0x80, 0x10, 0x00, 0x16, 0x00, + 0x16, 0x80, 0x13, 0x80, 0x0D, 0x80, 0x05, 0x80, 0xFE, 0x00, 0xF8, 0x00, + 0xF6, 0x00, 0xF6, 0x80, 0xF9, 0x00, 0xFF, 0x00, 0x03, 0x80, 0x07, 0x80, + 0x0B, 0x00, 0x0B, 0x80, 0x0A, 0x80, 0x07, 0x00, 0x02, 0x80, 0xFF, 0x00, + 0xFC, 0x80, 0xF9, 0x80, 0xF9, 0x80, 0xF9, 0x00, 0xFB, 0x00, 0xFD, 0x80, + 0xFF, 0x80, 0x00, 0x80, 0x03, 0x80, 0x05, 0x00, 0x05, 0x80, 0x06, 0x00, + 0x06, 0x00, 0x04, 0x80, 0x04, 0x00, 0x02, 0x80, 0x01, 0x00, 0x23, 0x00, + 0x36, 0x00, 0x31, 0x80, 0x1B, 0x00, 0xFB, 0x00, 0xE2, 0x00, 0xDC, 0x00, + 0xEA, 0x00, 0x04, 0x80, 0x21, 0x80, 0x31, 0x80, 0x31, 0x80, 0x20, 0x80, + 0x0B, 0x00, 0xF6, 0x00, 0xEB, 0x00, 0xEE, 0x00, 0xF9, 0x00, 0x0A, 0x00, + 0x16, 0x00, 0x1C, 0x00, 0x15, 0x80, 0x0B, 0x00, 0xFD, 0x00, 0xF1, 0x80, + 0xEC, 0x80, 0xEE, 0x00, 0xF5, 0x00, 0xFF, 0x80, 0x07, 0x00, 0x0B, 0x00, + 0x08, 0x00, 0x00, 0x80, 0xF7, 0x00, 0xF2, 0x00, 0xF0, 0x80, 0xF3, 0x80, + 0xFB, 0x80, 0x02, 0x00, 0x06, 0x00, 0x06, 0x00, 0x03, 0x80, 0xFF, 0x00, + 0xFD, 0x00, 0xFD, 0x80, 0xFF, 0x80, 0x01, 0x80, 0x03, 0x80, 0x04, 0x80, + 0x04, 0x80, 0x02, 0x80, 0x02, 0x80, 0x04, 0x00, 0x03, 0x80, 0x03, 0x80, + 0x02, 0x80, 0x00, 0x80, 0x00, 0x00, 0x01, 0x00, 0x01, 0x80, 0x02, 0x80, + 0x03, 0x80, 0x02, 0x00, 0x01, 0x80, 0x0F, 0x00, 0x19, 0x00, 0x20, 0x80, + 0x21, 0x80, 0x1E, 0x00, 0x18, 0x80, 0x13, 0x00, 0x10, 0x00, 0x0E, 0x80, + 0x11, 0x80, 0x16, 0x80, 0x1C, 0x80, 0x21, 0x00, 0x22, 0x00, 0x1E, 0x00, + 0x15, 0x80, 0x0A, 0x00, 0xFE, 0x00, 0xF3, 0x80, 0xED, 0x00, 0xEC, 0x00, + 0xEE, 0x80, 0xF5, 0x00, 0xFD, 0x00, 0x05, 0x00, 0x09, 0x80, 0x0A, 0x00, + 0x07, 0x80, 0x04, 0x00, 0xFF, 0x80, 0xFE, 0x00, 0x00, 0x80, 0x08, 0x00, + 0x12, 0x00, 0x1E, 0x00, 0x29, 0x80, 0x31, 0x00, 0x34, 0x00, 0x31, 0x80, + 0x2C, 0x00, 0x21, 0x80, 0x19, 0x00, 0x11, 0x80, 0x0E, 0x00, 0x0D, 0x80, + 0x10, 0x00, 0x13, 0x00, 0x15, 0x80, 0x14, 0x00, 0x0F, 0x80, 0x06, 0x00, + 0xFA, 0x00, 0xEE, 0x80, 0xE5, 0x00, 0xDF, 0x80, 0xE0, 0x00, 0xE5, 0x80, + 0xED, 0x80, 0xF7, 0x00, 0x00, 0x00, 0x05, 0x80, 0x06, 0x80, 0x04, 0x80, + 0x01, 0x80, 0x2D, 0x80, 0x37, 0x00, 0x2B, 0x80, 0x28, 0x00, 0x2E, 0x00, + 0x29, 0x00, 0x1E, 0x00, 0x1C, 0x80, 0x20, 0x00, 0x1F, 0x00, 0x19, 0x80, + 0x19, 0x00, 0x18, 0x80, 0x13, 0x00, 0x0D, 0x00, 0x0E, 0x80, 0x10, 0x80, + 0x0F, 0x00, 0x0C, 0x80, 0x0E, 0x80, 0x0E, 0x00, 0x06, 0x00, 0x02, 0x80, + 0x06, 0x00, 0x06, 0x80, 0x02, 0x80, 0x06, 0x00, 0x11, 0x00, 0x0D, 0x80, + 0xF8, 0x80, 0xF3, 0x80, 0x0A, 0x00, 0x1F, 0x00, 0x18, 0x80, 0x04, 0x00, + 0x00, 0x80, 0x0A, 0x00, 0x0B, 0x00, 0x06, 0x00, 0x04, 0x80, 0x07, 0x80, + 0x03, 0x00, 0xFD, 0x00, 0xFC, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x08, 0x80, 0x06, 0x80, 0x02, 0x00, 0x04, 0x80, 0x05, 0x80, + 0x01, 0x80, 0x00, 0x80, 0x05, 0x00, 0x00, 0x80, 0xF4, 0x00, 0xED, 0x80, + 0xEF, 0x00, 0xE7, 0x80, 0xD7, 0x80, 0xDC, 0x80, 0x05, 0x00, 0x06, 0x80, + 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x80, 0x03, 0x00, 0x09, 0x00, 0x07, 0x00, + 0xF1, 0x80, 0xED, 0x80, 0x00, 0x00, 0x0A, 0x00, 0x03, 0x80, 0x08, 0x00, + 0x12, 0x80, 0x11, 0x80, 0x07, 0x80, 0xFF, 0x80, 0xF7, 0x00, 0xF5, 0x00, + 0xF7, 0x00, 0xF7, 0x80, 0xFC, 0x00, 0x07, 0x80, 0x0C, 0x00, 0x0B, 0x00, + 0x12, 0x00, 0x18, 0x00, 0x03, 0x80, 0xF2, 0x80, 0xFD, 0x80, 0x0B, 0x00, + 0x07, 0x00, 0xFD, 0x80, 0xF4, 0x80, 0xF7, 0x80, 0xF7, 0x00, 0xEE, 0x80, + 0xED, 0x00, 0xEC, 0x80, 0xEB, 0x00, 0xE7, 0x00, 0xDC, 0x80, 0xDB, 0x80, + 0xD8, 0x00, 0xC4, 0x80, 0xC4, 0x00, 0xC5, 0x00, 0xC7, 0x00, 0xC0, 0x80, + 0xC1, 0x00, 0xD8, 0x80, 0xE6, 0x00, 0xE0, 0x80, 0xDF, 0x00, 0xE1, 0x80, + 0xF2, 0x80, 0xF4, 0x00, 0xE3, 0x80, 0xE4, 0x00, 0xEB, 0x80, 0xFC, 0x80, + 0xFD, 0x80, 0xFC, 0x80, 0x04, 0x80, 0x05, 0x80, 0x09, 0x00, 0x05, 0x80, + 0x06, 0x00, 0xFD, 0x80, 0x06, 0x00, 0x02, 0x80, 0xF0, 0x80, 0xEF, 0x00, + 0x01, 0x80, 0x08, 0x00, 0x05, 0x00, 0x08, 0x80, 0x15, 0x00, 0x0E, 0x80, + 0x04, 0x80, 0x00, 0x00, 0xFA, 0x80, 0xF7, 0x80, 0xFB, 0x00, 0xF9, 0x00, + 0x00, 0x00, 0x0A, 0x80, 0x0B, 0x80, 0x07, 0x00, 0x0E, 0x80, 0x18, 0x00, + 0x04, 0x00, 0xF3, 0x00, 0xFF, 0x80, 0x0C, 0x80, 0x0B, 0x00, 0x03, 0x00, + 0xF7, 0x80, 0xF9, 0x00, 0xF7, 0x80, 0xF5, 0x80, 0xF5, 0x00, 0xF5, 0x00, + 0xF4, 0x00, 0xF0, 0x00, 0xE3, 0x00, 0xE2, 0x00, 0xDD, 0x00, 0xCB, 0x80, + 0xC7, 0x00, 0xC8, 0x80, 0xCC, 0x00, 0xCB, 0x00, 0xCD, 0x80, 0xE2, 0x00, + 0xEB, 0x80, 0xE7, 0x80, 0xE5, 0x80, 0xE7, 0x80, 0xF3, 0x00, 0xF6, 0x00, + 0xE4, 0x80, 0xE4, 0x80, 0xEC, 0x80, 0x01, 0x80, 0x01, 0x80, 0x00, 0x00, + 0x02, 0x80, 0x02, 0x00, 0x07, 0x80, 0x09, 0x80, 0x0B, 0x80, 0x02, 0x80, + 0x06, 0x80, 0x01, 0x00, 0xF4, 0x00, 0xF5, 0x00, 0x06, 0x00, 0x0B, 0x80, + 0x07, 0x80, 0x0B, 0x00, 0x16, 0x80, 0x10, 0x80, 0x07, 0x80, 0x01, 0x80, + 0xFF, 0x80, 0xFD, 0x80, 0xFF, 0x00, 0xFA, 0x80, 0x00, 0x80, 0x0C, 0x80, + 0x0E, 0x80, 0x07, 0x80, 0x0E, 0x80, 0x17, 0x80, 0x09, 0x80, 0xFB, 0x80, + 0x05, 0x80, 0x13, 0x00, 0x11, 0x00, 0x07, 0x80, 0xF9, 0x80, 0xF7, 0x00, + 0xF6, 0x80, 0xF8, 0x00, 0xFA, 0x80, 0xFC, 0x80, 0xF9, 0x80, 0xF2, 0x80, + 0xE4, 0x00, 0xE2, 0x80, 0xDF, 0x80, 0xCF, 0x00, 0xC8, 0x80, 0xCA, 0x00, + 0xCE, 0x80, 0xCF, 0x80, 0xD1, 0x80, 0xE7, 0x80, 0xF1, 0x80, 0xEB, 0x80, + 0xE5, 0x00, 0xE4, 0x80, 0xEF, 0x80, 0xF4, 0x80, 0xE7, 0x80, 0xEA, 0x80, + 0xF2, 0x00, 0x03, 0x80, 0x00, 0x80, 0xFF, 0x00, 0x03, 0x80, 0x07, 0x00, + 0x0A, 0x80, 0x0A, 0x00, 0x07, 0x80, 0xFB, 0x80, 0x01, 0x00, 0x01, 0x00, + 0xF3, 0x00, 0xF1, 0x00, 0xFE, 0x00, 0x05, 0x80, 0x06, 0x00, 0x0C, 0x80, + 0x16, 0x80, 0x0C, 0x80, 0x00, 0x80, 0xFC, 0x00, 0xF9, 0x00, 0xFB, 0x00, + 0xFD, 0x80, 0xF9, 0x00, 0xFD, 0x80, 0x07, 0x80, 0x0B, 0x80, 0x07, 0x00, + 0x0A, 0x00, 0x12, 0x80, 0x06, 0x80, 0xF9, 0x00, 0x01, 0x00, 0x0F, 0x00, + 0x0F, 0x00, 0x07, 0x00, 0xFD, 0x00, 0xFA, 0x80, 0xF5, 0x80, 0xF5, 0x00, + 0xF8, 0x80, 0xF9, 0x80, 0xF6, 0x80, 0xF3, 0x00, 0xE6, 0x00, 0xE2, 0x80, + 0xE0, 0x00, 0xD0, 0x80, 0xC7, 0x00, 0xC8, 0x00, 0xD0, 0x80, 0xD0, 0x80, + 0xD1, 0x80, 0xE4, 0x80, 0xED, 0x00, 0xE9, 0x00, 0xE7, 0x00, 0xE7, 0x80, + 0xEF, 0x80, 0xF2, 0x00, 0xE8, 0x00, 0xEA, 0x80, 0xF5, 0x80, 0x05, 0x80, + 0x02, 0x80, 0xFF, 0x00, 0x01, 0x00, 0x27, 0x80, 0x38, 0x80, 0x37, 0x00, + 0x2F, 0x00, 0x2B, 0x00, 0x2D, 0x00, 0x31, 0x00, 0x2F, 0x80, 0x2B, 0x00, + 0x29, 0x80, 0x2A, 0x80, 0x2B, 0x00, 0x29, 0x00, 0x25, 0x80, 0x22, 0x80, + 0x23, 0x00, 0x25, 0x00, 0x25, 0x80, 0x22, 0x00, 0x20, 0x00, 0x21, 0x80, + 0x21, 0x80, 0x1E, 0x80, 0x1D, 0x00, 0x1B, 0x80, 0x1C, 0x00, 0x1C, 0x80, + 0x1D, 0x80, 0x1A, 0x80, 0x1A, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1B, 0x80, + 0x18, 0x00, 0x16, 0x80, 0x17, 0x80, 0x15, 0x00, 0x14, 0x80, 0x13, 0x00, + 0x11, 0x80, 0x10, 0x00, 0x11, 0x80, 0x0F, 0x00, 0x0E, 0x80, 0x0E, 0x80, + 0x0B, 0x80, 0x0D, 0x80, 0x0C, 0x80, 0x0B, 0x80, 0x0B, 0x00, 0x0B, 0x00, + 0x0C, 0x00, 0x09, 0x80, 0x06, 0x80, 0x06, 0x00, 0x04, 0x80, 0x03, 0x80, + 0x03, 0x80, 0x01, 0x00, 0xFE, 0x00, 0xFE, 0x80, 0xFF, 0x00, 0x00, 0x80, + 0x01, 0x80, 0x05, 0x80, 0x09, 0x80, 0x0D, 0x00, 0x10, 0x00, 0x12, 0x80, + 0x16, 0x80, 0x19, 0x80, 0x1C, 0x80, 0x1F, 0x80, 0x22, 0x80, 0x25, 0x80, + 0x27, 0x80, 0x2A, 0x00, 0x2C, 0x00, 0x2E, 0x80, 0x2F, 0x80, 0x31, 0x00, + 0x31, 0x00, 0x32, 0x00, 0x32, 0x80, 0x33, 0x80, 0x33, 0x80, 0x34, 0x00, + 0x34, 0x00, 0x34, 0x00, 0x33, 0x00, 0x32, 0x80, 0x31, 0x80, 0x31, 0x00, + 0x2F, 0x80, 0x2E, 0x80, 0x2D, 0x00, 0x2B, 0x80, 0x2A, 0x00, 0x28, 0x80, + 0x27, 0x00, 0x25, 0x00, 0x23, 0x00, 0x21, 0x00, 0x1F, 0x00, 0x1D, 0x80, + 0x1B, 0x80, 0x19, 0x00, 0x17, 0x80, 0x15, 0x80, 0x15, 0x00, 0x13, 0x00, + 0x11, 0x80, 0x10, 0x00, 0x0E, 0x80, 0x0D, 0x00, 0x0C, 0x00, 0x0A, 0x80, + 0x09, 0x00, 0x07, 0x80, 0x06, 0x80, 0x05, 0x80, 0x04, 0x80, 0x04, 0x00, + 0x03, 0x80, 0x02, 0x80, 0x01, 0x00, 0x00, 0x00, 0x01, 0x80, 0x06, 0x00, + 0x0B, 0x00, 0x0F, 0x00, 0x13, 0x00, 0x16, 0x80, 0x1B, 0x00, 0x1E, 0x80, + 0x21, 0x80, 0x25, 0x80, 0x28, 0x80, 0x2B, 0x00, 0x2E, 0x00, 0x2F, 0x80, + 0x32, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x80, 0x37, 0x00, 0x37, 0x80, + 0x37, 0x00, 0x37, 0x80, 0x37, 0x80, 0x37, 0x80, 0x36, 0x00, 0x35, 0x00, + 0x34, 0x00, 0x32, 0x80, 0x30, 0x80, 0x2F, 0x80, 0x2D, 0x80, 0x2B, 0x00, + 0x29, 0x00, 0x26, 0x80, 0x24, 0x80, 0x22, 0x00, 0x1F, 0x80, 0x1D, 0x80, + 0x1B, 0x00, 0x18, 0x80, 0x16, 0x80, 0x15, 0x00, 0x12, 0x80, 0x10, 0x00, + 0x0E, 0x80, 0x0D, 0x80, 0x0C, 0x00, 0x0A, 0x00, 0x08, 0x80, 0x07, 0x80, + 0x06, 0x00, 0x05, 0x00, 0x04, 0x00, 0x03, 0x80, 0x02, 0x80, 0x01, 0x80, + 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, + 0xFF, 0x80, 0xFF, 0x80, 0x01, 0x80, 0x09, 0x00, 0x0F, 0x80, 0x14, 0x00, + 0x1A, 0x00, 0x1F, 0x00, 0x24, 0x80, 0x28, 0x80, 0x2D, 0x00, 0x30, 0x00, + 0x33, 0x80, 0x36, 0x00, 0x38, 0x00, 0x39, 0x80, 0x3A, 0x80, 0x3C, 0x80, + 0x3D, 0x00, 0x3C, 0x80, 0x3B, 0x00, 0x3B, 0x00, 0x39, 0x80, 0x38, 0x80, + 0x37, 0x80, 0x36, 0x00, 0x34, 0x80, 0x33, 0x80, 0x31, 0x80, 0x2F, 0x80, + 0x2E, 0x00, 0x2C, 0x00, 0x2A, 0x80, 0x28, 0x00, 0x26, 0x80, 0x24, 0x80, + 0x23, 0x00, 0x20, 0x80, 0x1F, 0x80, 0x1D, 0x00, 0x1B, 0x80, 0x19, 0x80, + 0x17, 0x80, 0x16, 0x80, 0x15, 0x00, 0x12, 0x80, 0x12, 0x00, 0x10, 0x80, + 0x10, 0x00, 0x0F, 0x80, 0x0E, 0x80, 0x0D, 0x00, 0x0C, 0x00, 0x0B, 0x00, + 0x0A, 0x00, 0x09, 0x80, 0x08, 0x00, 0x07, 0x80, 0x06, 0x80, 0x06, 0x00, + 0x05, 0x00, 0x04, 0x80, 0x04, 0x00, 0x02, 0x80, 0x01, 0x80, 0x00, 0x00, + 0x02, 0x00, 0x0A, 0x80, 0x12, 0x80, 0x19, 0x80, 0x21, 0x00, 0x27, 0x00, + 0x2C, 0x80, 0x2F, 0x80, 0x34, 0x00, 0x36, 0x00, 0x37, 0x80, 0x39, 0x00, + 0x38, 0x80, 0x38, 0x00, 0x37, 0x00, 0x36, 0x80, 0x35, 0x80, 0x34, 0x00, + 0x31, 0x80, 0x2F, 0x80, 0x2E, 0x80, 0x2D, 0x80, 0x2B, 0x80, 0x29, 0x80, + 0x28, 0x00, 0x26, 0x80, 0x25, 0x00, 0x23, 0x00, 0x22, 0x00, 0x20, 0x00, + 0x1E, 0x80, 0x1C, 0x00, 0x1B, 0x00, 0x19, 0x00, 0x17, 0x00, 0x15, 0x80, + 0x14, 0x00, 0x11, 0x80, 0x10, 0x00, 0x0F, 0x00, 0x0D, 0x00, 0x0C, 0x00, + 0x0A, 0x80, 0x09, 0x80, 0x08, 0x00, 0x07, 0x00, 0x07, 0x80, 0x07, 0x00, + 0x08, 0x00, 0x07, 0x80, 0x08, 0x80, 0x09, 0x80, 0x0A, 0x00, 0x0B, 0x00, + 0x0D, 0x00, 0x0B, 0x80, 0x0C, 0x80, 0x0C, 0x00, 0x0B, 0x80, 0x0B, 0x00, + 0x09, 0x00, 0x08, 0x00, 0x04, 0x00, 0x03, 0x00, 0x01, 0x00, 0x0B, 0x00, + 0x13, 0x00, 0x1A, 0x00, 0x1F, 0x00, 0x20, 0x80, 0x21, 0x80, 0x20, 0x80, + 0x20, 0x00, 0x1E, 0x80, 0x1D, 0x80, 0x1D, 0x00, 0x1B, 0x00, 0x1B, 0x00, + 0x1C, 0x00, 0x1C, 0x80, 0x1C, 0x00, 0x1B, 0x80, 0x1B, 0x00, 0x1A, 0x80, + 0x1A, 0x80, 0x1C, 0x80, 0x1E, 0x00, 0x20, 0x00, 0x24, 0x00, 0x28, 0x00, + 0x2B, 0x80, 0x2F, 0x00, 0x32, 0x80, 0x35, 0x00, 0x35, 0x00, 0x35, 0x00, + 0x35, 0x00, 0x33, 0x00, 0x31, 0x80, 0x2F, 0x80, 0x2D, 0x80, 0x2B, 0x80, + 0x2A, 0x80, 0x29, 0x00, 0x27, 0x80, 0x27, 0x80, 0x27, 0x00, 0x26, 0x80, + 0x26, 0x80, 0x26, 0x00, 0x26, 0x80, 0x24, 0x00, 0x22, 0x80, 0x1F, 0x00, + 0x1B, 0x80, 0x17, 0x80, 0x14, 0x00, 0x10, 0x80, 0x0E, 0x00, 0x0B, 0x00, + 0x09, 0x80, 0x08, 0x00, 0x07, 0x00, 0x07, 0x00, 0x06, 0x00, 0x05, 0x00, + 0x02, 0x80, 0x01, 0x00, 0x01, 0x80, 0x24, 0x00, 0x36, 0x00, 0x39, 0x00, + 0x2E, 0x80, 0x1E, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0E, 0x80, + 0x14, 0x00, 0x17, 0x00, 0x18, 0x80, 0x17, 0x80, 0x19, 0x80, 0x1E, 0x00, + 0x25, 0x00, 0x2C, 0x80, 0x30, 0x80, 0x28, 0x80, 0x19, 0x80, 0x0A, 0x80, + 0xFC, 0x80, 0xF7, 0x00, 0xFA, 0x00, 0x04, 0x80, 0x13, 0x00, 0x1D, 0x80, + 0x20, 0x00, 0x19, 0x80, 0x10, 0x00, 0x06, 0x00, 0x00, 0x80, 0x00, 0x80, + 0x07, 0x00, 0x0D, 0x80, 0x10, 0x00, 0x0E, 0x80, 0x08, 0x00, 0x01, 0x00, + 0xFD, 0x80, 0xFD, 0x80, 0x04, 0x00, 0x0E, 0x80, 0x15, 0x00, 0x14, 0x00, + 0x0F, 0x80, 0x09, 0x80, 0x05, 0x00, 0x02, 0x80, 0x04, 0x00, 0x09, 0x80, + 0x0E, 0x00, 0x0F, 0x80, 0x0A, 0x00, 0x01, 0x00, 0xFA, 0x80, 0xF8, 0x00, + 0xF8, 0x80, 0x00, 0x00, 0x07, 0x80, 0x08, 0x80, 0x08, 0x80, 0x04, 0x80, + 0x01, 0x00, 0x24, 0x80, 0x36, 0x00, 0x2F, 0x80, 0x14, 0x00, 0xEF, 0x80, + 0xD3, 0x00, 0xCB, 0x80, 0xDB, 0x80, 0xFC, 0x00, 0x1E, 0x00, 0x30, 0x80, + 0x2D, 0x80, 0x15, 0x80, 0xF5, 0x80, 0xDA, 0x80, 0xD0, 0x80, 0xDD, 0x00, + 0xF7, 0x80, 0x16, 0x80, 0x29, 0x80, 0x2A, 0x00, 0x16, 0x80, 0xFA, 0x80, + 0xE2, 0x00, 0xD7, 0x00, 0xDF, 0x80, 0xF5, 0x80, 0x10, 0x00, 0x23, 0x00, + 0x26, 0x00, 0x17, 0x80, 0xFF, 0x00, 0xE7, 0x00, 0xDB, 0x80, 0xE0, 0x80, + 0xF3, 0x00, 0x0B, 0x80, 0x1D, 0x00, 0x22, 0x80, 0x18, 0x00, 0x03, 0x00, + 0xED, 0x80, 0xE1, 0x00, 0xE3, 0x80, 0xF2, 0x80, 0x07, 0x80, 0x17, 0x00, + 0x1C, 0x00, 0x15, 0x80, 0x05, 0x80, 0xF2, 0x80, 0xE8, 0x80, 0xE8, 0x80, + 0xF3, 0x00, 0x03, 0x80, 0x11, 0x00, 0x16, 0x80, 0x12, 0x00, 0x05, 0x80, + 0xF8, 0x00, 0xEE, 0x00, 0xEC, 0x00, 0xF3, 0x00, 0x01, 0x80, 0x06, 0x80, + 0x0A, 0x80, 0x0F, 0x80, 0x13, 0x00, 0x16, 0x80, 0x1A, 0x80, 0x1D, 0x80, + 0x20, 0x80, 0x24, 0x00, 0x26, 0x80, 0x28, 0x00, 0x2A, 0x00, 0x2C, 0x00, + 0x2D, 0x00, 0x2E, 0x00, 0x2E, 0x80, 0x2E, 0x00, 0x2E, 0x00, 0x2D, 0x80, + 0x2C, 0x80, 0x2C, 0x80, 0x2B, 0x00, 0x2A, 0x80, 0x29, 0x00, 0x28, 0x80, + 0x27, 0x00, 0x26, 0x00, 0x25, 0x80, 0x24, 0x80, 0x24, 0x80, 0x23, 0x80, + 0x23, 0x80, 0x23, 0x00, 0x23, 0x00, 0x23, 0x80, 0x23, 0x00, 0x24, 0x00, + 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x25, 0x80, 0x27, 0x00, 0x27, 0x00, + 0x28, 0x00, 0x27, 0x80, 0x28, 0x00, 0x28, 0x80, 0x28, 0x80, 0x27, 0x80, + 0x26, 0x80, 0x25, 0x00, 0x23, 0x80, 0x22, 0x80, 0x20, 0x00, 0x1D, 0x80, + 0x1B, 0x00, 0x18, 0x00, 0x14, 0x80, 0x12, 0x00, 0x0E, 0x80, 0x0A, 0x80, + 0x06, 0x80, 0x02, 0x80, 0x00, 0x80, 0x07, 0x00, 0x0C, 0x80, 0x11, 0x00, + 0x15, 0x80, 0x1A, 0x80, 0x1E, 0x00, 0x22, 0x00, 0x24, 0x80, 0x27, 0x80, + 0x2A, 0x00, 0x2B, 0x00, 0x2C, 0x00, 0x2D, 0x00, 0x2E, 0x00, 0x2E, 0x00, + 0x2D, 0x80, 0x2C, 0x80, 0x2B, 0x00, 0x29, 0x00, 0x27, 0x80, 0x25, 0x00, + 0x21, 0x80, 0x20, 0x00, 0x1D, 0x00, 0x1A, 0x00, 0x15, 0x80, 0x12, 0x80, + 0x10, 0x00, 0x0D, 0x80, 0x0A, 0x80, 0x06, 0x80, 0x04, 0x00, 0x00, 0x80, + 0xFD, 0x80, 0xFD, 0x00, 0xFB, 0x80, 0xF8, 0x80, 0xF7, 0x00, 0xF5, 0x80, + 0xF5, 0x00, 0xF3, 0x80, 0xF4, 0x00, 0xF3, 0x00, 0xF3, 0x80, 0xF2, 0x80, + 0xF2, 0x80, 0xF2, 0x80, 0xF2, 0x80, 0xF4, 0x00, 0xF4, 0x80, 0xF4, 0x80, + 0xF6, 0x00, 0xF6, 0x80, 0xF9, 0x00, 0xF8, 0x80, 0xF9, 0x80, 0xFB, 0x80, + 0xFC, 0x80, 0xFD, 0x80, 0xFE, 0x00, 0xFF, 0x80, 0xFE, 0x80, 0xFF, 0x80, + 0x00, 0x80, 0x07, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x14, 0x00, 0x19, 0x00, + 0x1C, 0x80, 0x20, 0x80, 0x23, 0x80, 0x26, 0x80, 0x29, 0x00, 0x2B, 0x00, + 0x2C, 0x00, 0x2D, 0x00, 0x2E, 0x80, 0x2E, 0x80, 0x2E, 0x80, 0x2D, 0x00, + 0x2B, 0x80, 0x2A, 0x00, 0x28, 0x00, 0x25, 0x80, 0x22, 0x00, 0x20, 0x80, + 0x1D, 0x00, 0x1A, 0x00, 0x16, 0x00, 0x13, 0x00, 0x10, 0x00, 0x0D, 0x00, + 0x0A, 0x80, 0x06, 0x80, 0x04, 0x00, 0x00, 0x80, 0xFD, 0x80, 0xFC, 0x00, + 0xFA, 0x80, 0xF8, 0x00, 0xF6, 0x80, 0xF4, 0x80, 0xF4, 0x00, 0xF3, 0x00, + 0xF3, 0x80, 0xF2, 0x80, 0xF3, 0x00, 0xF2, 0x80, 0xF3, 0x00, 0xF3, 0x00, + 0xF3, 0x80, 0xF4, 0x80, 0xF5, 0x00, 0xF5, 0x80, 0xF7, 0x00, 0xF7, 0x80, + 0xF9, 0x00, 0xF8, 0x80, 0xF9, 0x80, 0xFB, 0x00, 0xFC, 0x00, 0xFD, 0x00, + 0xFD, 0x80, 0xFE, 0x80, 0xFE, 0x00, 0xFF, 0x80, 0x04, 0x00, 0x07, 0x80, + 0x0C, 0x00, 0x0C, 0x80, 0x06, 0x80, 0xFB, 0x80, 0xFD, 0x80, 0xFC, 0x00, + 0xF1, 0x00, 0xF0, 0x80, 0xFF, 0x00, 0x06, 0x00, 0x07, 0x00, 0x0D, 0x00, + 0x12, 0x00, 0x08, 0x80, 0xFC, 0x00, 0xF6, 0x80, 0xF8, 0x80, 0xFB, 0x00, + 0xFC, 0x80, 0xFA, 0x00, 0x00, 0x00, 0x0B, 0x80, 0x0C, 0x00, 0x05, 0x80, + 0x07, 0x80, 0x0B, 0x00, 0x03, 0x80, 0xFD, 0x80, 0x06, 0x00, 0x0F, 0x80, + 0x0E, 0x80, 0x07, 0x00, 0xFE, 0x00, 0xFA, 0x80, 0xF6, 0x80, 0xF4, 0x00, + 0xF7, 0x00, 0xFD, 0x00, 0xFD, 0x80, 0xFA, 0x80, 0xEF, 0x80, 0xE8, 0x00, + 0xDF, 0x00, 0xD1, 0x80, 0xCC, 0x80, 0xCD, 0x80, 0xD2, 0x80, 0xD6, 0x00, + 0xDC, 0x00, 0xEB, 0x00, 0xF2, 0x80, 0xEE, 0x80, 0xEA, 0x80, 0xE8, 0x80, + 0xEC, 0x80, 0xEE, 0x00, 0xEA, 0x80, 0xF1, 0x00, 0xFA, 0x80, 0x06, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x0B, 0x80, 0x10, 0x00, + 0x14, 0x80, 0x18, 0x00, 0x1C, 0x80, 0x20, 0x80, 0x23, 0x80, 0x27, 0x80, + 0x2A, 0x00, 0x2D, 0x00, 0x2F, 0x80, 0x30, 0x80, 0x32, 0x80, 0x34, 0x00, + 0x35, 0x00, 0x35, 0x80, 0x36, 0x00, 0x36, 0x00, 0x34, 0x80, 0x34, 0x80, + 0x33, 0x00, 0x32, 0x00, 0x30, 0x80, 0x2F, 0x80, 0x2D, 0x00, 0x2B, 0x00, + 0x29, 0x00, 0x27, 0x00, 0x24, 0x80, 0x21, 0x80, 0x1F, 0x80, 0x1D, 0x00, + 0x1A, 0x80, 0x18, 0x80, 0x16, 0x00, 0x13, 0x80, 0x12, 0x00, 0x10, 0x00, + 0x0E, 0x00, 0x0C, 0x00, 0x0B, 0x00, 0x09, 0x00, 0x08, 0x00, 0x07, 0x00, + 0x05, 0x80, 0x04, 0x80, 0x04, 0x00, 0x02, 0x80, 0x02, 0x00, 0x01, 0x80, + 0x01, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, + 0xFF, 0x80, 0x00, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x00, 0xFF, 0x80, + 0x02, 0x00, 0x15, 0x00, 0x25, 0x00, 0x33, 0x00, 0x3A, 0x80, 0x3E, 0x80, + 0x3E, 0x80, 0x3B, 0x00, 0x36, 0x00, 0x31, 0x80, 0x2C, 0x00, 0x27, 0x00, + 0x21, 0x80, 0x1B, 0x80, 0x16, 0x80, 0x0F, 0x00, 0x08, 0x00, 0x01, 0x80, + 0xFD, 0x80, 0xF8, 0x80, 0xF6, 0x00, 0xF6, 0x00, 0xF7, 0x00, 0xFB, 0x80, + 0xFE, 0x00, 0xFF, 0x80, 0x01, 0x80, 0x05, 0x80, 0x08, 0x80, 0x0D, 0x80, + 0x13, 0x00, 0x18, 0x80, 0x1E, 0x00, 0x24, 0x80, 0x27, 0x80, 0x29, 0x80, + 0x29, 0x00, 0x24, 0x00, 0x1F, 0x00, 0x18, 0x00, 0x12, 0x00, 0x0C, 0x80, + 0x07, 0x80, 0x03, 0x80, 0x00, 0x80, 0xFF, 0x80, 0xFC, 0x80, 0xFA, 0x00, + 0xF7, 0x00, 0xF5, 0x80, 0xF3, 0x80, 0xF2, 0x00, 0xF3, 0x80, 0xF5, 0x00, + 0xF8, 0x00, 0xFB, 0x00, 0xFD, 0x00, 0xFF, 0x80, 0x01, 0x00, 0x02, 0x80, + 0x02, 0x00, 0x01, 0x80, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1B, 0x80, + 0x2F, 0x80, 0x3B, 0x00, 0x3A, 0x80, 0x2F, 0x80, 0x1E, 0x00, 0x07, 0x80, + 0xF2, 0x00, 0xE3, 0x00, 0xDA, 0x00, 0xDC, 0x00, 0xE6, 0x00, 0xF5, 0x80, + 0x0A, 0x00, 0x1C, 0x80, 0x2B, 0x80, 0x34, 0x80, 0x36, 0x00, 0x2F, 0x80, + 0x25, 0x80, 0x17, 0x00, 0x07, 0x00, 0xFA, 0x00, 0xF0, 0x80, 0xED, 0x80, + 0xF0, 0x80, 0xF9, 0x80, 0x06, 0x00, 0x13, 0x00, 0x20, 0x00, 0x27, 0x00, + 0x29, 0x00, 0x24, 0x80, 0x1B, 0x00, 0x10, 0x80, 0x06, 0x80, 0xFC, 0x80, + 0xF7, 0x80, 0xF6, 0x00, 0xF8, 0x00, 0xFC, 0x80, 0x04, 0x80, 0x09, 0x80, + 0x0E, 0x00, 0x10, 0x80, 0x11, 0x80, 0x0F, 0x80, 0x0E, 0x00, 0x09, 0x80, + 0x06, 0x80, 0x01, 0x80, 0xFE, 0x00, 0xFA, 0x80, 0xF8, 0x80, 0xF7, 0x80, + 0xFA, 0x80, 0xFE, 0x80, 0x03, 0x00, 0x07, 0x80, 0x0A, 0x80, 0x0B, 0x00, + 0x09, 0x80, 0x05, 0x00, 0x02, 0x00, 0x23, 0x80, 0x32, 0x00, 0x29, 0x80, + 0x0B, 0x80, 0xEB, 0x00, 0xDA, 0x00, 0xE1, 0x00, 0xFB, 0x00, 0x1C, 0x00, + 0x31, 0x00, 0x31, 0x00, 0x1D, 0x00, 0x01, 0x00, 0xED, 0x80, 0xEB, 0x00, + 0xFA, 0x00, 0x12, 0x00, 0x26, 0x80, 0x2B, 0x00, 0x21, 0x80, 0x10, 0x00, + 0xFF, 0x00, 0xF9, 0x00, 0xFE, 0x80, 0x0C, 0x80, 0x18, 0x80, 0x1E, 0x00, + 0x1A, 0x00, 0x11, 0x00, 0x09, 0x00, 0x04, 0x80, 0x05, 0x00, 0x09, 0x80, + 0x0E, 0x80, 0x10, 0x00, 0x0F, 0x80, 0x0B, 0x80, 0x08, 0x80, 0x07, 0x00, + 0x08, 0x80, 0x08, 0x80, 0x09, 0x00, 0x07, 0x00, 0x05, 0x00, 0x05, 0x00, + 0x04, 0x80, 0x05, 0x80, 0x07, 0x00, 0x06, 0x80, 0x06, 0x00, 0x03, 0x80, + 0x01, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x01, 0x80, 0x04, 0x00, 0x04, 0x80, + 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0xFE, 0x00, 0xFD, 0x80, 0xFE, 0x80, + 0x01, 0x00, 0x05, 0x80, 0x0A, 0x00, 0x0D, 0x00, 0x10, 0x80, 0x14, 0x80, + 0x17, 0x80, 0x1B, 0x00, 0x1E, 0x80, 0x21, 0x00, 0x23, 0x80, 0x26, 0x00, + 0x28, 0x00, 0x29, 0x80, 0x2B, 0x80, 0x2D, 0x00, 0x2D, 0x80, 0x2E, 0x00, + 0x2E, 0x00, 0x2E, 0x00, 0x2D, 0x00, 0x2C, 0x80, 0x2B, 0x00, 0x2A, 0x80, + 0x29, 0x00, 0x27, 0x00, 0x24, 0x80, 0x22, 0x80, 0x1F, 0x80, 0x1D, 0x80, + 0x1B, 0x00, 0x17, 0x80, 0x15, 0x00, 0x11, 0x80, 0x0F, 0x00, 0x0C, 0x80, + 0x09, 0x80, 0x06, 0x00, 0x04, 0x00, 0x01, 0x00, 0xFE, 0x00, 0xFC, 0x80, + 0xFA, 0x00, 0xF8, 0x00, 0xF6, 0x80, 0xF5, 0x00, 0xF3, 0x80, 0xF2, 0x00, + 0xF1, 0x80, 0xF1, 0x00, 0xF0, 0x80, 0xF0, 0x80, 0xF1, 0x00, 0xF1, 0x00, + 0xF2, 0x00, 0xF2, 0x80, 0xF3, 0x00, 0xF4, 0x80, 0xF6, 0x00, 0xF7, 0x80, + 0xF9, 0x80, 0xFB, 0x80, 0xFC, 0x00, 0xFE, 0x80, 0x01, 0x00, 0x07, 0x00, + 0x0D, 0x00, 0x11, 0x80, 0x16, 0x80, 0x1B, 0x00, 0x1F, 0x00, 0x23, 0x00, + 0x25, 0x80, 0x28, 0x80, 0x2B, 0x00, 0x2C, 0x00, 0x2C, 0x00, 0x2C, 0x00, + 0x2B, 0x80, 0x2A, 0x00, 0x28, 0x80, 0x26, 0x00, 0x23, 0x00, 0x20, 0x00, + 0x1C, 0x80, 0x19, 0x00, 0x15, 0x80, 0x12, 0x80, 0x0F, 0x00, 0x0C, 0x00, + 0x08, 0x80, 0x06, 0x00, 0x04, 0x80, 0x02, 0x80, 0x01, 0x80, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x03, 0x00, 0x04, 0x80, 0x06, 0x80, + 0x09, 0x80, 0x0C, 0x00, 0x10, 0x00, 0x12, 0x80, 0x16, 0x80, 0x19, 0x80, + 0x1D, 0x80, 0x20, 0x80, 0x24, 0x00, 0x26, 0x80, 0x28, 0x80, 0x2A, 0x00, + 0x2B, 0x00, 0x2B, 0x80, 0x2B, 0x80, 0x2B, 0x00, 0x29, 0x00, 0x26, 0x80, + 0x24, 0x80, 0x20, 0x80, 0x1D, 0x00, 0x19, 0x00, 0x14, 0x00, 0x0F, 0x80, + 0x09, 0x80, 0x04, 0x80, 0x01, 0x00, 0x08, 0x80, 0x0F, 0x80, 0x15, 0x00, + 0x1B, 0x00, 0x1F, 0x00, 0x23, 0x00, 0x26, 0x80, 0x28, 0x00, 0x28, 0x80, + 0x28, 0x80, 0x26, 0x80, 0x24, 0x00, 0x21, 0x00, 0x1D, 0x00, 0x18, 0x80, + 0x14, 0x00, 0x0F, 0x80, 0x0B, 0x00, 0x07, 0x00, 0x03, 0x00, 0x01, 0x00, + 0xFF, 0x00, 0xFE, 0x00, 0xFD, 0x80, 0xFF, 0x80, 0x01, 0x80, 0x04, 0x80, + 0x08, 0x80, 0x0D, 0x00, 0x12, 0x00, 0x17, 0x80, 0x1D, 0x00, 0x23, 0x00, + 0x27, 0x80, 0x2C, 0x80, 0x30, 0x00, 0x32, 0x80, 0x35, 0x00, 0x36, 0x00, + 0x36, 0x80, 0x34, 0x80, 0x32, 0x80, 0x2F, 0x00, 0x2B, 0x00, 0x25, 0x80, + 0x20, 0x00, 0x19, 0x80, 0x13, 0x00, 0x0C, 0x80, 0x06, 0x80, 0x00, 0x00, + 0xFA, 0x80, 0xF6, 0x80, 0xF2, 0x80, 0xEF, 0x80, 0xEE, 0x00, 0xED, 0x80, + 0xEE, 0x00, 0xEF, 0x80, 0xF1, 0x00, 0xF4, 0x80, 0xF7, 0x80, 0xFB, 0x80, + 0x01, 0x00, 0x09, 0x80, 0x12, 0x00, 0x18, 0x80, 0x1E, 0x00, 0x22, 0x80, + 0x25, 0x80, 0x26, 0x80, 0x25, 0x80, 0x23, 0x00, 0x20, 0x00, 0x1A, 0x80, + 0x15, 0x00, 0x10, 0x00, 0x0A, 0x00, 0x04, 0x80, 0x00, 0x00, 0xFD, 0x00, + 0xFB, 0x00, 0xFA, 0x80, 0xFC, 0x00, 0xFF, 0x80, 0x03, 0x80, 0x0A, 0x00, + 0x10, 0x00, 0x17, 0x80, 0x1F, 0x00, 0x26, 0x00, 0x2C, 0x80, 0x31, 0x80, + 0x35, 0x80, 0x38, 0x00, 0x39, 0x00, 0x37, 0x80, 0x34, 0x80, 0x30, 0x80, + 0x2B, 0x00, 0x24, 0x00, 0x1D, 0x00, 0x15, 0x00, 0x0F, 0x00, 0x07, 0x80, + 0x02, 0x80, 0xFE, 0x00, 0xFB, 0x00, 0xF9, 0x80, 0xFA, 0x80, 0xFD, 0x00, + 0x00, 0x00, 0x04, 0x80, 0x0A, 0x80, 0x10, 0x00, 0x15, 0x80, 0x1B, 0x00, + 0x1F, 0x80, 0x22, 0x80, 0x24, 0x80, 0x25, 0x00, 0x23, 0x80, 0x20, 0x80, + 0x1C, 0x00, 0x16, 0x80, 0x0F, 0x00, 0x07, 0x00, 0x01, 0x00, 0x0B, 0x00, + 0x14, 0x00, 0x1B, 0x00, 0x20, 0x80, 0x24, 0x00, 0x24, 0x80, 0x23, 0x00, + 0x1F, 0x00, 0x19, 0x80, 0x13, 0x00, 0x0C, 0x00, 0x05, 0x00, 0xFF, 0x00, + 0xFB, 0x00, 0xF8, 0x80, 0xF8, 0x00, 0xFA, 0x80, 0xFF, 0x00, 0x05, 0x80, + 0x0D, 0x80, 0x16, 0x80, 0x1F, 0x80, 0x28, 0x80, 0x2F, 0x00, 0x34, 0x00, + 0x37, 0x00, 0x37, 0x80, 0x36, 0x00, 0x31, 0x80, 0x2C, 0x00, 0x24, 0x00, + 0x1C, 0x00, 0x13, 0x80, 0x0C, 0x00, 0x06, 0x00, 0x01, 0x80, 0xFE, 0x80, + 0xFF, 0x80, 0x01, 0x80, 0x06, 0x80, 0x0C, 0x80, 0x13, 0x80, 0x1B, 0x80, + 0x22, 0x80, 0x29, 0x00, 0x2D, 0x80, 0x2F, 0x80, 0x30, 0x00, 0x2E, 0x00, + 0x29, 0x00, 0x22, 0x00, 0x19, 0x80, 0x10, 0x00, 0x06, 0x80, 0xFD, 0x00, + 0xF5, 0x80, 0xF0, 0x00, 0xEB, 0x80, 0xEA, 0x80, 0xEB, 0x80, 0xEE, 0x80, + 0xF2, 0x80, 0xF9, 0x00, 0x01, 0x00, 0x0E, 0x80, 0x1A, 0x80, 0x22, 0x80, + 0x28, 0x80, 0x28, 0x80, 0x25, 0x80, 0x1F, 0x00, 0x16, 0x80, 0x0C, 0x80, + 0x03, 0x00, 0xFA, 0x80, 0xF4, 0x00, 0xF2, 0x00, 0xF3, 0x80, 0xF8, 0x80, + 0x00, 0x00, 0x0A, 0x80, 0x15, 0x00, 0x20, 0x00, 0x2A, 0x00, 0x31, 0x80, + 0x35, 0x80, 0x37, 0x80, 0x35, 0x00, 0x30, 0x00, 0x28, 0x00, 0x1F, 0x80, + 0x15, 0x80, 0x0D, 0x00, 0x06, 0x80, 0x01, 0x80, 0x00, 0x00, 0x02, 0x80, + 0x06, 0x80, 0x0E, 0x00, 0x16, 0x80, 0x20, 0x00, 0x29, 0x80, 0x2F, 0x80, + 0x33, 0x00, 0x34, 0x80, 0x32, 0x00, 0x2C, 0x80, 0x25, 0x00, 0x1B, 0x80, + 0x11, 0x00, 0x08, 0x00, 0x00, 0x00, 0xFB, 0x00, 0xF8, 0x00, 0xF8, 0x80, + 0xFC, 0x00, 0x01, 0x80, 0x08, 0x00, 0x0E, 0x80, 0x14, 0x80, 0x1A, 0x80, + 0x1C, 0x80, 0x1D, 0x80, 0x1B, 0x00, 0x16, 0x80, 0x10, 0x00, 0x07, 0x80, + 0x01, 0x00, 0x10, 0x00, 0x1D, 0x80, 0x24, 0x80, 0x29, 0x00, 0x26, 0x80, + 0x1F, 0x80, 0x15, 0x80, 0x09, 0x80, 0xFE, 0x80, 0xF5, 0x80, 0xF0, 0x80, + 0xF0, 0x00, 0xF5, 0x00, 0xFE, 0x00, 0x0A, 0x00, 0x16, 0x00, 0x22, 0x80, + 0x2D, 0x80, 0x33, 0x80, 0x35, 0x80, 0x33, 0x80, 0x2D, 0x80, 0x24, 0x80, + 0x19, 0x80, 0x0F, 0x80, 0x06, 0x00, 0x01, 0x80, 0xFF, 0x00, 0x02, 0x80, + 0x09, 0x00, 0x11, 0x80, 0x1D, 0x00, 0x27, 0x80, 0x30, 0x80, 0x35, 0x80, + 0x37, 0x80, 0x34, 0x80, 0x2E, 0x80, 0x24, 0x00, 0x19, 0x80, 0x0E, 0x00, + 0x05, 0x00, 0xFE, 0x80, 0xFC, 0x00, 0xFF, 0x00, 0x05, 0x00, 0x0C, 0x80, + 0x15, 0x00, 0x1E, 0x80, 0x25, 0x00, 0x27, 0x80, 0x28, 0x00, 0x24, 0x00, + 0x1D, 0x00, 0x12, 0x80, 0x09, 0x00, 0xFE, 0x80, 0xF5, 0x80, 0xF1, 0x00, + 0xEE, 0x80, 0xF0, 0x00, 0xF2, 0x00, 0xF8, 0x00, 0x02, 0x00, 0x01, 0x80, + 0x05, 0x80, 0x08, 0x00, 0x07, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFA, 0x80, + 0xF5, 0x00, 0xF6, 0x00, 0xFE, 0x80, 0x00, 0x00, 0xFF, 0x00, 0x05, 0x80, + 0x0C, 0x80, 0x07, 0x00, 0xFE, 0x80, 0xFA, 0x00, 0xFA, 0x80, 0xF8, 0x80, + 0xF7, 0x00, 0xF7, 0x00, 0xFC, 0x80, 0x03, 0x80, 0x06, 0x80, 0x07, 0x00, + 0x0D, 0x80, 0x10, 0x00, 0x06, 0x00, 0xFF, 0x00, 0x03, 0x00, 0x0A, 0x00, + 0x09, 0x80, 0x05, 0x00, 0x00, 0x80, 0xFE, 0x00, 0xF8, 0x80, 0xFA, 0x00, + 0xFF, 0x80, 0x02, 0x00, 0xFC, 0x00, 0xF3, 0x00, 0xEB, 0x80, 0xE8, 0x80, + 0xE6, 0x80, 0xDF, 0x00, 0xD9, 0x00, 0xD8, 0x00, 0xD9, 0x00, 0xDC, 0x00, + 0xE2, 0x00, 0xEC, 0x00, 0xEF, 0x80, 0xED, 0x00, 0xED, 0x00, 0xF1, 0x00, + 0xF4, 0x00, 0xF4, 0x00, 0xEF, 0x80, 0xF0, 0x80, 0xF6, 0x00, 0xFF, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x07, 0x00, 0x0C, 0x80, 0x10, 0x00, + 0x12, 0x00, 0x12, 0x00, 0x12, 0x00, 0x10, 0x80, 0x10, 0x00, 0x0F, 0x80, + 0x10, 0x00, 0x12, 0x00, 0x15, 0x00, 0x19, 0x00, 0x1E, 0x80, 0x24, 0x00, + 0x28, 0x00, 0x2B, 0x80, 0x2C, 0x80, 0x2D, 0x00, 0x2B, 0x80, 0x2A, 0x80, + 0x27, 0x80, 0x26, 0x00, 0x25, 0x00, 0x25, 0x80, 0x27, 0x00, 0x2A, 0x00, + 0x2D, 0x80, 0x30, 0x80, 0x34, 0x00, 0x36, 0x00, 0x36, 0x80, 0x36, 0x00, + 0x33, 0x80, 0x30, 0x80, 0x2D, 0x00, 0x29, 0x00, 0x26, 0x00, 0x24, 0x80, + 0x24, 0x80, 0x25, 0x00, 0x27, 0x80, 0x29, 0x00, 0x2B, 0x00, 0x2B, 0x80, + 0x2B, 0x80, 0x29, 0x80, 0x26, 0x80, 0x21, 0x80, 0x1C, 0x00, 0x17, 0x00, + 0x13, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x0D, 0x80, 0x0E, 0x80, 0x0F, 0x80, + 0x10, 0x00, 0x11, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x09, 0x80, 0x04, 0x00, + 0x01, 0x00, 0x09, 0x00, 0x0F, 0x00, 0x13, 0x80, 0x17, 0x00, 0x19, 0x00, + 0x19, 0x80, 0x19, 0x80, 0x19, 0x00, 0x18, 0x80, 0x19, 0x80, 0x1C, 0x00, + 0x1F, 0x00, 0x23, 0x00, 0x28, 0x00, 0x2D, 0x00, 0x2F, 0x80, 0x31, 0x80, + 0x31, 0x80, 0x30, 0x80, 0x2E, 0x00, 0x2A, 0x00, 0x25, 0x80, 0x21, 0x80, + 0x1E, 0x80, 0x1C, 0x80, 0x1B, 0x00, 0x1B, 0x00, 0x1B, 0x80, 0x1C, 0x00, + 0x1C, 0x80, 0x1B, 0x80, 0x19, 0x80, 0x16, 0x00, 0x11, 0x00, 0x0C, 0x00, + 0x06, 0x00, 0xFF, 0x80, 0xFB, 0x00, 0xF7, 0x80, 0xF5, 0x80, 0xF5, 0x80, + 0xF6, 0x80, 0xF8, 0x00, 0xF9, 0x80, 0xFA, 0x00, 0xF9, 0x80, 0xF8, 0x00, + 0xF6, 0x00, 0xF2, 0x80, 0xEF, 0x80, 0xEC, 0x00, 0xEA, 0x80, 0xE9, 0x80, + 0xEA, 0x00, 0xEC, 0x80, 0xF0, 0x80, 0xF4, 0x80, 0xF9, 0x80, 0xFE, 0x00, + 0x00, 0x80, 0x02, 0x80, 0x02, 0x80, 0x01, 0x80, 0x01, 0x00, 0x0A, 0x80, + 0x11, 0x80, 0x17, 0x80, 0x1B, 0x80, 0x1D, 0x80, 0x1D, 0x80, 0x1D, 0x00, + 0x1C, 0x00, 0x1C, 0x80, 0x1E, 0x80, 0x21, 0x00, 0x24, 0x00, 0x27, 0x00, + 0x29, 0x80, 0x2A, 0x80, 0x29, 0x00, 0x25, 0x00, 0x1F, 0x80, 0x18, 0x80, + 0x11, 0x80, 0x0B, 0x00, 0x06, 0x00, 0x02, 0x80, 0x01, 0x00, 0x01, 0x00, + 0x01, 0x80, 0x02, 0x00, 0x02, 0x00, 0x00, 0x80, 0xFE, 0x00, 0xFA, 0x00, + 0xF6, 0x00, 0xF2, 0x80, 0xF1, 0x00, 0xF2, 0x00, 0xF4, 0x80, 0xF9, 0x00, + 0xFF, 0x00, 0x06, 0x00, 0x0C, 0x80, 0x11, 0x80, 0x15, 0x80, 0x17, 0x80, + 0x18, 0x80, 0x18, 0x00, 0x18, 0x00, 0x18, 0x80, 0x1A, 0x80, 0x1D, 0x00, + 0x21, 0x00, 0x25, 0x80, 0x29, 0x80, 0x2C, 0x00, 0x2C, 0x00, 0x2A, 0x00, + 0x26, 0x80, 0x1F, 0x80, 0x19, 0x00, 0x12, 0x00, 0x0C, 0x00, 0x06, 0x80, + 0x03, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0A, 0x00, 0x10, 0x80, 0x17, 0x00, + 0x19, 0x80, 0x1A, 0x00, 0x19, 0x80, 0x19, 0x00, 0x18, 0x00, 0x17, 0x80, + 0x19, 0x00, 0x19, 0x80, 0x1A, 0x80, 0x1A, 0x80, 0x18, 0x80, 0x14, 0x80, + 0x0F, 0x80, 0x08, 0x00, 0x01, 0x00, 0xFB, 0x00, 0xF6, 0x00, 0xF4, 0x00, + 0xF4, 0x00, 0xF6, 0x00, 0xF9, 0x00, 0xFD, 0x00, 0x00, 0x00, 0x01, 0x80, + 0x02, 0x80, 0x03, 0x80, 0x04, 0x80, 0x06, 0x80, 0x0A, 0x00, 0x10, 0x00, + 0x16, 0x00, 0x1D, 0x80, 0x24, 0x00, 0x29, 0x00, 0x2B, 0x00, 0x2A, 0x80, + 0x28, 0x80, 0x23, 0x80, 0x1F, 0x80, 0x1A, 0x80, 0x17, 0x00, 0x14, 0x00, + 0x12, 0x80, 0x10, 0x80, 0x0F, 0x00, 0x0B, 0x00, 0x06, 0x80, 0xFF, 0x80, + 0xF8, 0x00, 0xF1, 0x80, 0xEC, 0x80, 0xE9, 0x00, 0xE8, 0x80, 0xEB, 0x00, + 0xEE, 0x00, 0xF3, 0x00, 0xF8, 0x00, 0xFC, 0x00, 0xFE, 0x00, 0xFF, 0x80, + 0x01, 0x00, 0x0D, 0x80, 0x17, 0x80, 0x1E, 0x80, 0x21, 0x80, 0x21, 0x80, + 0x1F, 0x80, 0x1C, 0x80, 0x1A, 0x00, 0x18, 0x80, 0x18, 0x80, 0x17, 0x80, + 0x15, 0x00, 0x11, 0x00, 0x0A, 0x80, 0x02, 0x00, 0xF9, 0x00, 0xF1, 0x00, + 0xED, 0x00, 0xEB, 0x80, 0xEF, 0x00, 0xF5, 0x80, 0xFE, 0x00, 0x07, 0x80, + 0x0F, 0x00, 0x15, 0x00, 0x19, 0x00, 0x1B, 0x80, 0x1D, 0x80, 0x21, 0x00, + 0x25, 0x00, 0x2A, 0x80, 0x2F, 0x80, 0x32, 0x00, 0x32, 0x00, 0x2F, 0x00, + 0x27, 0x80, 0x1C, 0x80, 0x11, 0x00, 0x06, 0x80, 0xFE, 0x80, 0xF9, 0x00, + 0xF7, 0x80, 0xF8, 0x00, 0xF8, 0x80, 0xF9, 0x80, 0xFA, 0x00, 0xFA, 0x00, + 0xF9, 0x80, 0xF9, 0x80, 0xFD, 0x80, 0x03, 0x00, 0x0B, 0x80, 0x14, 0x80, + 0x1E, 0x00, 0x25, 0x00, 0x28, 0x80, 0x28, 0x80, 0x24, 0x00, 0x1D, 0x00, + 0x15, 0x00, 0x0E, 0x00, 0x07, 0x80, 0x03, 0x00, 0x01, 0x00, 0x0F, 0x80, + 0x1A, 0x00, 0x20, 0x80, 0x22, 0x80, 0x21, 0x00, 0x1C, 0x80, 0x18, 0x00, + 0x14, 0x00, 0x11, 0x00, 0x0F, 0x80, 0x0C, 0x80, 0x07, 0x00, 0x00, 0x00, + 0xF8, 0x00, 0xF0, 0x80, 0xEC, 0x00, 0xEC, 0x00, 0xF1, 0x00, 0xFA, 0x80, + 0x07, 0x80, 0x14, 0x00, 0x1E, 0x80, 0x26, 0x00, 0x29, 0x80, 0x29, 0x80, + 0x28, 0x80, 0x27, 0x80, 0x27, 0x00, 0x26, 0x00, 0x24, 0x80, 0x20, 0x80, + 0x19, 0x80, 0x10, 0x00, 0x04, 0x80, 0xFA, 0x00, 0xF2, 0x00, 0xEE, 0x80, + 0xF0, 0x80, 0xF7, 0x80, 0x00, 0x80, 0x0A, 0x80, 0x12, 0x80, 0x19, 0x00, + 0x1C, 0x00, 0x1E, 0x00, 0x1F, 0x00, 0x21, 0x80, 0x24, 0x80, 0x26, 0x80, + 0x27, 0x00, 0x23, 0x80, 0x1C, 0x00, 0x10, 0x00, 0x02, 0x80, 0xF5, 0x00, + 0xEB, 0x80, 0xE5, 0x80, 0xE4, 0x80, 0xE8, 0x80, 0xEE, 0x80, 0xF4, 0x00, + 0xF9, 0x80, 0xFD, 0x80, 0x01, 0x00, 0x10, 0x80, 0x1C, 0x80, 0x22, 0x80, + 0x23, 0x80, 0x1E, 0x80, 0x18, 0x00, 0x12, 0x00, 0x0C, 0x80, 0x08, 0x80, + 0x05, 0x00, 0x00, 0x00, 0xFA, 0x00, 0xF3, 0x80, 0xEF, 0x00, 0xEE, 0x80, + 0xF2, 0x80, 0xFD, 0x00, 0x0B, 0x80, 0x1A, 0x80, 0x27, 0x00, 0x2F, 0x00, + 0x2F, 0x80, 0x2D, 0x00, 0x26, 0x80, 0x1F, 0x80, 0x19, 0x00, 0x14, 0x80, + 0x0F, 0x80, 0x0A, 0x80, 0x04, 0x00, 0xFC, 0x80, 0xF6, 0x00, 0xF3, 0x80, + 0xF5, 0x80, 0xFE, 0x00, 0x0B, 0x80, 0x19, 0x80, 0x27, 0x00, 0x2F, 0x00, + 0x30, 0x80, 0x2E, 0x00, 0x27, 0x00, 0x1E, 0x80, 0x17, 0x80, 0x11, 0x80, + 0x0D, 0x00, 0x07, 0x00, 0x00, 0x00, 0xF8, 0x80, 0xF0, 0x80, 0xEC, 0x00, + 0xEC, 0x80, 0xF1, 0x80, 0xFD, 0x00, 0x0A, 0x80, 0x17, 0x80, 0x21, 0x00, + 0x24, 0x80, 0x22, 0x80, 0x1C, 0x00, 0x13, 0x00, 0x0C, 0x00, 0x05, 0x00, + 0x01, 0x00, 0x0F, 0x00, 0x19, 0x80, 0x1D, 0x80, 0x1C, 0x00, 0x16, 0x00, + 0x0F, 0x80, 0x09, 0x00, 0x03, 0x80, 0x00, 0x00, 0xFC, 0x00, 0xF8, 0x80, + 0xF4, 0x80, 0xF3, 0x00, 0xF5, 0x00, 0xFC, 0x00, 0x07, 0x80, 0x15, 0x00, + 0x21, 0x80, 0x29, 0x00, 0x2A, 0x00, 0x25, 0x00, 0x1B, 0x00, 0x10, 0x80, + 0x08, 0x00, 0x03, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFD, 0x80, 0xFD, 0x80, + 0xFE, 0x80, 0x03, 0x00, 0x0A, 0x00, 0x14, 0x80, 0x20, 0x80, 0x29, 0x00, + 0x2D, 0x80, 0x2A, 0x80, 0x20, 0x80, 0x13, 0x80, 0x08, 0x00, 0xFE, 0x80, + 0xF9, 0x80, 0xF9, 0x00, 0xFA, 0x80, 0xFD, 0x00, 0xFF, 0x80, 0x02, 0x80, + 0x07, 0x00, 0x0D, 0x80, 0x16, 0x80, 0x1D, 0x80, 0x23, 0x80, 0x23, 0x80, + 0x1C, 0x80, 0x10, 0x80, 0x03, 0x00, 0xF5, 0x80, 0xED, 0x00, 0xEB, 0x00, + 0xED, 0x00, 0xF1, 0x00, 0xF7, 0x00, 0xFC, 0x00, 0x03, 0x80, 0x1C, 0x00, + 0x2D, 0x00, 0x32, 0x00, 0x2D, 0x80, 0x22, 0x80, 0x1A, 0x00, 0x18, 0x00, + 0x1B, 0x80, 0x22, 0x00, 0x27, 0x00, 0x27, 0x80, 0x23, 0x80, 0x1E, 0x80, + 0x1A, 0x80, 0x1C, 0x00, 0x20, 0x80, 0x24, 0x80, 0x23, 0x80, 0x1E, 0x80, + 0x16, 0x80, 0x10, 0x00, 0x0D, 0x80, 0x0E, 0x80, 0x10, 0x00, 0x10, 0x00, + 0x06, 0x00, 0xF8, 0x80, 0xE8, 0x80, 0xDF, 0x80, 0xE0, 0x00, 0xEC, 0x80, + 0x01, 0x80, 0x15, 0x80, 0x21, 0x80, 0x23, 0x00, 0x19, 0x80, 0x0C, 0x00, + 0x00, 0x80, 0xFC, 0x00, 0xFD, 0x80, 0x03, 0x80, 0x07, 0x00, 0x08, 0x00, + 0x04, 0x00, 0xFF, 0x80, 0xFD, 0x80, 0x00, 0x00, 0x06, 0x00, 0x0B, 0x80, + 0x0E, 0x00, 0x0B, 0x00, 0x04, 0x80, 0x01, 0x00, 0x00, 0x80, 0x03, 0x80, + 0x08, 0x00, 0x08, 0x80, 0x02, 0x00, 0xF5, 0x80, 0xE6, 0x80, 0xDE, 0x80, + 0xDF, 0x00, 0xED, 0x00, 0x02, 0x00, 0x14, 0x80, 0x24, 0x00, 0x30, 0x00, + 0x37, 0x80, 0x3B, 0x00, 0x3B, 0x80, 0x39, 0x80, 0x36, 0x00, 0x33, 0x80, + 0x31, 0x00, 0x2F, 0x80, 0x2E, 0x80, 0x2E, 0x00, 0x2E, 0x80, 0x2D, 0x00, + 0x2C, 0x80, 0x2B, 0x80, 0x2A, 0x00, 0x26, 0x80, 0x25, 0x00, 0x20, 0x80, + 0x1E, 0x80, 0x1C, 0x80, 0x1B, 0x00, 0x18, 0x80, 0x16, 0x80, 0x16, 0x00, + 0x13, 0x00, 0x11, 0x00, 0x0F, 0x80, 0x0D, 0x80, 0x0D, 0x80, 0x0E, 0x80, + 0x0F, 0x80, 0x10, 0x00, 0x12, 0x00, 0x11, 0x80, 0x11, 0x80, 0x10, 0x00, + 0x0F, 0x80, 0x0E, 0x00, 0x0D, 0x80, 0x0C, 0x80, 0x0B, 0x00, 0x0B, 0x00, + 0x09, 0x80, 0x06, 0x80, 0x04, 0x80, 0x02, 0x00, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x00, 0xFF, 0x80, 0xFF, 0x00, 0xFE, 0x80, 0xFE, 0x00, 0xFE, 0x00, + 0xFE, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0x01, 0x80, 0x00, 0x00, 0x00, 0x80, + 0x03, 0x00, 0x06, 0x80, 0x08, 0x00, 0x06, 0x00, 0x02, 0x80, 0xFD, 0x80, + 0xFD, 0x00, 0xFA, 0x80, 0xF4, 0x80, 0xF5, 0x00, 0xFC, 0x00, 0x00, 0x80, + 0x02, 0x00, 0x06, 0x00, 0x09, 0x00, 0x01, 0x00, 0xF9, 0x00, 0xF7, 0x00, + 0xF8, 0x00, 0xF7, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xFE, 0x00, 0x04, 0x80, + 0x06, 0x80, 0x06, 0x00, 0x07, 0x00, 0x08, 0x80, 0x02, 0x00, 0xFF, 0x80, + 0x06, 0x80, 0x0C, 0x80, 0x0A, 0x80, 0x06, 0x00, 0xFF, 0x80, 0xFC, 0x00, + 0xF8, 0x80, 0xF9, 0x80, 0xFF, 0x80, 0x01, 0x00, 0xFE, 0x00, 0xF8, 0x00, + 0xF0, 0x80, 0xEE, 0x00, 0xEB, 0x00, 0xE2, 0x00, 0xDB, 0x00, 0xD9, 0x00, + 0xDD, 0x80, 0xE2, 0x00, 0xE9, 0x00, 0xF2, 0x00, 0xF4, 0x00, 0xF1, 0x00, + 0xF0, 0x80, 0xF0, 0x00, 0xF4, 0x00, 0xF4, 0x80, 0xF1, 0x00, 0xF3, 0x00, + 0xF9, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x80, 0x14, 0x00, + 0x23, 0x80, 0x2C, 0x80, 0x2F, 0x80, 0x2F, 0x80, 0x2D, 0x00, 0x2C, 0x80, + 0x2D, 0x80, 0x2F, 0x80, 0x32, 0x00, 0x33, 0x80, 0x35, 0x80, 0x35, 0x80, + 0x34, 0x00, 0x34, 0x00, 0x30, 0x00, 0x2F, 0x80, 0x2C, 0x80, 0x2A, 0x00, + 0x2A, 0x00, 0x28, 0x80, 0x29, 0x80, 0x2C, 0x00, 0x2B, 0x00, 0x2B, 0x00, + 0x2A, 0x00, 0x29, 0x00, 0x29, 0x00, 0x27, 0x80, 0x27, 0x80, 0x26, 0x00, + 0x25, 0x00, 0x21, 0x80, 0x1E, 0x00, 0x1A, 0x80, 0x16, 0x80, 0x16, 0x80, + 0x17, 0x80, 0x17, 0x80, 0x18, 0x00, 0x19, 0x00, 0x19, 0x00, 0x16, 0x80, + 0x16, 0x80, 0x15, 0x80, 0x13, 0x00, 0x13, 0x00, 0x11, 0x00, 0x0E, 0x00, + 0x0C, 0x00, 0x08, 0x80, 0x07, 0x80, 0x06, 0x80, 0x06, 0x80, 0x07, 0x00, + 0x07, 0x00, 0x06, 0x00, 0x05, 0x80, 0x04, 0x80, 0x02, 0x80, 0x00, 0x80, + 0xFF, 0x80, 0xFE, 0x80, 0x01, 0x80, 0x1E, 0x00, 0x31, 0x80, 0x3B, 0x80, + 0x3C, 0x80, 0x3B, 0x00, 0x39, 0x80, 0x3A, 0x00, 0x39, 0x00, 0x38, 0x00, + 0x36, 0x80, 0x35, 0x80, 0x34, 0x80, 0x34, 0x80, 0x35, 0x00, 0x35, 0x80, + 0x33, 0x80, 0x31, 0x00, 0x2F, 0x80, 0x2D, 0x00, 0x2C, 0x00, 0x2C, 0x80, + 0x2C, 0x80, 0x2B, 0x80, 0x28, 0x80, 0x28, 0x00, 0x28, 0x80, 0x25, 0x80, + 0x25, 0x00, 0x24, 0x00, 0x23, 0x00, 0x22, 0x80, 0x22, 0x00, 0x23, 0x80, + 0x20, 0x00, 0x1B, 0x80, 0x1B, 0x00, 0x1A, 0x00, 0x1B, 0x80, 0x18, 0x80, + 0x17, 0x80, 0x13, 0x80, 0x12, 0x00, 0x11, 0x80, 0x10, 0x80, 0x12, 0x80, + 0x0F, 0x80, 0x0F, 0x00, 0x0E, 0x00, 0x0D, 0x00, 0x0E, 0x00, 0x0A, 0x00, + 0x08, 0x00, 0x07, 0x80, 0x07, 0x80, 0x06, 0x80, 0x04, 0x00, 0x02, 0x00, + 0x00, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0xFD, 0x80, 0xFF, 0x00, + 0x02, 0x00, 0x1A, 0x00, 0x2C, 0x80, 0x39, 0x00, 0x3D, 0x80, 0x3E, 0x80, + 0x3D, 0x00, 0x37, 0x80, 0x30, 0x00, 0x28, 0x80, 0x24, 0x80, 0x21, 0x00, + 0x21, 0x80, 0x1E, 0x80, 0x1D, 0x80, 0x1B, 0x00, 0x19, 0x00, 0x15, 0x00, + 0x14, 0x00, 0x10, 0x80, 0x0F, 0x00, 0x0C, 0x80, 0x0C, 0x00, 0x0C, 0x80, + 0x0C, 0x00, 0x0A, 0x00, 0x03, 0x80, 0xFF, 0x80, 0xF8, 0x80, 0xF4, 0x80, + 0xF1, 0x80, 0xF0, 0x80, 0xF2, 0x00, 0xF5, 0x00, 0xF9, 0x00, 0xFD, 0x00, + 0x01, 0x80, 0x03, 0x80, 0x06, 0x80, 0x08, 0x00, 0x08, 0x00, 0x07, 0x00, + 0x07, 0x00, 0x06, 0x80, 0x08, 0x80, 0x0A, 0x00, 0x07, 0x80, 0x03, 0x00, + 0xFE, 0x80, 0xFA, 0x80, 0xF7, 0x80, 0xF6, 0x80, 0xF5, 0x80, 0xF4, 0x00, + 0xF5, 0x00, 0xF7, 0x80, 0xFB, 0x00, 0xFD, 0x00, 0xFE, 0x80, 0x00, 0x00, + 0x00, 0x80, 0x03, 0x00, 0x04, 0x00, 0x02, 0x80, 0x01, 0x80, 0x19, 0x00, + 0x2D, 0x00, 0x37, 0x80, 0x3B, 0x80, 0x3A, 0x80, 0x34, 0x00, 0x2C, 0x00, + 0x25, 0x80, 0x20, 0x00, 0x1D, 0x00, 0x1C, 0x80, 0x1D, 0x80, 0x1F, 0x00, + 0x1F, 0x80, 0x1F, 0x00, 0x1B, 0x00, 0x14, 0x80, 0x0C, 0x80, 0x01, 0x80, + 0xF7, 0x00, 0xEF, 0x80, 0xEB, 0x80, 0xEA, 0x00, 0xEC, 0x00, 0xEF, 0x00, + 0xF1, 0x00, 0xF2, 0x80, 0xF2, 0x80, 0xF3, 0x00, 0xF4, 0x00, 0xF4, 0x00, + 0xF7, 0x80, 0xF9, 0x00, 0xFC, 0x80, 0x01, 0x80, 0x04, 0x00, 0x08, 0x80, + 0x0A, 0x80, 0x0B, 0x80, 0x0A, 0x00, 0x06, 0x00, 0x02, 0x80, 0xFC, 0x80, + 0xFA, 0x00, 0xF7, 0x00, 0xF6, 0x00, 0xF7, 0x80, 0xF8, 0x80, 0xF7, 0x80, + 0xF7, 0x80, 0xF7, 0x00, 0xF7, 0x80, 0xF5, 0x00, 0xF6, 0x00, 0xF6, 0x80, + 0xF8, 0x00, 0xF9, 0x00, 0xF7, 0x80, 0xF8, 0x00, 0xF9, 0x00, 0xFA, 0x80, + 0xFB, 0x00, 0xFE, 0x00, 0x01, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x80, + 0x02, 0x00, 0xFE, 0x80, 0xFD, 0x80, 0xFC, 0x00, 0xF7, 0x00, 0xF8, 0x00, + 0xFB, 0x00, 0xFD, 0x00, 0xFE, 0x80, 0x01, 0x80, 0x05, 0x00, 0x01, 0x00, + 0xFB, 0x80, 0xF9, 0x00, 0xF7, 0x80, 0xF7, 0x00, 0xF7, 0x00, 0xF7, 0x80, + 0xFB, 0x80, 0x00, 0x00, 0x03, 0x80, 0x06, 0x00, 0x09, 0x00, 0x0A, 0x00, + 0x05, 0x00, 0x01, 0x00, 0x03, 0x00, 0x05, 0x80, 0x06, 0x80, 0x05, 0x80, + 0x00, 0x00, 0xFD, 0x00, 0xFB, 0x80, 0xFD, 0x80, 0x01, 0x80, 0x00, 0x00, + 0xFB, 0x80, 0xF7, 0x00, 0xF0, 0x80, 0xED, 0x00, 0xEB, 0x80, 0xE6, 0x80, + 0xE3, 0x80, 0xDF, 0x00, 0xE1, 0x00, 0xE5, 0x00, 0xEA, 0x00, 0xF0, 0x80, + 0xF1, 0x00, 0xF0, 0x80, 0xF3, 0x00, 0xF4, 0x80, 0xF7, 0x80, 0xF7, 0x80, + 0xF3, 0x80, 0xF3, 0x80, 0xF5, 0x80, 0xFD, 0x80, 0x01, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x00, 0x80, 0xFF, 0x00, 0x00, 0x80, 0xFF, 0x00, + 0xFE, 0x00, 0xFB, 0x80, 0xFA, 0x00, 0xF9, 0x00, 0xFA, 0x80, 0xFA, 0x00, + 0xFB, 0x80, 0xFF, 0x00, 0xFF, 0x00, 0xFA, 0x00, 0xF8, 0x80, 0xF8, 0x00, + 0xF9, 0x00, 0xF7, 0x80, 0xF8, 0x00, 0xF9, 0x00, 0xFA, 0x80, 0xFE, 0x00, + 0x01, 0x80, 0x03, 0x80, 0x05, 0x00, 0x05, 0x80, 0x02, 0x80, 0x02, 0x80, + 0x04, 0x80, 0x04, 0x80, 0x04, 0x00, 0x03, 0x80, 0x01, 0x80, 0xFF, 0x00, + 0xFE, 0x00, 0x01, 0x00, 0x04, 0x00, 0x03, 0x00, 0xFE, 0x00, 0xFC, 0x00, + 0xF8, 0x80, 0xF5, 0x00, 0xF2, 0x00, 0xF0, 0x00, 0xEF, 0x00, 0xED, 0x00, + 0xEC, 0x00, 0xEF, 0x80, 0xF3, 0x00, 0xF6, 0x80, 0xF7, 0x00, 0xF6, 0x80, + 0xF7, 0x80, 0xF8, 0x00, 0xF9, 0x80, 0xFB, 0x00, 0xF8, 0x00, 0xF8, 0x80, + 0xF8, 0x80, 0xFE, 0x00, 0x00, 0x80, 0x01, 0x00, 0x01, 0x00, 0x04, 0x80, + 0x08, 0x00, 0x0A, 0x80, 0x0E, 0x00, 0x10, 0x00, 0x12, 0x80, 0x14, 0x80, + 0x17, 0x00, 0x19, 0x80, 0x1C, 0x80, 0x1E, 0x80, 0x1F, 0x80, 0x21, 0x80, + 0x23, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x27, 0x00, 0x28, 0x00, + 0x28, 0x80, 0x29, 0x80, 0x29, 0x80, 0x2A, 0x80, 0x2A, 0x00, 0x2A, 0x80, + 0x2A, 0x80, 0x2B, 0x00, 0x2B, 0x00, 0x2A, 0x80, 0x2B, 0x00, 0x2A, 0x80, + 0x2A, 0x80, 0x2B, 0x00, 0x2A, 0x80, 0x2A, 0x80, 0x2A, 0x80, 0x2A, 0x00, + 0x2A, 0x00, 0x29, 0x80, 0x2A, 0x00, 0x29, 0x00, 0x29, 0x00, 0x28, 0x00, + 0x27, 0x80, 0x26, 0x80, 0x26, 0x80, 0x25, 0x80, 0x24, 0x80, 0x23, 0x00, + 0x21, 0x80, 0x1F, 0x80, 0x1E, 0x00, 0x1C, 0x80, 0x1A, 0x00, 0x17, 0x00, + 0x15, 0x00, 0x12, 0x80, 0x10, 0x00, 0x0E, 0x00, 0x0B, 0x00, 0x08, 0x80, + 0x05, 0x00, 0x01, 0x80, 0x02, 0x00, 0x08, 0x00, 0x0E, 0x00, 0x12, 0x00, + 0x16, 0x80, 0x1A, 0x00, 0x1D, 0x80, 0x1F, 0x80, 0x21, 0x80, 0x23, 0x80, + 0x24, 0x80, 0x26, 0x00, 0x26, 0x80, 0x27, 0x80, 0x28, 0x80, 0x2A, 0x00, + 0x2A, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x2A, 0x80, 0x2A, 0x80, 0x2A, 0x80, + 0x29, 0x80, 0x2B, 0x00, 0x2A, 0x00, 0x2A, 0x80, 0x2A, 0x80, 0x2B, 0x00, + 0x2B, 0x80, 0x2C, 0x80, 0x2D, 0x00, 0x2D, 0x00, 0x2D, 0x00, 0x2C, 0x80, + 0x2C, 0x80, 0x2B, 0x80, 0x2B, 0x80, 0x2A, 0x80, 0x2A, 0x80, 0x29, 0x80, + 0x29, 0x80, 0x29, 0x00, 0x29, 0x80, 0x29, 0x80, 0x29, 0x00, 0x29, 0x00, + 0x29, 0x80, 0x29, 0x80, 0x29, 0x00, 0x27, 0x80, 0x27, 0x00, 0x26, 0x00, + 0x25, 0x00, 0x23, 0x80, 0x22, 0x80, 0x20, 0x80, 0x1F, 0x00, 0x1D, 0x00, + 0x1A, 0x80, 0x18, 0x00, 0x13, 0x80, 0x0F, 0x80, 0x09, 0x80, 0x05, 0x00, + 0x01, 0x00, 0x06, 0x80, 0x0C, 0x00, 0x10, 0x00, 0x14, 0x00, 0x17, 0x00, + 0x1B, 0x00, 0x1D, 0x80, 0x20, 0x00, 0x22, 0x80, 0x24, 0x00, 0x25, 0x00, + 0x25, 0x80, 0x25, 0x80, 0x26, 0x00, 0x26, 0x00, 0x25, 0x80, 0x25, 0x80, + 0x25, 0x00, 0x24, 0x80, 0x24, 0x80, 0x25, 0x00, 0x25, 0x80, 0x26, 0x00, + 0x26, 0x80, 0x27, 0x80, 0x27, 0x80, 0x28, 0x80, 0x2A, 0x00, 0x2A, 0x00, + 0x2B, 0x00, 0x2A, 0x80, 0x2B, 0x00, 0x2A, 0x80, 0x2A, 0x00, 0x2A, 0x00, + 0x29, 0x00, 0x28, 0x00, 0x27, 0x80, 0x26, 0x00, 0x26, 0x00, 0x25, 0x00, + 0x25, 0x80, 0x23, 0x80, 0x24, 0x00, 0x23, 0x80, 0x24, 0x80, 0x24, 0x80, + 0x24, 0x80, 0x24, 0x80, 0x24, 0x80, 0x24, 0x00, 0x24, 0x00, 0x23, 0x00, + 0x21, 0x80, 0x1F, 0x80, 0x1E, 0x00, 0x1B, 0x80, 0x18, 0x80, 0x15, 0x80, + 0x11, 0x00, 0x0D, 0x80, 0x08, 0x00, 0x03, 0x80, 0x01, 0x80, 0x0D, 0x00, + 0x16, 0x80, 0x1D, 0x80, 0x20, 0x80, 0x22, 0x80, 0x21, 0x00, 0x20, 0x80, + 0x21, 0x00, 0x23, 0x00, 0x24, 0x80, 0x25, 0x80, 0x27, 0x00, 0x27, 0x00, + 0x27, 0x80, 0x26, 0x80, 0x27, 0x00, 0x26, 0x80, 0x27, 0x00, 0x28, 0x00, + 0x28, 0x80, 0x29, 0x80, 0x29, 0x00, 0x29, 0x80, 0x29, 0x00, 0x29, 0x80, + 0x2A, 0x00, 0x2A, 0x80, 0x2B, 0x00, 0x2B, 0x80, 0x2C, 0x00, 0x2C, 0x00, + 0x2B, 0x80, 0x2C, 0x00, 0x2B, 0x80, 0x2B, 0x00, 0x2A, 0x80, 0x29, 0x80, + 0x2A, 0x00, 0x28, 0x80, 0x29, 0x00, 0x28, 0x00, 0x29, 0x00, 0x28, 0x80, + 0x28, 0x00, 0x27, 0x00, 0x26, 0x80, 0x26, 0x00, 0x25, 0x80, 0x25, 0x80, + 0x25, 0x80, 0x26, 0x80, 0x25, 0x80, 0x24, 0x80, 0x22, 0x80, 0x20, 0x80, + 0x1E, 0x80, 0x1D, 0x80, 0x1F, 0x80, 0x1F, 0x80, 0x1D, 0x80, 0x1A, 0x00, + 0x12, 0x00, 0x08, 0x80, 0x02, 0x00, 0x16, 0x00, 0x26, 0x00, 0x2D, 0x00, + 0x2E, 0x80, 0x2B, 0x00, 0x26, 0x80, 0x26, 0x00, 0x26, 0x80, 0x26, 0x00, + 0x26, 0x80, 0x25, 0x00, 0x24, 0x80, 0x22, 0x80, 0x22, 0x80, 0x23, 0x00, + 0x22, 0x80, 0x24, 0x00, 0x26, 0x80, 0x29, 0x00, 0x2B, 0x00, 0x2F, 0x80, + 0x2E, 0x00, 0x2E, 0x80, 0x2D, 0x00, 0x2C, 0x80, 0x2B, 0x80, 0x2B, 0x00, + 0x29, 0x80, 0x27, 0x80, 0x24, 0x80, 0x22, 0x00, 0x22, 0x00, 0x24, 0x80, + 0x25, 0x80, 0x26, 0x00, 0x28, 0x00, 0x2A, 0x00, 0x2C, 0x80, 0x2D, 0x80, + 0x2E, 0x00, 0x2C, 0x80, 0x2D, 0x80, 0x2A, 0x80, 0x2A, 0x00, 0x27, 0x80, + 0x25, 0x80, 0x24, 0x80, 0x21, 0x00, 0x1F, 0x80, 0x21, 0x80, 0x23, 0x80, + 0x23, 0x80, 0x23, 0x80, 0x21, 0x00, 0x20, 0x00, 0x21, 0x80, 0x26, 0x80, + 0x2B, 0x80, 0x2E, 0x80, 0x2C, 0x00, 0x24, 0x00, 0x19, 0x00, 0x0C, 0x80, + 0x01, 0x80, 0x0F, 0x00, 0x19, 0x80, 0x23, 0x80, 0x2B, 0x00, 0x30, 0x80, + 0x35, 0x00, 0x37, 0x80, 0x39, 0x80, 0x39, 0x80, 0x3B, 0x00, 0x3B, 0x00, + 0x3A, 0x00, 0x39, 0x00, 0x38, 0x00, 0x35, 0x00, 0x32, 0x80, 0x2D, 0x00, + 0x29, 0x00, 0x24, 0x00, 0x20, 0x00, 0x1B, 0x00, 0x15, 0x00, 0x13, 0x00, + 0x0E, 0x80, 0x0B, 0x00, 0x09, 0x00, 0x06, 0x00, 0x04, 0x00, 0x02, 0x80, + 0x02, 0x00, 0xFE, 0x80, 0xFD, 0x80, 0xFD, 0x00, 0xFC, 0x80, 0xFC, 0x80, + 0xFC, 0x00, 0xFA, 0x00, 0xFB, 0x00, 0xFB, 0x80, 0xFB, 0x80, 0xFD, 0x00, + 0xFE, 0x00, 0xFF, 0x00, 0x02, 0x00, 0x01, 0x80, 0x03, 0x00, 0x03, 0x80, + 0x04, 0x80, 0x04, 0x00, 0x04, 0x80, 0x05, 0x80, 0x05, 0x80, 0x06, 0x00, + 0x05, 0x80, 0x05, 0x00, 0x05, 0x80, 0x05, 0x80, 0x06, 0x00, 0x03, 0x80, + 0x03, 0x00, 0x02, 0x80, 0x00, 0x80, 0x01, 0x00, 0x01, 0x80, 0x17, 0x80, + 0x21, 0x00, 0x1F, 0x00, 0x1D, 0x00, 0x1E, 0x00, 0x1E, 0x80, 0x1D, 0x00, + 0x1D, 0x80, 0x1E, 0x80, 0x21, 0x00, 0x1E, 0x80, 0x1E, 0x00, 0x1E, 0x00, + 0x20, 0x00, 0x1F, 0x80, 0x1E, 0x80, 0x1E, 0x00, 0x1D, 0x80, 0x1D, 0x80, + 0x1C, 0x00, 0x1E, 0x80, 0x1F, 0x80, 0x1E, 0x80, 0x1D, 0x80, 0x1D, 0x00, + 0x1D, 0x80, 0x1D, 0x80, 0x1D, 0x80, 0x1E, 0x00, 0x20, 0x80, 0x1F, 0x80, + 0x1E, 0x00, 0x1F, 0x80, 0x1F, 0x80, 0x1E, 0x00, 0x1C, 0x80, 0x1C, 0x80, + 0x1D, 0x80, 0x1C, 0x80, 0x1D, 0x00, 0x1D, 0x00, 0x1F, 0x00, 0x1D, 0x80, + 0x1C, 0x00, 0x1C, 0x80, 0x1E, 0x00, 0x1D, 0x80, 0x1D, 0x80, 0x1E, 0x00, + 0x1E, 0x00, 0x1D, 0x80, 0x1D, 0x80, 0x1D, 0x80, 0x1F, 0x00, 0x1D, 0x80, + 0x1B, 0x80, 0x1C, 0x00, 0x1D, 0x80, 0x1D, 0x00, 0x1A, 0x80, 0x1B, 0x80, + 0x1E, 0x00, 0x14, 0x80, 0x01, 0x80, 0x04, 0x80, 0x08, 0x00, 0x0A, 0x80, + 0x0D, 0x80, 0x0F, 0x80, 0x12, 0x00, 0x15, 0x00, 0x17, 0x00, 0x1A, 0x00, + 0x1D, 0x00, 0x1F, 0x80, 0x22, 0x00, 0x24, 0x80, 0x26, 0x80, 0x29, 0x00, + 0x2B, 0x00, 0x2D, 0x00, 0x2E, 0x00, 0x2F, 0x80, 0x31, 0x00, 0x33, 0x00, + 0x34, 0x00, 0x35, 0x80, 0x36, 0x00, 0x37, 0x80, 0x38, 0x00, 0x39, 0x00, + 0x39, 0x80, 0x3A, 0x00, 0x3A, 0x80, 0x3A, 0x80, 0x3A, 0x80, 0x3A, 0x80, + 0x3A, 0x00, 0x39, 0x80, 0x39, 0x00, 0x38, 0x00, 0x37, 0x80, 0x36, 0x00, + 0x35, 0x80, 0x34, 0x00, 0x33, 0x00, 0x31, 0x00, 0x2F, 0x80, 0x2E, 0x00, + 0x2D, 0x00, 0x2B, 0x00, 0x29, 0x00, 0x26, 0x80, 0x24, 0x80, 0x22, 0x00, + 0x1F, 0x80, 0x1D, 0x00, 0x1A, 0x00, 0x17, 0x00, 0x15, 0x00, 0x12, 0x00, + 0x0F, 0x80, 0x0D, 0x80, 0x0A, 0x80, 0x08, 0x00, 0x04, 0x80, 0x01, 0x80, + 0x00, 0x80, 0x01, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x80, 0xFF, 0x00, + 0xFC, 0x80, 0xFB, 0x00, 0xFA, 0x80, 0xFA, 0x80, 0xFB, 0x00, 0xFC, 0x80, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x80, 0xFF, 0x00, 0xFE, 0x00, 0xFC, 0x80, + 0xFC, 0x00, 0xFC, 0x00, 0xFD, 0x00, 0xFE, 0x80, 0x00, 0x00, 0x02, 0x80, + 0x06, 0x80, 0x08, 0x80, 0x08, 0x80, 0x07, 0x80, 0x05, 0x80, 0x05, 0x80, + 0x06, 0x00, 0x07, 0x80, 0x08, 0x80, 0x07, 0x80, 0x04, 0x00, 0x02, 0x00, + 0x01, 0x80, 0x03, 0x80, 0x05, 0x00, 0x04, 0x80, 0x03, 0x00, 0x02, 0x00, + 0xFF, 0x80, 0xFC, 0x00, 0xF8, 0x80, 0xF5, 0x80, 0xF3, 0x00, 0xF0, 0x80, + 0xF2, 0x00, 0xF4, 0x80, 0xF7, 0x00, 0xFA, 0x80, 0xFC, 0x00, 0xFB, 0x80, + 0xFB, 0x00, 0xFA, 0x00, 0xFA, 0x80, 0xFA, 0x80, 0xFA, 0x00, 0xFA, 0x80, + 0xFB, 0x80, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x80, 0x02, 0x80, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x80, 0xFE, 0x80, 0xFC, 0x80, + 0xF9, 0x80, 0xFA, 0x00, 0xFB, 0x00, 0xFB, 0x80, 0xFD, 0x80, 0x00, 0x80, + 0x00, 0x80, 0xFC, 0x80, 0xF9, 0x00, 0xF9, 0x00, 0xF9, 0x80, 0xF9, 0x00, + 0xF9, 0x00, 0xF9, 0x00, 0xFB, 0x80, 0xFF, 0x00, 0x01, 0x80, 0x03, 0x80, + 0x05, 0x00, 0x04, 0x80, 0x01, 0x00, 0x01, 0x80, 0x03, 0x80, 0x04, 0x00, + 0x04, 0x00, 0x03, 0x80, 0x00, 0x80, 0xFE, 0x00, 0xFD, 0x00, 0x00, 0x00, + 0x02, 0x80, 0x00, 0x80, 0xFE, 0x00, 0xFB, 0x00, 0xF6, 0x80, 0xF2, 0x80, + 0xF1, 0x00, 0xEF, 0x00, 0xED, 0x80, 0xEA, 0x80, 0xEA, 0x00, 0xEE, 0x00, + 0xF2, 0x00, 0xF5, 0x80, 0xF6, 0x00, 0xF6, 0x00, 0xF7, 0x80, 0xF7, 0x00, + 0xF7, 0x80, 0xFA, 0x00, 0xF9, 0x00, 0xF8, 0x80, 0xF8, 0x00, 0xFE, 0x00, + 0x02, 0x00, 0x01, 0x80, 0x02, 0x00, 0x2D, 0x80, 0x3D, 0x00, 0x38, 0x00, + 0x34, 0x80, 0x38, 0x80, 0x37, 0x80, 0x33, 0x80, 0x32, 0x00, 0x34, 0x80, + 0x37, 0x80, 0x34, 0x80, 0x31, 0x80, 0x31, 0x00, 0x30, 0x80, 0x2E, 0x80, + 0x2C, 0x80, 0x2D, 0x80, 0x2B, 0x00, 0x29, 0x80, 0x26, 0x80, 0x27, 0x80, + 0x27, 0x00, 0x27, 0x00, 0x26, 0x80, 0x26, 0x00, 0x24, 0x00, 0x21, 0x00, + 0x1F, 0x80, 0x20, 0x00, 0x22, 0x80, 0x20, 0x00, 0x1E, 0x80, 0x1E, 0x80, + 0x1D, 0x00, 0x19, 0x80, 0x1A, 0x80, 0x17, 0x80, 0x18, 0x80, 0x16, 0x00, + 0x14, 0x00, 0x14, 0x80, 0x15, 0x00, 0x12, 0x80, 0x13, 0x00, 0x11, 0x80, + 0x12, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0C, 0x80, 0x0B, 0x80, + 0x0B, 0x80, 0x0A, 0x80, 0x07, 0x80, 0x06, 0x80, 0x05, 0x80, 0x06, 0x00, + 0x06, 0x80, 0x06, 0x80, 0x04, 0x80, 0x04, 0x00, 0x02, 0x80, 0x00, 0x80, + 0x21, 0x80, 0x22, 0x00, 0xD5, 0x80, 0xE0, 0x00, 0x29, 0x80, 0x1D, 0x80, + 0xE5, 0x00, 0xD2, 0x80, 0x2D, 0x80, 0x1A, 0x00, 0xDF, 0x80, 0x01, 0x00, + 0xF7, 0x00, 0xDC, 0x00, 0x2A, 0x80, 0x1B, 0x00, 0xD5, 0x00, 0x01, 0x00, + 0x0E, 0x80, 0x08, 0x80, 0x01, 0x00, 0xF4, 0x00, 0x05, 0x80, 0xE3, 0x80, + 0x13, 0x00, 0x1D, 0x00, 0xE4, 0x80, 0x00, 0x80, 0xF0, 0x00, 0x1D, 0x80, + 0x0F, 0x80, 0xE7, 0x00, 0xE8, 0x80, 0x22, 0x80, 0xFF, 0x80, 0x04, 0x00, + 0xD9, 0x80, 0x04, 0x00, 0x3F, 0x00, 0xD5, 0x00, 0xE4, 0x80, 0x2D, 0x80, + 0xEF, 0x80, 0xE3, 0x00, 0x19, 0x00, 0x04, 0x80, 0xF0, 0x80, 0xE8, 0x80, + 0x2F, 0x00, 0xF2, 0x00, 0xED, 0x80, 0x0A, 0x80, 0xF2, 0x80, 0x0A, 0x80, + 0x16, 0x80, 0xF1, 0x80, 0xE8, 0x80, 0x07, 0x00, 0x14, 0x80, 0x0A, 0x80, + 0xF6, 0x80, 0xEF, 0x80, 0x1F, 0x80, 0x29, 0x80, 0x01, 0x00, 0x06, 0x80, + 0x0B, 0x00, 0x0D, 0x00, 0x0E, 0x80, 0x0D, 0x80, 0x0D, 0x00, 0x0D, 0x00, + 0x0E, 0x00, 0x11, 0x00, 0x16, 0x00, 0x1A, 0x80, 0x1E, 0x80, 0x21, 0x80, + 0x23, 0x80, 0x23, 0x80, 0x22, 0x80, 0x21, 0x00, 0x20, 0x80, 0x22, 0x00, + 0x24, 0x00, 0x28, 0x80, 0x2C, 0x00, 0x2F, 0x80, 0x30, 0x80, 0x30, 0x80, + 0x2F, 0x00, 0x2D, 0x80, 0x2B, 0x80, 0x2A, 0x80, 0x2B, 0x00, 0x2D, 0x00, + 0x2F, 0x80, 0x32, 0x00, 0x33, 0x00, 0x33, 0x00, 0x31, 0x80, 0x2E, 0x80, + 0x2B, 0x00, 0x28, 0x00, 0x26, 0x80, 0x26, 0x00, 0x28, 0x00, 0x28, 0x80, + 0x2A, 0x00, 0x29, 0x80, 0x28, 0x80, 0x25, 0x00, 0x21, 0x00, 0x1C, 0x00, + 0x18, 0x80, 0x16, 0x80, 0x16, 0x00, 0x16, 0x80, 0x17, 0x00, 0x16, 0x80, + 0x15, 0x80, 0x12, 0x80, 0x0E, 0x00, 0x0A, 0x00, 0x05, 0x00, 0x02, 0x00, + 0xFF, 0x00, 0xFE, 0x80, 0x01, 0x00, 0x08, 0x00, 0x0D, 0x00, 0x10, 0x00, + 0x11, 0x00, 0x11, 0x80, 0x12, 0x00, 0x13, 0x80, 0x16, 0x00, 0x1A, 0x80, + 0x20, 0x00, 0x25, 0x80, 0x28, 0x80, 0x2A, 0x00, 0x29, 0x00, 0x27, 0x80, + 0x25, 0x80, 0x25, 0x00, 0x26, 0x00, 0x28, 0x00, 0x2A, 0x80, 0x2D, 0x00, + 0x2D, 0x80, 0x2C, 0x00, 0x28, 0x80, 0x24, 0x80, 0x20, 0x00, 0x1C, 0x80, + 0x1B, 0x80, 0x1C, 0x80, 0x1D, 0x80, 0x1D, 0x80, 0x1C, 0x00, 0x18, 0x80, + 0x13, 0x80, 0x0E, 0x80, 0x0A, 0x00, 0x06, 0x00, 0x05, 0x80, 0x05, 0x80, + 0x06, 0x80, 0x07, 0x00, 0x06, 0x00, 0x02, 0x00, 0xFE, 0x00, 0xFA, 0x00, + 0xF6, 0x80, 0xF5, 0x00, 0xF5, 0x80, 0xF7, 0x80, 0xFA, 0x00, 0xFB, 0x80, + 0xFB, 0x80, 0xFA, 0x00, 0xF7, 0x80, 0xF5, 0x00, 0xF3, 0x00, 0xF4, 0x00, + 0xF6, 0x80, 0xFB, 0x00, 0xFF, 0x00, 0x01, 0x80, 0x02, 0x00, 0x01, 0x80, + 0x01, 0x00, 0x09, 0x80, 0x0F, 0x80, 0x12, 0x80, 0x14, 0x00, 0x16, 0x00, + 0x17, 0x00, 0x1A, 0x00, 0x1F, 0x00, 0x24, 0x80, 0x2A, 0x80, 0x2E, 0x80, + 0x30, 0x00, 0x2F, 0x80, 0x2E, 0x00, 0x2C, 0x00, 0x2A, 0x80, 0x2B, 0x80, + 0x2D, 0x80, 0x2F, 0x80, 0x2F, 0x80, 0x2E, 0x00, 0x29, 0x00, 0x23, 0x80, + 0x1D, 0x80, 0x18, 0x00, 0x15, 0x80, 0x14, 0x00, 0x12, 0x80, 0x10, 0x80, + 0x0D, 0x00, 0x06, 0x80, 0xFF, 0x00, 0xF7, 0x00, 0xF0, 0x80, 0xED, 0x80, + 0xEC, 0x00, 0xEA, 0x00, 0xE9, 0x00, 0xE6, 0x00, 0xE1, 0x00, 0xDB, 0x80, + 0xD5, 0x80, 0xD1, 0x80, 0xD0, 0x00, 0xD1, 0x00, 0xD2, 0x00, 0xD4, 0x80, + 0xD5, 0x80, 0xD4, 0x80, 0xD2, 0x80, 0xD1, 0x00, 0xD1, 0x00, 0xD2, 0x00, + 0xD7, 0x00, 0xDC, 0x80, 0xE2, 0x80, 0xE8, 0x00, 0xEA, 0x80, 0xEC, 0x80, + 0xED, 0x80, 0xEF, 0x80, 0xF3, 0x00, 0xF9, 0x80, 0x01, 0x00, 0x0B, 0x00, + 0x11, 0x80, 0x15, 0x80, 0x18, 0x00, 0x1A, 0x00, 0x1C, 0x00, 0x20, 0x00, + 0x26, 0x00, 0x2B, 0x80, 0x2F, 0x80, 0x31, 0x00, 0x2F, 0x80, 0x2C, 0x00, + 0x28, 0x80, 0x25, 0x80, 0x25, 0x00, 0x25, 0x80, 0x24, 0x80, 0x23, 0x00, + 0x1E, 0x00, 0x16, 0x00, 0x0E, 0x00, 0x08, 0x00, 0x03, 0x00, 0x00, 0x00, + 0xFE, 0x80, 0xFC, 0x80, 0xF9, 0x00, 0xF3, 0x80, 0xED, 0x80, 0xE7, 0x00, + 0xE3, 0x00, 0xE2, 0x80, 0xE3, 0x80, 0xE6, 0x80, 0xE8, 0x00, 0xE7, 0x00, + 0xE5, 0x00, 0xE2, 0x80, 0xE2, 0x00, 0xE4, 0x00, 0xE8, 0x80, 0xEE, 0x80, + 0xF3, 0x00, 0xF6, 0x00, 0xF7, 0x80, 0xF6, 0x80, 0xF6, 0x00, 0xF6, 0x80, + 0xFA, 0x80, 0xFF, 0x80, 0x04, 0x80, 0x07, 0x80, 0x08, 0x80, 0x06, 0x80, + 0x03, 0x00, 0x00, 0x80, 0x01, 0x00, 0x03, 0x00, 0x05, 0x80, 0x07, 0x80, + 0x07, 0x00, 0x04, 0x00, 0x01, 0x00, 0x0C, 0x00, 0x13, 0x80, 0x18, 0x80, + 0x1B, 0x00, 0x1D, 0x80, 0x20, 0x00, 0x26, 0x00, 0x2C, 0x00, 0x31, 0x80, + 0x34, 0x00, 0x32, 0x80, 0x2E, 0x80, 0x28, 0x80, 0x24, 0x80, 0x21, 0x80, + 0x21, 0x00, 0x1E, 0x80, 0x1A, 0x00, 0x12, 0x00, 0x08, 0x80, 0xFD, 0x80, + 0xF5, 0x00, 0xF0, 0x80, 0xED, 0x80, 0xEA, 0x00, 0xE6, 0x00, 0xDF, 0x80, + 0xD8, 0x80, 0xD1, 0x80, 0xCE, 0x00, 0xCE, 0x00, 0xD1, 0x00, 0xD4, 0x80, + 0xD8, 0x00, 0xD9, 0x80, 0xD9, 0x80, 0xDA, 0x00, 0xDE, 0x00, 0xE5, 0x00, + 0xEF, 0x80, 0xF8, 0x80, 0x01, 0x80, 0x07, 0x00, 0x0B, 0x00, 0x0D, 0x80, + 0x12, 0x80, 0x19, 0x80, 0x22, 0x80, 0x2A, 0x00, 0x2F, 0x00, 0x30, 0x00, + 0x2F, 0x00, 0x2C, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x2B, 0x80, 0x2B, 0x00, + 0x29, 0x00, 0x22, 0x80, 0x19, 0x80, 0x0F, 0x80, 0x07, 0x80, 0x03, 0x00, + 0x01, 0x00, 0x0D, 0x80, 0x15, 0x80, 0x1B, 0x00, 0x1E, 0x00, 0x20, 0x80, + 0x24, 0x80, 0x2A, 0x00, 0x2F, 0x80, 0x32, 0x80, 0x31, 0x00, 0x2C, 0x00, + 0x25, 0x00, 0x1E, 0x00, 0x19, 0x80, 0x17, 0x00, 0x13, 0x80, 0x0D, 0x80, + 0x04, 0x00, 0xF8, 0x80, 0xEF, 0x80, 0xE8, 0x80, 0xE5, 0x00, 0xE4, 0x80, + 0xE3, 0x80, 0xE0, 0x80, 0xDC, 0x00, 0xD8, 0x80, 0xD7, 0x00, 0xDA, 0x00, + 0xE0, 0x80, 0xE7, 0x80, 0xEE, 0x00, 0xF1, 0x00, 0xF2, 0x00, 0xF4, 0x80, + 0xF9, 0x80, 0x00, 0x00, 0x09, 0x00, 0x10, 0x00, 0x13, 0x80, 0x13, 0x00, + 0x11, 0x00, 0x10, 0x80, 0x12, 0x00, 0x14, 0x80, 0x17, 0x00, 0x18, 0x00, + 0x14, 0x00, 0x0D, 0x80, 0x08, 0x80, 0x04, 0x80, 0x03, 0x80, 0x05, 0x80, + 0x06, 0x00, 0x04, 0x00, 0xFF, 0x80, 0xFA, 0x80, 0xF8, 0x00, 0xF8, 0x80, + 0xFB, 0x00, 0xFF, 0x80, 0x03, 0x00, 0x02, 0x00, 0x01, 0x00, 0x0F, 0x00, + 0x17, 0x00, 0x1D, 0x00, 0x20, 0x80, 0x23, 0x00, 0x28, 0x00, 0x2E, 0x80, + 0x32, 0x80, 0x33, 0x00, 0x2E, 0x00, 0x25, 0x00, 0x1C, 0x80, 0x15, 0x80, + 0x10, 0x00, 0x0B, 0x80, 0x04, 0x00, 0xF8, 0x00, 0xEC, 0x80, 0xE0, 0x80, + 0xD9, 0x00, 0xD7, 0x80, 0xD7, 0x00, 0xD6, 0x00, 0xD4, 0x00, 0xD1, 0x00, + 0xD1, 0x00, 0xD5, 0x00, 0xDD, 0x80, 0xE9, 0x00, 0xF3, 0x80, 0xFB, 0x00, + 0x01, 0x00, 0x07, 0x80, 0x0E, 0x80, 0x19, 0x00, 0x24, 0x80, 0x2C, 0x00, + 0x2F, 0x80, 0x2F, 0x80, 0x2C, 0x00, 0x29, 0x80, 0x29, 0x00, 0x28, 0x00, + 0x25, 0x80, 0x1D, 0x80, 0x11, 0x80, 0x05, 0x80, 0xFA, 0x00, 0xF2, 0x00, + 0xEE, 0x80, 0xE9, 0x80, 0xE2, 0x00, 0xDA, 0x00, 0xD1, 0x00, 0xCC, 0x80, + 0xCD, 0x80, 0xD2, 0x00, 0xD9, 0x00, 0xDE, 0x00, 0xE0, 0x80, 0xE4, 0x00, + 0xEB, 0x00, 0xF4, 0x00, 0x01, 0x00, 0x03, 0x80, 0x06, 0x00, 0x08, 0x80, + 0x0A, 0x80, 0x0C, 0x00, 0x0E, 0x80, 0x10, 0x00, 0x12, 0x00, 0x14, 0x00, + 0x16, 0x80, 0x18, 0x80, 0x1A, 0x00, 0x1C, 0x00, 0x1E, 0x00, 0x20, 0x00, + 0x21, 0x80, 0x23, 0x00, 0x23, 0x80, 0x25, 0x00, 0x26, 0x00, 0x27, 0x80, + 0x28, 0x80, 0x29, 0x80, 0x2A, 0x80, 0x2B, 0x80, 0x2C, 0x00, 0x2C, 0x80, + 0x2D, 0x00, 0x2D, 0x80, 0x2D, 0x80, 0x2D, 0x80, 0x2D, 0x80, 0x2D, 0x80, + 0x2D, 0x80, 0x2D, 0x00, 0x2C, 0x80, 0x2C, 0x00, 0x2B, 0x80, 0x2A, 0x80, + 0x29, 0x80, 0x28, 0x80, 0x27, 0x80, 0x26, 0x00, 0x25, 0x00, 0x23, 0x80, + 0x23, 0x00, 0x21, 0x80, 0x20, 0x00, 0x1E, 0x00, 0x1C, 0x00, 0x1A, 0x00, + 0x18, 0x80, 0x16, 0x80, 0x14, 0x00, 0x12, 0x00, 0x10, 0x00, 0x0E, 0x80, + 0x0C, 0x00, 0x0A, 0x80, 0x08, 0x80, 0x06, 0x00, 0x03, 0x80, 0x01, 0x00, + 0x01, 0x80, 0x05, 0x80, 0x09, 0x80, 0x0D, 0x00, 0x10, 0x00, 0x12, 0x80, + 0x16, 0x80, 0x19, 0x80, 0x1C, 0x80, 0x1F, 0x80, 0x22, 0x80, 0x25, 0x80, + 0x27, 0x80, 0x2A, 0x00, 0x2C, 0x00, 0x2E, 0x80, 0x2F, 0x80, 0x31, 0x00, + 0x31, 0x00, 0x32, 0x00, 0x32, 0x80, 0x33, 0x80, 0x33, 0x80, 0x34, 0x00, + 0x34, 0x00, 0x34, 0x00, 0x33, 0x00, 0x32, 0x80, 0x31, 0x80, 0x31, 0x00, + 0x2F, 0x80, 0x2E, 0x80, 0x2D, 0x00, 0x2B, 0x80, 0x2A, 0x00, 0x28, 0x80, + 0x27, 0x00, 0x25, 0x00, 0x23, 0x00, 0x21, 0x00, 0x1F, 0x00, 0x1D, 0x80, + 0x1B, 0x80, 0x19, 0x00, 0x17, 0x80, 0x15, 0x80, 0x15, 0x00, 0x13, 0x00, + 0x11, 0x80, 0x10, 0x00, 0x0E, 0x80, 0x0D, 0x00, 0x0C, 0x00, 0x0A, 0x80, + 0x09, 0x00, 0x07, 0x80, 0x06, 0x80, 0x05, 0x80, 0x04, 0x80, 0x04, 0x00, + 0x03, 0x80, 0x02, 0x80, 0x01, 0x00, 0x00, 0x00, 0x01, 0x80, 0x06, 0x00, + 0x0B, 0x00, 0x0F, 0x00, 0x13, 0x00, 0x16, 0x80, 0x1B, 0x00, 0x1E, 0x80, + 0x21, 0x80, 0x25, 0x80, 0x28, 0x80, 0x2B, 0x00, 0x2E, 0x00, 0x2F, 0x80, + 0x32, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x80, 0x37, 0x00, 0x37, 0x80, + 0x37, 0x00, 0x37, 0x80, 0x37, 0x80, 0x37, 0x80, 0x36, 0x00, 0x35, 0x00, + 0x34, 0x00, 0x32, 0x80, 0x30, 0x80, 0x2F, 0x80, 0x2D, 0x80, 0x2B, 0x00, + 0x29, 0x00, 0x26, 0x80, 0x24, 0x80, 0x22, 0x00, 0x1F, 0x80, 0x1D, 0x80, + 0x1B, 0x00, 0x18, 0x80, 0x16, 0x80, 0x15, 0x00, 0x12, 0x80, 0x10, 0x00, + 0x0E, 0x80, 0x0D, 0x80, 0x0C, 0x00, 0x0A, 0x00, 0x08, 0x80, 0x07, 0x80, + 0x06, 0x00, 0x05, 0x00, 0x04, 0x00, 0x03, 0x80, 0x02, 0x80, 0x01, 0x80, + 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, + 0xFF, 0x80, 0xFF, 0x80, 0x01, 0x80, 0x0C, 0x00, 0x14, 0x80, 0x1C, 0x00, + 0x23, 0x80, 0x29, 0x80, 0x2D, 0x00, 0x2F, 0x80, 0x30, 0x00, 0x30, 0x80, + 0x30, 0x00, 0x2E, 0x80, 0x2D, 0x80, 0x2A, 0x00, 0x29, 0x00, 0x26, 0x00, + 0x23, 0x80, 0x21, 0x00, 0x1E, 0x00, 0x1B, 0x80, 0x19, 0x80, 0x16, 0x00, + 0x14, 0x00, 0x11, 0x80, 0x10, 0x80, 0x0F, 0x80, 0x0D, 0x00, 0x0C, 0x80, + 0x0C, 0x00, 0x0B, 0x80, 0x0A, 0x00, 0x08, 0x00, 0x07, 0x80, 0x06, 0x00, + 0x05, 0x80, 0x05, 0x80, 0x05, 0x00, 0x03, 0x80, 0x04, 0x00, 0x03, 0x00, + 0x04, 0x00, 0x04, 0x80, 0x05, 0x80, 0x04, 0x80, 0x05, 0x80, 0x05, 0x00, + 0x04, 0x80, 0x05, 0x00, 0x04, 0x80, 0x03, 0x00, 0x05, 0x00, 0x04, 0x80, + 0x03, 0x80, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x04, 0x00, 0x03, 0x00, + 0x02, 0x00, 0x02, 0x80, 0x02, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x00, + 0x01, 0x80, 0x0E, 0x00, 0x17, 0x80, 0x21, 0x80, 0x29, 0x80, 0x2E, 0x80, + 0x30, 0x80, 0x32, 0x80, 0x30, 0x80, 0x2F, 0x80, 0x2E, 0x00, 0x2B, 0x00, + 0x28, 0x80, 0x26, 0x00, 0x25, 0x80, 0x23, 0x00, 0x21, 0x80, 0x21, 0x00, + 0x1F, 0x80, 0x1D, 0x00, 0x1C, 0x80, 0x19, 0x00, 0x16, 0x80, 0x14, 0x80, + 0x12, 0x00, 0x10, 0x00, 0x0D, 0x80, 0x0C, 0x00, 0x0A, 0x00, 0x0A, 0x80, + 0x08, 0x80, 0x06, 0x80, 0x06, 0x80, 0x06, 0x80, 0x05, 0x00, 0x05, 0x80, + 0x05, 0x80, 0x03, 0x80, 0x04, 0x80, 0x03, 0x80, 0x04, 0x00, 0x05, 0x00, + 0x05, 0x80, 0x05, 0x00, 0x05, 0x80, 0x05, 0x00, 0x04, 0x80, 0x05, 0x00, + 0x04, 0x80, 0x04, 0x00, 0x04, 0x80, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, + 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x80, 0x02, 0x80, 0x03, 0x00, + 0x01, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x80, 0x21, 0x00, 0x1B, 0x80, + 0xD2, 0x80, 0xE1, 0x80, 0x30, 0x00, 0x25, 0x80, 0xDA, 0x80, 0xCC, 0x00, + 0x2A, 0x00, 0x29, 0x80, 0xE9, 0x80, 0xF4, 0x80, 0xE2, 0x80, 0xE0, 0x00, + 0x39, 0x00, 0x26, 0x00, 0xCF, 0x00, 0xEF, 0x00, 0x10, 0x80, 0x1B, 0x00, + 0x07, 0x80, 0xEE, 0x00, 0xF1, 0x80, 0xE9, 0x80, 0x20, 0x00, 0x20, 0x80, + 0xE3, 0x80, 0xEE, 0x00, 0xFA, 0x80, 0x20, 0x80, 0x17, 0x80, 0xDB, 0x80, + 0xEA, 0x00, 0x1D, 0x80, 0x0D, 0x00, 0xFC, 0x00, 0xD6, 0x00, 0x06, 0x00, + 0x3F, 0x00, 0xDF, 0x00, 0xDF, 0x00, 0x23, 0x00, 0xF1, 0x00, 0xEF, 0x00, + 0x16, 0x80, 0x04, 0x80, 0xE0, 0x00, 0xF4, 0x80, 0x30, 0x00, 0xFC, 0x00, + 0xE1, 0x80, 0x00, 0x00, 0xF9, 0x80, 0x15, 0x80, 0x19, 0x80, 0xE7, 0x00, + 0xE3, 0x00, 0x0B, 0x00, 0x20, 0x00, 0x09, 0x00, 0xF0, 0x00, 0xEE, 0x00, + 0x2D, 0x00, 0x2B, 0x00, 0x02, 0x00, 0x22, 0x80, 0x38, 0x00, 0x3C, 0x80, + 0x35, 0x00, 0x2A, 0x00, 0x25, 0x00, 0x27, 0x00, 0x2F, 0x00, 0x33, 0x00, + 0x2E, 0x80, 0x1E, 0x00, 0x07, 0x00, 0xF0, 0x00, 0xE0, 0x80, 0xDB, 0x00, + 0xDF, 0x00, 0xE9, 0x00, 0xF2, 0x80, 0xF6, 0x80, 0xF6, 0x00, 0xF0, 0x80, + 0xEE, 0x00, 0xEE, 0x80, 0xF5, 0x00, 0x00, 0x00, 0x0A, 0x80, 0x0D, 0x00, + 0x07, 0x80, 0xFF, 0x80, 0xF8, 0x80, 0xF3, 0x80, 0xF5, 0x80, 0xFB, 0x80, + 0x02, 0x00, 0x08, 0x00, 0x0B, 0x00, 0x0B, 0x80, 0x0A, 0x00, 0x0A, 0x00, + 0x0B, 0x00, 0x0E, 0x00, 0x11, 0x80, 0x13, 0x80, 0x12, 0x80, 0x0E, 0x80, + 0x07, 0x80, 0x00, 0x80, 0xFA, 0x00, 0xF8, 0x80, 0xF7, 0x00, 0xF7, 0x80, + 0xF7, 0x80, 0xF8, 0x80, 0xF8, 0x00, 0xF8, 0x80, 0xF9, 0x00, 0xFB, 0x00, + 0xFD, 0x00, 0x00, 0x80, 0x01, 0x80, 0x05, 0x00, 0x05, 0x00, 0x02, 0x80, + 0x19, 0x80, 0x03, 0x80, 0xDE, 0x00, 0xEA, 0x00, 0x3C, 0x00, 0x14, 0x80, + 0xD7, 0x00, 0xC6, 0x80, 0x39, 0x00, 0x2A, 0x80, 0xFC, 0x80, 0xD6, 0x80, + 0xD3, 0x80, 0xEE, 0x80, 0x3F, 0x00, 0x2B, 0x00, 0xD5, 0x80, 0xD9, 0x80, + 0x10, 0x80, 0x23, 0x80, 0x10, 0x80, 0xF3, 0x80, 0xDB, 0x00, 0xF1, 0x00, + 0x16, 0x80, 0x30, 0x80, 0xE2, 0x00, 0xF8, 0x80, 0xDF, 0x80, 0x3C, 0x00, + 0xF8, 0x00, 0x04, 0x80, 0xD2, 0x00, 0x29, 0x00, 0xFE, 0x00, 0x02, 0x00, + 0xD4, 0x00, 0x19, 0x00, 0x28, 0x00, 0xE9, 0x80, 0xE5, 0x00, 0x09, 0x80, + 0x09, 0x00, 0xE2, 0x80, 0x21, 0x80, 0xED, 0x00, 0xF2, 0x80, 0xED, 0x00, + 0x39, 0x80, 0xF0, 0x00, 0xF0, 0x00, 0xE6, 0x80, 0x0B, 0x00, 0x13, 0x00, + 0x1C, 0x80, 0xE8, 0x00, 0xE0, 0x00, 0x07, 0x80, 0x20, 0x00, 0x10, 0x80, + 0xF0, 0x00, 0xF8, 0x80, 0x27, 0x80, 0x25, 0x00, 0x0B, 0x00, 0x06, 0x00, + 0xF1, 0x00, 0xF0, 0x00, 0x2A, 0x00, 0xF7, 0x00, 0xF7, 0x00, 0xD6, 0x80, + 0x2C, 0x00, 0x1B, 0x00, 0x04, 0x80, 0xD4, 0x80, 0xDE, 0x00, 0xF4, 0x00, + 0x29, 0x80, 0x1F, 0x00, 0xE8, 0x00, 0xF2, 0x00, 0xFE, 0x80, 0x17, 0x00, + 0x15, 0x80, 0xE1, 0x00, 0xFB, 0x80, 0xEE, 0x00, 0x0E, 0x00, 0x2E, 0x80, + 0xD3, 0x80, 0x14, 0x00, 0xCE, 0x00, 0x3F, 0x00, 0xE4, 0x80, 0x21, 0x80, + 0xC7, 0x80, 0x36, 0x80, 0xDF, 0x00, 0x0E, 0x80, 0xDE, 0x80, 0x10, 0x00, + 0x21, 0x00, 0xEF, 0x80, 0xFA, 0x80, 0xF9, 0x00, 0x00, 0x00, 0xEE, 0x00, + 0x1A, 0x00, 0xDB, 0x80, 0x23, 0x00, 0xD4, 0x00, 0x3C, 0x80, 0xE2, 0x80, + 0xFA, 0x80, 0xE6, 0x00, 0x07, 0x00, 0x18, 0x80, 0x0F, 0x00, 0xF6, 0x80, + 0xEB, 0x80, 0xFB, 0x80, 0x15, 0x80, 0x09, 0x80, 0xF9, 0x00, 0x0B, 0x00, + 0x19, 0x00, 0x1D, 0x80, 0x03, 0x00, 0x03, 0x00, 0xF5, 0x00, 0xF6, 0x80, + 0x1D, 0x80, 0xED, 0x00, 0x0A, 0x80, 0xD2, 0x80, 0x2C, 0x00, 0x21, 0x80, + 0xFB, 0x00, 0xD5, 0x80, 0xDF, 0x80, 0xE8, 0x80, 0x2E, 0x00, 0x20, 0x00, + 0xE8, 0x80, 0x0A, 0x80, 0xEF, 0x00, 0x14, 0x00, 0x19, 0x00, 0xD0, 0x80, + 0x09, 0x80, 0xE8, 0x80, 0x15, 0x00, 0x2F, 0x80, 0xCA, 0x00, 0x24, 0x80, + 0xC1, 0x80, 0x3B, 0x00, 0xEF, 0x00, 0x19, 0x00, 0xD0, 0x00, 0x3E, 0x00, + 0xC6, 0x00, 0x1B, 0x00, 0xE8, 0x80, 0xFC, 0x80, 0x32, 0x80, 0xEC, 0x00, + 0xF8, 0x80, 0xFF, 0x00, 0xEC, 0x00, 0xF9, 0x80, 0x15, 0x80, 0xD6, 0x80, + 0x36, 0x00, 0xCA, 0x00, 0x3F, 0x00, 0xD6, 0x80, 0xF6, 0x80, 0xF1, 0x00, + 0xFC, 0x80, 0x26, 0x00, 0x15, 0x00, 0xF2, 0x80, 0xEF, 0x00, 0xF7, 0x00, + 0x09, 0x80, 0x03, 0x80, 0x0A, 0x80, 0x11, 0x80, 0x1B, 0x80, 0x28, 0x00, + 0xFF, 0x00, 0xF9, 0x00, 0xF4, 0x80, 0xFA, 0x80, 0x0E, 0x00, 0xF1, 0x80, + 0x17, 0x80, 0xDC, 0x00, 0x2D, 0x00, 0x19, 0x80, 0xE7, 0x80, 0xE8, 0x80, + 0xE4, 0x80, 0xD6, 0x80, 0x31, 0x80, 0x1C, 0x80, 0xE7, 0x00, 0x1A, 0x80, + 0xF4, 0x80, 0x0A, 0x00, 0x10, 0x80, 0xD9, 0x00, 0x0B, 0x80, 0xE0, 0x80, + 0x16, 0x00, 0x2C, 0x00, 0xC9, 0x00, 0x2F, 0x80, 0xD0, 0x00, 0x26, 0x00, + 0xF8, 0x00, 0x0F, 0x80, 0xDD, 0x80, 0x30, 0x00, 0xC1, 0x00, 0x2C, 0x80, + 0xEB, 0x80, 0xF0, 0x00, 0x3E, 0x00, 0xE4, 0x00, 0xF1, 0x80, 0x0C, 0x80, + 0xE3, 0x80, 0xF7, 0x80, 0x1C, 0x00, 0xDE, 0x00, 0x29, 0x80, 0xD3, 0x80, + 0x38, 0x80, 0xD2, 0x00, 0xF3, 0x80, 0x03, 0x80, 0xF8, 0x80, 0x1B, 0x80, + 0x1D, 0x00, 0xEF, 0x00, 0xED, 0x80, 0xFC, 0x80, 0xFD, 0x80, 0x01, 0x80, + 0x19, 0x00, 0x13, 0x00, 0x19, 0x00, 0x26, 0x00, 0x0B, 0x00, 0x03, 0x00, + 0xE0, 0x00, 0xE9, 0x00, 0x17, 0x00, 0x00, 0x80, 0x05, 0x80, 0xF2, 0x80, + 0x3C, 0x80, 0x03, 0x00, 0xD0, 0x80, 0xFF, 0x80, 0xF4, 0x80, 0xC5, 0x80, + 0x1C, 0x80, 0x21, 0x00, 0xEC, 0x00, 0x23, 0x80, 0x0F, 0x80, 0xFC, 0x00, + 0xFA, 0x80, 0xEC, 0x80, 0x0C, 0x80, 0xD9, 0x80, 0x04, 0x00, 0x20, 0x00, + 0xE5, 0x80, 0x2D, 0x80, 0xE4, 0x00, 0x19, 0x00, 0xFD, 0x80, 0x08, 0x80, + 0xDF, 0x80, 0x17, 0x00, 0xD5, 0x00, 0x1D, 0x00, 0xE8, 0x80, 0x01, 0x80, + 0x3F, 0x00, 0xD9, 0x80, 0xF0, 0x80, 0x2A, 0x00, 0xE4, 0x00, 0xD4, 0x80, + 0x18, 0x00, 0xF5, 0x00, 0x07, 0x80, 0xDD, 0x00, 0x37, 0x00, 0xDC, 0x00, + 0xFC, 0x00, 0x1B, 0x00, 0xF8, 0x00, 0x01, 0x00, 0x10, 0x00, 0xF4, 0x00, + 0xED, 0x80, 0xF5, 0x80, 0xFB, 0x80, 0x10, 0x80, 0x23, 0x80, 0x11, 0x80, + 0x1A, 0x80, 0x24, 0x00, 0x1D, 0x00, 0x1B, 0x00, 0xD9, 0x00, 0xDD, 0x00, + 0x23, 0x80, 0x1A, 0x00, 0xFF, 0x00, 0xE1, 0x00, 0x30, 0x80, 0x08, 0x80, + 0xD2, 0x00, 0xF6, 0x00, 0xF0, 0x80, 0xCF, 0x80, 0x1F, 0x00, 0x1E, 0x80, + 0xEC, 0x00, 0x1F, 0x00, 0x16, 0x80, 0x03, 0x80, 0xFB, 0x00, 0xEA, 0x80, + 0x05, 0x00, 0xDB, 0x80, 0x06, 0x80, 0x1D, 0x00, 0xE2, 0x80, 0x18, 0x80, + 0xED, 0x80, 0x27, 0x80, 0x05, 0x00, 0xF4, 0x80, 0xDE, 0x80, 0x24, 0x80, + 0xED, 0x80, 0x0E, 0x80, 0xDE, 0x00, 0x05, 0x80, 0x3F, 0x00, 0xD6, 0x80, + 0xE7, 0x80, 0x24, 0x00, 0xE5, 0x00, 0xD6, 0x80, 0x16, 0x00, 0xFD, 0x00, + 0x02, 0x00, 0xE2, 0x80, 0x37, 0x00, 0xED, 0x00, 0xFA, 0x80, 0x0F, 0x80, + 0xF1, 0x80, 0x00, 0x00, 0x0B, 0x00, 0xE9, 0x00, 0xE4, 0x80, 0xFF, 0x80, + 0x12, 0x00, 0x19, 0x00, 0x17, 0x00, 0x10, 0x00, 0x2E, 0x00, 0x2E, 0x80, + 0x17, 0x80, 0x11, 0x00, 0xD6, 0x00, 0xF2, 0x00, 0x3F, 0x00, 0x28, 0x00, + 0xE5, 0x00, 0xCC, 0x80, 0x2F, 0x80, 0x20, 0x80, 0xD6, 0x00, 0xDB, 0x80, + 0xD0, 0x80, 0xD4, 0x80, 0x3C, 0x00, 0x2B, 0x00, 0xD5, 0x80, 0xFE, 0x80, + 0x1D, 0x80, 0x28, 0x80, 0x12, 0x00, 0xE4, 0x00, 0xEB, 0x80, 0xD9, 0x80, + 0x19, 0x80, 0x24, 0x80, 0xDF, 0x80, 0xFF, 0x80, 0xF5, 0x80, 0x2D, 0x80, + 0x14, 0x00, 0xE6, 0x80, 0xDF, 0x80, 0x22, 0x00, 0xFF, 0x80, 0x05, 0x00, + 0xD5, 0x00, 0x00, 0x80, 0x3E, 0x00, 0xD6, 0x00, 0xDC, 0x80, 0x1E, 0x00, + 0xED, 0x00, 0xE9, 0x00, 0x1A, 0x80, 0xFB, 0x00, 0xEE, 0x00, 0xED, 0x80, + 0x3D, 0x00, 0xF6, 0x00, 0xE5, 0x80, 0xFB, 0x80, 0xEC, 0x00, 0x06, 0x00, + 0x08, 0x00, 0xDD, 0x80, 0xE0, 0x00, 0x14, 0x00, 0x31, 0x00, 0x29, 0x00, + 0x14, 0x00, 0x0F, 0x80, 0x3B, 0x00, 0x35, 0x00, 0x19, 0x00, 0x16, 0x80, + 0xE1, 0x00, 0xFA, 0x80, 0x38, 0x00, 0x20, 0x80, 0xD4, 0x00, 0xCE, 0x00, + 0x2A, 0x00, 0x27, 0x00, 0xDB, 0x00, 0xD4, 0x00, 0xC7, 0x00, 0xDC, 0x80, + 0x3D, 0x80, 0x2E, 0x80, 0xD9, 0x80, 0xF1, 0x80, 0x1A, 0x00, 0x2E, 0x80, + 0x1A, 0x80, 0xF4, 0x00, 0xEA, 0x80, 0xE1, 0x80, 0x1D, 0x00, 0x20, 0x80, + 0xE8, 0x00, 0xE8, 0x00, 0xF4, 0x00, 0x19, 0x00, 0x19, 0x00, 0xE2, 0x80, + 0xED, 0x80, 0x13, 0x80, 0x05, 0x80, 0xF9, 0x00, 0xDF, 0x00, 0x0A, 0x80, + 0x3D, 0x80, 0xE6, 0x00, 0xE3, 0x00, 0x1E, 0x80, 0xF3, 0x00, 0xED, 0x80, + 0x0C, 0x00, 0xFB, 0x00, 0xDD, 0x80, 0xF4, 0x80, 0x27, 0x00, 0xF4, 0x00, + 0xD3, 0x00, 0xEC, 0x80, 0xE9, 0x80, 0x0A, 0x80, 0x10, 0x00, 0xE9, 0x80, + 0xED, 0x80, 0x20, 0x00, 0x3F, 0x00, 0x35, 0x00, 0x1A, 0x80, 0x12, 0x00, + 0x3D, 0x00, 0x2E, 0x80, 0x12, 0x80, 0x11, 0x00, 0xF0, 0x00, 0xFC, 0x80, + 0x26, 0x80, 0x15, 0x00, 0xDA, 0x80, 0xE5, 0x80, 0x24, 0x00, 0x25, 0x00, + 0xF1, 0x80, 0xD2, 0x80, 0xCC, 0x80, 0xF0, 0x00, 0x2E, 0x80, 0x29, 0x00, + 0xED, 0x80, 0xE7, 0x00, 0x0A, 0x00, 0x13, 0x80, 0x05, 0x00, 0xF4, 0x00, + 0xE6, 0x00, 0xF8, 0x00, 0x1A, 0x00, 0x17, 0x00, 0xF1, 0x00, 0xDC, 0x00, + 0xF4, 0x00, 0x15, 0x80, 0x15, 0x00, 0xFE, 0x00, 0xFF, 0x80, 0x15, 0x80, + 0x15, 0x80, 0xF9, 0x00, 0xF1, 0x00, 0x18, 0x00, 0x25, 0x00, 0xF6, 0x00, + 0xE4, 0x00, 0xFA, 0x80, 0xED, 0x80, 0xE4, 0x80, 0x00, 0x00, 0xFB, 0x00, + 0xE1, 0x00, 0xF3, 0x00, 0x00, 0x00, 0xDF, 0x00, 0xC9, 0x00, 0xDD, 0x80, + 0x00, 0x80, 0x23, 0x80, 0x2A, 0x80, 0x0C, 0x00, 0x00, 0x00, 0x1B, 0x80, + 0x32, 0x80, 0x2E, 0x80, 0x1E, 0x80, 0x25, 0x80, 0x3F, 0x00, 0x25, 0x00, + 0x08, 0x00, 0x00, 0x80, 0xE6, 0x00, 0xF3, 0x00, 0x16, 0x80, 0x0E, 0x00, + 0xE9, 0x80, 0xF5, 0x00, 0x20, 0x00, 0x20, 0x00, 0xF2, 0x00, 0xC8, 0x80, + 0xC4, 0x00, 0xEC, 0x80, 0x1D, 0x80, 0x1E, 0x80, 0xFA, 0x00, 0xF0, 0x00, + 0x08, 0x00, 0x14, 0x00, 0x04, 0x00, 0xEF, 0x80, 0xE9, 0x00, 0xFC, 0x00, + 0x1A, 0x00, 0x1E, 0x00, 0x00, 0x80, 0xF0, 0x00, 0x02, 0x00, 0x1A, 0x00, + 0x15, 0x80, 0x01, 0x00, 0xFF, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0xF7, 0x00, + 0xF4, 0x80, 0x10, 0x80, 0x13, 0x80, 0xF2, 0x00, 0xE2, 0x00, 0xE8, 0x80, + 0xE5, 0x80, 0xE4, 0x00, 0xF1, 0x00, 0xEE, 0x00, 0xE0, 0x80, 0xE9, 0x80, + 0xF5, 0x00, 0xE5, 0x00, 0xD7, 0x00, 0xEB, 0x00, 0x12, 0x80, 0x31, 0x00, + 0x30, 0x80, 0x17, 0x00, 0x07, 0x00, 0x18, 0x80, 0x31, 0x00, 0x30, 0x80, + 0x25, 0x00, 0x31, 0x00, 0x3F, 0x00, 0x1F, 0x80, 0xFB, 0x00, 0xEC, 0x00, + 0xDF, 0x80, 0xE6, 0x00, 0xF8, 0x80, 0xFB, 0x00, 0xF2, 0x00, 0xF9, 0x00, + 0x0E, 0x00, 0x0F, 0x00, 0xEB, 0x80, 0xC2, 0x00, 0xC1, 0x00, 0xE7, 0x00, + 0x0D, 0x00, 0x14, 0x80, 0x08, 0x00, 0x03, 0x00, 0x0E, 0x00, 0x16, 0x00, + 0x09, 0x80, 0xF6, 0x00, 0xF1, 0x00, 0x05, 0x80, 0x20, 0x80, 0x27, 0x00, + 0x18, 0x00, 0x0D, 0x80, 0x14, 0x00, 0x1C, 0x00, 0x10, 0x80, 0xFD, 0x00, + 0xF6, 0x00, 0xF9, 0x80, 0xF7, 0x00, 0xF0, 0x00, 0xF6, 0x00, 0x03, 0x80, + 0x07, 0x00, 0xF8, 0x00, 0xE3, 0x80, 0xD9, 0x00, 0xD8, 0x00, 0xD9, 0x00, + 0xDA, 0x80, 0xDC, 0x80, 0xE2, 0x00, 0xEE, 0x80, 0xF9, 0x00, 0xF9, 0x80, + 0xF8, 0x00, 0x03, 0x80, 0x20, 0x00, 0x34, 0x00, 0x2C, 0x00, 0x14, 0x80, + 0x0A, 0x00, 0x17, 0x80, 0x29, 0x00, 0x2F, 0x00, 0x30, 0x80, 0x38, 0x80, + 0x38, 0x00, 0x18, 0x00, 0x01, 0x00, 0x0D, 0x00, 0x16, 0x00, 0x1F, 0x80, + 0x27, 0x80, 0x2F, 0x00, 0x34, 0x00, 0x38, 0x80, 0x3B, 0x00, 0x3B, 0x80, + 0x3A, 0x80, 0x38, 0x00, 0x35, 0x00, 0x30, 0x80, 0x2B, 0x80, 0x26, 0x00, + 0x1F, 0x00, 0x18, 0x00, 0x13, 0x80, 0x0E, 0x00, 0x08, 0x80, 0x04, 0x80, + 0x01, 0x80, 0xFF, 0x80, 0xFE, 0x00, 0xFE, 0x00, 0xFD, 0x80, 0xFE, 0x00, + 0xFF, 0x00, 0x01, 0x00, 0x02, 0x80, 0x03, 0x80, 0x05, 0x00, 0x05, 0x80, + 0x05, 0x80, 0x05, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x80, 0xFE, 0x00, + 0xFB, 0x00, 0xF9, 0x00, 0xF5, 0x80, 0xF2, 0x00, 0xF0, 0x00, 0xED, 0x80, + 0xEA, 0x80, 0xE8, 0x80, 0xE7, 0x00, 0xE5, 0x80, 0xE6, 0x00, 0xE6, 0x00, + 0xE6, 0x80, 0xE8, 0x00, 0xE9, 0x00, 0xEA, 0x80, 0xED, 0x00, 0xEF, 0x00, + 0xF1, 0x80, 0xF4, 0x00, 0xF6, 0x00, 0xF9, 0x00, 0xFB, 0x80, 0xFE, 0x00, + 0x00, 0x80, 0x1D, 0x80, 0x31, 0x80, 0x38, 0x00, 0x33, 0x00, 0x29, 0x00, + 0x1C, 0x80, 0x16, 0x80, 0x13, 0x80, 0x16, 0x80, 0x1A, 0x80, 0x19, 0x80, + 0x13, 0x80, 0x0B, 0x00, 0xFF, 0x00, 0xF7, 0x80, 0xF3, 0x80, 0xF6, 0x00, + 0xFB, 0x80, 0xFF, 0x80, 0x03, 0x00, 0x05, 0x00, 0x06, 0x00, 0x09, 0x80, + 0x0E, 0x00, 0x13, 0x00, 0x18, 0x80, 0x18, 0x00, 0x15, 0x00, 0x10, 0x00, + 0x08, 0x00, 0x01, 0x00, 0xFA, 0x80, 0xF7, 0x00, 0xF5, 0x80, 0xF3, 0x00, + 0xF0, 0x80, 0xEF, 0x00, 0xEE, 0x80, 0xF0, 0x00, 0xF3, 0x80, 0xFA, 0x00, + 0xFF, 0x00, 0x02, 0x80, 0x04, 0x80, 0x04, 0x80, 0x05, 0x00, 0x05, 0x00, + 0x05, 0x00, 0x05, 0x00, 0x04, 0x80, 0x00, 0x80, 0xFC, 0x00, 0xF4, 0x00, + 0xEE, 0x80, 0xEA, 0x80, 0xE9, 0x00, 0xEA, 0x80, 0xED, 0x80, 0xF0, 0x80, + 0xF4, 0x80, 0xF8, 0x80, 0xFA, 0x80, 0xFD, 0x80, 0xF9, 0x80, 0xF0, 0x00, + 0xF1, 0x00, 0xF6, 0x00, 0xF9, 0x80, 0xFA, 0x00, 0xFC, 0x00, 0x01, 0x00, + 0x04, 0x00, 0xF9, 0x00, 0xE1, 0x80, 0xCD, 0x00, 0xCF, 0x80, 0xE8, 0x00, + 0x04, 0x80, 0x16, 0x00, 0x18, 0x00, 0x15, 0x80, 0x14, 0x00, 0x10, 0x00, + 0x04, 0x00, 0xF7, 0x80, 0xF3, 0x00, 0xFD, 0x00, 0x0B, 0x00, 0x14, 0x00, + 0x14, 0x00, 0x12, 0x80, 0x14, 0x00, 0x15, 0x80, 0x12, 0x00, 0x08, 0x80, + 0xFF, 0x80, 0xF8, 0x00, 0xF4, 0x00, 0xF4, 0x00, 0xF6, 0x00, 0xF9, 0x00, + 0xF6, 0x00, 0xEC, 0x00, 0xDE, 0x80, 0xD5, 0x00, 0xD4, 0x80, 0xDA, 0x80, + 0xE2, 0x80, 0xEC, 0x00, 0xF8, 0x00, 0x02, 0x00, 0x06, 0x80, 0x05, 0x00, + 0x04, 0x80, 0x0A, 0x80, 0x14, 0x00, 0x17, 0x80, 0x10, 0x80, 0x06, 0x80, + 0x02, 0x80, 0x0B, 0x00, 0x1C, 0x00, 0x2F, 0x80, 0x3D, 0x00, 0x3F, 0x00, + 0x30, 0x80, 0x12, 0x00, 0xFF, 0x80, 0xFC, 0x80, 0xFC, 0x00, 0xFD, 0x80, + 0x00, 0x80, 0x05, 0x80, 0x09, 0x80, 0x08, 0x00, 0xFF, 0x80, 0xEE, 0x80, + 0xDC, 0x00, 0xD1, 0x00, 0xD3, 0x80, 0xE2, 0x00, 0xF9, 0x00, 0x0D, 0x00, + 0x1B, 0x00, 0x1D, 0x00, 0x17, 0x80, 0x0D, 0x80, 0x03, 0x80, 0xFE, 0x00, + 0xFC, 0x00, 0xFF, 0x80, 0x05, 0x00, 0x0D, 0x00, 0x12, 0x00, 0x14, 0x80, + 0x13, 0x00, 0x10, 0x00, 0x0B, 0x80, 0x04, 0x00, 0xFC, 0x80, 0xF3, 0x80, + 0xEE, 0x80, 0xEE, 0x00, 0xF0, 0x00, 0xF2, 0x80, 0xF1, 0x00, 0xEA, 0x00, + 0xE3, 0x80, 0xDF, 0x00, 0xE0, 0x00, 0xE6, 0x80, 0xF1, 0x00, 0xFC, 0x00, + 0x03, 0x80, 0x08, 0x00, 0x07, 0x00, 0x05, 0x00, 0x02, 0x80, 0x02, 0x80, + 0x04, 0x00, 0x04, 0x00, 0x01, 0x00, 0xFF, 0x00, 0xFF, 0x80, 0x08, 0x80, + 0x1B, 0x00, 0x30, 0x80, 0x3F, 0x00, 0x3F, 0x00, 0x2F, 0x00, 0x10, 0x80, + 0xFF, 0x80, 0xFD, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x03, 0x80, 0x07, 0x80, + 0x08, 0x80, 0x03, 0x80, 0xFA, 0x80, 0xEC, 0x80, 0xDF, 0x00, 0xD8, 0x80, + 0xDC, 0x00, 0xE8, 0x80, 0xFC, 0x80, 0x0F, 0x80, 0x1E, 0x00, 0x24, 0x00, + 0x21, 0x00, 0x17, 0x80, 0x0D, 0x00, 0x04, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x01, 0x80, 0x04, 0x80, 0x05, 0x80, 0x05, 0x80, 0x03, 0x80, 0x00, 0x00, + 0xFB, 0x80, 0xF6, 0x00, 0xF0, 0x80, 0xEE, 0x00, 0xEF, 0x00, 0xF3, 0x00, + 0xF7, 0x80, 0xFB, 0x80, 0xFD, 0x00, 0xFA, 0x80, 0xF7, 0x00, 0xF2, 0x00, + 0xF0, 0x80, 0xF3, 0x00, 0xF7, 0x00, 0xFA, 0x80, 0xFD, 0x00, 0xFC, 0x80, + 0xFA, 0x00, 0xF7, 0x00, 0xF4, 0x80, 0xF3, 0x80, 0xF3, 0x80, 0xF4, 0x80, + 0xF6, 0x00, 0xFA, 0x00, 0x00, 0x80, 0x0E, 0x00, 0x21, 0x00, 0x33, 0x00, + 0x3F, 0x00, 0x3C, 0x80, 0x2D, 0x00, 0x10, 0x80, 0x01, 0x80, 0x07, 0x00, + 0x0C, 0x00, 0x10, 0x00, 0x15, 0x00, 0x18, 0x00, 0x1C, 0x80, 0x20, 0x80, + 0x22, 0x80, 0x26, 0x00, 0x28, 0x00, 0x2A, 0x00, 0x2B, 0x80, 0x2D, 0x80, + 0x2E, 0x00, 0x2F, 0x80, 0x30, 0x00, 0x30, 0x80, 0x2F, 0x80, 0x30, 0x80, + 0x30, 0x00, 0x30, 0x00, 0x2F, 0x80, 0x30, 0x80, 0x2F, 0x80, 0x2F, 0x80, + 0x2D, 0x80, 0x2D, 0x00, 0x2C, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x27, 0x80, + 0x25, 0x80, 0x24, 0x00, 0x22, 0x80, 0x21, 0x00, 0x1F, 0x00, 0x1E, 0x00, + 0x1C, 0x80, 0x1B, 0x00, 0x1A, 0x80, 0x19, 0x80, 0x19, 0x80, 0x18, 0x00, + 0x18, 0x00, 0x17, 0x00, 0x18, 0x00, 0x16, 0x80, 0x16, 0x80, 0x15, 0x00, + 0x15, 0x00, 0x13, 0x00, 0x12, 0x00, 0x11, 0x00, 0x10, 0x00, 0x0E, 0x80, + 0x0D, 0x00, 0x0A, 0x80, 0x09, 0x80, 0x08, 0x80, 0x06, 0x80, 0x05, 0x00, + 0x02, 0x80, 0x01, 0x00, 0x01, 0x80, 0x0A, 0x00, 0x11, 0x80, 0x19, 0x00, + 0x1E, 0x00, 0x23, 0x80, 0x27, 0x00, 0x2A, 0x80, 0x2C, 0x00, 0x2C, 0x80, + 0x2D, 0x00, 0x2D, 0x00, 0x2D, 0x80, 0x2D, 0x80, 0x2E, 0x80, 0x2E, 0x00, + 0x2E, 0x80, 0x30, 0x80, 0x30, 0x00, 0x31, 0x80, 0x31, 0x00, 0x32, 0x00, + 0x31, 0x00, 0x31, 0x00, 0x2F, 0x80, 0x2E, 0x00, 0x2C, 0x00, 0x28, 0x00, + 0x26, 0x00, 0x22, 0x80, 0x20, 0x80, 0x1E, 0x00, 0x1B, 0x00, 0x19, 0x00, + 0x17, 0x00, 0x16, 0x80, 0x15, 0x00, 0x14, 0x00, 0x13, 0x00, 0x12, 0x00, + 0x11, 0x80, 0x11, 0x80, 0x11, 0x80, 0x10, 0x80, 0x0F, 0x80, 0x0F, 0x00, + 0x0F, 0x80, 0x0E, 0x80, 0x0E, 0x80, 0x0E, 0x00, 0x0D, 0x00, 0x0C, 0x00, + 0x0C, 0x00, 0x0B, 0x80, 0x0B, 0x00, 0x09, 0x80, 0x09, 0x80, 0x08, 0x00, + 0x07, 0x00, 0x07, 0x00, 0x05, 0x80, 0x04, 0x80, 0x02, 0x80, 0x01, 0x80, + 0x01, 0x80, 0x17, 0x80, 0x28, 0x80, 0x2E, 0x00, 0x2B, 0x80, 0x27, 0x80, + 0x22, 0x00, 0x1F, 0x80, 0x21, 0x80, 0x25, 0x00, 0x27, 0x80, 0x29, 0x80, + 0x29, 0x00, 0x28, 0x00, 0x27, 0x80, 0x27, 0x80, 0x29, 0x80, 0x2C, 0x80, + 0x2E, 0x00, 0x2F, 0x80, 0x2D, 0x00, 0x28, 0x80, 0x22, 0x00, 0x20, 0x00, + 0x1B, 0x00, 0x1A, 0x00, 0x16, 0x80, 0x12, 0x80, 0x0D, 0x00, 0x05, 0x80, + 0xFF, 0x80, 0xFC, 0x00, 0xFB, 0x80, 0xFD, 0x00, 0xFE, 0x80, 0xFE, 0x80, + 0xFE, 0x80, 0xFB, 0x00, 0xFA, 0x00, 0xF7, 0x80, 0xF4, 0x00, 0xF2, 0x80, + 0xF0, 0x80, 0xF0, 0x00, 0xF0, 0x80, 0xF1, 0x80, 0xF2, 0x00, 0xF2, 0x00, + 0xF1, 0x00, 0xF3, 0x00, 0xF5, 0x80, 0xF9, 0x80, 0xFD, 0x00, 0x01, 0x00, + 0x02, 0x00, 0x00, 0x80, 0xFF, 0x00, 0xFC, 0x80, 0xFB, 0x00, 0xFA, 0x80, + 0xFA, 0x80, 0xFA, 0x80, 0xFB, 0x00, 0xFD, 0x00, 0x00, 0x80, 0x19, 0x00, + 0x2B, 0x80, 0x31, 0x80, 0x2E, 0x80, 0x28, 0x80, 0x1F, 0x00, 0x18, 0x80, + 0x18, 0x80, 0x1B, 0x80, 0x1C, 0x80, 0x1C, 0x00, 0x19, 0x80, 0x14, 0x00, + 0x10, 0x00, 0x0E, 0x80, 0x0E, 0x80, 0x0F, 0x00, 0x10, 0x00, 0x10, 0x80, + 0x0E, 0x80, 0x0B, 0x80, 0x09, 0x80, 0x09, 0x80, 0x0A, 0x80, 0x0D, 0x80, + 0x10, 0x00, 0x11, 0x00, 0x10, 0x80, 0x0F, 0x00, 0x0A, 0x00, 0x04, 0x00, + 0xFE, 0x80, 0xFB, 0x80, 0xFA, 0x80, 0xFC, 0x00, 0xFF, 0x00, 0x01, 0x00, + 0x01, 0x80, 0x00, 0x00, 0xFE, 0x00, 0xFA, 0x80, 0xF6, 0x80, 0xF5, 0x80, + 0xF5, 0x00, 0xF6, 0x80, 0xF8, 0x00, 0xFA, 0x80, 0xFB, 0x80, 0xFC, 0x00, + 0xFB, 0x80, 0xFB, 0x00, 0xF9, 0x00, 0xFA, 0x00, 0xFC, 0x00, 0x00, 0x00, + 0x03, 0x80, 0x04, 0x80, 0x05, 0x00, 0x00, 0x00, 0xFD, 0x00, 0xF9, 0x80, + 0xFA, 0x80, 0xFB, 0x80, 0x01, 0x00, 0x2F, 0x00, 0x3B, 0x00, 0x2D, 0x80, + 0x29, 0x80, 0x2F, 0x80, 0x2E, 0x00, 0x21, 0x00, 0x19, 0x00, 0x1B, 0x00, + 0x1B, 0x00, 0x10, 0x80, 0x0B, 0x00, 0x08, 0x80, 0xFE, 0x80, 0xED, 0x80, + 0xE1, 0x00, 0xE7, 0x80, 0xF6, 0x00, 0xFE, 0x80, 0x03, 0x00, 0x04, 0x00, + 0x09, 0x80, 0x12, 0x00, 0x1A, 0x00, 0x1D, 0x00, 0x16, 0x80, 0x13, 0x80, + 0x15, 0x00, 0x12, 0x80, 0x09, 0x80, 0xFD, 0x00, 0xF7, 0x00, 0xF7, 0x80, + 0xEE, 0x80, 0xE7, 0x00, 0xE3, 0x80, 0xEA, 0x00, 0xEC, 0x80, 0xEB, 0x00, + 0xEC, 0x00, 0xF8, 0x80, 0x02, 0x00, 0x08, 0x80, 0x08, 0x80, 0x07, 0x00, + 0x05, 0x80, 0x07, 0x00, 0x09, 0x00, 0x07, 0x80, 0x08, 0x00, 0x05, 0x80, + 0x00, 0x80, 0xF6, 0x00, 0xEB, 0x80, 0xE8, 0x80, 0xEB, 0x00, 0xE7, 0x80, + 0xE3, 0x00, 0xE9, 0x80, 0xF5, 0x80, 0xFB, 0x00, 0xF8, 0x80, 0xF8, 0x00, + 0x00, 0x00, 0x25, 0x80, 0x21, 0x00, 0x23, 0x00, 0x1B, 0x80, 0x0C, 0x80, + 0x07, 0x80, 0x0E, 0x00, 0x11, 0x00, 0x13, 0x80, 0x0E, 0x00, 0x07, 0x00, + 0xFE, 0x80, 0xFE, 0x80, 0x00, 0x80, 0xFD, 0x00, 0xFA, 0x00, 0xFA, 0x00, + 0xF3, 0x80, 0xF4, 0x00, 0xFD, 0x00, 0x04, 0x80, 0x05, 0x80, 0x0D, 0x00, + 0x11, 0x00, 0x0C, 0x80, 0x07, 0x00, 0x08, 0x80, 0x05, 0x00, 0x04, 0x00, + 0x0B, 0x00, 0x08, 0x00, 0x00, 0x00, 0xF8, 0x00, 0xF3, 0x80, 0xF2, 0x80, + 0xF8, 0x00, 0xFE, 0x00, 0xF9, 0x80, 0xF1, 0x80, 0xF3, 0x80, 0xEF, 0x00, + 0xEC, 0x80, 0x10, 0x00, 0x17, 0x00, 0x0B, 0x00, 0x0D, 0x00, 0x03, 0x80, + 0xFA, 0x00, 0xFF, 0x00, 0x06, 0x80, 0x08, 0x00, 0x05, 0x00, 0xFC, 0x80, + 0xF4, 0x00, 0xEE, 0x80, 0xF3, 0x80, 0xF8, 0x80, 0xF9, 0x80, 0xFB, 0x00, + 0xFA, 0x00, 0xF5, 0x00, 0xF7, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x27, 0x80, + 0x1B, 0x80, 0x15, 0x80, 0x17, 0x00, 0x08, 0x00, 0x07, 0x00, 0x04, 0x80, + 0x03, 0x80, 0x0D, 0x00, 0x0E, 0x80, 0xFD, 0x80, 0xFC, 0x80, 0x04, 0x80, + 0x05, 0x00, 0xFD, 0x00, 0x00, 0x00, 0xF4, 0x80, 0xF0, 0x80, 0x05, 0x00, + 0xFF, 0x00, 0xFD, 0x00, 0x0D, 0x80, 0x04, 0x80, 0x03, 0x80, 0xF9, 0x00, + 0x0F, 0x80, 0x0A, 0x00, 0x09, 0x80, 0x02, 0x80, 0x0A, 0x00, 0x0C, 0x00, + 0x00, 0x00, 0xF0, 0x00, 0xFB, 0x80, 0xF2, 0x80, 0xEE, 0x00, 0x08, 0x80, + 0x03, 0x80, 0xF4, 0x00, 0x03, 0x80, 0xF6, 0x80, 0xF0, 0x00, 0x0C, 0x00, + 0x13, 0x80, 0x04, 0x80, 0x02, 0x00, 0x06, 0x00, 0x00, 0x00, 0xF9, 0x00, + 0xFF, 0x80, 0xF9, 0x00, 0x10, 0x00, 0x02, 0x00, 0xF1, 0x80, 0xFC, 0x80, + 0x03, 0x80, 0xFD, 0x00, 0xFB, 0x80, 0xFD, 0x00, 0xF9, 0x00, 0xFB, 0x80, + 0xF6, 0x00, 0xF5, 0x80, 0x00, 0x00, 0x26, 0x80, 0x1A, 0x00, 0x10, 0x00, + 0x0C, 0x00, 0x05, 0x80, 0x06, 0x80, 0x05, 0x00, 0x00, 0x00, 0x06, 0x80, + 0x1D, 0x00, 0xF1, 0x80, 0x09, 0x00, 0xFE, 0x00, 0xF9, 0x80, 0xFE, 0x00, + 0x00, 0x00, 0xF4, 0x00, 0xF2, 0x80, 0x02, 0x00, 0x0C, 0x00, 0xF4, 0x80, + 0x11, 0x00, 0xFC, 0x80, 0x00, 0x00, 0xF8, 0x80, 0x0F, 0x80, 0x09, 0x80, + 0xF9, 0x00, 0x05, 0x00, 0x0F, 0x00, 0x0A, 0x80, 0x00, 0x00, 0xF6, 0x80, + 0xEC, 0x00, 0x00, 0x00, 0xF9, 0x00, 0x09, 0x00, 0xFD, 0x80, 0xF7, 0x00, + 0x00, 0x00, 0xFA, 0x00, 0xE7, 0x00, 0x1E, 0x00, 0x0C, 0x00, 0x08, 0x80, + 0xFC, 0x80, 0x08, 0x00, 0x00, 0x00, 0xF0, 0x80, 0x04, 0x00, 0xF5, 0x00, + 0x09, 0x00, 0x0D, 0x00, 0xF1, 0x00, 0xFF, 0x80, 0x00, 0x00, 0xFE, 0x80, + 0xF5, 0x80, 0xF7, 0x80, 0x0C, 0x00, 0xFA, 0x80, 0xF5, 0x80, 0xF0, 0x80, + 0x00, 0x00, 0x25, 0x00, 0x14, 0x80, 0x2A, 0x00, 0x00, 0x00, 0x1B, 0x80, + 0x08, 0x00, 0x0D, 0x80, 0x00, 0x00, 0x12, 0x00, 0xF1, 0x80, 0x19, 0x80, + 0x00, 0x00, 0xF9, 0x00, 0x03, 0x80, 0xF3, 0x80, 0x00, 0x00, 0x01, 0x00, + 0x06, 0x80, 0xFC, 0x80, 0x00, 0x00, 0x1C, 0x80, 0x01, 0x00, 0x14, 0x00, + 0x00, 0x00, 0x03, 0x80, 0x04, 0x00, 0x19, 0x00, 0x00, 0x00, 0x15, 0x00, + 0x0D, 0x80, 0x12, 0x80, 0x00, 0x00, 0xEE, 0x80, 0x0D, 0x80, 0xDB, 0x80, + 0x00, 0x00, 0xFC, 0x80, 0x04, 0x00, 0xE7, 0x80, 0x00, 0x00, 0xE1, 0x80, + 0x01, 0x00, 0xED, 0x80, 0x00, 0x00, 0x0A, 0x80, 0x06, 0x80, 0x07, 0x00, + 0x00, 0x00, 0xFA, 0x00, 0x03, 0x80, 0x09, 0x80, 0x00, 0x00, 0xEB, 0x00, + 0xF1, 0x80, 0xE2, 0x00, 0x00, 0x00, 0xF2, 0x80, 0x08, 0x00, 0x01, 0x80, + 0x00, 0x00, 0xEF, 0x00, 0x14, 0x80, 0x00, 0x80, 0x00, 0x80, 0x04, 0x80, + 0x09, 0x00, 0x0D, 0x80, 0x13, 0x00, 0x15, 0x80, 0x15, 0x00, 0x10, 0x00, + 0x08, 0x00, 0xFF, 0x80, 0xF6, 0x00, 0xF1, 0x80, 0xF2, 0x80, 0xF9, 0x00, + 0x00, 0x80, 0x0A, 0x80, 0x13, 0x00, 0x15, 0x00, 0x11, 0x00, 0x09, 0x00, + 0xFE, 0x80, 0xF4, 0x80, 0xED, 0x00, 0xE9, 0x80, 0xEB, 0x00, 0xF0, 0x00, + 0xF5, 0x80, 0xFA, 0x00, 0xFC, 0x80, 0xFE, 0x80, 0xFF, 0x80, 0x00, 0x00, + 0x00, 0x80, 0x03, 0x80, 0x07, 0x00, 0x0A, 0x00, 0x0B, 0x80, 0x0B, 0x80, + 0x09, 0x00, 0x04, 0x80, 0xFF, 0x80, 0xF9, 0x00, 0xF1, 0x80, 0xEC, 0x00, + 0xE7, 0x80, 0xE5, 0x00, 0xE4, 0x00, 0xE3, 0x00, 0xE4, 0x00, 0xE4, 0x00, + 0xE4, 0x00, 0xE5, 0x00, 0xE6, 0x80, 0xEB, 0x00, 0xF2, 0x80, 0xFF, 0x80, + 0x0E, 0x80, 0x20, 0x00, 0x30, 0x00, 0x3C, 0x00, 0x3F, 0x00, 0x37, 0x80, + 0x26, 0x00, 0x0D, 0x80, 0x01, 0x80, 0x07, 0x80, 0x0D, 0x00, 0x12, 0x00, + 0x16, 0x80, 0x1C, 0x00, 0x20, 0x00, 0x23, 0x80, 0x27, 0x00, 0x29, 0x80, + 0x2B, 0x80, 0x2D, 0x00, 0x2E, 0x80, 0x2F, 0x80, 0x2F, 0x00, 0x2F, 0x00, + 0x2F, 0x00, 0x2E, 0x80, 0x2D, 0x80, 0x2D, 0x00, 0x2C, 0x00, 0x2B, 0x00, + 0x2B, 0x00, 0x2A, 0x00, 0x29, 0x00, 0x2A, 0x00, 0x29, 0x80, 0x2A, 0x80, + 0x2B, 0x00, 0x2B, 0x00, 0x2C, 0x80, 0x2D, 0x80, 0x2D, 0x80, 0x2E, 0x80, + 0x2F, 0x00, 0x2F, 0x80, 0x2F, 0x80, 0x2F, 0x80, 0x2F, 0x80, 0x2E, 0x80, + 0x2D, 0x80, 0x2B, 0x80, 0x2A, 0x00, 0x27, 0x00, 0x25, 0x00, 0x21, 0x80, + 0x1E, 0x80, 0x1A, 0x00, 0x17, 0x80, 0x14, 0x00, 0x11, 0x00, 0x0E, 0x00, + 0x0B, 0x00, 0x08, 0x00, 0x06, 0x00, 0x03, 0x80, 0x02, 0x00, 0x01, 0x00, + 0xFF, 0x80, 0xFF, 0x00, 0xFE, 0x80, 0xFE, 0x80, 0xFE, 0x80, 0xFF, 0x00, + 0x02, 0x00, 0x0A, 0x80, 0x13, 0x00, 0x1B, 0x00, 0x22, 0x00, 0x29, 0x00, + 0x2E, 0x00, 0x32, 0x00, 0x35, 0x80, 0x37, 0x00, 0x38, 0x80, 0x38, 0x80, + 0x37, 0x00, 0x34, 0x80, 0x32, 0x00, 0x2F, 0x00, 0x2B, 0x80, 0x26, 0x80, + 0x22, 0x80, 0x1E, 0x80, 0x1A, 0x80, 0x18, 0x00, 0x14, 0x80, 0x12, 0x00, + 0x10, 0x00, 0x0E, 0x80, 0x0D, 0x80, 0x0E, 0x00, 0x0D, 0x00, 0x0D, 0x00, + 0x0D, 0x00, 0x0D, 0x80, 0x0E, 0x00, 0x0E, 0x80, 0x0E, 0x80, 0x0F, 0x00, + 0x0E, 0x80, 0x0D, 0x80, 0x0D, 0x80, 0x0C, 0x00, 0x0C, 0x00, 0x0A, 0x80, + 0x0A, 0x80, 0x09, 0x00, 0x08, 0x00, 0x07, 0x00, 0x06, 0x00, 0x04, 0x80, + 0x03, 0x80, 0x03, 0x00, 0x01, 0x80, 0x01, 0x80, 0x02, 0x00, 0x01, 0x80, + 0x01, 0x80, 0x01, 0x80, 0x01, 0x00, 0x01, 0x80, 0x01, 0x80, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x01, 0x00, 0x0B, 0x00, + 0x14, 0x00, 0x1C, 0x00, 0x23, 0x80, 0x2A, 0x00, 0x2F, 0x80, 0x33, 0x00, + 0x35, 0x00, 0x36, 0x80, 0x36, 0x80, 0x35, 0x80, 0x32, 0x80, 0x2F, 0x80, + 0x2D, 0x00, 0x29, 0x80, 0x25, 0x80, 0x20, 0x80, 0x1D, 0x80, 0x1A, 0x00, + 0x17, 0x00, 0x14, 0x00, 0x11, 0x80, 0x10, 0x00, 0x0E, 0x00, 0x0C, 0x00, + 0x0A, 0x80, 0x09, 0x80, 0x08, 0x00, 0x06, 0x00, 0x04, 0x00, 0x01, 0x80, + 0xFF, 0x80, 0xFD, 0x00, 0xFA, 0x80, 0xF8, 0x00, 0xF5, 0x00, 0xF2, 0x00, + 0xF0, 0x00, 0xEE, 0x80, 0xED, 0x00, 0xEC, 0x00, 0xEB, 0x80, 0xEB, 0x00, + 0xEB, 0x80, 0xEC, 0x80, 0xED, 0x80, 0xEF, 0x80, 0xF0, 0x80, 0xF3, 0x00, + 0xF5, 0x00, 0xF7, 0x00, 0xF9, 0x80, 0xFC, 0x00, 0xFD, 0x80, 0xFF, 0x00, + 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x02, 0x80, 0x02, 0x00, 0x02, 0x80, + 0x01, 0x00, 0x00, 0x80, 0x01, 0x80, 0x0D, 0x00, 0x17, 0x00, 0x20, 0x80, + 0x28, 0x80, 0x2F, 0x80, 0x35, 0x00, 0x39, 0x00, 0x3A, 0x80, 0x3C, 0x00, + 0x3B, 0x00, 0x3A, 0x80, 0x37, 0x00, 0x34, 0x80, 0x32, 0x00, 0x2F, 0x80, + 0x2D, 0x80, 0x2A, 0x80, 0x29, 0x80, 0x28, 0x00, 0x28, 0x80, 0x28, 0x80, + 0x2A, 0x00, 0x2B, 0x80, 0x2C, 0x80, 0x2D, 0x80, 0x2E, 0x00, 0x2E, 0x80, + 0x2E, 0x00, 0x2D, 0x80, 0x2B, 0x80, 0x28, 0x80, 0x26, 0x80, 0x22, 0x80, + 0x1F, 0x80, 0x1C, 0x00, 0x19, 0x00, 0x14, 0x00, 0x11, 0x80, 0x0F, 0x80, + 0x0D, 0x80, 0x0C, 0x00, 0x0A, 0x80, 0x09, 0x80, 0x09, 0x80, 0x09, 0x80, + 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x80, 0x0B, 0x00, 0x0B, 0x80, 0x0B, 0x80, + 0x0B, 0x00, 0x0A, 0x80, 0x0A, 0x00, 0x08, 0x80, 0x07, 0x00, 0x06, 0x80, + 0x05, 0x80, 0x04, 0x80, 0x03, 0x00, 0x02, 0x80, 0x01, 0x00, 0x00, 0x80, + 0x01, 0x80, 0x0B, 0x80, 0x14, 0x00, 0x1C, 0x00, 0x23, 0x00, 0x28, 0x00, + 0x2A, 0x80, 0x2D, 0x00, 0x2C, 0x00, 0x2B, 0x00, 0x29, 0x00, 0x25, 0x80, + 0x22, 0x00, 0x1D, 0x80, 0x1A, 0x80, 0x18, 0x00, 0x15, 0x80, 0x14, 0x80, + 0x15, 0x00, 0x16, 0x00, 0x18, 0x00, 0x1B, 0x00, 0x1D, 0x80, 0x20, 0x80, + 0x24, 0x00, 0x27, 0x00, 0x29, 0x00, 0x2B, 0x80, 0x2C, 0x00, 0x2D, 0x80, + 0x2D, 0x80, 0x2D, 0x80, 0x2D, 0x80, 0x2D, 0x00, 0x2D, 0x00, 0x2D, 0x80, + 0x2D, 0x00, 0x2E, 0x80, 0x2F, 0x00, 0x2F, 0x00, 0x30, 0x00, 0x30, 0x00, + 0x31, 0x80, 0x30, 0x00, 0x2F, 0x80, 0x2E, 0x80, 0x2C, 0x80, 0x29, 0x80, + 0x26, 0x80, 0x22, 0x00, 0x1E, 0x00, 0x19, 0x80, 0x14, 0x80, 0x10, 0x00, + 0x0C, 0x00, 0x08, 0x00, 0x04, 0x80, 0x02, 0x00, 0x00, 0x00, 0xFE, 0x80, + 0xFE, 0x00, 0xFD, 0x80, 0xFE, 0x00, 0xFE, 0x80, 0x02, 0x00, 0x11, 0x00, + 0x1D, 0x00, 0x28, 0x80, 0x30, 0x80, 0x37, 0x80, 0x3B, 0x80, 0x3C, 0x80, + 0x3C, 0x00, 0x38, 0x00, 0x35, 0x00, 0x30, 0x00, 0x2C, 0x00, 0x27, 0x00, + 0x23, 0x80, 0x21, 0x80, 0x1E, 0x80, 0x1E, 0x00, 0x1D, 0x80, 0x1E, 0x00, + 0x1E, 0x00, 0x1E, 0x00, 0x1D, 0x80, 0x1B, 0x00, 0x18, 0x80, 0x16, 0x00, + 0x11, 0x00, 0x0E, 0x80, 0x0A, 0x80, 0x06, 0x80, 0x04, 0x00, 0x01, 0x80, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x01, 0x00, 0x02, 0x00, 0x03, 0x80, + 0x06, 0x00, 0x06, 0x00, 0x08, 0x00, 0x08, 0x80, 0x08, 0x00, 0x07, 0x80, + 0x06, 0x00, 0x05, 0x00, 0x03, 0x00, 0x01, 0x00, 0xFF, 0x00, 0xFE, 0x80, + 0xFC, 0x80, 0xFC, 0x80, 0xFC, 0x00, 0xFD, 0x80, 0xFD, 0x80, 0xFE, 0x00, + 0xFE, 0x80, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x80, 0x01, 0x00, 0x10, 0x00, 0x1D, 0x00, 0x28, 0x00, + 0x30, 0x00, 0x36, 0x00, 0x39, 0x00, 0x39, 0x80, 0x37, 0x00, 0x33, 0x80, + 0x2F, 0x80, 0x2B, 0x80, 0x27, 0x00, 0x24, 0x00, 0x21, 0x80, 0x21, 0x80, + 0x21, 0x00, 0x21, 0x00, 0x22, 0x00, 0x22, 0x00, 0x21, 0x80, 0x20, 0x00, + 0x1C, 0x80, 0x19, 0x00, 0x14, 0x00, 0x0E, 0x80, 0x08, 0x80, 0x04, 0x00, + 0xFF, 0x80, 0xFC, 0x00, 0xF9, 0x80, 0xF8, 0x00, 0xF7, 0x80, 0xF8, 0x00, + 0xF9, 0x80, 0xFA, 0x00, 0xFA, 0x80, 0xFA, 0x00, 0xF8, 0x80, 0xF6, 0x80, + 0xF5, 0x00, 0xF1, 0x80, 0xEF, 0x00, 0xEB, 0x80, 0xE9, 0x80, 0xE8, 0x00, + 0xE8, 0x00, 0xE9, 0x00, 0xEA, 0x80, 0xEE, 0x00, 0xF1, 0x00, 0xF4, 0x80, + 0xF9, 0x00, 0xFD, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x80, 0x05, 0x00, + 0x05, 0x80, 0x06, 0x00, 0x05, 0x00, 0x04, 0x80, 0x02, 0x80, 0x01, 0x00, + 0x01, 0x80, 0x14, 0x00, 0x22, 0x80, 0x2F, 0x80, 0x36, 0x00, 0x39, 0x80, + 0x39, 0x00, 0x34, 0x80, 0x2F, 0x80, 0x29, 0x00, 0x25, 0x00, 0x22, 0x80, + 0x21, 0x00, 0x23, 0x80, 0x25, 0x00, 0x29, 0x80, 0x2C, 0x80, 0x2E, 0x00, + 0x2F, 0x80, 0x2F, 0x00, 0x2C, 0x80, 0x2C, 0x00, 0x2A, 0x00, 0x28, 0x00, + 0x29, 0x00, 0x29, 0x00, 0x2C, 0x00, 0x2E, 0x00, 0x31, 0x80, 0x33, 0x80, + 0x35, 0x80, 0x36, 0x80, 0x36, 0x00, 0x35, 0x00, 0x32, 0x80, 0x2F, 0x80, + 0x2C, 0x00, 0x28, 0x00, 0x25, 0x00, 0x22, 0x00, 0x1E, 0x80, 0x1C, 0x00, + 0x1B, 0x80, 0x1A, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x80, 0x19, 0x80, + 0x18, 0x80, 0x17, 0x80, 0x16, 0x00, 0x14, 0x00, 0x10, 0x00, 0x0C, 0x80, + 0x08, 0x80, 0x04, 0x00, 0x02, 0x00, 0xFF, 0x00, 0xFD, 0x80, 0xFB, 0x80, + 0xFB, 0x80, 0xFB, 0x00, 0xFC, 0x80, 0xFE, 0x00, 0x01, 0x80, 0x13, 0x80, + 0x22, 0x80, 0x2E, 0x80, 0x34, 0x80, 0x35, 0x00, 0x32, 0x80, 0x2D, 0x00, + 0x26, 0x80, 0x21, 0x00, 0x1D, 0x80, 0x1C, 0x00, 0x1C, 0x00, 0x1F, 0x80, + 0x22, 0x00, 0x25, 0x00, 0x26, 0x80, 0x26, 0x00, 0x24, 0x80, 0x23, 0x00, + 0x20, 0x80, 0x1E, 0x80, 0x1E, 0x00, 0x1F, 0x00, 0x1E, 0x80, 0x21, 0x80, + 0x23, 0x80, 0x25, 0x80, 0x27, 0x00, 0x29, 0x00, 0x29, 0x00, 0x27, 0x80, + 0x26, 0x80, 0x25, 0x00, 0x24, 0x00, 0x23, 0x00, 0x22, 0x80, 0x23, 0x80, + 0x25, 0x00, 0x26, 0x80, 0x29, 0x80, 0x2B, 0x80, 0x2E, 0x00, 0x2E, 0x00, + 0x2F, 0x00, 0x2D, 0x80, 0x2A, 0x80, 0x26, 0x00, 0x23, 0x00, 0x1D, 0x80, + 0x19, 0x00, 0x13, 0x80, 0x0F, 0x80, 0x0A, 0x80, 0x07, 0x80, 0x04, 0x00, + 0x01, 0x80, 0x00, 0x80, 0xFD, 0x80, 0xFD, 0x00, 0xFC, 0x00, 0xFC, 0x00, + 0xFC, 0x00, 0xFE, 0x80, 0x01, 0x80, 0x16, 0x80, 0x29, 0x00, 0x35, 0x00, + 0x3C, 0x00, 0x3E, 0x00, 0x3B, 0x80, 0x36, 0x00, 0x31, 0x00, 0x2B, 0x80, + 0x2A, 0x80, 0x2A, 0x80, 0x2B, 0x80, 0x2D, 0x00, 0x2C, 0x80, 0x2C, 0x00, + 0x28, 0x80, 0x24, 0x80, 0x1E, 0x00, 0x19, 0x00, 0x15, 0x80, 0x14, 0x80, + 0x13, 0x80, 0x14, 0x00, 0x15, 0x00, 0x15, 0x00, 0x13, 0x80, 0x0F, 0x80, + 0x0A, 0x80, 0x05, 0x80, 0x01, 0x00, 0xFD, 0x00, 0xF9, 0x80, 0xF8, 0x80, + 0xF9, 0x80, 0xFB, 0x00, 0xFC, 0x80, 0xFF, 0x80, 0x00, 0x00, 0x01, 0x00, + 0x02, 0x00, 0x02, 0x80, 0x02, 0x80, 0x01, 0x00, 0x00, 0x00, 0xFE, 0x00, + 0xFC, 0x80, 0xFB, 0x00, 0xF9, 0x80, 0xF8, 0x00, 0xF7, 0x80, 0xF8, 0x00, + 0xFA, 0x00, 0xFB, 0x80, 0xFE, 0x00, 0xFF, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x80, 0x02, 0x80, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x01, 0x80, 0x19, 0x00, 0x2A, 0x80, 0x37, 0x80, 0x3C, 0x00, 0x3A, 0x80, + 0x35, 0x00, 0x2F, 0x80, 0x2B, 0x00, 0x29, 0x00, 0x2A, 0x80, 0x2D, 0x80, + 0x30, 0x80, 0x32, 0x80, 0x32, 0x80, 0x30, 0x80, 0x2F, 0x00, 0x2C, 0x00, + 0x2B, 0x80, 0x2B, 0x80, 0x2D, 0x00, 0x30, 0x00, 0x2F, 0x80, 0x2E, 0x80, + 0x2B, 0x00, 0x25, 0x80, 0x1F, 0x80, 0x18, 0x80, 0x13, 0x00, 0x10, 0x00, + 0x0F, 0x00, 0x0E, 0x80, 0x0E, 0x80, 0x0F, 0x80, 0x0E, 0x80, 0x0E, 0x00, + 0x0C, 0x80, 0x09, 0x00, 0x06, 0x80, 0x02, 0x80, 0xFE, 0x80, 0xFA, 0x80, + 0xF7, 0x80, 0xF4, 0x00, 0xF1, 0x80, 0xF1, 0x80, 0xF2, 0x00, 0xF3, 0x80, + 0xF7, 0x80, 0xFB, 0x00, 0xFF, 0x80, 0x02, 0x80, 0x06, 0x80, 0x09, 0x00, + 0x0B, 0x80, 0x0D, 0x00, 0x0E, 0x80, 0x0E, 0x00, 0x0E, 0x00, 0x0C, 0x80, + 0x0B, 0x00, 0x09, 0x80, 0x06, 0x80, 0x02, 0x80, 0x01, 0x80, 0x19, 0x80, + 0x2B, 0x80, 0x36, 0x00, 0x38, 0x00, 0x35, 0x80, 0x2F, 0x00, 0x29, 0x00, + 0x27, 0x00, 0x25, 0x80, 0x27, 0x80, 0x29, 0x00, 0x28, 0x80, 0x27, 0x80, + 0x24, 0x80, 0x22, 0x00, 0x22, 0x00, 0x24, 0x00, 0x27, 0x00, 0x2A, 0x80, + 0x2D, 0x00, 0x2E, 0x00, 0x2B, 0x80, 0x28, 0x00, 0x25, 0x80, 0x25, 0x00, + 0x27, 0x00, 0x2C, 0x00, 0x31, 0x00, 0x35, 0x80, 0x3B, 0x00, 0x3D, 0x00, + 0x3B, 0x00, 0x38, 0x80, 0x36, 0x00, 0x31, 0x80, 0x2D, 0x80, 0x28, 0x80, + 0x25, 0x80, 0x21, 0x80, 0x1F, 0x00, 0x1D, 0x80, 0x1F, 0x80, 0x1F, 0x80, + 0x21, 0x80, 0x21, 0x80, 0x21, 0x80, 0x1E, 0x80, 0x1C, 0x00, 0x19, 0x80, + 0x16, 0x80, 0x13, 0x80, 0x10, 0x00, 0x0E, 0x00, 0x0B, 0x00, 0x07, 0x00, + 0x03, 0x00, 0xFF, 0x80, 0xFB, 0x00, 0xF9, 0x80, 0xF8, 0x00, 0xF8, 0x80, + 0xFA, 0x00, 0xFC, 0x80, 0x01, 0x80, 0x1A, 0x80, 0x2C, 0x00, 0x36, 0x00, + 0x37, 0x80, 0x32, 0x00, 0x2C, 0x80, 0x27, 0x00, 0x25, 0x80, 0x26, 0x00, + 0x27, 0x00, 0x26, 0x00, 0x22, 0x80, 0x21, 0x00, 0x1F, 0x80, 0x20, 0x00, + 0x22, 0x80, 0x26, 0x00, 0x28, 0x80, 0x28, 0x80, 0x25, 0x80, 0x21, 0x00, + 0x1D, 0x00, 0x1B, 0x80, 0x1A, 0x80, 0x1D, 0x80, 0x21, 0x00, 0x23, 0x80, + 0x26, 0x80, 0x29, 0x00, 0x29, 0x80, 0x27, 0x00, 0x25, 0x80, 0x22, 0x80, + 0x20, 0x80, 0x1F, 0x00, 0x1F, 0x00, 0x21, 0x00, 0x24, 0x00, 0x27, 0x80, + 0x2B, 0x80, 0x2E, 0x00, 0x2F, 0x80, 0x2D, 0x80, 0x2D, 0x80, 0x2B, 0x80, + 0x28, 0x80, 0x27, 0x00, 0x25, 0x00, 0x21, 0x80, 0x1C, 0x80, 0x17, 0x80, + 0x11, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x04, 0x80, 0x02, 0x00, 0x01, 0x00, + 0xFF, 0x00, 0xFE, 0x80, 0xFE, 0x80, 0xFD, 0x80, 0xFD, 0x80, 0xFE, 0x80, + 0x01, 0x00, 0x1C, 0x80, 0x2F, 0x00, 0x37, 0x00, 0x37, 0x00, 0x33, 0x80, + 0x30, 0x00, 0x2F, 0x00, 0x2F, 0x80, 0x2F, 0x80, 0x2C, 0x80, 0x2A, 0x00, + 0x26, 0x00, 0x25, 0x00, 0x25, 0x00, 0x25, 0x80, 0x24, 0x00, 0x1E, 0x80, + 0x19, 0x80, 0x14, 0x80, 0x13, 0x00, 0x11, 0x80, 0x12, 0x80, 0x13, 0x80, + 0x13, 0x80, 0x11, 0x00, 0x0C, 0x00, 0x05, 0x00, 0xFD, 0x00, 0xF5, 0x80, + 0xF1, 0x80, 0xEF, 0x80, 0xF0, 0x00, 0xF3, 0x80, 0xF5, 0x80, 0xF6, 0x00, + 0xF6, 0x80, 0xF4, 0x00, 0xF3, 0x80, 0xF2, 0x80, 0xF1, 0x00, 0xF0, 0x00, + 0xEC, 0x80, 0xEA, 0x00, 0xE7, 0x80, 0xE6, 0x00, 0xE5, 0x80, 0xE6, 0x80, + 0xE8, 0x00, 0xEA, 0x00, 0xEC, 0x80, 0xF0, 0x80, 0xF4, 0x00, 0xFA, 0x80, + 0xFE, 0x80, 0x01, 0x00, 0x01, 0x80, 0x02, 0x00, 0x03, 0x80, 0x03, 0x00, + 0x01, 0x80, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x02, 0x00, 0x21, 0x80, + 0x33, 0x00, 0x3A, 0x80, 0x39, 0x80, 0x35, 0x80, 0x33, 0x80, 0x33, 0x00, + 0x33, 0x80, 0x32, 0x80, 0x2F, 0x80, 0x2F, 0x80, 0x31, 0x80, 0x32, 0x00, + 0x33, 0x00, 0x32, 0x80, 0x30, 0x00, 0x2D, 0x80, 0x2D, 0x00, 0x2F, 0x80, + 0x32, 0x00, 0x33, 0x80, 0x32, 0x80, 0x32, 0x00, 0x2E, 0x80, 0x29, 0x80, + 0x23, 0x00, 0x1B, 0x00, 0x17, 0x00, 0x18, 0x00, 0x19, 0x80, 0x1C, 0x80, + 0x1D, 0x80, 0x1D, 0x80, 0x1B, 0x80, 0x16, 0x80, 0x14, 0x80, 0x10, 0x00, + 0x0D, 0x00, 0x09, 0x00, 0x05, 0x00, 0x00, 0x00, 0xFE, 0x00, 0xFB, 0x00, + 0xFB, 0x00, 0xFC, 0x00, 0xFF, 0x00, 0x04, 0x00, 0x06, 0x80, 0x08, 0x00, + 0x07, 0x80, 0x06, 0x80, 0x07, 0x00, 0x09, 0x80, 0x0B, 0x00, 0x0D, 0x00, + 0x0C, 0x80, 0x0C, 0x80, 0x0D, 0x00, 0x0C, 0x80, 0x0A, 0x00, 0x08, 0x80, + 0x05, 0x00, 0x02, 0x80, 0x01, 0x80, 0x1E, 0x80, 0x2F, 0x80, 0x33, 0x80, + 0x30, 0x80, 0x2E, 0x00, 0x2B, 0x00, 0x2B, 0x80, 0x28, 0x80, 0x23, 0x00, + 0x21, 0x80, 0x24, 0x00, 0x26, 0x00, 0x25, 0x80, 0x23, 0x00, 0x1E, 0x00, + 0x1D, 0x00, 0x21, 0x80, 0x26, 0x00, 0x2A, 0x00, 0x2B, 0x80, 0x2C, 0x00, + 0x28, 0x80, 0x26, 0x00, 0x23, 0x00, 0x23, 0x00, 0x26, 0x80, 0x2B, 0x80, + 0x32, 0x00, 0x37, 0x80, 0x3B, 0x00, 0x3B, 0x80, 0x3C, 0x00, 0x3B, 0x00, + 0x39, 0x00, 0x34, 0x80, 0x2F, 0x80, 0x2A, 0x00, 0x27, 0x00, 0x24, 0x80, + 0x24, 0x00, 0x23, 0x00, 0x24, 0x80, 0x23, 0x80, 0x24, 0x00, 0x22, 0x80, + 0x21, 0x80, 0x20, 0x00, 0x1D, 0x80, 0x1C, 0x00, 0x19, 0x00, 0x13, 0x80, + 0x0F, 0x00, 0x0B, 0x80, 0x08, 0x80, 0x05, 0x80, 0x00, 0x80, 0xFC, 0x00, + 0xF9, 0x00, 0xF7, 0x80, 0xF7, 0x80, 0xF8, 0x80, 0xF9, 0x00, 0xFC, 0x00, + 0x02, 0x80, 0x1F, 0x00, 0x30, 0x80, 0x35, 0x80, 0x34, 0x80, 0x32, 0x00, + 0x2F, 0x80, 0x2F, 0x80, 0x2F, 0x00, 0x2C, 0x00, 0x2B, 0x80, 0x2D, 0x00, + 0x2D, 0x00, 0x2A, 0x80, 0x26, 0x80, 0x23, 0x80, 0x26, 0x00, 0x29, 0x80, + 0x2A, 0x80, 0x27, 0x80, 0x20, 0x80, 0x1A, 0x80, 0x16, 0x00, 0x17, 0x80, + 0x19, 0x00, 0x1B, 0x00, 0x1B, 0x00, 0x1C, 0x80, 0x1C, 0x80, 0x1C, 0x00, + 0x1A, 0x80, 0x15, 0x80, 0x11, 0x80, 0x0E, 0x80, 0x0A, 0x00, 0x09, 0x00, + 0x0A, 0x80, 0x0E, 0x80, 0x14, 0x80, 0x19, 0x80, 0x1C, 0x00, 0x1E, 0x00, + 0x1D, 0x80, 0x1D, 0x80, 0x1C, 0x80, 0x1C, 0x00, 0x19, 0x00, 0x17, 0x00, + 0x14, 0x80, 0x11, 0x00, 0x0B, 0x80, 0x06, 0x00, 0xFF, 0x80, 0xFD, 0x00, + 0xFE, 0x00, 0xFE, 0x80, 0xFD, 0x80, 0xFD, 0x80, 0xFD, 0x80, 0xFF, 0x80, + 0x00, 0x00, 0x00, 0x80, 0x01, 0x80, 0x01, 0x00, 0x01, 0x00, 0x1E, 0x80, + 0x30, 0x80, 0x38, 0x80, 0x37, 0x00, 0x33, 0x00, 0x2F, 0x80, 0x2F, 0x80, + 0x2F, 0x00, 0x2E, 0x80, 0x2C, 0x80, 0x2C, 0x80, 0x2A, 0x00, 0x29, 0x00, + 0x28, 0x00, 0x28, 0x80, 0x28, 0x00, 0x24, 0x00, 0x1F, 0x80, 0x19, 0x80, + 0x18, 0x80, 0x18, 0x00, 0x19, 0x80, 0x1A, 0x80, 0x18, 0x00, 0x14, 0x00, + 0x0E, 0x80, 0x08, 0x80, 0x01, 0x00, 0xFA, 0x00, 0xF5, 0x00, 0xF3, 0x80, + 0xF5, 0x80, 0xFA, 0x00, 0xFC, 0x00, 0xFB, 0x80, 0xFB, 0x00, 0xF8, 0x00, + 0xF8, 0x00, 0xF7, 0x00, 0xF6, 0x80, 0xF2, 0x80, 0xF0, 0x00, 0xED, 0x00, + 0xEB, 0x00, 0xE7, 0x80, 0xE6, 0x80, 0xE7, 0x80, 0xE9, 0x80, 0xEE, 0x00, + 0xF1, 0x00, 0xF4, 0x80, 0xF9, 0x00, 0xFF, 0x80, 0x03, 0x00, 0x05, 0x00, + 0x04, 0x80, 0x03, 0x00, 0x04, 0x80, 0x06, 0x00, 0x04, 0x80, 0x04, 0x80, + 0x01, 0x80, 0xFF, 0x80, 0x02, 0x00, 0x20, 0x00, 0x32, 0x00, 0x39, 0x80, + 0x39, 0x00, 0x35, 0x80, 0x32, 0x80, 0x31, 0x80, 0x32, 0x80, 0x32, 0x80, + 0x2F, 0x80, 0x2F, 0x00, 0x2F, 0x80, 0x2F, 0x80, 0x30, 0x80, 0x30, 0x00, + 0x2E, 0x80, 0x2B, 0x00, 0x2A, 0x80, 0x2D, 0x00, 0x30, 0x00, 0x33, 0x80, + 0x34, 0x00, 0x34, 0x00, 0x2F, 0x80, 0x2B, 0x80, 0x26, 0x00, 0x1F, 0x80, + 0x1A, 0x80, 0x1A, 0x00, 0x1A, 0x80, 0x1C, 0x80, 0x1E, 0x80, 0x1F, 0x80, + 0x1C, 0x80, 0x17, 0x80, 0x15, 0x80, 0x10, 0x00, 0x0E, 0x00, 0x0B, 0x00, + 0x06, 0x80, 0x00, 0x00, 0xFD, 0x00, 0xFA, 0x80, 0xFA, 0x80, 0xFC, 0x00, + 0xFE, 0x80, 0x03, 0x00, 0x04, 0x00, 0x06, 0x80, 0x07, 0x00, 0x07, 0x00, + 0x07, 0x00, 0x08, 0x80, 0x08, 0x80, 0x0B, 0x00, 0x0B, 0x00, 0x0A, 0x80, + 0x0A, 0x00, 0x08, 0x80, 0x06, 0x00, 0x06, 0x00, 0x04, 0x80, 0x02, 0x80, + 0x01, 0x80, 0x1F, 0x00, 0x2F, 0x80, 0x33, 0x80, 0x31, 0x80, 0x2C, 0x00, + 0x29, 0x00, 0x28, 0x00, 0x25, 0x80, 0x21, 0x00, 0x20, 0x00, 0x20, 0x80, + 0x21, 0x00, 0x20, 0x80, 0x1E, 0x00, 0x1A, 0x00, 0x1C, 0x80, 0x21, 0x80, + 0x25, 0x80, 0x28, 0x80, 0x25, 0x00, 0x20, 0x80, 0x1C, 0x80, 0x1C, 0x00, + 0x1B, 0x80, 0x1F, 0x00, 0x22, 0x00, 0x25, 0x00, 0x27, 0x80, 0x2B, 0x00, + 0x2C, 0x00, 0x29, 0x80, 0x2A, 0x80, 0x29, 0x00, 0x27, 0x00, 0x24, 0x00, + 0x22, 0x80, 0x23, 0x80, 0x28, 0x00, 0x2B, 0x80, 0x2F, 0x80, 0x30, 0x80, + 0x33, 0x00, 0x31, 0x80, 0x32, 0x80, 0x31, 0x00, 0x2D, 0x80, 0x2A, 0x80, + 0x26, 0x80, 0x23, 0x00, 0x1D, 0x00, 0x17, 0x00, 0x11, 0x80, 0x0E, 0x00, + 0x0B, 0x00, 0x08, 0x00, 0x04, 0x80, 0x03, 0x00, 0x00, 0x80, 0xFF, 0x80, + 0xFE, 0x80, 0xFD, 0x00, 0xFB, 0x80, 0xFD, 0x00, 0x02, 0x00, 0x1F, 0x80, + 0x32, 0x00, 0x39, 0x00, 0x38, 0x80, 0x37, 0x00, 0x34, 0x80, 0x33, 0x00, + 0x33, 0x00, 0x2F, 0x00, 0x2E, 0x80, 0x2E, 0x80, 0x2C, 0x00, 0x28, 0x80, + 0x26, 0x00, 0x24, 0x00, 0x26, 0x00, 0x29, 0x80, 0x27, 0x00, 0x21, 0x00, + 0x19, 0x80, 0x15, 0x80, 0x13, 0x80, 0x18, 0x80, 0x19, 0x80, 0x1A, 0x80, + 0x19, 0x80, 0x18, 0x80, 0x17, 0x00, 0x14, 0x00, 0x0F, 0x00, 0x08, 0x00, + 0x04, 0x00, 0x01, 0x00, 0x01, 0x00, 0x03, 0x00, 0x05, 0x80, 0x08, 0x80, + 0x0C, 0x80, 0x0F, 0x80, 0x12, 0x00, 0x10, 0x00, 0x10, 0x80, 0x0F, 0x80, + 0x0E, 0x00, 0x0D, 0x80, 0x0B, 0x80, 0x08, 0x80, 0x06, 0x80, 0x04, 0x00, + 0xFF, 0x00, 0xFD, 0x00, 0xFC, 0x00, 0xFC, 0x80, 0xFD, 0x00, 0xFE, 0x80, + 0xFD, 0x80, 0xFE, 0x00, 0x00, 0x00, 0x02, 0x80, 0x02, 0x80, 0xFF, 0x80, + 0xFF, 0x80, 0xFF, 0x80, 0x01, 0x80, 0x1F, 0x00, 0x31, 0x80, 0x39, 0x80, + 0x38, 0x80, 0x35, 0x00, 0x30, 0x80, 0x2F, 0x80, 0x2F, 0x80, 0x2F, 0x80, + 0x2D, 0x80, 0x2E, 0x00, 0x2C, 0x00, 0x2B, 0x80, 0x2C, 0x00, 0x2C, 0x80, + 0x2C, 0x80, 0x29, 0x80, 0x24, 0x80, 0x1E, 0x80, 0x1D, 0x80, 0x1C, 0x00, + 0x1D, 0x80, 0x1E, 0x80, 0x1B, 0x80, 0x18, 0x00, 0x12, 0x80, 0x0D, 0x00, + 0x06, 0x00, 0xFF, 0x80, 0xFB, 0x80, 0xFA, 0x80, 0xFC, 0x80, 0x01, 0x80, + 0x02, 0x00, 0x01, 0x00, 0x00, 0x80, 0xFD, 0x00, 0xFC, 0x00, 0xFA, 0x80, + 0xF9, 0x00, 0xF5, 0x80, 0xF1, 0x80, 0xF0, 0x00, 0xED, 0x80, 0xEA, 0x00, + 0xE9, 0x00, 0xE9, 0x80, 0xEB, 0x80, 0xF0, 0x80, 0xF3, 0x80, 0xF7, 0x00, + 0xFA, 0x80, 0x02, 0x00, 0x06, 0x00, 0x08, 0x80, 0x07, 0x80, 0x07, 0x80, + 0x09, 0x80, 0x0A, 0x80, 0x08, 0x80, 0x07, 0x80, 0x04, 0x80, 0x01, 0x80, + 0x01, 0x80, 0x21, 0x00, 0x34, 0x80, 0x3B, 0x80, 0x3A, 0x80, 0x37, 0x00, + 0x33, 0x80, 0x32, 0x80, 0x31, 0x00, 0x30, 0x00, 0x2D, 0x80, 0x2E, 0x00, + 0x2F, 0x80, 0x30, 0x00, 0x30, 0x00, 0x2E, 0x80, 0x2B, 0x00, 0x29, 0x00, + 0x2A, 0x80, 0x2F, 0x00, 0x32, 0x00, 0x33, 0x80, 0x33, 0x80, 0x31, 0x00, + 0x2E, 0x00, 0x2A, 0x00, 0x27, 0x80, 0x25, 0x80, 0x26, 0x00, 0x2A, 0x00, + 0x2D, 0x80, 0x2F, 0x80, 0x2F, 0x80, 0x2E, 0x00, 0x2C, 0x80, 0x29, 0x00, + 0x28, 0x00, 0x24, 0x80, 0x1F, 0x80, 0x19, 0x80, 0x15, 0x00, 0x11, 0x80, + 0x10, 0x00, 0x10, 0x00, 0x11, 0x00, 0x10, 0x80, 0x12, 0x00, 0x13, 0x80, + 0x14, 0x80, 0x12, 0x00, 0x0F, 0x80, 0x0D, 0x00, 0x0D, 0x00, 0x0D, 0x00, + 0x0C, 0x00, 0x0B, 0x00, 0x08, 0x00, 0x06, 0x00, 0x05, 0x80, 0x04, 0x00, + 0x01, 0x80, 0x01, 0x80, 0xFF, 0x00, 0xFF, 0x00, 0x01, 0x80, 0x20, 0x00, + 0x30, 0x80, 0x36, 0x00, 0x34, 0x00, 0x2F, 0x80, 0x2E, 0x00, 0x2C, 0x00, + 0x29, 0x00, 0x24, 0x80, 0x22, 0x80, 0x23, 0x80, 0x24, 0x00, 0x23, 0x80, + 0x20, 0x80, 0x1D, 0x80, 0x1F, 0x80, 0x24, 0x80, 0x29, 0x00, 0x2A, 0x80, + 0x26, 0x80, 0x21, 0x00, 0x1D, 0x00, 0x1C, 0x80, 0x1B, 0x80, 0x1E, 0x00, + 0x21, 0x00, 0x23, 0x80, 0x26, 0x80, 0x29, 0x00, 0x28, 0x00, 0x25, 0x80, + 0x24, 0x80, 0x22, 0x80, 0x20, 0x80, 0x1E, 0x00, 0x1D, 0x80, 0x20, 0x80, + 0x24, 0x80, 0x29, 0x80, 0x2D, 0x80, 0x2E, 0x80, 0x2F, 0x00, 0x2E, 0x00, + 0x2E, 0x80, 0x2C, 0x00, 0x29, 0x00, 0x27, 0x00, 0x24, 0x80, 0x20, 0x80, + 0x1B, 0x80, 0x16, 0x80, 0x10, 0x00, 0x0B, 0x80, 0x08, 0x00, 0x05, 0x00, + 0x02, 0x80, 0x01, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0xFE, 0x80, + 0xFD, 0x80, 0xFD, 0x80, 0x02, 0x00, 0x20, 0x80, 0x33, 0x80, 0x3B, 0x80, + 0x3B, 0x00, 0x39, 0x00, 0x35, 0x00, 0x33, 0x80, 0x32, 0x80, 0x2E, 0x80, + 0x2E, 0x80, 0x2F, 0x00, 0x2D, 0x80, 0x2A, 0x00, 0x27, 0x80, 0x25, 0x80, + 0x28, 0x00, 0x2A, 0x80, 0x27, 0x80, 0x21, 0x00, 0x19, 0x00, 0x15, 0x00, + 0x13, 0x80, 0x18, 0x00, 0x19, 0x80, 0x19, 0x80, 0x18, 0x00, 0x16, 0x80, + 0x15, 0x00, 0x12, 0x00, 0x0D, 0x80, 0x07, 0x80, 0x04, 0x00, 0x01, 0x80, + 0x01, 0x80, 0x04, 0x00, 0x05, 0x80, 0x07, 0x80, 0x0A, 0x80, 0x0D, 0x80, + 0x10, 0x00, 0x0F, 0x00, 0x10, 0x80, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, + 0x0E, 0x00, 0x0A, 0x00, 0x08, 0x80, 0x04, 0x80, 0xFE, 0x80, 0xFC, 0x80, + 0xFB, 0x00, 0xFC, 0x00, 0xFD, 0x80, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, + 0x01, 0x80, 0x03, 0x80, 0x03, 0x00, 0x00, 0x00, 0xFF, 0x80, 0xFF, 0x80, + 0x01, 0x80, 0x1E, 0x00, 0x30, 0x80, 0x38, 0x00, 0x38, 0x80, 0x34, 0x80, + 0x31, 0x80, 0x31, 0x80, 0x32, 0x00, 0x31, 0x00, 0x2E, 0x80, 0x2D, 0x00, + 0x2D, 0x00, 0x2E, 0x00, 0x30, 0x80, 0x2F, 0x80, 0x2F, 0x00, 0x2C, 0x00, + 0x2B, 0x00, 0x2C, 0x80, 0x2F, 0x80, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, + 0x2F, 0x00, 0x2A, 0x80, 0x23, 0x80, 0x1B, 0x80, 0x15, 0x00, 0x13, 0x80, + 0x13, 0x80, 0x16, 0x00, 0x18, 0x00, 0x19, 0x00, 0x16, 0x80, 0x11, 0x00, + 0x0E, 0x80, 0x0A, 0x00, 0x08, 0x00, 0x04, 0x00, 0xFF, 0x80, 0xFB, 0x00, + 0xF8, 0x00, 0xF6, 0x00, 0xF6, 0x80, 0xF8, 0x80, 0xF9, 0x80, 0xFD, 0x80, + 0xFE, 0x80, 0x02, 0x80, 0x04, 0x80, 0x05, 0x80, 0x07, 0x00, 0x09, 0x80, + 0x0B, 0x00, 0x0D, 0x00, 0x0D, 0x80, 0x0D, 0x00, 0x0D, 0x80, 0x0B, 0x80, + 0x0A, 0x00, 0x0A, 0x00, 0x07, 0x00, 0x04, 0x00, 0x01, 0x80, 0x20, 0x80, + 0x31, 0x80, 0x38, 0x80, 0x36, 0x80, 0x33, 0x00, 0x31, 0x80, 0x31, 0x00, + 0x2F, 0x00, 0x2B, 0x00, 0x28, 0x80, 0x29, 0x80, 0x2B, 0x00, 0x2C, 0x80, + 0x2A, 0x80, 0x27, 0x00, 0x25, 0x80, 0x26, 0x80, 0x2A, 0x80, 0x2F, 0x80, + 0x31, 0x00, 0x33, 0x00, 0x2F, 0x80, 0x2B, 0x80, 0x28, 0x00, 0x25, 0x00, + 0x25, 0x80, 0x26, 0x80, 0x2D, 0x00, 0x31, 0x80, 0x36, 0x00, 0x37, 0x00, + 0x35, 0x00, 0x33, 0x80, 0x33, 0x00, 0x2F, 0x80, 0x2C, 0x80, 0x27, 0x00, + 0x22, 0x80, 0x1D, 0x80, 0x1A, 0x80, 0x18, 0x80, 0x1A, 0x00, 0x1A, 0x80, + 0x1C, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x1C, 0x00, 0x19, 0x80, 0x17, 0x00, + 0x15, 0x00, 0x14, 0x00, 0x11, 0x80, 0x0F, 0x00, 0x0B, 0x00, 0x07, 0x80, + 0x06, 0x00, 0x01, 0x80, 0x00, 0x00, 0xFC, 0x80, 0xFB, 0x00, 0xFB, 0x00, + 0xFC, 0x80, 0xFE, 0x00, 0x01, 0x80, 0x20, 0x00, 0x30, 0x00, 0x35, 0x00, + 0x33, 0x00, 0x2F, 0x80, 0x2D, 0x00, 0x2B, 0x80, 0x29, 0x80, 0x24, 0x80, + 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x24, 0x80, 0x22, 0x80, 0x1E, 0x80, + 0x20, 0x80, 0x26, 0x00, 0x29, 0x80, 0x2A, 0x80, 0x26, 0x00, 0x20, 0x80, + 0x1B, 0x80, 0x1A, 0x80, 0x1A, 0x80, 0x1C, 0x00, 0x1E, 0x80, 0x21, 0x80, + 0x23, 0x80, 0x25, 0x00, 0x23, 0x80, 0x21, 0x00, 0x1F, 0x80, 0x1D, 0x00, + 0x1A, 0x80, 0x18, 0x00, 0x17, 0x00, 0x1A, 0x80, 0x20, 0x00, 0x24, 0x80, + 0x29, 0x80, 0x2A, 0x00, 0x2C, 0x00, 0x2C, 0x00, 0x2C, 0x00, 0x29, 0x80, + 0x27, 0x00, 0x25, 0x00, 0x21, 0x00, 0x1E, 0x00, 0x18, 0x80, 0x13, 0x00, + 0x0D, 0x00, 0x08, 0x80, 0x05, 0x80, 0x02, 0x00, 0xFF, 0x00, 0xFE, 0x80, + 0xFF, 0x80, 0x00, 0x00, 0xFF, 0x80, 0xFE, 0x00, 0xFE, 0x00, 0xFE, 0x00, + 0x01, 0x00, 0x20, 0x80, 0x33, 0x80, 0x3A, 0x80, 0x3A, 0x80, 0x36, 0x00, + 0x34, 0x80, 0x31, 0x80, 0x31, 0x00, 0x2D, 0x80, 0x2B, 0x80, 0x2B, 0x80, + 0x28, 0x00, 0x25, 0x00, 0x24, 0x00, 0x23, 0x00, 0x25, 0x80, 0x25, 0x80, + 0x20, 0x80, 0x18, 0x00, 0x11, 0x00, 0x0E, 0x00, 0x0E, 0x80, 0x10, 0x00, + 0x0F, 0x80, 0x0D, 0x80, 0x0A, 0x00, 0x07, 0x00, 0x03, 0x80, 0xFE, 0x00, + 0xF8, 0x80, 0xF2, 0x00, 0xF0, 0x00, 0xF1, 0x00, 0xF3, 0x80, 0xF5, 0x00, + 0xF5, 0x80, 0xF5, 0x80, 0xF7, 0x00, 0xF8, 0x00, 0xF7, 0x80, 0xF5, 0x00, + 0xF4, 0x00, 0xF3, 0x00, 0xF2, 0x00, 0xF2, 0x00, 0xF0, 0x00, 0xEF, 0x80, + 0xEE, 0x80, 0xF0, 0x80, 0xF0, 0x80, 0xF1, 0x80, 0xF3, 0x00, 0xF7, 0x00, + 0xFA, 0x00, 0xFE, 0x00, 0x00, 0x00, 0xFF, 0x80, 0xFF, 0x00, 0xFF, 0x80, + 0xFF, 0x00, 0xFF, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x20, 0x80, + 0x33, 0x80, 0x3A, 0x80, 0x3A, 0x80, 0x36, 0x00, 0x34, 0x80, 0x31, 0x80, + 0x31, 0x00, 0x2D, 0x80, 0x2B, 0x80, 0x2B, 0x80, 0x28, 0x00, 0x25, 0x00, + 0x24, 0x00, 0x23, 0x00, 0x25, 0x80, 0x25, 0x80, 0x20, 0x80, 0x18, 0x00, + 0x11, 0x00, 0x0E, 0x00, 0x0E, 0x80, 0x10, 0x00, 0x0F, 0x80, 0x0D, 0x80, + 0x0A, 0x00, 0x07, 0x00, 0x03, 0x80, 0xFE, 0x00, 0xF8, 0x80, 0xF2, 0x00, + 0xF0, 0x00, 0xF1, 0x00, 0xF3, 0x80, 0xF5, 0x00, 0xF5, 0x80, 0xF5, 0x80, + 0xF7, 0x00, 0xF8, 0x00, 0xF7, 0x80, 0xF5, 0x00, 0xF4, 0x00, 0xF3, 0x00, + 0xF2, 0x00, 0xF2, 0x00, 0xF0, 0x00, 0xEF, 0x80, 0xEE, 0x80, 0xF0, 0x80, + 0xF0, 0x80, 0xF1, 0x80, 0xF3, 0x00, 0xF7, 0x00, 0xFA, 0x00, 0xFE, 0x00, + 0x00, 0x00, 0xFF, 0x80, 0xFF, 0x00, 0xFF, 0x80, 0xFF, 0x00, 0xFF, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x20, 0x80, 0x33, 0x80, 0x3A, 0x80, + 0x3A, 0x80, 0x36, 0x00, 0x34, 0x80, 0x31, 0x80, 0x31, 0x00, 0x2D, 0x80, + 0x2B, 0x80, 0x2B, 0x80, 0x28, 0x00, 0x25, 0x00, 0x24, 0x00, 0x23, 0x00, + 0x25, 0x80, 0x25, 0x80, 0x20, 0x80, 0x18, 0x00, 0x11, 0x00, 0x0E, 0x00, + 0x0E, 0x80, 0x10, 0x00, 0x0F, 0x80, 0x0D, 0x80, 0x0A, 0x00, 0x07, 0x00, + 0x03, 0x80, 0xFE, 0x00, 0xF8, 0x80, 0xF2, 0x00, 0xF0, 0x00, 0xF1, 0x00, + 0xF3, 0x80, 0xF5, 0x00, 0xF5, 0x80, 0xF5, 0x80, 0xF7, 0x00, 0xF8, 0x00, + 0xF7, 0x80, 0xF5, 0x00, 0xF4, 0x00, 0xF3, 0x00, 0xF2, 0x00, 0xF2, 0x00, + 0xF0, 0x00, 0xEF, 0x80, 0xEE, 0x80, 0xF0, 0x80, 0xF0, 0x80, 0xF1, 0x80, + 0xF3, 0x00, 0xF7, 0x00, 0xFA, 0x00, 0xFE, 0x00, 0x00, 0x00, 0xFF, 0x80, + 0xFF, 0x00, 0xFF, 0x80, 0xFF, 0x00, 0xFF, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x80, 0xFB, 0x80, 0xF7, 0x00, + 0xF2, 0x00, 0xED, 0x80, 0xE8, 0x80, 0xE7, 0x00, 0xE6, 0x00, 0xE8, 0x00, + 0xEB, 0x00, 0xEF, 0x80, 0xF6, 0x00, 0xFB, 0x80, 0x00, 0x00, 0x04, 0x80, + 0x08, 0x80, 0x0B, 0x80, 0x0C, 0x80, 0x0D, 0x00, 0x0E, 0x00, 0x0D, 0x00, + 0x0D, 0x00, 0x0D, 0x00, 0x0D, 0x00, 0x0D, 0x00, 0x0C, 0x80, 0x0C, 0x80, + 0x0B, 0x00, 0x09, 0x00, 0x06, 0x00, 0x02, 0x00, 0xFE, 0x80, 0xFA, 0x00, + 0xF3, 0x80, 0xEC, 0x80, 0xE7, 0x00, 0xE1, 0x80, 0xDC, 0x80, 0xD9, 0x80, + 0xD7, 0x00, 0xD7, 0x00, 0xD8, 0x00, 0xD9, 0x80, 0xDC, 0x80, 0xE0, 0x80, + 0xE5, 0x80, 0xEB, 0x80, 0xF3, 0x00, 0xFB, 0x80, 0x05, 0x80, 0x10, 0x80, + 0x1D, 0x00, 0x29, 0x00, 0x33, 0x00, 0x3B, 0x00, 0x3F, 0x00, 0x3E, 0x00, + 0x37, 0x00, 0x2C, 0x00, 0x1C, 0x00, 0x09, 0x00, 0x02, 0x00, 0x0B, 0x00, + 0x12, 0x00, 0x1A, 0x00, 0x21, 0x00, 0x28, 0x80, 0x2E, 0x00, 0x32, 0x80, + 0x36, 0x80, 0x39, 0x80, 0x3C, 0x00, 0x3D, 0x00, 0x3C, 0x80, 0x3C, 0x00, + 0x3A, 0x00, 0x38, 0x00, 0x34, 0x80, 0x30, 0x80, 0x2E, 0x00, 0x29, 0x80, + 0x25, 0x80, 0x21, 0x80, 0x1C, 0x80, 0x1A, 0x00, 0x16, 0x00, 0x13, 0x00, + 0x10, 0x00, 0x0E, 0x80, 0x0D, 0x80, 0x0C, 0x00, 0x0C, 0x80, 0x0C, 0x00, + 0x0C, 0x00, 0x0C, 0x80, 0x0C, 0x80, 0x0E, 0x00, 0x0E, 0x80, 0x0E, 0x80, + 0x10, 0x00, 0x0F, 0x80, 0x10, 0x00, 0x0F, 0x80, 0x10, 0x00, 0x0E, 0x80, + 0x0E, 0x80, 0x0D, 0x00, 0x0B, 0x00, 0x09, 0x00, 0x07, 0x80, 0x05, 0x80, + 0x03, 0x80, 0x02, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFE, 0x00, 0xFD, 0x00, + 0xFB, 0x80, 0xFC, 0x00, 0xFB, 0x80, 0xFC, 0x00, 0xFC, 0x00, 0xFD, 0x00, + 0xFE, 0x00, 0xFF, 0x00, 0x02, 0x00, 0x0C, 0x80, 0x16, 0x00, 0x1F, 0x80, + 0x28, 0x80, 0x2F, 0x80, 0x35, 0x00, 0x39, 0x80, 0x3D, 0x00, 0x3E, 0x80, + 0xC1, 0x00, 0x3D, 0x80, 0x3B, 0x00, 0x38, 0x00, 0x33, 0x80, 0x2F, 0x00, + 0x2B, 0x00, 0x25, 0x80, 0x21, 0x00, 0x1C, 0x80, 0x18, 0x80, 0x15, 0x80, + 0x13, 0x00, 0x12, 0x00, 0x10, 0x80, 0x10, 0x80, 0x10, 0x00, 0x11, 0x00, + 0x11, 0x80, 0x12, 0x80, 0x14, 0x00, 0x14, 0x80, 0x15, 0x80, 0x16, 0x00, + 0x15, 0x00, 0x15, 0x00, 0x14, 0x00, 0x11, 0x80, 0x10, 0x80, 0x0F, 0x00, + 0x0D, 0x00, 0x0A, 0x80, 0x09, 0x00, 0x06, 0x80, 0x05, 0x00, 0x03, 0x80, + 0x02, 0x80, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x80, 0x02, 0x00, + 0x02, 0x80, 0x04, 0x00, 0x04, 0x80, 0x05, 0x80, 0x04, 0x80, 0x05, 0x80, + 0x05, 0x80, 0x04, 0x80, 0x04, 0x00, 0x03, 0x80, 0x02, 0x80, 0x01, 0x00, + 0x02, 0x00, 0x0E, 0x00, 0x19, 0x80, 0x23, 0x80, 0x2C, 0x80, 0x33, 0x80, + 0x38, 0x00, 0x3B, 0x00, 0x3B, 0x80, 0x3A, 0x80, 0x38, 0x80, 0x35, 0x00, + 0x2F, 0x80, 0x2A, 0x00, 0x25, 0x00, 0x1F, 0x80, 0x1B, 0x00, 0x16, 0x80, + 0x13, 0x80, 0x11, 0x80, 0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x13, 0x80, + 0x14, 0x00, 0x16, 0x00, 0x17, 0x80, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, + 0x18, 0x80, 0x17, 0x00, 0x15, 0x80, 0x13, 0x00, 0x10, 0x00, 0x0E, 0x80, + 0x0C, 0x80, 0x09, 0x80, 0x07, 0x80, 0x06, 0x80, 0x06, 0x80, 0x06, 0x00, + 0x06, 0x80, 0x07, 0x00, 0x07, 0x80, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, + 0x08, 0x80, 0x09, 0x00, 0x07, 0x80, 0x06, 0x80, 0x04, 0x80, 0x03, 0x80, + 0x01, 0x80, 0xFF, 0x80, 0xFD, 0x80, 0xFD, 0x00, 0xFC, 0x00, 0xFC, 0x00, + 0xFC, 0x00, 0xFC, 0x80, 0xFC, 0x80, 0xFE, 0x00, 0x02, 0x00, 0x0F, 0x00, + 0x1A, 0x00, 0x25, 0x00, 0x2E, 0x00, 0x35, 0x00, 0x3A, 0x80, 0x3E, 0x00, + 0x3E, 0x80, 0x3E, 0x00, 0x3C, 0x00, 0x38, 0x80, 0x33, 0x00, 0x2D, 0x80, + 0x28, 0x00, 0x22, 0x80, 0x1D, 0x80, 0x19, 0x80, 0x15, 0x80, 0x14, 0x00, + 0x13, 0x00, 0x12, 0x80, 0x13, 0x00, 0x14, 0x80, 0x15, 0x00, 0x16, 0x80, + 0x18, 0x00, 0x18, 0x80, 0x19, 0x00, 0x18, 0x80, 0x18, 0x00, 0x16, 0x00, + 0x14, 0x80, 0x11, 0x80, 0x10, 0x00, 0x0D, 0x00, 0x0A, 0x80, 0x08, 0x80, + 0x07, 0x00, 0x05, 0x80, 0x06, 0x00, 0x05, 0x80, 0x06, 0x00, 0x07, 0x00, + 0x08, 0x00, 0x09, 0x00, 0x0A, 0x00, 0x09, 0x80, 0x09, 0x80, 0x0A, 0x00, + 0x09, 0x00, 0x08, 0x00, 0x06, 0x80, 0x05, 0x00, 0x03, 0x00, 0x01, 0x80, + 0xFF, 0x00, 0xFE, 0x80, 0xFD, 0x00, 0xFC, 0x80, 0xFD, 0x00, 0xFD, 0x00, + 0xFD, 0x00, 0xFE, 0x80, 0x02, 0x00, 0x10, 0x80, 0x1E, 0x80, 0x2B, 0x00, + 0x34, 0x00, 0x3B, 0x80, 0xC1, 0x00, 0xC3, 0x00, 0xC1, 0x00, 0x3B, 0x00, + 0x36, 0x80, 0x30, 0x00, 0x29, 0x80, 0x23, 0x00, 0x1D, 0x80, 0x18, 0x80, + 0x15, 0x00, 0x13, 0x80, 0x12, 0x80, 0x12, 0x80, 0x14, 0x80, 0x16, 0x80, + 0x18, 0x00, 0x1A, 0x00, 0x1A, 0x80, 0x1A, 0x80, 0x19, 0x80, 0x18, 0x80, + 0x15, 0x80, 0x13, 0x00, 0x10, 0x80, 0x0E, 0x00, 0x0C, 0x00, 0x0A, 0x00, + 0x08, 0x80, 0x08, 0x80, 0x09, 0x00, 0x09, 0x00, 0x0A, 0x00, 0x0B, 0x00, + 0x0D, 0x00, 0x0D, 0x00, 0x0D, 0x00, 0x0C, 0x80, 0x0B, 0x80, 0x0A, 0x00, + 0x08, 0x00, 0x05, 0x00, 0x03, 0x80, 0x02, 0x00, 0x00, 0x00, 0xFF, 0x80, + 0xFE, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x80, 0x01, 0x80, 0x03, 0x00, + 0x03, 0x80, 0x04, 0x00, 0x04, 0x80, 0x03, 0x00, 0x02, 0x00, 0x00, 0x80, + 0x02, 0x00, 0x13, 0x00, 0x22, 0x00, 0x2F, 0x80, 0x39, 0x00, 0xC1, 0x00, + 0xC2, 0x80, 0xC2, 0x00, 0x3B, 0x00, 0x34, 0x80, 0x2E, 0x80, 0x26, 0x80, + 0x1F, 0x80, 0x1A, 0x00, 0x16, 0x00, 0x15, 0x00, 0x14, 0x00, 0x15, 0x80, + 0x17, 0x80, 0x19, 0x80, 0x1C, 0x00, 0x1E, 0x00, 0x1E, 0x80, 0x1E, 0x00, + 0x1B, 0x00, 0x18, 0x80, 0x15, 0x00, 0x12, 0x00, 0x0F, 0x80, 0x0D, 0x80, + 0x0C, 0x80, 0x0B, 0x00, 0x0C, 0x00, 0x0D, 0x00, 0x0E, 0x00, 0x0F, 0x00, + 0x10, 0x00, 0x10, 0x00, 0x0F, 0x80, 0x0D, 0x80, 0x0D, 0x80, 0x0A, 0x80, + 0x09, 0x00, 0x07, 0x00, 0x05, 0x00, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, + 0x04, 0x80, 0x06, 0x00, 0x05, 0x80, 0x06, 0x80, 0x05, 0x80, 0x06, 0x80, + 0x05, 0x00, 0x03, 0x80, 0x02, 0x00, 0xFF, 0x80, 0xFE, 0x00, 0xFD, 0x80, + 0xFD, 0x80, 0xFD, 0x00, 0xFC, 0x80, 0xFE, 0x80, 0x01, 0x80, 0x15, 0x00, + 0x26, 0x00, 0x34, 0x00, 0x3E, 0x00, 0xC5, 0x00, 0xC4, 0x00, 0xC1, 0x00, + 0x37, 0x80, 0x2F, 0x80, 0x27, 0x80, 0x1F, 0x00, 0x19, 0x80, 0x16, 0x00, + 0x14, 0x80, 0x15, 0x80, 0x18, 0x80, 0x1A, 0x80, 0x1D, 0x00, 0x1F, 0x00, + 0x1F, 0x80, 0x1E, 0x80, 0x1C, 0x80, 0x19, 0x80, 0x16, 0x00, 0x13, 0x00, + 0x10, 0x00, 0x0F, 0x00, 0x0E, 0x00, 0x0E, 0x80, 0x10, 0x00, 0x10, 0x00, + 0x10, 0x00, 0x10, 0x80, 0x10, 0x00, 0x0E, 0x80, 0x0C, 0x80, 0x0B, 0x00, + 0x08, 0x80, 0x06, 0x80, 0x06, 0x00, 0x04, 0x80, 0x05, 0x80, 0x06, 0x80, + 0x07, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0x00, 0x08, 0x00, + 0x05, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x80, 0xFF, 0x80, + 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x03, 0x80, 0x04, 0x00, 0x03, 0x00, + 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x17, 0x80, 0x29, 0x80, 0x36, 0x00, + 0x3D, 0x00, 0xC1, 0x00, 0x3B, 0x00, 0x33, 0x00, 0x29, 0x80, 0x22, 0x00, + 0x1B, 0x80, 0x16, 0x80, 0x16, 0x00, 0x16, 0x80, 0x19, 0x00, 0x1B, 0x00, + 0x1C, 0x80, 0x1E, 0x00, 0x1D, 0x00, 0x1A, 0x80, 0x18, 0x80, 0x15, 0x80, + 0x13, 0x00, 0x12, 0x00, 0x12, 0x80, 0x12, 0x80, 0x12, 0x80, 0x13, 0x00, + 0x12, 0x80, 0x10, 0x80, 0x0F, 0x80, 0x0D, 0x00, 0x0B, 0x80, 0x09, 0x80, + 0x0A, 0x80, 0x0B, 0x80, 0x0B, 0x00, 0x0C, 0x00, 0x0C, 0x80, 0x0C, 0x00, + 0x0C, 0x80, 0x0B, 0x80, 0x09, 0x80, 0x07, 0x80, 0x06, 0x00, 0x05, 0x80, + 0x05, 0x00, 0x05, 0x00, 0x06, 0x00, 0x05, 0x80, 0x05, 0x80, 0x04, 0x80, + 0x03, 0x80, 0x02, 0x80, 0x01, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x19, 0x00, 0x2C, 0x80, 0x38, 0x80, 0x3E, 0x00, 0x3E, 0x00, + 0x37, 0x00, 0x2E, 0x00, 0x23, 0x80, 0x1C, 0x80, 0x17, 0x00, 0x15, 0x00, + 0x16, 0x80, 0x17, 0x80, 0x1A, 0x00, 0x1B, 0x00, 0x1B, 0x00, 0x1A, 0x80, + 0x18, 0x00, 0x16, 0x80, 0x15, 0x00, 0x14, 0x00, 0x15, 0x80, 0x15, 0x80, + 0x16, 0x80, 0x16, 0x80, 0x15, 0x00, 0x13, 0x00, 0x11, 0x00, 0x0E, 0x00, + 0x0D, 0x80, 0x0C, 0x00, 0x0C, 0x80, 0x0C, 0x80, 0x0F, 0x00, 0x0F, 0x80, + 0x0E, 0x00, 0x0D, 0x00, 0x0B, 0x00, 0x09, 0x00, 0x08, 0x80, 0x08, 0x00, + 0x07, 0x80, 0x09, 0x00, 0x08, 0x80, 0x09, 0x80, 0x08, 0x80, 0x07, 0x80, + 0x06, 0x00, 0x03, 0x80, 0x01, 0x80, 0x02, 0x00, 0x01, 0x80, 0x02, 0x00, + 0x03, 0x80, 0x04, 0x00, 0x03, 0x80, 0x03, 0x80, 0x03, 0x00, 0x01, 0x80, + 0xFF, 0x00, 0xFE, 0x80, 0xFE, 0x00, 0xFE, 0x80, 0x01, 0x00, 0x1A, 0x80, + 0x2F, 0x80, 0x3C, 0x80, 0xC1, 0x80, 0x3D, 0x00, 0x35, 0x00, 0x2B, 0x80, + 0x21, 0x80, 0x1B, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1C, 0x00, 0x1C, 0x80, + 0x1E, 0x80, 0x1D, 0x80, 0x1C, 0x80, 0x19, 0x80, 0x17, 0x00, 0x16, 0x00, + 0x14, 0x00, 0x16, 0x00, 0x16, 0x00, 0x16, 0x80, 0x15, 0x80, 0x14, 0x00, + 0x11, 0x00, 0x0F, 0x00, 0x0D, 0x80, 0x0E, 0x00, 0x0F, 0x00, 0x0F, 0x00, + 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x0F, 0x00, 0x0C, 0x00, 0x0A, 0x00, + 0x09, 0x00, 0x07, 0x80, 0x08, 0x80, 0x09, 0x80, 0x09, 0x80, 0x09, 0x00, + 0x08, 0x00, 0x06, 0x80, 0x05, 0x00, 0x03, 0x80, 0x02, 0x80, 0x03, 0x80, + 0x04, 0x00, 0x03, 0x80, 0x04, 0x80, 0x04, 0x80, 0x03, 0x00, 0x01, 0x80, + 0x01, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x01, 0x00, + 0x01, 0x00, 0x01, 0x80, 0x01, 0x00, 0x1E, 0x00, 0x32, 0x00, 0x3E, 0x00, + 0x3E, 0x80, 0x38, 0x80, 0x2E, 0x00, 0x24, 0x00, 0x1C, 0x80, 0x19, 0x00, + 0x19, 0x80, 0x1C, 0x80, 0x1E, 0x00, 0x1D, 0x00, 0x1C, 0x80, 0x19, 0x80, + 0x17, 0x80, 0x17, 0x80, 0x17, 0x80, 0x1A, 0x00, 0x19, 0x00, 0x19, 0x00, + 0x17, 0x80, 0x14, 0x80, 0x12, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x00, + 0x10, 0x80, 0x11, 0x00, 0x11, 0x80, 0x0F, 0x00, 0x0D, 0x00, 0x0C, 0x80, + 0x0B, 0x80, 0x0C, 0x80, 0x0B, 0x00, 0x0B, 0x80, 0x0B, 0x00, 0x09, 0x00, + 0x08, 0x80, 0x07, 0x80, 0x08, 0x80, 0x08, 0x80, 0x09, 0x00, 0x09, 0x80, + 0x09, 0x00, 0x08, 0x80, 0x06, 0x00, 0x05, 0x80, 0x04, 0x00, 0x02, 0x80, + 0x04, 0x00, 0x04, 0x80, 0x03, 0x80, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, + 0x02, 0x80, 0x01, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x80, 0x01, 0x00, + 0x01, 0x00, 0x21, 0x00, 0x37, 0x80, 0xC2, 0x00, 0x3B, 0x00, 0x30, 0x80, + 0x24, 0x80, 0x1D, 0x80, 0x1A, 0x80, 0x1D, 0x00, 0x1E, 0x80, 0x1F, 0x00, + 0x1B, 0x80, 0x17, 0x00, 0x15, 0x80, 0x15, 0x00, 0x16, 0x80, 0x19, 0x00, + 0x1A, 0x00, 0x18, 0x80, 0x14, 0x80, 0x11, 0x00, 0x10, 0x00, 0x11, 0x80, + 0x13, 0x80, 0x14, 0x00, 0x15, 0x00, 0x12, 0x00, 0x0E, 0x80, 0x0E, 0x00, + 0x0D, 0x00, 0x0E, 0x80, 0x0E, 0x80, 0x10, 0x00, 0x0E, 0x00, 0x0D, 0x00, + 0x0A, 0x80, 0x09, 0x80, 0x0A, 0x80, 0x0A, 0x80, 0x0B, 0x00, 0x0A, 0x80, + 0x09, 0x00, 0x07, 0x00, 0x06, 0x80, 0x06, 0x80, 0x07, 0x80, 0x08, 0x80, + 0x08, 0x00, 0x06, 0x00, 0x04, 0x80, 0x02, 0x00, 0x04, 0x00, 0x04, 0x80, + 0x04, 0x80, 0x04, 0x00, 0x04, 0x80, 0x01, 0x00, 0xFF, 0x80, 0xFE, 0x80, + 0xFD, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x01, 0x00, 0x21, 0x00, + 0x35, 0x80, 0x3D, 0x80, 0x39, 0x00, 0x2F, 0x80, 0x24, 0x00, 0x1D, 0x80, + 0x1B, 0x80, 0x1C, 0x00, 0x1B, 0x80, 0x1D, 0x00, 0x19, 0x80, 0x17, 0x80, + 0x18, 0x80, 0x19, 0x80, 0x19, 0x80, 0x1A, 0x00, 0x18, 0x80, 0x16, 0x00, + 0x15, 0x00, 0x14, 0x00, 0x14, 0x00, 0x13, 0x80, 0x13, 0x80, 0x11, 0x00, + 0x10, 0x80, 0x0F, 0x00, 0x0E, 0x00, 0x0F, 0x00, 0x0E, 0x80, 0x0D, 0x80, + 0x0D, 0x00, 0x0D, 0x80, 0x0C, 0x80, 0x0C, 0x80, 0x0C, 0x00, 0x0B, 0x00, + 0x0C, 0x00, 0x0B, 0x00, 0x0A, 0x80, 0x0A, 0x80, 0x0A, 0x00, 0x09, 0x00, + 0x08, 0x80, 0x06, 0x80, 0x06, 0x80, 0x07, 0x00, 0x07, 0x80, 0x06, 0x80, + 0x04, 0x00, 0x03, 0x00, 0x03, 0x80, 0x03, 0x00, 0x02, 0x80, 0x03, 0x00, + 0x05, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0xFD, 0x80, 0xFF, 0x00, + 0xFF, 0x80, 0x00, 0x80, 0x01, 0x00, 0x29, 0x80, 0xC2, 0x00, 0x3E, 0x00, + 0x2F, 0x80, 0x21, 0x00, 0x1B, 0x80, 0x20, 0x00, 0x22, 0x80, 0x21, 0x00, + 0x19, 0x80, 0x16, 0x00, 0x14, 0x00, 0x18, 0x00, 0x1A, 0x80, 0x1A, 0x00, + 0x17, 0x00, 0x16, 0x00, 0x17, 0x80, 0x18, 0x00, 0x17, 0x80, 0x14, 0x80, + 0x12, 0x00, 0x14, 0x00, 0x16, 0x00, 0x14, 0x80, 0x15, 0x00, 0x10, 0x80, + 0x0E, 0x80, 0x0F, 0x80, 0x0F, 0x80, 0x10, 0x00, 0x0E, 0x00, 0x0C, 0x00, + 0x0A, 0x80, 0x0C, 0x80, 0x0E, 0x80, 0x0D, 0x80, 0x0D, 0x00, 0x06, 0x00, + 0x06, 0x80, 0x09, 0x00, 0x0B, 0x00, 0x0B, 0x00, 0x09, 0x00, 0x05, 0x80, + 0x06, 0x80, 0x07, 0x00, 0x08, 0x80, 0x06, 0x80, 0x04, 0x80, 0xFF, 0x80, + 0x01, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x80, 0x00, 0x80, + 0x01, 0x80, 0x03, 0x00, 0x02, 0x00, 0x01, 0x00, 0xFE, 0x80, 0x00, 0x00, + 0x01, 0x00, 0x24, 0x00, 0x36, 0x80, 0x39, 0x00, 0x30, 0x00, 0x28, 0x00, + 0x20, 0x00, 0x1E, 0x80, 0x1C, 0x80, 0x19, 0x80, 0x17, 0x80, 0x1A, 0x80, + 0x1B, 0x00, 0x1A, 0x00, 0x18, 0x80, 0x16, 0x00, 0x16, 0x00, 0x17, 0x80, + 0x18, 0x00, 0x16, 0x80, 0x14, 0x80, 0x13, 0x00, 0x12, 0x80, 0x13, 0x00, + 0x14, 0x00, 0x11, 0x80, 0x11, 0x00, 0x10, 0x00, 0x0F, 0x00, 0x10, 0x00, + 0x0F, 0x00, 0x0E, 0x80, 0x0E, 0x80, 0x0F, 0x80, 0x0D, 0x80, 0x0B, 0x80, + 0x0A, 0x80, 0x08, 0x00, 0x0A, 0x80, 0x08, 0x80, 0x08, 0x80, 0x07, 0x00, + 0x06, 0x80, 0x07, 0x00, 0x08, 0x00, 0x06, 0x00, 0x07, 0x00, 0x07, 0x80, + 0x07, 0x80, 0x06, 0x00, 0x04, 0x80, 0x02, 0x80, 0x01, 0x80, 0x01, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x01, 0x80, 0x01, 0x80, + 0xFF, 0x80, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x80, 0x01, 0x00, 0x2C, 0x80, + 0xC2, 0x00, 0x3A, 0x80, 0x28, 0x00, 0x19, 0x00, 0x18, 0x00, 0x20, 0x80, + 0x25, 0x80, 0x22, 0x80, 0x1C, 0x00, 0x16, 0x00, 0x16, 0x80, 0x19, 0x80, + 0x18, 0x80, 0x17, 0x80, 0x15, 0x80, 0x16, 0x80, 0x19, 0x80, 0x1A, 0x80, + 0x18, 0x80, 0x14, 0x00, 0x0F, 0x80, 0x10, 0x80, 0x11, 0x80, 0x12, 0x80, + 0x12, 0x00, 0x11, 0x80, 0x10, 0x00, 0x0E, 0x80, 0x0E, 0x80, 0x0E, 0x00, + 0x0D, 0x80, 0x0E, 0x00, 0x0B, 0x00, 0x0C, 0x00, 0x0C, 0x80, 0x0A, 0x80, + 0x0C, 0x00, 0x07, 0x80, 0x07, 0x80, 0x07, 0x80, 0x09, 0x80, 0x09, 0x00, + 0x07, 0x80, 0x04, 0x80, 0x03, 0x80, 0x03, 0x00, 0x03, 0x80, 0x04, 0x00, + 0x05, 0x00, 0x01, 0x80, 0x03, 0x00, 0x04, 0x80, 0x05, 0x80, 0x03, 0x00, + 0x01, 0x80, 0x00, 0x80, 0x01, 0x00, 0x02, 0x00, 0x01, 0x80, 0x00, 0x00, + 0xFF, 0x00, 0xFF, 0x80, 0x01, 0x00, 0x21, 0x80, 0x31, 0x80, 0x33, 0x80, + 0x2A, 0x80, 0x22, 0x80, 0x1C, 0x00, 0x1C, 0x00, 0x1C, 0x80, 0x19, 0x00, + 0x18, 0x80, 0x19, 0x00, 0x1A, 0x80, 0x19, 0x80, 0x18, 0x00, 0x15, 0x80, + 0x15, 0x80, 0x17, 0x00, 0x18, 0x80, 0x17, 0x00, 0x16, 0x00, 0x13, 0x00, + 0x12, 0x80, 0x14, 0x00, 0x13, 0x80, 0x12, 0x00, 0x10, 0x00, 0x10, 0x80, + 0x0F, 0x80, 0x0F, 0x80, 0x10, 0x00, 0x0E, 0x00, 0x0D, 0x80, 0x0D, 0x80, + 0x0B, 0x80, 0x09, 0x80, 0x08, 0x80, 0x07, 0x00, 0x0B, 0x00, 0x0A, 0x00, + 0x0B, 0x00, 0x09, 0x00, 0x09, 0x80, 0x08, 0x00, 0x08, 0x80, 0x07, 0x00, + 0x07, 0x00, 0x07, 0x00, 0x06, 0x00, 0x05, 0x00, 0x05, 0x00, 0x03, 0x00, + 0x03, 0x00, 0x02, 0x80, 0x03, 0x00, 0x05, 0x00, 0x03, 0x80, 0x03, 0x00, + 0x03, 0x80, 0x03, 0x00, 0x01, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x01, 0x00, 0x28, 0x00, 0x3E, 0x00, 0xC2, 0x00, 0x34, 0x80, 0x2B, 0x00, + 0x23, 0x80, 0x23, 0x00, 0x21, 0x00, 0x20, 0x00, 0x1F, 0x00, 0x20, 0x00, + 0x1F, 0x80, 0x1A, 0x80, 0x18, 0x80, 0x14, 0x80, 0x15, 0x00, 0x17, 0x80, + 0x1A, 0x00, 0x18, 0x00, 0x14, 0x80, 0x11, 0x80, 0x11, 0x80, 0x13, 0x00, + 0x12, 0x80, 0x11, 0x80, 0x11, 0x80, 0x10, 0x00, 0x0D, 0x00, 0x0E, 0x80, + 0x0D, 0x00, 0x0B, 0x80, 0x0B, 0x00, 0x0C, 0x80, 0x0A, 0x00, 0x08, 0x80, + 0x07, 0x00, 0x05, 0x00, 0x07, 0x80, 0x06, 0x80, 0x07, 0x80, 0x06, 0x80, + 0x05, 0x00, 0x04, 0x00, 0x04, 0x80, 0x04, 0x80, 0x06, 0x80, 0x07, 0x00, + 0x06, 0x80, 0x05, 0x80, 0x02, 0x80, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x80, 0x01, 0x80, 0x03, 0x80, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, + 0xFF, 0x00, 0x01, 0x80, 0x00, 0x80, 0x01, 0x00, 0x01, 0x00, 0x1E, 0x80, + 0x2E, 0x00, 0x2F, 0x80, 0x27, 0x00, 0x20, 0x80, 0x1C, 0x00, 0x1C, 0x80, + 0x1D, 0x00, 0x18, 0x80, 0x17, 0x00, 0x17, 0x00, 0x18, 0x80, 0x16, 0x80, + 0x16, 0x80, 0x14, 0x00, 0x14, 0x80, 0x16, 0x00, 0x17, 0x00, 0x13, 0x80, + 0x12, 0x80, 0x10, 0x00, 0x10, 0x00, 0x12, 0x80, 0x11, 0x80, 0x11, 0x80, + 0x0F, 0x00, 0x10, 0x00, 0x0E, 0x80, 0x0D, 0x80, 0x0E, 0x00, 0x0C, 0x00, + 0x0C, 0x80, 0x0D, 0x80, 0x0C, 0x00, 0x0B, 0x80, 0x0A, 0x00, 0x06, 0x00, + 0x08, 0x80, 0x07, 0x00, 0x07, 0x00, 0x05, 0x00, 0x05, 0x00, 0x04, 0x80, + 0x06, 0x80, 0x06, 0x00, 0x06, 0x80, 0x06, 0x00, 0x05, 0x00, 0x05, 0x00, + 0x03, 0x80, 0x02, 0x80, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x80, + 0x01, 0x00, 0x00, 0x80, 0x01, 0x80, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x01, 0x00, 0x26, 0x00, 0x3E, 0x00, 0xC6, 0x80, + 0x3D, 0x80, 0x34, 0x80, 0x2F, 0x00, 0x2B, 0x80, 0x2A, 0x80, 0x29, 0x80, + 0x29, 0x00, 0x28, 0x00, 0x28, 0x00, 0x25, 0x80, 0x23, 0x00, 0x22, 0x00, + 0x21, 0x80, 0x22, 0x00, 0x23, 0x00, 0x1F, 0x80, 0x1C, 0x80, 0x1B, 0x00, + 0x1A, 0x80, 0x1C, 0x80, 0x19, 0x00, 0x19, 0x00, 0x17, 0x80, 0x17, 0x00, + 0x14, 0x80, 0x14, 0x80, 0x13, 0x00, 0x12, 0x00, 0x11, 0x80, 0x10, 0x80, + 0x10, 0x80, 0x0F, 0x00, 0x0D, 0x00, 0x0D, 0x80, 0x0E, 0x80, 0x0D, 0x80, + 0x0C, 0x80, 0x09, 0x80, 0x09, 0x80, 0x08, 0x80, 0x08, 0x00, 0x06, 0x80, + 0x06, 0x00, 0x05, 0x00, 0x05, 0x00, 0x04, 0x00, 0x03, 0x80, 0x00, 0x80, + 0x01, 0x00, 0x02, 0x80, 0x03, 0x80, 0x02, 0x80, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x80, 0x01, 0x80, 0x01, 0x00, 0x01, 0x80, 0xFF, 0x00, 0xFF, 0x80, + 0x01, 0x00, 0x1C, 0x00, 0x2A, 0x00, 0x2B, 0x00, 0x22, 0x00, 0x1D, 0x80, + 0x1B, 0x00, 0x1B, 0x80, 0x1A, 0x00, 0x17, 0x80, 0x15, 0x00, 0x15, 0x00, + 0x17, 0x00, 0x15, 0x80, 0x16, 0x00, 0x12, 0x80, 0x13, 0x00, 0x14, 0x00, + 0x15, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0F, 0x00, 0x0F, 0x80, 0x12, 0x00, + 0x10, 0x80, 0x0F, 0x00, 0x0C, 0x80, 0x0C, 0x00, 0x09, 0x00, 0x0A, 0x80, + 0x0A, 0x80, 0x0A, 0x00, 0x0A, 0x80, 0x0C, 0x00, 0x0B, 0x00, 0x08, 0x80, + 0x08, 0x00, 0x05, 0x00, 0x08, 0x00, 0x07, 0x80, 0x09, 0x00, 0x07, 0x00, + 0x06, 0x80, 0x05, 0x00, 0x05, 0x00, 0x04, 0x80, 0x04, 0x80, 0x04, 0x00, + 0x04, 0x80, 0x04, 0x00, 0x02, 0x80, 0x02, 0x00, 0x00, 0x80, 0x01, 0x00, + 0x01, 0x80, 0x03, 0x80, 0x02, 0x00, 0x01, 0x00, 0x01, 0x80, 0x01, 0x00, + 0xFD, 0x80, 0xFE, 0x80, 0xFD, 0x80, 0xFE, 0x00, 0x01, 0x00, 0x23, 0x00, + 0x3A, 0x00, 0xC3, 0x00, 0x3D, 0x00, 0x34, 0x80, 0x2F, 0x80, 0x2B, 0x80, + 0x28, 0x80, 0x24, 0x00, 0x21, 0x80, 0x20, 0x00, 0x22, 0x00, 0x21, 0x80, + 0x21, 0x80, 0x20, 0x00, 0x1F, 0x00, 0x1F, 0x80, 0x20, 0x80, 0x1D, 0x80, + 0x1B, 0x00, 0x18, 0x80, 0x1A, 0x00, 0x18, 0x00, 0x15, 0x80, 0x13, 0x00, + 0x11, 0x00, 0x11, 0x00, 0x0F, 0x80, 0x10, 0x80, 0x10, 0x00, 0x0F, 0x00, + 0x0E, 0x80, 0x0E, 0x80, 0x0C, 0x80, 0x0B, 0x80, 0x0A, 0x00, 0x0A, 0x00, + 0x0C, 0x80, 0x0C, 0x80, 0x0B, 0x00, 0x08, 0x80, 0x08, 0x00, 0x09, 0x80, + 0x08, 0x00, 0x07, 0x80, 0x06, 0x80, 0x04, 0x80, 0x05, 0x80, 0x04, 0x80, + 0x05, 0x80, 0x03, 0x00, 0x02, 0x00, 0x01, 0x80, 0x02, 0x80, 0x00, 0x00, + 0xFE, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0x01, 0x00, 0x00, 0x80, 0x02, 0x00, + 0xFE, 0x80, 0x00, 0x80, 0x01, 0x00, 0x18, 0x80, 0x25, 0x80, 0x26, 0x80, + 0x20, 0x00, 0x1C, 0x80, 0x1B, 0x00, 0x1C, 0x00, 0x19, 0x00, 0x15, 0x00, + 0x13, 0x00, 0x13, 0x00, 0x16, 0x00, 0x15, 0x80, 0x16, 0x00, 0x12, 0x00, + 0x10, 0x80, 0x11, 0x00, 0x12, 0x00, 0x10, 0x00, 0x10, 0x00, 0x0F, 0x80, + 0x0F, 0x80, 0x11, 0x00, 0x0E, 0x00, 0x0C, 0x80, 0x0A, 0x80, 0x0B, 0x00, + 0x0A, 0x80, 0x0D, 0x00, 0x0B, 0x80, 0x09, 0x00, 0x07, 0x80, 0x06, 0x80, + 0x06, 0x00, 0x04, 0x00, 0x05, 0x00, 0x02, 0x80, 0x06, 0x00, 0x05, 0x00, + 0x06, 0x80, 0x04, 0x80, 0x05, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x80, + 0x02, 0x80, 0x02, 0x80, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x01, 0x80, 0x02, 0x80, 0x01, 0x80, 0x00, 0x80, + 0x02, 0x00, 0x01, 0x80, 0xFF, 0x80, 0x01, 0x00, 0xFF, 0x80, 0xFF, 0x00, + 0x01, 0x80, 0x26, 0x80, 0x3A, 0x80, 0xC4, 0x80, 0x3C, 0x00, 0x33, 0x00, + 0x30, 0x00, 0x2E, 0x80, 0x2C, 0x00, 0x26, 0x00, 0x23, 0x00, 0x21, 0x00, + 0x22, 0x00, 0x21, 0x00, 0x20, 0x80, 0x20, 0x00, 0x20, 0x00, 0x1F, 0x80, + 0x1E, 0x00, 0x1B, 0x80, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, + 0x16, 0x00, 0x14, 0x80, 0x10, 0x00, 0x11, 0x00, 0x10, 0x00, 0x10, 0x00, + 0x10, 0x00, 0x0E, 0x00, 0x0C, 0x00, 0x0B, 0x80, 0x0B, 0x00, 0x08, 0x80, + 0x0A, 0x00, 0x07, 0x80, 0x07, 0x00, 0x07, 0x00, 0x06, 0x00, 0x06, 0x00, + 0x05, 0x00, 0x06, 0x80, 0x06, 0x00, 0x06, 0x00, 0x05, 0x00, 0x05, 0x00, + 0x05, 0x00, 0x05, 0x80, 0x05, 0x00, 0x02, 0x80, 0x01, 0x00, 0x01, 0x00, + 0x03, 0x00, 0x02, 0x80, 0x03, 0x80, 0x01, 0x00, 0x01, 0x80, 0xFF, 0x00, + 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x80, 0xFF, 0x00, 0x00, 0x80, 0x18, 0x00, + 0x24, 0x00, 0x25, 0x00, 0x1F, 0x00, 0x1B, 0x00, 0x1A, 0x00, 0x1B, 0x80, + 0x18, 0x00, 0x14, 0x00, 0x12, 0x00, 0x11, 0x80, 0x14, 0x80, 0x13, 0x80, + 0x13, 0x80, 0x0F, 0x80, 0x0D, 0x80, 0x0E, 0x00, 0x0F, 0x80, 0x0D, 0x80, + 0x0E, 0x80, 0x0D, 0x80, 0x0E, 0x80, 0x0F, 0x80, 0x0C, 0x00, 0x0A, 0x00, + 0x08, 0x00, 0x09, 0x00, 0x07, 0x80, 0x09, 0x80, 0x08, 0x00, 0x06, 0x00, + 0x06, 0x00, 0x05, 0x80, 0x05, 0x80, 0x03, 0x80, 0x04, 0x80, 0x01, 0x80, + 0x04, 0x80, 0x03, 0x80, 0x04, 0x80, 0x02, 0x80, 0x03, 0x00, 0x03, 0x00, + 0x03, 0x00, 0x03, 0x80, 0x02, 0x80, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, + 0x01, 0x80, 0x01, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x01, 0x80, + 0x01, 0x80, 0x00, 0x00, 0x02, 0x00, 0x01, 0x80, 0x00, 0x80, 0x02, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x80, 0x2A, 0x80, 0x3E, 0x80, 0xC5, 0x00, + 0x38, 0x00, 0x2D, 0x00, 0x27, 0x00, 0x25, 0x00, 0x23, 0x80, 0x1E, 0x80, + 0x1B, 0x80, 0x1A, 0x80, 0x1A, 0x00, 0x1A, 0x00, 0x18, 0x00, 0x16, 0x00, + 0x13, 0x80, 0x14, 0x00, 0x14, 0x00, 0x13, 0x80, 0x12, 0x80, 0x11, 0x80, + 0x10, 0x00, 0x10, 0x00, 0x0E, 0x80, 0x0D, 0x00, 0x0B, 0x80, 0x0D, 0x80, + 0x0B, 0x80, 0x0B, 0x80, 0x09, 0x80, 0x08, 0x00, 0x07, 0x80, 0x08, 0x80, + 0x08, 0x80, 0x07, 0x80, 0x07, 0x00, 0x06, 0x00, 0x06, 0x80, 0x07, 0x80, + 0x06, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x80, 0x05, 0x00, 0x05, 0x00, + 0x04, 0x00, 0x04, 0x00, 0x04, 0x80, 0x05, 0x80, 0x05, 0x00, 0x04, 0x00, + 0x02, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x80, + 0x01, 0x00, 0x00, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0x00, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x15, 0x00, 0x21, 0x00, 0x21, 0x00, 0x1C, 0x00, 0x18, 0x80, + 0x18, 0x00, 0x1A, 0x00, 0x17, 0x80, 0x12, 0x80, 0x0F, 0x80, 0x0E, 0x00, + 0x10, 0x00, 0x11, 0x00, 0x11, 0x00, 0x0E, 0x80, 0x0D, 0x80, 0x0D, 0x80, + 0x0E, 0x00, 0x0B, 0x00, 0x09, 0x80, 0x08, 0x80, 0x0A, 0x00, 0x0B, 0x80, + 0x09, 0x80, 0x08, 0x80, 0x08, 0x00, 0x08, 0x80, 0x06, 0x00, 0x08, 0x80, + 0x07, 0x00, 0x05, 0x00, 0x04, 0x80, 0x06, 0x00, 0x06, 0x80, 0x04, 0x00, + 0x04, 0x80, 0x02, 0x80, 0x03, 0x80, 0x01, 0x80, 0x01, 0x80, 0x00, 0x00, + 0x01, 0x00, 0x01, 0x80, 0x02, 0x00, 0x02, 0x80, 0x01, 0x80, 0x03, 0x00, + 0x02, 0x80, 0x01, 0x80, 0x00, 0x80, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0xFE, 0x80, 0x00, 0x80, 0x00, 0x00, + 0xFF, 0x00, 0x01, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0x01, 0x80, 0x29, 0x00, + 0xC1, 0x80, 0xC5, 0x00, 0x38, 0x80, 0x30, 0x00, 0x2C, 0x80, 0x2C, 0x00, + 0x2A, 0x00, 0x24, 0x00, 0x1F, 0x00, 0x1E, 0x00, 0x1E, 0x80, 0x1D, 0x00, + 0x1B, 0x00, 0x18, 0x80, 0x17, 0x80, 0x17, 0x00, 0x15, 0x80, 0x15, 0x80, + 0x11, 0x80, 0x10, 0x80, 0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x0C, 0x80, + 0x0C, 0x00, 0x09, 0x80, 0x09, 0x00, 0x0C, 0x80, 0x0C, 0x80, 0x0A, 0x00, + 0x08, 0x00, 0x08, 0x00, 0x07, 0x80, 0x08, 0x80, 0x07, 0x00, 0x05, 0x00, + 0x03, 0x80, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x80, 0x04, 0x00, + 0x04, 0x00, 0x03, 0x00, 0x04, 0x80, 0x05, 0x00, 0x06, 0x80, 0x06, 0x80, + 0x02, 0x80, 0x00, 0x80, 0x00, 0x80, 0xFF, 0x80, 0x00, 0x80, 0xFF, 0x80, + 0xFF, 0x80, 0xFE, 0x80, 0xFF, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x00, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x20, 0x00, 0x1F, 0x80, + 0x1A, 0x00, 0x16, 0x80, 0x16, 0x00, 0x17, 0x80, 0x14, 0x00, 0x0F, 0x80, + 0x0C, 0x00, 0x0A, 0x80, 0x0C, 0x80, 0x0D, 0x00, 0x0D, 0x80, 0x0A, 0x80, + 0x09, 0x80, 0x09, 0x80, 0x0A, 0x00, 0x07, 0x80, 0x06, 0x00, 0x05, 0x80, + 0x07, 0x00, 0x08, 0x80, 0x06, 0x80, 0x06, 0x00, 0x06, 0x00, 0x06, 0x80, + 0x04, 0x80, 0x06, 0x80, 0x05, 0x80, 0x03, 0x80, 0x03, 0x80, 0x05, 0x00, + 0x06, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x00, 0x03, 0x80, 0x01, 0x00, + 0x01, 0x80, 0x00, 0x80, 0x01, 0x00, 0x01, 0x80, 0x02, 0x00, 0x02, 0x80, + 0x01, 0x80, 0x03, 0x00, 0x02, 0x80, 0x02, 0x00, 0x00, 0x80, 0xFF, 0x80, + 0xFF, 0x00, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x80, + 0x00, 0x00, 0xFF, 0x80, 0xFE, 0x80, 0x01, 0x00, 0x00, 0x00, 0xFF, 0x00, + 0x01, 0x00, 0x2A, 0x00, 0xC2, 0x00, 0xC1, 0x00, 0x32, 0x00, 0x2C, 0x00, + 0x2C, 0x00, 0x2E, 0x00, 0x2A, 0x00, 0x1F, 0x00, 0x16, 0x80, 0x16, 0x00, + 0x18, 0x00, 0x19, 0x00, 0x17, 0x00, 0x13, 0x80, 0x12, 0x00, 0x13, 0x80, + 0x13, 0x80, 0x12, 0x00, 0x0E, 0x80, 0x0B, 0x80, 0x0B, 0x80, 0x0F, 0x00, + 0x0F, 0x80, 0x0B, 0x00, 0x0B, 0x00, 0x09, 0x80, 0x0B, 0x00, 0x0B, 0x00, + 0x08, 0x80, 0x07, 0x00, 0x07, 0x00, 0x09, 0x80, 0x0B, 0x00, 0x0A, 0x00, + 0x06, 0x80, 0x05, 0x00, 0x05, 0x00, 0x02, 0x80, 0x03, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x02, 0x80, 0x05, 0x00, 0x05, 0x80, 0x06, 0x80, 0x03, 0x80, + 0x03, 0x00, 0x05, 0x00, 0x03, 0x00, 0xFF, 0x80, 0xFE, 0x80, 0xFE, 0x00, + 0xFE, 0x80, 0xFF, 0x00, 0xFF, 0x00, 0xFD, 0x00, 0xFE, 0x00, 0xFF, 0x00, + 0xFE, 0x80, 0xFE, 0x80, 0xFE, 0x00, 0x00, 0x80, 0x00, 0x00, 0x15, 0x00, + 0x20, 0x00, 0x1F, 0x80, 0x1A, 0x00, 0x16, 0x80, 0x16, 0x00, 0x17, 0x80, + 0x14, 0x00, 0x0F, 0x80, 0x0C, 0x00, 0x0A, 0x80, 0x0C, 0x80, 0x0D, 0x00, + 0x0D, 0x80, 0x0A, 0x80, 0x09, 0x80, 0x09, 0x80, 0x0A, 0x00, 0x07, 0x80, + 0x06, 0x00, 0x05, 0x80, 0x07, 0x00, 0x08, 0x80, 0x06, 0x80, 0x06, 0x00, + 0x06, 0x00, 0x06, 0x80, 0x04, 0x80, 0x06, 0x80, 0x05, 0x80, 0x03, 0x80, + 0x03, 0x80, 0x05, 0x00, 0x06, 0x00, 0x03, 0x00, 0x04, 0x00, 0x02, 0x00, + 0x03, 0x80, 0x01, 0x00, 0x01, 0x80, 0x00, 0x80, 0x01, 0x00, 0x01, 0x80, + 0x02, 0x00, 0x02, 0x80, 0x01, 0x80, 0x03, 0x00, 0x02, 0x80, 0x02, 0x00, + 0x00, 0x80, 0xFF, 0x80, 0xFF, 0x00, 0xFF, 0x80, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0xFE, 0x80, 0x00, 0x00, 0xFF, 0x80, 0xFE, 0x80, 0x01, 0x00, + 0x00, 0x00, 0xFF, 0x00, 0xFE, 0x00, 0xFA, 0x00, 0xF6, 0x00, 0xF2, 0x00, + 0xEE, 0x00, 0xE9, 0x00, 0xE5, 0x00, 0xE2, 0x00, 0xDE, 0x80, 0xDC, 0x80, + 0xDC, 0x80, 0xDD, 0x80, 0xDF, 0x80, 0xE3, 0x00, 0xE7, 0x00, 0xEC, 0x00, + 0xF1, 0x00, 0xF6, 0x00, 0xFA, 0x00, 0xFE, 0x00, 0x01, 0x00, 0x03, 0x00, + 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x05, 0x00, 0x03, 0x00, 0x02, 0x00, + 0x00, 0x00, 0xFD, 0x00, 0xFA, 0x00, 0xF6, 0x00, 0xF1, 0x00, 0xEC, 0x00, + 0xE7, 0x00, 0xE1, 0x00, 0xDA, 0x80, 0xD5, 0x80, 0xD0, 0x80, 0xCB, 0x80, + 0xC7, 0x80, 0xC3, 0x80, 0xC1, 0x80, 0xC1, 0x80, 0xC2, 0x80, 0xC5, 0x80, + 0xCA, 0x80, 0xD0, 0x80, 0xD9, 0x80, 0xE5, 0x00, 0xF1, 0x00, 0xFE, 0x00, + 0x0B, 0x00, 0x19, 0x00, 0x26, 0x80, 0x30, 0x80, 0x38, 0x80, 0x3D, 0x80, + 0x3D, 0x80, 0x39, 0x80, 0x32, 0x80, 0x26, 0x80, 0x18, 0x00, 0x08, 0x00, + 0xFE, 0x00, 0xF9, 0x80, 0xF3, 0x80, 0xEF, 0x00, 0xEB, 0x80, 0xE8, 0x00, + 0xE6, 0x00, 0xE3, 0x80, 0xE2, 0x80, 0xE2, 0x80, 0xE2, 0x80, 0xE3, 0x80, + 0xE6, 0x00, 0xE7, 0x00, 0xE9, 0x80, 0xED, 0x00, 0xF0, 0x00, 0xF2, 0x80, + 0xF6, 0x00, 0xF8, 0x00, 0xFA, 0x80, 0xFD, 0x00, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFD, 0x00, 0xF9, 0x80, + 0xF6, 0x00, 0xF1, 0x80, 0xED, 0x00, 0xE7, 0x00, 0xE1, 0x80, 0xDB, 0x80, + 0xD6, 0x00, 0xD0, 0x00, 0xCA, 0x80, 0xC6, 0x00, 0xC3, 0x80, 0xC1, 0x80, + 0xC1, 0x80, 0xC3, 0x80, 0xC6, 0x00, 0xCB, 0x80, 0xD2, 0x80, 0xDA, 0x80, + 0xE3, 0x80, 0xEE, 0x00, 0xF9, 0x80, 0x02, 0x00, 0x0C, 0x80, 0x15, 0x80, + 0x1D, 0x80, 0x23, 0x00, 0x26, 0x80, 0x28, 0x00, 0x26, 0x80, 0x23, 0x00, + 0x1D, 0x80, 0x16, 0x80, 0x0D, 0x80, 0x04, 0x80, 0x02, 0x00, 0x07, 0x00, + 0x0D, 0x00, 0x12, 0x00, 0x16, 0x80, 0x1B, 0x80, 0x1F, 0x80, 0x23, 0x80, + 0x26, 0x80, 0x29, 0x80, 0x2C, 0x80, 0x2F, 0x00, 0x2F, 0x80, 0x30, 0x80, + 0x32, 0x00, 0x32, 0x80, 0x32, 0x80, 0x32, 0x00, 0x32, 0x00, 0x31, 0x80, + 0x30, 0x00, 0x30, 0x00, 0x2F, 0x80, 0x2F, 0x00, 0x2E, 0x00, 0x2D, 0x80, + 0x2D, 0x00, 0x2D, 0x80, 0x2D, 0x80, 0x2D, 0x80, 0x2E, 0x00, 0x2E, 0x80, + 0x2F, 0x00, 0x30, 0x00, 0x30, 0x00, 0x31, 0x80, 0x32, 0x80, 0x33, 0x00, + 0x33, 0x80, 0x34, 0x80, 0x35, 0x00, 0x35, 0x80, 0x35, 0x80, 0x35, 0x80, + 0x35, 0x80, 0x34, 0x80, 0x33, 0x80, 0x32, 0x00, 0x31, 0x00, 0x2F, 0x80, + 0x2D, 0x00, 0x2A, 0x80, 0x28, 0x00, 0x25, 0x80, 0x22, 0x80, 0x1F, 0x00, + 0x1C, 0x00, 0x18, 0x80, 0x15, 0x00, 0x11, 0x80, 0x0E, 0x80, 0x0A, 0x80, + 0x05, 0x80, 0x02, 0x80, 0x02, 0x00, 0x0B, 0x00, 0x12, 0x00, 0x19, 0x80, + 0x21, 0x00, 0x27, 0x00, 0x2C, 0x00, 0x30, 0x00, 0x33, 0x00, 0x34, 0x80, + 0x35, 0x00, 0x33, 0x80, 0x31, 0x80, 0x2F, 0x00, 0x2B, 0x00, 0x26, 0x00, + 0x21, 0x00, 0x1B, 0x80, 0x16, 0x00, 0x11, 0x00, 0x0D, 0x00, 0x08, 0x80, + 0x04, 0x80, 0x01, 0x80, 0xFF, 0x00, 0xFF, 0x00, 0xFE, 0x80, 0xFF, 0x80, + 0x01, 0x80, 0x04, 0x80, 0x08, 0x80, 0x0C, 0x80, 0x10, 0x00, 0x15, 0x80, + 0x19, 0x80, 0x1E, 0x80, 0x23, 0x00, 0x26, 0x80, 0x2A, 0x80, 0x2C, 0x80, + 0x2F, 0x00, 0x2F, 0x80, 0x30, 0x00, 0x2F, 0x00, 0x2D, 0x80, 0x2B, 0x80, + 0x28, 0x00, 0x24, 0x80, 0x20, 0x80, 0x1C, 0x80, 0x17, 0x80, 0x13, 0x80, + 0x0F, 0x80, 0x0C, 0x00, 0x08, 0x80, 0x05, 0x00, 0x02, 0x00, 0x00, 0x80, + 0xFF, 0x00, 0xFE, 0x00, 0xFD, 0x80, 0xFE, 0x00, 0xFE, 0x80, 0xFF, 0x00, + 0x02, 0x00, 0x0B, 0x00, 0x14, 0x00, 0x1C, 0x80, 0x24, 0x80, 0x2B, 0x80, + 0x31, 0x00, 0x35, 0x80, 0x39, 0x80, 0x3C, 0x00, 0x3D, 0x80, 0x3D, 0x80, + 0x3C, 0x00, 0x39, 0x00, 0x35, 0x80, 0x31, 0x00, 0x2C, 0x00, 0x26, 0x00, + 0x1F, 0x80, 0x18, 0x80, 0x12, 0x00, 0x0C, 0x00, 0x05, 0x00, 0x00, 0x00, + 0xFA, 0x00, 0xF6, 0x00, 0xF2, 0x00, 0xF0, 0x80, 0xEE, 0x80, 0xED, 0x80, + 0xEE, 0x00, 0xEF, 0x00, 0xF1, 0x00, 0xF3, 0x80, 0xF6, 0x80, 0xFB, 0x00, + 0xFF, 0x80, 0x04, 0x80, 0x09, 0x00, 0x0E, 0x00, 0x13, 0x00, 0x17, 0x80, + 0x1C, 0x80, 0x20, 0x80, 0x24, 0x80, 0x27, 0x80, 0x29, 0x80, 0x2B, 0x80, + 0x2C, 0x80, 0x2D, 0x00, 0x2C, 0x80, 0x2C, 0x00, 0x2B, 0x00, 0x29, 0x00, + 0x26, 0x80, 0x23, 0x80, 0x20, 0x80, 0x1D, 0x00, 0x19, 0x00, 0x15, 0x80, + 0x11, 0x00, 0x0C, 0x80, 0x07, 0x80, 0x03, 0x80, 0x02, 0x00, 0x0C, 0x80, + 0x16, 0x80, 0x1F, 0x80, 0x26, 0x80, 0x2C, 0x80, 0x30, 0x00, 0x31, 0x80, + 0x31, 0x80, 0x2F, 0x80, 0x2B, 0x80, 0x25, 0x80, 0x1F, 0x80, 0x17, 0x80, + 0x10, 0x80, 0x09, 0x00, 0x02, 0x80, 0xFD, 0x00, 0xF9, 0x80, 0xF7, 0x00, + 0xF7, 0x80, 0xF9, 0x80, 0xFC, 0x80, 0x01, 0x80, 0x07, 0x80, 0x0F, 0x80, + 0x16, 0x80, 0x1F, 0x00, 0x27, 0x00, 0x2D, 0x80, 0x33, 0x00, 0x38, 0x00, + 0x3B, 0x80, 0x3C, 0x00, 0x3C, 0x00, 0x39, 0x80, 0x35, 0x80, 0x30, 0x80, + 0x2B, 0x00, 0x23, 0x80, 0x1D, 0x80, 0x16, 0x80, 0x10, 0x80, 0x0B, 0x80, + 0x07, 0x00, 0x03, 0x80, 0x02, 0x00, 0x01, 0x80, 0x02, 0x80, 0x04, 0x80, + 0x07, 0x00, 0x0B, 0x00, 0x0E, 0x80, 0x12, 0x00, 0x15, 0x00, 0x18, 0x00, + 0x19, 0x00, 0x19, 0x80, 0x18, 0x80, 0x17, 0x00, 0x14, 0x00, 0x0F, 0x80, + 0x0A, 0x80, 0x05, 0x00, 0x01, 0x00, 0x0A, 0x80, 0x13, 0x00, 0x19, 0x80, + 0x20, 0x00, 0x25, 0x80, 0x28, 0x80, 0x2C, 0x00, 0x2C, 0x80, 0x2C, 0x00, + 0x2B, 0x00, 0x28, 0x80, 0x25, 0x80, 0x23, 0x00, 0x20, 0x00, 0x1D, 0x80, + 0x1B, 0x80, 0x18, 0x80, 0x18, 0x80, 0x19, 0x80, 0x19, 0x80, 0x1B, 0x80, + 0x1E, 0x00, 0x21, 0x00, 0x23, 0x80, 0x27, 0x00, 0x29, 0x80, 0x2C, 0x80, + 0x2E, 0x00, 0x2F, 0x80, 0x30, 0x00, 0x30, 0x00, 0x2F, 0x80, 0x2F, 0x80, + 0x2D, 0x80, 0x2C, 0x80, 0x2A, 0x80, 0x28, 0x00, 0x26, 0x00, 0x24, 0x80, + 0x23, 0x80, 0x21, 0x80, 0x20, 0x80, 0x1E, 0x80, 0x1D, 0x80, 0x1C, 0x00, + 0x19, 0x80, 0x18, 0x00, 0x15, 0x80, 0x13, 0x80, 0x10, 0x00, 0x0D, 0x00, + 0x0A, 0x80, 0x07, 0x80, 0x04, 0x80, 0x02, 0x00, 0xFF, 0x00, 0xFD, 0x80, + 0xFC, 0x80, 0xFC, 0x00, 0xFC, 0x80, 0xFC, 0x80, 0xFD, 0x00, 0xFE, 0x00, + 0x01, 0x80, 0x0D, 0x00, 0x17, 0x00, 0x20, 0x00, 0x28, 0x00, 0x2D, 0x80, + 0x31, 0x80, 0x33, 0x00, 0x32, 0x00, 0x2F, 0x80, 0x2D, 0x00, 0x28, 0x00, + 0x23, 0x00, 0x1E, 0x00, 0x19, 0x00, 0x15, 0x80, 0x13, 0x80, 0x10, 0x80, + 0x12, 0x00, 0x12, 0x00, 0x14, 0x80, 0x18, 0x80, 0x1B, 0x80, 0x1F, 0x80, + 0x22, 0x00, 0x25, 0x00, 0x26, 0x80, 0x26, 0x00, 0x25, 0x80, 0x23, 0x00, + 0x20, 0x00, 0x1C, 0x00, 0x16, 0x00, 0x11, 0x00, 0x0C, 0x00, 0x07, 0x80, + 0x03, 0x80, 0x00, 0x80, 0xFE, 0x00, 0xFD, 0x00, 0xFD, 0x80, 0xFE, 0x00, + 0xFF, 0x00, 0x00, 0x80, 0x01, 0x80, 0x02, 0x80, 0x03, 0x00, 0x03, 0x00, + 0x01, 0x00, 0xFF, 0x00, 0xFC, 0x00, 0xF7, 0x80, 0xF3, 0x00, 0xEE, 0x80, + 0xEB, 0x00, 0xE7, 0x00, 0xE4, 0x00, 0xE3, 0x00, 0xE3, 0x00, 0xE5, 0x80, + 0xE9, 0x00, 0xEE, 0x00, 0xF3, 0x80, 0xF9, 0x80, 0x01, 0x80, 0x13, 0x00, + 0x22, 0x80, 0x2F, 0x00, 0x37, 0x00, 0x3D, 0x00, 0x3C, 0x00, 0x38, 0x80, + 0x31, 0x00, 0x27, 0x00, 0x1C, 0x80, 0x11, 0x00, 0x08, 0x00, 0x00, 0x00, + 0xFB, 0x00, 0xFA, 0x00, 0xFA, 0x00, 0xFF, 0x00, 0x05, 0x00, 0x0C, 0x80, + 0x13, 0x80, 0x1A, 0x00, 0x20, 0x00, 0x23, 0x00, 0x24, 0x00, 0x22, 0x80, + 0x1F, 0x00, 0x1A, 0x00, 0x13, 0x80, 0x0D, 0x80, 0x07, 0x00, 0x02, 0x00, + 0xFD, 0x80, 0xFA, 0x80, 0xF8, 0x00, 0xF8, 0x00, 0xF7, 0x80, 0xF7, 0x80, + 0xF7, 0x80, 0xF5, 0x00, 0xF3, 0x00, 0xEF, 0x80, 0xEB, 0x00, 0xE5, 0x00, + 0xDF, 0x00, 0xD9, 0x80, 0xD2, 0x80, 0xCF, 0x80, 0xCD, 0x00, 0xCE, 0x80, + 0xD1, 0x00, 0xD5, 0x80, 0xDE, 0x00, 0xE6, 0x80, 0xF0, 0x00, 0xF8, 0x80, + 0x02, 0x80, 0x0A, 0x00, 0x0F, 0x00, 0x12, 0x00, 0x12, 0x00, 0x10, 0x00, + 0x0C, 0x00, 0x07, 0x00, 0x01, 0x80, 0x12, 0x00, 0x22, 0x00, 0x2C, 0x80, + 0x32, 0x00, 0x34, 0x80, 0x30, 0x00, 0x29, 0x80, 0x1D, 0x80, 0x12, 0x80, + 0x07, 0x80, 0xFE, 0x00, 0xF8, 0x80, 0xF6, 0x80, 0xF9, 0x00, 0xFF, 0x80, + 0x08, 0x80, 0x12, 0x80, 0x1D, 0x00, 0x25, 0x80, 0x2B, 0x00, 0x2D, 0x00, + 0x2B, 0x80, 0x27, 0x00, 0x1F, 0x00, 0x15, 0x80, 0x0B, 0x00, 0x02, 0x00, + 0xFA, 0x80, 0xF6, 0x00, 0xF3, 0x00, 0xF2, 0x00, 0xF4, 0x00, 0xF7, 0x00, + 0xFA, 0x00, 0xFC, 0x00, 0xFC, 0x80, 0xFB, 0x80, 0xF7, 0x80, 0xF3, 0x80, + 0xEE, 0x00, 0xEA, 0x00, 0xE4, 0x80, 0xE1, 0x80, 0xE0, 0x80, 0xE2, 0x80, + 0xE6, 0x00, 0xEB, 0x00, 0xF0, 0x80, 0xF7, 0x00, 0xFB, 0x80, 0xFF, 0x00, + 0x00, 0x00, 0xFD, 0x80, 0xF9, 0x00, 0xF4, 0x00, 0xED, 0x80, 0xE8, 0x00, + 0xE3, 0x80, 0xE2, 0x00, 0xE3, 0x00, 0xE8, 0x00, 0xEF, 0x00, 0xF7, 0x00, + 0x01, 0x00, 0x11, 0x80, 0x1F, 0x80, 0x2A, 0x00, 0x30, 0x80, 0x33, 0x00, + 0x30, 0x80, 0x2B, 0x80, 0x23, 0x80, 0x1B, 0x00, 0x12, 0x80, 0x0D, 0x00, + 0x08, 0x80, 0x07, 0x80, 0x08, 0x00, 0x0B, 0x80, 0x0F, 0x80, 0x11, 0x80, + 0x13, 0x00, 0x14, 0x00, 0x13, 0x00, 0x10, 0x00, 0x0B, 0x80, 0x07, 0x00, + 0x02, 0x00, 0xFD, 0x00, 0xFA, 0x00, 0xF7, 0x80, 0xF6, 0x00, 0xF4, 0x80, + 0xF3, 0x80, 0xF1, 0x80, 0xEE, 0x80, 0xEB, 0x00, 0xE6, 0x00, 0xE2, 0x80, + 0xDE, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDD, 0x00, 0xE2, 0x00, 0xEA, 0x80, + 0xF3, 0x00, 0xFD, 0x80, 0x07, 0x80, 0x0F, 0x80, 0x16, 0x80, 0x19, 0x00, + 0x1A, 0x00, 0x19, 0x80, 0x15, 0x00, 0x11, 0x00, 0x0D, 0x00, 0x08, 0x80, + 0x05, 0x80, 0x03, 0x80, 0x03, 0x80, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, + 0x06, 0x00, 0x05, 0x80, 0x04, 0x80, 0x02, 0x80, 0x02, 0x00, 0x18, 0x00, + 0x2A, 0x80, 0x37, 0x80, 0x3D, 0x00, 0x3D, 0x00, 0x36, 0x00, 0x2D, 0x00, + 0x22, 0x00, 0x19, 0x00, 0x16, 0x00, 0x16, 0x00, 0x1A, 0x80, 0x22, 0x80, + 0x2A, 0x80, 0x30, 0x80, 0x34, 0x80, 0x33, 0x80, 0x2E, 0x80, 0x26, 0x00, + 0x1B, 0x00, 0x10, 0x00, 0x05, 0x00, 0xFD, 0x00, 0xF7, 0x80, 0xF2, 0x80, + 0xF1, 0x00, 0xEF, 0x00, 0xEC, 0x00, 0xE8, 0x80, 0xE3, 0x00, 0xDC, 0x80, + 0xD5, 0x80, 0xD1, 0x00, 0xCE, 0x80, 0xD0, 0x80, 0xD5, 0x00, 0xDB, 0x80, + 0xE4, 0x80, 0xED, 0x80, 0xF6, 0x80, 0xFB, 0x00, 0xFF, 0x80, 0x00, 0x80, + 0x00, 0x00, 0xFD, 0x80, 0xFB, 0x80, 0xFA, 0x80, 0xFC, 0x00, 0x01, 0x00, + 0x06, 0x80, 0x0E, 0x00, 0x14, 0x80, 0x1B, 0x00, 0x1E, 0x80, 0x20, 0x80, + 0x20, 0x80, 0x1B, 0x80, 0x18, 0x00, 0x11, 0x00, 0x0C, 0x00, 0x07, 0x80, + 0x04, 0x00, 0x02, 0x80, 0x01, 0x80, 0x19, 0x80, 0x2C, 0x00, 0x36, 0x80, + 0x38, 0x80, 0x31, 0x00, 0x26, 0x00, 0x19, 0x80, 0x10, 0x80, 0x0E, 0x00, + 0x11, 0x00, 0x1A, 0x00, 0x27, 0x80, 0x33, 0x00, 0x3B, 0x00, 0x3D, 0x80, + 0x38, 0x80, 0x2F, 0x00, 0x23, 0x00, 0x16, 0x00, 0x0E, 0x00, 0x08, 0x00, + 0x06, 0x80, 0x08, 0x00, 0x0B, 0x00, 0x0B, 0x00, 0x08, 0x00, 0x03, 0x00, + 0xFA, 0x00, 0xF1, 0x00, 0xE9, 0x80, 0xE4, 0x80, 0xE4, 0x80, 0xE8, 0x80, + 0xEF, 0x00, 0xF5, 0x80, 0xFB, 0x80, 0xFD, 0x80, 0xFA, 0x80, 0xF4, 0x80, + 0xED, 0x00, 0xE5, 0x80, 0xDF, 0x80, 0xDD, 0x00, 0xDE, 0x00, 0xE5, 0x00, + 0xEB, 0x80, 0xF3, 0x80, 0xF9, 0x80, 0xFE, 0x00, 0xFF, 0x00, 0xFB, 0x80, + 0xF9, 0x00, 0xF1, 0x80, 0xEF, 0x80, 0xEC, 0x80, 0xED, 0x80, 0xF0, 0x00, + 0xF3, 0x80, 0xF9, 0x00, 0xFE, 0x00, 0x00, 0x80, 0x03, 0x00, 0x02, 0x00, + 0x01, 0x80, 0x14, 0x80, 0x25, 0x00, 0x2D, 0x00, 0x2D, 0x00, 0x25, 0x80, + 0x1B, 0x00, 0x11, 0x00, 0x0C, 0x80, 0x0B, 0x00, 0x0F, 0x00, 0x16, 0x00, + 0x1D, 0x80, 0x22, 0x00, 0x22, 0x80, 0x1E, 0x00, 0x15, 0x80, 0x0D, 0x00, + 0x05, 0x80, 0x00, 0x00, 0xFE, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0x00, 0x80, + 0xFC, 0x80, 0xF7, 0x80, 0xF0, 0x80, 0xEA, 0x80, 0xE7, 0x00, 0xE7, 0x80, + 0xEC, 0x80, 0xF4, 0x80, 0xFE, 0x00, 0x06, 0x00, 0x0B, 0x80, 0x0D, 0x00, + 0x0B, 0x00, 0x05, 0x80, 0x01, 0x80, 0xFD, 0x00, 0xFB, 0x00, 0xFC, 0x80, + 0xFE, 0x00, 0x01, 0x80, 0x03, 0x00, 0x03, 0x80, 0x01, 0x80, 0xFC, 0x80, + 0xF7, 0x00, 0xF3, 0x00, 0xF0, 0x80, 0xEF, 0x80, 0xF0, 0x00, 0xF1, 0x80, + 0xF3, 0x80, 0xF3, 0x80, 0xF3, 0x00, 0xF1, 0x00, 0xEE, 0x80, 0xEC, 0x00, + 0xEB, 0x80, 0xEC, 0x80, 0xF1, 0x80, 0xF8, 0x00, 0x01, 0x80, 0x1C, 0x00, + 0x2D, 0x80, 0x34, 0x00, 0x2E, 0x80, 0x21, 0x00, 0x12, 0x80, 0x0A, 0x00, + 0x0A, 0x80, 0x10, 0x00, 0x1A, 0x80, 0x21, 0x00, 0x23, 0x00, 0x1C, 0x00, + 0x11, 0x00, 0x06, 0x00, 0xFB, 0x00, 0xF6, 0x00, 0xF4, 0x80, 0xF2, 0x00, + 0xF0, 0x80, 0xED, 0x00, 0xE7, 0x80, 0xE4, 0x80, 0xE4, 0x00, 0xE9, 0x80, + 0xF3, 0x80, 0x00, 0x00, 0x0A, 0x80, 0x11, 0x80, 0x12, 0x80, 0x0F, 0x00, + 0x08, 0x00, 0x02, 0x80, 0x00, 0x00, 0x03, 0x80, 0x08, 0x80, 0x10, 0x00, + 0x17, 0x00, 0x17, 0x80, 0x16, 0x00, 0x10, 0x00, 0x08, 0x80, 0x02, 0x00, + 0xFE, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0xFD, 0x80, 0xFE, 0x80, 0xFD, 0x80, + 0xFE, 0x80, 0xFD, 0x00, 0xFE, 0x80, 0x03, 0x00, 0x07, 0x80, 0x0D, 0x80, + 0x0F, 0x80, 0x0F, 0x00, 0x0A, 0x80, 0x03, 0x00, 0xFB, 0x80, 0xF7, 0x00, + 0xF6, 0x80, 0xFA, 0x00, 0x01, 0x00, 0x1E, 0x80, 0x30, 0x80, 0x35, 0x00, + 0x2E, 0x00, 0x21, 0x80, 0x16, 0x80, 0x13, 0x80, 0x18, 0x80, 0x24, 0x80, + 0x2B, 0x80, 0x2E, 0x00, 0x28, 0x80, 0x1C, 0x80, 0x12, 0x00, 0x08, 0x80, + 0x03, 0x00, 0xFE, 0x80, 0xF8, 0x00, 0xF1, 0x00, 0xE9, 0x80, 0xE5, 0x80, + 0xE6, 0x00, 0xED, 0x00, 0xF7, 0x00, 0x00, 0x80, 0x06, 0x00, 0x06, 0x00, + 0x00, 0x80, 0xFA, 0x80, 0xF8, 0x80, 0xFA, 0x80, 0xFF, 0x00, 0x06, 0x80, + 0x0B, 0x80, 0x0F, 0x00, 0x0D, 0x80, 0x09, 0x80, 0x07, 0x00, 0x03, 0x80, + 0x00, 0x80, 0xFD, 0x80, 0xFB, 0x00, 0xF7, 0x80, 0xF6, 0x80, 0xF6, 0x80, + 0xFC, 0x80, 0x03, 0x80, 0x0B, 0x80, 0x12, 0x80, 0x16, 0x00, 0x15, 0x80, + 0x13, 0x80, 0x11, 0x00, 0x10, 0x00, 0x10, 0x80, 0x15, 0x00, 0x17, 0x80, + 0x1B, 0x00, 0x1C, 0x00, 0x18, 0x80, 0x13, 0x80, 0x0E, 0x00, 0x07, 0x00, + 0x01, 0x80, 0x28, 0x00, 0x3D, 0x00, 0x3D, 0x80, 0x2E, 0x80, 0x1C, 0x00, + 0x14, 0x80, 0x1B, 0x00, 0x29, 0x00, 0x31, 0x80, 0x31, 0x80, 0x25, 0x80, + 0x15, 0x80, 0x08, 0x00, 0x01, 0x00, 0xFF, 0x80, 0xFA, 0x80, 0xF2, 0x80, + 0xE9, 0x80, 0xE1, 0x80, 0xE3, 0x80, 0xEF, 0x00, 0xFF, 0x00, 0x0D, 0x00, + 0x12, 0x00, 0x0F, 0x00, 0x07, 0x00, 0x00, 0x80, 0x00, 0x00, 0x06, 0x80, + 0x0C, 0x00, 0x10, 0x00, 0x0E, 0x80, 0x0B, 0x00, 0x04, 0x00, 0x00, 0x00, + 0xFC, 0x80, 0xF9, 0x00, 0xF6, 0x00, 0xF1, 0x80, 0xF0, 0x80, 0xF0, 0x80, + 0xF7, 0x80, 0x01, 0x00, 0x0C, 0x00, 0x13, 0x00, 0x16, 0x80, 0x15, 0x80, + 0x13, 0x80, 0x0E, 0x80, 0x0F, 0x00, 0x0F, 0x00, 0x13, 0x00, 0x17, 0x00, + 0x18, 0x80, 0x17, 0x80, 0x14, 0x80, 0x10, 0x00, 0x09, 0x00, 0x04, 0x00, + 0xFE, 0x00, 0xFC, 0x00, 0xFC, 0x80, 0xFD, 0x80, 0x00, 0x80, 0x2A, 0x00, + 0x3C, 0x80, 0x31, 0x00, 0x18, 0x00, 0x08, 0x80, 0x0A, 0x00, 0x19, 0x80, + 0x26, 0x00, 0x25, 0x00, 0x18, 0x80, 0x04, 0x00, 0xFA, 0x80, 0xF6, 0x80, + 0xF4, 0x80, 0xEE, 0x80, 0xE1, 0x80, 0xD8, 0x80, 0xDA, 0x00, 0xE8, 0x80, + 0xF9, 0x80, 0x05, 0x80, 0x05, 0x80, 0x01, 0x80, 0xFC, 0x80, 0xFE, 0x00, + 0x06, 0x00, 0x10, 0x00, 0x12, 0x00, 0x11, 0x00, 0x0C, 0x00, 0x06, 0x80, + 0x03, 0x00, 0x02, 0x80, 0xFD, 0x80, 0xF8, 0x80, 0xF3, 0x00, 0xF0, 0x00, + 0xF2, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x07, 0x00, 0x07, 0x00, 0x06, 0x80, + 0x03, 0x80, 0x04, 0x80, 0x06, 0x00, 0x09, 0x80, 0x0B, 0x80, 0x0B, 0x80, + 0x0A, 0x00, 0x05, 0x80, 0x02, 0x80, 0x00, 0x80, 0xFC, 0x00, 0xF6, 0x80, + 0xF2, 0x00, 0xF0, 0x00, 0xEF, 0x00, 0xF2, 0x80, 0xF7, 0x80, 0xFB, 0x80, + 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x2A, 0x00, 0x36, 0x80, 0x26, 0x00, + 0x11, 0x80, 0x0F, 0x00, 0x1E, 0x00, 0x2E, 0x00, 0x2A, 0x00, 0x18, 0x80, + 0x05, 0x80, 0xFF, 0x80, 0xFE, 0x80, 0xF8, 0x00, 0xEA, 0x00, 0xDE, 0x80, + 0xE0, 0x80, 0xF0, 0x80, 0xFF, 0x00, 0x01, 0x00, 0xF9, 0x00, 0xF2, 0x00, + 0xF4, 0x80, 0xFF, 0x80, 0x08, 0x80, 0x08, 0x00, 0x01, 0x80, 0xFB, 0x80, + 0xF9, 0x80, 0xFC, 0x00, 0xFA, 0x80, 0xF4, 0x00, 0xF1, 0x00, 0xF3, 0x80, + 0xFD, 0x00, 0x07, 0x80, 0x0E, 0x80, 0x0D, 0x00, 0x0A, 0x80, 0x0A, 0x00, + 0x0E, 0x80, 0x14, 0x00, 0x15, 0x80, 0x13, 0x80, 0x0C, 0x80, 0x07, 0x80, + 0x03, 0x80, 0x00, 0x80, 0xFB, 0x80, 0xF3, 0x00, 0xEE, 0x80, 0xEF, 0x00, + 0xF3, 0x80, 0xF8, 0x80, 0xF9, 0x80, 0xF5, 0x00, 0xF1, 0x80, 0xF3, 0x00, + 0xF7, 0x80, 0xFF, 0x00, 0x01, 0x80, 0x02, 0x00, 0x00, 0x00, 0xFF, 0x00, + 0x01, 0x00, 0x31, 0x00, 0x3A, 0x80, 0x23, 0x00, 0x0E, 0x00, 0x13, 0x80, + 0x27, 0x80, 0x2F, 0x80, 0x1D, 0x00, 0x07, 0x80, 0xFB, 0x00, 0xFB, 0x80, + 0xF5, 0x00, 0xE5, 0x00, 0xDA, 0x00, 0xE3, 0x00, 0xF8, 0x00, 0x05, 0x80, + 0x04, 0x80, 0xFB, 0x00, 0xFA, 0x00, 0x03, 0x00, 0x0E, 0x00, 0x0C, 0x00, + 0x02, 0x00, 0xFA, 0x80, 0xFA, 0x80, 0xFA, 0x80, 0xF4, 0x80, 0xED, 0x00, + 0xEA, 0x00, 0xF0, 0x80, 0xFD, 0x80, 0x08, 0x80, 0x0A, 0x00, 0x09, 0x00, + 0x09, 0x80, 0x0E, 0x80, 0x12, 0x80, 0x12, 0x80, 0x0E, 0x80, 0x0A, 0x00, + 0x08, 0x00, 0x08, 0x00, 0xFF, 0x80, 0xF8, 0x80, 0xF3, 0x80, 0xF4, 0x00, + 0xFB, 0x80, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0xF9, 0x80, 0xFC, 0x00, + 0xFE, 0x00, 0xFE, 0x00, 0xFC, 0x80, 0xFB, 0x00, 0xFB, 0x00, 0xFC, 0x80, + 0xFB, 0x00, 0xF9, 0x00, 0xF7, 0x80, 0xFA, 0x00, 0x00, 0x00, 0x2E, 0x00, + 0x2E, 0x00, 0x13, 0x80, 0x0E, 0x00, 0x1E, 0x00, 0x26, 0x80, 0x14, 0x80, + 0x01, 0x80, 0xFB, 0x00, 0xF6, 0x80, 0xEA, 0x00, 0xE1, 0x00, 0xF1, 0x80, + 0x06, 0x80, 0x0C, 0x80, 0x00, 0x00, 0xFB, 0x80, 0x05, 0x00, 0x0D, 0x80, + 0x09, 0x80, 0x00, 0x00, 0xFA, 0x80, 0xFA, 0x00, 0xF6, 0x00, 0xF3, 0x80, + 0xF8, 0x80, 0x06, 0x00, 0x0F, 0x80, 0x0B, 0x80, 0x06, 0x80, 0x07, 0x80, + 0x0E, 0x00, 0x0F, 0x80, 0x09, 0x80, 0x02, 0x80, 0x00, 0x00, 0xFE, 0x00, + 0xF9, 0x00, 0xF5, 0x00, 0xF9, 0x00, 0xFD, 0x00, 0xFD, 0x80, 0xF6, 0x80, + 0xF4, 0x00, 0xF7, 0x80, 0xFB, 0x80, 0xFA, 0x00, 0xF9, 0x80, 0xF9, 0x80, + 0xFB, 0x80, 0xFC, 0x80, 0xFE, 0x80, 0x00, 0x80, 0x05, 0x80, 0x07, 0x80, + 0x04, 0x00, 0x03, 0x80, 0x03, 0x00, 0x04, 0x00, 0x03, 0x80, 0x01, 0x00, + 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x80, 0x2E, 0x80, 0x15, 0x80, + 0x15, 0x00, 0x25, 0x00, 0x23, 0x00, 0x09, 0x80, 0xF9, 0x80, 0xF4, 0x00, + 0xEB, 0x00, 0xE4, 0x00, 0xF1, 0x80, 0x07, 0x00, 0x09, 0x00, 0xFE, 0x80, + 0xFE, 0x00, 0x0E, 0x00, 0x0F, 0x80, 0x03, 0x00, 0xFA, 0x80, 0xFB, 0x80, + 0xF8, 0x80, 0xF5, 0x80, 0xFF, 0x00, 0x0F, 0x80, 0x12, 0x00, 0x09, 0x80, + 0x06, 0x00, 0x10, 0x00, 0x11, 0x00, 0x07, 0x80, 0xFD, 0x80, 0xFB, 0x80, + 0xF8, 0x00, 0xF3, 0x80, 0xF4, 0x80, 0xFC, 0x00, 0xFD, 0x80, 0xF7, 0x00, + 0xF3, 0x80, 0xFB, 0x80, 0x01, 0x80, 0xFF, 0x00, 0xFC, 0x00, 0xFD, 0x80, + 0xFF, 0x80, 0x01, 0x00, 0x01, 0x00, 0x04, 0x80, 0x06, 0x80, 0x01, 0x00, + 0xFB, 0x80, 0xFC, 0x00, 0xFD, 0x80, 0xFC, 0x00, 0xF8, 0x00, 0xF9, 0x80, + 0xF9, 0x80, 0xFB, 0x80, 0xFD, 0x00, 0xFE, 0x00, 0xFF, 0x80, 0x01, 0x00, + 0x00, 0x00, 0x28, 0x00, 0x2C, 0x00, 0x1C, 0x80, 0x19, 0x80, 0x21, 0x80, + 0x1B, 0x80, 0x01, 0x80, 0xEB, 0x00, 0xE6, 0x80, 0xEE, 0x80, 0xF9, 0x00, + 0xFF, 0x00, 0x04, 0x80, 0x07, 0x80, 0x08, 0x00, 0x0A, 0x80, 0x09, 0x80, + 0x00, 0x00, 0xF3, 0x00, 0xF2, 0x80, 0xFC, 0x00, 0x06, 0x80, 0x0C, 0x00, + 0x0C, 0x80, 0x10, 0x80, 0x11, 0x80, 0x10, 0x80, 0x0C, 0x80, 0x04, 0x80, + 0xF9, 0x00, 0xF4, 0x80, 0xF6, 0x00, 0xFA, 0x80, 0xFA, 0x80, 0xF9, 0x80, + 0xF7, 0x00, 0xFC, 0x80, 0xFF, 0x80, 0xFE, 0x00, 0xFB, 0x00, 0xF9, 0x00, + 0xFB, 0x80, 0x00, 0x00, 0x04, 0x80, 0x04, 0x80, 0x01, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x02, 0x80, 0xFE, 0x00, 0xF8, 0x80, 0xF8, 0x00, 0xFA, 0x80, + 0xFE, 0x00, 0xFF, 0x80, 0xFD, 0x80, 0xFB, 0x80, 0xFA, 0x00, 0xFB, 0x80, + 0xFB, 0x80, 0xFA, 0x80, 0xF9, 0x80, 0xFA, 0x80, 0x00, 0x00, 0x2A, 0x00, + 0x2D, 0x00, 0x1D, 0x00, 0x19, 0x80, 0x1F, 0x00, 0x0E, 0x80, 0xEC, 0x80, + 0xDB, 0x00, 0xE6, 0x00, 0xF9, 0x00, 0xFE, 0x00, 0xFC, 0x00, 0x01, 0x80, + 0x0A, 0x00, 0x09, 0x00, 0xFE, 0x00, 0xF3, 0x80, 0xF1, 0x80, 0xF8, 0x80, + 0x04, 0x80, 0x0B, 0x80, 0x0C, 0x80, 0x0D, 0x00, 0x10, 0x00, 0x0F, 0x80, + 0x06, 0x80, 0xF7, 0x00, 0xF1, 0x80, 0xF6, 0x80, 0xFA, 0x00, 0xF7, 0x00, + 0xF6, 0x00, 0xFB, 0x80, 0x02, 0x00, 0x03, 0x80, 0x00, 0x80, 0xFF, 0x00, + 0x01, 0x00, 0x05, 0x00, 0x08, 0x80, 0x07, 0x80, 0x05, 0x00, 0x04, 0x00, + 0x05, 0x80, 0x04, 0x00, 0xFD, 0x80, 0xF8, 0x00, 0xF8, 0x00, 0xFB, 0x80, + 0xFC, 0x80, 0xFA, 0x00, 0xFB, 0x80, 0xFF, 0x00, 0x02, 0x00, 0x00, 0x80, + 0x00, 0x80, 0x03, 0x00, 0x06, 0x00, 0x07, 0x80, 0x07, 0x00, 0x07, 0x00, + 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x32, 0x00, 0x28, 0x80, + 0x20, 0x80, 0x13, 0x80, 0xF6, 0x80, 0xDD, 0x80, 0xE3, 0x00, 0xFB, 0x00, + 0x05, 0x00, 0x02, 0x80, 0x08, 0x80, 0x0F, 0x80, 0x05, 0x00, 0xF1, 0x80, + 0xF1, 0x00, 0x04, 0x80, 0x0F, 0x80, 0x0D, 0x00, 0x0E, 0x00, 0x14, 0x00, + 0x0F, 0x00, 0xFB, 0x00, 0xED, 0x00, 0xF1, 0x00, 0xF6, 0x80, 0xF3, 0x00, + 0xF2, 0x80, 0xFD, 0x00, 0x04, 0x00, 0xFE, 0x80, 0xF8, 0x80, 0xFD, 0x80, + 0x05, 0x00, 0x03, 0x80, 0x01, 0x00, 0x03, 0x80, 0x04, 0x80, 0x00, 0x00, + 0xF9, 0x00, 0xF7, 0x00, 0xFA, 0x80, 0xFC, 0x00, 0xFC, 0x80, 0xFE, 0x00, + 0x01, 0x80, 0x03, 0x80, 0x03, 0x00, 0x03, 0x00, 0x06, 0x00, 0x09, 0x00, + 0x0B, 0x00, 0x0A, 0x80, 0x09, 0x00, 0x05, 0x00, 0x02, 0x80, 0xFF, 0x80, + 0xFC, 0x80, 0xFB, 0x80, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x28, 0x00, 0x37, 0x00, 0x2F, 0x80, 0x1E, 0x00, 0x03, 0x80, + 0xEA, 0x00, 0xDF, 0x00, 0xEB, 0x00, 0xFE, 0x80, 0x08, 0x00, 0x07, 0x80, + 0x06, 0x00, 0xFE, 0x80, 0xF3, 0x80, 0xF3, 0x80, 0x00, 0x00, 0x11, 0x00, + 0x16, 0x00, 0x13, 0x00, 0x10, 0x00, 0x08, 0x80, 0xF9, 0x80, 0xEF, 0x80, + 0xF1, 0x00, 0xF7, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xFE, 0x00, 0x00, 0x80, + 0xFE, 0x00, 0xFC, 0x00, 0x02, 0x80, 0x08, 0x80, 0x06, 0x00, 0x01, 0x00, + 0x02, 0x00, 0x01, 0x00, 0xFB, 0x00, 0xF5, 0x80, 0xF9, 0x00, 0xFE, 0x00, + 0xFC, 0x00, 0xFA, 0x80, 0xFE, 0x80, 0x04, 0x00, 0x02, 0x80, 0x03, 0x00, + 0x07, 0x00, 0x0B, 0x80, 0x06, 0x00, 0x01, 0x00, 0x01, 0x00, 0x03, 0x00, + 0x00, 0x80, 0xFC, 0x80, 0x00, 0x80, 0x04, 0x80, 0x01, 0x80, 0xFE, 0x80, + 0x03, 0x80, 0x06, 0x00, 0x02, 0x80, 0xFE, 0x80, 0x00, 0x00, 0x28, 0x80, + 0x37, 0x00, 0x28, 0x80, 0x07, 0x00, 0xEB, 0x80, 0xE5, 0x00, 0xF1, 0x80, + 0x04, 0x00, 0x0E, 0x80, 0x09, 0x00, 0xFD, 0x80, 0xF7, 0x00, 0xFC, 0x80, + 0x08, 0x80, 0x15, 0x00, 0x16, 0x00, 0x0B, 0x00, 0xFD, 0x00, 0xF4, 0x80, + 0xF2, 0x80, 0xF6, 0x00, 0xF9, 0x80, 0xFB, 0x80, 0xFC, 0x00, 0xFD, 0x80, + 0x02, 0x00, 0x06, 0x80, 0x06, 0x80, 0x03, 0x00, 0xFE, 0x00, 0xF8, 0x80, + 0xF7, 0x80, 0xF9, 0x00, 0xFA, 0x80, 0xFC, 0x00, 0xFF, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x05, 0x80, 0x08, 0x00, 0x07, 0x80, 0x05, 0x80, 0x00, 0x80, + 0xFE, 0x80, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, + 0x00, 0x80, 0x02, 0x80, 0x04, 0x80, 0x05, 0x80, 0x02, 0x80, 0xFE, 0x00, + 0xFC, 0x00, 0xFC, 0x00, 0xFF, 0x80, 0x02, 0x00, 0x01, 0x80, 0xFF, 0x80, + 0xFD, 0x80, 0xFD, 0x80, 0x00, 0x00, 0x2F, 0x00, 0x3A, 0x80, 0x22, 0x00, + 0xF9, 0x00, 0xE1, 0x80, 0xE8, 0x80, 0xFE, 0x80, 0x0D, 0x00, 0x09, 0x80, + 0xFA, 0x00, 0xF2, 0x00, 0xFC, 0x80, 0x0D, 0x80, 0x17, 0x80, 0x13, 0x00, + 0x04, 0x00, 0xF6, 0x00, 0xF1, 0x00, 0xF4, 0x80, 0xF8, 0x80, 0xFC, 0x00, + 0xFD, 0x00, 0xFE, 0x00, 0x02, 0x80, 0x08, 0x00, 0x07, 0x00, 0x02, 0x00, + 0xFC, 0x80, 0xF9, 0x80, 0xF9, 0x80, 0xFC, 0x00, 0xFC, 0x80, 0xFE, 0x80, + 0xFF, 0x80, 0x03, 0x80, 0x07, 0x00, 0x0A, 0x80, 0x07, 0x00, 0x02, 0x00, + 0xFF, 0x80, 0xFF, 0x00, 0x01, 0x00, 0x01, 0x80, 0x01, 0x00, 0x01, 0x80, + 0x01, 0x80, 0x02, 0x80, 0x04, 0x80, 0x03, 0x00, 0xFF, 0x00, 0xFC, 0x00, + 0xFB, 0x00, 0xFD, 0x80, 0xFF, 0x80, 0xFF, 0x00, 0xFD, 0x80, 0xFD, 0x80, + 0xFD, 0x80, 0xFF, 0x80, 0x00, 0x00, 0xFE, 0x80, 0xFB, 0x80, 0xFD, 0x00, + 0x00, 0x00, 0x37, 0x80, 0x3E, 0x00, 0x15, 0x00, 0xEA, 0x80, 0xDF, 0x80, + 0xF6, 0x80, 0x0E, 0x00, 0x0E, 0x00, 0xFD, 0x00, 0xF4, 0x80, 0x00, 0x80, + 0x14, 0x80, 0x1B, 0x80, 0x0D, 0x00, 0xF7, 0x00, 0xED, 0x00, 0xF0, 0x80, + 0xF9, 0x80, 0xFD, 0x00, 0xFD, 0x00, 0xFE, 0x80, 0x03, 0x80, 0x07, 0x00, + 0x03, 0x80, 0xFC, 0x00, 0xF7, 0x00, 0xF6, 0x00, 0xFB, 0x80, 0xFE, 0x80, + 0xFE, 0x80, 0x01, 0x00, 0x04, 0x00, 0x09, 0x00, 0x0B, 0x80, 0x05, 0x80, + 0x01, 0x00, 0xFC, 0x00, 0xFF, 0x00, 0x02, 0x80, 0x03, 0x80, 0x03, 0x00, + 0x02, 0x80, 0x04, 0x00, 0x05, 0x00, 0x02, 0x80, 0xFF, 0x00, 0xFD, 0x00, + 0xFD, 0x00, 0xFF, 0x80, 0xFF, 0x00, 0xFD, 0x80, 0xFE, 0x00, 0xFE, 0x80, + 0x01, 0x80, 0x02, 0x80, 0xFF, 0x80, 0xFD, 0x80, 0xFD, 0x80, 0xFE, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x27, 0x80, + 0x25, 0x80, 0x02, 0x00, 0xE9, 0x00, 0xF0, 0x80, 0x05, 0x00, 0x09, 0x00, + 0xFC, 0x00, 0xF7, 0x00, 0x03, 0x80, 0x11, 0x00, 0x10, 0x80, 0x02, 0x80, + 0xF6, 0x00, 0xF5, 0x00, 0xFA, 0x00, 0xFD, 0x00, 0xFE, 0x00, 0x01, 0x00, + 0x04, 0x80, 0x05, 0x80, 0x00, 0x80, 0xFB, 0x80, 0xFA, 0x80, 0xFC, 0x80, + 0xFE, 0x80, 0x00, 0x00, 0x02, 0x80, 0x05, 0x00, 0x08, 0x00, 0x04, 0x00, + 0x00, 0x80, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x80, 0x01, 0x00, 0xFF, 0x80, 0xFE, 0x00, 0xFE, 0x00, + 0xFF, 0x80, 0xFE, 0x00, 0xFC, 0x00, 0xFD, 0x80, 0xFF, 0x00, 0x00, 0x80, + 0xFF, 0x80, 0xFF, 0x80, 0x00, 0x80, 0x03, 0x00, 0x02, 0x00, 0x01, 0x80, + 0xFF, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x80, + 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, 0x27, 0x80, 0x25, 0x80, 0x02, 0x00, + 0xE9, 0x00, 0xF0, 0x80, 0x05, 0x00, 0x09, 0x00, 0xFC, 0x00, 0xF7, 0x00, + 0x03, 0x80, 0x11, 0x00, 0x10, 0x80, 0x02, 0x80, 0xF6, 0x00, 0xF5, 0x00, + 0xFA, 0x00, 0xFD, 0x00, 0xFE, 0x00, 0x01, 0x00, 0x04, 0x80, 0x05, 0x80, + 0x00, 0x80, 0xFB, 0x80, 0xFA, 0x80, 0xFC, 0x80, 0xFE, 0x80, 0x00, 0x00, + 0x02, 0x80, 0x05, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x80, 0xFF, 0x00, + 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, + 0x01, 0x00, 0xFF, 0x80, 0xFE, 0x00, 0xFE, 0x00, 0xFF, 0x80, 0xFE, 0x00, + 0xFC, 0x00, 0xFD, 0x80, 0xFF, 0x00, 0x00, 0x80, 0xFF, 0x80, 0xFF, 0x80, + 0x00, 0x80, 0x03, 0x00, 0x02, 0x00, 0x01, 0x80, 0xFF, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x80, 0x02, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x27, 0x80, 0x25, 0x80, 0x02, 0x00, 0xE9, 0x00, 0xF0, 0x80, + 0x05, 0x00, 0x09, 0x00, 0xFC, 0x00, 0xF7, 0x00, 0x03, 0x80, 0x11, 0x00, + 0x10, 0x80, 0x02, 0x80, 0xF6, 0x00, 0xF5, 0x00, 0xFA, 0x00, 0xFD, 0x00, + 0xFE, 0x00, 0x01, 0x00, 0x04, 0x80, 0x05, 0x80, 0x00, 0x80, 0xFB, 0x80, + 0xFA, 0x80, 0xFC, 0x80, 0xFE, 0x80, 0x00, 0x00, 0x02, 0x80, 0x05, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x80, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x01, 0x00, 0xFF, 0x80, + 0xFE, 0x00, 0xFE, 0x00, 0xFF, 0x80, 0xFE, 0x00, 0xFC, 0x00, 0xFD, 0x80, + 0xFF, 0x00, 0x00, 0x80, 0xFF, 0x80, 0xFF, 0x80, 0x00, 0x80, 0x03, 0x00, + 0x02, 0x00, 0x01, 0x80, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x01, 0x80, 0x02, 0x00, 0x03, 0x00, 0xCD, 0x00, 0xC8, 0x00, + 0xC8, 0x00, 0x27, 0x00, 0xC1, 0x00, 0xC0, 0x00, 0x0B, 0x00, 0xC4, 0x00, + 0x07, 0x00, 0xC1, 0x80, 0x3F, 0x80, 0xF7, 0x80, 0x02, 0x00, 0xD8, 0x00, + 0xCF, 0x80, 0xD3, 0x00, 0x3D, 0x00, 0xF7, 0x80, 0x02, 0x00, 0x0B, 0x80, + 0xC4, 0x00, 0x1E, 0x80, 0x20, 0x80, 0xE1, 0x00, 0xFF, 0x80, 0x18, 0x00, + 0xD5, 0x80, 0xFF, 0x80, 0x18, 0x00, 0xD5, 0x00, 0x03, 0x00, 0xC2, 0x00, + 0x1B, 0x80, 0x18, 0x00, 0xD5, 0x80, 0x06, 0x80, 0xE5, 0x80, 0x03, 0x00, + 0x2F, 0x80, 0x1B, 0x80, 0x18, 0x00, 0xF8, 0x80, 0x03, 0x00, 0x3F, 0x80, + 0x1B, 0x80, 0xC1, 0x00, 0xD4, 0x80, 0x03, 0x00, 0xF1, 0x80, 0x0B, 0x80, + 0xCA, 0x00, 0x03, 0x00, 0xCF, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0B, 0x80, + 0xE1, 0x00, 0x1B, 0x00, 0x18, 0x00, 0xF8, 0x00, 0x02, 0x80, 0xC2, 0x00, + 0xD3, 0x80, 0xC3, 0x00, 0xFF, 0x80, 0xDE, 0x00, 0xC6, 0x00, 0xFE, 0x00, + 0xC1, 0x00, 0xF5, 0x80, 0x1E, 0x80, 0x2B, 0x80, 0xC1, 0x80, 0x1E, 0x80, + 0x27, 0x80, 0xC0, 0x00, 0x1E, 0x80, 0x22, 0x00, 0xC0, 0x00, 0x1E, 0x80, + 0x30, 0x80, 0xCA, 0x80, 0x1E, 0x80, 0x17, 0x00, 0xC0, 0x00, 0x0B, 0x00, + 0xE1, 0x80, 0x02, 0x80, 0x00, 0x00, 0xD3, 0x80, 0xC5, 0x00, 0x0B, 0x00, + 0xD7, 0x00, 0xDA, 0x00, 0xC1, 0x00, 0x06, 0x80, 0xE1, 0x80, 0xDA, 0x80, + 0xC1, 0x00, 0x0B, 0x80, 0xD7, 0x00, 0x1E, 0x80, 0x36, 0x00, 0xC0, 0x00, + 0x1E, 0x80, 0x28, 0x00, 0xC0, 0x00, 0x1E, 0x80, 0x29, 0x00, 0xC0, 0x00, + 0xD0, 0x00, 0x2B, 0x00, 0xCD, 0x00, 0xC8, 0x00, 0x1F, 0x00, 0x37, 0x80, + 0x3C, 0x00, 0x1F, 0x80, 0x1F, 0x80, 0x0B, 0x00, 0x03, 0x00, 0x00, 0x80, + 0x1B, 0x80, 0x18, 0x00, 0xE8, 0x80, 0x23, 0x00, 0x28, 0x00, 0x3B, 0x80, + 0x18, 0x00, 0xE8, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1B, 0x80, 0x18, 0x00, + 0xE8, 0x80, 0x23, 0x00, 0x09, 0x00, 0x3B, 0x80, 0x18, 0x00, 0xE8, 0x00, + 0x03, 0x00, 0x10, 0x00, 0x1B, 0x80, 0x18, 0x00, 0xFF, 0x00, 0x03, 0x00, + 0xF8, 0x80, 0x1B, 0x80, 0x18, 0x00, 0xF9, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x1B, 0x80, 0x18, 0x00, 0xF8, 0x00, 0x03, 0x00, 0xC0, 0x00, 0x1B, 0x80, + 0x18, 0x00, 0xD2, 0x80, 0x06, 0x80, 0xC1, 0x00, 0xD0, 0x00, 0xD6, 0x80, + 0xE7, 0x80, 0x07, 0x00, 0xC0, 0x00, 0x30, 0x00, 0x06, 0x80, 0xCD, 0x80, + 0x07, 0x00, 0xC0, 0x00, 0x04, 0x00, 0x06, 0x80, 0xCB, 0x00, 0x07, 0x00, + 0xC0, 0x00, 0x3C, 0x00, 0x06, 0x80, 0xC8, 0x80, 0x03, 0x00, 0xE0, 0x00, + 0x07, 0x00, 0xC0, 0x00, 0x0C, 0x00, 0x06, 0x80, 0xC5, 0x00, 0x07, 0x00, + 0xC0, 0x00, 0x34, 0x00, 0x06, 0x80, 0xC2, 0x80, 0x01, 0x00, 0x0A, 0x00, + 0x12, 0x00, 0x19, 0x00, 0x20, 0x00, 0x26, 0x80, 0x2B, 0x80, 0x2F, 0x80, + 0xD7, 0x80, 0x3F, 0x80, 0x36, 0x00, 0x36, 0x00, 0x36, 0x80, 0x35, 0x80, + 0x33, 0x80, 0x32, 0x00, 0x2F, 0x80, 0x2C, 0x80, 0x29, 0x00, 0x26, 0x80, + 0x23, 0x80, 0x21, 0x80, 0x1E, 0x80, 0x1D, 0x00, 0x1B, 0x00, 0x1A, 0x00, + 0x19, 0x00, 0x18, 0x80, 0x18, 0x00, 0x17, 0x00, 0x17, 0x80, 0x17, 0x00, + 0x16, 0x00, 0x15, 0x80, 0x14, 0x00, 0x13, 0x80, 0x11, 0x00, 0x10, 0x00, + 0x0E, 0x00, 0x0A, 0x80, 0x09, 0x00, 0x05, 0x80, 0x03, 0x80, 0x00, 0x00, + 0xFD, 0x00, 0xFA, 0x00, 0xF7, 0x80, 0xF4, 0x80, 0xF2, 0x80, 0xF1, 0x00, + 0xF0, 0x00, 0xEF, 0x00, 0xEE, 0x80, 0xEE, 0x80, 0xEF, 0x00, 0xEF, 0x80, + 0xF0, 0x00, 0xF1, 0x80, 0xF3, 0x00, 0xF5, 0x00, 0xF6, 0x00, 0xF9, 0x00, + 0xFB, 0x00, 0xFE, 0x00, 0x01, 0x00, 0x06, 0x00, 0x0B, 0x80, 0x10, 0x00, + 0x14, 0x80, 0x18, 0x00, 0x1C, 0x80, 0x20, 0x80, 0x23, 0x80, 0x27, 0x80, + 0x2A, 0x00, 0x2D, 0x00, 0x2F, 0x80, 0x30, 0x80, 0x32, 0x80, 0x34, 0x00, + 0x35, 0x00, 0x35, 0x80, 0x36, 0x00, 0x36, 0x00, 0x34, 0x80, 0x34, 0x80, + 0x33, 0x00, 0x32, 0x00, 0x30, 0x80, 0x2F, 0x80, 0x2D, 0x00, 0x2B, 0x00, + 0x29, 0x00, 0x27, 0x00, 0x24, 0x80, 0x21, 0x80, 0x1F, 0x80, 0x1D, 0x00, + 0x1A, 0x80, 0x18, 0x80, 0x16, 0x00, 0x13, 0x80, 0x12, 0x00, 0x10, 0x00, + 0x0E, 0x00, 0x0C, 0x00, 0x0B, 0x00, 0x09, 0x00, 0x08, 0x00, 0x07, 0x00, + 0x05, 0x80, 0x04, 0x80, 0x04, 0x00, 0x02, 0x80, 0x02, 0x00, 0x01, 0x80, + 0x01, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, + 0xFF, 0x80, 0x00, 0x00, 0xFF, 0x80, 0xFF, 0x80, 0xFF, 0x00, 0xFF, 0x80, + 0x12, 0x80, 0x2B, 0x00, 0x2B, 0x80, 0x1F, 0x00, 0x1B, 0x80, 0x24, 0x80, + 0x29, 0x00, 0x17, 0x80, 0xF4, 0x00, 0xD5, 0x80, 0xCE, 0x80, 0xDB, 0x00, + 0xE6, 0x00, 0xE2, 0x80, 0xDB, 0x80, 0xE5, 0x80, 0x04, 0x80, 0x27, 0x80, + 0x36, 0x00, 0x2C, 0x00, 0x1C, 0x00, 0x18, 0x00, 0x1E, 0x00, 0x1A, 0x80, + 0x01, 0x80, 0xDE, 0x00, 0xC8, 0x00, 0xCD, 0x00, 0xE0, 0x00, 0xEB, 0x80, + 0xE9, 0x00, 0xE8, 0x00, 0xF9, 0x80, 0x1B, 0x80, 0x37, 0x00, 0x39, 0x00, + 0x26, 0x00, 0x13, 0x80, 0x10, 0x00, 0x13, 0x00, 0x09, 0x00, 0xEC, 0x00, + 0xCC, 0x80, 0xC3, 0x00, 0xD3, 0x00, 0xEA, 0x80, 0xF5, 0x80, 0xF3, 0x80, + 0xF7, 0x80, 0x0E, 0x00, 0x2E, 0x00, 0x3F, 0x00, 0x34, 0x00, 0x19, 0x80, + 0x07, 0x80, 0x05, 0x80, 0x06, 0x00, 0xF7, 0x00, 0xD9, 0x00, 0xC2, 0x80, + 0xC6, 0x80, 0xE0, 0x00, 0xF9, 0x00, 0x00, 0x80, 0x08, 0x00, 0x32, 0x00, + 0x26, 0x00, 0x1E, 0x80, 0x1F, 0x00, 0x1C, 0x00, 0x32, 0x00, 0x0D, 0x00, + 0xFD, 0x00, 0xD1, 0x80, 0xD0, 0x80, 0xDF, 0x80, 0xDF, 0x00, 0xED, 0x00, + 0xD2, 0x80, 0xEE, 0x80, 0xFF, 0x80, 0x28, 0x00, 0x38, 0x00, 0x24, 0x00, + 0x24, 0x80, 0x0D, 0x00, 0x26, 0x00, 0x14, 0x00, 0x03, 0x00, 0xE1, 0x80, + 0xC3, 0x00, 0xD7, 0x80, 0xD7, 0x00, 0xF5, 0x00, 0xE3, 0x80, 0xEA, 0x80, + 0xFC, 0x00, 0x14, 0x80, 0x3F, 0x00, 0x2D, 0x80, 0x2E, 0x00, 0x0C, 0x80, + 0x12, 0x80, 0x14, 0x80, 0x03, 0x00, 0xF5, 0x00, 0xC3, 0x80, 0xCD, 0x80, + 0xCD, 0x00, 0xEE, 0x80, 0xF7, 0x00, 0xEE, 0x00, 0x00, 0x00, 0x03, 0x80, + 0x36, 0x80, 0x36, 0x00, 0x36, 0x80, 0x1A, 0x00, 0x02, 0x80, 0x0D, 0x80, + 0xFC, 0x00, 0x00, 0x80, 0xD2, 0x80, 0xC8, 0x00, 0xC8, 0x00, 0xDC, 0x80, + 0x00, 0x80, 0xF7, 0x00, 0x0B, 0x80, 0x3A, 0x00, 0x2C, 0x80, 0x1D, 0x80, + 0x10, 0x80, 0xFF, 0x00, 0x09, 0x00, 0xE1, 0x80, 0xD9, 0x00, 0xC1, 0x00, + 0xDB, 0x80, 0x07, 0x80, 0x1E, 0x80, 0x37, 0x00, 0x17, 0x80, 0x1D, 0x80, + 0x0C, 0x80, 0x0E, 0x00, 0xFB, 0x80, 0xD1, 0x00, 0xCD, 0x00, 0xC4, 0x00, + 0xFC, 0x00, 0x11, 0x00, 0x27, 0x00, 0x23, 0x00, 0x13, 0x00, 0x24, 0x80, + 0x10, 0x00, 0x10, 0x00, 0xDD, 0x80, 0xC8, 0x80, 0xC8, 0x80, 0xDD, 0x80, + 0x10, 0x00, 0x10, 0x00, 0x24, 0x80, 0x13, 0x00, 0x23, 0x00, 0x27, 0x00, + 0x11, 0x00, 0xFC, 0x00, 0xC4, 0x00, 0xCD, 0x00, 0xD1, 0x00, 0xFB, 0x80, + 0x0E, 0x00, 0x0C, 0x80, 0x1D, 0x80, 0x17, 0x80, 0x37, 0x00, 0x1E, 0x80, + 0x07, 0x80, 0xDB, 0x80, 0xC1, 0x00, 0xD9, 0x00, 0xE1, 0x80, 0x09, 0x00, + 0xFF, 0x00, 0x10, 0x80, 0x1D, 0x80, 0x2C, 0x80, 0x3A, 0x00, 0x0B, 0x80, + 0x0B, 0x00, 0x35, 0x80, 0x28, 0x80, 0x17, 0x80, 0x07, 0x80, 0xF4, 0x80, + 0xFD, 0x80, 0xDE, 0x00, 0xDF, 0x00, 0xD3, 0x00, 0xF2, 0x80, 0x1C, 0x80, + 0x2C, 0x80, 0x37, 0x80, 0x0B, 0x80, 0x03, 0x80, 0xEC, 0x80, 0xEF, 0x00, + 0xE9, 0x80, 0xD6, 0x80, 0xE7, 0x80, 0xEF, 0x00, 0x25, 0x00, 0x30, 0x80, + 0x30, 0x80, 0x13, 0x80, 0xEE, 0x80, 0xF0, 0x00, 0xDF, 0x00, 0xF0, 0x00, + 0xDE, 0x00, 0xE9, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x3F, 0x00, 0x25, 0x00, + 0x15, 0x00, 0xE6, 0x80, 0xE1, 0x80, 0xE5, 0x00, 0xE4, 0x80, 0xF3, 0x00, + 0xE7, 0x00, 0x0C, 0x80, 0x1C, 0x80, 0x38, 0x80, 0x2C, 0x80, 0x03, 0x00, + 0xEC, 0x80, 0xCE, 0x80, 0xE8, 0x80, 0xE6, 0x80, 0xF7, 0x00, 0xFA, 0x80, + 0x05, 0x00, 0x2A, 0x80, 0x2A, 0x00, 0x2F, 0x80, 0xFC, 0x00, 0xE2, 0x00, + 0xD1, 0x80, 0xD9, 0x80, 0xF8, 0x80, 0xF4, 0x80, 0xF1, 0x80, 0x13, 0x00, + 0x33, 0x00, 0x28, 0x80, 0xFE, 0x00, 0xF1, 0x00, 0x08, 0x00, 0xD8, 0x00, + 0xCE, 0x00, 0xE9, 0x80, 0x13, 0x80, 0x0B, 0x80, 0x04, 0x00, 0x36, 0x00, + 0x25, 0x80, 0x01, 0x00, 0xE2, 0x80, 0xF9, 0x00, 0xEC, 0x00, 0xC7, 0x00, + 0xEF, 0x80, 0x11, 0x80, 0x20, 0x00, 0x05, 0x80, 0x23, 0x80, 0x2F, 0x00, + 0xF9, 0x00, 0xE1, 0x80, 0xE3, 0x80, 0xF8, 0x80, 0xD2, 0x80, 0xE6, 0x80, + 0x1D, 0x00, 0x23, 0x80, 0x15, 0x80, 0x0C, 0x80, 0x2D, 0x00, 0xFD, 0x80, + 0xD5, 0x80, 0xDF, 0x00, 0xF1, 0x80, 0xED, 0x80, 0xDE, 0x80, 0x1F, 0x80, + 0x2E, 0x00, 0x19, 0x00, 0x09, 0x00, 0x15, 0x00, 0x0C, 0x00, 0xCB, 0x00, + 0xD9, 0x00, 0xF0, 0x80, 0xFA, 0x80, 0xEE, 0x00, 0x0E, 0x80, 0x3F, 0x00, + 0x18, 0x00, 0x06, 0x80, 0x03, 0x00, 0x08, 0x80, 0xD8, 0x00, 0xC6, 0x00, + 0xF9, 0x80, 0xFF, 0x80, 0xF3, 0x80, 0x1B, 0x00, 0x35, 0x00, 0x19, 0x80, + 0xDD, 0x00, 0xD0, 0x00, 0xFE, 0x80, 0xEA, 0x00, 0xFC, 0x80, 0x22, 0x80, + 0x3C, 0x80, 0x09, 0x00, 0xD4, 0x00, 0xF2, 0x00, 0xE8, 0x80, 0xE8, 0x00, + 0xF9, 0x00, 0x39, 0x00, 0x33, 0x00, 0xF2, 0x00, 0xF1, 0x00, 0xED, 0x00, + 0xE8, 0x00, 0xD3, 0x00, 0x11, 0x00, 0x3F, 0x00, 0x17, 0x80, 0xFF, 0x00, + 0xF3, 0x80, 0xFA, 0x80, 0xC8, 0x00, 0xE0, 0x80, 0x23, 0x00, 0x2D, 0x00, + 0x15, 0x00, 0xFB, 0x80, 0x11, 0x00, 0xDD, 0x80, 0xC6, 0x00, 0xF2, 0x00, + 0x23, 0x00, 0x27, 0x00, 0x02, 0x00, 0x1F, 0x00, 0x02, 0x00, 0xD2, 0x80, + 0xC9, 0x80, 0xFE, 0x00, 0x27, 0x00, 0x06, 0x00, 0x1E, 0x80, 0x1F, 0x00, + 0xFD, 0x80, 0xC4, 0x80, 0xD4, 0x80, 0x11, 0x80, 0x04, 0x80, 0x12, 0x80, + 0x23, 0x00, 0x2A, 0x00, 0xE7, 0x00, 0xC3, 0x00, 0xF3, 0x00, 0xFC, 0x00, + 0xEF, 0x00, 0x11, 0x80, 0x27, 0x00, 0x08, 0x00, 0xD2, 0x80, 0xD9, 0x80, + 0x1E, 0x80, 0x09, 0x80, 0x07, 0x80, 0x0D, 0x80, 0x11, 0x80, 0xE0, 0x00, + 0xCB, 0x00, 0x17, 0x80, 0x23, 0x00, 0x0F, 0x80, 0xF1, 0x80, 0x07, 0x80, + 0xF6, 0x00, 0xD0, 0x80, 0x06, 0x80, 0x2B, 0x00, 0x23, 0x00, 0xE1, 0x80, + 0xEE, 0x00, 0x03, 0x80, 0xE8, 0x80, 0xFD, 0x00, 0x1D, 0x00, 0x33, 0x00, + 0xE5, 0x00, 0xD5, 0x80, 0xFE, 0x00, 0x05, 0x80, 0x03, 0x00, 0x06, 0x00, + 0x2F, 0x80, 0xF6, 0x00, 0xCD, 0x00, 0xEC, 0x00, 0x18, 0x00, 0x1B, 0x00, + 0xF5, 0x80, 0x19, 0x00, 0x01, 0x00, 0xDA, 0x00, 0xDB, 0x80, 0x16, 0x00, + 0x34, 0x00, 0xF7, 0x00, 0xFC, 0x00, 0xFC, 0x80, 0xF3, 0x00, 0xDC, 0x00, + 0x05, 0x80, 0x3E, 0x00, 0x06, 0x80, 0xE8, 0x00, 0xE7, 0x00, 0x06, 0x00, + 0xF1, 0x80, 0xF8, 0x00, 0x32, 0x80, 0x17, 0x80, 0xD5, 0x00, 0xD9, 0x00, + 0xF9, 0x00, 0x05, 0x00, 0xFB, 0x00, 0x10, 0x80, 0x3E, 0x00, 0xF9, 0x00, + 0xD5, 0x00, 0xE0, 0x00, 0x08, 0x80, 0xFF, 0x00, 0xF9, 0x80, 0x36, 0x00, + 0x1B, 0x80, 0xEA, 0x80, 0xCA, 0x80, 0xFC, 0x80, 0x09, 0x00, 0xF0, 0x80, + 0x1E, 0x80, 0x2B, 0x80, 0x0F, 0x00, 0xC8, 0x00, 0xE3, 0x00, 0x0A, 0x00, + 0xF6, 0x80, 0x08, 0x00, 0x21, 0x80, 0x31, 0x00, 0xDF, 0x00, 0xD0, 0x00, + 0xFA, 0x00, 0x01, 0x00, 0x00, 0x00, 0x09, 0x80, 0x3D, 0x80, 0x04, 0x80, + 0xD1, 0x80, 0xE1, 0x00, 0x01, 0x00, 0x06, 0x80, 0xF4, 0x00, 0x31, 0x80, + 0x23, 0x00, 0xEC, 0x00, 0xCE, 0x00, 0xF1, 0x00, 0x10, 0x00, 0xED, 0x80, + 0x19, 0x00, 0x2D, 0x00, 0x12, 0x80, 0xD1, 0x80, 0xD7, 0x80, 0x0D, 0x80, + 0xF6, 0x00, 0x05, 0x00, 0x1E, 0x80, 0x30, 0x80, 0xED, 0x80, 0xC8, 0x00, + 0xFB, 0x80, 0xFF, 0x80, 0xFA, 0x80, 0xEF, 0x80, 0xCB, 0x00, 0x01, 0x00, + 0x25, 0x80, 0x05, 0x80, 0x1F, 0x80, 0x0B, 0x00, 0xE7, 0x00, 0xCE, 0x80, + 0x00, 0x00, 0x08, 0x00, 0x00, 0x80, 0x35, 0x80, 0x0E, 0x80, 0xE9, 0x80, + 0xE0, 0x80, 0xF6, 0x80, 0xEA, 0x80, 0x03, 0x00, 0x3E, 0x00, 0x09, 0x00, + 0xFB, 0x80, 0xF6, 0x00, 0xE5, 0x80, 0xD9, 0x00, 0x06, 0x80, 0x32, 0x80, + 0x02, 0x80, 0x17, 0x80, 0x03, 0x00, 0xD9, 0x00, 0xD8, 0x00, 0x03, 0x00, + 0x17, 0x80, 0x03, 0x80, 0x31, 0x00, 0x06, 0x80, 0xD9, 0x80, 0xE6, 0x80, + 0xF5, 0x80, 0xFB, 0x80, 0x09, 0x80, 0x3D, 0x00, 0x02, 0x00, 0xEB, 0x00, + 0xF6, 0x80, 0xE0, 0x80, 0xE9, 0x00, 0x0E, 0x80, 0x36, 0x00, 0x00, 0x00, + 0x08, 0x80, 0x00, 0x00, 0xCE, 0x80, 0xE5, 0x80, 0x0A, 0x80, 0x1F, 0x80, + 0x05, 0x80, 0x24, 0x80, 0x01, 0x80, 0xCB, 0x80, 0xEF, 0x80, 0xFA, 0x80, + 0xF7, 0x00, 0xEF, 0x00, 0xD5, 0x80, 0xF5, 0x00, 0x2E, 0x00, 0x04, 0x00, + 0x13, 0x80, 0x1E, 0x00, 0xD2, 0x00, 0xE0, 0x00, 0xFD, 0x80, 0xFC, 0x80, + 0x15, 0x80, 0x1D, 0x80, 0x1C, 0x00, 0xE8, 0x80, 0xDA, 0x00, 0x03, 0x00, + 0xE1, 0x80, 0x06, 0x80, 0x3E, 0x00, 0x04, 0x00, 0xFC, 0x80, 0xFC, 0x00, + 0xDB, 0x00, 0xE7, 0x00, 0x01, 0x00, 0x2A, 0x00, 0x13, 0x80, 0x00, 0x00, + 0x15, 0x80, 0xD3, 0x80, 0xD2, 0x80, 0x15, 0x80, 0x00, 0x00, 0x14, 0x80, + 0x28, 0x80, 0x01, 0x00, 0xE7, 0x00, 0xDC, 0x00, 0xFB, 0x80, 0xFC, 0x80, + 0x04, 0x80, 0x3D, 0x00, 0x05, 0x00, 0xE2, 0x00, 0x03, 0x00, 0xDA, 0x00, + 0xE8, 0x00, 0x1C, 0x00, 0x1E, 0x00, 0x15, 0x00, 0xFD, 0x00, 0xFE, 0x00, + 0xE0, 0x00, 0xD0, 0x80, 0x1E, 0x00, 0x14, 0x00, 0x04, 0x00, 0x2D, 0x80, + 0xF5, 0x80, 0xD6, 0x00, 0xEF, 0x00, 0xF6, 0x80, 0x0C, 0x00, 0x24, 0x00, + 0x06, 0x80, 0x0B, 0x80, 0x22, 0x00, 0xD2, 0x80, 0xE3, 0x80, 0x0B, 0x00, + 0xD9, 0x80, 0x04, 0x80, 0x27, 0x80, 0x0E, 0x80, 0x0D, 0x80, 0x03, 0x80, + 0x03, 0x00, 0xD9, 0x80, 0xDD, 0x80, 0x16, 0x00, 0xEA, 0x00, 0x07, 0x80, + 0x3E, 0x00, 0xFD, 0x80, 0xFF, 0x80, 0x08, 0x80, 0xE2, 0x00, 0xE1, 0x80, + 0xEE, 0x00, 0x14, 0x80, 0x05, 0x00, 0x07, 0x80, 0x3A, 0x00, 0xF5, 0x80, + 0xE3, 0x80, 0x0E, 0x80, 0xD5, 0x80, 0xE4, 0x80, 0x10, 0x80, 0x0C, 0x00, + 0x12, 0x80, 0x10, 0x80, 0x1E, 0x00, 0xF3, 0x80, 0xD5, 0x00, 0x0A, 0x00, + 0xE0, 0x80, 0xE3, 0x00, 0x30, 0x80, 0x0C, 0x80, 0x08, 0x80, 0x1D, 0x80, + 0xFD, 0x00, 0xE7, 0x80, 0xDC, 0x80, 0xFF, 0x00, 0xF8, 0x80, 0xEE, 0x00, + 0x39, 0x00, 0x15, 0x00, 0xF1, 0x00, 0x1E, 0x80, 0xEA, 0x80, 0xD5, 0x80, + 0xF8, 0x80, 0xFB, 0x00, 0xF7, 0x00, 0x2C, 0x80, 0x2C, 0x00, 0x04, 0x00, + 0x1A, 0x00, 0xD9, 0x80, 0xD9, 0x00, 0xF0, 0x00, 0xD8, 0x80, 0x1C, 0x00, + 0x1B, 0x00, 0x17, 0x00, 0x34, 0x00, 0xF0, 0x00, 0xF4, 0x80, 0xE7, 0x80, + 0xC6, 0x00, 0x03, 0x80, 0xF9, 0x00, 0x17, 0x80, 0x3A, 0x80, 0x06, 0x00, + 0x19, 0x80, 0xF1, 0x00, 0xCB, 0x80, 0xF3, 0x80, 0xD6, 0x00, 0x07, 0x80, + 0x27, 0x00, 0x0E, 0x00, 0x36, 0x80, 0x03, 0x80, 0xE9, 0x00, 0xF5, 0x80, + 0xC2, 0x80, 0xF5, 0x80, 0x01, 0x80, 0x03, 0x00, 0x3E, 0x00, 0x11, 0x80, + 0x10, 0x80, 0x07, 0x00, 0xCA, 0x00, 0xEE, 0x00, 0xDD, 0x00, 0xEE, 0x00, + 0x2B, 0x80, 0x0D, 0x00, 0x2E, 0x00, 0x1B, 0x80, 0xE5, 0x80, 0xFB, 0x00, + 0xCC, 0x00, 0xDE, 0x80, 0x09, 0x00, 0xF7, 0x00, 0x34, 0x00, 0x23, 0x80, + 0x07, 0x00, 0x15, 0x80, 0xD2, 0x00, 0xE1, 0x80, 0xEB, 0x80, 0xDC, 0x80, + 0xED, 0x80, 0x04, 0x00, 0x14, 0x00, 0x14, 0x00, 0x27, 0x00, 0xE9, 0x80, + 0xD2, 0x80, 0xE2, 0x00, 0xEB, 0x00, 0x29, 0x00, 0x20, 0x80, 0x04, 0x80, + 0x08, 0x80, 0xEB, 0x00, 0x07, 0x00, 0x08, 0x00, 0xE1, 0x00, 0xEF, 0x80, + 0xE6, 0x00, 0x0F, 0x80, 0x3B, 0x80, 0x16, 0x00, 0x09, 0x80, 0xDE, 0x80, + 0xD1, 0x00, 0x03, 0x80, 0xFD, 0x80, 0x0D, 0x80, 0x08, 0x00, 0xF2, 0x00, + 0x1F, 0x80, 0x16, 0x80, 0x05, 0x80, 0xF6, 0x80, 0xC2, 0x00, 0xE8, 0x80, + 0x09, 0x80, 0x1A, 0x00, 0x33, 0x00, 0xFD, 0x80, 0xF3, 0x00, 0xFE, 0x80, + 0xF0, 0x00, 0x0A, 0x80, 0xEA, 0x80, 0xDF, 0x00, 0x08, 0x00, 0x0D, 0x80, + 0x34, 0x80, 0x20, 0x80, 0xE4, 0x80, 0xE4, 0x80, 0xD5, 0x00, 0xFA, 0x80, + 0x1D, 0x00, 0xFE, 0x80, 0x0D, 0x00, 0x01, 0x00, 0x06, 0x00, 0x24, 0x00, + 0xF4, 0x80, 0xE5, 0x80, 0xDB, 0x00, 0xDC, 0x80, 0xDB, 0x80, 0xE3, 0x80, + 0xE5, 0x00, 0xE0, 0x00, 0x0E, 0x00, 0xE1, 0x80, 0xE4, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x3E, 0x00, 0x27, 0x80, 0x05, 0x80, 0x13, 0x00, 0xED, 0x00, + 0x10, 0x00, 0x0F, 0x00, 0xD9, 0x80, 0xE6, 0x80, 0xC6, 0x80, 0xE7, 0x80, + 0x1A, 0x80, 0xFE, 0x00, 0x16, 0x80, 0x03, 0x80, 0x00, 0x80, 0x3B, 0x80, + 0x1A, 0x80, 0x18, 0x00, 0xFC, 0x80, 0xCA, 0x80, 0xF9, 0x80, 0xEE, 0x00, + 0xED, 0x00, 0xF9, 0x80, 0xCA, 0x80, 0xFD, 0x80, 0x16, 0x80, 0x1A, 0x80, + 0x3B, 0x80, 0x01, 0x80, 0x03, 0x00, 0x16, 0x80, 0xFE, 0x00, 0x1A, 0x00, + 0xE5, 0x80, 0xC7, 0x00, 0xE7, 0x00, 0xD9, 0x00, 0x0E, 0x00, 0x10, 0x80, + 0xED, 0x80, 0x12, 0x00, 0x06, 0x00, 0x28, 0x00, 0x3D, 0x80, 0xFE, 0x80, + 0x02, 0x80, 0xE4, 0x80, 0xE1, 0x80, 0x0D, 0x00, 0xE1, 0x00, 0xE6, 0x00, + 0xE3, 0x80, 0xDB, 0x00, 0xF5, 0x80, 0x14, 0x00, 0x01, 0x00, 0xD2, 0x80, + 0xE3, 0x80, 0xCA, 0x80, 0xF2, 0x00, 0x24, 0x00, 0x18, 0x00, 0x33, 0x80, + 0x0D, 0x00, 0xF3, 0x00, 0x0E, 0x80, 0xF8, 0x00, 0x19, 0x00, 0x14, 0x80, + 0xE2, 0x00, 0xE9, 0x00, 0xC2, 0x00, 0xD9, 0x00, 0x0D, 0x80, 0x08, 0x80, + 0x30, 0x00, 0x18, 0x00, 0xF7, 0x80, 0x11, 0x00, 0xFA, 0x00, 0x1C, 0x00, + 0x24, 0x80, 0xF5, 0x00, 0xF8, 0x00, 0xC7, 0x80, 0xC6, 0x80, 0xF8, 0x00, + 0xF5, 0x00, 0x25, 0x80, 0x1A, 0x80, 0xFA, 0x00, 0x11, 0x80, 0xF8, 0x80, + 0x17, 0x00, 0x30, 0x80, 0x09, 0x00, 0x0D, 0x00, 0xD7, 0x80, 0xC2, 0x80, + 0xE9, 0x00, 0xE1, 0x80, 0x13, 0x80, 0x19, 0x00, 0xF8, 0x80, 0x0E, 0x00, + 0xF3, 0x80, 0x0D, 0x80, 0x33, 0x80, 0x16, 0x80, 0x23, 0x80, 0xF2, 0x00, + 0xCA, 0x80, 0xE3, 0x00, 0xD3, 0x00, 0x02, 0x00, 0x13, 0x80, 0xF5, 0x00, + 0xF8, 0x80, 0xF8, 0x00, 0x05, 0x80, 0xFC, 0x80, 0xD7, 0x80, 0xC9, 0x00, + 0xF2, 0x00, 0x25, 0x80, 0x2C, 0x00, 0x0C, 0x80, 0xFE, 0x80, 0x0A, 0x80, + 0x0F, 0x00, 0xFF, 0x80, 0xFB, 0x00, 0x0C, 0x00, 0x0A, 0x00, 0xE3, 0x80, + 0xC2, 0x00, 0xD9, 0x80, 0x0F, 0x00, 0x25, 0x00, 0x10, 0x80, 0x00, 0x00, + 0x09, 0x80, 0x13, 0x00, 0x06, 0x80, 0xFF, 0x80, 0x0F, 0x80, 0x18, 0x80, + 0xF7, 0x00, 0xC8, 0x00, 0xC7, 0x80, 0xF7, 0x00, 0x18, 0x80, 0x10, 0x80, + 0xFE, 0x80, 0x06, 0x80, 0x13, 0x80, 0x0A, 0x80, 0x00, 0x00, 0x11, 0x00, + 0x25, 0x80, 0x0E, 0x80, 0xD8, 0x80, 0xC2, 0x80, 0xE3, 0x80, 0x0A, 0x00, + 0x0B, 0x00, 0xFB, 0x80, 0x00, 0x00, 0x0E, 0x80, 0x0B, 0x00, 0xFE, 0x80, + 0x0C, 0x80, 0x2A, 0x80, 0x25, 0x80, 0xF2, 0x80, 0xC9, 0x80, 0xD7, 0x00, + 0xFD, 0x00, 0x06, 0x00, 0xF7, 0x80, 0xF8, 0x00, 0x14, 0x00, 0x2C, 0x80, + 0x35, 0x00, 0x31, 0x80, 0x1B, 0x00, 0x05, 0x80, 0x02, 0x00, 0x0E, 0x80, + 0x2C, 0x80, 0x3F, 0x80, 0x3E, 0x00, 0x39, 0x80, 0x2C, 0x00, 0x0C, 0x00, + 0xF4, 0x80, 0xF2, 0x00, 0x04, 0x80, 0x17, 0x80, 0x12, 0x80, 0x0B, 0x80, + 0x0D, 0x80, 0x03, 0x00, 0xEB, 0x00, 0xE0, 0x80, 0xED, 0x80, 0x03, 0x00, + 0x02, 0x00, 0xF6, 0x80, 0xFA, 0x80, 0x06, 0x80, 0x00, 0x80, 0xF2, 0x80, + 0xF4, 0x80, 0x05, 0x00, 0x06, 0x00, 0xF3, 0x00, 0xEB, 0x00, 0xF9, 0x00, + 0x09, 0x80, 0x05, 0x80, 0xFF, 0x80, 0x06, 0x00, 0x06, 0x80, 0xEF, 0x00, + 0xDA, 0x80, 0xDD, 0x00, 0xF3, 0x00, 0x05, 0x00, 0x04, 0x80, 0x04, 0x80, + 0x04, 0x80, 0xEE, 0x00, 0xD2, 0x00, 0xCA, 0x80, 0xD8, 0x00, 0xF6, 0x00, + 0x0A, 0x00, 0x0F, 0x00, 0x0F, 0x80, 0xFF, 0x80, 0xE2, 0x00, 0xD6, 0x00, + 0xDA, 0x80, 0xEF, 0x00, 0x0E, 0x00, 0x22, 0x00, 0x29, 0x00, 0x25, 0x80, + 0x16, 0x80, 0x08, 0x80, 0x07, 0x00, 0x13, 0x80, 0x2A, 0x80, 0x3C, 0x00, + 0x3F, 0x80, 0x3E, 0x00, 0x34, 0x00, 0x20, 0x00, 0x11, 0x00, 0x11, 0x00, + 0x1E, 0x80, 0x2C, 0x00, 0x2B, 0x80, 0x27, 0x80, 0x25, 0x00, 0x1B, 0x00, + 0x0A, 0x00, 0x01, 0x80, 0x08, 0x80, 0x14, 0x00, 0x13, 0x00, 0x0B, 0x00, + 0x0B, 0x00, 0x0F, 0x00, 0x0A, 0x00, 0x01, 0x00, 0x01, 0x00, 0x09, 0x80, + 0x08, 0x80, 0xFC, 0x80, 0xF7, 0x00, 0xFF, 0x00, 0x08, 0x00, 0x07, 0x80, + 0x05, 0x00, 0x08, 0x80, 0x06, 0x00, 0xF7, 0x80, 0xEA, 0x00, 0xEC, 0x00, + 0xFB, 0x00, 0x08, 0x00, 0x0B, 0x80, 0x0C, 0x00, 0x09, 0x00, 0xF9, 0x80, + 0xE6, 0x80, 0xE1, 0x00, 0xEB, 0x00, 0xFF, 0x00, 0x0E, 0x80, 0x14, 0x00, + 0x12, 0x00, 0x03, 0x80, 0xEE, 0x80, 0xE3, 0x80, 0xE6, 0x00, 0xF5, 0x00, + 0x0B, 0x00, 0x1B, 0x80, 0x22, 0x80, 0x1F, 0x80, 0x16, 0x00, 0x0D, 0x00, + 0x0D, 0x00, 0x18, 0x00, 0x2A, 0x80, 0x39, 0x80, 0x3F, 0x80, 0x3F, 0x00, + 0x38, 0x00, 0x2B, 0x80, 0x22, 0x00, 0x23, 0x80, 0x2E, 0x80, 0x39, 0x00, + 0x3B, 0x80, 0x39, 0x80, 0x36, 0x80, 0x2E, 0x80, 0x23, 0x80, 0x1E, 0x00, + 0x22, 0x00, 0x29, 0x00, 0x29, 0x00, 0x24, 0x00, 0x22, 0x80, 0x23, 0x00, + 0x1F, 0x00, 0x19, 0x00, 0x18, 0x80, 0x1C, 0x00, 0x1A, 0x00, 0x12, 0x00, + 0x0D, 0x80, 0x11, 0x00, 0x16, 0x80, 0x17, 0x80, 0x16, 0x00, 0x16, 0x80, + 0x13, 0x00, 0x07, 0x80, 0xFE, 0x80, 0xFF, 0x80, 0x08, 0x80, 0x12, 0x00, + 0x16, 0x00, 0x16, 0x00, 0x11, 0x80, 0x04, 0x80, 0xF7, 0x00, 0xF2, 0x00, + 0xF8, 0x80, 0x06, 0x00, 0x12, 0x00, 0x16, 0x80, 0x13, 0x00, 0x06, 0x80, + 0xF6, 0x80, 0xEC, 0x80, 0xED, 0x80, 0xF8, 0x80, 0x07, 0x80, 0x14, 0x80, + 0x1B, 0x80, 0x1D, 0x00, 0x1A, 0x80, 0x18, 0x80, 0x1B, 0x00, 0x23, 0x80, + 0x2F, 0x00, 0x39, 0x80, 0x3F, 0x80, 0x3F, 0x80, 0x3C, 0x00, 0x35, 0x80, + 0x31, 0x80, 0x32, 0x80, 0x37, 0x80, 0x3D, 0x00, 0x3F, 0x00, 0x3D, 0x80, + 0x3A, 0x00, 0x34, 0x80, 0x2E, 0x80, 0x2B, 0x00, 0x2B, 0x80, 0x2D, 0x80, + 0x2D, 0x00, 0x2B, 0x00, 0x28, 0x80, 0x26, 0x80, 0x23, 0x80, 0x21, 0x00, + 0x20, 0x00, 0x1F, 0x80, 0x1D, 0x80, 0x19, 0x80, 0x17, 0x00, 0x17, 0x00, + 0x18, 0x80, 0x19, 0x80, 0x19, 0x00, 0x18, 0x00, 0x14, 0x00, 0x0E, 0x00, + 0x09, 0x00, 0x08, 0x80, 0x0C, 0x80, 0x11, 0x00, 0x14, 0x00, 0x13, 0x80, + 0x0F, 0x80, 0x07, 0x80, 0x00, 0x00, 0xFD, 0x00, 0x00, 0x00, 0x06, 0x80, + 0x0D, 0x00, 0x0F, 0x80, 0x0D, 0x00, 0x05, 0x00, 0xFC, 0x00, 0xF6, 0x00, + 0xF6, 0x80, 0xFC, 0x00, 0x05, 0x00, 0x0E, 0x00, 0x15, 0x80, 0x1A, 0x80, + 0x1D, 0x80, 0x21, 0x00, 0x25, 0x80, 0x2B, 0x80, 0x32, 0x80, 0x39, 0x00, + 0x3D, 0x00, 0x3E, 0x80, 0x3E, 0x80, 0x3D, 0x00, 0x3C, 0x00, 0x3C, 0x80, + 0x3E, 0x00, 0x3F, 0x80, 0x3F, 0x80, 0x3E, 0x80, 0x3C, 0x00, 0x38, 0x80, + 0x35, 0x80, 0x33, 0x00, 0x32, 0x00, 0x31, 0x00, 0x2F, 0x80, 0x2D, 0x80, + 0x2B, 0x80, 0x29, 0x00, 0x27, 0x00, 0x25, 0x00, 0x23, 0x80, 0x22, 0x00, + 0x20, 0x00, 0x1E, 0x00, 0x1C, 0x00, 0x1B, 0x00, 0x1A, 0x00, 0x1A, 0x00, + 0x19, 0x00, 0x17, 0x80, 0x15, 0x00, 0x12, 0x00, 0x10, 0x00, 0x0E, 0x80, + 0x0F, 0x00, 0x10, 0x00, 0x10, 0x80, 0x0F, 0x80, 0x0D, 0x00, 0x0A, 0x00, + 0x06, 0x80, 0x04, 0x80, 0x05, 0x00, 0x07, 0x00, 0x08, 0x80, 0x09, 0x00, + 0x07, 0x80, 0x04, 0x00, 0x00, 0x00, 0xFE, 0x00, 0xFD, 0x80, 0xFF, 0x00, + 0x06, 0x80, 0x10, 0x00, 0xF2, 0x80, 0xF1, 0x80, 0xF1, 0x80, 0xF5, 0x00, + 0xDF, 0x80, 0xF4, 0x00, 0x0D, 0x80, 0x22, 0x80, 0x0E, 0x80, 0x14, 0x80, + 0x17, 0x80, 0x19, 0x80, 0x00, 0x00, 0x0C, 0x80, 0x1D, 0x80, 0x2A, 0x80, + 0x10, 0x00, 0x11, 0x80, 0x13, 0x00, 0x17, 0x80, 0x02, 0x00, 0x15, 0x80, + 0x2D, 0x00, 0x3F, 0x80, 0x27, 0x80, 0x28, 0x00, 0x25, 0x80, 0x21, 0x80, + 0x00, 0x80, 0x07, 0x00, 0x11, 0x80, 0x18, 0x00, 0xF7, 0x80, 0xF3, 0x00, + 0xF0, 0x80, 0xF1, 0x00, 0xD8, 0x80, 0xEA, 0x80, 0x01, 0x00, 0x14, 0x00, + 0xFE, 0x80, 0x01, 0x80, 0x03, 0x00, 0x03, 0x80, 0xE8, 0x80, 0xF4, 0x80, + 0x04, 0x00, 0x10, 0x80, 0xF6, 0x00, 0xF7, 0x00, 0xF9, 0x00, 0xFD, 0x80, + 0xE8, 0x80, 0xFD, 0x00, 0x15, 0x00, 0x28, 0x80, 0x11, 0x80, 0x14, 0x00, + 0x13, 0x00, 0x10, 0x80, 0xF2, 0x00, 0xFA, 0x00, 0x0B, 0x80, 0x0C, 0x80, + 0xF6, 0x00, 0xEC, 0x00, 0xF5, 0x00, 0xF0, 0x00, 0xE1, 0x80, 0xEF, 0x00, + 0x12, 0x80, 0x20, 0x80, 0x14, 0x00, 0x11, 0x80, 0x1D, 0x80, 0x17, 0x00, + 0x03, 0x80, 0x09, 0x00, 0x24, 0x00, 0x29, 0x80, 0x15, 0x00, 0x0E, 0x00, + 0x18, 0x80, 0x14, 0x80, 0x06, 0x80, 0x12, 0x80, 0x34, 0x80, 0x3F, 0x80, + 0x2E, 0x80, 0x26, 0x80, 0x2C, 0x80, 0x1F, 0x80, 0x05, 0x00, 0x03, 0x00, + 0x17, 0x00, 0x15, 0x00, 0xFB, 0x00, 0xEE, 0x00, 0xF3, 0x80, 0xEB, 0x80, + 0xDA, 0x00, 0xE4, 0x80, 0x05, 0x80, 0x11, 0x00, 0x02, 0x00, 0xFE, 0x00, + 0x07, 0x80, 0x00, 0x00, 0xEB, 0x00, 0xEF, 0x80, 0x09, 0x00, 0x0D, 0x80, + 0xF9, 0x80, 0xF2, 0x00, 0xFD, 0x00, 0xF9, 0x00, 0xEB, 0x80, 0xF8, 0x80, + 0x1B, 0x00, 0x27, 0x00, 0x17, 0x80, 0x11, 0x00, 0x18, 0x80, 0x0D, 0x80, + 0xF5, 0x80, 0xF5, 0x80, 0x02, 0x00, 0x03, 0x80, 0xFF, 0x80, 0xF4, 0x00, + 0xE8, 0x80, 0xE3, 0x00, 0xE8, 0x00, 0xF7, 0x80, 0x0A, 0x80, 0x1A, 0x80, + 0x21, 0x80, 0x1E, 0x80, 0x16, 0x80, 0x0F, 0x80, 0x0F, 0x00, 0x15, 0x00, + 0x1E, 0x00, 0x24, 0x00, 0x23, 0x00, 0x1B, 0x00, 0x11, 0x80, 0x0C, 0x80, + 0x12, 0x00, 0x1F, 0x80, 0x30, 0x80, 0x3D, 0x00, 0x3F, 0x80, 0x36, 0x80, + 0x27, 0x80, 0x19, 0x00, 0x10, 0x80, 0x0E, 0x80, 0x0F, 0x80, 0x0D, 0x80, + 0x04, 0x80, 0xF6, 0x80, 0xE7, 0x00, 0xDE, 0x00, 0xDF, 0x80, 0xEB, 0x80, + 0xFC, 0x00, 0x08, 0x80, 0x0D, 0x00, 0x08, 0x00, 0xFE, 0x00, 0xF5, 0x00, + 0xF3, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x04, 0x80, 0x03, 0x00, 0xFB, 0x00, + 0xF1, 0x80, 0xED, 0x80, 0xF3, 0x80, 0x01, 0x80, 0x13, 0x80, 0x21, 0x80, + 0x25, 0x00, 0x1E, 0x00, 0x11, 0x00, 0x04, 0x80, 0xFE, 0x80, 0xFE, 0x80, + 0xFC, 0x00, 0xF3, 0x80, 0xED, 0x00, 0xE9, 0x80, 0xE9, 0x80, 0xEC, 0x80, + 0xF3, 0x80, 0xFC, 0x00, 0x06, 0x00, 0x10, 0x00, 0x19, 0x00, 0x20, 0x00, + 0x24, 0x80, 0x26, 0x00, 0x25, 0x00, 0x22, 0x80, 0x1F, 0x80, 0x1C, 0x80, + 0x1A, 0x80, 0x1B, 0x00, 0x1D, 0x80, 0x22, 0x80, 0x29, 0x00, 0x30, 0x00, + 0x37, 0x00, 0x3C, 0x80, 0x3F, 0x80, 0x3E, 0x80, 0x3A, 0x00, 0x32, 0x00, + 0x27, 0x00, 0x1A, 0x00, 0x0C, 0x80, 0xFF, 0x80, 0xF4, 0x80, 0xEC, 0x00, + 0xE7, 0x80, 0xE6, 0x00, 0xE8, 0x80, 0xED, 0x00, 0xF3, 0x80, 0xFA, 0x00, + 0xFF, 0x80, 0x03, 0x00, 0x04, 0x80, 0x03, 0x80, 0x00, 0x80, 0xFD, 0x00, + 0xF8, 0x80, 0xF4, 0x80, 0xF2, 0x00, 0xF2, 0x00, 0xF5, 0x00, 0xFA, 0x00, + 0x01, 0x00, 0x09, 0x80, 0x12, 0x00, 0x19, 0x00, 0x1E, 0x00, 0x1F, 0x00, + 0x1D, 0x80, 0x18, 0x00, 0x0F, 0x80, 0x05, 0x00, 0xFF, 0x80, 0xFE, 0x00, + 0xFD, 0x80, 0xFC, 0x80, 0xFC, 0x80, 0xFD, 0x00, 0xFE, 0x80, 0x00, 0x00, + 0x02, 0x80, 0x06, 0x00, 0x0A, 0x00, 0x0E, 0x80, 0x14, 0x00, 0x19, 0x80, + 0x1F, 0x80, 0x25, 0x00, 0x2B, 0x00, 0x30, 0x00, 0x35, 0x00, 0x39, 0x00, + 0x3C, 0x00, 0x3E, 0x00, 0x3F, 0x80, 0x3F, 0x00, 0x3E, 0x00, 0x3B, 0x80, + 0x38, 0x00, 0x33, 0x80, 0x2E, 0x80, 0x28, 0x80, 0x22, 0x00, 0x1A, 0x80, + 0x14, 0x00, 0x0C, 0x80, 0x06, 0x00, 0x00, 0x00, 0xFA, 0x80, 0xF5, 0x00, + 0xF1, 0x00, 0xEE, 0x00, 0xEC, 0x00, 0xEB, 0x00, 0xEB, 0x00, 0xEC, 0x00, + 0xEE, 0x00, 0xF0, 0x80, 0xF4, 0x00, 0xF7, 0x80, 0xFB, 0x80, 0xFF, 0x80, + 0x03, 0x00, 0x06, 0x80, 0x0A, 0x00, 0x0C, 0x80, 0x0F, 0x00, 0x10, 0x00, + 0x11, 0x00, 0x10, 0x80, 0x0F, 0x80, 0x0D, 0x80, 0x0B, 0x80, 0x08, 0x80, + 0x05, 0x00, 0x01, 0x80, 0x06, 0x80, 0x13, 0x80, 0x1F, 0x80, 0x2A, 0x00, + 0x33, 0x00, 0x39, 0x80, 0x3D, 0x00, 0x3F, 0x00, 0x3E, 0x00, 0x3B, 0x00, + 0x36, 0x80, 0x31, 0x00, 0x2A, 0x80, 0x24, 0x00, 0x1E, 0x00, 0x18, 0x00, + 0x13, 0x80, 0x10, 0x00, 0x0E, 0x00, 0x0C, 0x80, 0x0C, 0x00, 0x0C, 0x80, + 0x0D, 0x00, 0x0D, 0x80, 0x0E, 0x00, 0x0E, 0x00, 0x0D, 0x00, 0x0B, 0x00, + 0x09, 0x00, 0x06, 0x00, 0x02, 0x80, 0xFF, 0x80, 0xFC, 0x00, 0xF9, 0x00, + 0xF7, 0x00, 0xF6, 0x00, 0xF6, 0x80, 0xF8, 0x00, 0xFA, 0x80, 0xFE, 0x80, + 0x02, 0x80, 0x08, 0x00, 0x0D, 0x00, 0x12, 0x00, 0x16, 0x00, 0x19, 0x00, + 0x1A, 0x80, 0x1A, 0x80, 0x18, 0x80, 0x15, 0x00, 0x10, 0x00, 0x0A, 0x00, + 0x03, 0x80, 0xFD, 0x80, 0xF7, 0x00, 0xF1, 0x80, 0xED, 0x80, 0xEA, 0x80, + 0xEA, 0x00, 0xEA, 0x80, 0xED, 0x80, 0xF1, 0x80, 0xF7, 0x00, 0xFD, 0x00, + 0x21, 0x80, 0x30, 0x80, 0x2A, 0x80, 0x34, 0x80, 0x1F, 0x00, 0xF5, 0x80, + 0xEE, 0x80, 0x12, 0x80, 0x39, 0x00, 0x0E, 0x00, 0xEA, 0x00, 0xEF, 0x80, + 0x19, 0x00, 0x3C, 0x00, 0x39, 0x80, 0x3E, 0x00, 0x2A, 0x00, 0xE8, 0x80, + 0xE2, 0x00, 0xEE, 0x00, 0xE0, 0x80, 0xEA, 0x00, 0x13, 0x80, 0x1F, 0x00, + 0xFE, 0x80, 0xE0, 0x80, 0x12, 0x00, 0x37, 0x80, 0x36, 0x00, 0x11, 0x00, + 0xE6, 0x00, 0xE1, 0x80, 0xE0, 0x80, 0xFA, 0x80, 0x3B, 0x00, 0x3A, 0x80, + 0x2A, 0x00, 0x3A, 0x80, 0x3E, 0x80, 0x1A, 0x00, 0x0B, 0x80, 0x29, 0x00, + 0x3F, 0x80, 0x08, 0x80, 0xE4, 0x00, 0xE3, 0x80, 0x00, 0x80, 0x31, 0x80, + 0x3E, 0x00, 0x3D, 0x00, 0x1D, 0x80, 0xDF, 0x00, 0xE6, 0x00, 0xFA, 0x80, + 0xE8, 0x00, 0xD6, 0x00, 0xF1, 0x80, 0x00, 0x80, 0xE6, 0x80, 0xD6, 0x00, + 0x10, 0x00, 0x31, 0x00, 0x31, 0x00, 0x1A, 0x00, 0x18, 0x00, 0x2F, 0x80, + 0x31, 0x00, 0x30, 0x80, 0x21, 0x00, 0x0A, 0x80, 0x09, 0x00, 0x22, 0x80, + 0x36, 0x00, 0x1E, 0x00, 0x03, 0x00, 0x04, 0x80, 0x1D, 0x00, 0x34, 0x00, + 0x3A, 0x00, 0x38, 0x00, 0x1E, 0x80, 0xF0, 0x00, 0xDE, 0x80, 0xE1, 0x00, + 0xDF, 0x80, 0xE9, 0x80, 0xFF, 0x00, 0x03, 0x00, 0xEE, 0x80, 0xE2, 0x80, + 0x00, 0x80, 0x1E, 0x80, 0x20, 0x00, 0x09, 0x00, 0xEE, 0x80, 0xE5, 0x00, + 0xE9, 0x00, 0x05, 0x80, 0x33, 0x80, 0x3F, 0x80, 0x3A, 0x80, 0x3E, 0x80, + 0x3C, 0x00, 0x2A, 0x80, 0x25, 0x00, 0x36, 0x00, 0x3B, 0x80, 0x17, 0x80, + 0xF8, 0x80, 0xF5, 0x00, 0x09, 0x00, 0x26, 0x80, 0x33, 0x80, 0x2E, 0x80, + 0x0F, 0x00, 0xE3, 0x80, 0xDC, 0x80, 0xE4, 0x80, 0xDE, 0x80, 0xD8, 0x80, + 0xE3, 0x80, 0xE8, 0x80, 0xDA, 0x80, 0xDA, 0x00, 0x00, 0x80, 0x1F, 0x00, + 0x22, 0x80, 0x0F, 0x80, 0x0F, 0x00, 0x24, 0x80, 0x2B, 0x80, 0x2B, 0x00, + 0x24, 0x80, 0x1F, 0x00, 0x22, 0x80, 0x2F, 0x00, 0x36, 0x00, 0x2C, 0x00, + 0x1D, 0x80, 0x1A, 0x80, 0x22, 0x80, 0x2C, 0x00, 0x2F, 0x80, 0x28, 0x80, + 0x13, 0x80, 0xF7, 0x80, 0xE5, 0x80, 0xE1, 0x00, 0xE2, 0x00, 0xE7, 0x80, + 0xED, 0x80, 0xEC, 0x80, 0xE4, 0x00, 0xE3, 0x00, 0xF2, 0x80, 0x03, 0x80, + 0x09, 0x00, 0x02, 0x00, 0xF8, 0x00, 0xF4, 0x00, 0xFC, 0x00, 0x12, 0x00, + 0x2D, 0x80, 0x3D, 0x00, 0x3F, 0x80, 0x3F, 0x80, 0x3D, 0x00, 0x38, 0x80, + 0x38, 0x80, 0x3E, 0x00, 0x3A, 0x00, 0x26, 0x80, 0x12, 0x00, 0x0B, 0x80, + 0x11, 0x80, 0x1C, 0x80, 0x21, 0x00, 0x18, 0x80, 0x01, 0x80, 0xE7, 0x80, + 0xDB, 0x00, 0xDA, 0x00, 0xD9, 0x00, 0xD8, 0x80, 0xD9, 0x80, 0xD9, 0x00, + 0xD5, 0x80, 0xDC, 0x80, 0xF2, 0x80, 0x06, 0x80, 0x0D, 0x00, 0x06, 0x00, + 0x07, 0x80, 0x14, 0x80, 0x1C, 0x00, 0x1F, 0x00, 0x20, 0x80, 0x22, 0x00, + 0x26, 0x80, 0x2C, 0x80, 0x2F, 0x00, 0x2C, 0x80, 0x28, 0x00, 0x25, 0x80, + 0x26, 0x80, 0x28, 0x00, 0x27, 0x80, 0x22, 0x80, 0x18, 0x00, 0x0B, 0x00, + 0x01, 0x80, 0xFE, 0x00, 0xFD, 0x80, 0xFE, 0x80, 0xFF, 0x00, 0xFE, 0x00, + 0xFC, 0x00, 0xFD, 0x80, 0x04, 0x00, 0x0C, 0x00, 0x11, 0x00, 0x12, 0x00, + 0x11, 0x80, 0x13, 0x00, 0x19, 0x80, 0x25, 0x80, 0x32, 0x80, 0x3B, 0x80, + 0x3F, 0x00, 0x3F, 0x80, 0x3F, 0x00, 0x3E, 0x80, 0x3F, 0x00, 0x3F, 0x00, + 0x3B, 0x00, 0x31, 0x80, 0x27, 0x80, 0x21, 0x00, 0x1F, 0x00, 0x1E, 0x80, + 0x1C, 0x00, 0x14, 0x80, 0x08, 0x00, 0xFB, 0x00, 0xF2, 0x80, 0xEE, 0x00, + 0xEC, 0x80, 0xEB, 0x00, 0xE9, 0x80, 0xE8, 0x00, 0xE7, 0x80, 0xEB, 0x80, + 0xF4, 0x80, 0xFD, 0x80, 0x01, 0x00, 0x01, 0x00, 0x02, 0x80, 0x07, 0x80, + 0x0C, 0x80, 0x11, 0x80, 0x16, 0x00, 0x1A, 0x00, 0x1D, 0x80, 0x20, 0x80, + 0x23, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x27, 0x80, 0x27, 0x00, + 0x27, 0x00, 0x26, 0x00, 0x25, 0x80, 0x24, 0x80, 0x24, 0x00, 0x23, 0x00, + 0x23, 0x00, 0x22, 0x80, 0x23, 0x00, 0x23, 0x80, 0x24, 0x80, 0x26, 0x00, + 0x28, 0x00, 0x2A, 0x00, 0x2C, 0x80, 0x2F, 0x00, 0x31, 0x80, 0x34, 0x00, + 0x37, 0x00, 0x39, 0x80, 0x3B, 0x80, 0x3D, 0x80, 0x3E, 0x80, 0x3F, 0x80, + 0x3F, 0x80, 0x3F, 0x80, 0x3E, 0x80, 0x3C, 0x80, 0x3A, 0x80, 0x37, 0x80, + 0x34, 0x80, 0x30, 0x80, 0x2C, 0x80, 0x28, 0x00, 0x23, 0x80, 0x1F, 0x00, + 0x1A, 0x80, 0x16, 0x00, 0x12, 0x00, 0x0E, 0x80, 0x0B, 0x00, 0x08, 0x00, + 0x05, 0x80, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xFA, 0x80, 0xEE, 0x80, 0xF0, 0x00, + 0x0C, 0x80, 0x24, 0x00, 0x21, 0x00, 0x02, 0x00, 0xF0, 0x00, 0xF7, 0x80, + 0xFF, 0x80, 0xFF, 0x00, 0x01, 0x80, 0x1B, 0x00, 0x26, 0x80, 0x0A, 0x80, + 0xE8, 0x00, 0xE0, 0x80, 0xF1, 0x00, 0xF2, 0x00, 0xE8, 0x00, 0xE4, 0x00, + 0xF9, 0x80, 0x14, 0x80, 0x1B, 0x00, 0x10, 0x80, 0x08, 0x80, 0x03, 0x00, + 0xEB, 0x80, 0xE5, 0x80, 0xFE, 0x80, 0x20, 0x00, 0x31, 0x80, 0x24, 0x80, + 0x01, 0x00, 0xEA, 0x80, 0xE2, 0x80, 0xFA, 0x80, 0x1D, 0x80, 0x2E, 0x80, + 0x22, 0x00, 0x07, 0x80, 0xEE, 0x00, 0xE0, 0x00, 0xE8, 0x80, 0xF9, 0x00, + 0x02, 0x80, 0xF7, 0x80, 0xD9, 0x00, 0xC0, 0x80, 0xC4, 0x00, 0xE5, 0x80, + 0x01, 0x00, 0xFC, 0x80, 0xEB, 0x00, 0xE6, 0x00, 0xF5, 0x80, 0xF8, 0x00, + 0xE2, 0x00, 0xDA, 0x80, 0xEF, 0x80, 0x19, 0x00, 0x2A, 0x80, 0x14, 0x80, + 0x01, 0x00, 0xF7, 0x00, 0xF2, 0x80, 0xF1, 0x80, 0x0D, 0x00, 0x20, 0x00, + 0x1E, 0x80, 0x03, 0x80, 0xF0, 0x80, 0xEF, 0x80, 0xF7, 0x00, 0xF9, 0x00, + 0x03, 0x80, 0x1D, 0x80, 0x29, 0x80, 0x11, 0x80, 0xF2, 0x00, 0xDC, 0x80, + 0xE2, 0x80, 0xE5, 0x80, 0xE7, 0x00, 0xEC, 0x00, 0x01, 0x00, 0x1D, 0x80, + 0x21, 0x80, 0x11, 0x80, 0x00, 0x80, 0xF7, 0x80, 0xE9, 0x80, 0xE8, 0x80, + 0xFE, 0x00, 0x1C, 0x00, 0x30, 0x80, 0x29, 0x00, 0x00, 0x80, 0xE5, 0x00, + 0xDE, 0x00, 0xFB, 0x00, 0x1D, 0x80, 0x2C, 0x00, 0x1A, 0x00, 0x07, 0x00, + 0xF3, 0x80, 0xE6, 0x00, 0xEA, 0x00, 0xF6, 0x00, 0x00, 0x00, 0xF2, 0x80, + 0xD5, 0x80, 0xC0, 0x80, 0xC2, 0x00, 0xE3, 0x80, 0xFC, 0x00, 0xF8, 0x00, + 0xE7, 0x00, 0xE5, 0x00, 0xF3, 0x00, 0xF5, 0x00, 0xE0, 0x80, 0xD6, 0x80, + 0xEB, 0x80, 0x1E, 0x80, 0x33, 0x00, 0x1A, 0x00, 0x07, 0x00, 0xFC, 0x80, + 0x0B, 0x00, 0x06, 0x80, 0x18, 0x00, 0x14, 0x00, 0x0B, 0x80, 0xF9, 0x00, + 0xE2, 0x00, 0xDC, 0x80, 0xE1, 0x80, 0xFE, 0x80, 0x12, 0x80, 0x2D, 0x80, + 0x31, 0x00, 0x16, 0x80, 0xFF, 0x80, 0xDF, 0x80, 0xDF, 0x00, 0xD7, 0x80, + 0xE8, 0x80, 0xF7, 0x00, 0x0A, 0x00, 0x22, 0x00, 0x25, 0x80, 0x22, 0x80, + 0x0A, 0x00, 0xF9, 0x80, 0xDD, 0x80, 0xDE, 0x00, 0xF4, 0x80, 0x10, 0x80, + 0x24, 0x00, 0x27, 0x00, 0x0A, 0x00, 0xF7, 0x80, 0xDF, 0x00, 0xEE, 0x80, + 0x04, 0x00, 0x1B, 0x00, 0x17, 0x80, 0x07, 0x00, 0xF7, 0x00, 0xE9, 0x00, + 0xF4, 0x00, 0xF2, 0x80, 0xEC, 0x00, 0xD2, 0x80, 0xC0, 0x80, 0xC7, 0x00, + 0xDA, 0x80, 0xF4, 0x00, 0xF9, 0x80, 0xEB, 0x00, 0xE2, 0x00, 0xE0, 0x80, + 0xEE, 0x80, 0xF3, 0x00, 0xE6, 0x00, 0xE9, 0x00, 0xF8, 0x80, 0x1A, 0x00, + 0x1F, 0x80, 0x11, 0x80, 0x07, 0x80, 0x04, 0x80, 0x14, 0x00, 0x15, 0x80, + 0x1E, 0x00, 0x11, 0x80, 0xFE, 0x80, 0xE9, 0x80, 0xD4, 0x00, 0xDC, 0x80, + 0xEE, 0x80, 0x11, 0x00, 0x27, 0x00, 0x3F, 0x80, 0x3D, 0x80, 0x23, 0x80, + 0x09, 0x00, 0xE4, 0x00, 0xDA, 0x00, 0xC7, 0x80, 0xCC, 0x00, 0xE0, 0x80, + 0xF7, 0x00, 0x18, 0x80, 0x31, 0x80, 0x32, 0x80, 0x22, 0x00, 0x17, 0x00, + 0xF1, 0x80, 0xEC, 0x80, 0xFB, 0x00, 0xF6, 0x00, 0x03, 0x00, 0x02, 0x00, + 0xE8, 0x00, 0xEE, 0x80, 0xE6, 0x80, 0xF7, 0x00, 0x13, 0x80, 0x20, 0x80, + 0x12, 0x80, 0x08, 0x80, 0xF1, 0x80, 0xD3, 0x00, 0xDC, 0x80, 0xCE, 0x80, + 0xD7, 0x00, 0xCE, 0x80, 0xC3, 0x80, 0xC8, 0x00, 0xC3, 0x80, 0xDC, 0x80, + 0xF3, 0x00, 0xF8, 0x80, 0x04, 0x80, 0xF3, 0x00, 0xF4, 0x00, 0xEA, 0x80, + 0xDB, 0x00, 0xEF, 0x00, 0xF2, 0x00, 0x06, 0x00, 0x0B, 0x80, 0x03, 0x00, + 0x02, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x02, 0x80, 0x09, 0x00, 0x06, 0x80, + 0x07, 0x00, 0x02, 0x80, 0xF6, 0x00, 0xF9, 0x00, 0x06, 0x80, 0x14, 0x00, + 0x1D, 0x00, 0x2E, 0x80, 0x2D, 0x80, 0x12, 0x00, 0xFB, 0x00, 0xE3, 0x00, + 0xCF, 0x80, 0xC5, 0x80, 0xD7, 0x80, 0xEF, 0x00, 0xFD, 0x80, 0x1A, 0x80, + 0x29, 0x00, 0x1A, 0x00, 0x13, 0x80, 0x16, 0x80, 0xFA, 0x80, 0xF4, 0x80, + 0xFC, 0x00, 0xEC, 0x80, 0xEF, 0x00, 0xEB, 0x00, 0xDB, 0x00, 0xE3, 0x00, + 0xE4, 0x80, 0xEF, 0x00, 0x09, 0x00, 0x16, 0x80, 0x12, 0x00, 0x1B, 0x80, + 0x0C, 0x00, 0xF7, 0x00, 0xEB, 0x00, 0xD8, 0x80, 0xCE, 0x00, 0xC1, 0x00, + 0xC0, 0x80, 0xC8, 0x80, 0xCC, 0x00, 0xE2, 0x80, 0xF3, 0x00, 0xF6, 0x00, + 0xFF, 0x80, 0xF9, 0x00, 0xFE, 0x00, 0xF9, 0x00, 0xF1, 0x00, 0xF7, 0x80, + 0xF7, 0x80, 0xFF, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x80, 0x02, 0x00, + 0x03, 0x80, 0x02, 0x80, 0x01, 0x00, 0xFC, 0x00, 0xFE, 0x00, 0xFF, 0x00, + 0xF8, 0x80, 0xFF, 0x00, 0x12, 0x00, 0x1A, 0x80, 0x1A, 0x00, 0x22, 0x00, + 0x21, 0x00, 0x08, 0x80, 0xF4, 0x80, 0xE4, 0x00, 0xD9, 0x00, 0xD1, 0x00, + 0xDF, 0x80, 0xEF, 0x00, 0xFB, 0x00, 0x15, 0x00, 0x1F, 0x00, 0x13, 0x80, + 0x13, 0x80, 0x10, 0x80, 0xF3, 0x00, 0xE7, 0x80, 0xEC, 0x00, 0xE4, 0x00, + 0xE1, 0x80, 0xE7, 0x00, 0xE4, 0x00, 0xED, 0x80, 0xE9, 0x80, 0xF0, 0x80, + 0x07, 0x00, 0x10, 0x80, 0x0E, 0x80, 0x17, 0x80, 0x17, 0x00, 0x02, 0x00, + 0xF1, 0x80, 0xE5, 0x80, 0xD6, 0x00, 0xC4, 0x00, 0xC0, 0x80, 0xC8, 0x80, + 0xCB, 0x00, 0xD7, 0x80, 0xE5, 0x80, 0xEC, 0x80, 0xF1, 0x00, 0xF0, 0x80, + 0xF9, 0x80, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x0E, 0x80, 0x16, 0x80, + 0x0F, 0x00, 0x02, 0x80, 0x05, 0x00, 0x03, 0x80, 0x06, 0x80, 0x00, 0x00, + 0x01, 0x80, 0xFF, 0x80, 0x00, 0x00, 0xF5, 0x80, 0xED, 0x00, 0xF7, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFD, 0x00, 0x06, 0x00, 0x0D, 0x00, 0x00, 0x00, + 0xF5, 0x80, 0xEB, 0x80, 0xEC, 0x00, 0xE6, 0x00, 0xE4, 0x80, 0xE5, 0x80, + 0xEF, 0x80, 0xFD, 0x00, 0xFD, 0x00, 0xFB, 0x00, 0x00, 0x00, 0x03, 0x00, + 0xF4, 0x00, 0xE9, 0x00, 0xE6, 0x00, 0xE6, 0x00, 0xE3, 0x80, 0xE9, 0x00, + 0xEF, 0x80, 0xFE, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x19, 0x00, 0x1A, 0x00, + 0x0F, 0x00, 0x0A, 0x00, 0x00, 0x00, 0xEE, 0x80, 0xDF, 0x00, 0xCF, 0x00, + 0xC8, 0x00, 0xC2, 0x00, 0xC0, 0x80, 0xC2, 0x80, 0xC5, 0x00, 0xD4, 0x80, + 0xE9, 0x00, 0xF3, 0x00, 0xF9, 0x80, 0xFE, 0x80, 0x10, 0x00, 0x1A, 0x80, + 0x15, 0x80, 0x14, 0x80, 0x14, 0x00, 0x18, 0x80, 0x0F, 0x00, 0x05, 0x00, + 0x01, 0x80, 0xFD, 0x00, 0xFB, 0x80, 0xF6, 0x80, 0xF9, 0x80, 0xFC, 0x80, + 0xFD, 0x00, 0xFB, 0x00, 0xFA, 0x00, 0x02, 0x00, 0x08, 0x00, 0x07, 0x80, + 0x03, 0x00, 0x06, 0x00, 0x08, 0x00, 0xFC, 0x80, 0xEF, 0x80, 0xE6, 0x00, + 0xE8, 0x00, 0xE3, 0x80, 0xDE, 0x80, 0xDB, 0x80, 0xE1, 0x80, 0xEE, 0x00, + 0xEF, 0x00, 0xEF, 0x80, 0xF3, 0x80, 0xFD, 0x00, 0xF7, 0x00, 0xF3, 0x80, + 0xF7, 0x00, 0xF5, 0x80, 0xF8, 0x00, 0xF8, 0x00, 0xF9, 0x80, 0x01, 0x80, + 0x02, 0x00, 0x07, 0x80, 0x0D, 0x80, 0x10, 0x80, 0x08, 0x00, 0x03, 0x80, + 0xFA, 0x00, 0xEB, 0x00, 0xE0, 0x00, 0xD2, 0x80, 0xCE, 0x00, 0xC6, 0x80, + 0xC0, 0x80, 0xC5, 0x00, 0xCB, 0x80, 0xDC, 0x00, 0xEF, 0x80, 0xF6, 0x80, + 0xFC, 0x80, 0x02, 0x00, 0x14, 0x00, 0x1B, 0x80, 0x15, 0x00, 0x0F, 0x80, + 0x0A, 0x80, 0x11, 0x00, 0x10, 0x80, 0x06, 0x00, 0x05, 0x80, 0x05, 0x80, + 0x08, 0x80, 0x0A, 0x80, 0x12, 0x00, 0x15, 0x00, 0x18, 0x00, 0x18, 0x00, + 0x16, 0x00, 0x16, 0x00, 0x13, 0x00, 0x10, 0x00, 0x07, 0x80, 0x04, 0x80, + 0xFF, 0x80, 0xEC, 0x00, 0xDF, 0x80, 0xD6, 0x80, 0xD5, 0x80, 0xD1, 0x80, + 0xD0, 0x80, 0xD1, 0x80, 0xD4, 0x80, 0xDC, 0x80, 0xE6, 0x00, 0xE9, 0x00, + 0xEF, 0x00, 0xF8, 0x80, 0xF0, 0x80, 0xF2, 0x80, 0xF8, 0x80, 0xF9, 0x80, + 0x00, 0x00, 0x01, 0x80, 0xFB, 0x80, 0x00, 0x00, 0xFC, 0x80, 0x00, 0x00, + 0x09, 0x80, 0x0B, 0x80, 0x00, 0x80, 0xFD, 0x80, 0xF3, 0x80, 0xE8, 0x00, + 0xE8, 0x00, 0xE0, 0x80, 0xD8, 0x80, 0xCB, 0x00, 0xC2, 0x00, 0xC0, 0x80, + 0xC5, 0x00, 0xD2, 0x80, 0xE0, 0x80, 0xE1, 0x00, 0xE7, 0x00, 0xF3, 0x80, + 0x07, 0x80, 0x17, 0x00, 0x15, 0x00, 0x11, 0x00, 0x0C, 0x80, 0x15, 0x00, + 0x11, 0x00, 0x07, 0x80, 0x04, 0x00, 0x06, 0x00, 0x08, 0x80, 0x0F, 0x80, + 0x15, 0x00, 0x15, 0x00, 0x19, 0x80, 0x17, 0x00, 0x0E, 0x80, 0x0B, 0x80, + 0x0C, 0x80, 0x08, 0x80, 0x01, 0x00, 0x02, 0x00, 0xFF, 0x00, 0xF3, 0x80, + 0xEF, 0x00, 0xEA, 0x00, 0xE7, 0x80, 0xE3, 0x80, 0xE2, 0x80, 0xDF, 0x00, + 0xDC, 0x00, 0xE1, 0x80, 0xE3, 0x80, 0xE2, 0x80, 0xE5, 0x80, 0xE9, 0x00, + 0xE1, 0x80, 0xE4, 0x80, 0xF1, 0x80, 0xFB, 0x00, 0x01, 0x00, 0x04, 0x00, + 0x03, 0x00, 0x09, 0x80, 0x09, 0x80, 0x12, 0x00, 0x1D, 0x80, 0x1E, 0x80, + 0x12, 0x00, 0x07, 0x00, 0xFC, 0x00, 0xEE, 0x00, 0xEE, 0x00, 0xE7, 0x80, + 0xE1, 0x80, 0xD2, 0x80, 0xC4, 0x80, 0xC1, 0x80, 0xC0, 0x80, 0xC9, 0x00, + 0xD3, 0x80, 0xD3, 0x80, 0xDB, 0x00, 0xE0, 0x80, 0xEB, 0x00, 0xF0, 0x80, + 0xEF, 0x00, 0xF6, 0x80, 0xFA, 0x00, 0x04, 0x00, 0x07, 0x00, 0x02, 0x00, + 0x00, 0x00, 0xFD, 0x00, 0xFE, 0x80, 0x00, 0x00, 0x01, 0x80, 0x03, 0x00, + 0x04, 0x80, 0xFD, 0x00, 0xF0, 0x80, 0xED, 0x00, 0xEE, 0x80, 0xED, 0x00, + 0xE8, 0x80, 0xED, 0x00, 0xF0, 0x80, 0xE5, 0x00, 0xDA, 0x00, 0xD3, 0x80, + 0xD5, 0x00, 0xD5, 0x00, 0xDB, 0x80, 0xE0, 0x80, 0xEB, 0x80, 0xFA, 0x00, + 0xFE, 0x80, 0xFD, 0x00, 0x04, 0x80, 0x0C, 0x80, 0x07, 0x80, 0x0E, 0x00, + 0x1E, 0x00, 0x27, 0x80, 0x2C, 0x80, 0x2B, 0x00, 0x1F, 0x80, 0x1E, 0x00, + 0x16, 0x00, 0x13, 0x00, 0x19, 0x80, 0x19, 0x80, 0x0B, 0x00, 0x00, 0x00, + 0xF5, 0x00, 0xE5, 0x00, 0xDE, 0x80, 0xD8, 0x80, 0xD2, 0x00, 0xCA, 0x00, + 0xC3, 0x80, 0xC0, 0x80, 0xC0, 0x80, 0xC6, 0x80, 0xCE, 0x80, 0xD0, 0x80, + 0xD2, 0x00, 0xD3, 0x80, 0xDB, 0x80, 0xE0, 0x80, 0xE2, 0x00, 0xE8, 0x80, + 0xF3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x80, + 0x03, 0x00, 0x04, 0x80, 0x09, 0x00, 0x06, 0x00, 0x01, 0x80, 0xFE, 0x80, + 0xF1, 0x00, 0xF1, 0x00, 0xF2, 0x80, 0xEF, 0x80, 0xE9, 0x80, 0xEF, 0x80, + 0xF1, 0x00, 0xE3, 0x80, 0xDA, 0x00, 0xD4, 0x00, 0xD5, 0x80, 0xD4, 0x00, + 0xDA, 0x00, 0xE2, 0x00, 0xEE, 0x00, 0xFB, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x80, 0x0C, 0x00, 0x09, 0x00, 0x12, 0x00, 0x21, 0x80, 0x2D, 0x80, + 0x32, 0x00, 0x30, 0x80, 0x2C, 0x00, 0x26, 0x00, 0x1B, 0x00, 0x16, 0x80, + 0x16, 0x80, 0x10, 0x80, 0x06, 0x00, 0x00, 0x00, 0xF8, 0x80, 0xE9, 0x80, + 0xE2, 0x00, 0xDA, 0x00, 0xD4, 0x00, 0xCE, 0x00, 0xC6, 0x80, 0xC2, 0x00, + 0xC0, 0x80, 0xC8, 0x00, 0xD2, 0x80, 0xD2, 0x80, 0xD1, 0x00, 0xD4, 0x00, + 0xD8, 0x80, 0xDE, 0x80, 0xE0, 0x80, 0xE6, 0x80, 0xEF, 0x80, 0xFB, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x0A, 0x80, 0x12, 0x00, 0x12, 0x00, + 0x14, 0x00, 0x12, 0x00, 0x0E, 0x80, 0x09, 0x00, 0x07, 0x00, 0x0C, 0x80, + 0x12, 0x00, 0x14, 0x00, 0x15, 0x80, 0x1D, 0x00, 0x1D, 0x00, 0x12, 0x00, + 0x07, 0x00, 0x00, 0x00, 0xFE, 0x80, 0xFB, 0x00, 0xF7, 0x00, 0xF9, 0x00, + 0xFE, 0x80, 0x00, 0x00, 0x03, 0x80, 0x01, 0x80, 0x03, 0x80, 0x01, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x05, 0x00, 0x09, 0x00, 0x09, 0x00, + 0x03, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x03, 0x80, + 0xFE, 0x80, 0xF9, 0x00, 0xF0, 0x00, 0xE6, 0x80, 0xE1, 0x00, 0xDA, 0x00, + 0xD4, 0x80, 0xCB, 0x00, 0xC4, 0x00, 0xC2, 0x00, 0xC2, 0x00, 0xC4, 0x00, + 0xC7, 0x80, 0xC4, 0x00, 0xC0, 0x80, 0xC4, 0x00, 0xCD, 0x00, 0xD2, 0x80, + 0xD2, 0x80, 0xD8, 0x00, 0xE1, 0x00, 0xEE, 0x00, 0xF7, 0x00, 0xFE, 0x80, + 0x01, 0x80, 0x04, 0x80, 0x06, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x80, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x09, 0x80, 0x0C, 0x80, + 0x0E, 0x00, 0x14, 0x80, 0x17, 0x80, 0x13, 0x00, 0x0C, 0x80, 0x09, 0x80, + 0x07, 0x80, 0x06, 0x00, 0x07, 0x80, 0x07, 0x80, 0x0B, 0x00, 0x11, 0x80, + 0x16, 0x00, 0x16, 0x00, 0x14, 0x80, 0x11, 0x80, 0x09, 0x80, 0x03, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFA, 0x00, 0xF5, 0x00, + 0xF3, 0x80, 0xF3, 0x80, 0xF6, 0x80, 0xF3, 0x80, 0xEA, 0x00, 0xE3, 0x80, + 0xDD, 0x00, 0xD5, 0x00, 0xD0, 0x80, 0xCD, 0x00, 0xC6, 0x80, 0xC3, 0x80, + 0xC2, 0x00, 0xC0, 0x80, 0xC3, 0x80, 0xCA, 0x00, 0xCE, 0x80, 0xCE, 0x80, + 0xD0, 0x80, 0xD2, 0x00, 0xD6, 0x80, 0xDA, 0x00, 0xDB, 0x80, 0xDD, 0x00, + 0xE3, 0x80, 0xF0, 0x80, 0xF8, 0x80, 0xFE, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, + 0x01, 0x80, 0x01, 0x80, 0x03, 0x80, 0x07, 0x00, 0x07, 0x00, 0x0A, 0x80, + 0x0A, 0x80, 0x09, 0x00, 0x05, 0x00, 0x03, 0x80, 0x03, 0x80, 0x05, 0x00, + 0x07, 0x00, 0x09, 0x00, 0x0E, 0x80, 0x12, 0x00, 0x15, 0x80, 0x15, 0x80, + 0x15, 0x80, 0x14, 0x00, 0x0C, 0x80, 0x07, 0x00, 0x07, 0x00, 0x05, 0x00, + 0x00, 0x00, 0xFE, 0x80, 0xFB, 0x00, 0xF5, 0x80, 0xF1, 0x80, 0xF3, 0x80, + 0xF7, 0x00, 0xF5, 0x80, 0xF0, 0x00, 0xE8, 0x80, 0xDF, 0x80, 0xD8, 0x00, + 0xD2, 0x80, 0xD0, 0x80, 0xCB, 0x00, 0xC4, 0x00, 0xC0, 0x80, 0xC0, 0x80, + 0xC2, 0x00, 0xC5, 0x80, 0xC9, 0x80, 0xCD, 0x00, 0xD0, 0x80, 0xD4, 0x80, + 0xDA, 0x00, 0xDF, 0x80, 0xE1, 0x00, 0xE3, 0x00, 0xEC, 0x00, 0xF7, 0x00, + 0xFB, 0x00, 0xFE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x09, 0x80, 0x09, 0x80, 0x06, 0x00, 0x06, 0x00, 0x0C, 0x80, + 0x0F, 0x80, 0x13, 0x00, 0x16, 0x00, 0x19, 0x80, 0x19, 0x80, 0x16, 0x00, + 0x0F, 0x80, 0x09, 0x80, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x03, 0x00, + 0x03, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFA, 0x00, + 0xF0, 0x80, 0xEA, 0x00, 0xEA, 0x00, 0xED, 0x00, 0xED, 0x00, 0xED, 0x00, + 0xEA, 0x00, 0xE6, 0x80, 0xE3, 0x80, 0xE3, 0x80, 0xE6, 0x80, 0xEA, 0x00, + 0xE6, 0x80, 0xE3, 0x80, 0xDD, 0x00, 0xD6, 0x80, 0xD0, 0x80, 0xCA, 0x00, + 0xC6, 0x80, 0xC3, 0x80, 0xC0, 0x80, 0xC0, 0x80, 0xC0, 0x80, 0xC6, 0x80, + 0xD0, 0x80, 0xD6, 0x80, 0xDA, 0x00, 0xE0, 0x80, 0xE6, 0x80, 0xED, 0x00, + 0xF3, 0x80, 0xFA, 0x00, 0x00, 0x00, 0x03, 0x00, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x80, 0xFA, 0x80, 0xFA, 0x80, + 0xF4, 0x80, 0xF1, 0x80, 0xEC, 0x00, 0xE9, 0x00, 0xE6, 0x00, 0xE6, 0x00, + 0xE6, 0x00, 0xE6, 0x00, 0xE3, 0x00, 0xDD, 0x80, 0xD7, 0x80, 0xD1, 0x80, + 0xCF, 0x00, 0xCC, 0x00, 0xC9, 0x00, 0xC9, 0x00, 0xC9, 0x00, 0xC9, 0x00, + 0xCC, 0x00, 0xCC, 0x00, 0xCC, 0x00, 0xC9, 0x00, 0xC9, 0x00, 0xC6, 0x00, + 0xC6, 0x00, 0xC9, 0x00, 0xC9, 0x00, 0xCC, 0x00, 0xC9, 0x00, 0xC9, 0x00, + 0xC9, 0x00, 0xC9, 0x00, 0xC9, 0x00, 0xCC, 0x00, 0xC9, 0x00, 0xC6, 0x00, + 0xC3, 0x00, 0xC3, 0x00, 0xC0, 0x80, 0xC0, 0x80, 0xC0, 0x80, 0xC0, 0x80, + 0xC3, 0x00, 0xC6, 0x00, 0xCC, 0x00, 0xD1, 0x80, 0xDA, 0x80, 0xDD, 0x80, + 0xE3, 0x00, 0xE6, 0x00, 0xEC, 0x00, 0xF1, 0x80, 0xF4, 0x80, 0xF7, 0x80, + 0xFA, 0x80, 0xFD, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFB, 0x00, 0xF5, 0x80, + 0xF5, 0x80, 0xF0, 0x80, 0xF0, 0x80, 0xF0, 0x80, 0xEB, 0x00, 0xE5, 0x80, + 0xE0, 0x80, 0xD5, 0x80, 0xD0, 0x80, 0xCB, 0x00, 0xC5, 0x80, 0xC0, 0x80, + 0xC0, 0x80, 0xC0, 0x80, 0xC0, 0x80, 0xC0, 0x80, 0xC0, 0x80, 0xC5, 0x80, + 0xC5, 0x80, 0xC5, 0x80, 0xC5, 0x80, 0xC5, 0x80, 0xC5, 0x80, 0xC5, 0x80, + 0xC5, 0x80, 0xC5, 0x80, 0xC5, 0x80, 0xCB, 0x00, 0xD0, 0x80, 0xD5, 0x80, + 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xDB, 0x00, 0xD5, 0x80, 0xD5, 0x80, + 0xD0, 0x80, 0xD0, 0x80, 0xD0, 0x80, 0xCB, 0x00, 0xCB, 0x00, 0xCB, 0x00, + 0xCB, 0x00, 0xD0, 0x80, 0xD5, 0x80, 0xDB, 0x00, 0xDB, 0x00, 0xE0, 0x80, + 0xE5, 0x80, 0xE5, 0x80, 0xEB, 0x00, 0xF0, 0x80, 0xF5, 0x80, 0xFB, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFA, 0x00, 0xF3, 0x80, + 0xF3, 0x80, 0xF3, 0x80, 0xED, 0x00, 0xED, 0x00, 0xE6, 0x80, 0xE6, 0x80, + 0xDA, 0x00, 0xD3, 0x80, 0xCD, 0x00, 0xC6, 0x80, 0xC0, 0x80, 0xC0, 0x80, + 0xC6, 0x80, 0xC6, 0x80, 0xCD, 0x00, 0xCD, 0x00, 0xCD, 0x00, 0xCD, 0x00, + 0xCD, 0x00, 0xCD, 0x00, 0xCD, 0x00, 0xCD, 0x00, 0xCD, 0x00, 0xCD, 0x00, + 0xCD, 0x00, 0xCD, 0x00, 0xCD, 0x00, 0xD3, 0x80, 0xDA, 0x00, 0xDA, 0x00, + 0xDA, 0x00, 0xDA, 0x00, 0xD3, 0x80, 0xD3, 0x80, 0xCD, 0x00, 0xCD, 0x00, + 0xCD, 0x00, 0xC6, 0x80, 0xC6, 0x80, 0xC6, 0x80, 0xC6, 0x80, 0xCD, 0x00, + 0xCD, 0x00, 0xD3, 0x80, 0xDA, 0x00, 0xE0, 0x80, 0xE6, 0x80, 0xE6, 0x80, + 0xED, 0x00, 0xF3, 0x80, 0xFA, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFA, 0x00, 0xFA, 0x00, 0xF3, 0x80, 0xF3, 0x80, 0xF3, 0x80, + 0xED, 0x00, 0xE6, 0x80, 0xE0, 0x80, 0xE0, 0x80, 0xDA, 0x00, 0xDA, 0x00, + 0xDA, 0x00, 0xDA, 0x00, 0xDA, 0x00, 0xD3, 0x80, 0xCD, 0x00, 0xC6, 0x80, + 0xC0, 0x80, 0xC0, 0x80, 0xC0, 0x80, 0xC0, 0x80, 0xC6, 0x80, 0xC6, 0x80, + 0xC6, 0x80, 0xCD, 0x00, 0xCD, 0x00, 0xCD, 0x00, 0xCD, 0x00, 0xCD, 0x00, + 0xCD, 0x00, 0xCD, 0x00, 0xCD, 0x00, 0xCD, 0x00, 0xCD, 0x00, 0xCD, 0x00, + 0xD3, 0x80, 0xDA, 0x00, 0xDA, 0x00, 0xDA, 0x00, 0xDA, 0x00, 0xDA, 0x00, + 0xD3, 0x80, 0xD3, 0x80, 0xCD, 0x00, 0xC6, 0x80, 0xC6, 0x80, 0xC0, 0x80, + 0xC0, 0x80, 0xC0, 0x80, 0xC0, 0x80, 0xC6, 0x80, 0xCD, 0x00, 0xCD, 0x00, + 0xD3, 0x80, 0xDA, 0x00, 0xDA, 0x00, 0xE0, 0x80, 0xE6, 0x80, 0xED, 0x00, + 0xF3, 0x80, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0x00, 0xEE, 0x00, 0xEE, 0x00, + 0xE5, 0x00, 0xE5, 0x00, 0xE5, 0x00, 0xE5, 0x00, 0xDB, 0x80, 0xDB, 0x80, + 0xDB, 0x80, 0xDB, 0x80, 0xD2, 0x80, 0xD2, 0x80, 0xD2, 0x80, 0xD2, 0x80, + 0xD2, 0x80, 0xD2, 0x80, 0xD2, 0x80, 0xD2, 0x80, 0xD2, 0x80, 0xD2, 0x80, + 0xD2, 0x80, 0xD2, 0x80, 0xD2, 0x80, 0xD2, 0x80, 0xD2, 0x80, 0xD2, 0x80, + 0xDB, 0x80, 0xDB, 0x80, 0xDB, 0x80, 0xDB, 0x80, 0xDB, 0x80, 0xDB, 0x80, + 0xDB, 0x80, 0xDB, 0x80, 0xDB, 0x80, 0xD2, 0x80, 0xD2, 0x80, 0xD2, 0x80, + 0xC9, 0x80, 0xC9, 0x80, 0xC9, 0x80, 0xC0, 0x80, 0xC0, 0x80, 0xC0, 0x80, + 0xC9, 0x80, 0xC9, 0x80, 0xD2, 0x80, 0xDB, 0x80, 0xDB, 0x80, 0xE5, 0x00, + 0xEE, 0x00, 0xF7, 0x00, 0xF7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x80, 0xF0, 0x80, + 0xF0, 0x80, 0xF0, 0x80, 0xF0, 0x80, 0xF0, 0x80, 0xF0, 0x80, 0xE0, 0x80, + 0xE0, 0x80, 0xE0, 0x80, 0xE0, 0x80, 0xE0, 0x80, 0xE0, 0x80, 0xE0, 0x80, + 0xF0, 0x80, 0xF0, 0x80, 0xF0, 0x80, 0xF0, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x80, + 0xF0, 0x80, 0xF0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xF0, 0x80, 0xF0, 0x80, 0xF0, 0x80, 0xE0, 0x80, 0xE0, 0x80, 0xD0, 0x80, + 0xD0, 0x80, 0xC0, 0x80, 0xC0, 0x80, 0xC0, 0x80, 0xD0, 0x80, 0xD0, 0x80, + 0xD0, 0x80, 0xE0, 0x80, 0xE0, 0x80, 0xF0, 0x80, 0xF0, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +const wt_descr_t _g_wt_descr[WT_NUM_WAVETABLES] = +{ + {8, 0, 101, 8, 69, 16, 70, 24, 71, 32, 72, 40, 73, 48, 74, 60, 75}, + {8, 0, 77, 8, 78, 16, 79, 24, 80, 32, 81, 40, 82, 48, 83, 60, 84}, + {6, 0, 101, 30, 47, 38, 131, 46, 132, 54, 141, 60, 142}, + {7, 0, 101, 8, 94, 16, 95, 24, 96, 32, 97, 40, 98, 60, 100}, + {3, 0, 2, 24, 1, 60, 1}, + {6, 0, 131, 8, 132, 16, 141, 24, 142, 32, 143, 60, 144}, + {9, 0, 101, 8, 54, 16, 55, 24, 56, 32, 57, 40, 88, 48, 89, 54, 53, 60, 104}, + {4, 0, 114, 20, 115, 40, 116, 60, 99}, + {4, 0, 108, 24, 65, 40, 63, 60, 90}, + {7, 0, 101, 8, 61, 16, 62, 24, 63, 32, 66, 40, 67, 60, 68}, + {5, 0, 42, 14, 43, 30, 44, 46, 45, 60, 46}, + {5, 0, 41, 16, 40, 32, 39, 48, 38, 60, 37}, + {8, 0, 101, 8, 54, 16, 55, 24, 56, 32, 57, 40, 58, 48, 59, 60, 60}, + {8, 0, 241, 8, 242, 16, 243, 24, 244, 32, 245, 40, 241, 48, 242, 60, 243}, + {6, 0, 101, 12, 5, 24, 6, 36, 85, 48, 8, 60, 48}, + {4, 0, 12, 20, 11, 50, 53, 60, 104}, + {31, 0, 146, 2, 147, 4, 148, 6, 149, 8, 150, 10, 151, 12, 152, 14, 153, 16, 154, 18, 155, 20, 156, 22, 157, 24, 158, 26, 159, 28, 160, 30, 161, 32, 162, 34, 163, 36, 164, 38, 165, 40, 166, 42, 167, 44, 168, 46, 169, 48, 170, 50, 171, 52, 172, 54, 173, 56, 174, 58, 175, 60, 176}, + {6, 0, 106, 8, 109, 14, 113, 22, 90, 28, 13, 60, 113}, + {9, 0, 85, 8, 85, 16, 86, 24, 91, 32, 62, 40, 71, 48, 86, 56, 85, 60, 85}, + {5, 0, 117, 28, 117, 40, 116, 52, 119, 60, 119}, + {26, 0, 101, 3, 101, 4, 80, 7, 80, 8, 69, 11, 69, 12, 81, 15, 81, 16, 70, 19, 70, 20, 82, 23, 82, 24, 71, 27, 71, 28, 83, 31, 83, 32, 72, 35, 72, 36, 84, 39, 84, 40, 73, 43, 73, 44, 85, 47, 85, 48, 74, 60, 74}, + {12, 0, 32, 12, 30, 17, 29, 22, 28, 27, 27, 32, 26, 37, 25, 42, 24, 46, 23, 50, 22, 54, 21, 60, 21}, + {8, 0, 32, 14, 33, 15, 32, 29, 34, 30, 32, 43, 35, 44, 32, 60, 36}, + {7, 0, 136, 8, 136, 20, 137, 32, 138, 44, 139, 56, 140, 60, 140}, + {7, 0, 106, 10, 107, 20, 108, 30, 109, 40, 110, 50, 111, 60, 112}, + {8, 0, 101, 16, 112, 17, 101, 32, 113, 33, 101, 48, 112, 49, 101, 60, 91}, + {31, 0, 178, 2, 179, 4, 180, 6, 181, 8, 182, 10, 183, 12, 184, 14, 185, 16, 186, 18, 187, 20, 188, 22, 189, 24, 190, 26, 191, 28, 192, 30, 193, 32, 194, 34, 195, 36, 196, 38, 197, 40, 198, 42, 199, 44, 200, 46, 201, 48, 202, 50, 203, 52, 204, 54, 205, 56, 206, 58, 207, 60, 208}, + {31, 0, 211, 2, 212, 4, 213, 6, 214, 8, 215, 10, 216, 12, 217, 14, 218, 16, 219, 18, 220, 20, 221, 22, 222, 24, 223, 26, 224, 28, 225, 30, 226, 32, 227, 34, 228, 36, 229, 38, 230, 40, 231, 42, 232, 44, 233, 46, 234, 48, 235, 50, 236, 52, 237, 54, 238, 56, 239, 58, 240, 60, 241}, + {17, 0, 8, 4, 9, 8, 10, 12, 11, 16, 12, 20, 13, 24, 14, 28, 15, 32, 16, 36, 17, 40, 18, 44, 19, 48, 20, 52, 21, 56, 22, 60, 23, 63, 22}, + {16, 0, 3, 4, 24, 8, 19, 12, 219, 16, 382, 20, 376, 24, 370, 28, 143, 32, 377, 36, 15, 40, 20, 44, 241, 48, 243, 52, 93, 56, 121, 60, 126}, + {16, 0, 239, 4, 240, 8, 241, 12, 242, 16, 243, 20, 244, 24, 245, 28, 368, 32, 391, 36, 388, 40, 392, 44, 386, 48, 384, 52, 382, 56, 133, 60, 375}, + {16, 0, 382, 4, 30, 8, 31, 12, 32, 16, 33, 20, 34, 24, 35, 28, 36, 32, 240, 36, 241, 40, 242, 44, 243, 48, 244, 52, 245, 56, 140, 60, 369}, + {12, 0, 3, 5, 4, 11, 7, 16, 9, 22, 10, 27, 14, 33, 15, 38, 16, 44, 17, 49, 18, 53, 19, 60, 20}, + {12, 0, 31, 1, 49, 2, 50, 3, 51, 4, 52, 7, 64, 13, 76, 18, 87, 23, 92, 37, 93, 47, 102, 60, 103}, + {20, 0, 105, 2, 118, 5, 120, 8, 121, 10, 122, 12, 123, 16, 124, 19, 125, 23, 126, 26, 127, 30, 128, 32, 129, 35, 130, 39, 133, 42, 134, 45, 135, 49, 145, 54, 177, 58, 209, 60, 210}, + {16, 0, 368, 4, 369, 8, 370, 12, 371, 16, 372, 20, 373, 24, 374, 28, 375, 32, 376, 36, 377, 40, 378, 44, 379, 48, 380, 52, 381, 56, 382, 60, 383}, + {5, 0, 384, 15, 385, 30, 386, 45, 387, 60, 388}, + {6, 0, 389, 12, 390, 24, 391, 36, 392, 48, 393, 60, 394}, + {5, 0, 395, 10, 396, 26, 397, 43, 398, 60, 399}, + {22, 0, 400, 1, 401, 4, 402, 8, 403, 11, 404, 13, 405, 17, 406, 19, 407, 22, 408, 25, 409, 29, 410, 30, 411, 34, 412, 36, 413, 39, 414, 43, 415, 48, 416, 52, 417, 53, 418, 54, 419, 59, 420, 60, 421} + +}; diff --git a/Source/synth/noise.c b/Source/synth/noise.c new file mode 100644 index 0000000..0796a81 --- /dev/null +++ b/Source/synth/noise.c @@ -0,0 +1,94 @@ +// -------------------------------------------------------------- +// -------------------------------------------------------------- + +#include +#include +#include +#include + +#include "synth_defs.h" +#include "noise.h" + +// -------------------------------------------------------------- +// internal funcs +// -------------------------------------------------------------- +#define PM_IA 16807 +#define PM_IM 2147483647 +#define PM_AM (1.0/PM_IM) +#define PM_IQ 127773 +#define PM_IR 2836 +#define PM_MASK 123459876 + +// 'Minimal' random number generator of Park and Miller. Returns a uniform random deviate +// between 0.0 and 1.0. Set or resetidumto any integer value (except the unlikely value MASK) +// to initialize the sequence; idummust not be altered between calls for successive deviates in +// a sequence. +double ran0(long *idum) +{ + long k; + double ans; + + *idum ^= PM_MASK; // XORing with MASKallows use of zero and other + k=(*idum)/PM_IQ; // simple bit patterns for idum. + *idum=PM_IA*(*idum-k*PM_IQ)-PM_IR *k; // Compute idum=(IA*idum) % IM without over- + // flows by Schrage’s method. + if (*idum < 0) + *idum += PM_IM; + + ans=PM_AM*(*idum); // Convert idumto a floating result. + *idum ^= PM_MASK; // Unmask before return. + + return ans; +} + +// -------------------------------------------------------------- +// Exported functions +// -------------------------------------------------------------- +void Noise_Init(noise_gen_t *pObj, UINT32 seed) +{ + pObj->state = (long)(seed & NOISE_LFSR_MAX); +} + +void Noise_Free(noise_gen_t *pObj) +{ +} + +synth_float_t Noise_Uniform(noise_gen_t *pObj, synth_float_t var, synth_float_t mu) +{ +/* + if (pObj->lfsr & 0x800000) + pObj->lfsr = ((pObj->lfsr << 1) | 1) ^ NOISE_LFSR_POLY; + else + pObj->lfsr = (pObj->lfsr << 1); + + pObj->lfsr &= NOISE_LFSR_MAX; +*/ + + /* taps: 32 31 29 1; characteristic polynomial: x^32 + x^31 + x^29 + x + 1 */ +// pObj->lfsr = (pObj->lfsr >> 1) ^ (-(pObj->lfsr & 1) & NOISE_LFSR_POLY); + +// return var * ((synth_float_t)rand()/(RAND_MAX+1) + mu -0.5); + return var*(ran0(&pObj->state) + mu -0.5); + +} + +synth_float_t Noise_Gaussian(noise_gen_t *pObj, synth_float_t std, synth_float_t mu) +{ + synth_float_t U1, U2, V1, V2, S, Y; + + do + { + U1 = Noise_Uniform(pObj, 1, 0.5); // U1=[0,1] + U2 = Noise_Uniform(pObj, 1, 0.5); // U2=[0,1] + V1 = 2 * U1 - 1; // V1=[-1,1] + V2 = 2 * U2 - 1; // V2=[-1,1] + S = V1 * V1 + V2 * V2; + + } while (S >= 1); + + // X = sqrt(-2 * log(S) / S) * V1; + Y = sqrt(-2 * log(S) / S) * V2; + Y = mu + std*Y; + + return Y; +} diff --git a/Source/synth/noise.h b/Source/synth/noise.h new file mode 100644 index 0000000..4ac6be1 --- /dev/null +++ b/Source/synth/noise.h @@ -0,0 +1,38 @@ +// -------------------------------------------------------------- +// -------------------------------------------------------------- +#ifndef _NOISE_H_ +#define _NOISE_H_ + +#include "synth_defs.h" + +#define NOISE_LFSR_POLY 0xD0000001 +#define NOISE_LFSR_MAX 0xFFFFFFFF + +// -------------------------------------------------------------- +// Types +// -------------------------------------------------------------- +typedef struct _snoise_gen_t +{ + long state; +} noise_gen_t; + +// -------------------------------------------------------------- +#if defined(__cplusplus) +extern "C" { +#endif + +// -------------------------------------------------------------- +// Exported functions +// -------------------------------------------------------------- +void Noise_Init(noise_gen_t *pObj, UINT32 seed); +void Noise_Free(noise_gen_t *pObj); +synth_float_t Noise_Uniform(noise_gen_t *pObj, synth_float_t vmax, synth_float_t mu); +synth_float_t Noise_Gaussian(noise_gen_t *pObj, synth_float_t std, synth_float_t mu); + +#if defined(__cplusplus) +} + +#endif +// -------------------------------------------------------------- + +#endif // _NOISE_H_ diff --git a/Source/synth/param_scale.c b/Source/synth/param_scale.c new file mode 100644 index 0000000..2e0212b --- /dev/null +++ b/Source/synth/param_scale.c @@ -0,0 +1,886 @@ +// -------------------------------------------------------------- +// -------------------------------------------------------------- +#include +#include +#include +#include + +#include "synth_defs.h" + +#include "vcf.h" +#include "voice.h" +#include "param_scale.h" + +static const param_info_t param_info[] = +{ + { + SYNTH_PARAM_VOLUME, + "Master Volume", + /*Base*/10.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/100, /*interval*/0.1 + }, + { + SYNTH_PARAM_VOICE_PAN_SPREAD, + "Voice Pan Spread", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/100, /*interval*/0.1 + }, + { + SYNTH_PARAM_TUNE, + "Master Tune", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.5, /*min*/-100, /*pcenter*/0, /*max*/+100, /*interval*/0.1 + }, + { + SYNTH_PARAM_TOTAL_NUM_VOICES, + "Total num. Voices", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/1, /*pcenter*/-1, /*max*/MAX_POLYPHONY, /*interval*/1 + }, + { + SYNTH_PARAM_HUMANIZE_ENABLE, + "Humanize Enable", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/1.0, /*interval*/1 + }, + { + SYNTH_PARAM_HUMANIZE_VAR_VCO, + "Humanize Spread VCO", + /*Base*/10.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/10, /*interval*/0.01 + }, + { + SYNTH_PARAM_HUMANIZE_VAR_VCF, + "Humanize Spread VCF", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/200, /*interval*/0.1 + }, + { + SYNTH_PARAM_HUMANIZE_VAR_ENV, + "Humanize Spread ENV", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/100, /*interval*/0.1 + }, + { + SYNTH_PARAM_MONOPHONIC_ENABLE, + "Monophonic Enable", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/1.0, /*interval*/1 + }, + { + SYNTH_PARAM_MONOPHONIC_RETRIGGER_ENABLE, + "Monophonic Retrigger Enable", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/1.0, /*interval*/1 + }, + { + SYNTH_PARAM_UNISONO_ENABLE, + "Unisono Enable", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/1.0, /*interval*/1 + }, + { + SYNTH_PARAM_UNISONO_NUM_VOICES, + "Unisono num. Voices", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/1, /*pcenter*/-1, /*max*/MAX_POLYPHONY, /*interval*/1 + }, + { + SYNTH_PARAM_PORTAMENTO_TIME, + "Portamento Time", + /*Base*/10.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0.001, /*pcenter*/-1, /*max*/0.5, /*interval*/0.001 + }, + { + SYNTH_PARAM_OSC_0_ENABLE, + "OSC1 enable", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/1.0, /*interval*/1 + }, + { + SYNTH_PARAM_OSC_1_ENABLE, + "OSC2 enable", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/1.0, /*interval*/1 + }, + { + SYNTH_PARAM_OSC_0_RESTART_ON_TRIGGER, + "OSC1 restart on trigger", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/1.0, /*interval*/1 + }, + { + SYNTH_PARAM_OSC_1_RESTART_ON_TRIGGER, + "OSC2 restart on trigger", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/1.0, /*interval*/1 + }, + { + SYNTH_PARAM_OSC_0_LEVEL, + "OSC1 level", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/100, /*interval*/0.1 + }, + { + SYNTH_PARAM_OSC_1_LEVEL, + "OSC2 level", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/100, /*interval*/0.1 + }, + { + SYNTH_PARAM_OSC_0_DUTYCYCLE, + "OSC1 pulse width", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/100, /*interval*/0.1 + }, + { + SYNTH_PARAM_OSC_1_DUTYCYCLE, + "OSC2 pulse width", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/100, /*interval*/0.1 + }, + { + SYNTH_PARAM_OSC_0_DETUNE, + "OSC1 detune", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.5, /*min*/-50, /*pcenter*/0, /*max*/+50, /*interval*/0.1 + }, + { + SYNTH_PARAM_OSC_1_DETUNE, + "OSC2 detune", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.5, /*min*/-50, /*pcenter*/0, /*max*/+50, /*interval*/0.1 + }, + { + SYNTH_PARAM_OSC_0_TRANSPOSE, + "OSC1 transpose", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.5, /*min*/-48.0, /*pcenter*/0, /*max*/+48.0, /*interval*/1 + }, + { + SYNTH_PARAM_OSC_1_TRANSPOSE, + "OSC2 transpose", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.5, /*min*/-48.0, /*pcenter*/0, /*max*/+48.0, /*interval*/1 + }, + { + SYNTH_PARAM_OSC_0_WAVEFORM, + "OSC1 shape", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/OSC_NUM_WAVEFORMS-1, /*interval*/1 + }, + { + SYNTH_PARAM_OSC_1_WAVEFORM, + "OSC2 shape", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/OSC_NUM_WAVEFORMS-1, /*interval*/1 + }, + { + SYNTH_PARAM_OSC_0_PB_RANGE_MIN, + "OSC1 pitch bender minimum", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.5, /*min*/-48.0, /*pcenter*/0, /*max*/+48.0, /*interval*/1 + }, + { + SYNTH_PARAM_OSC_1_PB_RANGE_MIN, + "OSC2 pitch bender minimum", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.5, /*min*/-48.0, /*pcenter*/0, /*max*/+48.0, /*interval*/1 + }, + { + SYNTH_PARAM_OSC_0_PB_RANGE_MAX, + "OSC1 pitch bender maximum", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.5, /*min*/-48.0, /*pcenter*/0, /*max*/+48.0, /*interval*/1 + }, + { + SYNTH_PARAM_OSC_1_PB_RANGE_MAX, + "OSC2 pitch bender maximum", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.5, /*min*/-48.0, /*pcenter*/0, /*max*/+48.0, /*interval*/1 + }, + { + SYNTH_PARAM_OSC_0_FM_AMT_0, + "OSC1 FM amt 1", + /*Base*/10, /*kexp*/2.5, /*scenter*/0.5, /*min*/-48, /*pcenter*/0, /*max*/+48, /*interval*/0.01 + }, + { + SYNTH_PARAM_OSC_1_FM_AMT_0, + "OSC2 FM amt 1", + /*Base*/10, /*kexp*/2.5, /*scenter*/0.5, /*min*/-48, /*pcenter*/0, /*max*/+48, /*interval*/0.01 + }, + { + SYNTH_PARAM_OSC_0_FM_AMT_1, + "OSC1 FM amt 2", + /*Base*/1, /*kexp*/1, /*scenter*/0.5, /*min*/-100, /*pcenter*/0, /*max*/+100, /*interval*/0.01 + }, + { + SYNTH_PARAM_OSC_1_FM_AMT_1, + "OSC2 FM amt 2", + /*Base*/1, /*kexp*/1, /*scenter*/0.5, /*min*/-100, /*pcenter*/0, /*max*/+100, /*interval*/0.01 + }, + { + SYNTH_PARAM_OSC_0_FM_SRC_0, + "OSC1 FM src 1", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/VOICE_NUM_MOD_SOURCES_0-1, /*interval*/1 + }, + { + SYNTH_PARAM_OSC_1_FM_SRC_0, + "OSC2 FM src 1", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/VOICE_NUM_MOD_SOURCES_0-1, /*interval*/1 + }, + { + SYNTH_PARAM_OSC_0_FM_SRC_1, + "OSC1 FM src 2", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/(VOICE_NUM_MOD_SOURCES_1-1)*VOICE_NUM_MOD_OPS + 1-1, /*interval*/1 + }, + { + SYNTH_PARAM_OSC_1_FM_SRC_1, + "OSC2 FM src 2", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/(VOICE_NUM_MOD_SOURCES_1-1)*VOICE_NUM_MOD_OPS + 1-1, /*interval*/1 + }, + { + SYNTH_PARAM_OSC_0_FM_SRC_OP, + "OSC1 FM src OP", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/VOICE_NUM_MOD_OPS-1, /*interval*/1 + }, + { + SYNTH_PARAM_OSC_1_FM_SRC_OP, + "OSC2 FM src OP", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/VOICE_NUM_MOD_OPS-1, /*interval*/1 + }, + { + SYNTH_PARAM_OSC_0_AM_AMT_0, + "OSC1 AM amt 1", + /*Base*/1, /*kexp*/1, /*scenter*/0.5, /*min*/-100, /*pcenter*/0, /*max*/+100, /*interval*/0.01 + }, + { + SYNTH_PARAM_OSC_1_AM_AMT_0, + "OSC2 AM amt 1", + /*Base*/1, /*kexp*/1, /*scenter*/0.5, /*min*/-100, /*pcenter*/0, /*max*/+100, /*interval*/0.01 + }, + { + SYNTH_PARAM_OSC_0_AM_AMT_1, + "OSC1 AM amt 2", + /*Base*/1, /*kexp*/1, /*scenter*/0.5, /*min*/-100, /*pcenter*/0, /*max*/+100, /*interval*/0.01 + }, + { + SYNTH_PARAM_OSC_1_AM_AMT_1, + "OSC2 AM amt 2", + /*Base*/1, /*kexp*/1, /*scenter*/0.5, /*min*/-100, /*pcenter*/0, /*max*/+100, /*interval*/0.01 + }, + { + SYNTH_PARAM_OSC_0_AM_SRC_0, + "OSC1 AM src 1", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/VOICE_NUM_MOD_SOURCES_0-1, /*interval*/1 + }, + { + SYNTH_PARAM_OSC_1_AM_SRC_0, + "OSC2 AM src 1", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/VOICE_NUM_MOD_SOURCES_0-1, /*interval*/1 + }, + { + SYNTH_PARAM_OSC_0_AM_SRC_1, + "OSC1 AM src 2", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/(VOICE_NUM_MOD_SOURCES_1-1)*VOICE_NUM_MOD_OPS + 1-1, /*interval*/1 + }, + { + SYNTH_PARAM_OSC_1_AM_SRC_1, + "OSC2 AM src 2", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/(VOICE_NUM_MOD_SOURCES_1-1)*VOICE_NUM_MOD_OPS + 1-1, /*interval*/1 + }, + { + SYNTH_PARAM_OSC_0_AM_SRC_OP, + "OSC1 AM src OP", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/VOICE_NUM_MOD_OPS-1, /*interval*/1 + }, + { + SYNTH_PARAM_OSC_1_AM_SRC_OP, + "OSC2 AM src OP", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/VOICE_NUM_MOD_OPS-1, /*interval*/1 + }, + { + SYNTH_PARAM_OSC_0_PWM_AMT_0, + "OSC1 PWM amt 1", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.5, /*min*/-100, /*pcenter*/0, /*max*/+100, /*interval*/0.1 + }, + { + SYNTH_PARAM_OSC_1_PWM_AMT_0, + "OSC2 PWM amt 1", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.5, /*min*/-100, /*pcenter*/0, /*max*/+100, /*interval*/0.1 + }, + { + SYNTH_PARAM_OSC_0_PWM_AMT_1, + "OSC1 PWM amt 2", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.5, /*min*/-100, /*pcenter*/0, /*max*/+100, /*interval*/0.1 + }, + { + SYNTH_PARAM_OSC_1_PWM_AMT_1, + "OSC2 PWM amt 2", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.5, /*min*/-100, /*pcenter*/0, /*max*/+100, /*interval*/0.1 + }, + { + SYNTH_PARAM_OSC_0_PWM_SRC_0, + "OSC1 PWM src 1", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/VOICE_NUM_MOD_SOURCES_0-1, /*interval*/1 + }, + { + SYNTH_PARAM_OSC_1_PWM_SRC_0, + "OSC2 PWM src 1", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/VOICE_NUM_MOD_SOURCES_0-1, /*interval*/1 + }, + { + SYNTH_PARAM_OSC_0_PWM_SRC_1, + "OSC1 PWM src 2", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/(VOICE_NUM_MOD_SOURCES_1-1)*VOICE_NUM_MOD_OPS + 1-1, /*interval*/1 + }, + { + SYNTH_PARAM_OSC_1_PWM_SRC_1, + "OSC2 PWM src 2", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/(VOICE_NUM_MOD_SOURCES_1-1)*VOICE_NUM_MOD_OPS + 1-1, /*interval*/1 + }, + { + SYNTH_PARAM_OSC_0_PWM_SRC_OP, + "OSC1 PWM src OP", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/VOICE_NUM_MOD_OPS-1, /*interval*/1 + }, + { + SYNTH_PARAM_OSC_1_PWM_SRC_OP, + "OSC2 PWM src OP", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/VOICE_NUM_MOD_OPS-1, /*interval*/1 + }, + { + SYNTH_PARAM_NOISE_ENABLE, + "Noise enable", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/1, /*interval*/1 + }, + { + SYNTH_PARAM_NOISE_LEVEL, + "Noise level", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/100, /*interval*/0.1 + }, + { + SYNTH_PARAM_NOISE_SHAPE, + "Noise shape", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/VOICE_NOISE_NUM_SHAPES-1, /*interval*/1 + }, + { + SYNTH_PARAM_VCA_ENV_AMT, + "VCA Env amt", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/100, /*interval*/0.1 + }, + { + SYNTH_PARAM_VCA_AM_AMT_0, + "VCA AM amt 1", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/100, /*interval*/0.1 + }, + { + SYNTH_PARAM_VCA_AM_SRC_0, + "VCA AM src 1", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/VOICE_NUM_MOD_SOURCES_0-1, /*interval*/1 + }, + { + SYNTH_PARAM_VCA_PAN_AMT_0, + "VCA PAN amt 1", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.5, /*min*/-100, /*pcenter*/0, /*max*/100, /*interval*/0.1 + }, + { + SYNTH_PARAM_VCA_PAN_SRC_0, + "VCA PAN src 1", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/VOICE_NUM_MOD_SOURCES_0-1, /*interval*/1 + }, + { + SYNTH_PARAM_VCA_ENV_A, + "VCA Attack", + /*Base*/150, /*kexp*/1.0, /*scenter*/0.0, /*min*/1, /*pcenter*/-1, /*max*/10000, /*interval*/1 + }, + { + SYNTH_PARAM_VCA_ENV_D, + "VCA Decay", + /*Base*/150, /*kexp*/1.0, /*scenter*/0.0, /*min*/5, /*pcenter*/-1, /*max*/30000, /*interval*/1 + }, + { + SYNTH_PARAM_VCA_ENV_S, + "VCA Sustain", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/100, /*interval*/0.1 + }, + { + SYNTH_PARAM_VCF_ENV_A, + "VCF Attack", + /*Base*/150, /*kexp*/1.0, /*scenter*/0.0, /*min*/1, /*pcenter*/-1, /*max*/10000, /*interval*/1 + }, + { + SYNTH_PARAM_VCF_ENV_D, + "VCF Decay", + /*Base*/150, /*kexp*/1.0, /*scenter*/0.0, /*min*/5, /*pcenter*/-1, /*max*/30000, /*interval*/1 + }, + { + SYNTH_PARAM_VCF_ENV_S, + "VCF Sustain", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/100, /*interval*/0.1 + }, + { + SYNTH_PARAM_VCF_ENV_R, + "VCF Release", + /*Base*/150, /*kexp*/1.0, /*scenter*/0.0, /*min*/5, /*pcenter*/-1, /*max*/30000, /*interval*/1 + }, + { + SYNTH_PARAM_ENV_2_A, + "ENV 2 Attack", + /*Base*/150, /*kexp*/1.0, /*scenter*/0.0, /*min*/1, /*pcenter*/-1, /*max*/10000, /*interval*/1 + }, + { + SYNTH_PARAM_ENV_2_D, + "ENV 2 Decay", + /*Base*/150, /*kexp*/1.0, /*scenter*/0.0, /*min*/5, /*pcenter*/-1, /*max*/30000, /*interval*/1 + }, + { + SYNTH_PARAM_ENV_2_S, + "ENV 2 Sustain", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/100, /*interval*/0.1 + }, + { + SYNTH_PARAM_ENV_2_R, + "ENV 2 Release", + /*Base*/150, /*kexp*/1.0, /*scenter*/0.0, /*min*/5, /*pcenter*/-1, /*max*/30000, /*interval*/1 + }, + { + SYNTH_PARAM_ENV_3_A, + "ENV 3 Attack", + /*Base*/150, /*kexp*/1.0, /*scenter*/0.0, /*min*/1, /*pcenter*/-1, /*max*/10000, /*interval*/1 + }, + { + SYNTH_PARAM_ENV_3_D, + "ENV 3 Decay", + /*Base*/150, /*kexp*/1.0, /*scenter*/0.0, /*min*/5, /*pcenter*/-1, /*max*/30000, /*interval*/1 + }, + { + SYNTH_PARAM_ENV_3_S, + "ENV 3 Sustain", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/100, /*interval*/0.1 + }, + { + SYNTH_PARAM_ENV_3_R, + "ENV 3 Release", + /*Base*/150, /*kexp*/1.0, /*scenter*/0.0, /*min*/5, /*pcenter*/-1, /*max*/30000, /*interval*/1 + }, + { + SYNTH_PARAM_VCA_ENV_R, + "VCA Release", + /*Base*/150, /*kexp*/1.0, /*scenter*/0.0, /*min*/5, /*pcenter*/-1, /*max*/30000, /*interval*/1 + }, + { + SYNTH_PARAM_VCF_TYPE, + "VCF type", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/VCF_NUM_FILTERTYPES-1, /*interval*/1 + }, + { + SYNTH_PARAM_VCF_ORDER, + "VCF order", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/VCF_NUM_FILTERORDER-1, /*interval*/1 + }, + { + SYNTH_PARAM_VCF_F, + "VCF Cutoff", + /*Base*/150, /*kexp*/1.0, /*scenter*/0.0, /*min*/FILTER_F_MIN, /*pcenter*/-1, /*max*/FILTER_F_MAX, /*interval*/0.1 + }, + { + SYNTH_PARAM_VCF_Q, + "VCF Res", + /*Base*/10, /*kexp*/2.0, /*scenter*/0.0, /*min*/FILTER_Q_MIN, /*pcenter*/-1, /*max*/FILTER_Q_MAX, /*interval*/0.1 + }, + { + SYNTH_PARAM_VCF_ENV_AMT, + "VCF Env amt", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.5, /*min*/-100, /*pcenter*/0, /*max*/100, /*interval*/0.1 + }, + { + SYNTH_PARAM_VCF_F_AMT_0, + "VCF Cutoff amt 1", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.5, /*min*/-100, /*pcenter*/0, /*max*/100, /*interval*/0.1 + }, + { + SYNTH_PARAM_VCF_F_AMT_1, + "VCF Cutoff amt 2", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.5, /*min*/-100, /*pcenter*/0, /*max*/100, /*interval*/0.1 + }, + { + SYNTH_PARAM_VCF_F_SRC_0, + "VCF Cutoff src 1", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/VOICE_NUM_MOD_SOURCES_0-1, /*interval*/1 + }, + { + SYNTH_PARAM_VCF_F_SRC_1, + "VCF Cutoff src 2", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/(VOICE_NUM_MOD_SOURCES_1-1)*VOICE_NUM_MOD_OPS + 1-1, /*interval*/1 + }, + { + SYNTH_PARAM_VCF_F_SRC_OP, + "VCF Cutoff src OP", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/VOICE_NUM_MOD_OPS-1, /*interval*/1 + }, + { + SYNTH_PARAM_VCF_Q_AMT_0, + "VCF Resonance amt 1", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.5, /*min*/-100, /*pcenter*/0, /*max*/100, /*interval*/0.1 + }, + { + SYNTH_PARAM_VCF_Q_AMT_1, + "VCF Resonance amt 2", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.5, /*min*/-100, /*pcenter*/0, /*max*/100, /*interval*/0.1 + }, + { + SYNTH_PARAM_VCF_Q_SRC_0, + "VCF Resonance src 1", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/VOICE_NUM_MOD_SOURCES_0-1, /*interval*/1 + }, + { + SYNTH_PARAM_VCF_Q_SRC_1, + "VCF Resonance src 2", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/(VOICE_NUM_MOD_SOURCES_1-1)*VOICE_NUM_MOD_OPS + 1-1, /*interval*/1 + }, + { + SYNTH_PARAM_VCF_Q_SRC_OP, + "VCF Resonance src OP", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/VOICE_NUM_MOD_OPS-1, /*interval*/1 + }, + { + SYNTH_PARAM_LFO_0_SPEED, + "LFO 1 speed", + /*Base*/20, /*kexp*/1.0, /*scenter*/0.0, /*min*/0.01, /*pcenter*/-1, /*max*/20.0, /*interval*/0.01 + }, + { + SYNTH_PARAM_LFO_1_SPEED, + "LFO 2 speed", + /*Base*/20, /*kexp*/1.0, /*scenter*/0.0, /*min*/0.01, /*pcenter*/-1, /*max*/20.0, /*interval*/0.01 + }, + { + SYNTH_PARAM_LFO_2_SPEED, + "LFO 3 speed", + /*Base*/20, /*kexp*/1.0, /*scenter*/0.0, /*min*/0.01, /*pcenter*/-1, /*max*/20.0, /*interval*/0.01 + }, + { + SYNTH_PARAM_LFO_3_SPEED, + "LFO 4 speed", + /*Base*/20, /*kexp*/1.0, /*scenter*/0.0, /*min*/0.01, /*pcenter*/-1, /*max*/20.0, /*interval*/0.01 + }, + { + SYNTH_PARAM_LFO_0_SMOOTH, + "LFO 1 smooth", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.5, /*min*/-100, /*pcenter*/0, /*max*/100, /*interval*/0.1 + }, + { + SYNTH_PARAM_LFO_1_SMOOTH, + "LFO 2 smooth", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.5, /*min*/-100, /*pcenter*/0, /*max*/100, /*interval*/0.1 + }, + { + SYNTH_PARAM_LFO_2_SMOOTH, + "LFO 3 smooth", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.5, /*min*/-100, /*pcenter*/0, /*max*/100, /*interval*/0.1 + }, + { + SYNTH_PARAM_LFO_3_SMOOTH, + "LFO 4 smooth", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.5, /*min*/-100, /*pcenter*/0, /*max*/100, /*interval*/0.1 + }, + { + SYNTH_PARAM_LFO_0_DELAY, + "LFO 1 Delay", + /*Base*/150, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/30000, /*interval*/1 + }, + { + SYNTH_PARAM_LFO_1_DELAY, + "LFO 2 Delay", + /*Base*/150, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/30000, /*interval*/1 + }, + { + SYNTH_PARAM_LFO_2_DELAY, + "LFO 3 Delay", + /*Base*/150, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/30000, /*interval*/1 + }, + { + SYNTH_PARAM_LFO_3_DELAY, + "LFO 4 Delay", + /*Base*/150, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/30000, /*interval*/1 + }, + { + SYNTH_PARAM_LFO_0_ATTACK, + "LFO 1 Attack", + /*Base*/150, /*kexp*/1.0, /*scenter*/0.0, /*min*/1, /*pcenter*/-1, /*max*/10000, /*interval*/1 + }, + { + SYNTH_PARAM_LFO_1_ATTACK, + "LFO 2 Attack", + /*Base*/150, /*kexp*/1.0, /*scenter*/0.0, /*min*/1, /*pcenter*/-1, /*max*/10000, /*interval*/1 + }, + { + SYNTH_PARAM_LFO_2_ATTACK, + "LFO 3 Attack", + /*Base*/150, /*kexp*/1.0, /*scenter*/0.0, /*min*/1, /*pcenter*/-1, /*max*/10000, /*interval*/1 + }, + { + SYNTH_PARAM_LFO_3_ATTACK, + "LFO 4 Attack", + /*Base*/150, /*kexp*/1.0, /*scenter*/0.0, /*min*/1, /*pcenter*/-1, /*max*/10000, /*interval*/1 + }, + { + SYNTH_PARAM_LFO_0_SHAPE, + "LFO 1 shape", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/LFO_NUM_WAVEFORMS-1, /*interval*/1 + }, + { + SYNTH_PARAM_LFO_1_SHAPE, + "LFO 2 shape", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/LFO_NUM_WAVEFORMS-1, /*interval*/1 + }, + { + SYNTH_PARAM_LFO_2_SHAPE, + "LFO 3 shape", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/LFO_NUM_WAVEFORMS-1, /*interval*/1 + }, + { + SYNTH_PARAM_LFO_3_SHAPE, + "LFO 4 shape", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/LFO_NUM_WAVEFORMS-1, /*interval*/1 + }, + { + SYNTH_PARAM_LFO_0_MODE, + "LFO 1 mode", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/VOICE_LFO_NUM_MODES-1, /*interval*/1 + }, + { + SYNTH_PARAM_LFO_1_MODE, + "LFO 2 mode", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/VOICE_LFO_NUM_MODES-1, /*interval*/1 + }, + { + SYNTH_PARAM_LFO_2_MODE, + "LFO 3 mode", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/VOICE_LFO_NUM_MODES-1, /*interval*/1 + }, + { + SYNTH_PARAM_LFO_3_MODE, + "LFO 4 mode", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/VOICE_LFO_NUM_MODES-1, /*interval*/1 + }, + { + SYNTH_PARAM_LFO_0_SYNC, + "LFO 1 sync", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/VOICE_LFO_NUM_SYNCS-1, /*interval*/1 + }, + { + SYNTH_PARAM_LFO_1_SYNC, + "LFO 2 sync", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/VOICE_LFO_NUM_SYNCS-1, /*interval*/1 + }, + { + SYNTH_PARAM_LFO_2_SYNC, + "LFO 3 sync", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/VOICE_LFO_NUM_SYNCS-1, /*interval*/1 + }, + { + SYNTH_PARAM_LFO_3_SYNC, + "LFO 4 sync", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.0, /*min*/0, /*pcenter*/-1, /*max*/VOICE_LFO_NUM_SYNCS-1, /*interval*/1 + }, + { + SYNTH_PARAM_LFO_0_SYMMETRY, + "LFO 1 symmetry", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.5, /*min*/-100, /*pcenter*/0, /*max*/100, /*interval*/0.1 + }, + { + SYNTH_PARAM_LFO_1_SYMMETRY, + "LFO 2 symmetry", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.5, /*min*/-100, /*pcenter*/0, /*max*/100, /*interval*/0.1 + }, + { + SYNTH_PARAM_LFO_2_SYMMETRY, + "LFO 3 symmetry", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.5, /*min*/-100, /*pcenter*/0, /*max*/100, /*interval*/0.1 + }, + { + SYNTH_PARAM_LFO_3_SYMMETRY, + "LFO 4 symmetry", + /*Base*/1.0, /*kexp*/1.0, /*scenter*/0.5, /*min*/-100, /*pcenter*/0, /*max*/100, /*interval*/0.1 + } +}; + +// -------------------------------------------------------------- +// Exported functions +// -------------------------------------------------------------- +synth_float_t quantizeParam(param_info_t *pObj, synth_float_t p) +{ + synth_float_t k, pq; + if (pObj->pinterval == 0) + return p; + + k = (synth_float_t)1/(pObj->pinterval - 0); + + if (p < 0) + pq = ((int)(p*k - 0.5))*pObj->pinterval; + else + pq = ((int)(p*k + 0.5))*pObj->pinterval; + + return pq; +} + +synth_float_t clampParam(param_info_t *pObj, synth_float_t p) +{ + return (synth_float_t)min(pObj->pmax, max(pObj->pmin, quantizeParam(pObj, p))); +} + +synth_float_t toParam(param_info_t *pObj, synth_float_t s) +{ + synth_float_t p, pcenter; + synth_float_t pmax, pmin, base, kexp, scenter; + + pmax = pObj->pmax; + pmin = pObj->pmin; + if (pmin == pmax) + pmax += 1E-9; + base = pObj->base; + kexp = pObj->kexp; + if (kexp == 0) + kexp = 1E-9; + scenter = pObj->scenter; + pcenter = pObj->pcenter; + + if ((pcenter < pmin) || (pcenter > pmax)) + pcenter = pmax*scenter + pmin*(1-scenter); + + s = (synth_float_t)min(1, max(0, s)); + if (s < scenter) + { + if (base == 1) + { + // pcenter-(pcenter-pmin)*(scenter-s)/scenter; + p = pcenter-(pcenter-pmin)*(scenter-s)/scenter; + } + else + { + // pcenter-(pcenter-pmin)*(B^(k*(scenter-s)/scenter)-1)/(B^k-1); + p = pcenter-(pcenter-pmin)*(pow(base,kexp*(scenter-s)/scenter)-1)/(pow(base,kexp)-1); + } + } + else + { + if (base == 1) + { + // pcenter+(pmax-pcenter)*(-scenter+s)/(1-scenter); + p = pcenter+(pmax-pcenter)*(-scenter+s)/(1-scenter); + } + else + { + // pcenter+(pmax-pcenter)*(B^(k*(-scenter+s)/(1-scenter))-1)/(B^k-1); + p = pcenter+(pmax-pcenter)*(pow(base,kexp*(-scenter+s)/(1-scenter))-1)/(pow(base,kexp)-1); + } + } + + return quantizeParam(pObj, p); +} +synth_float_t toSlider(param_info_t *pObj, synth_float_t p) +{ + synth_float_t s, pcenter; + synth_float_t pmax, pmin, base, kexp, scenter; + + pmax = pObj->pmax; + pmin = pObj->pmin; + if (pmin == pmax) + pmax += 1E-9; + base = pObj->base; + kexp = pObj->kexp; + if (kexp == 0) + kexp = 1E-9; + scenter = pObj->scenter; + pcenter = pObj->pcenter; + +if ((pcenter < pmin) || (pcenter > pmax)) + pcenter = pmax*scenter + pmin*(1-scenter); + + p = clampParam(pObj, p); + if (p < pcenter) + { + if (base == 1) + { + // (-pmin+p)*scenter/(pcenter-pmin); + s = (-pmin+p)*scenter/(pcenter-pmin); + } + else + { + // scenter*(log(B)*k-log(-(-pcenter*B^k+pmin+p*B^k-p)/(pcenter-pmin)))/log(B)/k; + s = scenter*(log(base)*kexp-log(-(-pcenter*pow(base,kexp)+pmin+p*pow(base,kexp)-p)/(pcenter-pmin)))/log(base)/kexp; + } + } + else + { + if (base == 1) + { + // (pcenter-scenter*pmax-p+scenter*p)/(-pmax+pcenter); + s = (pcenter-scenter*pmax-p+scenter*p)/(-pmax+pcenter); + } + else + { + // (k*log(B)*scenter+log(-(-pcenter*B^k+pmax+p*B^k-p)/(-pmax+pcenter))-log(-(-pcenter*B^k+pmax+p*B^k-p)/(-pmax+pcenter))*scenter)/log(B)/k; + s = (kexp*log(base)*scenter+log(-(-pcenter*pow(base,kexp)+pmax+p*pow(base,kexp)-p)/(-pmax+pcenter))-log(-(-pcenter*pow(base,kexp)+pmax+p*pow(base,kexp)-p)/(-pmax+pcenter))*scenter)/log(base)/kexp; + } + } + + return s; + +} + +void paramInfoInit(param_info_t *pObj, UINT32 id, char *pName) +{ + pObj->id = id; + + pObj->pName = NULL; + if (pName) + { + pObj->pName = (char*)malloc(strlen(pName)+1); + memcpy(pObj->pName, pName, strlen(pName)+1); + } + + pObj->base = 1; + pObj->kexp = 1; + pObj->scenter = 0; + pObj->pmin = 0; + pObj->pcenter = 0; + pObj->pmax = 1; + pObj->pinterval = 0; + +} + +void paramInfoFree(param_info_t *pObj) +{ + if (pObj->pName) + free(pObj->pName); +} + + +void paramInfoSetPMIN(param_info_t *pObj, synth_float_t value) +{ + pObj->pmin = value; +} + +void paramInfoSetPMAX(param_info_t *pObj, synth_float_t value) +{ + pObj->pmax = value; +} + +void paramInfoSet(param_info_t *pObj, + synth_float_t base, + synth_float_t kexp, + synth_float_t scenter, + synth_float_t pmin, + synth_float_t pcenter, + synth_float_t pmax, + synth_float_t pinterval) +{ + pObj->base = base; + pObj->kexp = kexp; + pObj->scenter = scenter; + pObj->pmin = pmin; + pObj->pcenter = pcenter; + pObj->pmax = pmax; + pObj->pinterval = pinterval; +} + +void paramInfoCopy(param_info_t *pDst, param_info_t *pSrc) +{ + pDst->base = pSrc->base; + pDst->kexp = pSrc->kexp; + pDst->scenter = pSrc->scenter; + pDst->pmin = pSrc->pmin; + pDst->pcenter = pSrc->pcenter; + pDst->pmax = pSrc->pmax; + pDst->pinterval = pSrc->pinterval; +} + +param_info_t* getParamInfo(UINT32 type) +{ + UINT32 i; + + if (type >= SYNTH_NUM_PARAMS) + return NULL; + + for (i=0; i < SYNTH_NUM_PARAMS; i++) + { + if (param_info[i].id == type) + break; + } + + if (i == SYNTH_NUM_PARAMS) + return NULL; + + return (param_info_t*)¶m_info[i]; +} diff --git a/Source/synth/param_scale.h b/Source/synth/param_scale.h new file mode 100644 index 0000000..3023fec --- /dev/null +++ b/Source/synth/param_scale.h @@ -0,0 +1,188 @@ +// -------------------------------------------------------------- +// -------------------------------------------------------------- +#ifndef _PARAM_SCALE_H_ +#define _PARAM_SCALE_H_ + +#include "synth_types.h" + +enum +{ + SYNTH_PARAM_VOLUME = 0, + SYNTH_PARAM_TUNE, + SYNTH_PARAM_TOTAL_NUM_VOICES, + SYNTH_PARAM_VOICE_PAN_SPREAD, + SYNTH_PARAM_HUMANIZE_ENABLE, + SYNTH_PARAM_MONOPHONIC_ENABLE, + SYNTH_PARAM_MONOPHONIC_RETRIGGER_ENABLE, + SYNTH_PARAM_UNISONO_ENABLE, + SYNTH_PARAM_UNISONO_NUM_VOICES, + SYNTH_PARAM_HUMANIZE_VAR_VCO, + SYNTH_PARAM_HUMANIZE_VAR_VCF, + SYNTH_PARAM_HUMANIZE_VAR_ENV, + SYNTH_PARAM_PORTAMENTO_TIME, + SYNTH_PARAM_OSC_0_RESTART_ON_TRIGGER, + SYNTH_PARAM_OSC_1_RESTART_ON_TRIGGER, + SYNTH_PARAM_OSC_0_ENABLE, + SYNTH_PARAM_OSC_1_ENABLE, + SYNTH_PARAM_OSC_0_LEVEL, + SYNTH_PARAM_OSC_1_LEVEL, + SYNTH_PARAM_OSC_0_DUTYCYCLE, + SYNTH_PARAM_OSC_1_DUTYCYCLE, + SYNTH_PARAM_OSC_0_DETUNE, + SYNTH_PARAM_OSC_1_DETUNE, + SYNTH_PARAM_OSC_0_TRANSPOSE, + SYNTH_PARAM_OSC_1_TRANSPOSE, + SYNTH_PARAM_OSC_0_PB_RANGE_MIN, + SYNTH_PARAM_OSC_1_PB_RANGE_MIN, + SYNTH_PARAM_OSC_0_PB_RANGE_MAX, + SYNTH_PARAM_OSC_1_PB_RANGE_MAX, + SYNTH_PARAM_OSC_0_WAVEFORM, + SYNTH_PARAM_OSC_1_WAVEFORM, + SYNTH_PARAM_OSC_0_FM_AMT_0, + SYNTH_PARAM_OSC_1_FM_AMT_0, + SYNTH_PARAM_OSC_0_FM_AMT_1, + SYNTH_PARAM_OSC_1_FM_AMT_1, + SYNTH_PARAM_OSC_0_FM_SRC_0, + SYNTH_PARAM_OSC_1_FM_SRC_0, + SYNTH_PARAM_OSC_0_FM_SRC_1, + SYNTH_PARAM_OSC_1_FM_SRC_1, + SYNTH_PARAM_OSC_0_FM_SRC_OP, + SYNTH_PARAM_OSC_1_FM_SRC_OP, + SYNTH_PARAM_OSC_0_AM_AMT_0, + SYNTH_PARAM_OSC_1_AM_AMT_0, + SYNTH_PARAM_OSC_0_AM_AMT_1, + SYNTH_PARAM_OSC_1_AM_AMT_1, + SYNTH_PARAM_OSC_0_AM_SRC_0, + SYNTH_PARAM_OSC_1_AM_SRC_0, + SYNTH_PARAM_OSC_0_AM_SRC_1, + SYNTH_PARAM_OSC_1_AM_SRC_1, + SYNTH_PARAM_OSC_0_AM_SRC_OP, + SYNTH_PARAM_OSC_1_AM_SRC_OP, + SYNTH_PARAM_OSC_0_PWM_AMT_0, + SYNTH_PARAM_OSC_1_PWM_AMT_0, + SYNTH_PARAM_OSC_0_PWM_AMT_1, + SYNTH_PARAM_OSC_1_PWM_AMT_1, + SYNTH_PARAM_OSC_0_PWM_SRC_0, + SYNTH_PARAM_OSC_1_PWM_SRC_0, + SYNTH_PARAM_OSC_0_PWM_SRC_1, + SYNTH_PARAM_OSC_1_PWM_SRC_1, + SYNTH_PARAM_OSC_0_PWM_SRC_OP, + SYNTH_PARAM_OSC_1_PWM_SRC_OP, + SYNTH_PARAM_NOISE_ENABLE, + SYNTH_PARAM_NOISE_LEVEL, + SYNTH_PARAM_NOISE_SHAPE, + SYNTH_PARAM_VCA_ENV_AMT, + SYNTH_PARAM_VCA_AM_AMT_0, + SYNTH_PARAM_VCA_AM_SRC_0, + SYNTH_PARAM_VCA_PAN_AMT_0, + SYNTH_PARAM_VCA_PAN_SRC_0, + SYNTH_PARAM_ENV_0_A, SYNTH_PARAM_VCF_ENV_A = SYNTH_PARAM_ENV_0_A, + SYNTH_PARAM_ENV_1_A, SYNTH_PARAM_VCA_ENV_A = SYNTH_PARAM_ENV_1_A, + SYNTH_PARAM_ENV_2_A, + SYNTH_PARAM_ENV_3_A, + SYNTH_PARAM_ENV_0_D, SYNTH_PARAM_VCF_ENV_D = SYNTH_PARAM_ENV_0_D, + SYNTH_PARAM_ENV_1_D, SYNTH_PARAM_VCA_ENV_D = SYNTH_PARAM_ENV_1_D, + SYNTH_PARAM_ENV_2_D, + SYNTH_PARAM_ENV_3_D, + SYNTH_PARAM_ENV_0_S, SYNTH_PARAM_VCF_ENV_S = SYNTH_PARAM_ENV_0_S, + SYNTH_PARAM_ENV_1_S, SYNTH_PARAM_VCA_ENV_S = SYNTH_PARAM_ENV_1_S, + SYNTH_PARAM_ENV_2_S, + SYNTH_PARAM_ENV_3_S, + SYNTH_PARAM_ENV_0_R, SYNTH_PARAM_VCF_ENV_R = SYNTH_PARAM_ENV_0_R, + SYNTH_PARAM_ENV_1_R, SYNTH_PARAM_VCA_ENV_R = SYNTH_PARAM_ENV_1_R, + SYNTH_PARAM_ENV_2_R, + SYNTH_PARAM_ENV_3_R, + SYNTH_PARAM_VCF_TYPE, + SYNTH_PARAM_VCF_ORDER, + SYNTH_PARAM_VCF_F, + SYNTH_PARAM_VCF_Q, + SYNTH_PARAM_VCF_ENV_AMT, + SYNTH_PARAM_VCF_F_AMT_0, + SYNTH_PARAM_VCF_F_AMT_1, + SYNTH_PARAM_VCF_F_SRC_0, + SYNTH_PARAM_VCF_F_SRC_1, + SYNTH_PARAM_VCF_F_SRC_OP, + SYNTH_PARAM_VCF_Q_AMT_0, + SYNTH_PARAM_VCF_Q_AMT_1, + SYNTH_PARAM_VCF_Q_SRC_0, + SYNTH_PARAM_VCF_Q_SRC_1, + SYNTH_PARAM_VCF_Q_SRC_OP, + SYNTH_PARAM_LFO_0_SPEED, + SYNTH_PARAM_LFO_1_SPEED, + SYNTH_PARAM_LFO_2_SPEED, + SYNTH_PARAM_LFO_3_SPEED, + SYNTH_PARAM_LFO_0_SMOOTH, + SYNTH_PARAM_LFO_1_SMOOTH, + SYNTH_PARAM_LFO_2_SMOOTH, + SYNTH_PARAM_LFO_3_SMOOTH, + SYNTH_PARAM_LFO_0_DELAY, + SYNTH_PARAM_LFO_1_DELAY, + SYNTH_PARAM_LFO_2_DELAY, + SYNTH_PARAM_LFO_3_DELAY, + SYNTH_PARAM_LFO_0_ATTACK, + SYNTH_PARAM_LFO_1_ATTACK, + SYNTH_PARAM_LFO_2_ATTACK, + SYNTH_PARAM_LFO_3_ATTACK, + SYNTH_PARAM_LFO_0_SHAPE, + SYNTH_PARAM_LFO_1_SHAPE, + SYNTH_PARAM_LFO_2_SHAPE, + SYNTH_PARAM_LFO_3_SHAPE, + SYNTH_PARAM_LFO_0_MODE, + SYNTH_PARAM_LFO_1_MODE, + SYNTH_PARAM_LFO_2_MODE, + SYNTH_PARAM_LFO_3_MODE, + SYNTH_PARAM_LFO_0_SYNC, + SYNTH_PARAM_LFO_1_SYNC, + SYNTH_PARAM_LFO_2_SYNC, + SYNTH_PARAM_LFO_3_SYNC, + SYNTH_PARAM_LFO_0_SYMMETRY, + SYNTH_PARAM_LFO_1_SYMMETRY, + SYNTH_PARAM_LFO_2_SYMMETRY, + SYNTH_PARAM_LFO_3_SYMMETRY, + SYNTH_NUM_PARAMS +}; + +// -------------------------------------------------------------- +// Types +// -------------------------------------------------------------- +typedef struct _sparam_info_t +{ + UINT32 id; + char *pName; + synth_float_t base, kexp, scenter, pmin, pcenter, pmax, pinterval; + +} param_info_t; + +// -------------------------------------------------------------- +#if defined(__cplusplus) +extern "C" { +#endif + +// -------------------------------------------------------------- +// Exported functions +// -------------------------------------------------------------- +void paramInfoInit(param_info_t *pObj, UINT32 id, char *pName); +void paramInfoFree(param_info_t *pObj); +void paramInfoSetPMIN(param_info_t *pObj, synth_float_t value); +void paramInfoSetPMAX(param_info_t *pObj, synth_float_t value); +void paramInfoSet(param_info_t *pObj, + synth_float_t base, + synth_float_t kexp, + synth_float_t scenter, + synth_float_t pmin, + synth_float_t pcenter, + synth_float_t pmax, + synth_float_t pinterval); + +void paramInfoCopy(param_info_t *pDst, param_info_t *pSrc); +synth_float_t clampParam(param_info_t *pObj, synth_float_t p); +synth_float_t toParam(param_info_t *pObj, synth_float_t s); +synth_float_t toSlider(param_info_t *pObj, synth_float_t p); +param_info_t* getParamInfo(UINT32 type); + +#if defined(__cplusplus) +} +#endif +// -------------------------------------------------------------- + +#endif // _PARAM_SCALE_H_ diff --git a/Source/synth/sine.c b/Source/synth/sine.c new file mode 100644 index 0000000..afb0586 --- /dev/null +++ b/Source/synth/sine.c @@ -0,0 +1,97 @@ +// -------------------------------------------------------------- +// -------------------------------------------------------------- + +#include +#include +#include +#include + +#include "synth_defs.h" +#include "sine.h" + +// -------------------------------------------------------------- +// internal funcs +// -------------------------------------------------------------- + +// -------------------------------------------------------------- +// Exported functions +// -------------------------------------------------------------- +void Sine_Init(sine_gen_t *pObj, synth_float_t fs) +{ + Sine_SetFS(pObj, fs); + Sine_Prepare(pObj); +} + +void Sine_Free(sine_gen_t *pObj) +{ +} + +void Sine_SetFS(sine_gen_t *pObj, synth_float_t fs) +{ + pObj->fs = SINE_OVERSAMPLING*fs; + pObj->pitch = -1; +} + +void Sine_Reset(sine_gen_t *pObj, synth_float_t phase) +{ + pObj->y[0] = cos(2*pi*phase); + pObj->y[1] = sin(2*pi*phase); + pObj->fscale = 1; +} + +void Sine_Start(sine_gen_t *pObj) +{ + pObj->pitch = -1; + pObj->CV_fm = -1; +} + +void Sine_Prepare(sine_gen_t *pObj) +{ + Sine_Reset(pObj, (synth_float_t)rand()/RAND_MAX); +} + +void Sine_Update(sine_gen_t *pObj) +{ + synth_float_t freq; + freq = pObj->fscale * pObj->pitch; + pObj->b = 2.0 * sin(freq*pi / pObj->fs); +} + +synth_float_t Sine_Process_Scalar(sine_gen_t *pObj, synth_float_t pitch, synth_float_t CV_fm) +{ + int i; + + synth_float_t a, phi; + + // ToDo: amplitude drift correction + // y[0]^2 + y[1]^2 = a; + + if (pObj->CV_fm != CV_fm) + { + pObj->CV_fm = CV_fm; + pObj->fscale = (synth_float_t)pow((synth_float_t)2, CV_fm); + Sine_Update(pObj); + } + + if (pObj->pitch != pitch) + { + pObj->pitch = pitch; + Sine_Update(pObj); + } + + for (i=0; i < SINE_OVERSAMPLING; i++) + { + pObj->y[0] = pObj->y[0] - pObj->b*pObj->y[1]; + pObj->y[1] = pObj->y[1] + pObj->b*pObj->y[0]; + } + + a = pObj->y[0]*pObj->y[0] + pObj->y[1]*pObj->y[1]; + if (fabs(a - 1) > 0.5) + { + phi = atan2(pObj->y[0], pObj->y[1]); + pObj->y[0] = sin(phi); + pObj->y[1] = cos(phi); + } + return -pObj->y[0]; +} + diff --git a/Source/synth/sine.h b/Source/synth/sine.h new file mode 100644 index 0000000..1e7501a --- /dev/null +++ b/Source/synth/sine.h @@ -0,0 +1,43 @@ +// -------------------------------------------------------------- +// -------------------------------------------------------------- +#ifndef _SINE_H_ +#define _SINE_H_ + +#include "synth_defs.h" + +#define SINE_OVERSAMPLING 3 + +// -------------------------------------------------------------- +// Types +// -------------------------------------------------------------- +typedef struct _ssine_gen_t +{ + synth_float_t fs, fscale, pitch, CV_fm; + synth_float_t b, y[2]; + +} sine_gen_t; + +// -------------------------------------------------------------- +#if defined(__cplusplus) +extern "C" { +#endif + +// -------------------------------------------------------------- +// Exported functions +// -------------------------------------------------------------- +void Sine_Init(sine_gen_t *pObj, synth_float_t fs); +void Sine_Free(sine_gen_t *pObj); +void Sine_SetFS(sine_gen_t *pObj, synth_float_t fs); +void Sine_Reset(sine_gen_t *pObj, synth_float_t phi); +void Sine_Prepare(sine_gen_t *pObj); +void Sine_Start(sine_gen_t *pObj); +void Sine_Update(sine_gen_t *pObj); +synth_float_t Sine_Process_Scalar(sine_gen_t *pObj, synth_float_t pitch, synth_float_t CV_fm); + +#if defined(__cplusplus) +} + +#endif +// -------------------------------------------------------------- + +#endif // _SINE_H_ diff --git a/Source/synth/smooth.c b/Source/synth/smooth.c new file mode 100644 index 0000000..465a29c --- /dev/null +++ b/Source/synth/smooth.c @@ -0,0 +1,129 @@ +// -------------------------------------------------------------- +// -------------------------------------------------------------- +#include +#include +#include + +#include "synth_defs.h" +#include "smooth.h" + +// -------------------------------------------------------------- +// Exported functions +// -------------------------------------------------------------- +void Smooth_Update(smooth_t *pObj) +{ + pObj->a_r = (synth_float_t)1/(pObj->fs*pObj->T_r*SMOOTH_KE); + pObj->a_f = (synth_float_t)1/(pObj->fs*pObj->T_f); +} + +void Smooth_Init(smooth_t *pObj, synth_float_t fs, synth_float_t T_r, synth_float_t T_f, synth_float_t inital_value) +{ + pObj->fs = fs; + pObj->T_r = T_r; + pObj->T_f = T_f; + pObj->y = inital_value; + Smooth_Update(pObj); +} + +void Smooth_Free(smooth_t *pObj) +{ +} + +void Smooth_SetValue(smooth_t *pObj, synth_float_t value) +{ + pObj->y = value; +} + +void Smooth_SetFS(smooth_t *pObj, synth_float_t fs) +{ + pObj->fs = fs; + Smooth_Update(pObj); +} + +void Smooth_SetT(smooth_t *pObj, synth_float_t T_r, synth_float_t T_f) +{ + pObj->T_r = T_r; + pObj->T_f = T_f; + Smooth_Update(pObj); +} + +synth_float_t Smooth_ProcessScalar(smooth_t *pObj, synth_float_t x_hard, synth_float_t in) +{ + if (pObj->y < x_hard) + pObj->y += pObj->a_r*(x_hard - pObj->y); + else + pObj->y += pObj->a_f*(x_hard - pObj->y); + + return pObj->y*in; +} + +void Smooth_Process_VV(smooth_t *pObj, synth_float_t x_hard, synth_float_t *pIn, synth_float_t *pOut, UINT32 len) +{ + UINT32 i; + + if (Smooth_is_settled(pObj, x_hard) && (fabs(x_hard) < 1E-18)) + { + for (i = 0; i < len; i++) + { + pOut[i] = 0; + } + return; + } + + if (Smooth_is_settled(pObj, x_hard)) + { + for (i = 0; i < len; i++) + { + pOut[i] = x_hard*pIn[i]; + } + return; + } + + for (i = 0; i < len; i++) + { + if (pObj->y < x_hard) + pObj->y += pObj->a_r*(x_hard - pObj->y); + else + pObj->y += pObj->a_f*(x_hard - pObj->y); + + pOut[i] = pObj->y*pIn[i]; + } +} + +void Smooth_Process_V(smooth_t *pObj, synth_float_t x_hard, synth_float_t *pOut, UINT32 len) +{ + UINT32 i; + + if (Smooth_is_settled(pObj, x_hard) && (fabs(x_hard) < 1E-18)) + { + for (i = 0; i < len; i++) + { + pOut[i] = 0; + } + return; + } + + if (Smooth_is_settled(pObj, x_hard)) + { + for (i = 0; i < len; i++) + { + pOut[i] = x_hard; + } + return; + } + + for (i = 0; i < len; i++) + { + if (pObj->y < x_hard) + pObj->y += pObj->a_r*(x_hard - pObj->y); + else + pObj->y += pObj->a_f*(x_hard - pObj->y); + + pOut[i] = pObj->y; + } +} + +UINT32 Smooth_is_settled(smooth_t *pObj, synth_float_t x_hard) +{ + return (fabs(pObj->y - x_hard) < SMOOTH_TOL); +} diff --git a/Source/synth/smooth.h b/Source/synth/smooth.h new file mode 100644 index 0000000..d99c2ff --- /dev/null +++ b/Source/synth/smooth.h @@ -0,0 +1,46 @@ +// -------------------------------------------------------------- +// -------------------------------------------------------------- +#ifndef _SMOOTH_H_ +#define _SMOOTH_H_ + +#include "synth_defs.h" + +#define SMOOTH_TOL ((synth_float_t)(1E-4)) +#define SMOOTH_KE ((synth_float_t)(1-exp(-1))) + +// -------------------------------------------------------------- +// Types +// -------------------------------------------------------------- +typedef struct _ssmooth_t +{ + synth_float_t y, fs; + synth_float_t T_r, a_r; + synth_float_t T_f, a_f; + +} smooth_t; + +// -------------------------------------------------------------- +#if defined(__cplusplus) +extern "C" { +#endif + +// -------------------------------------------------------------- +// Exported functions +// -------------------------------------------------------------- +void Smooth_Init(smooth_t *pObj, synth_float_t fs, synth_float_t T_r, synth_float_t T_f, synth_float_t inital_value); +void Smooth_Free(smooth_t *pObj); +void Smooth_SetValue(smooth_t *pObj, synth_float_t value); +void Smooth_SetFS(smooth_t *pObj, synth_float_t fs); +void Smooth_SetT(smooth_t *pObj, synth_float_t T_r, synth_float_t T_f); +synth_float_t Smooth_ProcessScalar(smooth_t *pObj, synth_float_t x_hard, synth_float_t in); +void Smooth_Process_VV(smooth_t *pObj, synth_float_t x_hard, synth_float_t *pIn, synth_float_t *pOut, UINT32 len); +void Smooth_Process_V(smooth_t *pObj, synth_float_t x_hard, synth_float_t *pOut, UINT32 len); +UINT32 Smooth_is_settled(smooth_t *pObj, synth_float_t x_hard); + +#if defined(__cplusplus) +} + +#endif +// -------------------------------------------------------------- + +#endif // _SMOOTH_H_ diff --git a/Source/synth/synth_debug.c b/Source/synth/synth_debug.c new file mode 100644 index 0000000..5942de9 --- /dev/null +++ b/Source/synth/synth_debug.c @@ -0,0 +1,33 @@ +// -------------------------------------------------------------- +// -------------------------------------------------------------- + +#include +#include +#include +#include + + +// -------------------------------------------------------------- +// internal funcs + +// -------------------------------------------------------------- +// Exported functions +// -------------------------------------------------------------- +void SynthDebug(char *fmtstr, ...) +{ +#ifndef SYNTH_DEBUG + + /* Empty body, so a good compiler will optimise calls + to pmesg away */ +#else + + char buf[1024]; + va_list args; + + va_start(args, fmtstr); + vsprintf(buf, fmtstr, args); + va_end(args); + OutputDebugString(buf); + +#endif /* SYNTH_DEBUG */ +} diff --git a/Source/synth/synth_defs.h b/Source/synth/synth_defs.h new file mode 100644 index 0000000..f235510 --- /dev/null +++ b/Source/synth/synth_defs.h @@ -0,0 +1,79 @@ +// -------------------------------------------------------------- +// -------------------------------------------------------------- +#ifndef _SYNTH_DEFS_H_ +#define _SYNTH_DEFS_H_ + +#include "synth_types.h" + +// -------------------------------------------------------------- +// Defs +// -------------------------------------------------------------- +#define GAIN_EPSILON 10.0 +#define MAX_POLYPHONY 256 + +#define SYNTH_BANDWIDTH 0.833 + +#define NUM_PROGRAMS 64 +#define NUM_FREQS 128 +#define NUM_MIDI_CONTROLLERS 128 + +#define VOICE_NUM_OSC 2 +#define VOICE_NUM_LFO 4 +#define VOICE_NUM_ENV 4 + +#define FILTER_ORDER 2 +#define FILTER_SWEEP_BASE ((synth_float_t)10) +#define FILTER_MAX_ORDER 4 +#define FILTER_F_MIN ((synth_float_t)18) +#define FILTER_F_MAX ((synth_float_t)18000) +#define FILTER_Q_MIN 0.7 +#define FILTER_Q_MAX 100 +#define FILTER_TABLE_SIZE (4096) +#define FILTER_INTEROLATION_ORDER 1 + +#define BLIT_NUM_HARM_MAX (900) +#define BLIT_TABLE_SIZE_MIN (1024) +#define BLIT_TABLE_SIZE_MAX (4096) +#define BLIT_TABLE_OVERSAMPLING (4) +#define BLIT_INTEROLATION_ORDER (2) + +#define SYNTH_LIMITER_RISE_TIME 0.001 //s +#define SYNTH_LIMITER_FALL_TIME 1.000 //s +#define SYNTH_LIMITER_THRESHOLD 3 // dbFS + +#define SYNTH_MAX_BUFSIZE 8192 + +#ifndef pi +#define pi 3.1415926535897932384626433832795 +#define pi_mult_2 (2*pi) +#define pi_div_2 (0.5*pi) +#endif + +#if defined(__cplusplus) +extern "C" { +#endif +void SynthDebug(char *fmtstr, ...); +#if defined(__cplusplus) +} +#endif + +#ifndef max +#define max(a,b) (((a) > (b)) ? (a) : (b)) +#endif + +#ifndef min +#define min(a,b) (((a) < (b)) ? (a) : (b)) +#endif + + +#include "voice.h" +#include "vco.h" +#include "noise.h" +#include "smooth.h" +#include "vcf.h" +#include "lfo.h" +#include "env.h" +#include "param_scale.h" + +#endif // _SYNTH_DEFS_H_ + diff --git a/Source/synth/synth_types.h b/Source/synth/synth_types.h new file mode 100644 index 0000000..ac8043f --- /dev/null +++ b/Source/synth/synth_types.h @@ -0,0 +1,38 @@ +// -------------------------------------------------------------- +// -------------------------------------------------------------- +#ifndef _SYNTH_TYPES_H_ +#define _SYNTH_TYPES_H_ + +// -------------------------------------------------------------- +// Types +// -------------------------------------------------------------- +#define synth_float_t double + +#ifndef UINT32 +#define UINT32 unsigned int +#endif + +#ifndef INT32 +#define INT32 signed int +#endif + +#ifndef UINT16 +#define UINT16 unsigned short +#endif + +#ifndef INT16 +#define INT16 signed short +#endif + +//#define SYNTH_DOUBLE_PRECISION 1 + +//typedef struct _ssynth_gbl_data_t +//{ +// synth_float_t **osc_ppH; +// iir_coef_t **ppIIR_coef; + +//} synth_gbl_data_t; + +//extern synth_gbl_data_t g_synth_data; + +#endif // _SYNTH_TYPES_H_ diff --git a/Source/synth/vcf.c b/Source/synth/vcf.c new file mode 100644 index 0000000..a8e3fd4 --- /dev/null +++ b/Source/synth/vcf.c @@ -0,0 +1,485 @@ +/*************************************************************************/ +/* vcf.c */ +/*************************************************************************/ +#include +#include +#include + +#include "synth_defs.h" +#include "vcf.h" +#include "fast_trig/fast_trig.h" + +/*************************************************************************/ +/* Global Variables */ +/*************************************************************************/ + +/******************************************************************************/ +void VCF_Init(vcf_t *pObj, UINT32 id, vcf_common_t *pCom, synth_float_t fs) +{ + pObj->pCom = pCom; + pObj->id = id; + pObj->fs = fs; + + if (id == 0) + { + VCF_ModInit(pObj); + } + + pObj->pOut = NULL; + pObj->pCoef = NULL; + pObj->bufsize = 0; + VCF_SetType(pObj, VCF_FILTERTYPE_LOWPASS); + VCF_SetOrder(pObj, 4); + pObj->req_filter_update = 0; + + + VCF_clear_state(pObj); + VCF_SetBufsize(pObj, SYNTH_MAX_BUFSIZE); + VCF_FilterParamUpdate(pObj); + VCF_SetF(pObj, 20000); + VCF_SetQ(pObj, 1); +} + +void VCF_Free(vcf_t *pObj) +{ + VCF_SetBufsize(pObj, 0); + + if (pObj->id == 0) + { + VCF_ModFree(pObj); + } + +} + +void VCF_ModInit(vcf_t *pObj) +{ + vcf_common_t *pCom = pObj->pCom; + + pCom->pLUT_cos = (synth_float_t*)malloc(FILTER_TABLE_SIZE*sizeof(synth_float_t)); + pCom->pLUT_sin = (synth_float_t*)malloc(FILTER_TABLE_SIZE*sizeof(synth_float_t)); +} + +void VCF_ModFree(vcf_t *pObj) +{ + vcf_common_t *pCom = pObj->pCom; + + free(pCom->pLUT_cos); + free(pCom->pLUT_sin); +} + +void VCF_LUT_gen(vcf_t *pObj) +{ + int i; + synth_float_t cv, omega; + vcf_common_t *pCom = pObj->pCom; + + for (i=0; i < FILTER_TABLE_SIZE; i++) + { + cv = (synth_float_t)i/(FILTER_TABLE_SIZE-1); + omega = VCF_cv2omega(pObj, cv); + pCom->pLUT_cos[i] = cos(pi*omega); + pCom->pLUT_sin[i] = sin(pi*omega); + } +} + +void VCF_FilterParamUpdate(vcf_t *pObj) +{ + pObj->omega_max = 2*FILTER_F_MAX/pObj->fs; + pObj->omega_min = 2*FILTER_F_MIN/pObj->fs; + pObj->num_octaves = log(FILTER_F_MAX/FILTER_F_MIN)/log(FILTER_SWEEP_BASE); + + if (pObj->id == 0) + { + VCF_LUT_gen(pObj); + } +} + +synth_float_t VCF_LUT_get_cos(vcf_t *pObj, synth_float_t cv) +{ + int ni, ni_next; + synth_float_t n, nf; + vcf_common_t *pCom = pObj->pCom; + + n = min(1, max(0, cv))*(FILTER_TABLE_SIZE-1); + ni = (int)n; + nf = n - (synth_float_t)ni; + ni_next = min(FILTER_TABLE_SIZE-1, ni+1); + + return (pCom->pLUT_cos[ni_next] - pCom->pLUT_cos[ni])*nf + pCom->pLUT_cos[ni]; +} + +synth_float_t VCF_LUT_get_sin(vcf_t *pObj, synth_float_t cv) +{ + int ni, ni_next; + synth_float_t n, nf; + vcf_common_t *pCom = pObj->pCom; + + n = min(1, max(0, cv))*(FILTER_TABLE_SIZE-1); + ni = (int)n; + nf = n - (synth_float_t)ni; + ni_next = min(FILTER_TABLE_SIZE-1, ni+1); + + return (pCom->pLUT_sin[ni_next] - pCom->pLUT_sin[ni])*nf + pCom->pLUT_sin[ni]; +} + +void VCF_SetBufsize(vcf_t *pObj, UINT32 size) +{ + if (pObj->bufsize == size) + return; + + pObj->bufsize = size; + + if (pObj->pOut) + free(pObj->pOut); + + if (pObj->pCoef) + free(pObj->pCoef); + + pObj->pOut = NULL; + pObj->pCoef = NULL; + + if (!size) + return; + + pObj->pOut = (synth_float_t*)malloc(pObj->bufsize*sizeof(synth_float_t)); + pObj->pCoef = (vcf_coef_t*)malloc(pObj->bufsize*sizeof(vcf_coef_t)); + pObj->pCoeff_last = pObj->pCoef; + VCF_Coeff_update(pObj); + +} + +void VCF_SetFS(vcf_t *pObj, synth_float_t fs) +{ + pObj->fs = fs; + VCF_FilterParamUpdate(pObj); + pObj->req_filter_update = 1; +} + +void VCF_SetF(vcf_t *pObj, synth_float_t f) +{ + if (f > pObj->fs/2) + f = FILTER_F_MAX; + + if (f < FILTER_F_MIN) + f = FILTER_F_MIN; + + if (f < 0) + f = FILTER_F_MIN; + + pObj->cv_f_bias = VCF_omega2cv(pObj, 2*f/pObj->fs); + pObj->req_filter_update = 1; +} + +void VCF_SetQ(vcf_t *pObj, synth_float_t q) +{ + pObj->cv_q_bias = max(FILTER_Q_MIN, q); + pObj->req_filter_update = 1; +} + +void VCF_SetType(vcf_t *pObj, UINT32 type) +{ + pObj->type = type; + VCF_SetQ(pObj, pObj->cv_q_bias); + + VCF_Coeff_update(pObj); +} + +synth_float_t IIRCalcQp(unsigned p, unsigned N) +{ + return 1.0f/(synth_float_t)(2*sin(pi*(2*p-1)/(2*N))); +} + +void VCF_SetOrder(vcf_t *pObj, UINT32 order) +{ + UINT32 p; + + if (pObj->order == order) + return; + + if (order % 2) + return; + + if (order > FILTER_MAX_ORDER) + return; + + pObj->order = order; + pObj->num_sections = pObj->order/2; + + for(p=0; p < pObj->num_sections; p++) + { + pObj->pQP_inv[p] = (synth_float_t)1.0/IIRCalcQp(p+1, pObj->order); + } + VCF_clear_state(pObj); + VCF_SetQ(pObj, pObj->cv_q_bias); + VCF_Coeff_update(pObj); +} + +void VCF_Coeff_update(vcf_t *pObj) +{ + pObj->req_filter_update = 1; +} + +void VCF_clear_state(vcf_t *pObj) +{ + UINT32 p; + + for(p=0; p < pObj->num_sections; p++) + { + pObj->pState[p].xn1 = 0; + pObj->pState[p].xn2 = 0; + pObj->pState[p].yn1 = 0; + pObj->pState[p].yn2 = 0; + } + VCF_Coeff_update(pObj); +} + +synth_float_t VCF_omega2cv(vcf_t *pObj, synth_float_t omega) +{ + synth_float_t cv; + + cv = log(omega/pObj->omega_min)/(pObj->num_octaves * log(FILTER_SWEEP_BASE)); + return min(1, max(0, cv)); +} + +synth_float_t VCF_cv2omega(vcf_t *pObj, synth_float_t cv) +{ + synth_float_t omega; + + omega = pObj->omega_min*pow(FILTER_SWEEP_BASE, pObj->num_octaves*min(1, max(0, cv))); + return omega; +} + +void VCF_CalcCoeff_LPF(vcf_t *pObj, vcf_coef_t *pCoeff, synth_float_t *pCV_f, synth_float_t *pCV_q, UINT32 len) +{ + synth_float_t a0_inv; + synth_float_t alpha, ks, kc, Q_inv, q, cv; + unsigned p, n, filter_changed; + + ks = 0; + kc = 0; + Q_inv = 0; + for(n=0; n < len; n++) + { + filter_changed = pObj->req_filter_update; + + if (fabs(pObj->cv_f_last - pCV_f[n]) > FILTER_RECALC_F_THRESH) + filter_changed = 1; + + if (fabs(pObj->cv_q_last - pCV_q[n]) > FILTER_RECALC_Q_THRESH) + filter_changed = 1; + + if (filter_changed) + { + pObj->req_filter_update = 0; + pObj->cv_f_last = pCV_f[n]; + cv = pObj->cv_f_bias + pCV_f[n]; + ks = VCF_LUT_get_sin(pObj, cv); + kc = VCF_LUT_get_cos(pObj, cv); + q = min(FILTER_Q_MAX, max(FILTER_Q_MIN, pObj->cv_q_bias + FILTER_Q_MAX*pCV_q[n])); + pObj->cv_q_last = q; + if (pObj->order == 2) + q *= q; + + Q_inv = (synth_float_t)1.0/q; + pObj->pCoeff_last = pCoeff; + } + + for(p=0; p < pObj->num_sections; p++) + { + if (filter_changed) + { + alpha = 0.5f*ks * Q_inv * pObj->pQP_inv[p]; + a0_inv = (synth_float_t)1.0/(1 + alpha); + + (*pCoeff).ak1 = -2.0f*kc *a0_inv; + (*pCoeff).ak2 = (1 - alpha) *a0_inv; + + (*pCoeff).bk1 = (1 - kc) *a0_inv; + (*pCoeff).bk0 = 0.5f*(1 - kc) *a0_inv; + (*pCoeff).bk2 = (*pCoeff).bk0; + } + else + { + *pCoeff = pObj->pCoeff_last[p]; + } + pCoeff++; + } + } +} + + +void VCF_CalcCoeff_HPF(vcf_t *pObj, vcf_coef_t *pCoeff, synth_float_t *pCV_f, synth_float_t *pCV_q, UINT32 len) +{ + synth_float_t a0_inv; + synth_float_t alpha, ks, kc, Q_inv, q, cv; + unsigned p, n, filter_changed; + + ks = 0; + kc = 0; + Q_inv = 0; + for(n=0; n < len; n++) + { + filter_changed = pObj->req_filter_update; + + if (fabs(pObj->cv_f_last - pCV_f[n]) > FILTER_RECALC_F_THRESH) + filter_changed = 1; + + if (fabs(pObj->cv_q_last - pCV_q[n]) > FILTER_RECALC_Q_THRESH) + filter_changed = 1; + + if (filter_changed) + { + pObj->req_filter_update = 0; + pObj->cv_f_last = pCV_f[n]; + cv = pObj->cv_f_bias + pCV_f[n]; + ks = VCF_LUT_get_sin(pObj, cv); + kc = VCF_LUT_get_cos(pObj, cv); + q = min(FILTER_Q_MAX, max(FILTER_Q_MIN, pObj->cv_q_bias + FILTER_Q_MAX*pCV_q[n])); + pObj->cv_q_last = q; + if (pObj->order == 2) + q *= q; + + Q_inv = (synth_float_t)1.0/q; + pObj->pCoeff_last = pCoeff; + } + + for(p=0; p < pObj->num_sections; p++) + { + if (filter_changed) + { + alpha = 0.5f*ks * Q_inv * pObj->pQP_inv[p]; + a0_inv = (synth_float_t)1.0/(1 + alpha); + + (*pCoeff).ak1 = -2.0f*kc *a0_inv; + (*pCoeff).ak2 = (1 - alpha) *a0_inv; + + (*pCoeff).bk1 = - (1 + kc) *a0_inv; + (*pCoeff).bk0 = 0.5f*(1 + kc) *a0_inv; + (*pCoeff).bk2 = (*pCoeff).bk0; + } + else + { + *pCoeff = pObj->pCoeff_last[p]; + } + pCoeff++; + } + } +} + + +void VCF_CalcCoeff_BPF(vcf_t *pObj, vcf_coef_t *pCoeff, synth_float_t *pCV_f, synth_float_t *pCV_q, UINT32 len) +{ + synth_float_t a0_inv; + synth_float_t alpha, ks, kc, Q_inv, q, cv; + unsigned p, n, filter_changed; + + ks = 0; + kc = 0; + Q_inv = 0; + for(n=0; n < len; n++) + { + filter_changed = pObj->req_filter_update; + + if (fabs(pObj->cv_f_last - pCV_f[n]) > FILTER_RECALC_F_THRESH) + filter_changed = 1; + + if (fabs(pObj->cv_q_last - pCV_q[n]) > FILTER_RECALC_Q_THRESH) + filter_changed = 1; + + if (filter_changed) + { + pObj->req_filter_update = 0; + pObj->cv_f_last = pCV_f[n]; + cv = pObj->cv_f_bias + pCV_f[n]; + ks = VCF_LUT_get_sin(pObj, cv); + kc = VCF_LUT_get_cos(pObj, cv); + q = min(FILTER_Q_MAX, max(FILTER_Q_MIN, pObj->cv_q_bias + FILTER_Q_MAX*pCV_q[n])); + pObj->cv_q_last = q; + if (pObj->order == 2) + q *= q; + + Q_inv = (synth_float_t)1.0/q; + pObj->pCoeff_last = pCoeff; + } + + for(p=0; p < pObj->num_sections; p++) + { + if (filter_changed) + { + alpha = 0.5f*ks * Q_inv * pObj->pQP_inv[p]; + a0_inv = (synth_float_t)1.0/(1 + alpha); + + (*pCoeff).ak1 = -2.0f*kc *a0_inv; + (*pCoeff).ak2 = (1 - alpha) *a0_inv; + + (*pCoeff).bk1 = 0; + (*pCoeff).bk0 = 0.5*ks *a0_inv; + (*pCoeff).bk2 = -(*pCoeff).bk0; + } + else + { + *pCoeff = pObj->pCoeff_last[p]; + } + pCoeff++; + } + } +} + +void VCF_CalcCoeff(vcf_t *pObj, vcf_coef_t *pCoeff, synth_float_t *pFG, synth_float_t *pQ, UINT32 len) +{ + switch(pObj->type) + { + case VCF_FILTERTYPE_LOWPASS: + VCF_CalcCoeff_LPF(pObj, pCoeff, pFG, pQ, len); + break; + + case VCF_FILTERTYPE_HIGHPASS: + VCF_CalcCoeff_HPF(pObj, pCoeff, pFG, pQ, len); + break; + + case VCF_FILTERTYPE_BANDPASS: + VCF_CalcCoeff_BPF(pObj, pCoeff, pFG, pQ, len); + break; + + default: + VCF_CalcCoeff_LPF(pObj, pCoeff, pFG, pQ, len); + break; + } + +} + +synth_float_t* VCF_ProcessDataV(vcf_t *pObj, synth_float_t *pCV_f, synth_float_t *pCV_q, synth_float_t *pX, UINT32 len) +{ + synth_float_t xp, yp, *pY; + unsigned i, p; + vcf_state_t *pState = pObj->pState; + vcf_coef_t *pCoeff; + + VCF_CalcCoeff(pObj, pObj->pCoef, pCV_f, pCV_q, len); + + pCoeff = pObj->pCoef; + + yp = 0; + pY = pObj->pOut; + for (i=0; inum_sections; p++) + { + yp = (*pCoeff).bk0*xp + + (*pCoeff).bk1*pState[p].xn1 + + (*pCoeff).bk2*pState[p].xn2 + - (*pCoeff).ak1*pState[p].yn1 + - (*pCoeff).ak2*pState[p].yn2; + pCoeff++; + + pState[p].yn2 = pState[p].yn1; + pState[p].yn1 = yp; + pState[p].xn2 = pState[p].xn1; + pState[p].xn1 = xp; + xp = yp; + } + pY[i] = yp; + } + return pObj->pOut; +} diff --git a/Source/synth/vcf.h b/Source/synth/vcf.h new file mode 100644 index 0000000..86872a0 --- /dev/null +++ b/Source/synth/vcf.h @@ -0,0 +1,109 @@ +// -------------------------------------------------------------- +// -------------------------------------------------------------- +#ifndef _FILTER_H_ +#define _FILTER_H_ + +#include "synth_defs.h" + +#define FILTER_RECALC_F_THRESH (0.000) +#define FILTER_RECALC_Q_THRESH (0.000) + +// -------------------------------------------------------------- +// Types +// -------------------------------------------------------------- +enum +{ + VCF_FILTERTYPE_LOWPASS = 0, + VCF_FILTERTYPE_HIGHPASS, + VCF_FILTERTYPE_BANDPASS, + VCF_NUM_FILTERTYPES +}; + +enum +{ + VCF_FILTERORDER_2 = 0, + VCF_FILTERORDER_4, + VCF_NUM_FILTERORDER +}; + +typedef struct _svcf_coef_t +{ + + synth_float_t ak0, ak1, ak2; + synth_float_t bk0, bk1, bk2; + +} vcf_coef_t; + +typedef struct _svcf_state_t +{ + + synth_float_t xn1, xn2; + synth_float_t yn1, yn2; + +} vcf_state_t; + +typedef struct _svcf_common_t +{ + synth_float_t *pLUT_cos; + synth_float_t *pLUT_sin; + +} vcf_common_t; + +typedef struct _svcf_t +{ + vcf_common_t *pCom; + UINT32 id; + UINT32 type; + UINT32 order; + UINT32 num_sections; + synth_float_t fs; + vcf_coef_t *pCoef; + vcf_coef_t *pCoeff_last; + vcf_state_t pState[FILTER_MAX_ORDER/2]; + synth_float_t pQP_inv[FILTER_MAX_ORDER/2]; + synth_float_t *pOut; + synth_float_t cv_f_bias; + synth_float_t cv_q_bias; + synth_float_t cv_f_last; + synth_float_t cv_q_last; + UINT32 req_filter_update; + UINT32 bufsize; + synth_float_t num_octaves; + synth_float_t omega_min; + synth_float_t omega_max; + +} vcf_t; + +// -------------------------------------------------------------- +#if defined(__cplusplus) +extern "C" { +#endif + +// -------------------------------------------------------------- +// Exported functions +// -------------------------------------------------------------- +void VCF_ModInit(vcf_t *pObj); +void VCF_ModFree(vcf_t *pObj); +void VCF_Init(vcf_t *pObj, UINT32 id, vcf_common_t *pCom, synth_float_t fs); +void VCF_Free(vcf_t *pObj); +void VCF_SetBufsize(vcf_t *pObj, UINT32 bufsize); +void VCF_FilterParamUpdate(vcf_t *pObj); +void VCF_Coeff_update(vcf_t *pObj); +void VCF_SetFS(vcf_t *pObj, synth_float_t fs); +void VCF_SetF(vcf_t *pObj, synth_float_t f); +void VCF_SetQ(vcf_t *pObj, synth_float_t q); +void VCF_SetType(vcf_t *pObj, UINT32 type); +void VCF_SetOrder(vcf_t *pObj, UINT32 order); +synth_float_t VCF_cv2omega(vcf_t *pObj, synth_float_t omega); +synth_float_t VCF_omega2cv(vcf_t *pObj, synth_float_t cv); +void VCF_clear_state(vcf_t *pObj); +void VCF_CalcCoeff(vcf_t *pObj, vcf_coef_t *pCoeff, synth_float_t *pCV_f, synth_float_t *pCV_q, UINT32 len); +synth_float_t* VCF_ProcessDataV(vcf_t *pObj, synth_float_t *pCV_f, synth_float_t *pCV_q, synth_float_t *pX, UINT32 len); + +#if defined(__cplusplus) +} + +#endif +// -------------------------------------------------------------- + +#endif // _FILTER_H_ diff --git a/Source/synth/vco.c b/Source/synth/vco.c new file mode 100644 index 0000000..f2e782d --- /dev/null +++ b/Source/synth/vco.c @@ -0,0 +1,209 @@ +// -------------------------------------------------------------- +// -------------------------------------------------------------- +#include +#include +#include + +#include "synth_defs.h" +#include "blit.h" +#include "vco.h" +#include "wavetable.h" +#include "fir/fir2.h" + +extern unsigned char _g_wave_rawdata[38400]; +extern wt_descr_t _g_wt_descr[WT_NUM_WAVETABLES]; + +// -------------------------------------------------------------- +// internal funcs +// -------------------------------------------------------------- +// -------------------------------------------------------------- +// Exported functions +// -------------------------------------------------------------- +void VCO_ModInit(vco_common_t *pCom) +{ + BLIT_ModInit(&pCom->blit); +} + +void VCO_ModFree(vco_common_t *pCom) +{ + BLIT_ModFree(&pCom->blit); +} + +void VCO_Init(osc_t *pObj, UINT32 id, vco_common_t *pCom, synth_float_t fs) +{ + pObj->pCom = pCom; + pObj->id = id; + pObj->fs = fs; + + if (pObj->id == 0) + { + VCO_ModInit(pCom); + } + + pObj->pOut = NULL; + pObj->bufsize = 0; + VCO_SetBufsize(pObj, SYNTH_MAX_BUFSIZE); + + pObj->param[OSC_PARAM2_WAVEFORM] = OSC_WAVEFORM_SAWTOOTH; + + Sine_Init(&pObj->sine, fs); + BLIT_Init(&pObj->blep, &pCom->blit, fs); + WT_Init(&pObj->wt, id, &pCom->wt, fs); + pObj->impulse = 10; +} + +void VCO_Free(osc_t *pObj) +{ + Sine_Free(&pObj->sine); + BLIT_Free(&pObj->blep); + WT_Free(&pObj->wt); + + VCO_SetBufsize(pObj, 0); + + if (pObj->id == 0) + { + VCO_ModFree(pObj->pCom); + } +} + +void VCO_SetFS(osc_t *pObj, synth_float_t fs) +{ + pObj->fs = fs; + Sine_SetFS(&pObj->sine, fs); + BLIT_SetFS(&pObj->blep, fs); + WT_SetFS(&pObj->wt, fs); + +} + +void VCO_SetBufsize(osc_t *pObj, UINT32 size) +{ + BLIT_SetBufsize(&pObj->blep, size); + + if (pObj->bufsize == size) + return; + + pObj->bufsize = size; + + if (pObj->pOut) + free(pObj->pOut); + + pObj->pOut = NULL; + + if (!size) + return; + + pObj->pOut = (synth_float_t*)malloc(pObj->bufsize*sizeof(synth_float_t)); + +} + +void VCO_Reset(osc_t *pObj, synth_float_t phase) +{ + Sine_Reset(&pObj->sine, phase); + BLIT_Reset(&pObj->blep, phase); + WT_Reset(&pObj->wt, phase); + pObj->impulse = 10; +} + +void VCO_Start(osc_t *pObj) +{ + Sine_Start(&pObj->sine); + BLIT_Start(&pObj->blep); + WT_Start(&pObj->wt); +} + +void VCO_Param2Set(osc_t *pObj, UINT32 type, synth_float_t value) +{ + UINT32 wt_table; + + switch(type) + { + case OSC_PARAM2_WAVEFORM: + if (pObj->param[type] == (UINT32)value) + break; + pObj->param[type] = (UINT32)value; + if ((pObj->param[OSC_PARAM2_WAVEFORM] >= OSC_WAVEFORM_WAVETABLE) && (pObj->param[OSC_PARAM2_WAVEFORM] < (OSC_WAVEFORM_WAVETABLE+WT_NUM_WAVETABLES))) + { + wt_table = (UINT32)(pObj->param[OSC_PARAM2_WAVEFORM]-OSC_WAVEFORM_WAVETABLE); +// WT_Param2Set(&pObj->wt, WT_PARAM2_WAVEFORM, WT_WAVEFORM_REGULAR); + WT_Param2Set(&pObj->wt, WT_PARAM2_WAVEFORM, WT_WAVEFORM_INTERPOLATED); + WT_Param2Set(&pObj->wt, WT_PARAM2_WAVETABLE_ID, wt_table); + } + Sine_Prepare(&pObj->sine); + BLIT_Prepare(&pObj->blep, 1024); + WT_Prepare(&pObj->wt); + break; + + case OSC_PARAM2_DUTYCYCLE: + pObj->param[type] = value; + BLIT_SetDutyCycle(&pObj->blep, value); + WT_Param2Set(&pObj->wt, WT_PARAM2_WAVETABLE_ENTRY, value); + break; + + default: + break; + } +} + +void VCO_ProcessDataV(osc_t *pObj, synth_float_t *pPitch, synth_float_t *pCV_fm, synth_float_t *pCV_pwm, UINT32 *pSyncIn, UINT32 *pSyncOut, UINT32 len) +{ + UINT32 i, is_slave; + synth_float_t *pOut; + synth_float_t out; + + pOut = pObj->pOut; + + is_slave = (pSyncIn != NULL) && (pSyncOut == NULL); + + if (pSyncOut) + memset(pSyncOut, 0, len*sizeof(synth_float_t)); + + // Create output + if (pObj->param[OSC_PARAM2_WAVEFORM] == OSC_WAVEFORM_SAWTOOTH) + { + BLIT_Process_SAW_Vector(&pObj->blep, pPitch, pCV_fm, pSyncIn, pSyncOut, pObj->pOut, len); + } + + if (pObj->param[OSC_PARAM2_WAVEFORM] == OSC_WAVEFORM_SQUARE) + { + BLIT_Process_SQR_Vector(&pObj->blep, pPitch, pCV_fm, pCV_pwm, pSyncIn, pSyncOut, pObj->pOut, len); + } + + if (pObj->param[OSC_PARAM2_WAVEFORM] == OSC_WAVEFORM_TRIANGLE) + { + BLIT_Process_TRI_Vector(&pObj->blep, pPitch, pCV_fm, pSyncIn, pSyncOut, pObj->pOut, len); + } + + if (pObj->param[OSC_PARAM2_WAVEFORM] == OSC_WAVEFORM_SINE) + { + for (i=0; i< len; i++) + { + out = Sine_Process_Scalar(&pObj->sine, pPitch[i], pCV_fm[i]); + if(is_slave && pSyncIn[i]) + { + Sine_Reset(&pObj->sine, 0); + } + *(pOut++) = out; + } + } + + if (pObj->param[OSC_PARAM2_WAVEFORM] == OSC_WAVEFORM_IMPULSE) + { + for (i=0; i< len; i++) + { + out = pObj->impulse; + pObj->impulse = 0; + *(pOut++) = out; + } + } + + if ((pObj->param[OSC_PARAM2_WAVEFORM] >= OSC_WAVEFORM_WAVETABLE) && (pObj->param[OSC_PARAM2_WAVEFORM] < (OSC_WAVEFORM_WAVETABLE+WT_NUM_WAVETABLES))) + { + WT_ProcessDataV(&pObj->wt, pPitch, pCV_fm, pCV_pwm, pObj->pOut, len); + } +} + +synth_float_t* VCO_GetProcessBuffer(osc_t *pObj) +{ + return pObj->pOut; +} + diff --git a/Source/synth/vco.h b/Source/synth/vco.h new file mode 100644 index 0000000..d843cbf --- /dev/null +++ b/Source/synth/vco.h @@ -0,0 +1,83 @@ +// -------------------------------------------------------------- +// -------------------------------------------------------------- +#ifndef _VCO_H_ +#define _VCO_H_ + +#include "synth_types.h" +#include "noise.h" +#include "sine.h" +#include "blit.h" +#include "wavetable.h" + +#define OSC_RECALC_THRESH 0.001f + +// -------------------------------------------------------------- +// Types +// -------------------------------------------------------------- +enum +{ + OSC_WAVEFORM_SAWTOOTH, + OSC_WAVEFORM_SQUARE, + OSC_WAVEFORM_TRIANGLE, + OSC_WAVEFORM_SINE, + OSC_WAVEFORM_IMPULSE, + OSC_WAVEFORM_WAVETABLE, + OSC_NUM_WAVEFORMS = OSC_WAVEFORM_WAVETABLE+WT_NUM_WAVETABLES +}; + +enum +{ + OSC_PARAM2_WAVEFORM, + OSC_PARAM2_DUTYCYCLE, + OSC_NUM_PARAMS +}; + +typedef struct _svco_common_t +{ + blit_common_t blit; + wt_common_t wt; +// synth_float_t wavetable[300][128]; + +} vco_common_t; + +typedef struct _sosc_t +{ + UINT32 id; + vco_common_t *pCom; + synth_float_t param[OSC_NUM_PARAMS]; + synth_float_t fs; + blit_t blep; + wt_t wt; + UINT32 bufsize; + synth_float_t *pOut; + sine_gen_t sine; + synth_float_t impulse; + +} osc_t; + +// -------------------------------------------------------------- +#if defined(__cplusplus) +extern "C" { +#endif + +// -------------------------------------------------------------- +// Exported functions +// -------------------------------------------------------------- +void VCO_ModInit(vco_common_t *pCom); +void VCO_ModFree(vco_common_t *pCom); +void VCO_Init(osc_t *pObj, UINT32 id, vco_common_t *pCom, synth_float_t fs); +void VCO_Free(osc_t *pObj); +void VCO_SetBufsize(osc_t *pObj, UINT32 size); +void VCO_SetFS(osc_t *pObj, synth_float_t fs); +void VCO_Reset(osc_t *pObj, synth_float_t phase); +void VCO_Start(osc_t *pObj); +void VCO_Param2Set(osc_t *pObj, UINT32 type, synth_float_t value); +void VCO_ProcessDataV(osc_t *pObj, synth_float_t *pPitch, synth_float_t *pCV_fm, synth_float_t *pCV_pwm, UINT32 *pSyncIn, UINT32 *pSyncOut, UINT32 len); +synth_float_t* VCO_GetProcessBuffer(osc_t *pObj); +#if defined(__cplusplus) +} + +#endif +// -------------------------------------------------------------- + +#endif // _VCO_H_ diff --git a/Source/synth/vector_utils.c b/Source/synth/vector_utils.c new file mode 100644 index 0000000..c67f916 --- /dev/null +++ b/Source/synth/vector_utils.c @@ -0,0 +1,191 @@ +// -------------------------------------------------------------- +// -------------------------------------------------------------- +#include +#include +#include + +#include "synth_defs.h" +#include "vector_utils.h" + +// -------------------------------------------------------------- +// Exported functions +// -------------------------------------------------------------- +void Add_inplace_VS(synth_float_t *pSrcDst1, synth_float_t gain1, synth_float_t src2, UINT32 len) +{ + if (gain1 == 0) + { + while(len--) + { + *(pSrcDst1) = src2; + pSrcDst1++; + } + return; + } + + while(len--) + { + *(pSrcDst1) = *(pSrcDst1)*gain1 + src2; + pSrcDst1++; + } +} + +void Add_inplace_VV(synth_float_t *pSrcDst1, synth_float_t gain1, synth_float_t *pSrc2, synth_float_t gain2, UINT32 len) +{ + if (gain1 == 0) + { + while(len--) + { + *(pSrcDst1++) = *(pSrc2++)*gain2; + } + return; + } + + if ((gain1 == 1.0) && (gain2 == 1.0)) + { + while(len--) + { + *(pSrcDst1++) += *(pSrc2++); + } + return; + } + + while(len--) + { + *(pSrcDst1) = *(pSrcDst1)*gain1 + *(pSrc2++)*gain2; + pSrcDst1++; + } + +} + +void Add_VS(synth_float_t *pDst, synth_float_t *pSrc1, synth_float_t gain1, synth_float_t src2, UINT32 len) +{ + while(len--) + { + *(pDst++) = *(pSrc1++)*gain1 + src2; + } +} + +void Add_VV(synth_float_t *pDst, synth_float_t *pSrc1, synth_float_t gain1, synth_float_t *pSrc2, synth_float_t gain2, UINT32 len) +{ + while(len--) + { + *(pDst++) = *(pSrc1++)*gain1 + *(pSrc2++)*gain2; + } +} + +void Sub_inplace_VS(synth_float_t *pSrcDst1, synth_float_t gain1, synth_float_t src2, UINT32 len) +{ + while(len--) + { + *(pSrcDst1) = *(pSrcDst1)*gain1 - src2; + pSrcDst1++; + } +} + +void Sub_inplace_VV(synth_float_t *pSrcDst1, synth_float_t gain1, synth_float_t *pSrc2, synth_float_t gain2, UINT32 len) +{ + while(len--) + { + *(pSrcDst1) = *(pSrcDst1)*gain1 - *(pSrc2++)*gain2; + pSrcDst1++; + } +} + +void Sub_VS(synth_float_t *pDst, synth_float_t *pSrc1, synth_float_t gain1, synth_float_t src2, UINT32 len) +{ + while(len--) + { + *(pDst++) = *(pSrc1++)*gain1 - src2; + } +} + +void Sub_VV(synth_float_t *pDst, synth_float_t *pSrc1, synth_float_t gain1, synth_float_t *pSrc2, synth_float_t gain2, UINT32 len) +{ + while(len--) + { + *(pDst++) = *(pSrc1++)*gain1 - *(pSrc2++)*gain2; + } +} + +void Mul_inplace_VS(synth_float_t *pSrcDst, synth_float_t src, UINT32 len) +{ + while(len--) + { + *(pSrcDst++) *= src; + } +} + +void Mul_inplace_VV(synth_float_t *pSrcDst, synth_float_t *pSrc, UINT32 len) +{ + while(len--) + { + *(pSrcDst++) *= *(pSrc++); + } +} + + +void Mul_VS(synth_float_t *pDst, synth_float_t *pSrc1, synth_float_t src2, UINT32 len) +{ + while(len--) + { + *(pDst++) = *(pSrc1++) * src2; + } +} + +void Mul_VV(synth_float_t *pDst, synth_float_t *pSrc1, synth_float_t *pSrc2, UINT32 len) +{ + while(len--) + { + *(pDst++) = *(pSrc1++) * *(pSrc2++); + } +} + + +void Clamp_inplace_V(synth_float_t *pSrcDst, synth_float_t minimum, synth_float_t maximum, UINT32 len) +{ + while(len--) + { + *(pSrcDst) = max(minimum, min(maximum, *(pSrcDst))); + pSrcDst++; + } +} + +void Clamp_V(synth_float_t *pDst, synth_float_t *pSrc, synth_float_t minimum, synth_float_t maximum, UINT32 len) +{ + while(len--) + { + *(pDst++) = max(minimum, min(maximum, *(pSrc++))); + } +} + +void uMax_VS(synth_float_t *pDst, synth_float_t *pSrc1, synth_float_t src2, UINT32 len) +{ + while(len--) + { + *(pDst++) = max(fabs(*(pSrc1++)), src2); + } +} + +void uMax_VV(synth_float_t *pDst, synth_float_t *pSrc1, synth_float_t *pSrc2, UINT32 len) +{ + while(len--) + { + *(pDst++) = max(fabs(*(pSrc1++)), *(pSrc2++)); + } +} + +void uMin_VS(synth_float_t *pDst, synth_float_t *pSrc1, synth_float_t src2, UINT32 len) +{ + while(len--) + { + *(pDst++) = min(fabs(*(pSrc1++)), src2); + } +} + +void uMin_VV(synth_float_t *pDst, synth_float_t *pSrc1, synth_float_t *pSrc2, UINT32 len) +{ + while(len--) + { + *(pDst++) = min(fabs(*(pSrc1++)), *(pSrc2++)); + } +} diff --git a/Source/synth/vector_utils.h b/Source/synth/vector_utils.h new file mode 100644 index 0000000..777be80 --- /dev/null +++ b/Source/synth/vector_utils.h @@ -0,0 +1,45 @@ +// -------------------------------------------------------------- +// -------------------------------------------------------------- +#ifndef _VECTOR_UTILS_H_ +#define _VECTOR_UTILS_H_ + +#include "synth_defs.h" + +// -------------------------------------------------------------- +// Types +// -------------------------------------------------------------- + +// -------------------------------------------------------------- +#if defined(__cplusplus) +extern "C" { +#endif + +// -------------------------------------------------------------- +// Exported functions +// -------------------------------------------------------------- +void Add_inplace_VS(synth_float_t *pSrcDst1, synth_float_t gain1, synth_float_t src2, UINT32 len); +void Add_inplace_VV(synth_float_t *pSrcDst1, synth_float_t gain1, synth_float_t *pSrc2, synth_float_t gain2, UINT32 len); +void Add_VS(synth_float_t *pDst, synth_float_t *pSrc1, synth_float_t gain1, synth_float_t src2, UINT32 len); +void Add_VV(synth_float_t *pDst, synth_float_t *pSrc1, synth_float_t gain1, synth_float_t *pSrc2, synth_float_t gain2, UINT32 len); +void Sub_inplace_VS(synth_float_t *pSrcDst1, synth_float_t gain1, synth_float_t src2, UINT32 len); +void Sub_inplace_VV(synth_float_t *pSrcDst1, synth_float_t gain1, synth_float_t *pSrc2, synth_float_t gain2, UINT32 len); +void Sub_VS(synth_float_t *pDst, synth_float_t *pSrc1, synth_float_t gain1, synth_float_t src2, UINT32 len); +void Sub_VV(synth_float_t *pDst, synth_float_t *pSrc1, synth_float_t gain1, synth_float_t *pSrc2, synth_float_t gain2, UINT32 len); +void Mul_inplace_VS(synth_float_t *pSrcDst, synth_float_t src, UINT32 len); +void Mul_inplace_VV(synth_float_t *pSrcDst, synth_float_t *pSrc, UINT32 len); +void Mul_VS(synth_float_t *pDst, synth_float_t *pSrc1, synth_float_t src2, UINT32 len); +void Mul_VV(synth_float_t *pDst, synth_float_t *pSrc1, synth_float_t *pSrc2, UINT32 len); +void Clamp_inplace_V(synth_float_t *pSrcDst, synth_float_t minimum, synth_float_t maximum, UINT32 len); +void Clamp_V(synth_float_t *pDst, synth_float_t *pSrc, synth_float_t minimum, synth_float_t maximum, UINT32 len); +void uMax_VS(synth_float_t *pDst, synth_float_t *pSrc1, synth_float_t src2, UINT32 len); +void uMax_VV(synth_float_t *pDst, synth_float_t *pSrc1, synth_float_t *pSrc2, UINT32 len); +void uMin_VS(synth_float_t *pDst, synth_float_t *pSrc1, synth_float_t src2, UINT32 len); +void uMin_VV(synth_float_t *pDst, synth_float_t *pSrc1, synth_float_t *pSrc2, UINT32 len); + +#if defined(__cplusplus) +} + +#endif +// -------------------------------------------------------------- + +#endif // _VECTOR_UTILS_H_ diff --git a/Source/synth/voice.c b/Source/synth/voice.c new file mode 100644 index 0000000..bf9b26a --- /dev/null +++ b/Source/synth/voice.c @@ -0,0 +1,1230 @@ +// -------------------------------------------------------------- +// -------------------------------------------------------------- +#include +#include +#include +#include + +#include "synth_defs.h" +#include "vector_utils.h" +#include "voice.h" + +// -------------------------------------------------------------- +// Exported functions +// -------------------------------------------------------------- +void Voice_ModInit(voice_common_t *pCom) +{ + int i; + synth_float_t k; + synth_float_t a; + + // make frequency (Hz) table + k = 1.0594630943593; // 12th root of 2 + a = 440.f/64; // a + a *= k; // b + a *= k; // bb + a *= k; // c, frequency of midi note 0 + for (i = 0; i < NUM_FREQS; i++) // 128 midi notes + { + pCom->freqTab[i] = (synth_float_t)a; + a *= k; + } + for (i = 0; i < SYNTH_MAX_BUFSIZE; i++) // 128 midi notes + { + pCom->pBuf_zeros[i] = (synth_float_t)0; + pCom->pBuf_ones[i] = (synth_float_t)1; + } + +} + +void Voice_ModFree(voice_common_t *pCom) +{ +} + +void VoiceInit(voice_t *pObj, voice_common_t *pCom, UINT32 id, synth_float_t fs) +{ + INT32 i; + pObj->id = id; + pObj->pCom = pCom; + pObj->fs = fs; + pObj->bufsize = 0; + + if (pObj->id == 0) + { + Voice_ModInit(pCom); + } + + VCF_Init(&pObj->vcf, id, &pCom->vcf, fs); + for (i = 0; i < VOICE_NUM_ENV; i++) + { + ENV_Init(&pObj->env[i], fs); + } + + for (i = 0; i < VOICE_NUM_OSC; i++) + { + Smooth_Init(&pObj->smooth_vco_enable[i], fs, 0.05, 0.05, 0); + Smooth_Init(&pObj->smooth_vco_portamento[i], fs, 0.001, 0.001, 440); + } + +// memset(pObj->pParam_smoother, 0, VOICE_NUM_PARAMS*sizeof(smooth_t*)); + + // Create parameter smoother + // VOICE_PARAM_VCA_ENV_GAIN +// pObj->pParam_smoother[VOICE_PARAM_VCA_ENV_GAIN] = (smooth_t*)malloc(sizeof(smooth_t)); +// Smooth_Init(pObj->pParam_smoother[VOICE_PARAM_VCA_ENV_GAIN], fs, 0.01, 0.01, 0); + + for (i = 0; i < VOICE_NUM_OSC; i++) + { + VCO_Init(&pObj->vco[i], pObj->id*VOICE_NUM_OSC+i, &pCom->vco, fs); + } + + for (i = 0; i < VOICE_NUM_LFO; i++) + { + LFO_Init(&pObj->lfo[i], fs); + } + + // First voice initializes global LFOs + if (pObj->id == 0) + { + for (i = 0; i < VOICE_NUM_LFO; i++) + LFO_Init(&pCom->glfo[i], fs); + + for (i = 0; i < VOICE_NUM_ENV; i++) + ENV_Init(&pCom->genv[i], fs); + + VCF_Init(&pCom->gvcf[0], MAX_POLYPHONY, &pCom->vcf, fs); + VCF_Init(&pCom->gvcf[1], MAX_POLYPHONY+1, &pCom->vcf, fs); + Noise_Init(&pCom->gnoise, 1+(UINT32)clock() * (UINT32)clock()); + } + + pObj->state = note_state_idle; + pObj->param[VOICE_PARAM_VCA_ENV_GAIN] = (synth_float_t)1; + pObj->param[VOICE_PARAM_VCF_ENV_GAIN] = (synth_float_t)1; + + pObj->param[VOICE_PARAM_VCF_F] = (synth_float_t)1; + + pObj->param[VOICE_PARAM_VCF_Q] = (synth_float_t)0.7; + pObj->param[VOICE_PARAM_VCF_Q_GAIN_0] = (synth_float_t)1; + pObj->param[VOICE_PARAM_VCF_Q_CTRL_0] = (synth_float_t)0; + + pObj->param[VOICE_PARAM_OSC_0_PHASE] = 0; + pObj->param[VOICE_PARAM_OSC_1_PHASE] = 0; + pObj->param[VOICE_PARAM_OSC_0_TRANSPOSE] = 0; + pObj->param[VOICE_PARAM_OSC_1_TRANSPOSE] = 0; + pObj->param[VOICE_PARAM_KEY] = 128; + pObj->param[VOICE_PARAM_OSC_0_SCALE] = 1.f; + pObj->param[VOICE_PARAM_OSC_1_SCALE] = 1.f; + pObj->param[VOICE_PARAM_MASTER_TUNE] = 1.f; + pObj->param[VOICE_PARAM_MASTER_FREF] = 1.f; + pObj->param[VOICE_PARAM_VOICE_PAN] = 0; + + pObj->pBuf_Q = NULL; + + VoiceSetBufsize(pObj, SYNTH_MAX_BUFSIZE); +} + +void VoiceFree(voice_t *pObj) +{ + int i; + + VoiceSetBufsize(pObj, 0); + + VCF_Free(&pObj->vcf); + + for (i = 0; i < VOICE_NUM_ENV; i++) + ENV_Free(&pObj->env[i]); + + for (i = 0; i < VOICE_NUM_OSC; i++) + VCO_Free(&pObj->vco[i]); + + for (i = 0; i < VOICE_NUM_LFO; i++) + LFO_Free(&pObj->lfo[i]); + + // First voice frees global LFOs + if (pObj->id == 0) + { + for (i = 0; i < VOICE_NUM_LFO; i++) + LFO_Free(&pObj->pCom->glfo[i]); + + for (i = 0; i < VOICE_NUM_ENV; i++) + ENV_Free(&pObj->pCom->genv[i]); + + VCF_Free(&pObj->pCom->gvcf[0]); + VCF_Free(&pObj->pCom->gvcf[1]); + + Noise_Free(&pObj->pCom->gnoise); + } + + for (i = 0; i < VOICE_NUM_OSC; i++) + { + Smooth_Free(&pObj->smooth_vco_enable[i]); + Smooth_Free(&pObj->smooth_vco_portamento[i]); + } + + // Delete parameter smoother + // VOICE_PARAM_VCA_ENV_GAIN +// Smooth_Free(pObj->pParam_smoother[VOICE_PARAM_VCA_ENV_GAIN]); +// free(pObj->pParam_smoother[VOICE_PARAM_VCA_ENV_GAIN]); + + if (pObj->id == 0) + Voice_ModFree(pObj->pCom); + +} + +void VoiceSetFS(voice_t *pObj, synth_float_t fs) +{ + int i; + + pObj->fs = fs; + + for (i = 0; i < VOICE_NUM_ENV; i++) + ENV_SetFS(&pObj->env[i], fs); + + VCF_SetFS(&pObj->vcf, fs); + + for (i = 0; i < VOICE_NUM_OSC; i++) + Smooth_SetFS(&pObj->smooth_vco_enable[i], fs); + + for (i = 0; i < VOICE_NUM_OSC; i++) + VCO_SetFS(&pObj->vco[i], fs); + + for (i = 0; i < VOICE_NUM_LFO; i++) + LFO_SetFS(&pObj->lfo[i], fs); + + // First voice sets sample rate for global LFOs + if (pObj->id == 0) + { + for (i = 0; i < VOICE_NUM_LFO; i++) + LFO_SetFS(&pObj->pCom->glfo[i], fs); + + for (i = 0; i < VOICE_NUM_ENV; i++) + ENV_SetFS(&pObj->pCom->genv[i], fs); + + VCF_SetFS(&pObj->pCom->gvcf[0], fs); + VCF_SetFS(&pObj->pCom->gvcf[1], fs); + } + +} + +void VoiceSetBufsize(voice_t *pObj, UINT32 size) +{ + int i; + + for (i = 0; i < VOICE_NUM_OSC; i++) + { + VCO_SetBufsize(&pObj->vco[i], size); + } + + for (i = 0; i < VOICE_NUM_LFO; i++) + { + LFO_SetBufsize(&pObj->lfo[i], size); + } + + // First voice sets bufsize for global LFOs + if (pObj->id == 0) + { + for (i = 0; i < VOICE_NUM_LFO; i++) + LFO_SetBufsize(&pObj->pCom->glfo[i], size); + + for (i = 0; i < VOICE_NUM_ENV; i++) + ENV_SetBufsize(&pObj->pCom->genv[i], size); + + VCF_SetBufsize(&pObj->pCom->gvcf[0], size); + VCF_SetBufsize(&pObj->pCom->gvcf[1], size); + } + + VCF_SetBufsize(&pObj->vcf, size); + + for (i = 0; i < VOICE_NUM_ENV; i++) + ENV_SetBufsize(&pObj->env[i], size); + + if (pObj->bufsize == size) + return; + + pObj->bufsize = size; + + if (pObj->pBuf_Q) + free(pObj->pBuf_Q); + + pObj->pBuf_Q = NULL; + + if (!size) + return; + + pObj->pBuf_Q = (synth_float_t*)malloc(pObj->bufsize*sizeof(synth_float_t)); + +} + +void VoiceEvent(voice_t *pObj, UINT32 type) +{ + int i; + + switch(type) + { + case voice_event_trigger: + case voice_event_retrigger: + for (i = 0; i < VOICE_NUM_ENV; i++) + ENV_Event(&pObj->env[i], env_event_retrigger); + + VCF_Coeff_update(&pObj->vcf); + + if (pObj->state == note_state_idle) + VCF_clear_state(&pObj->vcf); + + pObj->state = note_state_triggered; + + for (i = 0; i < VOICE_NUM_OSC; i++) + { + if ((int)pObj->param[VOICE_PARAM_OSC_0_RESTART_ON_TRIGGER+i] > 0.5) + if (type == voice_event_trigger) + VCO_Reset(&pObj->vco[i], pObj->param[VOICE_PARAM_OSC_0_PHASE+i]); + + VCO_Start(&pObj->vco[i]); + Smooth_SetValue(&pObj->smooth_vco_enable[i], pObj->param[VOICE_PARAM_OSC_0_ENABLE+i]*(1E-6+pObj->param[VOICE_PARAM_OSC_0_LEVEL+i])); + } + + for (i = 0; i < VOICE_NUM_LFO; i++) + { + if ((int)pObj->param[VOICE_PARAM_LFO_0_SYNC+i] == VOICE_LFO_SYNC_RESTART) + LFO_Reset(&pObj->lfo[i], 0); + } + + // Global events + for (i = 0; i < VOICE_NUM_LFO; i++) + { + if ((int)pObj->param[VOICE_PARAM_LFO_0_SYNC+i] == VOICE_LFO_SYNC_RESTART) + LFO_Reset(&pObj->pCom->glfo[i], 0); + } + for (i = 0; i < VOICE_NUM_ENV; i++) + ENV_Event(&pObj->pCom->genv[i], env_event_retrigger); + + VCF_Coeff_update(&pObj->pCom->gvcf[0]); + VCF_Coeff_update(&pObj->pCom->gvcf[1]); + break; + + case voice_event_shutdown: + case voice_event_release: + for (i = 0; i < VOICE_NUM_ENV; i++) + ENV_Event(&pObj->pCom->genv[i], env_event_release); + + if (pObj->state == note_state_idle) + break; + + for (i = 0; i < VOICE_NUM_ENV; i++) + ENV_Event(&pObj->env[i], env_event_release); + + pObj->state = note_state_released; + break; + + default: + break; + } + +}; + +synth_float_t getKeyFreq(voice_t *pObj, int key) +{ + int index = max(0, min(NUM_FREQS-1, key)); + return pObj->pCom->freqTab[index]; +} + +synth_float_t getPitch(voice_t *pObj, UINT32 osc_id) +{ + synth_float_t pitch; + + pitch = getKeyFreq(pObj, (int)pObj->param[VOICE_PARAM_KEY] + (int)pObj->param[VOICE_PARAM_OSC_0_TRANSPOSE+osc_id]) + * pObj->param[VOICE_PARAM_OSC_0_SCALE+osc_id] + * pObj->param[VOICE_PARAM_OSC_0_DETUNE+osc_id] + * pObj->param[VOICE_PARAM_MASTER_TUNE] + * pObj->param[VOICE_PARAM_MASTER_FREF]; + + return pitch; +} + +void VoiceParam2Set(voice_t *pObj, UINT32 type, synth_float_t value) +{ + pObj->param[type] = value; + + switch(type) + { + case VOICE_PARAM_VOICE_PAN: + if (pObj->id % 2) + pObj->param[type] = min(1, max(-1, -value/100)); + else + pObj->param[type] = min(1, max(-1, value/100)); + break; + + case VOICE_PARAM_PORTAMENTO_TIME: + Smooth_SetT(&pObj->smooth_vco_portamento[0], value, value); + Smooth_SetT(&pObj->smooth_vco_portamento[1], value, value); + break; + + case VOICE_PARAM_MASTER_FREF: + pObj->param[type] = value/440; + pObj->vco_pitch[0] = getPitch(pObj, 0); + pObj->vco_pitch[1] = getPitch(pObj, 1); + break; + + case VOICE_PARAM_MASTER_TUNE: + pObj->param[type] = pow(2, value/(12*100)); + pObj->vco_pitch[0] = getPitch(pObj, 0); + pObj->vco_pitch[1] = getPitch(pObj, 1); + break; + + case VOICE_PARAM_OSC_0_WAVEFORM: + case VOICE_PARAM_OSC_1_WAVEFORM: + VCO_Param2Set(&pObj->vco[type-VOICE_PARAM_OSC_0_WAVEFORM], OSC_PARAM2_WAVEFORM, (int)pObj->param[type]); + break; + + case VOICE_PARAM_OSC_0_SCALE: + case VOICE_PARAM_OSC_1_SCALE: + pObj->vco_pitch[type-VOICE_PARAM_OSC_0_SCALE] = getPitch(pObj, type-VOICE_PARAM_OSC_0_SCALE); + break; + + case VOICE_PARAM_OSC_0_TRANSPOSE: + case VOICE_PARAM_OSC_1_TRANSPOSE: + pObj->param[type] = (int)value; + pObj->vco_pitch[type-VOICE_PARAM_OSC_0_TRANSPOSE] = getPitch(pObj, type-VOICE_PARAM_OSC_0_TRANSPOSE); + break; + + case VOICE_PARAM_OSC_0_DETUNE: + case VOICE_PARAM_OSC_1_DETUNE: + pObj->param[type] = pow(2, value/(12*100)); + pObj->vco_pitch[type-VOICE_PARAM_OSC_0_DETUNE] = getPitch(pObj, type-VOICE_PARAM_OSC_0_DETUNE); + break; + + case VOICE_PARAM_OSC_0_DUTYCYCLE: + case VOICE_PARAM_OSC_1_DUTYCYCLE: + pObj->param[type] = value / 100; + VCO_Param2Set(&pObj->vco[type-VOICE_PARAM_OSC_0_DUTYCYCLE], OSC_PARAM2_DUTYCYCLE, pObj->param[type]); + break; + + case VOICE_PARAM_KEY: + pObj->vco_pitch[0] = getPitch(pObj, 0); + pObj->vco_pitch[1] = getPitch(pObj, 1); + break; + + case VOICE_PARAM_OSC_0_FM_AMT_0: + case VOICE_PARAM_OSC_1_FM_AMT_0: + pObj->param[type] = value / 12; + break; + + case VOICE_PARAM_OSC_0_PWM_AMT_0: + case VOICE_PARAM_OSC_1_PWM_AMT_0: + case VOICE_PARAM_OSC_0_PWM_AMT_1: + case VOICE_PARAM_OSC_1_PWM_AMT_1: + case VOICE_PARAM_OSC_0_AM_AMT_0: + case VOICE_PARAM_OSC_1_AM_AMT_0: + case VOICE_PARAM_OSC_0_AM_AMT_1: + case VOICE_PARAM_OSC_1_AM_AMT_1: + case VOICE_PARAM_OSC_0_FM_AMT_1: + case VOICE_PARAM_OSC_1_FM_AMT_1: + case VOICE_PARAM_OSC_0_LEVEL: + case VOICE_PARAM_OSC_1_LEVEL: + case VOICE_PARAM_VCA_ENV_GAIN: + case VOICE_PARAM_VCF_ENV_GAIN: + case VOICE_PARAM_VCF_F_AMT_0: + case VOICE_PARAM_VCF_Q_AMT_0: + case VOICE_PARAM_VCF_F_AMT_1: + case VOICE_PARAM_VCF_Q_AMT_1: + case VOICE_PARAM_NOISE_LEVEL: + case VOICE_PARAM_VCA_AM_AMT_0: + case VOICE_PARAM_VCA_PAN_AMT_0: + case VOICE_PARAM_VCF_Q_GAIN_0: + case VOICE_PARAM_VCF_Q_CTRL_0: + pObj->param[type] = value / 100; + break; + + case VOICE_PARAM_OSC_0_FM_SRC_0: + case VOICE_PARAM_OSC_1_FM_SRC_0: + case VOICE_PARAM_OSC_0_AM_SRC_0: + case VOICE_PARAM_OSC_1_AM_SRC_0: + case VOICE_PARAM_OSC_0_PWM_SRC_0: + case VOICE_PARAM_OSC_1_PWM_SRC_0: + case VOICE_PARAM_VCF_F_SRC_0: + case VOICE_PARAM_VCF_Q_SRC_0: + case VOICE_PARAM_VCA_AM_SRC_0: + case VOICE_PARAM_VCA_PAN_SRC_0: + case VOICE_PARAM_OSC_0_FM_SRC_1: + case VOICE_PARAM_OSC_1_FM_SRC_1: + case VOICE_PARAM_OSC_0_AM_SRC_1: + case VOICE_PARAM_OSC_1_AM_SRC_1: + case VOICE_PARAM_OSC_0_PWM_SRC_1: + case VOICE_PARAM_OSC_1_PWM_SRC_1: + case VOICE_PARAM_VCF_F_SRC_1: + case VOICE_PARAM_VCF_Q_SRC_1: + pObj->param[type] = (int)value; + break; + + case VOICE_PARAM_OSC_0_FM_SRC_OP: + case VOICE_PARAM_OSC_1_FM_SRC_OP: + case VOICE_PARAM_OSC_0_AM_SRC_OP: + case VOICE_PARAM_OSC_1_AM_SRC_OP: + case VOICE_PARAM_OSC_0_PWM_SRC_OP: + case VOICE_PARAM_OSC_1_PWM_SRC_OP: + case VOICE_PARAM_VCF_F_SRC_OP: + case VOICE_PARAM_VCF_Q_SRC_OP: + pObj->param[type] = (int)value; + break; + + case VOICE_PARAM_VCF_TYPE: + VCF_SetType(&pObj->vcf, (int)pObj->param[type]); + if (pObj->id == 0) + { + VCF_SetType(&pObj->pCom->gvcf[0], pObj->param[type]); + VCF_SetType(&pObj->pCom->gvcf[1], pObj->param[type]); + } + break; + + case VOICE_PARAM_VCF_ORDER: + VCF_SetOrder(&pObj->vcf, (int)(pObj->param[type]+1)*2); + if (pObj->id == 0) + { + VCF_SetOrder(&pObj->pCom->gvcf[0], (int)(pObj->param[type]+1)*2); + VCF_SetOrder(&pObj->pCom->gvcf[1], (int)(pObj->param[type]+1)*2); + } + break; + + case VOICE_PARAM_VCF_F: + VCF_SetF(&pObj->vcf, pObj->param[type]); + if (pObj->id == 0) + { + VCF_SetF(&pObj->pCom->gvcf[0], pObj->param[type]); + VCF_SetF(&pObj->pCom->gvcf[1], pObj->param[type]); + } + break; + + case VOICE_PARAM_VCF_Q: + VCF_SetQ(&pObj->vcf, pObj->param[type]); + if (pObj->id == 0) + { + VCF_SetQ(&pObj->pCom->gvcf[0], pObj->param[type]); + VCF_SetQ(&pObj->pCom->gvcf[1], pObj->param[type]); + } + break; + + case VOICE_PARAM_ENV_0_A: + case VOICE_PARAM_ENV_1_A: + case VOICE_PARAM_ENV_2_A: + case VOICE_PARAM_ENV_3_A: + pObj->param[type] = value / 1000; + ENV_Param2Set(&pObj->env[type-VOICE_PARAM_ENV_0_A], ENV_PARAM2_A, pObj->param[type]); + if (pObj->id == 0) + { + ENV_Param2Set(&pObj->pCom->genv[type-VOICE_PARAM_ENV_0_A], ENV_PARAM2_A, pObj->param[type]); + } + break; + + case VOICE_PARAM_ENV_0_D: + case VOICE_PARAM_ENV_1_D: + case VOICE_PARAM_ENV_2_D: + case VOICE_PARAM_ENV_3_D: + pObj->param[type] = value / 1000; + if (type == VOICE_PARAM_VCF_ENV_D) + { + pObj->param[type] = 3*value / 1000; + } + ENV_Param2Set(&pObj->env[type-VOICE_PARAM_ENV_0_D], ENV_PARAM2_D, pObj->param[type]); + if (pObj->id == 0) + { + ENV_Param2Set(&pObj->pCom->genv[type-VOICE_PARAM_ENV_0_D], ENV_PARAM2_D, pObj->param[type]); + } + break; + + case VOICE_PARAM_ENV_0_S: + case VOICE_PARAM_ENV_1_S: + case VOICE_PARAM_ENV_2_S: + case VOICE_PARAM_ENV_3_S: + pObj->param[type] = value / 100; + ENV_Param2Set(&pObj->env[type-VOICE_PARAM_ENV_0_S], ENV_PARAM2_S, pObj->param[type]); + if (pObj->id == 0) + { + ENV_Param2Set(&pObj->pCom->genv[type-VOICE_PARAM_ENV_0_S], ENV_PARAM2_S, pObj->param[type]); + } + break; + + case VOICE_PARAM_ENV_0_R: + case VOICE_PARAM_ENV_1_R: + case VOICE_PARAM_ENV_2_R: + case VOICE_PARAM_ENV_3_R: + pObj->param[type] = value / 1000; + if (type == VOICE_PARAM_VCF_ENV_R) + { + pObj->param[type] = 3*value / 1000; + } + ENV_Param2Set(&pObj->env[type-VOICE_PARAM_ENV_0_R], ENV_PARAM2_R, pObj->param[type]); + if (pObj->id == 0) + { + ENV_Param2Set(&pObj->pCom->genv[type-VOICE_PARAM_ENV_0_R], ENV_PARAM2_R, pObj->param[type]); + } + break; + + case VOICE_PARAM_LFO_0_MODE: + case VOICE_PARAM_LFO_1_MODE: + case VOICE_PARAM_LFO_2_MODE: + case VOICE_PARAM_LFO_3_MODE: + case VOICE_PARAM_LFO_0_SYNC: + case VOICE_PARAM_LFO_1_SYNC: + case VOICE_PARAM_LFO_2_SYNC: + case VOICE_PARAM_LFO_3_SYNC: + break; + + case VOICE_PARAM_LFO_0_SPEED: + case VOICE_PARAM_LFO_1_SPEED: + case VOICE_PARAM_LFO_2_SPEED: + case VOICE_PARAM_LFO_3_SPEED: + LFO_Param2Set(&pObj->lfo[type-VOICE_PARAM_LFO_0_SPEED], LFO_PARAM2_FREQ, pObj->param[type]); + + // First voice sets params for global LFOs + if (pObj->id == 0) + { + LFO_Param2Set(&pObj->pCom->glfo[type-VOICE_PARAM_LFO_0_SPEED], LFO_PARAM2_FREQ, pObj->param[type]); + } + break; + + case VOICE_PARAM_LFO_0_SMOOTH: + case VOICE_PARAM_LFO_1_SMOOTH: + case VOICE_PARAM_LFO_2_SMOOTH: + case VOICE_PARAM_LFO_3_SMOOTH: + pObj->param[type] = value / 1000; + LFO_Param2Set(&pObj->lfo[type-VOICE_PARAM_LFO_0_SMOOTH], LFO_PARAM2_SMOOTH, pObj->param[type]); + + // First voice sets params for global LFOs + if (pObj->id == 0) + { + LFO_Param2Set(&pObj->pCom->glfo[type-VOICE_PARAM_LFO_0_SMOOTH], LFO_PARAM2_SMOOTH, pObj->param[type]); + } + break; + + case VOICE_PARAM_LFO_0_DELAY: + case VOICE_PARAM_LFO_1_DELAY: + case VOICE_PARAM_LFO_2_DELAY: + case VOICE_PARAM_LFO_3_DELAY: + pObj->param[type] = value / 1000; + LFO_Param2Set(&pObj->lfo[type-VOICE_PARAM_LFO_0_DELAY], LFO_PARAM2_DELAY, pObj->param[type]); + + // First voice sets params for global LFOs + if (pObj->id == 0) + { + LFO_Param2Set(&pObj->pCom->glfo[type-VOICE_PARAM_LFO_0_DELAY], LFO_PARAM2_DELAY, pObj->param[type]); + } + break; + + case VOICE_PARAM_LFO_0_ATTACK: + case VOICE_PARAM_LFO_1_ATTACK: + case VOICE_PARAM_LFO_2_ATTACK: + case VOICE_PARAM_LFO_3_ATTACK: + pObj->param[type] = value / 1000; + LFO_Param2Set(&pObj->lfo[type-VOICE_PARAM_LFO_0_ATTACK], LFO_PARAM2_ATTACK, pObj->param[type]); + + // First voice sets params for global LFOs + if (pObj->id == 0) + { + LFO_Param2Set(&pObj->pCom->glfo[type-VOICE_PARAM_LFO_0_ATTACK], LFO_PARAM2_ATTACK, pObj->param[type]); + } + break; + + case VOICE_PARAM_LFO_0_SHAPE: + case VOICE_PARAM_LFO_1_SHAPE: + case VOICE_PARAM_LFO_2_SHAPE: + case VOICE_PARAM_LFO_3_SHAPE: + LFO_Param2Set(&pObj->lfo[type-VOICE_PARAM_LFO_0_SHAPE], LFO_PARAM2_WAVEFORM, (int)pObj->param[type]); + + // First voice sets params for global LFOs + if (pObj->id == 0) + { + LFO_Param2Set(&pObj->pCom->glfo[type-VOICE_PARAM_LFO_0_SHAPE], LFO_PARAM2_WAVEFORM, pObj->param[type]); + } + break; + + case VOICE_PARAM_LFO_0_SYMMETRY: + case VOICE_PARAM_LFO_1_SYMMETRY: + case VOICE_PARAM_LFO_2_SYMMETRY: + case VOICE_PARAM_LFO_3_SYMMETRY: + pObj->param[type] = value / 100; + LFO_Param2Set(&pObj->lfo[type-VOICE_PARAM_LFO_0_SYMMETRY], LFO_PARAM2_SYMMETRY, pObj->param[type]); + + // First voice sets params for global LFOs + if (pObj->id == 0) + { + LFO_Param2Set(&pObj->pCom->glfo[type-VOICE_PARAM_LFO_0_SYMMETRY], LFO_PARAM2_SYMMETRY, pObj->param[type]); + } + break; + + + default: + break; + } +} + +synth_float_t VoiceParamGet(voice_t *pObj, UINT32 type) +{ + return pObj->param[type]; +} + +UINT32 VoiceStateGet(voice_t *pObj) +{ + return pObj->state; +} + +void VoiceProcessDataV_Common(voice_t *pObj, float *pOut1, float *pOut2, UINT32 len) +{ + UINT32 i; + + voice_common_t *pCom = pObj->pCom; + synth_float_t *pModSrc[VOICE_NUM_MOD_SOURCES]; + synth_float_t env_gain; + + // Temp Variables + synth_float_t vcf_fm[SYNTH_MAX_BUFSIZE]; + synth_float_t vcf_qm[SYNTH_MAX_BUFSIZE]; + synth_float_t temp[SYNTH_MAX_BUFSIZE]; + + // First voice only + if (pObj->id == 0) + { + // Processes global LFOs + for (i=0; i < VOICE_NUM_LFO; i++) + { + if ((int)pObj->param[VOICE_PARAM_LFO_0_MODE+i] == VOICE_LFO_MODE_GLOBAL) + pCom->pBuf_LFO_gbl[i] = LFO_ProcessDataV(&pCom->glfo[i], len); + } + + // Zero noise output + for (i=0; i< len; i++) + { + pCom->noise_out[i] = 0; + } + +#if 0 + // Process global envelope generators + for (i=0; i < (INT32)VOICE_NUM_ENV; i++) + { + pCom->pBuf_ENV_gbl[i] = ENV_ProcessDataV(&pCom->genv[i], len); + } + + // Assign modulation sources + i = 0; + pModSrc[i++] = pCom->pBuf_zeros; // Off + pModSrc[i++] = pCom->pBuf_LFO_gbl[0]; + pModSrc[i++] = pCom->pBuf_LFO_gbl[1]; + pModSrc[i++] = pCom->pBuf_LFO_gbl[2]; + pModSrc[i++] = pCom->pBuf_LFO_gbl[3]; + pModSrc[i++] = pCom->pBuf_ENV_gbl[0]; // Env. 0 + pModSrc[i++] = pCom->pBuf_ENV_gbl[1]; // Env. 1 + pModSrc[i++] = pCom->pBuf_ENV_gbl[2]; // Env. 2 + pModSrc[i++] = pCom->pBuf_ENV_gbl[3]; // Env. 3 + pModSrc[i++] = pCom->pBuf_zeros; // VCO 1 AM/FM + pModSrc[i++] = pCom->pBuf_zeros; // VCO 2 AM/FM + + // Mix Cutoff modulator + env_gain = pObj->param[VOICE_PARAM_VCF_ENV_GAIN]; + + if ((int)pObj->param[VOICE_PARAM_VCF_F_SRC_1] == VOICE_MOD_SRC_1_DISABLED) + { + Add_VS(vcf_fm, pModSrc[(int)pObj->param[VOICE_PARAM_VCF_F_SRC_0]], 1.0, 0, len); + } + else + { + switch((int)pObj->param[VOICE_PARAM_VCF_F_SRC_OP]) + { + default: + case VOICE_MOD_SRC_OP_ADD: + Add_VV(vcf_fm, pModSrc[(int)pObj->param[VOICE_PARAM_VCF_F_SRC_0]], 1.0, pModSrc[(int)pObj->param[VOICE_PARAM_VCF_F_SRC_1]], pObj->param[VOICE_PARAM_VCF_F_AMT_1], len); + break; + + case VOICE_MOD_SRC_OP_MUL: + Mul_VV(vcf_fm, pModSrc[(int)pObj->param[VOICE_PARAM_VCF_F_SRC_0]], pModSrc[(int)pObj->param[VOICE_PARAM_VCF_F_SRC_1]], len); + if (pObj->param[VOICE_PARAM_VCF_F_AMT_1] <= 0) + Add_inplace_VV(vcf_fm, pObj->param[VOICE_PARAM_VCF_F_AMT_1], pModSrc[(int)pObj->param[VOICE_PARAM_VCF_F_SRC_0]], 1, len); + else + Add_inplace_VV(vcf_fm, pObj->param[VOICE_PARAM_VCF_F_AMT_1], pModSrc[(int)pObj->param[VOICE_PARAM_VCF_F_SRC_0]], 0, len); + + break; + } + } + Add_inplace_VV(vcf_fm, pObj->param[VOICE_PARAM_VCF_F_AMT_0], pCom->pBuf_ENV_gbl[VOICE_ENV_VCF], env_gain, len); + Clamp_inplace_V(vcf_fm, -1, 1, len); + + // Mix resonance modulator + if ((int)pObj->param[VOICE_PARAM_VCF_Q_SRC_1] == VOICE_MOD_SRC_1_DISABLED) + { + Add_VS(vcf_qm, pModSrc[(int)pObj->param[VOICE_PARAM_VCF_Q_SRC_0]], 1.0, 0, len); + } + else + { + switch((int)pObj->param[VOICE_PARAM_VCF_Q_SRC_OP]) + { + default: + case VOICE_MOD_SRC_OP_ADD: + Add_VV(vcf_qm, pModSrc[(int)pObj->param[VOICE_PARAM_VCF_Q_SRC_0]], 1.0, pModSrc[(int)pObj->param[VOICE_PARAM_VCF_Q_SRC_1]], pObj->param[VOICE_PARAM_VCF_Q_AMT_1], len); + break; + + case VOICE_MOD_SRC_OP_MUL: + Mul_VV(vcf_qm, pModSrc[(int)pObj->param[VOICE_PARAM_VCF_Q_SRC_0]], pModSrc[(int)pObj->param[VOICE_PARAM_VCF_Q_SRC_1]], len); + if (pObj->param[VOICE_PARAM_VCF_Q_AMT_1] <= 0) + Add_inplace_VV(vcf_qm, pObj->param[VOICE_PARAM_VCF_Q_AMT_1], pModSrc[(int)pObj->param[VOICE_PARAM_VCF_Q_SRC_0]], 1, len); + else + Add_inplace_VV(vcf_qm, pObj->param[VOICE_PARAM_VCF_Q_AMT_1], pModSrc[(int)pObj->param[VOICE_PARAM_VCF_Q_SRC_0]], 0, len); + break; + } + } + Mul_inplace_VS(vcf_qm, pObj->param[VOICE_PARAM_VCF_Q_AMT_0], len); + Clamp_inplace_V(vcf_qm, -1, 1, len); + + for (i=0; i< len; i++) + temp[i] = pOut1[i]; + + pCom->pBuf_VCF_gbl_out = VCF_ProcessDataV(&pObj->pCom->gvcf[0], vcf_fm, vcf_qm, temp, len); + for (i=0; i< len; i++) + pOut1[i] = pCom->pBuf_VCF_gbl_out[i]; + + for (i=0; i< len; i++) + temp[i] = pOut2[i]; + + pCom->pBuf_VCF_gbl_out = VCF_ProcessDataV(&pObj->pCom->gvcf[1], vcf_fm, vcf_qm, temp, len); + for (i=0; i< len; i++) + pOut2[i] = pCom->pBuf_VCF_gbl_out[i]; + +#endif + if (pObj->param[VOICE_PARAM_NOISE_ENABLE] > 0.5) + { + if ((int)pObj->param[VOICE_PARAM_NOISE_SHAPE] == VOICE_NOISE_SHAPE_WHITE) + { + for (i=0; i< len; i++) + { + pCom->noise_out[i] = Noise_Uniform(&pCom->gnoise, 2.0f, 0.0); + } + } + + if ((int)pObj->param[VOICE_PARAM_NOISE_SHAPE] == VOICE_NOISE_SHAPE_PINK) + { + for (i=0; i< len; i++) + { + pCom->noise_out[i] = Noise_Gaussian(&pCom->gnoise, 2*0.28867513459481f, 0.0); + } + } + } + } + +} + +void VoiceProcessDataV(voice_t *pObj, float *pOut1, float *pOut2, UINT32 len) +{ + int i, j; + synth_float_t out, env_gain; + synth_float_t *pBuf_ENV[VOICE_NUM_ENV], *pBuf_Postvcf; + synth_float_t *pBuf_OSC[VOICE_NUM_OSC]; + synth_float_t *pBuf_LFO[VOICE_NUM_LFO]; + UINT32 vco_is_disabled[VOICE_NUM_OSC]; + synth_float_t *pModSrc[VOICE_NUM_MOD_SOURCES]; + voice_common_t *pCom = pObj->pCom; + + // Temp Variables + synth_float_t VCO_fmout[VOICE_NUM_OSC][SYNTH_MAX_BUFSIZE]; + synth_float_t vco_pwm[SYNTH_MAX_BUFSIZE]; + synth_float_t vco_fm[SYNTH_MAX_BUFSIZE]; + synth_float_t vco_am[SYNTH_MAX_BUFSIZE]; + synth_float_t vcf_fm[SYNTH_MAX_BUFSIZE]; + synth_float_t vcf_qm[SYNTH_MAX_BUFSIZE]; + synth_float_t vca_am[SYNTH_MAX_BUFSIZE]; + synth_float_t vca_pan[SYNTH_MAX_BUFSIZE]; + synth_float_t vco_pitch[VOICE_NUM_OSC][SYNTH_MAX_BUFSIZE]; + synth_float_t osc_out[SYNTH_MAX_BUFSIZE]; + synth_float_t osc_out_smoothed[VOICE_NUM_OSC][SYNTH_MAX_BUFSIZE]; + +#if 0 + // Process parameter smoothing + for (i=0; i < (INT32)VOICE_NUM_PARAMS; i++) + { + if (pObj->pParam_smoother[i]) + { + if (!Smooth_is_settled(pObj->pParam_smoother[i], pObj->param[i])) + { + Smooth_Process_V(pObj->pParam_smoother[i], pObj->param[i], pObj->param_smoothed[i], len); + } + } + } +#endif + + // Process envelope generators + for (i=0; i < (INT32)VOICE_NUM_ENV; i++) + { + pBuf_ENV[i] = ENV_ProcessDataV(&pObj->env[i], len); + } + + // Process LFOs + for (i=0; i < (INT32)VOICE_NUM_LFO; i++) + { + if ((int)pObj->param[VOICE_PARAM_LFO_0_MODE+i] == VOICE_LFO_MODE_INDIVIDUAL) + { + pBuf_LFO[i] = LFO_ProcessDataV(&pObj->lfo[i], len); + } + } + + // Use global LFO + for (i=0; i < (INT32)VOICE_NUM_LFO; i++) + { + if ((int)pObj->param[VOICE_PARAM_LFO_0_MODE+i] == VOICE_LFO_MODE_GLOBAL) + { + pBuf_LFO[i] = pCom->pBuf_LFO_gbl[i]; + } + } + + // Assign modulation sources + i = 0; + pModSrc[i++] = pCom->pBuf_zeros; // Off + pModSrc[i++] = pBuf_LFO[0]; + pModSrc[i++] = pBuf_LFO[1]; + pModSrc[i++] = pBuf_LFO[2]; + pModSrc[i++] = pBuf_LFO[3]; + pModSrc[i++] = pBuf_ENV[0]; // Env. 0 + pModSrc[i++] = pBuf_ENV[1]; // Env. 1 + pModSrc[i++] = pBuf_ENV[2]; // Env. 2 + pModSrc[i++] = pBuf_ENV[3]; // Env. 3 + pModSrc[i++] = pCom->pBuf_zeros; // VCO 1 AM/FM + pModSrc[i++] = pCom->pBuf_zeros; // VCO 2 AM/FM + + // Process smoothing for VCO switching + for (i=0; i < (INT32)VOICE_NUM_OSC; i++) + { + vco_is_disabled[i] = Smooth_is_settled(&pObj->smooth_vco_enable[i], 0) && (pObj->param[VOICE_PARAM_OSC_0_ENABLE+i] < 0.5); + } + + // Process pitche for VCOs + for (i=0; i < (INT32)VOICE_NUM_OSC; i++) + { + if (pObj->param[VOICE_PARAM_PORTAMENTO_TIME] <= 0.001) + { + Add_inplace_VS(vco_pitch[i], 0, pObj->vco_pitch[i], len); + } + else + { + Smooth_Process_V(&pObj->smooth_vco_portamento[i], pObj->vco_pitch[i], vco_pitch[i], len); + } + } + + // Process Oscillators + pBuf_OSC[0] = VCO_GetProcessBuffer(&pObj->vco[0]); + if (!vco_is_disabled[0]) + { + // FM 0 + if ((int)pObj->param[VOICE_PARAM_OSC_0_FM_SRC_1] == VOICE_MOD_SRC_1_DISABLED) + { + Add_VS(vco_fm, pModSrc[(int)pObj->param[VOICE_PARAM_OSC_0_FM_SRC_0]], 1.0, 0, len); + } + else + { + switch((int)pObj->param[VOICE_PARAM_OSC_0_FM_SRC_OP]) + { + default: + case VOICE_MOD_SRC_OP_ADD: + Add_VV(vco_fm, pModSrc[(int)pObj->param[VOICE_PARAM_OSC_0_FM_SRC_0]], 1.0, pModSrc[(int)pObj->param[VOICE_PARAM_OSC_0_FM_SRC_1]], pObj->param[VOICE_PARAM_OSC_0_FM_AMT_1], len); + break; + + case VOICE_MOD_SRC_OP_MUL: + Mul_VV(vco_fm, pModSrc[(int)pObj->param[VOICE_PARAM_OSC_0_FM_SRC_0]], pModSrc[(int)pObj->param[VOICE_PARAM_OSC_0_FM_SRC_1]], len); + if (pObj->param[VOICE_PARAM_OSC_0_FM_AMT_1] <= 0) + Add_inplace_VV(vco_fm, pObj->param[VOICE_PARAM_OSC_0_FM_AMT_1], pModSrc[(int)pObj->param[VOICE_PARAM_OSC_0_FM_SRC_0]], 1, len); + else + Add_inplace_VV(vco_fm, pObj->param[VOICE_PARAM_OSC_0_FM_AMT_1], pModSrc[(int)pObj->param[VOICE_PARAM_OSC_0_FM_SRC_0]], 0, len); + break; + } + } + Clamp_inplace_V(vco_fm, -1, 1, len); + Mul_inplace_VS(vco_fm, pObj->param[VOICE_PARAM_OSC_0_FM_AMT_0], len); + + // PWM 0 + if ((int)pObj->param[VOICE_PARAM_OSC_0_PWM_SRC_1] == VOICE_MOD_SRC_1_DISABLED) + { + Add_VS(vco_pwm, pModSrc[(int)pObj->param[VOICE_PARAM_OSC_0_PWM_SRC_0]], 1.0, 0, len); + } + else + { + switch((int)pObj->param[VOICE_PARAM_OSC_0_PWM_SRC_OP]) + { + default: + case VOICE_MOD_SRC_OP_ADD: + Add_VV(vco_pwm, pModSrc[(int)pObj->param[VOICE_PARAM_OSC_0_PWM_SRC_0]], 1.0, pModSrc[(int)pObj->param[VOICE_PARAM_OSC_0_PWM_SRC_1]], pObj->param[VOICE_PARAM_OSC_0_PWM_AMT_1], len); + break; + + case VOICE_MOD_SRC_OP_MUL: + Mul_VV(vco_pwm, pModSrc[(int)pObj->param[VOICE_PARAM_OSC_0_PWM_SRC_0]], pModSrc[(int)pObj->param[VOICE_PARAM_OSC_0_PWM_SRC_1]], len); + if (pObj->param[VOICE_PARAM_OSC_0_PWM_AMT_1] <= 0) + Add_inplace_VV(vco_pwm, pObj->param[VOICE_PARAM_OSC_0_PWM_AMT_1], pModSrc[(int)pObj->param[VOICE_PARAM_OSC_0_PWM_SRC_0]], 1, len); + else + Add_inplace_VV(vco_pwm, pObj->param[VOICE_PARAM_OSC_0_PWM_AMT_1], pModSrc[(int)pObj->param[VOICE_PARAM_OSC_0_PWM_SRC_0]], 0, len); + break; + } + } + Mul_inplace_VS(vco_pwm, pObj->param[VOICE_PARAM_OSC_0_PWM_AMT_0], len); + + // Process VCO 0 + VCO_ProcessDataV(&pObj->vco[0], vco_pitch[0], vco_fm, vco_pwm, NULL, NULL, len); + + // AM 0 + if ((int)pObj->param[VOICE_PARAM_OSC_0_AM_SRC_1] == VOICE_MOD_SRC_1_DISABLED) + { + Add_VS(vco_am, pModSrc[(int)pObj->param[VOICE_PARAM_OSC_0_AM_SRC_0]], 1.0, 0, len); + } + else + { + switch((int)pObj->param[VOICE_PARAM_OSC_0_AM_SRC_OP]) + { + default: + case VOICE_MOD_SRC_OP_ADD: + Add_VV(vco_am, pModSrc[(int)pObj->param[VOICE_PARAM_OSC_0_AM_SRC_0]], 1.0, pModSrc[(int)pObj->param[VOICE_PARAM_OSC_0_AM_SRC_1]], pObj->param[VOICE_PARAM_OSC_0_AM_AMT_1], len); + break; + + case VOICE_MOD_SRC_OP_MUL: + Mul_VV(vco_am, pModSrc[(int)pObj->param[VOICE_PARAM_OSC_0_AM_SRC_0]], pModSrc[(int)pObj->param[VOICE_PARAM_OSC_0_AM_SRC_1]], len); + if (pObj->param[VOICE_PARAM_OSC_0_AM_AMT_1] <= 0) + Add_inplace_VV(vco_am, pObj->param[VOICE_PARAM_OSC_0_AM_AMT_1], pModSrc[(int)pObj->param[VOICE_PARAM_OSC_0_AM_SRC_0]], 1, len); + else + Add_inplace_VV(vco_am, pObj->param[VOICE_PARAM_OSC_0_AM_AMT_1], pModSrc[(int)pObj->param[VOICE_PARAM_OSC_0_AM_SRC_0]], 0, len); + break; + } + } + if (((int)pObj->param[VOICE_PARAM_OSC_0_AM_SRC_0] != VOICE_MOD_SRC_0_DISABLED) || ((int)pObj->param[VOICE_PARAM_OSC_0_AM_SRC_1] != VOICE_MOD_SRC_1_DISABLED)) + { + if (pObj->param[VOICE_PARAM_OSC_0_AM_AMT_0] <= 0) + { + Add_inplace_VS(vco_am, pObj->param[VOICE_PARAM_OSC_0_AM_AMT_0], 1, len); + } + else + { + Add_inplace_VS(vco_am, pObj->param[VOICE_PARAM_OSC_0_AM_AMT_0], 0, len); + } + + Clamp_inplace_V(vco_am, 0, 1, len); + + // Modulate + Mul_inplace_VV(pBuf_OSC[0], vco_am, len); + } + } + + if (!vco_is_disabled[0]) + { + Add_VS(VCO_fmout[0], pBuf_OSC[0], 0.5, 0.5, len); + pModSrc[VOICE_MOD_SRC_VCO_0] = VCO_fmout[0]; +// pModSrc[VOICE_MOD_SRC_VCO_0] = pBuf_OSC[0]; + } + + pBuf_OSC[1] = VCO_GetProcessBuffer(&pObj->vco[1]); + if (!vco_is_disabled[1]) + { + // FM 1 + if ((int)pObj->param[VOICE_PARAM_OSC_1_FM_SRC_1] == VOICE_MOD_SRC_1_DISABLED) + { + Add_VS(vco_fm, pModSrc[(int)pObj->param[VOICE_PARAM_OSC_1_FM_SRC_0]], 1.0, 0, len); + } + else + { + switch((int)pObj->param[VOICE_PARAM_OSC_1_FM_SRC_OP]) + { + default: + case VOICE_MOD_SRC_OP_ADD: + Add_VV(vco_fm, pModSrc[(int)pObj->param[VOICE_PARAM_OSC_1_FM_SRC_0]], 1.0, pModSrc[(int)pObj->param[VOICE_PARAM_OSC_1_FM_SRC_1]], pObj->param[VOICE_PARAM_OSC_1_FM_AMT_1], len); + break; + + case VOICE_MOD_SRC_OP_MUL: + Mul_VV(vco_fm, pModSrc[(int)pObj->param[VOICE_PARAM_OSC_1_FM_SRC_0]], pModSrc[(int)pObj->param[VOICE_PARAM_OSC_1_FM_SRC_1]], len); + if (pObj->param[VOICE_PARAM_OSC_1_FM_AMT_1] <= 0) + Add_inplace_VV(vco_fm, pObj->param[VOICE_PARAM_OSC_1_FM_AMT_1], pModSrc[(int)pObj->param[VOICE_PARAM_OSC_1_FM_SRC_0]], 1, len); + else + Add_inplace_VV(vco_fm, pObj->param[VOICE_PARAM_OSC_1_FM_AMT_1], pModSrc[(int)pObj->param[VOICE_PARAM_OSC_1_FM_SRC_0]], 0, len); + break; + } + } + Clamp_inplace_V(vco_fm, -1, 1, len); + Mul_inplace_VS(vco_fm, pObj->param[VOICE_PARAM_OSC_1_FM_AMT_0], len); + + // PWM 1 + if ((int)pObj->param[VOICE_PARAM_OSC_1_PWM_SRC_1] == VOICE_MOD_SRC_1_DISABLED) + { + Add_VS(vco_pwm, pModSrc[(int)pObj->param[VOICE_PARAM_OSC_1_PWM_SRC_0]], 1.0, 0, len); + } + else + { + switch((int)pObj->param[VOICE_PARAM_OSC_1_PWM_SRC_OP]) + { + default: + case VOICE_MOD_SRC_OP_ADD: + Add_VV(vco_pwm, pModSrc[(int)pObj->param[VOICE_PARAM_OSC_1_PWM_SRC_0]], 1.0, pModSrc[(int)pObj->param[VOICE_PARAM_OSC_1_PWM_SRC_1]], pObj->param[VOICE_PARAM_OSC_1_PWM_AMT_1], len); + break; + + case VOICE_MOD_SRC_OP_MUL: + Mul_VV(vco_pwm, pModSrc[(int)pObj->param[VOICE_PARAM_OSC_1_PWM_SRC_0]], pModSrc[(int)pObj->param[VOICE_PARAM_OSC_1_PWM_SRC_1]], len); + if (pObj->param[VOICE_PARAM_OSC_1_PWM_AMT_1] <= 0) + Add_inplace_VV(vco_pwm, pObj->param[VOICE_PARAM_OSC_1_PWM_AMT_1], pModSrc[(int)pObj->param[VOICE_PARAM_OSC_1_PWM_SRC_0]], 1, len); + else + Add_inplace_VV(vco_pwm, pObj->param[VOICE_PARAM_OSC_1_PWM_AMT_1], pModSrc[(int)pObj->param[VOICE_PARAM_OSC_1_PWM_SRC_0]], 0, len); + break; + } + } + Mul_inplace_VS(vco_pwm, pObj->param[VOICE_PARAM_OSC_1_PWM_AMT_0], len); + + // Process VCO 1 + VCO_ProcessDataV(&pObj->vco[1], vco_pitch[1], vco_fm, vco_pwm, NULL, NULL, len); + + // AM 1 + if ((int)pObj->param[VOICE_PARAM_OSC_1_AM_SRC_1] == VOICE_MOD_SRC_1_DISABLED) + { + Add_VS(vco_am, pModSrc[(int)pObj->param[VOICE_PARAM_OSC_1_AM_SRC_0]], 1.0, 0, len); + } + else + { + switch((int)pObj->param[VOICE_PARAM_OSC_1_AM_SRC_OP]) + { + default: + case VOICE_MOD_SRC_OP_ADD: + Add_VV(vco_am, pModSrc[(int)pObj->param[VOICE_PARAM_OSC_1_AM_SRC_0]], 1.0, pModSrc[(int)pObj->param[VOICE_PARAM_OSC_1_AM_SRC_1]], pObj->param[VOICE_PARAM_OSC_1_AM_AMT_1], len); + break; + + case VOICE_MOD_SRC_OP_MUL: + Mul_VV(vco_am, pModSrc[(int)pObj->param[VOICE_PARAM_OSC_1_AM_SRC_0]], pModSrc[(int)pObj->param[VOICE_PARAM_OSC_1_AM_SRC_1]], len); + if (pObj->param[VOICE_PARAM_OSC_1_AM_AMT_1] <= 0) + Add_inplace_VV(vco_am, pObj->param[VOICE_PARAM_OSC_1_AM_AMT_1], pModSrc[(int)pObj->param[VOICE_PARAM_OSC_1_AM_SRC_0]], 1, len); + else + Add_inplace_VV(vco_am, pObj->param[VOICE_PARAM_OSC_1_AM_AMT_1], pModSrc[(int)pObj->param[VOICE_PARAM_OSC_1_AM_SRC_0]], 0, len); + break; + } + } + if (((int)pObj->param[VOICE_PARAM_OSC_1_AM_SRC_0] != VOICE_MOD_SRC_0_DISABLED) || ((int)pObj->param[VOICE_PARAM_OSC_1_AM_SRC_1] != VOICE_MOD_SRC_1_DISABLED)) + { + if (pObj->param[VOICE_PARAM_OSC_1_AM_AMT_0] <= 0) + { + Add_inplace_VS(vco_am, pObj->param[VOICE_PARAM_OSC_1_AM_AMT_0], 1, len); + } + else + { + Add_inplace_VS(vco_am, pObj->param[VOICE_PARAM_OSC_1_AM_AMT_0], 0, len); + } + + Clamp_inplace_V(vco_am, 0, 1, len); + + // Modulate + Mul_inplace_VV(pBuf_OSC[1], vco_am, len); + } + } + + if (!vco_is_disabled[1]) + { + Add_VS(VCO_fmout[1], pBuf_OSC[1], 0.5, 0.5, len); + pModSrc[VOICE_MOD_SRC_VCO_1] = VCO_fmout[1]; +// pModSrc[VOICE_MOD_SRC_VCO_1] = pBuf_OSC[1]; + } + + // Smooth Oscillator output during switching on/off and do level adjust here + for (i=0; i < (INT32)VOICE_NUM_OSC; i++) + { + Smooth_Process_VV(&pObj->smooth_vco_enable[i], pObj->param[VOICE_PARAM_OSC_0_ENABLE+i], pBuf_OSC[i], osc_out_smoothed[i], len); + } + + // Mix Oscillators + Add_VV(osc_out, osc_out_smoothed[0], pObj->param[VOICE_PARAM_OSC_0_LEVEL], pCom->noise_out, pObj->param[VOICE_PARAM_NOISE_LEVEL], len); + Add_inplace_VV(osc_out, 1, osc_out_smoothed[1], pObj->param[VOICE_PARAM_OSC_1_LEVEL], len); + + // Mix Cutoff modulator + env_gain = pObj->param[VOICE_PARAM_VCF_ENV_GAIN]; + + if ((int)pObj->param[VOICE_PARAM_VCF_F_SRC_1] == VOICE_MOD_SRC_1_DISABLED) + { + Add_VS(vcf_fm, pModSrc[(int)pObj->param[VOICE_PARAM_VCF_F_SRC_0]], 1.0, 0, len); + } + else + { + switch((int)pObj->param[VOICE_PARAM_VCF_F_SRC_OP]) + { + default: + case VOICE_MOD_SRC_OP_ADD: + Add_VV(vcf_fm, pModSrc[(int)pObj->param[VOICE_PARAM_VCF_F_SRC_0]], 1.0, pModSrc[(int)pObj->param[VOICE_PARAM_VCF_F_SRC_1]], pObj->param[VOICE_PARAM_VCF_F_AMT_1], len); + break; + + case VOICE_MOD_SRC_OP_MUL: + Mul_VV(vcf_fm, pModSrc[(int)pObj->param[VOICE_PARAM_VCF_F_SRC_0]], pModSrc[(int)pObj->param[VOICE_PARAM_VCF_F_SRC_1]], len); + if (pObj->param[VOICE_PARAM_VCF_F_AMT_1] <= 0) + Add_inplace_VV(vcf_fm, pObj->param[VOICE_PARAM_VCF_F_AMT_1], pModSrc[(int)pObj->param[VOICE_PARAM_VCF_F_SRC_0]], 1, len); + else + Add_inplace_VV(vcf_fm, pObj->param[VOICE_PARAM_VCF_F_AMT_1], pModSrc[(int)pObj->param[VOICE_PARAM_VCF_F_SRC_0]], 0, len); + + break; + } + } + Add_inplace_VV(vcf_fm, pObj->param[VOICE_PARAM_VCF_F_AMT_0], pBuf_ENV[VOICE_ENV_VCF], env_gain, len); + Clamp_inplace_V(vcf_fm, -1, 1, len); + + // Mix resonance modulator + if ((int)pObj->param[VOICE_PARAM_VCF_Q_SRC_1] == VOICE_MOD_SRC_1_DISABLED) + { + Add_VS(vcf_qm, pModSrc[(int)pObj->param[VOICE_PARAM_VCF_Q_SRC_0]], 1.0, 0, len); + } + else + { + switch((int)pObj->param[VOICE_PARAM_VCF_Q_SRC_OP]) + { + default: + case VOICE_MOD_SRC_OP_ADD: + Add_VV(vcf_qm, pModSrc[(int)pObj->param[VOICE_PARAM_VCF_Q_SRC_0]], 1.0, pModSrc[(int)pObj->param[VOICE_PARAM_VCF_Q_SRC_1]], pObj->param[VOICE_PARAM_VCF_Q_AMT_1], len); + break; + + case VOICE_MOD_SRC_OP_MUL: + Mul_VV(vcf_qm, pModSrc[(int)pObj->param[VOICE_PARAM_VCF_Q_SRC_0]], pModSrc[(int)pObj->param[VOICE_PARAM_VCF_Q_SRC_1]], len); + if (pObj->param[VOICE_PARAM_VCF_Q_AMT_1] <= 0) + Add_inplace_VV(vcf_qm, pObj->param[VOICE_PARAM_VCF_Q_AMT_1], pModSrc[(int)pObj->param[VOICE_PARAM_VCF_Q_SRC_0]], 1, len); + else + Add_inplace_VV(vcf_qm, pObj->param[VOICE_PARAM_VCF_Q_AMT_1], pModSrc[(int)pObj->param[VOICE_PARAM_VCF_Q_SRC_0]], 0, len); + break; + } + } + Mul_inplace_VS(vcf_qm, pObj->param[VOICE_PARAM_VCF_Q_AMT_0], len); + Clamp_inplace_V(vcf_qm, -1, 1, len); + + // Filter envelope and filtering + for (i=0; i < (INT32)VOICE_NUM_OSC; i++) + { + vco_is_disabled[i] = Smooth_is_settled(&pObj->smooth_vco_enable[i], 0) && (pObj->param[VOICE_PARAM_OSC_0_ENABLE+i] < 0.5); + } + if (vco_is_disabled[0] && vco_is_disabled[1] && (pObj->param[VOICE_PARAM_NOISE_ENABLE] < 0.5)) + { + pBuf_Postvcf = osc_out; + } + else + { + pBuf_Postvcf = VCF_ProcessDataV(&pObj->vcf, vcf_fm, vcf_qm, osc_out, len); + } + + // Amplifier envelope and voice panning + env_gain = 0.25f*max(0, min(1, pObj->param[VOICE_PARAM_VCA_ENV_GAIN])); + + // VCA AM + Mul_VS(vca_am, pModSrc[(int)pObj->param[VOICE_PARAM_VCA_AM_SRC_0]], pObj->param[VOICE_PARAM_VCA_AM_AMT_0], len); + Add_inplace_VS(vca_am, -1.0, 1.0, len); + + // VCA PAN + if ((int)pObj->param[VOICE_PARAM_VCA_PAN_SRC_0] != VOICE_MOD_SRC_0_DISABLED) + { + Add_VS(vca_pan, pModSrc[(int)pObj->param[VOICE_PARAM_VCA_PAN_SRC_0]], 2.0, -1.0, len); + Mul_inplace_VS(vca_pan, pObj->param[VOICE_PARAM_VCA_PAN_AMT_0], len); + } + else + { + Add_VS(vca_pan, pModSrc[(int)pObj->param[VOICE_PARAM_VCA_PAN_SRC_0]], 0, pObj->param[VOICE_PARAM_VCA_PAN_AMT_0], len); + } + + for (j=0; j < (INT32)len; j++) + { +// env_gain = 0.25f*max(0, min(1, pObj->param_smoothed[VOICE_PARAM_VCA_ENV_GAIN][j])); + out = pBuf_Postvcf[j] * pBuf_ENV[VOICE_ENV_VCA][j] * env_gain * vca_am[j]; + (*pOut1++) += (float)((1+pObj->param[VOICE_PARAM_VOICE_PAN])*(1+vca_pan[j])*out); + (*pOut2++) += (float)((1-pObj->param[VOICE_PARAM_VOICE_PAN])*(1-vca_pan[j])*out); + } + + if (ENV_IsIdle(&pObj->env[VOICE_ENV_VCA])) + { + pObj->state = note_state_idle; + for (i = 0; i < VOICE_NUM_ENV; i++) + ENV_Reset(&pObj->env[i]); + + } +} diff --git a/Source/synth/voice.h b/Source/synth/voice.h new file mode 100644 index 0000000..bfaf5fc --- /dev/null +++ b/Source/synth/voice.h @@ -0,0 +1,322 @@ +// -------------------------------------------------------------- +// -------------------------------------------------------------- +#ifndef _VOICE_H_ +#define _VOICE_H_ + +#include "synth_defs.h" +#include "env.h" +#include "vco.h" +#include "vcf.h" +#include "lfo.h" +#include "smooth.h" + +#define VOICE_OSC_SPREAD_PHASE_AMT 0.01 +// -------------------------------------------------------------- +// Types +// -------------------------------------------------------------- +enum +{ + VOICE_PARAM_MASTER_TUNE = 0, + VOICE_PARAM_MASTER_FREF, + VOICE_PARAM_VOICE_PAN, + VOICE_PARAM_PORTAMENTO_TIME, + VOICE_PARAM_OSC_0_ENABLE, + VOICE_PARAM_OSC_1_ENABLE, + VOICE_PARAM_OSC_0_RESTART_ON_TRIGGER, + VOICE_PARAM_OSC_1_RESTART_ON_TRIGGER, + VOICE_PARAM_OSC_0_LEVEL, + VOICE_PARAM_OSC_1_LEVEL, + VOICE_PARAM_OSC_0_PHASE, + VOICE_PARAM_OSC_1_PHASE, + VOICE_PARAM_OSC_0_DUTYCYCLE, + VOICE_PARAM_OSC_1_DUTYCYCLE, + VOICE_PARAM_OSC_0_DETUNE, + VOICE_PARAM_OSC_1_DETUNE, + VOICE_PARAM_OSC_0_TRANSPOSE, + VOICE_PARAM_OSC_1_TRANSPOSE, + VOICE_PARAM_OSC_0_SCALE, + VOICE_PARAM_OSC_1_SCALE, + VOICE_PARAM_OSC_0_WAVEFORM, + VOICE_PARAM_OSC_1_WAVEFORM, + VOICE_PARAM_OSC_0_FM_AMT_0, + VOICE_PARAM_OSC_1_FM_AMT_0, + VOICE_PARAM_OSC_0_FM_AMT_1, + VOICE_PARAM_OSC_1_FM_AMT_1, + VOICE_PARAM_OSC_0_FM_SRC_0, + VOICE_PARAM_OSC_1_FM_SRC_0, + VOICE_PARAM_OSC_0_FM_SRC_1, + VOICE_PARAM_OSC_1_FM_SRC_1, + VOICE_PARAM_OSC_0_FM_SRC_OP, + VOICE_PARAM_OSC_1_FM_SRC_OP, + VOICE_PARAM_OSC_0_AM_AMT_0, + VOICE_PARAM_OSC_1_AM_AMT_0, + VOICE_PARAM_OSC_0_AM_AMT_1, + VOICE_PARAM_OSC_1_AM_AMT_1, + VOICE_PARAM_OSC_0_AM_SRC_0, + VOICE_PARAM_OSC_1_AM_SRC_0, + VOICE_PARAM_OSC_0_AM_SRC_1, + VOICE_PARAM_OSC_1_AM_SRC_1, + VOICE_PARAM_OSC_0_AM_SRC_OP, + VOICE_PARAM_OSC_1_AM_SRC_OP, + VOICE_PARAM_OSC_0_PWM_AMT_0, + VOICE_PARAM_OSC_1_PWM_AMT_0, + VOICE_PARAM_OSC_0_PWM_AMT_1, + VOICE_PARAM_OSC_1_PWM_AMT_1, + VOICE_PARAM_OSC_0_PWM_SRC_0, + VOICE_PARAM_OSC_1_PWM_SRC_0, + VOICE_PARAM_OSC_0_PWM_SRC_1, + VOICE_PARAM_OSC_1_PWM_SRC_1, + VOICE_PARAM_OSC_0_PWM_SRC_OP, + VOICE_PARAM_OSC_1_PWM_SRC_OP, + VOICE_PARAM_NOISE_ENABLE, + VOICE_PARAM_NOISE_LEVEL, + VOICE_PARAM_NOISE_SHAPE, + VOICE_PARAM_KEY, + VOICE_PARAM_VCA_ENV_GAIN, + VOICE_PARAM_VCA_AM_AMT_0, + VOICE_PARAM_VCA_AM_SRC_0, + VOICE_PARAM_VCA_PAN_AMT_0, + VOICE_PARAM_VCA_PAN_SRC_0, + VOICE_PARAM_ENV_0_A, VOICE_PARAM_VCF_ENV_A = VOICE_PARAM_ENV_0_A, + VOICE_PARAM_ENV_1_A, VOICE_PARAM_VCA_ENV_A = VOICE_PARAM_ENV_1_A, + VOICE_PARAM_ENV_2_A, + VOICE_PARAM_ENV_3_A, + VOICE_PARAM_ENV_0_S, VOICE_PARAM_VCF_ENV_S = VOICE_PARAM_ENV_0_S, + VOICE_PARAM_ENV_1_S, VOICE_PARAM_VCA_ENV_S = VOICE_PARAM_ENV_1_S, + VOICE_PARAM_ENV_2_S, + VOICE_PARAM_ENV_3_S, + VOICE_PARAM_ENV_0_D, VOICE_PARAM_VCF_ENV_D = VOICE_PARAM_ENV_0_D, + VOICE_PARAM_ENV_1_D, VOICE_PARAM_VCA_ENV_D = VOICE_PARAM_ENV_1_D, + VOICE_PARAM_ENV_2_D, + VOICE_PARAM_ENV_3_D, + VOICE_PARAM_ENV_0_R, VOICE_PARAM_VCF_ENV_R = VOICE_PARAM_ENV_0_R, + VOICE_PARAM_ENV_1_R, VOICE_PARAM_VCA_ENV_R = VOICE_PARAM_ENV_1_R, + VOICE_PARAM_ENV_2_R, + VOICE_PARAM_ENV_3_R, + VOICE_PARAM_VCF_TYPE, + VOICE_PARAM_VCF_ORDER, + VOICE_PARAM_VCF_F, + VOICE_PARAM_VCF_Q, + VOICE_PARAM_VCF_Q_GAIN_0, + VOICE_PARAM_VCF_Q_CTRL_0, + VOICE_PARAM_VCF_ENV_GAIN, + VOICE_PARAM_VCF_F_AMT_0, + VOICE_PARAM_VCF_F_AMT_1, + VOICE_PARAM_VCF_F_SRC_0, + VOICE_PARAM_VCF_F_SRC_1, + VOICE_PARAM_VCF_F_SRC_OP, + VOICE_PARAM_VCF_Q_AMT_0, + VOICE_PARAM_VCF_Q_AMT_1, + VOICE_PARAM_VCF_Q_SRC_0, + VOICE_PARAM_VCF_Q_SRC_1, + VOICE_PARAM_VCF_Q_SRC_OP, + VOICE_PARAM_LFO_0_SPEED, + VOICE_PARAM_LFO_1_SPEED, + VOICE_PARAM_LFO_2_SPEED, + VOICE_PARAM_LFO_3_SPEED, + VOICE_PARAM_LFO_0_SMOOTH, + VOICE_PARAM_LFO_1_SMOOTH, + VOICE_PARAM_LFO_2_SMOOTH, + VOICE_PARAM_LFO_3_SMOOTH, + VOICE_PARAM_LFO_0_DELAY, + VOICE_PARAM_LFO_1_DELAY, + VOICE_PARAM_LFO_2_DELAY, + VOICE_PARAM_LFO_3_DELAY, + VOICE_PARAM_LFO_0_ATTACK, + VOICE_PARAM_LFO_1_ATTACK, + VOICE_PARAM_LFO_2_ATTACK, + VOICE_PARAM_LFO_3_ATTACK, + VOICE_PARAM_LFO_0_SHAPE, + VOICE_PARAM_LFO_1_SHAPE, + VOICE_PARAM_LFO_2_SHAPE, + VOICE_PARAM_LFO_3_SHAPE, + VOICE_PARAM_LFO_0_MODE, + VOICE_PARAM_LFO_1_MODE, + VOICE_PARAM_LFO_2_MODE, + VOICE_PARAM_LFO_3_MODE, + VOICE_PARAM_LFO_0_SYNC, + VOICE_PARAM_LFO_1_SYNC, + VOICE_PARAM_LFO_2_SYNC, + VOICE_PARAM_LFO_3_SYNC, + VOICE_PARAM_LFO_0_SYMMETRY, + VOICE_PARAM_LFO_1_SYMMETRY, + VOICE_PARAM_LFO_2_SYMMETRY, + VOICE_PARAM_LFO_3_SYMMETRY, + VOICE_NUM_PARAMS +}; + +enum +{ + VOICE_ENV_ENV_0 = 0, + VOICE_ENV_VCF = VOICE_ENV_ENV_0, + VOICE_ENV_ENV_1, + VOICE_ENV_VCA = VOICE_ENV_ENV_1, + VOICE_ENV_2, + VOICE_ENV_3, +}; + +enum +{ + VOICE_MOD_SRC_ZEROS = 0, + VOICE_MOD_SRC_LFO_0, + VOICE_MOD_SRC_LFO_1, + VOICE_MOD_SRC_LFO_2, + VOICE_MOD_SRC_LFO_3, + VOICE_MOD_SRC_ENV_0, + VOICE_MOD_SRC_ENV_1, + VOICE_MOD_SRC_ENV_2, + VOICE_MOD_SRC_ENV_3, + VOICE_MOD_SRC_VCO_0, + VOICE_MOD_SRC_VCO_1, + VOICE_NUM_MOD_SOURCES +}; + +enum +{ + VOICE_MOD_SRC_0_DISABLED = 0, + VOICE_MOD_SRC_0_LFO_0, + VOICE_MOD_SRC_0_LFO_1, + VOICE_MOD_SRC_0_LFO_2, + VOICE_MOD_SRC_0_LFO_3, + VOICE_MOD_SRC_0_ENV_0, + VOICE_MOD_SRC_0_ENV_1, + VOICE_MOD_SRC_0_ENV_2, + VOICE_MOD_SRC_0_ENV_3, + VOICE_MOD_SRC_0_VCO_0, + VOICE_NUM_MOD_SOURCES_0 +}; + +enum +{ + VOICE_MOD_SRC_1_DISABLED = 0, + VOICE_MOD_SRC_1_LFO_0, + VOICE_MOD_SRC_1_LFO_1, + VOICE_MOD_SRC_1_LFO_2, + VOICE_MOD_SRC_1_LFO_3, + VOICE_MOD_SRC_1_ENV_0, + VOICE_MOD_SRC_1_ENV_1, + VOICE_MOD_SRC_1_ENV_2, + VOICE_MOD_SRC_1_ENV_3, + VOICE_NUM_MOD_SOURCES_1 +}; + +enum +{ + VOICE_MOD_SRC_OP_ADD = 0, + VOICE_MOD_SRC_OP_MUL, + VOICE_NUM_MOD_OPS +}; + +enum +{ + VOICE_LFO_MODE_GLOBAL, + VOICE_LFO_MODE_INDIVIDUAL, + VOICE_LFO_NUM_MODES +}; + +enum +{ + VOICE_LFO_SYNC_FREE, + VOICE_LFO_SYNC_RESTART, + VOICE_LFO_NUM_SYNCS +}; + +enum +{ + VOICE_NOISE_SHAPE_WHITE, + VOICE_NOISE_SHAPE_PINK, + VOICE_NOISE_NUM_SHAPES +}; + +enum +{ + note_state_idle = 0, + note_state_triggered, + note_state_released +}; + +enum +{ + voice_event_shutdown = 0, + voice_event_trigger, + voice_event_retrigger, + voice_event_release +}; + +typedef struct _svoice_common_t +{ + synth_float_t freqTab[NUM_FREQS]; + + // Global LFO + lfo_t glfo[VOICE_NUM_LFO]; + + // Global Envelopes + envgen_t genv[VOICE_NUM_ENV]; + + // Global VCF + vcf_t gvcf[2]; + + // Global Noise generator + noise_gen_t gnoise; + + synth_float_t pBuf_zeros[SYNTH_MAX_BUFSIZE]; + synth_float_t pBuf_ones[SYNTH_MAX_BUFSIZE]; + synth_float_t *pBuf_LFO_gbl[VOICE_NUM_LFO]; + synth_float_t *pBuf_ENV_gbl[VOICE_NUM_ENV]; + synth_float_t *pBuf_VCF_gbl_in; + synth_float_t *pBuf_VCF_gbl_out; + synth_float_t noise_out[SYNTH_MAX_BUFSIZE]; + + vco_common_t vco; + vcf_common_t vcf; + +} voice_common_t; + +typedef struct _svoice_t +{ + voice_common_t *pCom; + UINT32 id; + UINT32 state; + UINT32 bufsize; + envgen_t env[VOICE_NUM_ENV]; + synth_float_t fs; + osc_t vco[VOICE_NUM_OSC]; + lfo_t lfo[VOICE_NUM_LFO]; + vcf_t vcf; + synth_float_t param[VOICE_NUM_PARAMS]; + synth_float_t *pBuf_Q; + smooth_t smooth_vco_enable[VOICE_NUM_OSC]; + smooth_t smooth_vco_portamento[VOICE_NUM_OSC]; + synth_float_t vco_pitch[VOICE_NUM_OSC]; +// smooth_t *pParam_smoother[VOICE_NUM_PARAMS]; +// synth_float_t param_smoothed[VOICE_NUM_PARAMS][SYNTH_MAX_BUFSIZE]; +} voice_t; + +// -------------------------------------------------------------- +#if defined(__cplusplus) +extern "C" { +#endif + +// -------------------------------------------------------------- +// Exported functions +// -------------------------------------------------------------- +void Voice_ModInit(voice_common_t *pCom); +void Voice_ModFree(voice_common_t *pCom); +void VoiceInit(voice_t *pObj, voice_common_t *pCom, UINT32 id, synth_float_t fs); +void VoiceFree(voice_t *pObj); +void VoiceSetFS(voice_t *pObj, synth_float_t fs); +void VoiceSetBufsize(voice_t *pObj, UINT32 size); +void VoiceEvent(voice_t *pObj, UINT32 type); +void VoiceParam2Set(voice_t *pObj, UINT32 type, synth_float_t value); +synth_float_t VoiceParamGet(voice_t *pObj, UINT32 type); +UINT32 VoiceStateGet(voice_t *pObj); +void VoiceProcessDataV(voice_t *pObj, float *pOut1, float *pOut2, UINT32 len); +void VoiceProcessDataV_Common(voice_t *pObj, float *pOut1, float *pOut2, UINT32 len); + +#if defined(__cplusplus) +} + +#endif +// -------------------------------------------------------------- + +#endif // _VOICE_H_ diff --git a/Source/synth/wavetable.c b/Source/synth/wavetable.c new file mode 100644 index 0000000..3a9af91 --- /dev/null +++ b/Source/synth/wavetable.c @@ -0,0 +1,358 @@ +#include +#include +#include +#include + +#include "synth_defs.h" +#include "blit.h" +#include "vco.h" +#include "vector_utils.h" +#include "wavetable.h" + +const wt_descr_t _g_wt_descr[WT_NUM_WAVETABLES] = +{ + {8, 0, 101, 8, 69, 16, 70, 24, 71, 32, 72, 40, 73, 48, 74, 60, 75}, + {8, 0, 77, 8, 78, 16, 79, 24, 80, 32, 81, 40, 82, 48, 83, 60, 84}, + {6, 0, 101, 30, 47, 38, 131, 46, 132, 54, 141, 60, 142}, + {7, 0, 101, 8, 94, 16, 95, 24, 96, 32, 97, 40, 98, 60, 100}, + {3, 0, 2, 24, 1, 60, 1}, + {6, 0, 131, 8, 132, 16, 141, 24, 142, 32, 143, 60, 144}, + {9, 0, 101, 8, 54, 16, 55, 24, 56, 32, 57, 40, 88, 48, 89, 54, 53, 60, 104}, + {4, 0, 114, 20, 115, 40, 116, 60, 99}, + {4, 0, 108, 24, 65, 40, 63, 60, 90}, + {7, 0, 101, 8, 61, 16, 62, 24, 63, 32, 66, 40, 67, 60, 68}, + {5, 0, 42, 14, 43, 30, 44, 46, 45, 60, 46}, + {5, 0, 41, 16, 40, 32, 39, 48, 38, 60, 37}, + {8, 0, 101, 8, 54, 16, 55, 24, 56, 32, 57, 40, 58, 48, 59, 60, 60}, + {8, 0, 241, 8, 242, 16, 243, 24, 244, 32, 245, 40, 241, 48, 242, 60, 243}, + {6, 0, 101, 12, 5, 24, 6, 36, 85, 48, 8, 60, 48}, + {4, 0, 12, 20, 11, 50, 53, 60, 104}, + {31, 0, 146, 2, 147, 4, 148, 6, 149, 8, 150, 10, 151, 12, 152, 14, 153, 16, 154, 18, 155, 20, 156, 22, 157, 24, 158, 26, 159, 28, 160, 30, 161, 32, 162, 34, 163, 36, 164, 38, 165, 40, 166, 42, 167, 44, 168, 46, 169, 48, 170, 50, 171, 52, 172, 54, 173, 56, 174, 58, 175, 60, 176}, + {6, 0, 106, 8, 109, 14, 113, 22, 90, 28, 13, 60, 113}, + {9, 0, 85, 8, 85, 16, 86, 24, 91, 32, 62, 40, 71, 48, 86, 56, 85, 60, 85}, + {5, 0, 117, 28, 117, 40, 116, 52, 119, 60, 119}, + {26, 0, 101, 3, 101, 4, 80, 7, 80, 8, 69, 11, 69, 12, 81, 15, 81, 16, 70, 19, 70, 20, 82, 23, 82, 24, 71, 27, 71, 28, 83, 31, 83, 32, 72, 35, 72, 36, 84, 39, 84, 40, 73, 43, 73, 44, 85, 47, 85, 48, 74, 60, 74}, + {12, 0, 32, 12, 30, 17, 29, 22, 28, 27, 27, 32, 26, 37, 25, 42, 24, 46, 23, 50, 22, 54, 21, 60, 21}, + {8, 0, 32, 14, 33, 15, 32, 29, 34, 30, 32, 43, 35, 44, 32, 60, 36}, + {7, 0, 136, 8, 136, 20, 137, 32, 138, 44, 139, 56, 140, 60, 140}, + {7, 0, 106, 10, 107, 20, 108, 30, 109, 40, 110, 50, 111, 60, 112}, + {8, 0, 101, 16, 112, 17, 101, 32, 113, 33, 101, 48, 112, 49, 101, 60, 91}, + {31, 0, 178, 2, 179, 4, 180, 6, 181, 8, 182, 10, 183, 12, 184, 14, 185, 16, 186, 18, 187, 20, 188, 22, 189, 24, 190, 26, 191, 28, 192, 30, 193, 32, 194, 34, 195, 36, 196, 38, 197, 40, 198, 42, 199, 44, 200, 46, 201, 48, 202, 50, 203, 52, 204, 54, 205, 56, 206, 58, 207, 60, 208}, + {31, 0, 211, 2, 212, 4, 213, 6, 214, 8, 215, 10, 216, 12, 217, 14, 218, 16, 219, 18, 220, 20, 221, 22, 222, 24, 223, 26, 224, 28, 225, 30, 226, 32, 227, 34, 228, 36, 229, 38, 230, 40, 231, 42, 232, 44, 233, 46, 234, 48, 235, 50, 236, 52, 237, 54, 238, 56, 239, 58, 240, 60, 241}, + {17, 0, 8, 4, 9, 8, 10, 12, 11, 16, 12, 20, 13, 24, 14, 28, 15, 32, 16, 36, 17, 40, 18, 44, 19, 48, 20, 52, 21, 56, 22, 60, 23, 63, 22}, + {16, 0, 3, 4, 24, 8, 19, 12, 219, 16, 382, 20, 376, 24, 370, 28, 143, 32, 377, 36, 15, 40, 20, 44, 241, 48, 243, 52, 93, 56, 121, 60, 126}, + {16, 0, 239, 4, 240, 8, 241, 12, 242, 16, 243, 20, 244, 24, 245, 28, 368, 32, 391, 36, 388, 40, 392, 44, 386, 48, 384, 52, 382, 56, 133, 60, 375}, + {16, 0, 382, 4, 30, 8, 31, 12, 32, 16, 33, 20, 34, 24, 35, 28, 36, 32, 240, 36, 241, 40, 242, 44, 243, 48, 244, 52, 245, 56, 140, 60, 369}, + {12, 0, 3, 5, 4, 11, 7, 16, 9, 22, 10, 27, 14, 33, 15, 38, 16, 44, 17, 49, 18, 53, 19, 60, 20}, + {12, 0, 31, 1, 49, 2, 50, 3, 51, 4, 52, 7, 64, 13, 76, 18, 87, 23, 92, 37, 93, 47, 102, 60, 103}, + {20, 0, 105, 2, 118, 5, 120, 8, 121, 10, 122, 12, 123, 16, 124, 19, 125, 23, 126, 26, 127, 30, 128, 32, 129, 35, 130, 39, 133, 42, 134, 45, 135, 49, 145, 54, 177, 58, 209, 60, 210}, + {16, 0, 368, 4, 369, 8, 370, 12, 371, 16, 372, 20, 373, 24, 374, 28, 375, 32, 376, 36, 377, 40, 378, 44, 379, 48, 380, 52, 381, 56, 382, 60, 383}, + {5, 0, 384, 15, 385, 30, 386, 45, 387, 60, 388}, + {6, 0, 389, 12, 390, 24, 391, 36, 392, 48, 393, 60, 394}, + {5, 0, 395, 10, 396, 26, 397, 43, 398, 60, 399}, + {22, 0, 400, 1, 401, 4, 402, 8, 403, 11, 404, 13, 405, 17, 406, 19, 407, 22, 408, 25, 409, 29, 410, 30, 411, 34, 412, 36, 413, 39, 414, 43, 415, 48, 416, 52, 417, 53, 418, 54, 419, 59, 420, 60, 421} + +}; + +void WT_ModInit(wt_common_t *pCom) +{ + UINT32 i, j, k, offset, last_pos, distance; + INT16 sample, wave[WT_WAVE_SIZE]; + wt_descr_t *pDesc; + synth_float_t kmix; + synth_float_t x, dx, wave_tri[WT_WAVE_SIZE], wave_sqr[WT_WAVE_SIZE], wave_saw[WT_WAVE_SIZE]; + + // Create waves from 16-bit raw data + offset = 0; + for (i=0; i < 300; i++) + { + if (i > 245) + offset = 122; + + for (j=0; j < 64; j++) + { + sample = ((INT16)pCom->wave_rawdata[128*i + 2*j + 0] << 8) + pCom->wave_rawdata[128*i + 2*j + 1]; + wave[j] = sample; + } + + // Possible assembly 1 + wave[64] = 0; + for (j=0; j < 63; j++) + { + wave[65+j] = -wave[63-j]; + } + + // Possible assembly 2 +// for (j=0; j < 64; j++) +// { +// wave[64+j] = -wave[63-j]; +// } + + for (j=0; j < WT_WAVE_SIZE; j++) + { + pCom->waves[offset+i][j] = (synth_float_t)wave[j]/8192; + } + +#if 0 +//#ifdef SYNTH_DEBUG + { + FILE *pFile = NULL; + char filename[128] = {0}; + + sprintf(filename, "C:\\Users\\jens\\JaySynth\\wave_%03d.pcm", offset+i); + pFile = fopen(filename, "wb"); + if (pFile) + { + fwrite(wave, 2, WT_WAVE_SIZE, pFile); + fclose(pFile); + } + } +#endif + } + + // Create classic waveforms + // Saw + x = 1; + dx = 2./WT_WAVE_SIZE; + for (i=0; i < WT_WAVE_SIZE; i++) + { + wave_saw[i] = x; + x -= dx; + } + + // Sqr + x = 1; + for (i=0; i < WT_WAVE_SIZE/2; i++) + { + wave_sqr[i] = x; + } + for (i=i; i < WT_WAVE_SIZE; i++) + { + wave_sqr[i] = -x; + } + + // Tri + x = 0; + dx = 4./WT_WAVE_SIZE; + for (i=0; i < WT_WAVE_SIZE/4; i++) + { + wave_tri[i] = x; + x += dx; + } + for (i=i; i < WT_WAVE_SIZE/2; i++) + { + wave_tri[i] = x; + x -= dx; + } + for (i=i; i < 3*WT_WAVE_SIZE/4; i++) + { + wave_tri[i] = x; + x -= dx; + } + for (i=i; i < WT_WAVE_SIZE; i++) + { + wave_tri[i] = x; + x += dx; + } + + // Create wavetables from waves + // Allocate memory + for (i=0; i < WT_NUM_WAVETABLES; i++) + { + pCom->ppWavetables[i] = (synth_float_t**)malloc(WT_WAVETABLE_SIZE*sizeof(synth_float_t*)); + for (j=0; j < WT_WAVETABLE_SIZE; j++) + { + pCom->ppWavetables[i][j] = (synth_float_t*)malloc(WT_WAVE_SIZE*sizeof(synth_float_t)); + } + } + + for (i=0; i < WT_NUM_WAVETABLES; i++) + { + pDesc = &_g_wt_descr[i]; + + // Create first wavetable entry + j = 0; + + for (j=0; j < pDesc->num_entries; j++) + { + memcpy(pCom->ppWavetables[i][pDesc->pEntry[j].pos], pCom->waves[pDesc->pEntry[j].wave_id], WT_WAVE_SIZE*sizeof(synth_float_t)); + last_pos = pDesc->pEntry[j].pos; + + if ((j+1) == pDesc->num_entries) + continue; + + distance = pDesc->pEntry[j+1].pos - last_pos; + for (k=1; k < distance; k++) + { + kmix = 1 - (synth_float_t)k/distance; + Add_VV(pCom->ppWavetables[i][last_pos+k], pCom->ppWavetables[i][last_pos], kmix, pCom->waves[pDesc->pEntry[j+1].wave_id], 1-kmix, WT_WAVE_SIZE); + } + } + memcpy(pCom->ppWavetables[i][61], wave_tri, WT_WAVE_SIZE*sizeof(synth_float_t)); + memcpy(pCom->ppWavetables[i][62], wave_sqr, WT_WAVE_SIZE*sizeof(synth_float_t)); + memcpy(pCom->ppWavetables[i][63], wave_saw, WT_WAVE_SIZE*sizeof(synth_float_t)); + + } +} + +void WT_ModFree(wt_common_t *pCom) +{ + int i, j; + + for (i=0; i < WT_NUM_WAVETABLES; i++) + { + for (j=0; j < WT_WAVETABLE_SIZE; j++) + { + free(pCom->ppWavetables[i][j]); + } + free(pCom->ppWavetables[i]); + } +} + +void WT_Init(wt_t *pObj, UINT32 id, wt_common_t *pCom, synth_float_t fs) +{ + pObj->pCom = pCom; + pObj->id = id; + pObj->fs = fs; + pObj->fm = 1; + + if (pObj->id == 0) + { + WT_ModInit(pCom); + } + WT_Prepare(pObj); +} + +void WT_Free(wt_t *pObj) +{ + if (pObj->id == 0) + { + WT_ModFree(pObj->pCom); + } +} + +void WT_SetFS(wt_t *pObj, synth_float_t fs) +{ + pObj->fs = fs; + pObj->startup = 1; +} + +void WT_Reset(wt_t *pObj, synth_float_t phase) +{ + pObj->x = fmod(phase, 1); + pObj->startup = 1; +} + +void WT_Prepare(wt_t *pObj) +{ + WT_Reset(pObj, (synth_float_t)rand()/RAND_MAX); +} + +void WT_Param2Set(wt_t *pObj, UINT32 type, synth_float_t value) +{ + switch(type) + { + case WT_PARAM2_WAVEFORM: + if (pObj->param[type] == (UINT32)value) + break; + pObj->param[type] = (UINT32)value; + pObj->startup = 1; + break; + + case WT_PARAM2_WAVETABLE_ID: + if (pObj->param[type] == (UINT32)value) + break; + pObj->param[type] = value; + pObj->startup = 1; + break; + + case WT_PARAM2_WAVETABLE_ENTRY: + pObj->param[type] = value; + break; + + default: + break; + } +} + +void WT_Start(wt_t *pObj) +{ + pObj->startup = 1; +} + +void WT_ProcessDataV(wt_t *pObj, synth_float_t *pPitch, synth_float_t *pCV_fm, synth_float_t *pCV_pwm, synth_float_t *pOut, UINT32 len) +{ + UINT32 i, ni, wt_table, ni_next; + synth_float_t out, dx, nn, nf, kmix, w1, w2; + + if (pObj->param[WT_PARAM2_WAVEFORM] == WT_WAVEFORM_REGULAR) + { + wt_table = (UINT32)pObj->param[WT_PARAM2_WAVETABLE_ID]; + for (i=0; i< len; i++) + { + if (pObj->x >= 1 || pObj->startup) + { + pObj->x -= 1; + if (pObj->startup) + pObj->x = 0; + + pObj->wt_index = (WT_WAVETABLE_SIZE-1)*max(0, min(1, pObj->param[WT_PARAM2_WAVETABLE_ENTRY] + pCV_pwm[i])); + pObj->wt_start = (UINT32)pObj->wt_index; + + if (pCV_fm) + { + pObj->fm = (synth_float_t)pow((synth_float_t)2, pCV_fm[i]); + } + pObj->startup = 0; + } + ni = (UINT32)(pObj->x*(WT_WAVE_SIZE)); + + w1 = pObj->pCom->ppWavetables[wt_table][pObj->wt_start][ni]; + w2 = pObj->pCom->ppWavetables[wt_table][min((WT_WAVETABLE_SIZE-1), pObj->wt_start+1)][ni]; + kmix = pObj->wt_index - (UINT32)pObj->wt_index; + out = w1*(1-kmix) + w2*kmix; + + dx = pObj->fm*pPitch[i]/pObj->fs; + pObj->x += dx; + + *(pOut++) = out; + } + } + + if (pObj->param[WT_PARAM2_WAVEFORM] == WT_WAVEFORM_INTERPOLATED) + { + wt_table = (UINT32)pObj->param[WT_PARAM2_WAVETABLE_ID]; + for (i=0; i< len; i++) + { + if (pObj->x >= 1 || pObj->startup) + { + pObj->x -= 1; + if (pObj->startup) + pObj->x = 0; + + pObj->wt_index = (WT_WAVETABLE_SIZE-1)*max(0, min(1, pObj->param[WT_PARAM2_WAVETABLE_ENTRY] + pCV_pwm[i])); + pObj->wt_start = (UINT32)pObj->wt_index; + + if (pCV_fm) + { + pObj->fm = (synth_float_t)pow((synth_float_t)2, pCV_fm[i]); + } + pObj->startup = 0; + } + nn = pObj->x*(WT_WAVE_SIZE); + ni = (UINT32)nn; + nf = nn - ni; + ni_next = (ni + 1)&(WT_WAVE_SIZE-1); + + w1 = (pObj->pCom->ppWavetables[wt_table][pObj->wt_start][ni_next] - pObj->pCom->ppWavetables[wt_table][pObj->wt_start][ni])*nf + pObj->pCom->ppWavetables[wt_table][pObj->wt_start][ni]; + w2 = (pObj->pCom->ppWavetables[wt_table][min((WT_WAVETABLE_SIZE-1), pObj->wt_start+1)][ni_next] - pObj->pCom->ppWavetables[wt_table][min((WT_WAVETABLE_SIZE-1), pObj->wt_start+1)][ni])*nf + pObj->pCom->ppWavetables[wt_table][min((WT_WAVETABLE_SIZE-1), pObj->wt_start+1)][ni]; + kmix = pObj->wt_index - (UINT32)pObj->wt_index; + out = w1*(1-kmix) + w2*kmix; + + dx = pObj->fm*pPitch[i]/pObj->fs; + pObj->x += dx; + + *(pOut++) = out; + } + } +} diff --git a/Source/synth/wavetable.h b/Source/synth/wavetable.h new file mode 100644 index 0000000..932ec80 --- /dev/null +++ b/Source/synth/wavetable.h @@ -0,0 +1,89 @@ +// -------------------------------------------------------------- +// -------------------------------------------------------------- +#ifndef _WAVETABLE_H_ +#define _WAVETABLE_H_ + +#include "synth_types.h" + +#define WT_NUM_WAVES 422 +#define WT_WAVE_SIZE 128 +#define WT_NUM_WAVETABLES 40 +#define WT_WAVETABLE_SIZE 64 + +// -------------------------------------------------------------- +// Types +// -------------------------------------------------------------- +enum +{ + WT_WAVEFORM_REGULAR, + WT_WAVEFORM_INTERPOLATED, + WT_NUM_WAVEFORMS +}; + +enum +{ + WT_PARAM2_WAVEFORM, + WT_PARAM2_WAVETABLE_ID, + WT_PARAM2_WAVETABLE_ENTRY, + WT_NUM_PARAMS +}; + +typedef struct _swt_descr_entry_t +{ + UINT32 pos, wave_id; + +} wt_descr_entry_t; + +typedef struct _swt_descr_t +{ + UINT32 num_entries; + wt_descr_entry_t pEntry[WT_WAVETABLE_SIZE]; + +} wt_descr_t; + +typedef struct _swt_common_t +{ + unsigned char wave_rawdata[38400]; + synth_float_t waves[WT_NUM_WAVES][WT_WAVE_SIZE]; + synth_float_t **ppWavetables[WT_NUM_WAVETABLES]; //[WT_WAVETABLE_SIZE][WT_WAVE_SIZE]; + +} wt_common_t; + +typedef struct _swt_t +{ + UINT32 id; + wt_common_t *pCom; + synth_float_t fm, x, dx, wt_index; + UINT32 startup, wt_start; + synth_float_t param[WT_NUM_PARAMS]; + synth_float_t fs; + +} wt_t; + +// -------------------------------------------------------------- +#if defined(__cplusplus) +extern "C" { +#endif + +// -------------------------------------------------------------- +// Exported functions +// -------------------------------------------------------------- +void WT_ModInit(wt_common_t *pCom); +void WT_ModFree(wt_common_t *pCom); +void WT_Init(wt_t *pObj, UINT32 id, wt_common_t *pCom, synth_float_t fs); +void WT_Free(wt_t *pObj); +void WT_SetFS(wt_t *pObj, synth_float_t fs); +void WT_Reset(wt_t *pObj, synth_float_t phase); +void WT_Param2Set(wt_t *pObj, UINT32 type, synth_float_t value); +void WT_Prepare(wt_t *pObj); +void WT_Start(wt_t *pObj); +void WT_ProcessDataV(wt_t *pObj, synth_float_t *pPitch, synth_float_t *pCV_fm, synth_float_t *pCV_pwm, synth_float_t *pOut, UINT32 len); + +#if defined(__cplusplus) +} + +#endif + +// -------------------------------------------------------------- + +#endif // _WAVETABLE_H_ diff --git a/history.txt b/history.txt new file mode 100644 index 0000000..414ce93 --- /dev/null +++ b/history.txt @@ -0,0 +1,267 @@ +---------------------------------------------------- +Changes: +---------------------------------------------------- +V 0.5.6, 01.07.2013 + +- Resonance = 1.0 is normal +- No reset of resonance to 1.0 after change of filter type +- Bugfix: Midi-Controller changes were only applied to synthesizer if GUI is open +- Bugfix Texteingabe war fehlerhaft +- removed highest note priority voice allocation for monophonic mode. + Now each new note plays and retriggers envelope +- added Retrigger for monophonic mode +- Polyphony von GUI aus einstellbar. Maximum ist 256 voices +- VCO-Humanize funktion verbessert. Bessere Streuung der Voice-Verstimmungen. +- Mastertune ist jetzt relativ in Semitones statt absolute in Hertz. + Ältere Patches werden beim Laden korrekt auf Semitones umgerechnet. + +---------------------------------------------------- +V 0.5.5, 23.01.2013 + +- Added tooltip with version, date and name of developer. + +---------------------------------------------------- +V 0.5.4, 01.01.2013 + +- Bugfix: Rückkopplung beseitigt in Cubase. +- Bugfix: Symmetry bei einigen LFO-Wellenformen ohne Effekt +- Multicore-Audiorendering implementiert. + Die Last wird auf alle verfügbaren CPU-Kerne aufgeteilt => mehr Performance. + +- Comboboxen (Waveforms, Mod-Sources, Filtertypes, etc.) unterstützen keine MidiControllerzuweisen mehr. + +---------------------------------------------------- +V 0.5.3, 08.10.2012 + +- LFO: + - Symmetry-Regler hinzugefügt. + - ComboBoxen für Sync und Mode durch ToggleButtons ersetzt. + +- VCO: + - Phasen der Oszillatoren werden bei Programmstart mit Zufallswerten initialisiert. + + +---------------------------------------------------- +V 0.5.2, 07.10.2012 + +- BLEP-Synthese: + - Anzahl der Harmonischen von 1800 auf 900 verringert => weniger Speicherverbrauch. + - LUT-Größe von 4096 auf 3072 verringert => weniger Speicherverbrauch. + +- VCO: + - AM, FM und PWM sind jetzt durch zwei Quellen modulierbar + - Neuer Mode: Freerunning oder Restart der VCOs bei note-Trigger: + Bei Restart wird die VCO-Phase auf 0 gesetzt => Punchy-Sound - der Sound der vorherigen JaySynth-Versionen. + Bei free-Running bleibt VCO-Phase auf letzten Wert => Sound entspricht eher dem analogen Vorbild. + + - Waldorf MicroWave Wellenformen und WaveTables hinzugefügt. WaveTable-Scan über PWM. + Original MicroWave Wellenformen müssen als Datei ("waves.bin", 16bit, Big-Endian) im Plugin-Verzeichnis vorliegen, damit Feature freigeschaltet wird. + + - Impuls-Wellenform hinzugefügt. Erzeugt einen einzigen Impuls bei Tastenanschlag. Geeignet um VCF mit Selbstozillation anzuregen. + - 3-Fach Oversampling für Sinus-Wellenform eingeführt für bessere FM-Modulation + +- VCF: + - Hilfe von LookUp-Table für schnellere Koeffizientenberechnung => mehr Performance + - Cutoff ist jetzt durch zwei Quellen modulierbar + - Velocity-Sense und Key-Follow Slider entfernt + - Resonance-Maximum auf 100 erhöht => Vorsicht! + - Resonance ist jetzt durch zwei Quellen modulierbar => hier auch Vorsicht! + +- VCA: + - Velocity-Sense und Key-Follow Slider entfernt + +- LFO: + - Delay und Attack hinzugefügt + - Neue Wellenformen hinzugefügt: + - Dreieck (Tri) + - Rechteck (Square) + - Zeitlich umgekehrter Sinus (1-Sine) + - Zeitlich umgekehrter Cosinus (1-Cosine) + - Zeitlich umgekehrter Saw (1-Saw) + - Zeitlich umgekehrter Rechteck (1-Square) + - Zeitlich umgekehrter Dreieck (1-Tri) + +- Voice-Management: + - Max. Polyphonie auf 128 Stimmen erhöht + - Monophon-mode hinzugefügt + - Unisono-Mode: + - Jetzt auch polyphon spielbar => Nutzung der brachliegenden Stimmenressourcen, noch dichterer Sound. + - Grobe Lautstärkeanpassung, abhängig von Anzahl der Unisono-Stimmen. + +- Envelopes: + - Stimmenklau verursacht weniger Knackser. + - ENV-3 und ENV-4 hinzugefügt + +- Velocity-Sense und Key-Follow für die meisten Slider hinzugefügt. + - Menü ereichbar durch Rechts-Klick auf Slider. Achtung: Menü für Midi-Controller ist jetzt durch Shift-Rechts-Klick auf Slider erreichbar. + +- Master-Volume hat jetzt logarithmische Kennlinie. +- Limiter im Audiosignalweg vermeidet Lautsprecherschaden + +- GUI: + - Alle Bedienelemente verkleinert + +- Build: Verwendung von SSE2-Befehlen => mehr Performance +- Bugfix: Bank Load/Save: Speicher wurde nicht wieder freigegeben. + +---------------------------------------------------- +V 0.5.1, 22.08.2012 + +- Master Tune in VCA Sektion hinzugefügt. Tune erfolgt relativ zu 440Hz +- VCO: Detune ist jetzt in cents. Achtung: Die VCOs gespeicherter Patches klingen jetzt weniger verstimmt. + Workaround: Detune nach Bedarf anpassen und Patch abspeichern. + +- Pitchbender: Die Eingabefelder 'Min' und 'Max' sind jetzt beim 'Transpose'-Regler angeordnet. +- Per-Voice individual Stereo-Panning: Alternierend gerade, ungerade Stimme. + Einstellbar 0 bis 100% mit 'Voice-Pan ' in VCA Sektion + +- Humanize-Funktion: Nachbildung nicht-idealer Bauteile eines analogen Hardware-Synthesizers. + Die Stimmenmodule eines analogen Hardware-Synthesizers klingen aufgrund von Bauteiltoleranzen nicht identisch. + Im JaySynth werden pro Stimme folgende Parameter in ihrem Werte Bereich normalverteilt gestreut: + - Mastertune: Spread 0 bis 10%. Einstellbar mit 'VCO hum.' + - VCF-Cutoff: Spread 0 bis 100%. Einstellbar mit 'VCF hum.' + - VCF-Resonance: Spread 0 bis 100%. Einstellbar mit 'VCF hum.' + - VCF-Envelope A,D,R: Spread 0 bis 100%. Einstellbar mit 'Env. hum.' + - VCA-Envelope A,D,R: Spread 0 bis 100%. Einstellbar mit 'Env. hum.' + +- Stimmenzuordnungs-Algorithmus auf Round-Robin-Verfahren umgestellt: Jede Stimme wird nacheinander verwendet. +- Unisonomodus mit Portamento und Verwendung aller Stimmen (einstellbar) +- Filterorder 2 und 4 +- Ob aktuelle Midi-Controllerstellungen beim Umschalten des Patch auf die Controllerziele des nächsten Patchs angewendet + wird, ist nun im MidiPopup einstellbar. +- Bugfix: Änderung des Patchnamens im Host führt nicht zum Update auf dem Plugin-Bildschirm +- VCOs: FM-Mod: VCA-Envelope und VCF-Envelope als Quellen hinzugefügt. Bei VCO-2 kann auch noch VCO-1 angegeben werden. +- Werteanzeige der Parameter zeigen jetzt die korrekte Anzahl an Nachkommastellen +- Bugfix: Wird GUI geschlossen und wieder geöffnet wird editiertes Patch mit Programmspeicher überschrieben. +- VCO: Pitchbenderbereich auf +/- 48 Halbtöne erhöht +- VCO: Transposebereich auf +/- 48 Halbtöne erhöht +- VCO: FM-amount: Einheit geändert von Oktaven auf Halbtöne (+/- 48 Halbtöne) + +---------------------------------------------------- +V 0.4.4, 14.08.2012 + +- Bugfix: Bei unsymmetrischen Pitchbenderbereichen wurde in Neutralstellung die Tonhöhe falsch eingestellt. + +---------------------------------------------------- +V 0.4.3, 13.08.2012 + +- Pitchbenderbereich pro VCO jetzt von der Oberfläche einstellbar. + Einfachklick auf Textfeld links und rechts neben 'FM-Amount'. + +---------------------------------------------------- +V 0.4.2, 12.08.2012 + +- Bugfix: Rangeingabe im MidiPopup: Bei range Min = max => crash +- Bugfix: LFO-shape SH-1 ließ sich nicht anwählen +- MidiPopup window: changed text 'Enable' to 'Assigned' +- MidiPopup window: changed text 'Move slider' to 'Absolute' + Absolute-mode bewegt zwar die Regler, ändert aber das Patch nicht. +- Edit-Buffer für Midicontroller eingeführt. +- Textfelder für Patchnummer und Patchname hinzugefügt. + Durch Einfachklick auf Patchname-Textfeld kann Patchname geändert. + Durch Einfachklick auf Patchnummer-Textfeld kann Patch direkt angewählt werden. + Anzeige im Patchname-Textfeld, wenn ein Patch editiert wurde. +- +/- Tasten für bequemes Durchklicken der Patches. +- Synthesizer merkt sich jetzt alle MidiControllerwerte. + Beim Umschalten zwischen den Patches werden, + die zugewiesenen Modulationsziele korrekt initialisiert. + +---------------------------------------------------- +V 0.4.1, 10.08.2012 + +- LFO: Smoothing Range intern um Factor 20 verkleinert. +- ToolTips: Bugfix: Tooltips wurden doppelt angezeigt +- GUI: Zuweisungen für MidiController hinzugefügt. + Menü ist erreichbar durch Rechtsklick auf Parameter-Regler +- Maximale Anzahl der Patches von 128 auf 64 reduziert + +---------------------------------------------------- +V 0.3.2, 05.08.2012 + +- Bugfix: Durch Verwendung von globalen Variablen, haben sich mehrere + Instanzen des Plugins gegenseitig beeinflusst. + +- Bugfix: Das Abspeichern von Bänken, also von mehreren Patches auf einmal, + ist nun korrekt implementiert. + +---------------------------------------------------- +V 0.3.1, 04.08.2012 + +Allgemein: +- Beim Abspeichern werden nun keine Reglerstellungen mehr abgespeichert, + sondern die wahren, interen Werte. Bei einer Änderung von + Wertebereichen oder wenn ein Parameter dazu kommt, können Patches aus + zukünftigen Versionen korrekt geladen werden. + +GUI: +- Umstrukturiert wegen Platzmangel. +- Direkte Werteeingabe der Parameter durch Einfach-klick + auf die Anzeige über den Reglern. +- Tooltips hinzugefügt. + +Synthese: +- Weniger Ressourcenverbrauch durch Umstellung von BLIT-Synthese + auf LUT-gestützte BLEP-Synthese. + Interpoliert wird mit Lagrange-Polynom 2. Grads. + +VCOs: +- Volumeregler und Ein/Ausschalter (Klick auf LED) hinzugefügt. +- Wellenform Noise1 und Noise2 entfernt. +- Frequenzmodulation geht nun über +/- 4 Oktaven. +- Square heisst jetzt Pulse. +- Sinus und Triangle-Wellenformen hinzugefügt. +- Für Pulse-Wellenform: Pulsweitenregler und PW-Modulation hinzugegefügt. + +VCF: +- Filtersweep-charakteristik geändert. Filter macht jetzt 6.8 Oktaven + (20Hz bis 18 kHz) über den gesamten Bereich der Controlvoltage. +- VCF-Envelope-Generator: Bedingt durch Filtercharakteristik + werden intern die Zeiten für Decay und Release mit zwei multipliziert, + um dem subjektiven Hörempfinden gerecht zu werden. +- Envelope-Amount, Velocity-Amount und Key-Follow + können jetzt negativ sein. +- Resonance angepasst. + Resonance = 1 entpricht normaler Filtercharakteristik. + +VCA: +- Tremolo kann nicht mehr negativ sein. +- Rauschquelle mit Ein/Aus-Schalter (Klick auf LED) + und Volumeregler hinzugefügt. + Es kann zwischen Uniform (ehemals Noise-1) und Gauss (ehemals Noise-2) ausgewählt werden. + Uniform entspricht gleichförmig verteiltem Rauschen. + Gauss entspricht Gauss-verteiltem Rauschen (was nicht Pink ist). + Pink-Rauschen muss noch hinzugefügt werden. Uniform-Rauschen wird in + späteren Versionen entfernt. Gauss wird dan als White-Noise bezeichnet. + +ADSR-Envelope-Generator: +- Die Decay-Zeit wird nun definiert mit der Zeit um von 100% auf 0% zu + fallen. Der Sustain-level hat nun keinen Einfluss auf die + Decay-Steilheit. Die Decay-Steilheit bleibt nun konstant, unabhängig + vom Sustain-Level. Ein Sustain-Level größer 0 wird nun, + abweichend von der eigestellten Decay-Zeit, früher erreicht werden + als ein Sustain-Level von 0. + +---------------------------------------------------- +V 0.2.2, 22.07.2012 + +- LFO: Bugfix. 'Restart' klang unnatürlich bei S&H + +---------------------------------------------------- +V 0.2.1, 22.07.2012 + +- LFO: Zweite S&H Wellenform (S&H 2) hinzugefügt. Diese wird von +Gauss'schen Rauschen abgeleitet. Kommt dem analogen Vorbild näher. Wellenform S&H 1 ist die alte Wellenform. +- LFO: Neuer LFO-Parameter "smooth". Hatte Umgestaltung der GUI zur Folge. Siehe Bild im Anhang. +- VCO: Bugfix. Fehler führte zum Abbruch des Klangs. +- VCF: Filter-Typen Highpass und Bandpass hinzugefügt. +- VCF: Maximum Resonance auf 10 erhöht. + +---------------------------------------------------- +V 0.1.1, 21.07.2012 + +- jetzt mit ansprechender GUI +- Vier LFOs mit den Wellenformen Sine, Saw und Sample and Hold. Square und Tri sind noch nicht bereit +- VCOs haben Wellenformen Saw, Square und Noise. Tri ist noch disabled +- Key follow für VCF +- Tremolo und Stereo panning im VCA +---------------------------------------------------- diff --git a/todo.txt b/todo.txt new file mode 100644 index 0000000..fb3d73e --- /dev/null +++ b/todo.txt @@ -0,0 +1,85 @@ +--------------------------------- +22.07.2012 + +- VOICE individual panning - (done 18.08.2012) +- LFO sync per midi (AudioPlayHead) +- Filter LP, HP, BP - (done 22.07.2012) +- Pitchwheel - (done 13.08.2012) +- Unisono mode - (done 18.08.2012) +- Portamento - (done 18.08.2012) +- Audio signal input anstatt VCOs + +--------------------------------- +29.07.2012 + +- Volume regler für VCOs (Done, 01.08.2012) +- Ein/Aus für VCOs (Done, 01.08.2012) +- Extra Noise OSC mit EIN/Aus und Volumeregler (Done, 01.08.2012) +- Reglerwerte mit Tastatur direkt eingeben (Done, 04.08.2012) +- Hardsync +- Speicheroptimierung: BLEP-LUT-size abhänging von M. BLEP-LUT-size abfallend mit steigender Frequenz. + +--------------------------------- +01.08.2012 + +- CCTRLs für alle Parameter (done 10.8.12) + + +04.08.2012 + +- Synthbandwidth muss Frequenz sein, statt omega. + + +--------------------------------- +05.08.2012 + +- VCO gegenseitige FM und AM (done 22.8.12) + + +--------------------------------- +10.08.2012 + +- Parametersmoothing für MidiCC +- Edit-Buffer für MidiCC-Assignments (done 11.8.12) +- Pitch-wheel Bereich einstellen - (done 13.08.2012) + +- Bug: MidiCC: RangeMax == RangeMin => Absturz (done 10.8.12) +- Bug: LFO_SHAPE: SH-1 nicht anwählbar, es erschein TRI (done 10.8.12) + +- MidiCC-Popup: "Move Slider = 1" => "Absolute" (done 10.8.12) + "Move Slider = 0" => "Relative" + +--------------------------------- +11.08.2012 + +- bei SetProgramm müssen alle zugewisenen RelativControllZiele + initialisiert werden (done 12.8.12) + +--------------------------------- +14.08.2012 + +- Parametertoleranzen pro Voice (Humanize-Funktion) - (done 18.08.2012) + +--------------------------------- +17.08.2012 + +- Bug: Wird GUI geschlossen und wieder geöffnet wird editiertes Patch mit Programmspeicher überschrieben - (done 22.08.2012) +- Pitchbenderbereich +/- 48 Töne - (done 22.08.2012) +- Hohe Resonanzwerte führen zu Verzerrungen +- Testen: Wenn Midi-Controller nicht mehr zugewiesen ist, Control auf 0 setzen bzw. Regler auf Patchwert setzen. +- Ob aktuelle Midi-Controllerstellungen beim Umschalten des Patch auf die Controllerziele des nächsten Patchs angewendet + wird, soll im MidiPopup einstellbar sein. - (done 19.08.2012) +- Temperaturdrift (Mainboard-Temperatur) +- Änderung des Patchnamens im Host führt nicht zum Update auf dem Plugin-Bildschirm - (done 19.08.2012) +- Lautstärke-Anpassung, im Unisono-Mode - (done 25.08.2012) +- Delay für LFOs + +23.08.2012 + +- paramScale: Klasse davon machen und JaySynth, JaySynthSound und JaySynthMidiCC beerben. +- Beim Laden von meheren Instanzen kommt es gelegentlich zum Crash, wenn vorher eine Bank geladen wurde. Schwer reproduzierbar. +- Unisono -Mode auch polyphon spielbar. Nutzung der brachliegenden Stimmenressourcen - (done 25.08.2012) + +30.8:2012 + +- Modulation sources richtig mappen