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. 4
      Builds/VisualStudio2012/Dexed.vcxproj
  5. 12
      Builds/VisualStudio2012/Dexed.vcxproj.filters
  6. 1
      Dexed.jucer
  7. 181
      JuceLibraryCode/BinaryData.cpp
  8. 3
      JuceLibraryCode/BinaryData.h
  9. 40
      Source/DXLookNFeel.cpp
  10. 16
      Source/DXLookNFeel.h
  11. 71
      Source/GlobalEditor.cpp
  12. 5
      Source/GlobalEditor.h
  13. 285
      Source/OperatorEditor.cpp
  14. 14
      Source/OperatorEditor.h
  15. 156
      Source/PluginEditor.cpp
  16. 17
      Source/PluginEditor.h
  17. 131
      Source/PluginParam.cpp
  18. 31
      Source/PluginParam.h
  19. 39
      Source/PluginProcessor.cpp
  20. 58
      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>

@ -1516,17 +1516,15 @@
<ClInclude Include="..\..\JuceLibraryCode\JuceHeader.h"/> <ClInclude Include="..\..\JuceLibraryCode\JuceHeader.h"/>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="..\..\Resources\background.png"/>
<None Include="..\..\Resources\startup.syx"/> <None Include="..\..\Resources\startup.syx"/>
<None Include="..\..\..\JUCE\modules\juce_audio_basics\juce_module_info"/> <None Include="..\..\..\JUCE\modules\juce_audio_basics\juce_module_info"/>
<None Include="..\..\..\JUCE\modules\juce_audio_plugin_client\juce_module_info"/> <None Include="..\..\..\JUCE\modules\juce_audio_plugin_client\juce_module_info"/>
<None Include="..\..\..\JUCE\modules\juce_audio_processors\juce_module_info"/> <None Include="..\..\..\JUCE\modules\juce_audio_processors\juce_module_info"/>
<None Include="..\..\..\JUCE\modules\juce_audio_utils\juce_module_info"/> <None Include="..\..\..\JUCE\modules\juce_audio_utils\juce_module_info"/>
<None Include="..\..\JuceLibraryCode\modules\juce_core\zip\.DS_Store"/>
<None Include="..\..\JuceLibraryCode\modules\juce_core\native\.DS_Store"/>
<None Include="..\..\..\JUCE\modules\juce_core\juce_module_info"/> <None Include="..\..\..\JUCE\modules\juce_core\juce_module_info"/>
<None Include="..\..\..\JUCE\modules\juce_data_structures\juce_module_info"/> <None Include="..\..\..\JUCE\modules\juce_data_structures\juce_module_info"/>
<None Include="..\..\..\JUCE\modules\juce_events\juce_module_info"/> <None Include="..\..\..\JUCE\modules\juce_events\juce_module_info"/>
<None Include="..\..\JuceLibraryCode\modules\juce_graphics\image_formats\.DS_Store"/>
<None Include="..\..\..\JUCE\modules\juce_graphics\juce_module_info"/> <None Include="..\..\..\JUCE\modules\juce_graphics\juce_module_info"/>
<None Include="..\..\..\JUCE\modules\juce_gui_basics\juce_module_info"/> <None Include="..\..\..\JUCE\modules\juce_gui_basics\juce_module_info"/>
<None Include="..\..\..\JUCE\modules\juce_gui_extra\juce_module_info"/> <None Include="..\..\..\JUCE\modules\juce_gui_extra\juce_module_info"/>

@ -2594,6 +2594,9 @@
</ClInclude> </ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="..\..\Resources\background.png">
<Filter>Dexed\Resources</Filter>
</None>
<None Include="..\..\Resources\startup.syx"> <None Include="..\..\Resources\startup.syx">
<Filter>Dexed\Resources</Filter> <Filter>Dexed\Resources</Filter>
</None> </None>
@ -2609,12 +2612,6 @@
<None Include="..\..\..\JUCE\modules\juce_audio_utils\juce_module_info"> <None Include="..\..\..\JUCE\modules\juce_audio_utils\juce_module_info">
<Filter>Juce Modules\juce_audio_utils</Filter> <Filter>Juce Modules\juce_audio_utils</Filter>
</None> </None>
<None Include="..\..\JuceLibraryCode\modules\juce_core\zip\.DS_Store">
<Filter>Juce Modules\juce_core\zip</Filter>
</None>
<None Include="..\..\JuceLibraryCode\modules\juce_core\native\.DS_Store">
<Filter>Juce Modules\juce_core\native</Filter>
</None>
<None Include="..\..\..\JUCE\modules\juce_core\juce_module_info"> <None Include="..\..\..\JUCE\modules\juce_core\juce_module_info">
<Filter>Juce Modules\juce_core</Filter> <Filter>Juce Modules\juce_core</Filter>
</None> </None>
@ -2624,9 +2621,6 @@
<None Include="..\..\..\JUCE\modules\juce_events\juce_module_info"> <None Include="..\..\..\JUCE\modules\juce_events\juce_module_info">
<Filter>Juce Modules\juce_events</Filter> <Filter>Juce Modules\juce_events</Filter>
</None> </None>
<None Include="..\..\JuceLibraryCode\modules\juce_graphics\image_formats\.DS_Store">
<Filter>Juce Modules\juce_graphics\image_formats</Filter>
</None>
<None Include="..\..\..\JUCE\modules\juce_graphics\juce_module_info"> <None Include="..\..\..\JUCE\modules\juce_graphics\juce_module_info">
<Filter>Juce Modules\juce_graphics</Filter> <Filter>Juce Modules\juce_graphics</Filter>
</None> </None>

@ -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;
void processMidiMessage(const uint8_t *buf, int buf_size); int importSysex(const char *imported);
void keydown(uint8_t pitch, uint8_t velo); void setDxValue(int offset, int v);
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