diff --git a/modules/juce_blocks_basics/blocks/juce_Block.h b/modules/juce_blocks_basics/blocks/juce_Block.h index 41def683c6..cea01bf903 100644 --- a/modules/juce_blocks_basics/blocks/juce_Block.h +++ b/modules/juce_blocks_basics/blocks/juce_Block.h @@ -46,7 +46,8 @@ public: loopBlock, /**< Loop control block type. */ developerControlBlock, /**< Developer control block type. */ touchBlock, /**< Touch control block type. */ - seaboardBlock /**< Seaboard block type. */ + seaboardBlock, /**< Seaboard block type. */ + lumiKeysBlock /**< LUMI Keys block type */ }; /** The Block class is reference-counted, so always use a Block::Ptr when diff --git a/modules/juce_blocks_basics/blocks/juce_BlockConfigManager.h b/modules/juce_blocks_basics/blocks/juce_BlockConfigManager.h index 176e3df720..deaef7c312 100644 --- a/modules/juce_blocks_basics/blocks/juce_BlockConfigManager.h +++ b/modules/juce_blocks_basics/blocks/juce_BlockConfigManager.h @@ -136,7 +136,7 @@ struct BlockConfigManager "Highest", "Lowest", "Disabled" }, playGroup }, - { zTrackingMode, 1, 0, 4, false, "Pressure Tracking Mode", ConfigType::options, { "Multi-Channel", + { zTrackingMode, 1, 0, 4, false, "Pressure Tracking Mode", ConfigType::options, { "Poly Aftertouch", "Last Played", "Highest", "Lowest", diff --git a/modules/juce_blocks_basics/protocol/juce_BlockModels.h b/modules/juce_blocks_basics/protocol/juce_BlockModels.h index 3fcfc8665e..941b4c91ee 100644 --- a/modules/juce_blocks_basics/protocol/juce_BlockModels.h +++ b/modules/juce_blocks_basics/protocol/juce_BlockModels.h @@ -33,12 +33,13 @@ struct BlockDataSheet { BlockDataSheet (const BlocksProtocol::BlockSerialNumber& serial) : serialNumber (serial) { - if (serialNumber.isPadBlock()) initialiseForPadBlock2x2(); - if (serialNumber.isLiveBlock()) initialiseForControlBlockLive(); - if (serialNumber.isLoopBlock()) initialiseForControlBlockLoop(); - if (serialNumber.isDevCtrlBlock()) initialiseForControlBlockDeveloper(); - if (serialNumber.isTouchBlock()) initialiseForControlBlockTouch(); - if (serialNumber.isSeaboardBlock()) initialiseForSeaboardBlock(); + if (serialNumber.isPadBlock()) initialiseForPadBlock2x2(); + if (serialNumber.isLiveBlock()) initialiseForControlBlockLive(); + if (serialNumber.isLoopBlock()) initialiseForControlBlockLoop(); + if (serialNumber.isDevCtrlBlock()) initialiseForControlBlockDeveloper(); + if (serialNumber.isTouchBlock()) initialiseForControlBlockTouch(); + if (serialNumber.isSeaboardBlock()) initialiseForSeaboardBlock(); + if (serialNumber.isLumiKeysBlock()) initialiseForLumiKeysBlock(); } Block::ConnectionPort convertPortIndexToConnectorPort (BlocksProtocol::ConnectorPort port) const noexcept @@ -225,6 +226,40 @@ private: addModeButton(); } + void initialiseForLumiKeysBlock() + { + apiType = Block::Type::lumiKeysBlock; + + description = "LUMI Keys BLOCK (6x3)"; + + widthUnits = 6; + heightUnits = 3; + + lightGridWidth = 0; + lightGridHeight = 0; + numKeywaves = 24; + + addButtons (ControlButton::ButtonFunction::mode, 0.2f, 0.2f, + ControlButton::ButtonFunction::down, 0.6f, 0.2f, + ControlButton::ButtonFunction::up, 1.0f, 0.2f); + + addPortsSW (Block::ConnectionPort::DeviceEdge::west, 2); + addPortsNE (Block::ConnectionPort::DeviceEdge::north, 4); + addPortsNE (Block::ConnectionPort::DeviceEdge::east, 2); + + hasTouchSurface = true; + programAndHeapSize = BlocksProtocol::padBlockProgramAndHeapSize; + + defaultConfig.add ({ mode, 0, 0, 3, false, + "Color Mode", ConfigType::options, + { "Multi-color Mode", + "Single Color Mode", + "Piano Mode", + "Night Mode" + }, + BlockConfigManager::playGroup }); + } + //============================================================================== void addStatusLED (const char* name, float x, float y) { diff --git a/modules/juce_blocks_basics/protocol/juce_BlocksProtocolDefinitions.h b/modules/juce_blocks_basics/protocol/juce_BlocksProtocolDefinitions.h index b2399d5007..7a80fe5ab4 100644 --- a/modules/juce_blocks_basics/protocol/juce_BlocksProtocolDefinitions.h +++ b/modules/juce_blocks_basics/protocol/juce_BlocksProtocolDefinitions.h @@ -185,7 +185,7 @@ struct BlockSerialNumber : public BlockStringData<16> if (c == 0) return false; - return isAnyControlBlock() || isPadBlock() || isSeaboardBlock(); + return isAnyControlBlock() || isPadBlock() || isSeaboardBlock() || isLumiKeysBlock(); } bool isPadBlock() const noexcept { return hasPrefix ("LPB") || hasPrefix ("LPM"); } @@ -194,6 +194,7 @@ struct BlockSerialNumber : public BlockStringData<16> bool isDevCtrlBlock() const noexcept { return hasPrefix ("DCB"); } bool isTouchBlock() const noexcept { return hasPrefix ("TCB"); } bool isSeaboardBlock() const noexcept { return hasPrefix ("SBB"); } + bool isLumiKeysBlock() const noexcept { return hasPrefix ("LKB"); } bool isAnyControlBlock() const noexcept { return isLiveBlock() || isLoopBlock() || isDevCtrlBlock() || isTouchBlock(); } diff --git a/modules/juce_blocks_basics/topology/internal/juce_Detector.cpp b/modules/juce_blocks_basics/topology/internal/juce_Detector.cpp index 09bffab625..9a0df53d1c 100644 --- a/modules/juce_blocks_basics/topology/internal/juce_Detector.cpp +++ b/modules/juce_blocks_basics/topology/internal/juce_Detector.cpp @@ -537,6 +537,24 @@ private: return 1; } } + else if (block->getType() == Block::lumiKeysBlock) + { + if (edge == Block::ConnectionPort::DeviceEdge::north) + { + switch (index) + { + case 0 : return 0; + case 1 : return 2; + case 2 : return 3; + case 3 : return 5; + default : jassertfalse; + } + } + else if (edge == Block::ConnectionPort::DeviceEdge::south) + { + jassertfalse; + } + } if (edge == Block::ConnectionPort::DeviceEdge::south) return block->getWidth() - (index + 1);