1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-10 23:44:24 +00:00

BLOCKS: Updated and cleaned up the BlocksDrawing example

This commit is contained in:
ed 2017-06-12 16:34:16 +01:00
parent 15cc2bbc7f
commit 9796746756
11 changed files with 505 additions and 395 deletions

View file

@ -8,8 +8,10 @@
<GROUP id="{092A4D5B-31E2-5D03-9B41-81C10EC447E8}" name="Source">
<FILE id="qnbQP7" name="LightpadComponent.h" compile="0" resource="0"
file="Source/LightpadComponent.h"/>
<FILE id="yiP4mu" name="MainComponent.h" compile="0" resource="0" file="Source/MainComponent.h"/>
<FILE id="RyfWDq" name="Main.cpp" compile="1" resource="0" file="Source/Main.cpp"/>
<FILE id="RVdh1i" name="MainComponent.cpp" compile="1" resource="0"
file="Source/MainComponent.cpp"/>
<FILE id="yiP4mu" name="MainComponent.h" compile="0" resource="0" file="Source/MainComponent.h"/>
</GROUP>
</MAINGROUP>
<EXPORTFORMATS>

View file

@ -67,6 +67,7 @@ endif
OBJECTS_APP := \
$(JUCE_OBJDIR)/Main_90ebc5c2.o \
$(JUCE_OBJDIR)/MainComponent_a6ffb4a5.o \
$(JUCE_OBJDIR)/include_juce_audio_basics_8a4e984a.o \
$(JUCE_OBJDIR)/include_juce_audio_devices_63111d02.o \
$(JUCE_OBJDIR)/include_juce_audio_formats_15f82001.o \
@ -83,6 +84,8 @@ OBJECTS_APP := \
.PHONY: clean all
all : $(JUCE_OUTDIR)/$(JUCE_TARGET_APP)
$(JUCE_OUTDIR)/$(JUCE_TARGET_APP) : check-pkg-config $(OBJECTS_APP) $(RESOURCES)
@echo Linking "BlocksDrawing - App"
-$(V_AT)mkdir -p $(JUCE_BINDIR)
@ -95,6 +98,11 @@ $(JUCE_OBJDIR)/Main_90ebc5c2.o: ../../Source/Main.cpp
@echo "Compiling Main.cpp"
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
$(JUCE_OBJDIR)/MainComponent_a6ffb4a5.o: ../../Source/MainComponent.cpp
-$(V_AT)mkdir -p $(JUCE_OBJDIR)
@echo "Compiling MainComponent.cpp"
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
$(JUCE_OBJDIR)/include_juce_audio_basics_8a4e984a.o: ../../JuceLibraryCode/include_juce_audio_basics.cpp
-$(V_AT)mkdir -p $(JUCE_OBJDIR)
@echo "Compiling include_juce_audio_basics.cpp"

View file

@ -20,6 +20,7 @@
C5B65EEA10D40B2770FE8937 = {isa = PBXBuildFile; fileRef = ABA9D69C67D0234528DEB39B; };
19DBB78B919C4774330FCED5 = {isa = PBXBuildFile; fileRef = BA174BBB2231F7A8D1621BE9; };
F1C1D8F4BDE85067F5E61D08 = {isa = PBXBuildFile; fileRef = 49F51637C89080A76F65E9F7; };
D354A0AD7CBDBDD1D8132ECC = {isa = PBXBuildFile; fileRef = 3A534A7474110674C69C1FC9; };
F3102423A2C8D91FE1D9B41E = {isa = PBXBuildFile; fileRef = B0CCD8CF994F3F797BB6D208; };
853E27BAF3F496A77507B0F3 = {isa = PBXBuildFile; fileRef = C80A487F061CBA873D8E3F10; };
8BB421F938D69A28CEC1DE59 = {isa = PBXBuildFile; fileRef = EDC56FC7BB77C81B88EABC68; };
@ -41,6 +42,7 @@
2AF21CDE4EFD3BBA599DE77E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_extra.mm"; path = "../../JuceLibraryCode/include_juce_gui_extra.mm"; sourceTree = "SOURCE_ROOT"; };
2C5EEC55C1DCC5A3372873C8 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; };
38BEC0B6AFAFA022B355CC1B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MainComponent.h; path = ../../Source/MainComponent.h; sourceTree = "SOURCE_ROOT"; };
3A534A7474110674C69C1FC9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MainComponent.cpp; path = ../../Source/MainComponent.cpp; sourceTree = "SOURCE_ROOT"; };
49F51637C89080A76F65E9F7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Main.cpp; path = ../../Source/Main.cpp; sourceTree = "SOURCE_ROOT"; };
4ABD70F1E7F6F48AF857A965 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = "SOURCE_ROOT"; };
574E29C4D824BEE95F94E7D6 = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-App.plist"; path = "Info-App.plist"; sourceTree = "SOURCE_ROOT"; };
@ -80,8 +82,9 @@
F5D89B3EFBF1FF94452EA34D = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_processors"; path = "../../../../../modules/juce_audio_processors"; sourceTree = "SOURCE_ROOT"; };
AA00B6CDF58EE5901BBEF67C = {isa = PBXGroup; children = (
C4BD68C22BCD71B945684B0A,
38BEC0B6AFAFA022B355CC1B,
49F51637C89080A76F65E9F7, ); name = Source; sourceTree = "<group>"; };
49F51637C89080A76F65E9F7,
3A534A7474110674C69C1FC9,
38BEC0B6AFAFA022B355CC1B, ); name = Source; sourceTree = "<group>"; };
9886851267A0D1BF2E10BA86 = {isa = PBXGroup; children = (
AA00B6CDF58EE5901BBEF67C, ); name = BlocksDrawing; sourceTree = "<group>"; };
ACF438DCCC7951F80306FB81 = {isa = PBXGroup; children = (
@ -160,8 +163,9 @@
"JucePlugin_Build_AAX=0",
"JucePlugin_Build_Standalone=0", );
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../../modules", "/juce_audio_plugin_client", "$(inherited)");
HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../../modules", "/Users/ROLIEngineer/Documents/JUCE/modules/juce_audio_plugin_client", "$(inherited)");
INFOPLIST_FILE = Info-App.plist;
INFOPLIST_PREPROCESS = NO;
INSTALL_PATH = "$(HOME)/Applications";
MACOSX_DEPLOYMENT_TARGET = 10.11;
MACOSX_DEPLOYMENT_TARGET_ppc = 10.4;
@ -191,8 +195,9 @@
"JucePlugin_Build_Standalone=0", );
GCC_SYMBOLS_PRIVATE_EXTERN = YES;
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../../modules", "/juce_audio_plugin_client", "$(inherited)");
HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../../modules", "/Users/ROLIEngineer/Documents/JUCE/modules/juce_audio_plugin_client", "$(inherited)");
INFOPLIST_FILE = Info-App.plist;
INFOPLIST_PREPROCESS = NO;
INSTALL_PATH = "$(HOME)/Applications";
MACOSX_DEPLOYMENT_TARGET = 10.11;
MACOSX_DEPLOYMENT_TARGET_ppc = 10.4;
@ -242,6 +247,7 @@
19DBB78B919C4774330FCED5, ); runOnlyForDeploymentPostprocessing = 0; };
6F1EAB6EC19EDAB88EF14DE0 = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
F1C1D8F4BDE85067F5E61D08,
D354A0AD7CBDBDD1D8132ECC,
F3102423A2C8D91FE1D9B41E,
853E27BAF3F496A77507B0F3,
8BB421F938D69A28CEC1DE59,

View file

@ -16,6 +16,7 @@
<PropertyGroup Label="Globals">
<ProjectGuid>{CFD78289-DF68-E998-FA52-BA8B893952D3}</ProjectGuid>
<PlatformToolset>v140</PlatformToolset>
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"
@ -23,6 +24,7 @@
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc>
<PlatformToolset>v140</PlatformToolset>
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"
Label="Configuration">
@ -30,6 +32,7 @@
<UseOfMfc>false</UseOfMfc>
<WholeProgramOptimization>true</WholeProgramOptimization>
<PlatformToolset>v140</PlatformToolset>
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/>
<ImportGroup Label="ExtensionSettings"/>
@ -40,6 +43,7 @@
</ImportGroup>
<PropertyGroup Label="UserMacros">
<PlatformToolset>v140</PlatformToolset>
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
</PropertyGroup>
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
@ -53,6 +57,7 @@
<TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">BlocksDrawing</TargetName>
<GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</GenerateManifest>
<PlatformToolset>v140</PlatformToolset>
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Midl>
@ -140,6 +145,7 @@
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\..\Source\Main.cpp"/>
<ClCompile Include="..\..\Source\MainComponent.cpp"/>
<ClCompile Include="..\..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
@ -1924,6 +1930,7 @@
<ClInclude Include="..\..\..\..\..\modules\juce_audio_utils\players\juce_SoundPlayer.h"/>
<ClInclude Include="..\..\..\..\..\modules\juce_audio_utils\juce_audio_utils.h"/>
<ClInclude Include="..\..\..\..\..\modules\juce_blocks_basics\blocks\juce_Block.h"/>
<ClInclude Include="..\..\..\..\..\modules\juce_blocks_basics\blocks\juce_BlockConfigManager.h"/>
<ClInclude Include="..\..\..\..\..\modules\juce_blocks_basics\blocks\juce_ControlButton.h"/>
<ClInclude Include="..\..\..\..\..\modules\juce_blocks_basics\blocks\juce_LEDGrid.h"/>
<ClInclude Include="..\..\..\..\..\modules\juce_blocks_basics\blocks\juce_LEDRow.h"/>

View file

@ -370,6 +370,9 @@
<ClCompile Include="..\..\Source\Main.cpp">
<Filter>BlocksDrawing\Source</Filter>
</ClCompile>
<ClCompile Include="..\..\Source\MainComponent.cpp">
<Filter>BlocksDrawing\Source</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.cpp">
<Filter>Juce Modules\juce_audio_basics\buffers</Filter>
</ClCompile>
@ -2679,6 +2682,9 @@
<ClInclude Include="..\..\..\..\..\modules\juce_blocks_basics\blocks\juce_Block.h">
<Filter>Juce Modules\juce_blocks_basics\blocks</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\..\modules\juce_blocks_basics\blocks\juce_BlockConfigManager.h">
<Filter>Juce Modules\juce_blocks_basics\blocks</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\..\modules\juce_blocks_basics\blocks\juce_ControlButton.h">
<Filter>Juce Modules\juce_blocks_basics\blocks</Filter>
</ClInclude>

View file

@ -16,6 +16,7 @@
<PropertyGroup Label="Globals">
<ProjectGuid>{CFD78289-DF68-E998-FA52-BA8B893952D3}</ProjectGuid>
<PlatformToolset>v141</PlatformToolset>
<WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"
@ -24,6 +25,7 @@
<UseOfMfc>false</UseOfMfc>
<PlatformToolset>v141</PlatformToolset>
<PlatformToolset>v141</PlatformToolset>
<WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"
Label="Configuration">
@ -32,6 +34,7 @@
<WholeProgramOptimization>true</WholeProgramOptimization>
<PlatformToolset>v141</PlatformToolset>
<PlatformToolset>v141</PlatformToolset>
<WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/>
<ImportGroup Label="ExtensionSettings"/>
@ -42,6 +45,7 @@
</ImportGroup>
<PropertyGroup Label="UserMacros">
<PlatformToolset>v141</PlatformToolset>
<WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
@ -55,6 +59,7 @@
<TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">BlocksDrawing</TargetName>
<GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</GenerateManifest>
<PlatformToolset>v141</PlatformToolset>
<WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Midl>
@ -139,6 +144,7 @@
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\..\Source\Main.cpp"/>
<ClCompile Include="..\..\Source\MainComponent.cpp"/>
<ClCompile Include="..\..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
@ -1923,6 +1929,7 @@
<ClInclude Include="..\..\..\..\..\modules\juce_audio_utils\players\juce_SoundPlayer.h"/>
<ClInclude Include="..\..\..\..\..\modules\juce_audio_utils\juce_audio_utils.h"/>
<ClInclude Include="..\..\..\..\..\modules\juce_blocks_basics\blocks\juce_Block.h"/>
<ClInclude Include="..\..\..\..\..\modules\juce_blocks_basics\blocks\juce_BlockConfigManager.h"/>
<ClInclude Include="..\..\..\..\..\modules\juce_blocks_basics\blocks\juce_ControlButton.h"/>
<ClInclude Include="..\..\..\..\..\modules\juce_blocks_basics\blocks\juce_LEDGrid.h"/>
<ClInclude Include="..\..\..\..\..\modules\juce_blocks_basics\blocks\juce_LEDRow.h"/>

View file

@ -370,6 +370,9 @@
<ClCompile Include="..\..\Source\Main.cpp">
<Filter>BlocksDrawing\Source</Filter>
</ClCompile>
<ClCompile Include="..\..\Source\MainComponent.cpp">
<Filter>BlocksDrawing\Source</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.cpp">
<Filter>Juce Modules\juce_audio_basics\buffers</Filter>
</ClCompile>
@ -2679,6 +2682,9 @@
<ClInclude Include="..\..\..\..\..\modules\juce_blocks_basics\blocks\juce_Block.h">
<Filter>Juce Modules\juce_blocks_basics\blocks</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\..\modules\juce_blocks_basics\blocks\juce_BlockConfigManager.h">
<Filter>Juce Modules\juce_blocks_basics\blocks</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\..\modules\juce_blocks_basics\blocks\juce_ControlButton.h">
<Filter>Juce Modules\juce_blocks_basics\blocks</Filter>
</ClInclude>

View file

@ -22,6 +22,7 @@
7292839DA84380BAA0F12E31 = {isa = PBXBuildFile; fileRef = 4DCF6F0AB88DA09CE8F97DD4; };
2A5E87443C41335CD944ACB8 = {isa = PBXBuildFile; fileRef = 4FE119D4AAC2809C3D698315; };
F1C1D8F4BDE85067F5E61D08 = {isa = PBXBuildFile; fileRef = 49F51637C89080A76F65E9F7; };
D354A0AD7CBDBDD1D8132ECC = {isa = PBXBuildFile; fileRef = 3A534A7474110674C69C1FC9; };
F3102423A2C8D91FE1D9B41E = {isa = PBXBuildFile; fileRef = B0CCD8CF994F3F797BB6D208; };
853E27BAF3F496A77507B0F3 = {isa = PBXBuildFile; fileRef = C80A487F061CBA873D8E3F10; };
8BB421F938D69A28CEC1DE59 = {isa = PBXBuildFile; fileRef = EDC56FC7BB77C81B88EABC68; };
@ -43,6 +44,7 @@
2AF21CDE4EFD3BBA599DE77E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "include_juce_gui_extra.mm"; path = "../../JuceLibraryCode/include_juce_gui_extra.mm"; sourceTree = "SOURCE_ROOT"; };
2C5EEC55C1DCC5A3372873C8 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; };
38BEC0B6AFAFA022B355CC1B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MainComponent.h; path = ../../Source/MainComponent.h; sourceTree = "SOURCE_ROOT"; };
3A534A7474110674C69C1FC9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MainComponent.cpp; path = ../../Source/MainComponent.cpp; sourceTree = "SOURCE_ROOT"; };
485A0E39984AC8CD2F98B50C = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreImage.framework; path = System/Library/Frameworks/CoreImage.framework; sourceTree = SDKROOT; };
49F51637C89080A76F65E9F7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Main.cpp; path = ../../Source/Main.cpp; sourceTree = "SOURCE_ROOT"; };
4ABD70F1E7F6F48AF857A965 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppConfig.h; path = ../../JuceLibraryCode/AppConfig.h; sourceTree = "SOURCE_ROOT"; };
@ -84,8 +86,9 @@
F5D89B3EFBF1FF94452EA34D = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_audio_processors"; path = "../../../../../modules/juce_audio_processors"; sourceTree = "SOURCE_ROOT"; };
AA00B6CDF58EE5901BBEF67C = {isa = PBXGroup; children = (
C4BD68C22BCD71B945684B0A,
38BEC0B6AFAFA022B355CC1B,
49F51637C89080A76F65E9F7, ); name = Source; sourceTree = "<group>"; };
49F51637C89080A76F65E9F7,
3A534A7474110674C69C1FC9,
38BEC0B6AFAFA022B355CC1B, ); name = Source; sourceTree = "<group>"; };
9886851267A0D1BF2E10BA86 = {isa = PBXGroup; children = (
AA00B6CDF58EE5901BBEF67C, ); name = BlocksDrawing; sourceTree = "<group>"; };
ACF438DCCC7951F80306FB81 = {isa = PBXGroup; children = (
@ -168,8 +171,9 @@
"JucePlugin_Build_AAX=0",
"JucePlugin_Build_Standalone=0", );
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../../modules", "/juce_audio_plugin_client", "$(inherited)");
HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../../modules", "/Users/ROLIEngineer/Documents/JUCE/modules/juce_audio_plugin_client", "$(inherited)");
INFOPLIST_FILE = Info-App.plist;
INFOPLIST_PREPROCESS = NO;
INSTALL_PATH = "$(HOME)/Applications";
PRODUCT_BUNDLE_IDENTIFIER = com.yourcompany.BlocksDrawing;
USE_HEADERMAP = NO; }; name = Debug; };
@ -198,8 +202,9 @@
"JucePlugin_Build_Standalone=0", );
GCC_SYMBOLS_PRIVATE_EXTERN = YES;
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../../modules", "/juce_audio_plugin_client", "$(inherited)");
HEADER_SEARCH_PATHS = ("../../JuceLibraryCode", "../../../../../modules", "/Users/ROLIEngineer/Documents/JUCE/modules/juce_audio_plugin_client", "$(inherited)");
INFOPLIST_FILE = Info-App.plist;
INFOPLIST_PREPROCESS = NO;
INSTALL_PATH = "$(HOME)/Applications";
PRODUCT_BUNDLE_IDENTIFIER = com.yourcompany.BlocksDrawing;
USE_HEADERMAP = NO; }; name = Release; };
@ -254,6 +259,7 @@
2A5E87443C41335CD944ACB8, ); runOnlyForDeploymentPostprocessing = 0; };
6F1EAB6EC19EDAB88EF14DE0 = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (
F1C1D8F4BDE85067F5E61D08,
D354A0AD7CBDBDD1D8132ECC,
F3102423A2C8D91FE1D9B41E,
853E27BAF3F496A77507B0F3,
8BB421F938D69A28CEC1DE59,

View file

@ -62,167 +62,167 @@
// juce_audio_devices flags:
#ifndef JUCE_ASIO
//#define JUCE_ASIO
//#define JUCE_ASIO 1
#endif
#ifndef JUCE_WASAPI
//#define JUCE_WASAPI
//#define JUCE_WASAPI 1
#endif
#ifndef JUCE_WASAPI_EXCLUSIVE
//#define JUCE_WASAPI_EXCLUSIVE
//#define JUCE_WASAPI_EXCLUSIVE 1
#endif
#ifndef JUCE_DIRECTSOUND
//#define JUCE_DIRECTSOUND
//#define JUCE_DIRECTSOUND 1
#endif
#ifndef JUCE_ALSA
//#define JUCE_ALSA
//#define JUCE_ALSA 1
#endif
#ifndef JUCE_JACK
//#define JUCE_JACK
//#define JUCE_JACK 1
#endif
#ifndef JUCE_USE_ANDROID_OPENSLES
//#define JUCE_USE_ANDROID_OPENSLES
//#define JUCE_USE_ANDROID_OPENSLES 1
#endif
#ifndef JUCE_USE_WINRT_MIDI
//#define JUCE_USE_WINRT_MIDI
//#define JUCE_USE_WINRT_MIDI 1
#endif
//==============================================================================
// juce_audio_formats flags:
#ifndef JUCE_USE_FLAC
//#define JUCE_USE_FLAC
//#define JUCE_USE_FLAC 1
#endif
#ifndef JUCE_USE_OGGVORBIS
//#define JUCE_USE_OGGVORBIS
//#define JUCE_USE_OGGVORBIS 1
#endif
#ifndef JUCE_USE_MP3AUDIOFORMAT
//#define JUCE_USE_MP3AUDIOFORMAT
//#define JUCE_USE_MP3AUDIOFORMAT 1
#endif
#ifndef JUCE_USE_LAME_AUDIO_FORMAT
//#define JUCE_USE_LAME_AUDIO_FORMAT
//#define JUCE_USE_LAME_AUDIO_FORMAT 1
#endif
#ifndef JUCE_USE_WINDOWS_MEDIA_FORMAT
//#define JUCE_USE_WINDOWS_MEDIA_FORMAT
//#define JUCE_USE_WINDOWS_MEDIA_FORMAT 1
#endif
//==============================================================================
// juce_audio_processors flags:
#ifndef JUCE_PLUGINHOST_VST
//#define JUCE_PLUGINHOST_VST
//#define JUCE_PLUGINHOST_VST 1
#endif
#ifndef JUCE_PLUGINHOST_VST3
//#define JUCE_PLUGINHOST_VST3
//#define JUCE_PLUGINHOST_VST3 1
#endif
#ifndef JUCE_PLUGINHOST_AU
//#define JUCE_PLUGINHOST_AU
//#define JUCE_PLUGINHOST_AU 1
#endif
//==============================================================================
// juce_audio_utils flags:
#ifndef JUCE_USE_CDREADER
//#define JUCE_USE_CDREADER
//#define JUCE_USE_CDREADER 1
#endif
#ifndef JUCE_USE_CDBURNER
//#define JUCE_USE_CDBURNER
//#define JUCE_USE_CDBURNER 1
#endif
//==============================================================================
// juce_core flags:
#ifndef JUCE_FORCE_DEBUG
//#define JUCE_FORCE_DEBUG
//#define JUCE_FORCE_DEBUG 1
#endif
#ifndef JUCE_LOG_ASSERTIONS
//#define JUCE_LOG_ASSERTIONS
//#define JUCE_LOG_ASSERTIONS 1
#endif
#ifndef JUCE_CHECK_MEMORY_LEAKS
//#define JUCE_CHECK_MEMORY_LEAKS
//#define JUCE_CHECK_MEMORY_LEAKS 1
#endif
#ifndef JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES
//#define JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES
//#define JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES 1
#endif
#ifndef JUCE_INCLUDE_ZLIB_CODE
//#define JUCE_INCLUDE_ZLIB_CODE
//#define JUCE_INCLUDE_ZLIB_CODE 1
#endif
#ifndef JUCE_USE_CURL
//#define JUCE_USE_CURL
//#define JUCE_USE_CURL 1
#endif
#ifndef JUCE_CATCH_UNHANDLED_EXCEPTIONS
//#define JUCE_CATCH_UNHANDLED_EXCEPTIONS
//#define JUCE_CATCH_UNHANDLED_EXCEPTIONS 1
#endif
#ifndef JUCE_ALLOW_STATIC_NULL_VARIABLES
//#define JUCE_ALLOW_STATIC_NULL_VARIABLES
//#define JUCE_ALLOW_STATIC_NULL_VARIABLES 1
#endif
//==============================================================================
// juce_events flags:
#ifndef JUCE_EXECUTE_APP_SUSPEND_ON_IOS_BACKGROUND_TASK
//#define JUCE_EXECUTE_APP_SUSPEND_ON_IOS_BACKGROUND_TASK
//#define JUCE_EXECUTE_APP_SUSPEND_ON_IOS_BACKGROUND_TASK 1
#endif
//==============================================================================
// juce_graphics flags:
#ifndef JUCE_USE_COREIMAGE_LOADER
//#define JUCE_USE_COREIMAGE_LOADER
//#define JUCE_USE_COREIMAGE_LOADER 1
#endif
#ifndef JUCE_USE_DIRECTWRITE
//#define JUCE_USE_DIRECTWRITE
//#define JUCE_USE_DIRECTWRITE 1
#endif
//==============================================================================
// juce_gui_basics flags:
#ifndef JUCE_ENABLE_REPAINT_DEBUGGING
//#define JUCE_ENABLE_REPAINT_DEBUGGING
//#define JUCE_ENABLE_REPAINT_DEBUGGING 1
#endif
#ifndef JUCE_USE_XSHM
//#define JUCE_USE_XSHM
//#define JUCE_USE_XSHM 1
#endif
#ifndef JUCE_USE_XRENDER
//#define JUCE_USE_XRENDER
//#define JUCE_USE_XRENDER 1
#endif
#ifndef JUCE_USE_XCURSOR
//#define JUCE_USE_XCURSOR
//#define JUCE_USE_XCURSOR 1
#endif
//==============================================================================
// juce_gui_extra flags:
#ifndef JUCE_WEB_BROWSER
//#define JUCE_WEB_BROWSER
//#define JUCE_WEB_BROWSER 1
#endif
#ifndef JUCE_ENABLE_LIVE_CONSTANT_EDITOR
//#define JUCE_ENABLE_LIVE_CONSTANT_EDITOR
//#define JUCE_ENABLE_LIVE_CONSTANT_EDITOR 1
#endif
//==============================================================================
#ifndef JUCE_STANDALONE_APPLICATION

View file

@ -0,0 +1,382 @@
/*
==============================================================================
This file is part of the JUCE library.
Copyright (c) 2017 - ROLI Ltd.
JUCE is an open source library subject to commercial or open-source
licensing.
By using JUCE, you agree to the terms of both the JUCE 5 End-User License
Agreement and JUCE 5 Privacy Policy (both updated and effective as of the
27th April 2017).
End User License Agreement: www.juce.com/juce-5-licence
Privacy Policy: www.juce.com/juce-5-privacy-policy
Or: You may also use this code under the terms of the GPL v3 (see
www.gnu.org/licenses).
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
==============================================================================
*/
#include "MainComponent.h"
MainComponent::MainComponent()
{
activeLeds.clear();
// Register MainContentComponent as a listener to the PhysicalTopologySource object
topologySource.addListener (this);
infoLabel.setText ("Connect a Lightpad Block to draw.", dontSendNotification);
infoLabel.setJustificationType (Justification::centred);
addAndMakeVisible (infoLabel);
addAndMakeVisible (lightpadComponent);
lightpadComponent.setVisible (false);
lightpadComponent.addListener (this);
clearButton.setButtonText ("Clear");
clearButton.addListener (this);
clearButton.setAlwaysOnTop (true);
addAndMakeVisible (clearButton);
brightnessSlider.setRange (0.0, 1.0);
brightnessSlider.setValue (1.0);
brightnessSlider.setAlwaysOnTop (true);
brightnessSlider.setTextBoxStyle (Slider::TextEntryBoxPosition::NoTextBox, false, 0, 0);
brightnessSlider.addListener (this);
addAndMakeVisible (brightnessSlider);
brightnessLED.setAlwaysOnTop (true);
brightnessLED.setColour (layout.currentColour.withBrightness (static_cast<float> (brightnessSlider.getValue())));
addAndMakeVisible (brightnessLED);
#if JUCE_IOS
connectButton.setButtonText ("Connect");
connectButton.addListener (this);
connectButton.setAlwaysOnTop (true);
addAndMakeVisible (connectButton);
#endif
setSize (600, 600);
}
MainComponent::~MainComponent()
{
if (activeBlock != nullptr)
detachActiveBlock();
lightpadComponent.removeListener (this);
}
void MainComponent::resized()
{
infoLabel.centreWithSize (getWidth(), 100);
Rectangle<int> bounds = getLocalBounds().reduced (20);
// top buttons
Rectangle<int> topButtonArea = bounds.removeFromTop (getHeight() / 20);
topButtonArea.removeFromLeft (20);
clearButton.setBounds (topButtonArea.removeFromLeft (80));
#if JUCE_IOS
topButtonArea.removeFromRight (20);
connectButton.setBounds (topButtonArea.removeFromRight (80));
#endif
bounds.removeFromTop (20);
// brightness controls
Rectangle<int> brightnessControlBounds;
Desktop::DisplayOrientation orientation = Desktop::getInstance().getCurrentOrientation();
if (orientation == Desktop::DisplayOrientation::upright
|| orientation == Desktop::DisplayOrientation::upsideDown)
{
brightnessControlBounds = bounds.removeFromBottom (getHeight() / 10);
brightnessSlider.setSliderStyle (Slider::SliderStyle::LinearHorizontal);
brightnessLED.setBounds (brightnessControlBounds.removeFromLeft (getHeight() / 10));
brightnessSlider.setBounds (brightnessControlBounds);
}
else
{
brightnessControlBounds = bounds.removeFromRight (getWidth() / 10);
brightnessSlider.setSliderStyle (Slider::SliderStyle::LinearVertical);
brightnessLED.setBounds (brightnessControlBounds.removeFromTop (getWidth() / 10));
brightnessSlider.setBounds (brightnessControlBounds);
}
// lightpad component
int sideLength = jmin (bounds.getWidth() - 40, bounds.getHeight() - 40);
lightpadComponent.centreWithSize (sideLength, sideLength);
}
void MainComponent::topologyChanged()
{
lightpadComponent.setVisible (false);
infoLabel.setVisible (true);
// Reset the activeBlock object
if (activeBlock != nullptr)
detachActiveBlock();
// Get the array of currently connected Block objects from the PhysicalTopologySource
Block::Array blocks = topologySource.getCurrentTopology().blocks;
// Iterate over the array of Block objects
for (auto b : blocks)
{
// Find the first Lightpad
if (b->getType() == Block::Type::lightPadBlock)
{
activeBlock = b;
// Register MainContentComponent as a listener to the touch surface
if (auto surface = activeBlock->getTouchSurface())
surface->addListener (this);
// Register MainContentComponent as a listener to any buttons
for (auto button : activeBlock->getButtons())
button->addListener (this);
// Get the LEDGrid object from the Lightpad and set its program to the program for the current mode
if (auto grid = activeBlock->getLEDGrid())
{
// Work out scale factors to translate X and Y touches to LED indexes
scaleX = (float) (grid->getNumColumns()) / activeBlock->getWidth();
scaleY = (float) (grid->getNumRows()) / activeBlock->getHeight();
setLEDProgram (*activeBlock);
}
// Make the on screen Lighpad component visible
lightpadComponent.setVisible (true);
infoLabel.setVisible (false);
break;
}
}
}
//==============================================================================
void MainComponent::touchChanged (TouchSurface&, const TouchSurface::Touch& touch)
{
// Translate X and Y touch events to LED indexes
int xLed = roundToInt (touch.x * scaleX);
int yLed = roundToInt (touch.y * scaleY);
if (currentMode == colourPalette)
{
if (layout.setActiveColourForTouch (xLed, yLed))
{
if (auto* colourPaletteProgram = getPaletteProgram())
{
colourPaletteProgram->setGridFills (layout.numColumns, layout.numRows, layout.gridFillArray);
brightnessLED.setColour (layout.currentColour.withBrightness (layout.currentColour == Colours::black ? 0.0f
: static_cast<float> (brightnessSlider.getValue())));
}
}
}
else if (currentMode == canvas)
{
drawLED ((uint32) xLed, (uint32) yLed, touch.z, layout.currentColour);
}
}
void MainComponent::buttonReleased (ControlButton&, Block::Timestamp)
{
if (currentMode == canvas)
{
// Wait 500ms to see if there is a second press
if (! isTimerRunning())
startTimer (500);
else
doublePress = true;
}
else if (currentMode == colourPalette)
{
// Switch to canvas mode and set the LEDGrid program
currentMode = canvas;
setLEDProgram (*activeBlock);
}
}
void MainComponent::buttonClicked (Button* b)
{
#if JUCE_IOS
if (b == &connectButton)
{
BluetoothMidiDevicePairingDialogue::open();
return;
}
#else
ignoreUnused (b);
#endif
clearLEDs();
}
void MainComponent::sliderValueChanged (Slider* s)
{
if (s == &brightnessSlider)
brightnessLED.setColour (layout.currentColour.withBrightness (layout.currentColour == Colours::black ? 0.0f
: static_cast<float> (brightnessSlider.getValue())));
}
void MainComponent::timerCallback()
{
if (doublePress)
{
clearLEDs();
// Reset the doublePress flag
doublePress = false;
}
else
{
// Switch to colour palette mode and set the LEDGrid program
currentMode = colourPalette;
setLEDProgram (*activeBlock);
}
stopTimer();
}
void MainComponent::ledClicked (int x, int y, float z)
{
drawLED ((uint32) x, (uint32) y,
z == 0.0f ? static_cast<float> (brightnessSlider.getValue())
: z * static_cast<float> (brightnessSlider.getValue()), layout.currentColour);
}
void MainComponent::detachActiveBlock()
{
if (auto surface = activeBlock->getTouchSurface())
surface->removeListener (this);
for (auto button : activeBlock->getButtons())
button->removeListener (this);
activeBlock = nullptr;
}
void MainComponent::setLEDProgram (Block& block)
{
if (currentMode == canvas)
{
block.setProgram (new BitmapLEDProgram (block));
// Redraw any previously drawn LEDs
redrawLEDs();
}
else if (currentMode == colourPalette)
{
block.setProgram (new DrumPadGridProgram (block));
// Setup the grid layout
if (auto* program = getPaletteProgram())
program->setGridFills (layout.numColumns, layout.numRows, layout.gridFillArray);
}
}
void MainComponent::clearLEDs()
{
if (auto* canvasProgram = getCanvasProgram())
{
// Clear the LED grid
for (uint32 x = 0; x < 15; ++x)
{
for (uint32 y = 0; y < 15; ++ y)
{
canvasProgram->setLED (x, y, Colours::black);
lightpadComponent.setLEDColour (x, y, Colours::black);
}
}
// Clear the ActiveLED array
activeLeds.clear();
}
}
void MainComponent::drawLED (uint32 x0, uint32 y0, float z, Colour drawColour)
{
if (auto* canvasProgram = getCanvasProgram())
{
// Check if the activeLeds array already contains an ActiveLED object for this LED
auto index = getLEDAt (x0, y0);
// If the colour is black then just set the LED to black and return
if (drawColour == Colours::black)
{
if (index >= 0)
{
canvasProgram->setLED (x0, y0, Colours::black);
lightpadComponent.setLEDColour (x0, y0, Colours::black);
activeLeds.remove (index);
}
return;
}
// If there is no ActiveLED obejct for this LED then create one,
// add it to the array, set the LED on the Block and return
if (index < 0)
{
ActiveLED led;
led.x = x0;
led.y = y0;
led.colour = drawColour;
led.brightness = z;
activeLeds.add (led);
canvasProgram->setLED (led.x, led.y, led.colour.withBrightness (led.brightness));
lightpadComponent.setLEDColour (led.x, led.y, led.colour.withBrightness (led.brightness));
return;
}
// Get the ActiveLED object for this LED
auto currentLed = activeLeds.getReference (index);
// If the LED colour is the same as the draw colour, add the brightnesses together.
// If it is different, blend the colours
if (currentLed.colour == drawColour)
currentLed.brightness = jmin (currentLed.brightness + z, 1.0f);
else
currentLed.colour = currentLed.colour.interpolatedWith (drawColour, z);
// Set the LED on the Block and change the ActiveLED object in the activeLeds array
if (canvasProgram != nullptr)
canvasProgram->setLED (currentLed.x, currentLed.y, currentLed.colour.withBrightness (currentLed.brightness));
lightpadComponent.setLEDColour (currentLed.x, currentLed.y, currentLed.colour.withBrightness (currentLed.brightness));
activeLeds.set (index, currentLed);
}
}
void MainComponent::redrawLEDs()
{
if (auto* canvasProgram = getCanvasProgram())
{
// Iterate over the activeLeds array and set the LEDs on the Block
for (auto led : activeLeds)
{
canvasProgram->setLED (led.x, led.y, led.colour.withBrightness (led.brightness));
lightpadComponent.setLEDColour (led.x, led.y, led.colour.withBrightness (led.brightness));
}
}
}

View file

@ -123,380 +123,64 @@ class MainComponent : public Component,
private Timer
{
public:
MainComponent()
{
activeLeds.clear();
MainComponent();
~MainComponent();
// Register MainContentComponent as a listener to the PhysicalTopologySource object
topologySource.addListener (this);
infoLabel.setText ("Connect a Lightpad Block to draw.", dontSendNotification);
infoLabel.setJustificationType (Justification::centred);
addAndMakeVisible (infoLabel);
addAndMakeVisible (lightpadComponent);
lightpadComponent.setVisible (false);
lightpadComponent.addListener (this);
clearButton.setButtonText ("Clear");
clearButton.addListener (this);
clearButton.setAlwaysOnTop (true);
addAndMakeVisible (clearButton);
brightnessSlider.setRange (0.0, 1.0);
brightnessSlider.setValue (1.0);
brightnessSlider.setAlwaysOnTop (true);
brightnessSlider.setTextBoxStyle (Slider::TextEntryBoxPosition::NoTextBox, false, 0, 0);
brightnessSlider.addListener (this);
addAndMakeVisible (brightnessSlider);
brightnessLED.setAlwaysOnTop (true);
brightnessLED.setColour (layout.currentColour.withBrightness (static_cast<float> (brightnessSlider.getValue())));
addAndMakeVisible (brightnessLED);
#if JUCE_IOS
connectButton.setButtonText ("Connect");
connectButton.addListener (this);
connectButton.setAlwaysOnTop (true);
addAndMakeVisible (connectButton);
#endif
setSize (600, 600);
}
~MainComponent()
{
if (activeBlock != nullptr)
detachActiveBlock();
lightpadComponent.removeListener (this);
}
void paint (Graphics& g) override
{
}
void resized() override
{
infoLabel.centreWithSize (getWidth(), 100);
Rectangle<int> bounds = getLocalBounds().reduced (20);
// top buttons
Rectangle<int> topButtonArea = bounds.removeFromTop (getHeight() / 20);
topButtonArea.removeFromLeft (20);
clearButton.setBounds (topButtonArea.removeFromLeft (80));
#if JUCE_IOS
topButtonArea.removeFromRight (20);
connectButton.setBounds (topButtonArea.removeFromRight (80));
#endif
bounds.removeFromTop (20);
// brightness controls
Rectangle<int> brightnessControlBounds;
Desktop::DisplayOrientation orientation = Desktop::getInstance().getCurrentOrientation();
if (orientation == Desktop::DisplayOrientation::upright || orientation == Desktop::DisplayOrientation::upsideDown)
{
brightnessControlBounds = bounds.removeFromBottom (getHeight() / 10);
brightnessSlider.setSliderStyle (Slider::SliderStyle::LinearHorizontal);
brightnessLED.setBounds (brightnessControlBounds.removeFromLeft (getHeight() / 10));
brightnessSlider.setBounds (brightnessControlBounds);
}
else
{
brightnessControlBounds = bounds.removeFromRight (getWidth() / 10);
brightnessSlider.setSliderStyle (Slider::SliderStyle::LinearVertical);
brightnessLED.setBounds (brightnessControlBounds.removeFromTop (getWidth() / 10));
brightnessSlider.setBounds (brightnessControlBounds);
}
// lightpad component
int sideLength = jmin (bounds.getWidth() - 40, bounds.getHeight() - 40);
lightpadComponent.centreWithSize (sideLength, sideLength);
}
void resized() override;
/** Overridden from TopologySource::Listener. Called when the topology changes */
void topologyChanged() override
{
lightpadComponent.setVisible (false);
infoLabel.setVisible (true);
// Reset the activeBlock object
if (activeBlock != nullptr)
detachActiveBlock();
// Get the array of currently connected Block objects from the PhysicalTopologySource
Block::Array blocks = topologySource.getCurrentTopology().blocks;
// Iterate over the array of Block objects
for (auto b : blocks)
{
// Find the first Lightpad
if (b->getType() == Block::Type::lightPadBlock)
{
activeBlock = b;
// Register MainContentComponent as a listener to the touch surface
if (auto surface = activeBlock->getTouchSurface())
surface->addListener (this);
// Register MainContentComponent as a listener to any buttons
for (auto button : activeBlock->getButtons())
button->addListener (this);
// Get the LEDGrid object from the Lightpad and set its program to the program for the current mode
if (auto grid = activeBlock->getLEDGrid())
{
// Work out scale factors to translate X and Y touches to LED indexes
scaleX = (float) (grid->getNumColumns()) / activeBlock->getWidth();
scaleY = (float) (grid->getNumRows()) / activeBlock->getHeight();
setLEDProgram (*activeBlock);
}
// Make the on screen Lighpad component visible
lightpadComponent.setVisible (true);
infoLabel.setVisible (false);
break;
}
}
}
void topologyChanged() override;
private:
/** Overridden from TouchSurface::Listener. Called when a Touch is received on the Lightpad */
void touchChanged (TouchSurface&, const TouchSurface::Touch& touch) override
{
// Translate X and Y touch events to LED indexes
int xLed = roundToInt (touch.x * scaleX);
int yLed = roundToInt (touch.y * scaleY);
if (currentMode == colourPalette)
{
if (layout.setActiveColourForTouch (xLed, yLed))
{
colourPaletteProgram->setGridFills (layout.numColumns, layout.numRows, layout.gridFillArray);
brightnessLED.setColour (layout.currentColour.withBrightness (layout.currentColour == Colours::black ? 0.0f
: static_cast<float> (brightnessSlider.getValue())));
}
}
else if (currentMode == canvas)
{
drawLED ((uint32) xLed, (uint32) yLed, touch.z, layout.currentColour);
}
}
void touchChanged (TouchSurface&, const TouchSurface::Touch&) override;
/** Overridden from ControlButton::Listener. Called when a button on the Lightpad is pressed */
void buttonPressed (ControlButton&, Block::Timestamp) override { }
/** Overridden from ControlButton::Listener. Called when a button on the Lightpad is released */
void buttonReleased (ControlButton&, Block::Timestamp) override
{
if (currentMode == canvas)
{
// Wait 500ms to see if there is a second press
if (! isTimerRunning())
startTimer (500);
else
doublePress = true;
}
else if (currentMode == colourPalette)
{
// Switch to canvas mode and set the LEDGrid program
currentMode = canvas;
setLEDProgram (*activeBlock);
}
}
void buttonReleased (ControlButton&, Block::Timestamp) override;
void buttonClicked (Button* b) override
{
#if JUCE_IOS
if (b == &connectButton)
{
BluetoothMidiDevicePairingDialogue::open();
return;
}
#else
ignoreUnused (b);
#endif
void ledClicked (int x, int y, float z) override;
clearLEDs();
}
void buttonClicked (Button*) override;
void sliderValueChanged (Slider* s) override
{
if (s == &brightnessSlider)
brightnessLED.setColour (layout.currentColour.withBrightness (layout.currentColour == Colours::black ? 0.0f
: static_cast<float> (brightnessSlider.getValue())));
}
void sliderValueChanged (Slider*) override;
void timerCallback() override
{
if (doublePress)
{
clearLEDs();
// Reset the doublePress flag
doublePress = false;
}
else
{
// Switch to colour palette mode and set the LEDGrid program
currentMode = colourPalette;
setLEDProgram (*activeBlock);
}
stopTimer();
}
void ledClicked (int x, int y, float z) override
{
drawLED ((uint32) x, (uint32) y, z == 0.0f ? static_cast<float> (brightnessSlider.getValue())
: z * static_cast<float> (brightnessSlider.getValue()), layout.currentColour);
}
void timerCallback() override;
/** Removes TouchSurface and ControlButton listeners and sets activeBlock to nullptr */
void detachActiveBlock()
{
if (auto surface = activeBlock->getTouchSurface())
surface->removeListener (this);
for (auto button : activeBlock->getButtons())
button->removeListener (this);
activeBlock = nullptr;
}
void detachActiveBlock();
/** Sets the LEDGrid Program for the selected mode */
void setLEDProgram (Block& block)
{
canvasProgram = nullptr;
colourPaletteProgram = nullptr;
void setLEDProgram (Block&);
if (currentMode == canvas)
{
// Create a new BitmapLEDProgram for the LEDGrid
canvasProgram = new BitmapLEDProgram (block);
// Set the LEDGrid program
block.setProgram (canvasProgram);
// Redraw any previously drawn LEDs
redrawLEDs();
}
else if (currentMode == colourPalette)
{
// Create a new DrumPadGridProgram for the LEDGrid
colourPaletteProgram = new DrumPadGridProgram (block);
// Set the LEDGrid program
block.setProgram (colourPaletteProgram);
// Setup the grid layout
colourPaletteProgram->setGridFills (layout.numColumns,
layout.numRows,
layout.gridFillArray);
}
}
void clearLEDs()
{
// Clear the LED grid
for (uint32 x = 0; x < 15; ++x)
{
for (uint32 y = 0; y < 15; ++ y)
{
if (canvasProgram != nullptr)
canvasProgram->setLED (x, y, Colours::black);
lightpadComponent.setLEDColour (x, y, Colours::black);
}
}
// Clear the ActiveLED array
activeLeds.clear();
}
void clearLEDs();
/** Sets an LED on the Lightpad for a given touch co-ordinate and pressure */
void drawLED (uint32 x0, uint32 y0, float z, Colour drawColour)
{
// Check if the activeLeds array already contains an ActiveLED object for this LED
auto index = getLEDAt (x0, y0);
// If the colour is black then just set the LED to black and return
if (drawColour == Colours::black)
{
if (index >= 0)
{
if (canvasProgram != nullptr)
canvasProgram->setLED (x0, y0, Colours::black);
lightpadComponent.setLEDColour (x0, y0, Colours::black);
activeLeds.remove (index);
}
return;
}
// If there is no ActiveLED obejct for this LED then create one,
// add it to the array, set the LED on the Block and return
if (index < 0)
{
ActiveLED led;
led.x = x0;
led.y = y0;
led.colour = drawColour;
led.brightness = z;
activeLeds.add (led);
if (canvasProgram != nullptr)
canvasProgram->setLED (led.x, led.y, led.colour.withBrightness (led.brightness));
lightpadComponent.setLEDColour (led.x, led.y, led.colour.withBrightness (led.brightness));
return;
}
// Get the ActiveLED object for this LED
ActiveLED currentLed = activeLeds.getReference (index);
// If the LED colour is the same as the draw colour, add the brightnesses together.
// If it is different, blend the colours
if (currentLed.colour == drawColour)
currentLed.brightness = jmin (currentLed.brightness + z, 1.0f);
else
currentLed.colour = currentLed.colour.interpolatedWith (drawColour, z);
// Set the LED on the Block and change the ActiveLED object in the activeLeds array
if (canvasProgram != nullptr)
canvasProgram->setLED (currentLed.x, currentLed.y, currentLed.colour.withBrightness (currentLed.brightness));
lightpadComponent.setLEDColour (currentLed.x, currentLed.y, currentLed.colour.withBrightness (currentLed.brightness));
activeLeds.set (index, currentLed);
}
void drawLED (uint32 x0, uint32 y0, float z, Colour drawColour);
/** Redraws the LEDs on the Lightpad from the activeLeds array */
void redrawLEDs()
void redrawLEDs();
//==============================================================================
BitmapLEDProgram* getCanvasProgram()
{
// Iterate over the activeLeds array and set the LEDs on the Block
for (auto led : activeLeds)
{
canvasProgram->setLED (led.x, led.y, led.colour.withBrightness (led.brightness));
lightpadComponent.setLEDColour (led.x, led.y, led.colour.withBrightness (led.brightness));
}
if (activeBlock != nullptr)
return dynamic_cast<BitmapLEDProgram*> (activeBlock->getProgram());
return nullptr;
}
DrumPadGridProgram* getPaletteProgram()
{
if (activeBlock != nullptr)
return dynamic_cast<DrumPadGridProgram*> (activeBlock->getProgram());
return nullptr;
}
//==============================================================================
/**
A struct that represents an active LED on the Lightpad.
Has a position, colour and brightness.
@ -533,9 +217,6 @@ private:
DisplayMode currentMode = colourPalette;
//==============================================================================
BitmapLEDProgram* canvasProgram = nullptr;
DrumPadGridProgram* colourPaletteProgram = nullptr;
ColourGrid layout { 3, 3 };
PhysicalTopologySource topologySource;
Block::Ptr activeBlock;
@ -545,7 +226,6 @@ private:
bool doublePress = false;
//==============================================================================
Label infoLabel;
LightpadComponent lightpadComponent;
TextButton clearButton;