DX Look And Feel and Sysex midiout

pull/1/head
asb2m10 11 years ago
parent 909d864af7
commit 9b4b92753e
  1. 2
      Builds/MacOSX/Dexed.xcodeproj/project.pbxproj
  2. BIN
      Builds/MacOSX/Dexed.xcodeproj/project.xcworkspace/xcuserdata/asb2m10.xcuserdatad/UserInterfaceState.xcuserstate
  3. 5
      Builds/MacOSX/Dexed.xcodeproj/xcuserdata/asb2m10.xcuserdatad/xcschemes/xcschememanagement.plist
  4. 38
      Builds/VisualStudio2012/Dexed.sln
  5. 3078
      Builds/VisualStudio2012/Dexed.vcxproj
  6. 5290
      Builds/VisualStudio2012/Dexed.vcxproj.filters
  7. 60
      Builds/VisualStudio2012/resources.rc
  8. 1
      Dexed.jucer
  9. 181
      JuceLibraryCode/BinaryData.cpp
  10. 3
      JuceLibraryCode/BinaryData.h
  11. 42
      Source/DXLookNFeel.cpp
  12. 16
      Source/DXLookNFeel.h
  13. 71
      Source/GlobalEditor.cpp
  14. 5
      Source/GlobalEditor.h
  15. 285
      Source/OperatorEditor.cpp
  16. 14
      Source/OperatorEditor.h
  17. 156
      Source/PluginEditor.cpp
  18. 17
      Source/PluginEditor.h
  19. 131
      Source/PluginParam.cpp
  20. 31
      Source/PluginParam.h
  21. 39
      Source/PluginProcessor.cpp
  22. 62
      Source/PluginProcessor.h

@ -142,6 +142,7 @@
1D31136D1C9D959792023095 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativeTime.cpp"; path = "../../JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.cpp"; sourceTree = "SOURCE_ROOT"; }; 1D31136D1C9D959792023095 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativeTime.cpp"; path = "../../JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.cpp"; sourceTree = "SOURCE_ROOT"; };
1D798858682A27299589F4E5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentListener.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.cpp"; sourceTree = "SOURCE_ROOT"; }; 1D798858682A27299589F4E5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentListener.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.cpp"; sourceTree = "SOURCE_ROOT"; };
1D95A78059DCCC7B58782F07 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioSampleBuffer.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h"; sourceTree = "SOURCE_ROOT"; }; 1D95A78059DCCC7B58782F07 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioSampleBuffer.h"; path = "../../JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h"; sourceTree = "SOURCE_ROOT"; };
1DC9D8AC8B4311052BC86115 = { isa = PBXFileReference; lastKnownFileType = image.png; name = background.png; path = ../../Resources/background.png; sourceTree = "SOURCE_ROOT"; };
1E1A0627C2977D5FCB8440CC = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LookAndFeel.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h"; sourceTree = "SOURCE_ROOT"; }; 1E1A0627C2977D5FCB8440CC = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LookAndFeel.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h"; sourceTree = "SOURCE_ROOT"; };
1EB6398B6F537A4302092240 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextEditorKeyMapper.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h"; sourceTree = "SOURCE_ROOT"; }; 1EB6398B6F537A4302092240 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextEditorKeyMapper.h"; path = "../../JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h"; sourceTree = "SOURCE_ROOT"; };
1F51658DEF590741920719FF = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MACAddress.cpp"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_MACAddress.cpp"; sourceTree = "SOURCE_ROOT"; }; 1F51658DEF590741920719FF = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MACAddress.cpp"; path = "../../JuceLibraryCode/modules/juce_core/network/juce_MACAddress.cpp"; sourceTree = "SOURCE_ROOT"; };
@ -850,6 +851,7 @@
FF5B77AA3517B4637F862BD3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativeCoordinatePositioner.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp"; sourceTree = "SOURCE_ROOT"; }; FF5B77AA3517B4637F862BD3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativeCoordinatePositioner.cpp"; path = "../../JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp"; sourceTree = "SOURCE_ROOT"; };
FF6607118B29435E76806DFA = { isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Dexed.component; sourceTree = "BUILT_PRODUCTS_DIR"; }; FF6607118B29435E76806DFA = { isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Dexed.component; sourceTree = "BUILT_PRODUCTS_DIR"; };
F472964B0FFEE5615B72CE3D = { isa = PBXGroup; children = ( F472964B0FFEE5615B72CE3D = { isa = PBXGroup; children = (
1DC9D8AC8B4311052BC86115,
E93431088B4E40AC9A48D817 ); name = Resources; sourceTree = "<group>"; }; E93431088B4E40AC9A48D817 ); name = Resources; sourceTree = "<group>"; };
BDC5059F1563FD8DD69AD324 = { isa = PBXGroup; children = ( BDC5059F1563FD8DD69AD324 = { isa = PBXGroup; children = (
3715DFDD7A1B12083F051F5A, 3715DFDD7A1B12083F051F5A,

@ -9,6 +9,11 @@
<key>orderHint</key> <key>orderHint</key>
<integer>0</integer> <integer>0</integer>
</dict> </dict>
<key>Release.xcscheme</key>
<dict>
<key>orderHint</key>
<integer>1</integer>
</dict>
</dict> </dict>
<key>SuppressBuildableAutocreation</key> <key>SuppressBuildableAutocreation</key>
<dict> <dict>

@ -1,19 +1,19 @@
Microsoft Visual Studio Solution File, Format Version 11.00 Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2012 # Visual Studio 2012
Project("{BD26B4C3-163D-4785-A63F-D3E66858BFF3}") = "Dexed", "Dexed.vcxproj", "{1A9EF105-5BF5-9FB6-9634-A91A6D840866}" Project("{BD26B4C3-163D-4785-A63F-D3E66858BFF3}") = "Dexed", "Dexed.vcxproj", "{1A9EF105-5BF5-9FB6-9634-A91A6D840866}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32 Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32 Release|Win32 = Release|Win32
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{1A9EF105-5BF5-9FB6-9634-A91A6D840866}.Debug|Win32.ActiveCfg = Debug|Win32 {1A9EF105-5BF5-9FB6-9634-A91A6D840866}.Debug|Win32.ActiveCfg = Debug|Win32
{1A9EF105-5BF5-9FB6-9634-A91A6D840866}.Debug|Win32.Build.0 = Debug|Win32 {1A9EF105-5BF5-9FB6-9634-A91A6D840866}.Debug|Win32.Build.0 = Debug|Win32
{1A9EF105-5BF5-9FB6-9634-A91A6D840866}.Release|Win32.ActiveCfg = Release|Win32 {1A9EF105-5BF5-9FB6-9634-A91A6D840866}.Release|Win32.ActiveCfg = Release|Win32
{1A9EF105-5BF5-9FB6-9634-A91A6D840866}.Release|Win32.Build.0 = Release|Win32 {1A9EF105-5BF5-9FB6-9634-A91A6D840866}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
EndGlobalSection EndGlobalSection
EndGlobal EndGlobal

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -1,30 +1,30 @@
#ifdef JUCE_USER_DEFINED_RC_FILE #ifdef JUCE_USER_DEFINED_RC_FILE
#include JUCE_USER_DEFINED_RC_FILE #include JUCE_USER_DEFINED_RC_FILE
#else #else
#undef WIN32_LEAN_AND_MEAN #undef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN
#include <windows.h> #include <windows.h>
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,0,0,0 FILEVERSION 1,0,0,0
BEGIN BEGIN
BLOCK "StringFileInfo" BLOCK "StringFileInfo"
BEGIN BEGIN
BLOCK "040904E4" BLOCK "040904E4"
BEGIN BEGIN
VALUE "CompanyName", "Digital Suburban\0" VALUE "CompanyName", "Digital Suburban\0"
VALUE "FileDescription", "Dexed\0" VALUE "FileDescription", "Dexed\0"
VALUE "FileVersion", "1.0.0\0" VALUE "FileVersion", "1.0.0\0"
VALUE "ProductName", "Dexed\0" VALUE "ProductName", "Dexed\0"
VALUE "ProductVersion", "1.0.0\0" VALUE "ProductVersion", "1.0.0\0"
END END
END END
BLOCK "VarFileInfo" BLOCK "VarFileInfo"
BEGIN BEGIN
VALUE "Translation", 0x409, 65001 VALUE "Translation", 0x409, 65001
END END
END END
#endif #endif

@ -11,6 +11,7 @@
jucerVersion="3.1.0" companyName="Digital Suburban"> jucerVersion="3.1.0" companyName="Digital Suburban">
<MAINGROUP id="kHXTgw" name="Dexed"> <MAINGROUP id="kHXTgw" name="Dexed">
<GROUP id="{F12593AE-639A-6F59-5819-ACE25AF86F95}" name="Resources"> <GROUP id="{F12593AE-639A-6F59-5819-ACE25AF86F95}" name="Resources">
<FILE id="oUNugM" name="background.png" compile="0" resource="1" file="Resources/background.png"/>
<FILE id="CGMSPp" name="startup.syx" compile="0" resource="1" file="Resources/startup.syx"/> <FILE id="CGMSPp" name="startup.syx" compile="0" resource="1" file="Resources/startup.syx"/>
</GROUP> </GROUP>
<GROUP id="{EA38D88A-6B79-E394-8B57-FA22D50C4D86}" name="Source"> <GROUP id="{EA38D88A-6B79-E394-8B57-FA22D50C4D86}" name="Source">

@ -7,8 +7,181 @@
namespace BinaryData namespace BinaryData
{ {
//================== startup.syx ================== //================== background.png ==================
static const unsigned char temp_binary_data_0[] = static const unsigned char temp_binary_data_0[] =
{ 137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,3,97,0,0,1,164,8,6,0,0,1,207,177,29,135,0,0,0,6,98,75,71,68,0,0,0,0,0,0,249,67,187,127,0,0,0,9,112,72,89,115,0,0,22,37,0,0,22,37,1,73,82,36,240,0,0,0,7,116,73,77,69,7,221,12,23,5,36,39,56,99,177,80,0,
0,32,0,73,68,65,84,120,218,237,221,73,150,235,184,181,40,80,29,45,76,194,109,55,236,33,120,48,30,119,54,179,237,55,10,188,70,102,220,43,69,72,98,133,146,220,123,125,255,124,113,37,177,0,8,28,28,22,96,252,247,63,255,202,183,191,197,173,128,56,244,49,43,
202,42,245,222,0,182,151,87,82,81,99,202,107,42,45,10,151,184,10,171,39,221,110,183,219,63,254,249,239,219,237,22,127,21,116,60,20,123,188,170,204,80,49,69,186,160,248,124,176,191,250,78,252,85,75,247,223,255,144,111,249,241,59,145,87,53,225,188,208,
148,121,215,247,229,143,101,250,178,96,243,237,150,243,175,238,49,254,250,194,99,165,229,248,245,207,79,117,158,243,83,107,91,211,7,107,88,107,42,238,185,91,251,171,58,242,223,95,137,167,198,148,94,45,43,94,252,145,191,87,220,215,95,250,200,67,131,138,
120,106,70,207,149,151,191,45,33,254,110,76,247,219,183,30,49,222,172,241,109,219,210,71,22,174,208,252,92,166,249,231,231,233,91,99,124,174,249,111,127,189,60,58,30,255,37,27,161,20,171,184,95,197,248,179,180,211,83,41,63,133,182,88,92,73,188,91,109,
86,115,37,242,163,231,184,246,56,228,143,15,95,126,25,208,214,246,213,250,203,213,181,245,161,135,122,85,244,233,221,55,214,86,220,158,224,171,154,62,245,80,175,191,245,56,96,79,159,170,246,231,112,95,204,170,57,146,252,93,180,63,71,16,249,161,236,211,
250,213,196,199,127,162,81,53,231,219,45,197,251,8,248,240,103,124,72,16,215,5,85,182,85,209,226,89,254,167,58,138,229,250,14,193,172,248,72,113,75,229,165,245,139,208,132,170,6,181,88,191,128,244,163,90,222,214,79,254,112,20,168,208,178,149,153,63,14,
218,211,145,134,245,242,220,24,197,43,241,123,227,188,191,109,175,98,211,176,210,199,22,178,113,104,175,158,171,140,73,126,184,171,141,113,19,237,143,45,77,174,53,70,197,197,202,42,77,117,134,165,236,235,30,243,170,239,167,38,237,89,229,191,44,204,189,
103,3,211,251,17,126,110,211,39,176,178,242,242,175,122,74,251,154,131,82,239,58,228,207,139,1,81,69,181,108,113,107,186,202,116,187,221,110,255,247,231,31,69,130,144,80,213,102,228,114,95,215,134,220,110,53,84,247,184,185,46,226,120,243,230,216,136,
37,237,250,213,135,26,85,113,45,90,90,185,20,254,215,135,125,43,46,30,182,224,156,93,250,189,214,216,176,95,113,229,211,143,118,211,161,152,180,144,21,174,187,135,157,221,45,173,117,179,242,8,64,193,152,182,251,238,184,3,129,236,172,21,23,173,42,173,
73,74,127,173,17,122,241,74,76,213,183,84,16,27,188,165,93,177,15,236,208,71,38,199,109,187,131,245,241,153,246,168,81,105,110,215,31,183,227,73,75,213,35,215,170,92,83,113,168,165,105,91,179,52,185,244,115,148,190,190,109,101,173,174,75,237,165,109,
233,213,251,246,45,69,107,55,148,94,119,61,109,229,179,77,90,94,227,60,237,99,68,219,81,27,91,142,37,21,124,112,200,223,163,155,171,153,119,199,21,42,109,177,226,38,27,100,158,241,68,204,93,105,76,217,210,242,226,112,254,109,151,35,181,235,34,90,78,60,
173,110,143,23,99,234,185,114,14,12,64,66,69,77,49,112,170,246,32,161,202,170,212,194,254,154,100,250,175,34,126,158,213,54,94,204,114,27,38,80,45,118,36,47,77,52,253,226,243,120,154,100,250,231,47,127,52,203,120,62,61,229,238,169,157,125,221,194,36,
211,207,223,123,254,240,105,50,206,167,137,56,243,237,231,188,211,95,43,50,193,244,241,240,240,97,130,233,175,251,177,127,77,186,243,171,91,123,156,92,250,169,130,62,77,126,43,7,43,121,174,97,237,228,210,95,149,119,255,254,227,88,181,166,172,95,172,89,
153,47,202,52,191,26,37,174,153,84,250,227,52,211,90,94,129,74,251,54,29,85,126,110,113,233,253,176,239,245,76,89,171,78,102,153,80,250,112,144,203,143,35,139,252,42,15,203,183,215,111,177,216,209,47,223,110,38,147,222,84,75,11,147,117,199,98,226,252,
125,41,59,186,58,213,181,212,144,242,135,2,123,63,145,116,250,92,71,223,38,181,21,163,170,141,22,151,198,7,95,147,72,223,63,215,244,227,252,48,154,79,159,10,125,30,138,167,183,19,67,127,78,251,60,44,81,177,210,214,79,28,125,116,210,104,173,239,182,231,
216,95,51,216,120,61,232,120,89,189,207,63,119,111,98,245,83,30,31,23,144,214,183,73,19,70,183,171,204,252,242,253,129,79,45,236,221,11,234,214,173,195,100,209,181,42,240,197,68,209,204,36,149,188,23,209,120,163,248,248,227,135,251,170,90,80,19,205,147,
232,143,195,122,185,84,255,74,91,123,73,120,253,196,208,42,177,114,183,88,122,82,232,92,113,171,243,228,127,239,108,91,91,114,218,95,115,11,231,141,77,178,122,103,62,251,223,59,119,63,86,126,115,199,100,208,70,32,93,135,245,235,107,90,69,181,232,104,
98,161,11,77,255,251,243,143,21,205,177,196,55,40,49,66,185,175,175,255,44,105,30,162,75,44,248,128,178,51,249,245,251,204,109,83,66,228,188,240,69,19,63,55,27,116,148,137,142,121,176,150,118,190,137,159,239,149,91,240,32,99,175,147,14,235,75,78,244,
252,169,184,116,153,133,90,88,110,116,16,187,29,191,96,12,219,21,127,76,240,220,172,39,41,247,80,186,155,76,23,15,198,24,170,194,62,53,25,149,56,96,11,187,106,191,183,178,79,172,58,125,186,228,183,252,129,250,244,228,107,141,22,38,36,141,217,225,152,
204,185,119,77,197,238,22,166,77,205,208,220,138,76,226,172,138,219,213,218,193,215,52,134,138,107,60,100,78,95,207,60,199,174,148,61,191,253,75,229,85,206,195,86,77,220,92,225,182,109,21,91,51,113,174,144,160,153,176,249,96,133,45,214,201,68,89,245,
101,38,107,206,87,44,137,121,90,216,235,38,179,120,241,209,208,176,139,167,73,154,135,236,255,163,202,87,161,217,184,232,84,111,97,204,26,29,3,142,101,211,166,150,58,192,81,171,225,112,138,132,12,40,154,68,223,110,191,95,60,112,251,53,171,226,219,136,
17,27,38,47,138,93,115,198,65,221,177,80,236,250,213,235,191,86,12,253,94,204,21,246,215,123,5,222,79,25,246,251,189,3,139,39,171,158,158,86,58,246,20,188,6,73,177,172,234,229,117,220,88,157,139,197,247,187,227,222,78,101,249,99,94,129,159,243,62,231,
119,173,248,219,7,31,175,61,23,186,55,216,37,3,170,228,243,249,117,51,250,244,163,252,242,31,254,106,52,175,222,47,144,94,52,201,31,127,190,125,141,196,139,112,247,190,193,85,184,55,22,10,118,212,241,246,88,93,78,125,190,190,252,35,48,229,133,83,248,
177,118,203,99,79,160,250,154,138,115,101,43,211,24,105,212,8,223,166,73,159,14,204,120,223,44,210,203,143,22,95,238,145,63,70,162,109,183,234,175,124,72,218,120,145,70,157,241,182,187,55,95,189,52,241,121,57,233,227,251,7,222,182,240,253,111,107,201,
135,27,31,236,105,33,81,188,113,230,239,39,66,222,172,59,173,29,2,62,255,115,254,28,31,43,246,30,176,175,93,44,156,129,59,240,228,200,82,156,73,91,127,153,191,181,170,216,176,31,208,242,68,198,158,37,196,226,130,55,76,19,27,75,141,108,85,132,122,60,155,
82,226,149,87,48,86,195,221,125,14,225,225,171,105,213,101,229,85,121,87,94,189,210,90,9,43,212,104,116,177,171,121,254,118,255,235,227,184,229,87,139,138,111,255,251,208,66,242,183,255,237,218,155,22,255,187,249,239,112,255,157,160,161,29,153,95,50,
125,108,181,235,103,123,254,17,142,134,29,37,58,176,53,180,40,115,8,173,141,112,203,207,177,111,58,107,248,121,174,22,163,67,166,60,99,178,57,139,202,239,35,89,161,166,187,106,111,218,63,9,31,15,61,134,255,142,245,223,119,61,250,210,223,71,91,207,193,
195,120,229,193,155,94,45,225,227,75,187,99,168,237,55,78,60,221,120,177,242,171,249,42,28,82,121,185,145,237,124,155,68,229,48,228,226,52,157,83,175,98,82,177,150,32,201,98,178,212,43,134,106,100,26,16,23,106,132,81,172,25,239,57,241,161,33,114,201,
33,101,62,180,220,84,189,91,24,169,52,215,158,220,242,121,159,207,59,69,179,168,124,16,167,199,69,207,23,140,62,213,226,183,214,149,63,253,247,225,247,62,239,251,121,135,80,85,227,212,194,219,135,54,235,117,44,185,114,67,91,243,247,214,83,200,62,239,
243,121,223,67,239,120,27,248,185,194,244,174,8,98,200,6,5,237,78,136,196,193,99,255,171,193,166,45,77,37,52,34,52,182,77,1,37,127,53,178,255,253,249,71,133,156,44,58,254,26,58,138,23,39,62,128,122,121,96,170,55,250,203,43,66,210,114,32,22,209,152,93,
253,179,139,171,222,182,186,186,83,120,179,125,154,34,147,52,178,106,13,237,123,107,137,210,109,214,201,24,38,106,100,5,219,195,206,232,182,107,216,91,50,79,133,162,250,190,159,44,223,4,33,174,25,201,154,12,31,183,39,94,205,86,63,11,17,248,36,141,172,
208,232,14,157,195,101,59,152,52,245,209,163,213,235,96,38,56,52,210,169,75,250,204,93,120,190,93,186,147,57,109,36,187,120,189,142,215,177,100,197,176,165,21,198,12,141,236,251,206,105,112,156,117,224,19,101,27,217,254,102,227,132,8,211,181,168,40,223,
32,55,70,178,125,3,194,61,27,164,97,114,149,60,62,237,219,138,40,182,175,26,27,103,111,165,105,223,193,94,46,118,153,39,159,179,135,181,244,56,213,240,174,131,59,202,239,80,159,147,43,154,182,177,93,131,225,226,174,168,86,185,69,180,155,242,209,77,148,
52,203,201,14,180,155,78,111,210,60,218,60,196,48,154,55,178,254,67,55,131,18,46,212,200,170,28,201,66,7,23,114,223,122,66,34,151,106,112,194,7,23,17,255,253,207,191,242,176,121,74,116,249,41,20,59,174,210,153,14,78,141,138,209,142,175,187,98,131,122,
222,158,182,159,49,26,56,159,66,171,227,107,119,3,155,225,192,212,120,152,58,130,141,122,84,107,88,204,70,14,6,26,24,76,58,68,252,199,63,255,253,99,32,22,31,199,99,241,245,255,150,7,116,3,205,163,192,133,197,190,163,47,94,254,195,202,101,68,188,201,193,
98,225,44,226,223,31,44,159,105,124,253,13,103,250,104,46,127,59,38,55,78,47,16,175,14,222,165,3,56,239,25,34,198,251,198,242,250,187,121,113,7,30,255,7,245,163,217,246,163,237,249,23,121,83,171,78,239,34,207,203,248,147,191,54,48,22,226,212,99,243,95,
127,85,173,211,211,47,92,54,154,109,27,62,254,62,146,191,63,189,28,111,127,145,126,44,60,127,26,6,190,30,63,126,108,66,133,38,231,16,225,168,210,249,230,23,7,106,108,72,124,242,135,22,16,123,31,91,217,218,200,110,249,118,203,33,20,81,55,40,149,106,132,
11,39,10,86,143,180,242,175,6,150,55,68,177,207,141,236,253,206,228,223,17,208,184,143,65,26,97,44,125,51,175,61,41,146,95,54,139,251,182,141,203,7,123,148,111,9,166,113,31,3,52,188,188,243,104,94,243,139,183,67,196,85,231,38,190,125,103,93,64,90,113,
42,82,100,99,150,49,232,194,177,154,246,173,237,253,112,114,121,157,43,198,136,26,29,157,218,80,108,106,97,177,120,65,56,189,107,56,71,78,254,173,191,30,39,33,99,158,96,245,243,72,205,139,77,50,173,25,193,197,167,40,22,71,123,135,149,205,82,190,198,198,
236,163,102,35,124,106,100,31,206,144,167,109,231,219,99,113,196,184,97,112,185,163,47,17,229,40,122,62,98,247,97,245,114,188,151,119,230,96,207,87,176,163,74,25,68,213,18,132,168,214,158,99,243,73,142,143,23,146,55,95,0,171,48,246,133,130,205,33,31,
59,208,62,133,157,169,94,57,43,126,113,188,195,109,251,98,173,180,181,53,125,184,21,216,75,193,24,166,195,141,35,191,222,49,83,104,190,253,122,4,108,67,4,251,216,142,242,215,163,153,159,55,80,99,99,162,209,78,28,24,191,229,23,199,125,58,182,19,31,26,
153,168,198,185,50,181,219,166,51,219,95,15,92,230,165,182,158,151,27,25,156,177,161,229,2,223,76,45,218,189,72,198,85,7,165,105,213,248,114,245,199,59,239,51,212,240,24,184,217,28,57,52,211,241,219,48,10,93,130,118,227,6,39,108,100,233,237,232,45,142,
181,145,40,181,103,181,196,67,201,61,254,215,231,117,63,143,219,148,47,63,216,123,108,167,42,205,246,54,193,153,250,252,230,191,62,175,251,121,110,208,121,86,62,232,182,52,141,212,175,109,67,243,115,14,141,15,211,252,60,101,64,62,60,68,203,205,71,122,
176,171,241,189,251,95,177,236,229,205,188,136,47,167,165,218,53,37,79,124,220,32,177,142,41,34,223,230,147,235,121,199,16,113,87,62,182,37,110,105,110,140,222,224,242,174,67,53,109,90,81,148,223,238,232,54,136,124,119,90,43,251,188,234,231,21,14,166,
150,201,200,183,1,218,210,158,116,127,133,108,191,203,95,78,243,141,241,249,252,67,201,79,123,114,31,173,131,128,51,185,31,105,185,192,66,14,182,107,56,86,249,198,93,109,152,82,89,118,247,6,118,184,37,56,1,200,248,105,82,183,134,119,175,182,23,48,112,
195,203,211,52,176,214,91,12,19,13,31,211,48,91,2,211,13,31,115,129,6,230,73,100,216,157,15,165,98,203,214,0,57,237,80,49,239,94,102,42,222,184,53,52,166,110,88,185,232,114,239,197,183,60,15,250,191,219,155,191,253,183,223,127,59,15,246,126,158,155,203,
69,150,187,111,136,8,23,204,161,142,74,115,142,236,150,238,206,126,49,9,68,254,118,183,119,126,252,247,135,207,179,207,155,126,254,99,50,143,230,9,86,241,236,230,241,104,76,239,14,209,81,122,128,245,219,226,110,245,185,63,239,31,176,106,188,156,43,109,
91,65,180,217,83,24,100,108,116,116,57,119,69,10,21,115,176,22,97,18,206,31,197,242,186,6,246,234,171,46,109,113,197,70,118,244,216,207,183,13,239,104,254,189,50,17,10,209,108,109,59,72,255,251,243,143,66,81,170,76,156,19,45,153,90,172,24,34,30,207,189,
226,240,82,52,52,206,192,89,68,168,200,173,82,80,58,105,123,106,96,121,41,153,235,147,76,25,42,34,130,125,106,30,171,90,136,230,131,6,214,46,158,190,104,124,38,174,226,52,13,172,202,193,188,123,161,121,195,112,81,19,228,202,17,172,250,59,250,206,122,
241,59,222,20,96,126,241,127,99,136,56,122,59,29,122,143,95,253,155,198,53,58,215,193,160,101,4,107,54,154,43,116,26,191,212,32,12,206,53,68,236,112,161,75,99,66,14,214,56,163,209,232,56,119,14,102,94,123,174,26,193,154,142,226,58,157,34,156,185,109,
139,190,39,25,34,186,155,98,158,33,239,85,204,114,60,58,77,15,189,35,88,243,40,230,86,122,14,68,239,152,177,129,41,69,56,91,3,219,218,248,52,58,102,109,96,49,107,163,59,99,118,111,8,61,205,174,143,153,131,177,174,19,201,23,47,134,56,89,14,166,145,49,
195,136,229,85,227,235,117,220,58,77,15,163,68,176,155,225,63,231,10,118,213,115,188,116,100,131,53,50,52,200,197,6,182,63,38,137,102,76,213,66,58,28,168,169,68,115,217,211,218,53,74,174,208,232,204,236,139,70,215,182,129,93,111,106,25,232,20,193,234,
197,84,39,73,184,66,200,75,219,15,244,53,43,136,93,75,210,224,56,219,88,49,213,137,38,121,119,131,211,200,56,69,242,181,110,136,88,123,103,226,237,55,53,52,102,107,76,175,27,216,209,215,23,69,157,29,111,223,208,52,105,141,162,114,4,219,213,200,42,183,
132,118,231,52,77,109,69,131,33,226,161,151,161,84,14,2,158,177,100,250,6,118,40,40,117,184,132,118,52,238,104,160,52,111,96,147,141,237,96,206,6,86,36,189,26,188,113,153,120,148,238,17,236,80,122,229,226,150,206,225,194,238,77,42,211,252,243,104,96,
186,92,232,218,192,180,15,216,220,192,26,55,27,195,69,46,36,253,62,234,247,221,1,191,36,150,22,228,4,8,39,22,255,253,207,191,114,145,6,115,201,210,187,212,106,1,134,235,175,210,72,27,131,178,6,244,97,213,130,216,165,111,205,104,188,227,94,144,6,204,172,
213,37,163,115,189,40,172,117,141,20,40,20,1,9,160,114,16,43,210,209,234,173,21,1,64,235,32,214,126,226,41,65,11,128,117,188,84,22,0,65,12,0,90,75,183,219,237,246,143,127,254,251,253,55,226,249,164,216,182,83,100,241,242,7,199,79,179,197,174,133,56,189,
7,156,95,149,78,119,103,191,26,21,58,228,120,250,191,86,220,216,113,224,198,250,120,61,101,192,225,91,245,99,223,140,194,230,33,6,206,47,127,232,232,162,218,218,98,199,167,251,215,24,191,254,175,180,255,231,199,126,85,110,215,246,45,169,220,107,114,1,
38,12,112,133,123,188,207,73,194,82,143,27,187,215,150,22,23,242,34,70,44,103,52,177,58,245,217,245,248,85,126,241,139,104,91,221,0,37,85,25,52,231,45,43,47,159,90,124,220,191,167,248,176,255,252,92,58,154,99,109,138,124,213,82,155,252,80,32,33,133,2,
78,149,35,181,13,118,249,253,26,163,210,254,229,159,113,35,86,22,66,218,188,5,177,234,159,247,228,155,91,191,118,236,104,16,232,128,19,7,187,114,93,94,126,179,242,168,212,167,230,229,216,242,144,180,164,159,159,196,161,221,44,124,11,199,142,211,141,149,
230,135,2,144,233,189,94,98,68,147,237,126,117,173,45,189,254,201,251,13,218,126,234,242,205,15,86,164,112,81,188,24,98,93,141,138,121,192,5,237,238,250,242,142,132,165,80,63,155,246,109,240,173,234,229,179,250,99,145,168,147,175,11,128,128,92,111,93,
71,153,203,244,157,105,107,148,58,246,132,86,185,219,224,163,90,97,199,166,122,0,184,98,24,58,214,53,126,139,9,177,127,251,210,145,45,217,157,144,69,249,194,142,222,53,46,160,1,236,235,159,15,156,221,75,31,87,177,34,129,122,253,149,40,188,135,45,179,
182,157,27,231,161,50,96,68,3,12,176,223,247,170,15,17,100,103,31,154,86,237,224,138,40,249,28,204,54,6,130,202,215,197,142,221,175,40,58,1,19,71,165,174,15,160,173,237,242,247,247,179,219,158,19,139,61,27,119,104,207,154,141,12,38,29,224,0,151,83,233,
110,129,14,79,39,149,184,34,147,54,175,49,246,124,117,99,116,202,183,41,34,68,233,217,192,0,234,15,207,99,251,226,26,37,22,123,86,147,106,174,233,103,148,221,16,119,79,112,211,132,19,145,64,105,117,102,54,220,249,147,40,187,181,123,186,253,102,207,137,
29,74,174,220,5,8,80,100,112,28,205,54,166,208,131,80,81,35,136,237,12,44,249,69,88,139,210,53,40,200,1,20,15,130,81,108,77,5,111,76,137,191,131,88,191,75,80,249,150,191,189,165,19,128,57,130,95,28,94,210,241,94,63,61,102,69,135,246,46,74,21,77,148,43,
105,81,17,96,194,188,112,253,233,189,244,115,97,177,127,91,10,196,159,40,121,159,231,16,211,122,0,156,59,4,69,181,37,175,200,196,190,94,63,86,228,148,226,238,44,40,26,20,202,173,199,139,120,0,46,149,79,181,238,46,211,230,100,42,206,95,40,53,178,76,0,
1,173,114,16,91,181,1,77,95,157,178,156,64,197,8,27,1,208,202,68,3,234,22,87,116,238,227,236,106,110,252,75,0,122,6,181,42,153,216,247,21,198,210,214,84,123,114,110,223,147,222,206,250,1,34,193,184,89,95,185,171,51,121,57,136,149,93,97,201,154,138,77,
191,18,216,0,198,139,195,177,233,219,59,50,177,126,25,89,217,140,205,163,99,0,149,178,190,42,143,24,111,184,197,190,83,92,233,150,91,151,187,208,40,28,2,162,217,209,247,149,29,61,219,151,182,236,66,84,249,242,88,85,227,101,153,0,21,59,219,40,219,155,
166,173,219,16,5,54,120,246,236,89,126,6,208,169,147,253,25,196,100,20,2,20,192,156,82,245,206,249,68,243,23,206,24,238,227,246,250,114,101,94,241,119,188,216,111,191,247,251,217,126,255,234,115,78,22,196,186,68,2,71,83,151,192,187,229,239,124,112,121,
126,239,247,163,255,126,86,186,207,158,65,236,211,209,164,102,0,118,117,159,87,13,122,201,225,0,112,157,160,119,182,128,86,54,136,201,164,0,78,145,197,205,210,157,167,226,165,35,144,1,156,38,216,69,209,165,141,30,196,206,158,183,2,208,61,112,213,13,98,
71,247,65,224,3,168,106,223,59,66,198,220,222,241,110,236,200,83,213,46,0,29,185,59,113,188,65,71,153,32,252,120,66,123,205,211,162,95,255,182,229,105,82,191,247,251,153,127,31,186,185,223,221,66,30,126,123,67,16,187,232,209,233,111,127,251,251,245,223,
121,226,6,238,140,209,115,16,107,59,51,148,185,26,1,70,234,70,199,157,123,34,255,248,191,98,77,38,86,119,102,168,152,163,86,1,196,201,142,193,108,93,159,126,23,22,0,152,37,14,124,223,158,148,21,33,0,147,246,249,105,235,226,92,79,4,184,110,88,137,65,182,
39,214,6,177,173,49,114,182,135,232,0,216,223,107,71,241,37,110,251,85,170,181,131,33,72,1,156,62,164,245,126,228,46,221,110,183,219,255,254,252,163,112,100,61,98,236,19,150,78,167,2,140,211,233,14,248,176,115,22,66,0,88,229,174,8,0,152,149,105,167,0,
24,87,94,10,98,249,245,111,98,228,189,41,178,113,81,164,60,157,224,4,24,48,19,27,122,146,231,34,15,45,236,189,115,50,202,111,10,0,101,131,24,165,131,95,157,204,16,64,16,155,49,27,219,18,83,162,207,166,8,75,0,157,51,177,139,191,59,174,120,124,141,230,
25,30,245,196,138,250,139,133,33,142,122,135,170,65,76,0,43,211,197,113,149,97,202,218,239,8,94,208,44,19,155,190,99,238,180,19,71,187,41,65,16,224,96,16,251,212,49,235,100,199,14,130,130,37,32,136,93,33,58,232,197,1,166,100,218,41,0,100,98,50,51,0,166,
10,98,167,189,62,182,237,222,248,83,238,46,117,25,39,193,96,153,152,27,62,192,192,1,131,151,105,131,216,247,6,122,186,202,202,142,72,160,223,224,69,119,211,48,136,57,34,29,141,0,45,184,59,17,0,153,24,13,50,184,86,100,138,128,32,134,32,11,19,11,155,114,
233,32,150,21,62,96,48,87,118,83,86,116,168,87,235,115,93,19,3,64,38,182,102,48,35,43,3,24,63,129,156,169,175,78,61,11,87,80,3,56,103,32,60,101,16,3,160,81,116,185,72,150,144,122,78,69,225,84,35,64,199,128,119,130,142,55,141,18,94,188,0,18,96,224,204,
110,174,32,246,105,47,133,1,0,166,9,98,253,179,180,90,3,15,225,24,96,242,32,118,108,198,249,181,185,232,152,225,194,3,217,0,173,210,134,138,153,88,253,236,164,212,142,244,217,58,65,14,16,120,6,205,196,94,109,126,92,162,112,99,215,90,5,52,64,224,25,56,
136,169,244,126,25,33,32,24,177,53,136,229,247,197,216,180,171,142,153,14,177,44,180,1,140,158,137,53,13,102,39,184,147,255,34,207,22,2,204,17,196,62,117,206,213,59,227,126,19,137,156,226,100,129,96,9,8,98,11,157,113,243,142,242,164,129,173,119,176,84,
132,192,172,188,79,12,128,235,101,98,175,70,251,70,244,231,207,218,0,78,19,196,62,117,134,205,2,218,187,30,88,68,5,16,196,78,145,94,8,104,0,167,228,154,24,0,50,177,161,19,33,23,239,0,206,26,196,220,183,14,128,76,108,117,34,84,90,148,222,32,49,28,96,138,
96,16,255,253,207,191,54,45,86,255,222,191,48,212,1,160,155,116,83,7,0,147,218,116,26,209,200,95,150,5,48,74,31,38,3,3,96,74,2,24,0,83,218,116,10,177,203,44,245,87,201,133,95,148,245,64,155,3,80,172,15,235,18,192,212,132,40,2,48,85,6,166,175,62,85,114,
7,112,141,0,166,131,21,172,0,166,205,192,244,220,0,76,21,192,118,197,29,193,74,81,0,52,224,54,122,0,4,48,0,16,192,0,64,0,3,64,0,3,128,1,164,219,237,118,251,199,63,255,253,230,227,120,253,215,234,219,235,226,199,159,101,238,204,139,77,219,225,110,64,224,
212,162,125,175,23,171,190,16,21,86,26,191,254,207,116,124,43,183,253,246,248,124,138,219,163,224,101,231,112,4,174,33,47,116,216,81,103,149,177,106,155,10,198,150,28,79,139,191,175,44,149,85,219,179,118,15,242,225,98,203,187,127,149,111,109,38,153,4,
232,19,201,218,245,116,203,107,201,21,214,248,91,170,150,125,85,207,91,243,192,27,9,48,66,127,153,7,232,208,95,228,106,133,54,37,21,216,148,67,113,180,103,145,174,142,149,0,172,238,79,91,245,157,105,221,166,197,193,93,139,6,69,39,220,0,236,27,182,71,
199,117,111,93,127,94,25,192,222,196,158,213,33,41,63,166,177,81,38,252,188,13,245,229,3,229,158,179,183,194,40,48,95,204,42,219,127,46,246,235,133,242,142,180,216,245,238,10,98,81,126,135,223,254,48,138,20,68,207,160,7,92,91,151,238,235,199,229,177,
242,103,179,22,175,192,229,199,117,111,95,111,90,21,146,54,47,251,219,15,170,158,69,204,15,255,9,41,16,192,161,145,247,139,64,214,226,42,208,218,64,17,47,3,216,190,245,70,225,47,31,139,117,249,175,140,76,16,3,102,141,31,195,100,107,15,189,113,129,228,
172,216,62,62,108,86,218,179,47,181,35,222,225,85,229,110,53,14,208,53,216,69,171,149,71,221,213,172,9,98,233,232,82,119,157,93,92,177,243,69,207,198,230,174,195,24,128,238,1,46,74,47,173,74,48,203,235,99,64,142,50,147,249,214,152,111,99,255,82,220,70,
1,240,170,103,44,55,71,71,110,186,221,239,62,73,7,243,169,133,95,150,185,123,99,123,160,119,14,17,160,110,166,214,238,25,220,119,107,186,95,182,170,76,138,8,80,166,127,237,212,151,110,190,11,49,74,206,37,181,176,156,104,84,246,146,53,224,234,14,119,125,
185,238,10,163,68,0,43,30,60,98,176,106,201,181,106,23,64,232,43,217,255,167,250,43,94,248,114,245,211,168,185,92,97,55,25,198,0,204,228,64,234,117,176,255,79,91,3,78,203,151,67,214,121,228,192,228,191,0,107,194,80,84,91,83,153,233,6,83,155,213,47,4,
141,216,86,184,81,173,186,54,44,93,252,3,228,86,59,187,199,135,152,112,224,42,79,58,186,99,197,30,52,142,253,133,26,35,213,172,192,6,8,124,235,187,196,3,167,245,250,188,145,249,108,157,188,160,5,208,92,250,24,18,87,68,198,109,193,243,97,185,5,59,254,
178,231,110,119,188,244,205,243,100,128,65,241,142,108,236,235,109,34,251,102,190,79,139,191,216,21,196,98,219,158,69,189,66,11,71,18,48,115,175,127,162,238,107,85,191,188,97,223,211,234,181,30,121,31,88,199,64,214,247,72,18,252,128,73,186,175,152,101,
67,31,3,88,193,211,120,49,96,84,234,59,17,189,115,139,64,105,243,15,140,75,61,142,149,234,111,84,30,174,192,243,169,15,13,224,154,105,85,76,185,23,71,182,186,248,11,45,15,109,212,0,73,155,9,55,0,113,177,93,71,119,164,219,79,237,74,38,170,125,125,212,
64,39,200,1,83,71,160,134,73,197,158,110,63,181,45,92,93,58,64,191,160,118,174,62,56,69,229,98,11,135,14,192,73,67,72,223,52,39,109,94,250,198,26,120,222,160,13,11,200,106,28,48,176,45,27,0,115,185,159,69,157,45,221,18,196,26,188,78,165,192,78,73,231,
0,38,136,196,5,59,233,21,139,74,45,247,51,142,70,63,151,209,0,113,163,99,6,183,101,235,14,78,232,183,162,191,79,135,214,16,29,118,237,220,215,36,1,134,9,128,49,226,198,62,108,84,202,37,22,30,219,127,248,87,252,139,178,59,40,152,1,20,143,31,113,232,215,
133,195,226,195,70,221,251,22,142,251,244,0,102,8,100,121,192,165,165,17,10,70,242,4,48,79,70,86,40,151,154,63,128,21,13,97,162,33,192,53,194,97,254,117,10,49,151,221,142,126,11,169,145,239,2,208,36,160,109,235,184,211,243,143,99,128,29,40,152,156,202,
200,0,38,207,204,222,187,63,127,61,183,88,231,202,159,23,76,163,100,100,0,29,67,77,29,169,232,251,187,170,100,60,5,179,50,83,200,3,156,70,250,234,181,251,157,64,140,26,161,170,92,144,19,208,0,90,164,24,123,3,88,133,61,138,19,214,142,192,6,48,90,6,182,
50,238,52,236,180,135,187,255,66,192,2,24,42,27,75,155,146,167,14,81,101,152,51,122,179,222,4,18,47,234,109,233,239,239,7,130,223,251,253,204,191,95,243,55,83,38,33,233,221,138,99,240,66,145,20,237,40,176,188,16,148,253,237,239,43,255,61,211,160,84,86,
118,187,221,62,204,133,152,39,41,24,119,199,3,204,23,204,170,6,48,97,8,128,145,117,120,35,243,218,216,236,4,33,192,225,52,38,206,91,8,233,112,33,198,56,245,41,228,1,28,12,120,149,131,95,201,252,39,141,95,234,194,18,0,63,163,113,26,63,132,228,213,195,
130,245,223,4,160,103,175,30,171,191,89,51,3,27,252,121,10,87,214,0,10,230,15,133,178,132,18,161,35,205,95,170,66,18,192,181,162,102,201,0,214,245,92,99,201,91,240,5,67,128,253,93,112,110,218,165,166,181,219,23,69,191,56,106,238,182,54,24,10,116,128,
172,232,104,114,115,52,100,164,42,251,25,42,115,28,71,38,67,244,123,191,63,195,239,95,117,76,163,78,150,152,207,223,101,22,44,214,116,187,176,107,220,181,120,100,50,68,191,247,251,43,255,222,12,65,163,135,236,180,101,37,81,229,203,115,20,166,147,134,
0,99,37,153,105,235,122,175,16,196,142,148,185,64,7,208,70,218,18,14,175,220,57,11,76,0,99,185,43,2,0,38,205,192,42,242,188,49,0,53,3,88,147,216,50,249,53,177,153,95,222,234,141,244,126,127,229,223,35,3,147,145,157,32,240,122,131,188,191,175,252,247,
89,232,58,127,115,13,12,0,25,152,108,12,160,93,215,121,245,140,237,62,76,141,120,232,29,128,41,50,48,0,154,103,108,103,202,200,92,3,3,64,6,86,116,168,224,186,24,0,205,2,152,160,3,48,180,53,183,27,204,210,149,151,9,96,2,23,192,233,130,92,84,95,195,8,1,
172,254,222,2,112,234,188,175,87,0,3,128,6,65,171,94,0,115,19,6,0,141,212,203,192,246,6,95,129,15,160,137,114,221,109,238,178,157,78,33,2,8,92,93,2,211,184,25,88,201,64,46,43,3,24,36,219,26,103,187,231,200,192,178,26,6,40,213,141,158,165,171,115,10,113,
158,108,121,127,80,222,251,70,64,191,247,251,51,252,254,235,111,111,188,124,219,213,197,192,29,225,167,170,18,192,0,140,220,101,96,0,8,74,2,24,229,143,227,61,239,96,247,123,191,191,202,239,103,106,208,174,215,255,14,96,103,126,95,204,216,81,37,222,180,
164,119,39,254,99,231,239,93,68,241,251,43,255,126,107,251,145,175,141,22,7,222,205,86,152,198,40,42,135,205,186,97,99,174,252,123,67,120,191,151,130,77,221,117,92,162,127,92,8,96,101,110,208,17,168,0,102,14,31,49,248,54,85,204,192,162,241,110,1,112,
37,119,33,1,128,119,113,96,228,88,112,87,69,0,156,42,3,147,133,1,48,178,52,118,144,18,66,1,174,99,91,159,127,95,179,184,209,207,131,2,80,55,172,228,129,182,101,117,0,3,128,17,109,186,141,254,93,4,54,115,7,192,53,50,177,17,250,253,188,39,128,45,45,44,
118,23,5,0,51,6,179,158,147,94,164,26,59,244,188,83,2,21,0,229,227,65,154,105,99,1,56,103,48,218,29,192,254,247,231,31,133,82,193,163,198,188,154,230,26,31,192,120,157,239,93,190,180,110,156,225,81,2,128,177,12,246,66,203,165,16,33,23,2,224,69,6,6,0,
2,24,0,8,96,0,240,44,41,2,0,134,148,101,96,0,156,50,3,203,63,3,222,240,247,250,117,220,192,81,230,2,3,16,192,206,148,79,206,16,1,1,40,98,206,83,136,158,42,6,144,129,189,139,15,231,206,81,246,70,191,248,184,20,121,29,128,12,12,0,182,103,96,148,206,220,
182,103,119,0,236,12,96,83,156,70,28,236,150,64,167,20,1,100,96,101,147,35,145,4,64,0,163,71,4,102,76,177,162,254,226,205,103,161,222,161,102,0,203,18,152,162,33,73,57,2,200,192,96,146,172,57,203,184,161,71,0,147,49,28,163,252,0,58,5,48,167,16,203,142,
207,149,35,64,163,0,118,154,64,54,200,237,246,91,78,26,9,118,0,5,2,152,140,98,236,96,119,148,122,4,102,100,42,41,0,206,159,129,157,98,212,126,145,52,82,86,5,8,96,31,226,128,78,114,158,56,45,216,1,103,227,20,34,0,2,24,0,180,98,38,14,183,86,2,200,192,0,
96,138,12,108,176,215,113,213,201,200,46,144,149,153,149,175,61,137,62,200,192,0,144,129,149,25,197,27,89,130,172,23,153,183,12,12,0,4,48,0,206,164,248,109,244,167,60,149,152,157,15,0,234,117,37,107,232,110,100,96,0,200,192,216,53,156,50,140,2,144,129,
1,32,128,1,192,84,156,66,108,109,205,105,71,167,25,1,4,176,211,6,185,154,4,80,224,138,1,76,223,39,128,242,162,65,100,141,196,161,192,240,1,204,148,82,176,48,24,48,64,184,100,180,241,12,216,4,1,12,224,148,3,15,169,216,117,2,88,86,79,0,69,130,99,222,16,
252,174,212,239,186,141,30,0,1,12,0,4,48,0,248,160,234,77,28,223,79,245,186,38,6,80,215,209,251,79,102,234,167,83,235,130,21,196,0,230,11,128,35,246,221,169,87,225,8,100,0,215,201,236,106,112,13,12,128,41,121,144,25,224,108,105,208,69,78,113,165,94,183,
90,184,193,3,0,25,24,0,219,50,181,19,100,13,105,148,220,168,213,5,66,153,30,128,12,12,128,51,103,105,131,115,23,34,0,103,205,192,188,137,15,128,41,3,216,167,156,83,64,3,160,143,203,157,66,204,55,47,196,5,184,96,6,182,148,145,189,34,75,3,184,158,250,169,
66,82,180,66,44,192,148,25,88,253,201,117,75,70,225,104,182,133,130,26,96,120,63,182,251,124,155,220,174,10,93,47,3,24,56,3,59,215,200,64,222,4,112,134,236,106,115,0,155,255,133,147,91,42,39,118,45,85,136,4,4,165,49,152,137,3,128,249,51,48,163,150,178,
153,27,128,76,170,102,0,203,63,139,176,89,23,29,51,30,98,249,228,161,76,128,6,129,102,226,12,172,254,173,245,173,87,212,230,48,14,141,19,160,111,0,107,158,141,157,228,46,9,51,69,2,12,18,192,154,6,177,147,100,101,2,26,192,32,1,172,75,16,59,41,51,126,0,
52,14,96,93,178,137,139,164,47,53,174,56,9,138,128,0,54,82,86,230,105,226,106,65,81,113,2,51,154,243,65,102,147,20,2,200,192,78,147,106,72,35,0,4,176,105,8,90,0,2,152,4,232,186,156,141,53,246,130,75,103,96,110,181,7,131,6,104,233,62,117,163,244,214,73,
0,25,88,233,32,214,60,27,115,62,19,64,6,6,103,41,158,190,0,0,14,109,73,68,65,84,0,151,203,192,134,96,18,66,0,25,24,0,8,96,0,48,122,0,115,99,32,0,53,85,189,6,54,204,171,189,220,161,8,112,198,12,76,174,4,192,180,25,152,20,5,128,41,3,88,93,53,115,188,56,
186,49,226,53,128,0,54,165,92,34,42,2,208,58,155,137,255,254,231,95,85,47,130,137,5,56,48,180,3,0,0,227,171,223,60,203,12,0,0,208,80,181,91,57,156,249,231,140,28,215,0,0,198,97,71,185,18,6,0,0,208,80,181,43,97,195,76,234,11,21,142,235,173,180,3,0,128,
62,227,176,75,37,97,92,144,76,3,0,0,36,97,52,180,246,244,132,100,13,0,0,73,88,25,198,214,204,198,49,11,0,192,148,73,216,48,3,89,35,106,28,10,0,0,12,206,236,136,0,0,0,13,29,186,18,214,236,106,131,203,26,56,36,0,0,56,9,87,194,0,0,0,36,97,0,0,0,146,48,0,
0,0,36,97,0,0,0,243,248,53,49,199,63,254,249,239,29,63,143,117,159,84,155,69,33,86,253,243,24,147,56,68,213,13,49,81,5,0,192,64,98,248,5,206,83,36,49,81,121,44,36,65,241,61,9,43,45,63,174,54,55,46,171,252,188,167,121,148,106,202,245,218,84,150,144,1,
0,140,35,207,156,240,53,25,162,183,47,203,232,95,239,95,121,73,170,185,51,213,147,159,216,94,30,93,143,209,232,223,230,37,104,0,0,140,150,163,198,197,246,253,94,182,248,122,87,223,232,197,157,181,56,0,0,14,140,37,141,39,231,203,3,126,58,118,37,44,190,
10,32,22,139,167,222,109,177,219,174,183,117,185,109,47,198,201,251,243,209,205,7,0,160,175,56,223,125,79,121,215,158,108,200,52,162,215,94,69,133,36,108,197,10,246,165,74,229,215,223,52,65,156,112,43,74,38,110,146,54,0,0,99,203,146,99,208,158,153,70,
141,60,37,85,88,102,155,226,249,113,124,237,95,122,245,106,91,117,4,157,179,193,72,210,0,0,122,12,182,206,117,26,125,121,164,156,15,44,32,154,87,88,42,183,204,124,187,197,186,139,134,81,107,159,226,88,34,214,164,26,22,27,205,121,146,177,189,69,80,146,
132,15,0,144,164,109,73,218,98,154,93,139,18,101,179,226,241,170,26,82,143,161,235,254,42,142,38,25,94,191,167,182,226,76,23,196,46,151,240,1,0,243,186,244,208,43,47,141,158,98,200,130,43,50,102,207,199,51,148,61,101,147,138,151,68,175,219,19,43,150,
95,151,187,76,179,158,1,0,160,215,208,75,98,119,160,224,226,60,117,88,36,193,139,213,73,216,168,15,183,157,253,50,81,190,106,243,5,0,192,24,245,50,249,70,170,90,71,81,252,235,221,142,149,92,50,43,110,153,218,203,225,0,0,134,73,93,106,138,25,119,60,230,
173,203,56,240,227,84,125,107,99,176,210,139,139,183,126,73,25,0,0,205,83,204,248,188,152,152,125,255,182,149,67,90,94,113,28,93,199,230,93,141,77,133,18,213,182,167,122,86,92,244,0,136,102,251,12,0,192,252,105,81,219,161,98,126,179,242,56,69,121,199,
198,95,165,117,95,140,253,91,22,251,119,40,74,175,164,209,149,176,62,23,159,222,28,6,174,132,1,0,176,35,113,139,38,43,207,211,39,99,123,18,178,251,144,41,249,149,182,167,199,254,63,254,15,0,0,70,24,159,94,72,170,189,130,33,223,253,86,224,234,80,156,233,
160,175,82,233,0,0,204,166,235,48,46,207,191,163,107,23,155,154,110,97,149,219,1,11,191,157,57,52,151,161,26,144,132,14,0,64,218,87,123,188,218,120,51,210,250,45,140,221,251,23,205,74,176,207,163,133,253,243,132,60,207,1,15,0,192,176,218,63,35,214,234,
242,87,219,89,26,150,214,150,182,45,114,212,68,76,66,86,239,128,151,172,1,0,48,251,205,99,109,183,126,41,255,73,61,118,123,216,202,139,58,251,41,197,177,211,0,0,103,77,200,166,30,78,70,159,50,74,61,55,182,217,21,178,152,227,0,62,101,110,34,225,2,0,160,
210,24,122,214,161,102,218,190,187,81,116,175,235,21,224,67,138,55,73,166,147,135,204,99,14,222,25,108,26,252,54,73,238,154,75,205,121,195,231,177,177,193,90,191,245,91,191,245,91,127,159,245,131,100,108,199,8,245,161,65,117,186,93,47,237,219,213,40,
222,33,212,185,42,246,98,3,39,124,121,241,184,155,108,26,196,161,171,32,119,250,173,245,91,191,245,91,191,245,247,93,63,115,51,36,106,152,87,188,25,101,55,104,103,169,72,141,23,74,198,62,23,88,212,171,165,201,14,250,177,146,50,61,5,0,64,181,129,158,33,
90,131,33,126,251,194,74,197,247,54,202,20,88,244,72,61,38,125,64,171,239,164,39,78,201,245,229,126,68,235,183,126,235,183,254,107,175,127,233,51,100,33,18,183,229,20,165,253,120,54,141,90,216,203,221,73,190,198,81,211,160,221,41,185,179,214,180,251,
129,172,223,250,173,223,250,175,181,126,39,70,207,193,200,172,197,136,169,119,41,167,106,123,56,219,12,138,23,206,241,178,110,0,0,128,11,189,70,182,247,245,227,84,117,207,162,206,241,16,61,138,242,162,87,250,71,61,167,38,57,4,0,100,66,131,108,98,156,
171,180,91,236,78,58,239,129,107,152,14,0,192,85,147,53,99,225,145,165,217,15,185,112,192,233,118,0,0,46,151,138,24,243,214,30,103,214,44,225,84,117,5,13,30,232,250,185,138,202,83,28,186,208,6,0,48,221,128,250,124,105,79,30,103,79,78,58,151,66,205,97,
127,154,122,235,123,174,220,228,140,0,0,92,62,53,221,184,248,85,99,230,243,15,172,83,243,186,62,235,235,189,36,101,0,0,82,151,134,66,33,182,221,228,130,5,158,186,237,69,180,172,215,252,247,234,98,156,3,76,146,6,0,192,64,249,76,12,191,103,49,126,129,175,
220,196,212,45,33,109,124,249,42,63,252,255,49,194,33,150,135,62,242,1,0,144,212,13,150,10,13,154,156,237,216,196,52,204,198,54,189,72,245,156,1,198,168,149,38,41,3,0,96,194,100,45,134,219,162,206,3,236,111,119,3,166,78,121,208,144,7,146,156,7,0,0,202,
167,69,198,217,207,210,80,53,213,121,6,197,225,146,177,236,200,5,0,224,92,73,89,12,179,37,29,182,38,255,72,194,174,124,45,76,198,3,0,0,215,206,1,218,229,1,105,168,68,100,152,75,81,135,95,110,208,118,147,228,141,0,0,208,96,208,93,37,9,27,50,35,154,160,
98,148,17,0,0,176,35,9,27,230,134,196,206,249,223,148,233,231,248,115,138,2,0,128,135,128,110,183,91,138,111,69,48,212,147,97,205,110,209,140,235,28,32,185,89,241,1,0,128,132,236,85,18,246,174,48,98,212,90,114,117,108,254,196,78,33,2,0,112,225,132,44,
85,201,119,194,193,113,26,18,38,0,0,140,185,219,36,97,143,59,31,74,109,113,55,79,187,187,185,227,186,37,128,0,0,18,178,19,14,19,211,150,29,143,163,165,22,215,59,72,228,17,147,38,128,0,0,71,25,8,86,31,38,206,90,196,233,74,59,59,90,30,161,28,1,0,160,236,
88,123,134,49,118,218,187,179,113,234,234,139,19,175,21,0,0,206,159,152,141,60,182,78,74,100,41,61,146,26,1,0,112,112,72,89,139,161,234,148,210,145,99,42,74,28,144,49,91,235,137,19,172,9,0,0,137,222,185,19,191,177,174,255,228,50,73,152,35,93,170,4,0,
0,108,207,142,211,209,69,75,65,218,86,157,242,6,0,128,237,99,234,145,198,209,233,140,59,53,82,150,91,58,125,146,152,1,0,192,190,113,116,20,93,90,199,36,236,240,78,93,102,14,140,92,45,57,51,13,62,0,0,221,135,181,91,69,191,77,143,230,59,91,41,9,171,82,
161,113,245,163,88,10,5,0,128,100,174,254,16,185,237,12,39,105,138,138,9,71,102,123,18,64,0,0,6,28,3,159,224,249,156,84,186,184,170,38,166,242,130,162,135,112,52,79,0,85,32,0,192,229,146,166,94,155,16,227,166,23,169,198,254,27,106,159,167,185,196,217,
26,40,0,0,116,30,157,166,154,59,19,211,44,152,146,7,166,234,1,0,224,178,25,214,10,247,105,11,212,69,21,0,0,96,66,169,102,54,227,214,196,107,42,121,68,57,126,0,0,56,97,18,86,143,1,244,53,169,119,0,0,232,148,132,85,119,153,23,61,3,0,0,167,75,194,166,207,
97,78,240,190,128,179,88,186,29,81,181,0,0,32,9,187,82,54,32,3,24,62,73,3,0,232,193,48,17,73,24,0,0,52,84,227,68,177,196,14,73,216,247,214,165,85,0,0,48,89,98,39,201,147,132,157,183,85,56,162,1,0,0,73,24,0,0,240,197,132,104,115,186,43,2,0,0,128,118,92,
9,123,199,179,99,0,0,156,104,72,123,51,188,149,132,77,125,244,58,106,1,0,144,156,113,186,36,204,17,0,0,0,146,179,106,123,37,9,123,93,86,18,49,0,0,152,34,141,137,105,182,84,18,6,0,0,76,102,172,107,37,121,186,242,147,132,1,0,0,19,200,167,217,147,164,156,
167,74,243,1,0,192,112,118,242,242,117,37,12,0,0,168,40,43,2,73,24,0,0,32,177,146,132,93,243,248,114,109,24,0,0,195,203,203,149,181,36,108,230,4,79,43,3,0,96,97,120,25,197,151,200,87,201,236,45,91,73,216,149,147,56,198,23,15,45,252,83,175,186,166,199,
205,43,62,127,92,79,172,56,230,98,227,242,173,223,250,173,223,250,173,191,252,250,191,127,254,233,247,78,224,26,50,22,79,210,148,237,158,50,148,132,1,0,192,212,105,20,179,145,132,1,0,128,164,137,30,73,88,249,251,71,161,119,231,183,231,94,141,120,241,
189,199,101,229,55,255,254,110,29,175,126,251,110,27,94,180,194,252,247,50,242,155,245,231,88,248,237,135,229,191,250,60,63,236,127,94,186,159,197,250,173,223,250,173,223,250,199,88,255,183,216,245,105,253,249,93,252,121,23,255,152,198,129,129,123,174,
179,216,203,166,221,107,202,44,149,92,152,51,24,204,83,135,121,229,191,231,141,255,190,229,59,121,195,62,28,89,255,150,207,243,198,242,179,126,235,183,126,235,183,254,254,235,207,133,215,111,28,100,232,42,31,56,82,224,107,38,236,184,43,64,0,0,128,118,
86,63,19,118,189,44,184,199,94,58,235,4,0,192,152,92,21,203,155,190,249,169,140,238,123,87,47,93,0,0,128,235,38,100,114,130,253,41,155,219,17,1,0,0,26,58,148,132,201,128,1,0,224,218,228,3,159,203,230,149,195,239,9,51,75,202,218,162,6,0,128,243,57,119,
62,144,171,148,77,202,149,54,235,26,201,153,132,11,0,128,107,59,231,251,134,115,209,165,124,47,143,212,106,179,93,49,3,0,128,107,37,102,114,128,223,229,241,88,22,247,214,21,1,0,0,112,101,169,229,202,182,38,98,253,50,103,41,35,0,0,212,28,85,199,84,91,
91,118,233,233,154,85,14,0,0,72,9,251,72,179,21,83,72,182,0,0,224,20,41,81,84,93,250,184,210,124,85,5,0,0,24,199,207,235,87,18,246,191,63,255,120,251,165,235,206,106,98,62,23,37,8,0,0,101,7,185,119,37,8,0,0,208,78,82,4,159,28,185,108,234,26,16,0,0,240,
147,43,97,0,0,0,146,48,0,0,128,115,114,59,34,0,0,192,22,7,39,123,116,37,12,0,0,160,161,180,38,139,251,250,138,169,38,14,184,104,225,101,69,2,0,0,223,146,48,58,164,31,50,65,0,0,184,42,183,35,2,0,0,52,228,74,88,43,175,46,140,197,8,27,81,147,43,111,0,0,
112,40,9,243,108,24,173,82,66,199,24,0,0,103,229,118,68,0,0,128,134,220,142,72,69,121,194,109,118,13,14,0,128,1,147,48,183,37,118,202,81,66,209,72,149,0,0,184,100,18,198,128,153,137,172,164,83,102,12,108,23,133,218,95,108,252,109,104,239,0,12,193,51,
97,0,0,0,13,29,186,18,246,120,14,209,133,24,90,218,115,206,27,0,0,166,79,194,12,114,233,197,177,7,51,203,157,150,227,246,67,0,78,144,132,185,18,198,200,67,56,199,36,0,0,167,75,194,94,13,138,13,124,7,204,74,66,145,72,214,0,0,56,93,18,246,105,224,107,144,
203,25,146,181,163,180,3,0,0,170,36,97,18,51,232,155,236,73,16,1,0,36,97,6,123,163,143,254,85,202,52,84,21,0,192,252,188,39,12,0,0,160,161,230,87,194,76,224,1,199,219,79,105,218,35,0,64,59,174,132,1,0,0,52,148,20,1,158,25,3,0,128,118,92,9,3,0,0,104,168,
219,149,176,199,139,47,46,180,64,95,163,77,159,175,79,0,0,36,97,18,50,35,116,35,103,46,156,20,114,14,186,40,0,36,97,18,50,0,36,247,48,60,227,49,184,64,18,246,42,96,106,252,0,0,125,199,99,18,71,40,199,196,28,0,0,0,13,153,162,158,114,182,156,42,115,138,
10,0,0,73,216,28,99,123,99,119,0,0,214,142,29,91,50,78,229,84,73,24,122,71,61,34,0,0,103,225,153,48,0,0,0,73,24,0,0,192,57,185,29,145,243,43,117,235,163,219,26,1,0,144,132,193,132,201,156,36,15,0,64,18,6,92,32,201,147,32,2,0,72,194,140,255,64,130,8,192,
36,194,102,194,165,146,48,239,9,3,0,24,104,64,54,211,102,54,24,60,26,159,114,202,36,12,0,0,166,73,30,101,101,156,45,9,115,85,12,0,128,43,228,121,198,186,231,229,61,97,0,0,0,146,48,0,0,0,73,24,0,0,0,7,77,61,49,199,167,251,111,221,67,11,0,192,89,199,186,
173,24,83,75,194,36,104,0,0,112,177,68,240,140,220,142,8,0,0,208,144,247,132,1,0,64,73,53,46,31,185,149,75,18,118,182,118,225,152,6,0,0,26,38,97,107,82,245,115,167,41,94,0,13,0,0,52,76,194,182,166,41,231,78,208,242,229,82,80,0,0,166,28,164,238,97,96,
59,83,18,230,152,159,149,118,6,0,0,146,48,0,0,160,7,115,206,15,193,20,245,0,0,0,13,21,184,18,230,181,200,0,0,0,13,147,48,9,26,0,0,192,32,73,24,189,153,237,17,0,0,36,97,31,210,131,189,164,21,0,0,112,126,231,152,89,36,229,83,164,48,91,42,67,194,230,234,
24,0,0,18,171,142,73,216,171,221,14,149,92,64,156,178,84,36,107,0,0,146,35,10,36,97,239,138,219,128,155,181,77,209,177,2,0,0,7,146,48,201,88,205,116,101,173,115,92,73,115,236,0,0,204,56,22,165,91,18,198,25,27,142,180,8,0,64,178,132,36,140,147,55,116,
137,31,0,96,172,4,155,146,48,183,37,114,172,27,203,82,179,105,169,37,0,36,52,80,62,9,203,251,154,209,41,134,102,198,151,195,118,203,170,6,0,128,243,38,97,178,0,137,26,28,106,36,0,0,52,73,194,46,243,110,177,107,189,68,237,84,67,127,85,5,0,192,136,238,
138,0,0,0,160,157,98,183,35,122,190,135,209,140,116,35,157,54,0,0,64,241,36,108,237,96,120,250,193,168,231,200,232,148,16,58,172,0,0,36,97,135,6,163,167,30,80,174,29,113,27,85,211,56,145,115,40,2,0,244,231,153,48,0,0,128,134,146,34,232,232,221,165,13,
151,37,0,0,64,18,86,51,255,184,108,206,33,217,98,240,243,1,154,6,0,192,137,146,176,165,1,160,65,24,72,10,1,0,206,200,51,97,0,0,0,13,13,251,76,216,37,110,87,220,122,186,223,229,65,0,0,144,132,73,200,0,0,0,214,115,59,34,0,0,64,67,166,168,159,201,167,219,
23,93,34,4,0,128,41,184,18,6,0,0,32,9,3,0,0,56,167,233,110,71,124,119,71,222,229,239,198,115,171,34,0,0,76,193,149,48,0,0,128,134,146,9,224,1,0,0,154,38,97,143,220,236,119,74,75,47,133,86,189,0,0,208,43,9,59,111,158,49,178,152,161,240,36,106,0,0,72,12,
138,240,76,24,0,0,64,67,255,15,178,157,249,255,109,185,188,65,0,0,0,0,73,69,78,68,174,66,96,130,0,0 };
const char* background_png = (const char*) temp_binary_data_0;
//================== startup.syx ==================
static const unsigned char temp_binary_data_1[] =
{ 240,67,0,9,32,0,7,64,45,99,45,99,0,0,0,0,0,0,56,0,99,0,0,10,64,49,99,46,99,0,0,0,0,0,0,56,0,99,4,0,13,64,49,99,46,99,0,0,0,0,0,0,56,0,99,0,0,15,64,49,99,44,99,0,0,0,0,0,0,56,0,99,4,0,25,64,49,99,50,99,0,0,0,0,0,0,56,0,99,0,0,70,40,49,99,99,92,0,0,0,0, { 240,67,0,9,32,0,7,64,45,99,45,99,0,0,0,0,0,0,56,0,99,0,0,10,64,49,99,46,99,0,0,0,0,0,0,56,0,99,4,0,13,64,49,99,46,99,0,0,0,0,0,0,56,0,99,0,0,15,64,49,99,44,99,0,0,0,0,0,0,56,0,99,4,0,25,64,49,99,50,99,0,0,0,0,0,0,56,0,99,0,0,70,40,49,99,99,92,0,0,0,0,
0,0,56,0,99,2,0,99,99,99,99,50,50,50,50,31,15,35,0,0,0,49,24,83,97,121,32,65,103,97,105,110,46,72,76,10,32,99,85,80,0,49,0,0,0,56,8,84,20,0,76,73,10,28,99,92,90,0,50,0,0,0,24,4,90,4,0,49,74,10,32,98,98,98,0,41,61,64,10,72,8,71,4,0,55,15,10,47,99,92,92, 0,0,56,0,99,2,0,99,99,99,99,50,50,50,50,31,15,35,0,0,0,49,24,83,97,121,32,65,103,97,105,110,46,72,76,10,32,99,85,80,0,49,0,0,0,56,8,84,20,0,76,73,10,28,99,92,90,0,50,0,0,0,24,4,90,4,0,49,74,10,32,98,98,98,0,41,61,64,10,72,8,71,4,0,55,15,10,47,99,92,92,
0,56,91,0,3,112,4,99,4,0,55,32,32,29,93,94,90,0,68,0,99,2,0,4,88,4,1,55,56,10,47,99,98,64,0,39,99,0,15,88,8,98,4,1,98,98,98,98,53,49,50,50,14,15,33,35,16,0,16,12,76,65,85,82,73,69,32,32,32,32,99,46,54,85,99,96,99,0,57,0,0,0,58,4,99,5,75,99,46,34,91,99, 0,56,91,0,3,112,4,99,4,0,55,32,32,29,93,94,90,0,68,0,99,2,0,4,88,4,1,55,56,10,47,99,98,64,0,39,99,0,15,88,8,98,4,1,98,98,98,98,53,49,50,50,14,15,33,35,16,0,16,12,76,65,85,82,73,69,32,32,32,32,99,46,54,85,99,96,99,0,57,0,0,0,58,4,99,5,75,99,46,34,91,99,
@ -54,7 +227,7 @@ static const unsigned char temp_binary_data_0[] =
111,119,51,68,32,80,97,100,57,32,77,30,99,99,58,0,10,0,0,4,48,4,99,1,25,11,30,25,28,99,99,0,0,10,0,0,4,56,4,92,8,0,26,71,20,39,99,99,0,0,0,0,0,4,72,4,93,51,5,8,10,20,41,99,99,0,0,0,0,0,0,56,5,93,14,0,18,99,20,36,99,99,0,0,0,0,0,0,64,5,90,4,0,28,99,20, 111,119,51,68,32,80,97,100,57,32,77,30,99,99,58,0,10,0,0,4,48,4,99,1,25,11,30,25,28,99,99,0,0,10,0,0,4,56,4,92,8,0,26,71,20,39,99,99,0,0,0,0,0,4,72,4,93,51,5,8,10,20,41,99,99,0,0,0,0,0,0,56,5,93,14,0,18,99,20,36,99,99,0,0,0,0,0,0,64,5,90,4,0,28,99,20,
35,99,99,17,0,0,0,0,0,56,5,99,12,0,98,98,75,60,50,50,50,50,16,3,35,99,10,8,48,12,76,70,79,32,83,87,69,69,80,32,88,247,0,0 }; 35,99,99,17,0,0,0,0,0,56,5,99,12,0,98,98,75,60,50,50,50,50,16,3,35,99,10,8,48,12,76,70,79,32,83,87,69,69,80,32,88,247,0,0 };
const char* startup_syx = (const char*) temp_binary_data_0; const char* startup_syx = (const char*) temp_binary_data_1;
const char* getNamedResource (const char*, int&) throw(); const char* getNamedResource (const char*, int&) throw();
@ -67,6 +240,7 @@ const char* getNamedResource (const char* resourceNameUTF8, int& numBytes) throw
switch (hash) switch (hash)
{ {
case 0x551aef98: numBytes = 12012; return background_png;
case 0xca88aa10: numBytes = 4104; return startup_syx; case 0xca88aa10: numBytes = 4104; return startup_syx;
default: break; default: break;
} }
@ -75,10 +249,11 @@ const char* getNamedResource (const char* resourceNameUTF8, int& numBytes) throw
return 0; return 0;
} }
const int namedResourceListSize = 1; const int namedResourceListSize = 2;
const char* namedResourceList[] = const char* namedResourceList[] =
{ {
"background_png",
"startup_syx" "startup_syx"
}; };

@ -6,6 +6,9 @@
namespace BinaryData namespace BinaryData
{ {
extern const char* background_png;
const int background_pngSize = 12012;
extern const char* startup_syx; extern const char* startup_syx;
const int startup_syxSize = 4104; const int startup_syxSize = 4104;

@ -19,6 +19,46 @@
*/ */
#include "DXLookNFeel.h" #include "DXLookNFeel.h"
#include "PluginProcessor.h"
void EnvDisplay::paint(Graphics &g) {
int rate[4];
int level[4];
for(int i=0;i<4;i++) {
rate[i] = s_rate[i]->getValue();
level[i] = s_level[i]->getValue();
}
env.init(rate, level, 99 << 5, 0);
env.keydown(true);
for (int i=0;i<72;i++) {
int32_t pos = env.getsample();
for(int j=0;j<16;j++) {
env.getsample();
}
g.setPixel(i, 32 - (sqrt(pos) / 512));
}
env.keydown(false);
for (int i=0;i<24;i++) {
int32_t pos = env.getsample();
for(int j=0;j<16;j++) {
env.getsample();
}
g.setPixel(i+72, 32 - (sqrt(pos) / 512));
}
}
void AlgoDisplay::updateUI() {
}
void AlgoDisplay::paint(Graphics &g) {
}
DXLookNFeel::DXLookNFeel() { DXLookNFeel::DXLookNFeel() {
} setColour(TextButton::buttonColourId,Colour(0xFF0FC00F));
setColour(Slider::rotarySliderOutlineColourId,Colour(0xFF0FC00F));
setColour(Slider::rotarySliderFillColourId,Colour(0xFFFFFFFF));
}

@ -22,7 +22,23 @@
#define DXLOOKNFEEL_H_INCLUDED #define DXLOOKNFEEL_H_INCLUDED
#include "../JuceLibraryCode/JuceHeader.h" #include "../JuceLibraryCode/JuceHeader.h"
#include "msfa/env.h"
class EnvDisplay : public Component {
Env env;
public:
Slider *s_rate[4];
Slider *s_level[4];
void paint(Graphics &g);
};
class AlgoDisplay : public Component {
int algo;
public:
void paint(Graphics &g);
void updateUI();
};
class DXLookNFeel : public LookAndFeel_V3 { class DXLookNFeel : public LookAndFeel_V3 {
public: public:

@ -72,11 +72,26 @@ GlobalEditor::GlobalEditor ()
lfoDelay->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); lfoDelay->setTextBoxStyle (Slider::NoTextBox, false, 80, 20);
lfoDelay->addListener (this); lfoDelay->addListener (this);
addAndMakeVisible (cutoff = new Slider ("cutoff"));
cutoff->setRange (0, 10, 0);
cutoff->setSliderStyle (Slider::Rotary);
cutoff->setTextBoxStyle (Slider::NoTextBox, false, 80, 20);
cutoff->addListener (this);
addAndMakeVisible (reso = new Slider ("reso"));
reso->setRange (0, 10, 0);
reso->setSliderStyle (Slider::Rotary);
reso->setTextBoxStyle (Slider::NoTextBox, false, 80, 20);
reso->addListener (this);
addAndMakeVisible (algoDisplay = new AlgoDisplay());
algoDisplay->setName ("algoDisplay");
//[UserPreSize] //[UserPreSize]
//[/UserPreSize] //[/UserPreSize]
setSize (250, 70); setSize (855, 90);
//[Constructor] You can add your own custom stuff here.. //[Constructor] You can add your own custom stuff here..
@ -94,6 +109,9 @@ GlobalEditor::~GlobalEditor()
lfoAmDepth = nullptr; lfoAmDepth = nullptr;
lfoPitchDepth = nullptr; lfoPitchDepth = nullptr;
lfoDelay = nullptr; lfoDelay = nullptr;
cutoff = nullptr;
reso = nullptr;
algoDisplay = nullptr;
//[Destructor]. You can add your own custom destruction code here.. //[Destructor]. You can add your own custom destruction code here..
@ -112,12 +130,15 @@ void GlobalEditor::paint (Graphics& g)
void GlobalEditor::resized() void GlobalEditor::resized()
{ {
algo->setBounds (8, 8, 64, 24); algo->setBounds (784, 48, 64, 24);
lfoType->setBounds (168, 24, 72, 16); lfoType->setBounds (768, 8, 80, 16);
lfoSpeed->setBounds (80, 8, 23, 56); lfoSpeed->setBounds (712, 0, 23, 80);
lfoAmDepth->setBounds (216, 40, 32, 24); lfoAmDepth->setBounds (816, 24, 32, 24);
lfoPitchDepth->setBounds (184, 40, 32, 24); lfoPitchDepth->setBounds (792, 24, 32, 24);
lfoDelay->setBounds (104, 8, 23, 56); lfoDelay->setBounds (736, 0, 23, 80);
cutoff->setBounds (176, 40, 48, 48);
reso->setBounds (232, 40, 48, 48);
algoDisplay->setBounds (8, 8, 150, 72);
//[UserResized] Add your own custom resize handling here.. //[UserResized] Add your own custom resize handling here..
//[/UserResized] //[/UserResized]
} }
@ -152,6 +173,16 @@ void GlobalEditor::sliderValueChanged (Slider* sliderThatWasMoved)
//[UserSliderCode_lfoDelay] -- add your slider handling code here.. //[UserSliderCode_lfoDelay] -- add your slider handling code here..
//[/UserSliderCode_lfoDelay] //[/UserSliderCode_lfoDelay]
} }
else if (sliderThatWasMoved == cutoff)
{
//[UserSliderCode_cutoff] -- add your slider handling code here..
//[/UserSliderCode_cutoff]
}
else if (sliderThatWasMoved == reso)
{
//[UserSliderCode_reso] -- add your slider handling code here..
//[/UserSliderCode_reso]
}
//[UsersliderValueChanged_Post] //[UsersliderValueChanged_Post]
//[/UsersliderValueChanged_Post] //[/UsersliderValueChanged_Post]
@ -183,6 +214,7 @@ void GlobalEditor::bind(DexedAudioProcessor *parent) {
parent->lfoWaveform->bind(lfoType); parent->lfoWaveform->bind(lfoType);
parent->lfoAmpDepth->bind(lfoAmDepth); parent->lfoAmpDepth->bind(lfoAmDepth);
parent->lfoPitchDepth->bind(lfoPitchDepth); parent->lfoPitchDepth->bind(lfoPitchDepth);
processor = parent;
} }
//[/MiscUserCode] //[/MiscUserCode]
@ -200,32 +232,43 @@ BEGIN_JUCER_METADATA
<JUCER_COMPONENT documentType="Component" className="GlobalEditor" componentName="" <JUCER_COMPONENT documentType="Component" className="GlobalEditor" componentName=""
parentClasses="public Component" constructorParams="" variableInitialisers="" parentClasses="public Component" constructorParams="" variableInitialisers=""
snapPixels="8" snapActive="1" snapShown="1" overlayOpacity="0.330" snapPixels="8" snapActive="1" snapShown="1" overlayOpacity="0.330"
fixedSize="1" initialWidth="250" initialHeight="70"> fixedSize="1" initialWidth="855" initialHeight="90">
<BACKGROUND backgroundColour="ffffff"/> <BACKGROUND backgroundColour="ffffff"/>
<SLIDER name="algo" id="8a226ddf9bbff752" memberName="algo" virtualName="" <SLIDER name="algo" id="8a226ddf9bbff752" memberName="algo" virtualName=""
explicitFocusOrder="0" pos="8 8 64 24" min="1" max="32" int="1" explicitFocusOrder="0" pos="784 48 64 24" min="1" max="32" int="1"
style="Rotary" textBoxPos="TextBoxLeft" textBoxEditable="0" textBoxWidth="80" style="Rotary" textBoxPos="TextBoxLeft" textBoxEditable="0" textBoxWidth="80"
textBoxHeight="20" skewFactor="1"/> textBoxHeight="20" skewFactor="1"/>
<COMBOBOX name="new combo box" id="31018596af3b34e9" memberName="lfoType" <COMBOBOX name="new combo box" id="31018596af3b34e9" memberName="lfoType"
virtualName="" explicitFocusOrder="0" pos="168 24 72 16" editable="0" virtualName="" explicitFocusOrder="0" pos="768 8 80 16" editable="0"
layout="33" items="TRIANGLE&#10;SAW DOWN&#10;SAW UP&#10;SQUARE&#10;SINE&#10;S&amp;HOLD" layout="33" items="TRIANGLE&#10;SAW DOWN&#10;SAW UP&#10;SQUARE&#10;SINE&#10;S&amp;HOLD"
textWhenNonSelected="" textWhenNoItems="(no choices)"/> textWhenNonSelected="" textWhenNoItems="(no choices)"/>
<SLIDER name="lfoSpeed" id="b10eaf327ab3bff5" memberName="lfoSpeed" virtualName="" <SLIDER name="lfoSpeed" id="b10eaf327ab3bff5" memberName="lfoSpeed" virtualName=""
explicitFocusOrder="0" pos="80 8 23 56" min="0" max="99" int="1" explicitFocusOrder="0" pos="712 0 23 80" min="0" max="99" int="1"
style="LinearVertical" textBoxPos="NoTextBox" textBoxEditable="1" style="LinearVertical" textBoxPos="NoTextBox" textBoxEditable="1"
textBoxWidth="80" textBoxHeight="20" skewFactor="1"/> textBoxWidth="80" textBoxHeight="20" skewFactor="1"/>
<SLIDER name="new slider" id="3e95a6206fa4a891" memberName="lfoAmDepth" <SLIDER name="new slider" id="3e95a6206fa4a891" memberName="lfoAmDepth"
virtualName="" explicitFocusOrder="0" pos="216 40 32 24" min="0" virtualName="" explicitFocusOrder="0" pos="816 24 32 24" min="0"
max="99" int="1" style="Rotary" textBoxPos="NoTextBox" textBoxEditable="1" max="99" int="1" style="Rotary" textBoxPos="NoTextBox" textBoxEditable="1"
textBoxWidth="80" textBoxHeight="20" skewFactor="1"/> textBoxWidth="80" textBoxHeight="20" skewFactor="1"/>
<SLIDER name="new slider" id="6ead769ca786c813" memberName="lfoPitchDepth" <SLIDER name="new slider" id="6ead769ca786c813" memberName="lfoPitchDepth"
virtualName="" explicitFocusOrder="0" pos="184 40 32 24" min="0" virtualName="" explicitFocusOrder="0" pos="792 24 32 24" min="0"
max="99" int="1" style="Rotary" textBoxPos="NoTextBox" textBoxEditable="1" max="99" int="1" style="Rotary" textBoxPos="NoTextBox" textBoxEditable="1"
textBoxWidth="80" textBoxHeight="20" skewFactor="1"/> textBoxWidth="80" textBoxHeight="20" skewFactor="1"/>
<SLIDER name="lfoDelay" id="1fce68dc81619ef5" memberName="lfoDelay" virtualName="" <SLIDER name="lfoDelay" id="1fce68dc81619ef5" memberName="lfoDelay" virtualName=""
explicitFocusOrder="0" pos="104 8 23 56" min="0" max="99" int="1" explicitFocusOrder="0" pos="736 0 23 80" min="0" max="99" int="1"
style="LinearVertical" textBoxPos="NoTextBox" textBoxEditable="1" style="LinearVertical" textBoxPos="NoTextBox" textBoxEditable="1"
textBoxWidth="80" textBoxHeight="20" skewFactor="1"/> textBoxWidth="80" textBoxHeight="20" skewFactor="1"/>
<SLIDER name="cutoff" id="40531f16bb0bd225" memberName="cutoff" virtualName=""
explicitFocusOrder="0" pos="176 40 48 48" min="0" max="10" int="0"
style="Rotary" textBoxPos="NoTextBox" textBoxEditable="1" textBoxWidth="80"
textBoxHeight="20" skewFactor="1"/>
<SLIDER name="reso" id="c8c13464e81a8d83" memberName="reso" virtualName=""
explicitFocusOrder="0" pos="232 40 48 48" min="0" max="10" int="0"
style="Rotary" textBoxPos="NoTextBox" textBoxEditable="1" textBoxWidth="80"
textBoxHeight="20" skewFactor="1"/>
<GENERICCOMPONENT name="algoDisplay" id="b26fb9e3b5f0bc37" memberName="algoDisplay"
virtualName="" explicitFocusOrder="0" pos="8 8 150 72" class="AlgoDisplay"
params=""/>
</JUCER_COMPONENT> </JUCER_COMPONENT>
END_JUCER_METADATA END_JUCER_METADATA

@ -23,6 +23,7 @@
//[Headers] -- You can add your own extra header files here -- //[Headers] -- You can add your own extra header files here --
#include "JuceHeader.h" #include "JuceHeader.h"
#include "PluginProcessor.h" #include "PluginProcessor.h"
#include "DXLookNFeel.h"
//[/Headers] //[/Headers]
@ -59,6 +60,7 @@ public:
private: private:
//[UserVariables] -- You can add your own custom variables in this section. //[UserVariables] -- You can add your own custom variables in this section.
DexedAudioProcessor *processor;
//[/UserVariables] //[/UserVariables]
//============================================================================== //==============================================================================
@ -68,6 +70,9 @@ private:
ScopedPointer<Slider> lfoAmDepth; ScopedPointer<Slider> lfoAmDepth;
ScopedPointer<Slider> lfoPitchDepth; ScopedPointer<Slider> lfoPitchDepth;
ScopedPointer<Slider> lfoDelay; ScopedPointer<Slider> lfoDelay;
ScopedPointer<Slider> cutoff;
ScopedPointer<Slider> reso;
ScopedPointer<AlgoDisplay> algoDisplay;
//============================================================================== //==============================================================================

@ -35,9 +35,6 @@ OperatorEditor::OperatorEditor ()
s_egl1->setTextBoxStyle (Slider::NoTextBox, false, 80, 20); s_egl1->setTextBoxStyle (Slider::NoTextBox, false, 80, 20);
s_egl1->addListener (this); s_egl1->addListener (this);
addAndMakeVisible (toggleButton = new ToggleButton ("new toggle button"));
toggleButton->setButtonText (String::empty);
addAndMakeVisible (s_egl2 = new Slider ("egl2")); addAndMakeVisible (s_egl2 = new Slider ("egl2"));
s_egl2->setRange (0, 99, 1); s_egl2->setRange (0, 99, 1);
s_egl2->setSliderStyle (Slider::Rotary); s_egl2->setSliderStyle (Slider::Rotary);
@ -119,13 +116,18 @@ OperatorEditor::OperatorEditor ()
gain->setRange (0, 1, 0); gain->setRange (0, 1, 0);
gain->setSliderStyle (Slider::LinearVertical); gain->setSliderStyle (Slider::LinearVertical);
gain->setTextBoxStyle (Slider::NoTextBox, true, 80, 20); gain->setTextBoxStyle (Slider::NoTextBox, true, 80, 20);
gain->setColour (Slider::thumbColourId, Colours::black);
gain->setColour (Slider::trackColourId, Colour (0x00ffffff));
gain->setColour (Slider::rotarySliderFillColourId, Colour (0x000000ff));
gain->setColour (Slider::textBoxBackgroundColourId, Colours::white);
gain->addListener (this); gain->addListener (this);
addAndMakeVisible (khzDisplay = new Label ("khz", addAndMakeVisible (khzDisplay = new Label ("khz",
"1,000 kHz")); "1,000 kHz"));
khzDisplay->setFont (Font (16.60f, Font::plain)); khzDisplay->setFont (Font (11.00f, Font::plain));
khzDisplay->setJustificationType (Justification::centred); khzDisplay->setJustificationType (Justification::centred);
khzDisplay->setEditable (false, false, false); khzDisplay->setEditable (false, false, false);
khzDisplay->setColour (Label::backgroundColourId, Colour (0x6a000000));
khzDisplay->setColour (Label::outlineColourId, Colour (0x00000000)); khzDisplay->setColour (Label::outlineColourId, Colour (0x00000000));
khzDisplay->setColour (TextEditor::textColourId, Colours::black); khzDisplay->setColour (TextEditor::textColourId, Colours::black);
khzDisplay->setColour (TextEditor::backgroundColourId, Colour (0x00000000)); khzDisplay->setColour (TextEditor::backgroundColourId, Colour (0x00000000));
@ -136,14 +138,87 @@ OperatorEditor::OperatorEditor ()
detune->setTextBoxStyle (Slider::NoTextBox, true, 80, 20); detune->setTextBoxStyle (Slider::NoTextBox, true, 80, 20);
detune->addListener (this); detune->addListener (this);
addAndMakeVisible (envDisplay = new EnvDisplay());
envDisplay->setName ("envDisplay");
addAndMakeVisible (sclLeftLevel = new Slider ("sclLeftLevel"));
sclLeftLevel->setTooltip ("Keyboard Scale Level Left Depth ");
sclLeftLevel->setRange (0, 99, 1);
sclLeftLevel->setSliderStyle (Slider::Rotary);
sclLeftLevel->setTextBoxStyle (Slider::NoTextBox, false, 80, 20);
sclLeftLevel->addListener (this);
addAndMakeVisible (sclRightLevel = new Slider ("sclRightLevel"));
sclRightLevel->setTooltip ("Keyboard Scale Level Right Depth ");
sclRightLevel->setRange (0, 99, 1);
sclRightLevel->setSliderStyle (Slider::Rotary);
sclRightLevel->setTextBoxStyle (Slider::NoTextBox, false, 80, 20);
sclRightLevel->addListener (this);
addAndMakeVisible (kbdLeftCurve = new ComboBox ("kbdLeftCurve"));
kbdLeftCurve->setEditableText (false);
kbdLeftCurve->setJustificationType (Justification::centredLeft);
kbdLeftCurve->setTextWhenNothingSelected (String::empty);
kbdLeftCurve->setTextWhenNoChoicesAvailable ("(no choices)");
kbdLeftCurve->addItem ("-LN", 1);
kbdLeftCurve->addItem ("-EX", 2);
kbdLeftCurve->addItem ("+EX", 3);
kbdLeftCurve->addItem ("+LN", 4);
kbdLeftCurve->addListener (this);
addAndMakeVisible (kbdRightCurve = new ComboBox ("kbdRightCurve"));
kbdRightCurve->setEditableText (false);
kbdRightCurve->setJustificationType (Justification::centredLeft);
kbdRightCurve->setTextWhenNothingSelected (String::empty);
kbdRightCurve->setTextWhenNoChoicesAvailable ("(no choices)");
kbdRightCurve->addItem ("-LN", 1);
kbdRightCurve->addItem ("-EX", 2);
kbdRightCurve->addItem ("+EX", 3);
kbdRightCurve->addItem ("+LN", 4);
kbdRightCurve->addListener (this);
addAndMakeVisible (sclLvlBrkPt = new Slider ("sclLvlBrkPt"));
sclLvlBrkPt->setTooltip ("Scale Level Breakpoint");
sclLvlBrkPt->setRange (0, 99, 1);
sclLvlBrkPt->setSliderStyle (Slider::Rotary);
sclLvlBrkPt->setTextBoxStyle (Slider::NoTextBox, false, 80, 20);
sclLvlBrkPt->addListener (this);
addAndMakeVisible (sclRateScaling = new Slider ("sclRateScaling"));
sclRateScaling->setTooltip ("Keyboard Rate Scaling");
sclRateScaling->setRange (0, 7, 1);
sclRateScaling->setSliderStyle (Slider::Rotary);
sclRateScaling->setTextBoxStyle (Slider::NoTextBox, false, 80, 20);
sclRateScaling->addListener (this);
addAndMakeVisible (keyVelSens = new Slider ("keyVelSens"));
keyVelSens->setRange (0, 7, 1);
keyVelSens->setSliderStyle (Slider::Rotary);
keyVelSens->setTextBoxStyle (Slider::NoTextBox, false, 80, 20);
keyVelSens->addListener (this);
addAndMakeVisible (ampModSens = new Slider ("ampModSens"));
ampModSens->setRange (0, 4, 1);
ampModSens->setSliderStyle (Slider::Rotary);
ampModSens->setTextBoxStyle (Slider::NoTextBox, false, 80, 20);
ampModSens->addListener (this);
//[UserPreSize] //[UserPreSize]
//[/UserPreSize] //[/UserPreSize]
setSize (250, 70); setSize (280, 90);
//[Constructor] You can add your own custom stuff here.. //[Constructor] You can add your own custom stuff here..
envDisplay->s_rate[0] = s_egv1;
envDisplay->s_rate[1] = s_egv2;
envDisplay->s_rate[2] = s_egv3;
envDisplay->s_rate[3] = s_egv4;
envDisplay->s_level[0] = s_egl1;
envDisplay->s_level[1] = s_egl2;
envDisplay->s_level[2] = s_egl3;
envDisplay->s_level[3] = s_egl4;
//[/Constructor] //[/Constructor]
} }
@ -153,7 +228,6 @@ OperatorEditor::~OperatorEditor()
//[/Destructor_pre] //[/Destructor_pre]
s_egl1 = nullptr; s_egl1 = nullptr;
toggleButton = nullptr;
s_egl2 = nullptr; s_egl2 = nullptr;
s_egl3 = nullptr; s_egl3 = nullptr;
s_egl4 = nullptr; s_egl4 = nullptr;
@ -169,6 +243,15 @@ OperatorEditor::~OperatorEditor()
gain = nullptr; gain = nullptr;
khzDisplay = nullptr; khzDisplay = nullptr;
detune = nullptr; detune = nullptr;
envDisplay = nullptr;
sclLeftLevel = nullptr;
sclRightLevel = nullptr;
kbdLeftCurve = nullptr;
kbdRightCurve = nullptr;
sclLvlBrkPt = nullptr;
sclRateScaling = nullptr;
keyVelSens = nullptr;
ampModSens = nullptr;
//[Destructor]. You can add your own custom destruction code here.. //[Destructor]. You can add your own custom destruction code here..
@ -187,23 +270,31 @@ void OperatorEditor::paint (Graphics& g)
void OperatorEditor::resized() void OperatorEditor::resized()
{ {
s_egl1->setBounds (128, 8, 24, 24); s_egl1->setBounds (136, 40, 24, 24);
toggleButton->setBounds (-8, 56, 24, 24); s_egl2->setBounds (160, 40, 24, 24);
s_egl2->setBounds (152, 8, 24, 24); s_egl3->setBounds (184, 40, 24, 24);
s_egl3->setBounds (176, 8, 24, 24); s_egl4->setBounds (208, 40, 24, 24);
s_egl4->setBounds (200, 8, 24, 24); s_egv1->setBounds (136, 64, 24, 24);
s_egv1->setBounds (128, 40, 24, 24); s_egv2->setBounds (160, 64, 24, 24);
s_egv2->setBounds (152, 40, 24, 24); s_egv3->setBounds (184, 64, 24, 24);
s_egv3->setBounds (176, 40, 24, 24); s_egv4->setBounds (208, 64, 24, 24);
s_egv4->setBounds (200, 40, 24, 24); opMode->setBounds (24, 48, 104, 16);
opMode->setBounds (40, 48, 80, 16);
opId->setBounds (0, 0, 24, 16); opId->setBounds (0, 0, 24, 16);
opLevel->setBounds (0, 32, 32, 40); opLevel->setBounds (232, 56, 32, 32);
opFine->setBounds (96, 24, 24, 24); opFine->setBounds (104, 24, 24, 24);
opCoarse->setBounds (72, 24, 24, 24); opCoarse->setBounds (80, 24, 24, 24);
gain->setBounds (224, 0, 24, 64); gain->setBounds (260, 0, 24, 88);
khzDisplay->setBounds (8, 8, 112, 16); khzDisplay->setBounds (32, 8, 88, 16);
detune->setBounds (32, 24, 40, 24); detune->setBounds (24, 24, 56, 24);
envDisplay->setBounds (136, 5, 96, 32);
sclLeftLevel->setBounds (0, 64, 24, 24);
sclRightLevel->setBounds (64, 64, 24, 24);
kbdLeftCurve->setBounds (24, 68, 40, 16);
kbdRightCurve->setBounds (88, 68, 40, 16);
sclLvlBrkPt->setBounds (0, 40, 24, 24);
sclRateScaling->setBounds (0, 16, 24, 24);
keyVelSens->setBounds (240, 24, 24, 24);
ampModSens->setBounds (240, 0, 24, 24);
//[UserResized] Add your own custom resize handling here.. //[UserResized] Add your own custom resize handling here..
//[/UserResized] //[/UserResized]
} }
@ -211,6 +302,7 @@ void OperatorEditor::resized()
void OperatorEditor::sliderValueChanged (Slider* sliderThatWasMoved) void OperatorEditor::sliderValueChanged (Slider* sliderThatWasMoved)
{ {
//[UsersliderValueChanged_Pre] //[UsersliderValueChanged_Pre]
envDisplay->repaint();
//[/UsersliderValueChanged_Pre] //[/UsersliderValueChanged_Pre]
if (sliderThatWasMoved == s_egl1) if (sliderThatWasMoved == s_egl1)
@ -261,13 +353,13 @@ void OperatorEditor::sliderValueChanged (Slider* sliderThatWasMoved)
else if (sliderThatWasMoved == opFine) else if (sliderThatWasMoved == opFine)
{ {
//[UserSliderCode_opFine] -- add your slider handling code here.. //[UserSliderCode_opFine] -- add your slider handling code here..
updateFreqDisplay(); updateDisplay();
//[/UserSliderCode_opFine] //[/UserSliderCode_opFine]
} }
else if (sliderThatWasMoved == opCoarse) else if (sliderThatWasMoved == opCoarse)
{ {
//[UserSliderCode_opCoarse] -- add your slider handling code here.. //[UserSliderCode_opCoarse] -- add your slider handling code here..
updateFreqDisplay(); updateDisplay();
//[/UserSliderCode_opCoarse] //[/UserSliderCode_opCoarse]
} }
else if (sliderThatWasMoved == gain) else if (sliderThatWasMoved == gain)
@ -278,9 +370,39 @@ void OperatorEditor::sliderValueChanged (Slider* sliderThatWasMoved)
else if (sliderThatWasMoved == detune) else if (sliderThatWasMoved == detune)
{ {
//[UserSliderCode_detune] -- add your slider handling code here.. //[UserSliderCode_detune] -- add your slider handling code here..
updateFreqDisplay(); updateDisplay();
//[/UserSliderCode_detune] //[/UserSliderCode_detune]
} }
else if (sliderThatWasMoved == sclLeftLevel)
{
//[UserSliderCode_sclLeftLevel] -- add your slider handling code here..
//[/UserSliderCode_sclLeftLevel]
}
else if (sliderThatWasMoved == sclRightLevel)
{
//[UserSliderCode_sclRightLevel] -- add your slider handling code here..
//[/UserSliderCode_sclRightLevel]
}
else if (sliderThatWasMoved == sclLvlBrkPt)
{
//[UserSliderCode_sclLvlBrkPt] -- add your slider handling code here..
//[/UserSliderCode_sclLvlBrkPt]
}
else if (sliderThatWasMoved == sclRateScaling)
{
//[UserSliderCode_sclRateScaling] -- add your slider handling code here..
//[/UserSliderCode_sclRateScaling]
}
else if (sliderThatWasMoved == keyVelSens)
{
//[UserSliderCode_keyVelSens] -- add your slider handling code here..
//[/UserSliderCode_keyVelSens]
}
else if (sliderThatWasMoved == ampModSens)
{
//[UserSliderCode_ampModSens] -- add your slider handling code here..
//[/UserSliderCode_ampModSens]
}
//[UsersliderValueChanged_Post] //[UsersliderValueChanged_Post]
//[/UsersliderValueChanged_Post] //[/UsersliderValueChanged_Post]
@ -294,9 +416,19 @@ void OperatorEditor::comboBoxChanged (ComboBox* comboBoxThatHasChanged)
if (comboBoxThatHasChanged == opMode) if (comboBoxThatHasChanged == opMode)
{ {
//[UserComboBoxCode_opMode] -- add your combo box handling code here.. //[UserComboBoxCode_opMode] -- add your combo box handling code here..
updateFreqDisplay(); updateDisplay();
//[/UserComboBoxCode_opMode] //[/UserComboBoxCode_opMode]
} }
else if (comboBoxThatHasChanged == kbdLeftCurve)
{
//[UserComboBoxCode_kbdLeftCurve] -- add your combo box handling code here..
//[/UserComboBoxCode_kbdLeftCurve]
}
else if (comboBoxThatHasChanged == kbdRightCurve)
{
//[UserComboBoxCode_kbdRightCurve] -- add your combo box handling code here..
//[/UserComboBoxCode_kbdRightCurve]
}
//[UsercomboBoxChanged_Post] //[UsercomboBoxChanged_Post]
//[/UsercomboBoxChanged_Post] //[/UsercomboBoxChanged_Post]
@ -307,12 +439,6 @@ void OperatorEditor::comboBoxChanged (ComboBox* comboBoxThatHasChanged)
//[MiscUserCode] You can add your own definitions of your custom methods or any other code here... //[MiscUserCode] You can add your own definitions of your custom methods or any other code here...
void OperatorEditor::bind(DexedAudioProcessor *parent, int op) { void OperatorEditor::bind(DexedAudioProcessor *parent, int op) {
int targetNum = op+1; int targetNum = op+1;
op=5-op;
String text = "op";
text << "OP";
text << targetNum;
String opName; String opName;
opName << "OP" << targetNum; opName << "OP" << targetNum;
@ -331,6 +457,11 @@ void OperatorEditor::bind(DexedAudioProcessor *parent, int op) {
parent->opCtrl[op].fine->bind(opFine); parent->opCtrl[op].fine->bind(opFine);
parent->opCtrl[op].coarse->bind(opCoarse); parent->opCtrl[op].coarse->bind(opCoarse);
parent->opCtrl[op].detune->bind(detune); parent->opCtrl[op].detune->bind(detune);
parent->opCtrl[op].sclBrkPt->bind(sclLvlBrkPt);
parent->opCtrl[op].sclLeftCurve->bind(kbdLeftCurve);
parent->opCtrl[op].sclRightCurve->bind(kbdRightCurve);
parent->opCtrl[op].sclLeftDepth->bind(sclLeftLevel);
parent->opCtrl[op].sclRightDepth->bind(sclRightLevel);
} }
@ -338,7 +469,8 @@ void OperatorEditor::updateGain(float v) {
gain->setValue(v); gain->setValue(v);
} }
void OperatorEditor::updateFreqDisplay() {
void OperatorEditor::updateDisplay() {
float freq = opCoarse->getValue(); float freq = opCoarse->getValue();
float fine = opFine->getValue(); float fine = opFine->getValue();
String txtFreq; String txtFreq;
@ -361,6 +493,12 @@ void OperatorEditor::updateFreqDisplay() {
txtFreq << " " << det; txtFreq << " " << det;
} }
khzDisplay->setText(txtFreq, NotificationType::dontSendNotification); khzDisplay->setText(txtFreq, NotificationType::dontSendNotification);
envDisplay->repaint();
}
void OperatorEditor::updateEnv() {
//envDisplay->update(s_)
} }
//[/MiscUserCode] //[/MiscUserCode]
@ -377,45 +515,42 @@ BEGIN_JUCER_METADATA
<JUCER_COMPONENT documentType="Component" className="OperatorEditor" componentName="" <JUCER_COMPONENT documentType="Component" className="OperatorEditor" componentName=""
parentClasses="public Component" constructorParams="" variableInitialisers="" parentClasses="public Component" constructorParams="" variableInitialisers=""
snapPixels="8" snapActive="1" snapShown="1" overlayOpacity="0.330" snapPixels="8" snapActive="1" snapShown="1" overlayOpacity="0.330"
fixedSize="1" initialWidth="250" initialHeight="70"> fixedSize="1" initialWidth="280" initialHeight="90">
<BACKGROUND backgroundColour="ffffff"/> <BACKGROUND backgroundColour="ffffff"/>
<SLIDER name="egl1" id="dc070cc41347df47" memberName="s_egl1" virtualName="" <SLIDER name="egl1" id="dc070cc41347df47" memberName="s_egl1" virtualName=""
explicitFocusOrder="0" pos="128 8 24 24" min="0" max="99" int="1" explicitFocusOrder="0" pos="136 40 24 24" min="0" max="99" int="1"
style="Rotary" textBoxPos="NoTextBox" textBoxEditable="1" textBoxWidth="80" style="Rotary" textBoxPos="NoTextBox" textBoxEditable="1" textBoxWidth="80"
textBoxHeight="20" skewFactor="1"/> textBoxHeight="20" skewFactor="1"/>
<TOGGLEBUTTON name="new toggle button" id="fcdf1076330e4ef6" memberName="toggleButton"
virtualName="" explicitFocusOrder="0" pos="-8 56 24 24" buttonText=""
connectedEdges="0" needsCallback="0" radioGroupId="0" state="0"/>
<SLIDER name="egl2" id="66f5195e9c374029" memberName="s_egl2" virtualName="" <SLIDER name="egl2" id="66f5195e9c374029" memberName="s_egl2" virtualName=""
explicitFocusOrder="0" pos="152 8 24 24" min="0" max="99" int="1" explicitFocusOrder="0" pos="160 40 24 24" min="0" max="99" int="1"
style="Rotary" textBoxPos="NoTextBox" textBoxEditable="1" textBoxWidth="80" style="Rotary" textBoxPos="NoTextBox" textBoxEditable="1" textBoxWidth="80"
textBoxHeight="20" skewFactor="1"/> textBoxHeight="20" skewFactor="1"/>
<SLIDER name="egl3" id="9d57bd53203dcdb4" memberName="s_egl3" virtualName="" <SLIDER name="egl3" id="9d57bd53203dcdb4" memberName="s_egl3" virtualName=""
explicitFocusOrder="0" pos="176 8 24 24" min="0" max="99" int="1" explicitFocusOrder="0" pos="184 40 24 24" min="0" max="99" int="1"
style="Rotary" textBoxPos="NoTextBox" textBoxEditable="1" textBoxWidth="80" style="Rotary" textBoxPos="NoTextBox" textBoxEditable="1" textBoxWidth="80"
textBoxHeight="20" skewFactor="1"/> textBoxHeight="20" skewFactor="1"/>
<SLIDER name="egl4" id="4f7c3ece3ea2cf9c" memberName="s_egl4" virtualName="" <SLIDER name="egl4" id="4f7c3ece3ea2cf9c" memberName="s_egl4" virtualName=""
explicitFocusOrder="0" pos="200 8 24 24" min="0" max="99" int="1" explicitFocusOrder="0" pos="208 40 24 24" min="0" max="99" int="1"
style="Rotary" textBoxPos="NoTextBox" textBoxEditable="1" textBoxWidth="80" style="Rotary" textBoxPos="NoTextBox" textBoxEditable="1" textBoxWidth="80"
textBoxHeight="20" skewFactor="1"/> textBoxHeight="20" skewFactor="1"/>
<SLIDER name="egr1" id="2ca8137d80da46fb" memberName="s_egv1" virtualName="" <SLIDER name="egr1" id="2ca8137d80da46fb" memberName="s_egv1" virtualName=""
explicitFocusOrder="0" pos="128 40 24 24" min="0" max="99" int="1" explicitFocusOrder="0" pos="136 64 24 24" min="0" max="99" int="1"
style="Rotary" textBoxPos="NoTextBox" textBoxEditable="1" textBoxWidth="80" style="Rotary" textBoxPos="NoTextBox" textBoxEditable="1" textBoxWidth="80"
textBoxHeight="20" skewFactor="1"/> textBoxHeight="20" skewFactor="1"/>
<SLIDER name="egr3" id="4ad6d0c532d15973" memberName="s_egv2" virtualName="" <SLIDER name="egr3" id="4ad6d0c532d15973" memberName="s_egv2" virtualName=""
explicitFocusOrder="0" pos="152 40 24 24" min="0" max="99" int="1" explicitFocusOrder="0" pos="160 64 24 24" min="0" max="99" int="1"
style="Rotary" textBoxPos="NoTextBox" textBoxEditable="1" textBoxWidth="80" style="Rotary" textBoxPos="NoTextBox" textBoxEditable="1" textBoxWidth="80"
textBoxHeight="20" skewFactor="1"/> textBoxHeight="20" skewFactor="1"/>
<SLIDER name="egr3" id="8a2027f9ede16b4f" memberName="s_egv3" virtualName="" <SLIDER name="egr3" id="8a2027f9ede16b4f" memberName="s_egv3" virtualName=""
explicitFocusOrder="0" pos="176 40 24 24" min="0" max="99" int="1" explicitFocusOrder="0" pos="184 64 24 24" min="0" max="99" int="1"
style="Rotary" textBoxPos="NoTextBox" textBoxEditable="1" textBoxWidth="80" style="Rotary" textBoxPos="NoTextBox" textBoxEditable="1" textBoxWidth="80"
textBoxHeight="20" skewFactor="1"/> textBoxHeight="20" skewFactor="1"/>
<SLIDER name="egr4" id="8c04f1c943d837e8" memberName="s_egv4" virtualName="" <SLIDER name="egr4" id="8c04f1c943d837e8" memberName="s_egv4" virtualName=""
explicitFocusOrder="0" pos="200 40 24 24" min="0" max="99" int="1" explicitFocusOrder="0" pos="208 64 24 24" min="0" max="99" int="1"
style="Rotary" textBoxPos="NoTextBox" textBoxEditable="1" textBoxWidth="80" style="Rotary" textBoxPos="NoTextBox" textBoxEditable="1" textBoxWidth="80"
textBoxHeight="20" skewFactor="1"/> textBoxHeight="20" skewFactor="1"/>
<COMBOBOX name="opMode" id="2cf8156bb94cdc40" memberName="opMode" virtualName="" <COMBOBOX name="opMode" id="2cf8156bb94cdc40" memberName="opMode" virtualName=""
explicitFocusOrder="0" pos="40 48 80 16" editable="0" layout="33" explicitFocusOrder="0" pos="24 48 104 16" editable="0" layout="33"
items="RATIO&#10;FIXED" textWhenNonSelected="" textWhenNoItems="(no choices)"/> items="RATIO&#10;FIXED" textWhenNonSelected="" textWhenNoItems="(no choices)"/>
<LABEL name="new label" id="75765097f6c5c142" memberName="opId" virtualName="" <LABEL name="new label" id="75765097f6c5c142" memberName="opId" virtualName=""
explicitFocusOrder="0" pos="0 0 24 16" edTextCol="ff000000" edBkgCol="0" explicitFocusOrder="0" pos="0 0 24 16" edTextCol="ff000000" edBkgCol="0"
@ -423,30 +558,66 @@ BEGIN_JUCER_METADATA
focusDiscardsChanges="0" fontname="Default font" fontsize="9.3000000000000007105" focusDiscardsChanges="0" fontname="Default font" fontsize="9.3000000000000007105"
bold="0" italic="0" justification="33"/> bold="0" italic="0" justification="33"/>
<SLIDER name="opLevel" id="f8521c8214fb8993" memberName="opLevel" virtualName="" <SLIDER name="opLevel" id="f8521c8214fb8993" memberName="opLevel" virtualName=""
explicitFocusOrder="0" pos="0 32 32 40" min="0" max="99" int="1" explicitFocusOrder="0" pos="232 56 32 32" min="0" max="99" int="1"
style="Rotary" textBoxPos="NoTextBox" textBoxEditable="1" textBoxWidth="80" style="Rotary" textBoxPos="NoTextBox" textBoxEditable="1" textBoxWidth="80"
textBoxHeight="20" skewFactor="1"/> textBoxHeight="20" skewFactor="1"/>
<SLIDER name="opFine" id="e445aa61bd6cddcb" memberName="opFine" virtualName="" <SLIDER name="opFine" id="e445aa61bd6cddcb" memberName="opFine" virtualName=""
explicitFocusOrder="0" pos="96 24 24 24" min="0" max="99" int="1" explicitFocusOrder="0" pos="104 24 24 24" min="0" max="99" int="1"
style="Rotary" textBoxPos="NoTextBox" textBoxEditable="1" textBoxWidth="80" style="Rotary" textBoxPos="NoTextBox" textBoxEditable="1" textBoxWidth="80"
textBoxHeight="20" skewFactor="1"/> textBoxHeight="20" skewFactor="1"/>
<SLIDER name="opCoarse" id="4eec63d30d7488d2" memberName="opCoarse" virtualName="" <SLIDER name="opCoarse" id="4eec63d30d7488d2" memberName="opCoarse" virtualName=""
explicitFocusOrder="0" pos="72 24 24 24" min="0" max="31" int="1" explicitFocusOrder="0" pos="80 24 24 24" min="0" max="31" int="1"
style="Rotary" textBoxPos="NoTextBox" textBoxEditable="1" textBoxWidth="80" style="Rotary" textBoxPos="NoTextBox" textBoxEditable="1" textBoxWidth="80"
textBoxHeight="20" skewFactor="1"/> textBoxHeight="20" skewFactor="1"/>
<SLIDER name="new slider" id="21f21cc5fae8e54b" memberName="gain" virtualName="" <SLIDER name="new slider" id="21f21cc5fae8e54b" memberName="gain" virtualName=""
explicitFocusOrder="0" pos="224 0 24 64" min="0" max="1" int="0" explicitFocusOrder="0" pos="260 0 24 88" thumbcol="ff000000"
style="LinearVertical" textBoxPos="NoTextBox" textBoxEditable="0" trackcol="ffffff" rotarysliderfill="ff" textboxbkgd="ffffffff"
textBoxWidth="80" textBoxHeight="20" skewFactor="1"/> min="0" max="1" int="0" style="LinearVertical" textBoxPos="NoTextBox"
textBoxEditable="0" textBoxWidth="80" textBoxHeight="20" skewFactor="1"/>
<LABEL name="khz" id="eb961eed8902a6fc" memberName="khzDisplay" virtualName="" <LABEL name="khz" id="eb961eed8902a6fc" memberName="khzDisplay" virtualName=""
explicitFocusOrder="0" pos="8 8 112 16" outlineCol="0" edTextCol="ff000000" explicitFocusOrder="0" pos="32 8 88 16" bkgCol="6a000000" outlineCol="0"
edBkgCol="0" labelText="1,000 kHz" editableSingleClick="0" editableDoubleClick="0" edTextCol="ff000000" edBkgCol="0" labelText="1,000 kHz" editableSingleClick="0"
focusDiscardsChanges="0" fontname="Default font" fontsize="16.600000000000001421" editableDoubleClick="0" focusDiscardsChanges="0" fontname="Default font"
bold="0" italic="0" justification="36"/> fontsize="11" bold="0" italic="0" justification="36"/>
<SLIDER name="detune" id="f093ec8defca2fc2" memberName="detune" virtualName="" <SLIDER name="detune" id="f093ec8defca2fc2" memberName="detune" virtualName=""
explicitFocusOrder="0" pos="32 24 40 24" min="0" max="14" int="1" explicitFocusOrder="0" pos="24 24 56 24" min="0" max="14" int="1"
style="LinearHorizontal" textBoxPos="NoTextBox" textBoxEditable="0" style="LinearHorizontal" textBoxPos="NoTextBox" textBoxEditable="0"
textBoxWidth="80" textBoxHeight="20" skewFactor="1"/> textBoxWidth="80" textBoxHeight="20" skewFactor="1"/>
<GENERICCOMPONENT name="envDisplay" id="b18856de924c6340" memberName="envDisplay"
virtualName="" explicitFocusOrder="0" pos="136 5 96 32" class="EnvDisplay"
params=""/>
<SLIDER name="sclLeftLevel" id="bd6f338ae68e454f" memberName="sclLeftLevel"
virtualName="" explicitFocusOrder="0" pos="0 64 24 24" tooltip="Keyboard Scale Level Left Depth "
min="0" max="99" int="1" style="Rotary" textBoxPos="NoTextBox"
textBoxEditable="1" textBoxWidth="80" textBoxHeight="20" skewFactor="1"/>
<SLIDER name="sclRightLevel" id="b9e23ed5187fc7e5" memberName="sclRightLevel"
virtualName="" explicitFocusOrder="0" pos="64 64 24 24" tooltip="Keyboard Scale Level Right Depth "
min="0" max="99" int="1" style="Rotary" textBoxPos="NoTextBox"
textBoxEditable="1" textBoxWidth="80" textBoxHeight="20" skewFactor="1"/>
<COMBOBOX name="kbdLeftCurve" id="a4b068d60be648ca" memberName="kbdLeftCurve"
virtualName="" explicitFocusOrder="0" pos="24 68 40 16" editable="0"
layout="33" items="-LN&#10;-EX&#10;+EX&#10;+LN" textWhenNonSelected=""
textWhenNoItems="(no choices)"/>
<COMBOBOX name="kbdRightCurve" id="e8b5c5cb5e36b46b" memberName="kbdRightCurve"
virtualName="" explicitFocusOrder="0" pos="88 68 40 16" editable="0"
layout="33" items="-LN&#10;-EX&#10;+EX&#10;+LN" textWhenNonSelected=""
textWhenNoItems="(no choices)"/>
<SLIDER name="sclLvlBrkPt" id="c563ac3116923bbc" memberName="sclLvlBrkPt"
virtualName="" explicitFocusOrder="0" pos="0 40 24 24" tooltip="Scale Level Breakpoint"
min="0" max="99" int="1" style="Rotary" textBoxPos="NoTextBox"
textBoxEditable="1" textBoxWidth="80" textBoxHeight="20" skewFactor="1"/>
<SLIDER name="sclRateScaling" id="f0d17c8e09aa4c49" memberName="sclRateScaling"
virtualName="" explicitFocusOrder="0" pos="0 16 24 24" tooltip="Keyboard Rate Scaling"
min="0" max="7" int="1" style="Rotary" textBoxPos="NoTextBox"
textBoxEditable="1" textBoxWidth="80" textBoxHeight="20" skewFactor="1"/>
<SLIDER name="keyVelSens" id="21795d045d07602b" memberName="keyVelSens"
virtualName="" explicitFocusOrder="0" pos="240 24 24 24" min="0"
max="7" int="1" style="Rotary" textBoxPos="NoTextBox" textBoxEditable="1"
textBoxWidth="80" textBoxHeight="20" skewFactor="1"/>
<SLIDER name="ampModSens" id="634ceaa7b0f81a6c" memberName="ampModSens"
virtualName="" explicitFocusOrder="0" pos="240 0 24 24" min="0"
max="4" int="1" style="Rotary" textBoxPos="NoTextBox" textBoxEditable="1"
textBoxWidth="80" textBoxHeight="20" skewFactor="1"/>
</JUCER_COMPONENT> </JUCER_COMPONENT>
END_JUCER_METADATA END_JUCER_METADATA

@ -23,6 +23,7 @@
//[Headers] -- You can add your own extra header files here -- //[Headers] -- You can add your own extra header files here --
#include "JuceHeader.h" #include "JuceHeader.h"
#include "PluginProcessor.h" #include "PluginProcessor.h"
#include "DXLookNFeel.h"
//[/Headers] //[/Headers]
@ -49,7 +50,8 @@ public:
void bind(DexedAudioProcessor *processor, int num); void bind(DexedAudioProcessor *processor, int num);
void updateGain(float v); void updateGain(float v);
void updateFreqDisplay(); void updateDisplay();
void updateEnv();
//[/UserMethods] //[/UserMethods]
void paint (Graphics& g); void paint (Graphics& g);
@ -65,7 +67,6 @@ private:
//============================================================================== //==============================================================================
ScopedPointer<Slider> s_egl1; ScopedPointer<Slider> s_egl1;
ScopedPointer<ToggleButton> toggleButton;
ScopedPointer<Slider> s_egl2; ScopedPointer<Slider> s_egl2;
ScopedPointer<Slider> s_egl3; ScopedPointer<Slider> s_egl3;
ScopedPointer<Slider> s_egl4; ScopedPointer<Slider> s_egl4;
@ -81,6 +82,15 @@ private:
ScopedPointer<Slider> gain; ScopedPointer<Slider> gain;
ScopedPointer<Label> khzDisplay; ScopedPointer<Label> khzDisplay;
ScopedPointer<Slider> detune; ScopedPointer<Slider> detune;
ScopedPointer<EnvDisplay> envDisplay;
ScopedPointer<Slider> sclLeftLevel;
ScopedPointer<Slider> sclRightLevel;
ScopedPointer<ComboBox> kbdLeftCurve;
ScopedPointer<ComboBox> kbdRightCurve;
ScopedPointer<Slider> sclLvlBrkPt;
ScopedPointer<Slider> sclRateScaling;
ScopedPointer<Slider> keyVelSens;
ScopedPointer<Slider> ampModSens;
//============================================================================== //==============================================================================

@ -32,52 +32,72 @@ DexedAudioProcessorEditor::DexedAudioProcessorEditor (DexedAudioProcessor* owner
midiKeyboard (ownerFilter->keyboardState, MidiKeyboardComponent::horizontalKeyboard) midiKeyboard (ownerFilter->keyboardState, MidiKeyboardComponent::horizontalKeyboard)
{ {
LookAndFeel::setDefaultLookAndFeel(&dx_lnf); LookAndFeel::setDefaultLookAndFeel(&dx_lnf);
// This is where our plugin's editor size is set. // This is where our plugin's editor size is set.
setSize (765, 380); setSize (865, 420);
processor = ownerFilter; processor = ownerFilter;
addAndMakeVisible (textButton = new TextButton ("importFile")); addAndMakeVisible (loadButton = new TextButton("LOAD"));
textButton->setButtonText ("Import ..."); loadButton->setButtonText ("LOAD");
textButton->addListener (this); loadButton->addListener (this);
textButton->setBounds (5, 5, 150, 24); loadButton->setBounds (5, 5, 50, 18);
cachedImage_background_png = ImageCache::getFromMemory (BinaryData::background_png, BinaryData::background_pngSize);
addAndMakeVisible( saveButton = new TextButton("SAVE"));
saveButton->setButtonText ("SAVE");
saveButton->addListener (this);
saveButton->setBounds (57, 5, 50, 18);
addAndMakeVisible( storeButton = new TextButton("STORE"));
storeButton->setButtonText ("STORE");
storeButton->addListener (this);
storeButton->setBounds (300, 5, 50, 18);
addAndMakeVisible( aboutButton = new TextButton("ABOUT"));
aboutButton->setButtonText ("ABOUT");
aboutButton->addListener (this);
aboutButton->setBounds (805, 5, 50, 18);
addAndMakeVisible (&presets); addAndMakeVisible (&presets);
presets.setEditableText (false); presets.setEditableText (false);
presets.setJustificationType (Justification::centredLeft); presets.setJustificationType (Justification::centredLeft);
presets.setTextWhenNothingSelected (String::empty); presets.setTextWhenNothingSelected (String::empty);
presets.setBounds(200, 5, 150, 24); presets.setBounds(115, 5, 180, 18);
for(int i=0;i<processor->getNumPrograms();i++) { for(int i=0;i<processor->getNumPrograms();i++) {
presets.addItem( processor->getProgramName(i), i+1); String id;
id << (i+1) << ". " << processor->getProgramName(i);
presets.addItem(id, i+1);
} }
presets.setSelectedId(processor->getCurrentProgram()+1, NotificationType::dontSendNotification); presets.setSelectedId(processor->getCurrentProgram()+1, NotificationType::dontSendNotification);
presets.addListener(this); presets.addListener(this);
// OPERATORS // OPERATORS
addAndMakeVisible(&(ops[0])); addAndMakeVisible(&(operators[0]));
ops[0].setBounds(5, 40, 250, 80); operators[0].setBounds(5, 40, 280, 90);
ops[0].bind(processor, 0); operators[0].bind(processor, 0);
addAndMakeVisible(&(ops[1])); addAndMakeVisible(&(operators[1]));
ops[1].setBounds(255, 40, 250, 80); operators[1].setBounds(290, 40, 280, 90);
ops[1].bind(processor, 1); operators[1].bind(processor, 1);
addAndMakeVisible(&(ops[2])); addAndMakeVisible(&(operators[2]));
ops[2].setBounds(505, 40, 250, 80); operators[2].setBounds(575, 40, 280, 90);
ops[2].bind(processor, 2); operators[2].bind(processor, 2);
addAndMakeVisible(&(ops[3])); addAndMakeVisible(&(operators[3]));
ops[3].setBounds(5, 120, 250, 80); operators[3].setBounds(5, 130, 280, 90);
ops[3].bind(processor, 3); operators[3].bind(processor, 3);
addAndMakeVisible(&(ops[4])); addAndMakeVisible(&(operators[4]));
ops[4].setBounds(255, 120, 250, 80); operators[4].setBounds(290, 130, 280, 90);
ops[4].bind(processor, 4); operators[4].bind(processor, 4);
addAndMakeVisible(&(ops[5])); addAndMakeVisible(&(operators[5]));
ops[5].setBounds(505, 120, 250, 80); operators[5].setBounds(575, 130, 280, 90);
ops[5].bind(processor, 5); operators[5].bind(processor, 5);
// add the midi keyboard component.. // add the midi keyboard component..
addAndMakeVisible (&midiKeyboard); addAndMakeVisible (&midiKeyboard);
@ -89,7 +109,7 @@ DexedAudioProcessorEditor::DexedAudioProcessorEditor (DexedAudioProcessor* owner
midiKeyboard.setBounds (4, getHeight() - keyboardHeight - 4, getWidth() - 8, keyboardHeight); midiKeyboard.setBounds (4, getHeight() - keyboardHeight - 4, getWidth() - 8, keyboardHeight);
addAndMakeVisible(&global); addAndMakeVisible(&global);
global.setBounds(505,200,250,80); global.setBounds(5,235,855,90);
global.bind(processor); global.bind(processor);
updateUI(); updateUI();
@ -103,48 +123,51 @@ DexedAudioProcessorEditor::~DexedAudioProcessorEditor() {
//============================================================================== //==============================================================================
void DexedAudioProcessorEditor::paint (Graphics& g) { void DexedAudioProcessorEditor::paint (Graphics& g) {
g.fillAll (Colours::white); g.drawImage (cachedImage_background_png, 0, 0, 865, 420,
g.setColour (Colours::black); 0, 0, cachedImage_background_png.getWidth(), cachedImage_background_png.getHeight());
g.setColour (Colour (0xb3898989));
g.fillRect (0, 0, getWidth(), 35);
g.setColour (Colours::black);
g.drawRect (0, 0, getWidth(), 35, 1);
} }
void DexedAudioProcessorEditor::buttonClicked(Button *buttonThatWasClicked) { void DexedAudioProcessorEditor::buttonClicked(Button *buttonThatWasClicked) {
FileChooser fc ("Import original DX sysex...",
File::nonexistent,
"*.syx;*.SYX",
1);
if ( fc.browseForFileToOpen()) {
String f = fc.getResults().getReference(0).getFullPathName();
uint8_t syx_data[4104];
ifstream fp_in;
fp_in.open(f.toRawUTF8(), ifstream::in);
if (fp_in.fail()) {
AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon,
"Error",
"Unable to open: " + f);
return;
}
fp_in.read((char *)syx_data, 4104);
processor->importSysex((char *) &syx_data);
presets.clear(NotificationType::dontSendNotification);
for(int i=0;i<processor->getNumPrograms();i++) {
presets.addItem(processor->getProgramName(i), i+1);
}
TRACE("selecting id %d", processor->getCurrentProgram());
presets.setSelectedId(processor->getCurrentProgram()+1, NotificationType::dontSendNotification);
processor->updateHostDisplay();
}
}
// This is our Slider::Listener callback, when the user drags a slider. if (buttonThatWasClicked == loadButton) {
void DexedAudioProcessorEditor::sliderValueChanged (Slider* slider) { FileChooser fc ("Import original DX sysex...", File::nonexistent, "*.syx;*.SYX", 1);
if ( fc.browseForFileToOpen()) {
String f = fc.getResults().getReference(0).getFullPathName();
uint8_t syx_data[4104];
ifstream fp_in;
fp_in.open(f.toRawUTF8(), ifstream::in);
if (fp_in.fail()) {
AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon,
"Error",
"Unable to open: " + f);
return;
}
fp_in.read((char *)syx_data, 4104);
processor->importSysex((char *) &syx_data);
presets.clear(NotificationType::dontSendNotification);
for(int i=0;i<processor->getNumPrograms();i++) {
String id;
id << (i+1) << ". " << processor->getProgramName(i);
presets.addItem(id, i+1);
}
presets.setSelectedId(processor->getCurrentProgram()+1, NotificationType::dontSendNotification);
processor->setCurrentProgram(0);
processor->updateHostDisplay();
}
return;
}
if (buttonThatWasClicked == aboutButton) {
AlertWindow::showMessageBoxAsync(AlertWindow::NoIcon, "DEXED - DX Emulator", "(c) 2013 Pascal Gauthier\nUnder the GPL v2"
"\nBased on Music Synthesizer for Android\n");
return;
}
AlertWindow::showMessageBoxAsync(AlertWindow::WarningIcon, "Sorry", "Soon !");
} }
void DexedAudioProcessorEditor::comboBoxChanged (ComboBox* comboBoxThatHasChanged) { void DexedAudioProcessorEditor::comboBoxChanged (ComboBox* comboBoxThatHasChanged) {
@ -159,16 +182,15 @@ void DexedAudioProcessorEditor::timerCallback() {
return; return;
for(int i=0;i<6;i++) { for(int i=0;i<6;i++) {
ops[i].updateGain(sqrt(env[i]) / 8000); operators[i].updateGain(sqrt(env[5-i]) / 8196);
} }
} }
void DexedAudioProcessorEditor::updateUI() { void DexedAudioProcessorEditor::updateUI() {
TRACE("update UI called");
for(int i=0;i<processor->ctrl.size();i++) { for(int i=0;i<processor->ctrl.size();i++) {
processor->ctrl[i]->updateComponent(); processor->ctrl[i]->updateComponent();
} }
for(int i=0;i<6;i++) { for(int i=0;i<6;i++) {
ops[i].updateFreqDisplay(); operators[i].updateDisplay();
} }
} }

@ -32,35 +32,36 @@
*/ */
class DexedAudioProcessorEditor : public AudioProcessorEditor, class DexedAudioProcessorEditor : public AudioProcessorEditor,
public ButtonListener, public ButtonListener,
public SliderListener,
public ComboBoxListener, public ComboBoxListener,
public Timer { public Timer {
DexedAudioProcessor *processor; DexedAudioProcessor *processor;
ComboBox presets; ComboBox presets;
MidiKeyboardComponent midiKeyboard; MidiKeyboardComponent midiKeyboard;
DXLookNFeel dx_lnf; DXLookNFeel dx_lnf;
ScopedPointer<TextButton> loadButton;
ScopedPointer<TextButton> saveButton;
ScopedPointer<TextButton> storeButton;
ScopedPointer<TextButton> aboutButton;
public: public:
DexedAudioProcessorEditor (DexedAudioProcessor* ownerFilter); DexedAudioProcessorEditor (DexedAudioProcessor* ownerFilter);
~DexedAudioProcessorEditor(); ~DexedAudioProcessorEditor();
ScopedPointer<TextButton> textButton;
ScopedPointer<Slider> algo;
void timerCallback(); void timerCallback();
//============================================================================== //==============================================================================
// This is just a standard Juce paint method... // This is just a standard Juce paint method...
void paint (Graphics& g); void paint (Graphics& g);
void buttonClicked (Button* buttonThatWasClicked); void buttonClicked (Button* buttonThatWasClicked);
void sliderValueChanged (Slider*) override;
void comboBoxChanged (ComboBox* comboBoxThatHasChanged); void comboBoxChanged (ComboBox* comboBoxThatHasChanged);
OperatorEditor ops[6]; OperatorEditor operators[6];
GlobalEditor global; GlobalEditor global;
void updateUI(); void updateUI();
Image cachedImage_background_png;
}; };

@ -68,7 +68,7 @@ void Ctrl::unbind() {
// ************************************************************************ // ************************************************************************
// CtrlInt ================================================================ // CtrlInt ================================================================
CtrlInt::CtrlInt(String name, int steps, int offset, bool starts1) : CtrlDX::CtrlDX(String name, int steps, int offset, bool starts1) :
Ctrl(name) { Ctrl(name) {
add1 = starts1 == 1; add1 = starts1 == 1;
this->steps = steps; this->steps = steps;
@ -76,15 +76,15 @@ Ctrl(name) {
dxOffset = offset; dxOffset = offset;
} }
float CtrlInt::getValuePlugin() { float CtrlDX::getValuePlugin() {
return value / steps; return value / steps;
} }
void CtrlInt::setValuePlugin(float f) { void CtrlDX::setValuePlugin(float f) {
setValue((f * steps)); setValue((f * steps));
} }
void CtrlInt::setValue(int v) { void CtrlDX::setValue(int v) {
if ( v >= steps ) { if ( v >= steps ) {
TRACE("WARNING: value too big %s : %d", label.toRawUTF8(), v); TRACE("WARNING: value too big %s : %d", label.toRawUTF8(), v);
v = steps-1; v = steps-1;
@ -96,37 +96,37 @@ void CtrlInt::setValue(int v) {
} }
} }
int CtrlInt::getValue() { int CtrlDX::getValue() {
if ( dxOffset >= 0 ) if ( dxOffset >= 0 )
value = parent->data[dxOffset]; value = parent->data[dxOffset];
return value; return value;
} }
String CtrlInt::getValueDisplay() { String CtrlDX::getValueDisplay() {
String ret; String ret;
ret << getValue(); ret << getValue();
return ret; return ret;
} }
void CtrlInt::publishValue(int value) { void CtrlDX::publishValue(int value) {
parent->beginParameterChangeGesture(idx); parent->beginParameterChangeGesture(idx);
parent->setParameterNotifyingHost(idx, (((float)value) / steps)); parent->setParameterNotifyingHost(idx, (((float)value) / steps));
parent->endParameterChangeGesture(idx); parent->endParameterChangeGesture(idx);
} }
void CtrlInt::sliderValueChanged(Slider* moved) { void CtrlDX::sliderValueChanged(Slider* moved) {
publishValue(((int)moved->getValue() - add1)); publishValue(((int)moved->getValue() - add1));
} }
void CtrlInt::buttonClicked (Button* clicked) { void CtrlDX::buttonClicked (Button* clicked) {
publishValue(clicked->getToggleStateValue() == 1 ? 1 : 0); publishValue(clicked->getToggleStateValue() == 1 ? 1 : 0);
} }
void CtrlInt::comboBoxChanged (ComboBox* combo) { void CtrlDX::comboBoxChanged (ComboBox* combo) {
publishValue(combo->getSelectedId()-1); publishValue(combo->getSelectedId()-1);
} }
void CtrlInt::updateComponent() { void CtrlDX::updateComponent() {
//TRACE("setting for %s %d", label.toRawUTF8(), getValue()); //TRACE("setting for %s %d", label.toRawUTF8(), getValue());
if ( slider != NULL ) { if ( slider != NULL ) {
slider->setValue(getValue() + add1, NotificationType::dontSendNotification); slider->setValue(getValue() + add1, NotificationType::dontSendNotification);
@ -156,69 +156,109 @@ void DexedAudioProcessor::initCtrl() {
// fill operator values; // fill operator values;
for(int i=0;i<6;i++) { for(int i=0;i<6;i++) {
// In the Sysex, OP6 comes first, then OP5... //// In the Sysex, OP6 comes first, then OP5...
int opTarget = (5-i) * 21; //int opTarget = (5-i) * 21;
// In the Sysex, OP6 comes first, then OP5... int opTarget = i * 21;
//int opTarget = i * 21;
int opVal = 5-i; int opVal = 5-i;
String opName;
opName << "OP" << (opVal+1);
for(int j=0;j<4;j++) { for(int j=0;j<4;j++) {
String opRate; String opRate;
opRate << "OP" << (i+1) << "-EGR" << (j+1); opRate << opName << "-EGR" << (j+1);
opCtrl[opVal].egRate[j] = new CtrlInt(opRate, 100, opTarget+j); opCtrl[opVal].egRate[j] = new CtrlDX(opRate, 100, opTarget+j);
ctrl.add(opCtrl[opVal].egRate[j]); ctrl.add(opCtrl[opVal].egRate[j]);
String opLevel; String opLevel;
opLevel << "OP" << (i+1) << "-EGL" << (j+1); opLevel << opName << "-EGL" << (j+1);
opCtrl[opVal].egLevel[j] = new CtrlInt(opLevel, 100, opTarget+j+4); opCtrl[opVal].egLevel[j] = new CtrlDX(opLevel, 100, opTarget+j+4);
ctrl.add(opCtrl[opVal].egLevel[j]); ctrl.add(opCtrl[opVal].egLevel[j]);
} }
String opVol; String opVol;
opVol << "OP" << (i+1) << "-LEVEL"; opVol << opName << "-LEVEL";
opCtrl[opVal].level = new CtrlInt(opVol, 100, opTarget+16); opCtrl[opVal].level = new CtrlDX(opVol, 100, opTarget+16);
ctrl.add(opCtrl[opVal].level); ctrl.add(opCtrl[opVal].level);
String opMode; String opMode;
opMode << "OP" << (i+1) << "-MODE"; opMode << opName << "-MODE";
opCtrl[opVal].opMode = new CtrlInt(opMode, 1, opTarget+17); opCtrl[opVal].opMode = new CtrlDX(opMode, 1, opTarget+17);
ctrl.add(opCtrl[opVal].opMode); ctrl.add(opCtrl[opVal].opMode);
String coarse; String coarse;
coarse << "OP" << (i+1) << "-COARSE"; coarse << opName << "-COARSE";
opCtrl[opVal].coarse = new CtrlInt(coarse, 32, opTarget+18); opCtrl[opVal].coarse = new CtrlDX(coarse, 32, opTarget+18);
ctrl.add(opCtrl[opVal].coarse); ctrl.add(opCtrl[opVal].coarse);
String fine; String fine;
fine << "OP" << (i+1) << "-FINE"; fine << opName << "-FINE";
opCtrl[opVal].fine = new CtrlInt(fine, 100, opTarget+19); opCtrl[opVal].fine = new CtrlDX(fine, 100, opTarget+19);
ctrl.add(opCtrl[opVal].fine); ctrl.add(opCtrl[opVal].fine);
String detune; String detune;
detune << "OP" << (i+1) << "-DETUNE"; detune << opName << "-DETUNE";
opCtrl[opVal].detune = new CtrlInt(detune, 15, opTarget+20); opCtrl[opVal].detune = new CtrlDX(detune, 15, opTarget+20);
ctrl.add(opCtrl[opVal].detune); ctrl.add(opCtrl[opVal].detune);
String sclBrkPt;
sclBrkPt << opName << "-SCL_BRK_PNT";
opCtrl[opVal].sclBrkPt = new CtrlDX(sclBrkPt, 100, opTarget+8);
ctrl.add(opCtrl[opVal].sclBrkPt);
String sclLeftDepth;
sclLeftDepth << opName << "-SCL_LFT_DEPTH";
opCtrl[opVal].sclLeftDepth = new CtrlDX(sclLeftDepth, 100, opTarget+9);
ctrl.add(opCtrl[opVal].sclLeftDepth);
String sclRightDepth;
sclRightDepth << opName << "-SCL_RHT_DEPTH";
opCtrl[opVal].sclRightDepth = new CtrlDX(sclRightDepth, 100, opTarget+10);
ctrl.add(opCtrl[opVal].sclRightDepth);
String sclLeftCurve;
sclLeftCurve << opName << "-SCL_LFT_CURVE";
opCtrl[opVal].sclLeftCurve = new CtrlDX(sclLeftCurve, 4, opTarget+11);
ctrl.add(opCtrl[opVal].sclLeftCurve);
String sclRightCurve;
sclRightCurve << opName << "-SCL_RHT_CURVE";
opCtrl[opVal].sclRightCurve = new CtrlDX(sclRightCurve, 4, opTarget+12);
ctrl.add(opCtrl[opVal].sclRightCurve);
String sclRate;
sclRate << opName << "-SCL_RATE";
opCtrl[opVal].sclRate = new CtrlDX(sclRate, 7, opTarget+13);
ctrl.add(opCtrl[opVal].sclRate);
String ampModSens;
ampModSens << opName << "-AMP_MODSENS";
opCtrl[opVal].ampModSens = new CtrlDX(ampModSens, 3, opTarget+14);
ctrl.add(opCtrl[opVal].ampModSens);
String velModSens;
velModSens << opName << "-VEL_MODSENS";
opCtrl[opVal].velModSens = new CtrlDX(velModSens, 8, opTarget+15);
ctrl.add(opCtrl[opVal].velModSens);
} }
algo = new CtrlInt("Algorithm", 32, 134, true); algo = new CtrlDX("Algorithm", 32, 134, true);
ctrl.add(algo); ctrl.add(algo);
lfoRate = new CtrlInt("LFO-Rate", 100, 137); lfoRate = new CtrlDX("LFO-Rate", 100, 137);
ctrl.add(lfoRate); ctrl.add(lfoRate);
lfoDelay = new CtrlInt("LFO-Delay", 100, 138); lfoDelay = new CtrlDX("LFO-Delay", 100, 138);
ctrl.add(lfoDelay); ctrl.add(lfoDelay);
lfoPitchDepth = new CtrlInt("LFO-PitchDepth", 100, 139); lfoPitchDepth = new CtrlDX("LFO-PitchDepth", 100, 139);
ctrl.add(lfoPitchDepth); ctrl.add(lfoPitchDepth);
lfoAmpDepth = new CtrlInt("LFO-AmpDepth", 100, 140); lfoAmpDepth = new CtrlDX("LFO-AmpDepth", 100, 140);
ctrl.add(lfoAmpDepth); ctrl.add(lfoAmpDepth);
lfoSync = new CtrlInt("LFO-Sync", 2, 141); lfoSync = new CtrlDX("LFO-Sync", 2, 141);
ctrl.add(lfoSync); ctrl.add(lfoSync);
lfoWaveform = new CtrlInt("LFO-Waveform", 5, 142); lfoWaveform = new CtrlDX("LFO-Waveform", 5, 142);
ctrl.add(lfoWaveform); ctrl.add(lfoWaveform);
for(int i=0;i<ctrl.size();i++) { for(int i=0;i<ctrl.size();i++) {
@ -249,7 +289,7 @@ int DexedAudioProcessor::importSysex(const char *imported) {
return 0; return 0;
} }
void DexedAudioProcessor::unpackSysex(int idx) { void DexedAudioProcessor::unpackProgram(int idx) {
char *bulk = sysex + (idx * 128); char *bulk = sysex + (idx * 128);
for (int op = 0; op < 6; op++) { for (int op = 0; op < 6; op++) {
@ -289,11 +329,21 @@ void DexedAudioProcessor::unpackSysex(int idx) {
} }
void DexedAudioProcessor::updateProgramFromSysex(const uint8 *rawdata) {
}
void DexedAudioProcessor::setDxValue(int offset, int v) { void DexedAudioProcessor::setDxValue(int offset, int v) {
TRACE("setting dx %d %d", offset, v); TRACE("setting dx %d %d", offset, v);
isDirty = true; refreshVoice = true;
if ( offset >= 0 ) if ( offset >= 0 )
data[offset] = v; data[offset] = v;
if ( !sendSysexChange )
return;
uint8 msg[7] = { 0xF0, 0x43, 0x10, offset > 127, 0, (uint8) v, 0xF7 };
msg[4] = offset & 0x7F;
midiOut.addEvent(msg, 7, 0);
} }
void DexedAudioProcessor::unbindUI() { void DexedAudioProcessor::unbindUI() {
@ -316,7 +366,6 @@ void DexedAudioProcessor::setParameter (int index, float newValue) {
} }
int DexedAudioProcessor::getNumPrograms() { int DexedAudioProcessor::getNumPrograms() {
// there is 32 program, the 33th one is a ghost for saving "unsaved" preset.
return 32; return 32;
} }
@ -337,7 +386,7 @@ void DexedAudioProcessor::setCurrentProgram (int index) {
} }
} }
index = index > 31 ? 31 : index; index = index > 31 ? 31 : index;
unpackSysex(index); unpackProgram(index);
currentProgram = index; currentProgram = index;
lfo.reset(data + 137); lfo.reset(data + 137);
updateUI(); updateUI();

@ -38,7 +38,6 @@ public:
String label; String label;
Ctrl(String name); Ctrl(String name);
void bind(Slider *s); void bind(Slider *s);
void bind(Button *b); void bind(Button *b);
void bind(ComboBox *c); void bind(ComboBox *c);
@ -56,15 +55,15 @@ public:
DexedAudioProcessor *parent; DexedAudioProcessor *parent;
}; };
// CtrlInt // CtrlDX is a controller that is related to DX parameters
class CtrlInt : public Ctrl { class CtrlDX : public Ctrl {
int value; int value;
int steps; int steps;
int add1; int add1;
int dxOffset; int dxOffset;
public: public:
CtrlInt(String name, int steps, int offset = -1, bool starts1 = false); CtrlDX(String name, int steps, int offset = -1, bool starts1 = false);
void setValuePlugin(float f); void setValuePlugin(float f);
float getValuePlugin(); float getValuePlugin();
void publishValue(int value); void publishValue(int value);
@ -80,15 +79,21 @@ public:
struct OperatorCtrl { struct OperatorCtrl {
ScopedPointer<CtrlInt> egRate[4]; ScopedPointer<CtrlDX> egRate[4];
ScopedPointer<CtrlInt> egLevel[4]; ScopedPointer<CtrlDX> egLevel[4];
ScopedPointer<CtrlInt> level; ScopedPointer<CtrlDX> level;
ScopedPointer<CtrlInt> opMode; ScopedPointer<CtrlDX> opMode;
ScopedPointer<CtrlInt> coarse; ScopedPointer<CtrlDX> coarse;
ScopedPointer<CtrlInt> fine; ScopedPointer<CtrlDX> fine;
ScopedPointer<CtrlInt> detune; ScopedPointer<CtrlDX> detune;
ScopedPointer<CtrlDX> sclBrkPt;
ScopedPointer<CtrlDX> sclLeftDepth;
ScopedPointer<CtrlDX> sclRightDepth;
ScopedPointer<CtrlDX> sclLeftCurve;
ScopedPointer<CtrlDX> sclRightCurve;
ScopedPointer<CtrlDX> sclRate;
ScopedPointer<CtrlDX> ampModSens;
ScopedPointer<CtrlDX> velModSens;
}; };
#endif // PLUGINPARAM_H_INCLUDED #endif // PLUGINPARAM_H_INCLUDED

@ -94,13 +94,13 @@ void DexedAudioProcessor::releaseResources() {
void DexedAudioProcessor::processBlock(AudioSampleBuffer& buffer, MidiBuffer& midiMessages) { void DexedAudioProcessor::processBlock(AudioSampleBuffer& buffer, MidiBuffer& midiMessages) {
int numSamples = buffer.getNumSamples(); int numSamples = buffer.getNumSamples();
if ( isDirty ) { if ( refreshVoice ) {
for(int i=0;i<MAX_ACTIVE_NOTES;i++) { for(int i=0;i<MAX_ACTIVE_NOTES;i++) {
if ( voices[i].live ) if ( voices[i].live )
voices[i].dx7_note->update(data, voices[i].midi_note); voices[i].dx7_note->update(data, voices[i].midi_note);
} }
lfo.reset(data + 137); lfo.reset(data + 137);
isDirty = false; refreshVoice = false;
} }
// check buffer size // check buffer size
@ -120,8 +120,9 @@ void DexedAudioProcessor::processBlock(AudioSampleBuffer& buffer, MidiBuffer& mi
int pos; int pos;
while(it.getNextEvent(msg, pos)) { while(it.getNextEvent(msg, pos)) {
processMidiMessage(msg.getRawData(), msg.getRawDataSize()); processMidiMessage(&msg);
} }
midiMessages.clear();
processSamples(numSamples, workBlock); processSamples(numSamples, workBlock);
float *channelData = buffer.getSampleData(0); float *channelData = buffer.getSampleData(0);
@ -143,6 +144,10 @@ void DexedAudioProcessor::processBlock(AudioSampleBuffer& buffer, MidiBuffer& mi
for (int i = getNumInputChannels(); i < getNumOutputChannels(); ++i) { for (int i = getNumInputChannels(); i < getNumOutputChannels(); ++i) {
buffer.clear (i, 0, buffer.getNumSamples()); buffer.clear (i, 0, buffer.getNumSamples());
} }
if ( ! midiOut.isEmpty() ) {
midiMessages.swapWith(midiOut);
}
} }
@ -152,7 +157,31 @@ AudioProcessor* JUCE_CALLTYPE createPluginFilter() {
return new DexedAudioProcessor(); return new DexedAudioProcessor();
} }
void DexedAudioProcessor::processMidiMessage(const uint8_t *buf, int buf_size) { void DexedAudioProcessor::processMidiMessage(MidiMessage *msg) {
if ( msg->isSysEx() ) {
TRACE("SYSEX RECEIVED");
const uint8 *buf = msg->getSysExData();
int sz = msg->getSysExDataSize();
if ( sz < 3 )
return;
// test if it is a Yamaha Sysex
if ( buf[0] != 0x43 )
return;
// single voice dump
if ( buf[2] == 0 ) {
if ( sz < 155 ) {
TRACE("wrong single voice datasize %d", buf[2]);
return;
}
updateProgramFromSysex(buf+5);
}
return;
}
const uint8 *buf = msg->getRawData();
uint8_t cmd = buf[0]; uint8_t cmd = buf[0];
switch(cmd & 0xf0) { switch(cmd & 0xf0) {
@ -358,7 +387,7 @@ bool DexedAudioProcessor::hasEditor() const {
void DexedAudioProcessor::updateUI() { void DexedAudioProcessor::updateUI() {
AudioProcessorEditor *editor = getActiveEditor(); AudioProcessorEditor *editor = getActiveEditor();
if ( editor == NULL ) { if ( editor == NULL ) {
TRACE("no editor found"); TRACE("no editor found!?");
return; return;
} }
DexedAudioProcessorEditor *dexedEditor = (DexedAudioProcessorEditor *) editor; DexedAudioProcessorEditor *dexedEditor = (DexedAudioProcessorEditor *) editor;

@ -51,7 +51,6 @@ class DexedAudioProcessor : public AudioProcessor
// in MIDI units (0x4000 is neutral) // in MIDI units (0x4000 is neutral)
Controllers controllers; Controllers controllers;
bool sustain; bool sustain;
// Extra buffering for when GetSamples wants a buffer not a multiple of N // Extra buffering for when GetSamples wants a buffer not a multiple of N
@ -60,47 +59,51 @@ class DexedAudioProcessor : public AudioProcessor
SInt16 *workBlock; SInt16 *workBlock;
int workBlockSize; int workBlockSize;
int currentProgram; int currentProgram;
char sysex[4096]; char sysex[4096];
char patchNames[32][13]; char patchNames[32][13];
void unpackSysex(int idx);
public : void packProgram(int idx);
bool isDirty; void unpackProgram(int idx);
Array<Ctrl*> ctrl; void updateProgramFromSysex(const uint8 *rawdata);
// PARAMETER CONTAINER /**
OperatorCtrl opCtrl[6]; * This flag is usd in the audio thread to know if the voice has changed
ScopedPointer<CtrlInt> pitchEgRate[4]; * and needs to be updated.
ScopedPointer<CtrlInt> pitchEgLevel[4]; */
bool refreshVoice;
ScopedPointer<CtrlInt> algo; MidiBuffer midiOut;
ScopedPointer<CtrlInt> lfoRate;
ScopedPointer<CtrlInt> lfoDelay; void processMidiMessage(MidiMessage *msg);
ScopedPointer<CtrlInt> lfoAmpDepth; void keydown(uint8_t pitch, uint8_t velo);
ScopedPointer<CtrlInt> lfoPitchDepth; void keyup(uint8_t pitch);
ScopedPointer<CtrlInt> lfoWaveform; void processSamples(int n_samples, int16_t *buffer);
ScopedPointer<CtrlInt> lfoSync;
void initCtrl(); void initCtrl();
int importSysex(const char *imported);
String getPatchName(int idx); public :
void setDxValue(int offset, int v); bool refreshUI;
bool sendSysexChange;
char data[161]; char data[161];
void unbindUI(); Array<Ctrl*> ctrl;
OperatorCtrl opCtrl[6];
ScopedPointer<CtrlDX> pitchEgRate[4];
ScopedPointer<CtrlDX> pitchEgLevel[4];
ScopedPointer<CtrlDX> algo;
ScopedPointer<CtrlDX> lfoRate;
ScopedPointer<CtrlDX> lfoDelay;
ScopedPointer<CtrlDX> lfoAmpDepth;
ScopedPointer<CtrlDX> lfoPitchDepth;
ScopedPointer<CtrlDX> lfoWaveform;
ScopedPointer<CtrlDX> lfoSync;
int importSysex(const char *imported);
void setDxValue(int offset, int v);
void processMidiMessage(const uint8_t *buf, int buf_size);
void keydown(uint8_t pitch, uint8_t velo);
void keyup(uint8_t pitch);
void processSamples(int n_samples, int16_t *buffer);
public:
//============================================================================== //==============================================================================
DexedAudioProcessor(); DexedAudioProcessor();
~DexedAudioProcessor(); ~DexedAudioProcessor();
@ -151,6 +154,7 @@ public:
// this is kept up to date with the midi messages that arrive, and the UI component // 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 // registers with it so it can represent the incoming messages
MidiKeyboardState keyboardState; MidiKeyboardState keyboardState;
void unbindUI();
static void log(const char *source, const char *fmt, ...); static void log(const char *source, const char *fmt, ...);

Loading…
Cancel
Save