|
- /*
- ==============================================================================
-
- This file is part of the JUCE library.
- Copyright (c) 2017 - ROLI Ltd.
-
- Permission is granted to use this software under the terms of the ISC license
- http://www.isc.org/downloads/software-support-policy/isc-license/
-
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted, provided that the above
- copyright notice and this permission notice appear in all copies.
-
- THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD
- TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
- FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT,
- OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
- USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
- OF THIS SOFTWARE.
-
- -----------------------------------------------------------------------------
-
- To release a closed-source product which uses other parts of JUCE not
- licensed under the ISC terms, commercial licenses are available: visit
- www.juce.com for more information.
-
- ==============================================================================
- */
-
- #pragma once
-
- // This file provides interfaces for managing the internal configuration of Blocks
- // and synchronises with the connected Block
-
- using namespace BlocksProtocol;
-
- struct BlockConfigManager
- {
- void setDeviceIndex (TopologyIndex newDeviceIndex) { deviceIndex = newDeviceIndex; }
- void setDeviceComms (PhysicalTopologySource::DeviceConnection* newConn) { deviceConnection = newConn; }
-
- enum ConfigType
- {
- integer,
- floating,
- boolean,
- colour,
- options
- };
-
- static constexpr uint32 numConfigItems = 59;
-
- struct ConfigDescription
- {
- ConfigItemId item;
- int32 value;
- int32 min;
- int32 max;
- bool isActive;
- const char* name;
- ConfigType type;
- const char* optionNames[configMaxOptions];
- const char* group;
-
- static_assert (configMaxOptions == Block::ConfigMetaData::numOptionNames, "Config options size and config metadata size should be the same");
-
- Block::ConfigMetaData toConfigMetaData() const
- {
- return Block::ConfigMetaData ((uint32) item, value, { min, max }, isActive, name, (uint32) type, (const char**) optionNames, group);
- }
- };
-
- ConfigDescription configList[numConfigItems] =
- {
- { midiStartChannel, 1, 0, 15, false, "MIDI Start Channel", ConfigType::integer, {}, "MIDI Settings" },
- { midiEndChannel, 15, 0, 15, false, "MIDI End Channel", ConfigType::integer, {}, "MIDI Settings" },
- { midiUseMPE, 1, 0, 1, false, "Use MPE", ConfigType::boolean, {}, "MIDI Settings" },
- { pitchBendRange, 48, 1, 96, false, "Pitch Bend Range", ConfigType::integer, {}, "MIDI Settings" },
- { octave, 0, -4, 6, false, "Octave", ConfigType::integer, {}, "Pitch" },
- { transpose, 0, -11, 11, false, "Transpose", ConfigType::integer, {}, "Pitch" },
- { slideCC, 74, 0, 127, false, "Slide CC", ConfigType::integer, {}, "5D Touch" },
- { slideMode, 0, 0, 2, false, "Slide Mode", ConfigType::options, { "Absolute",
- "Relative Unipolar",
- "Relative Bipolar" }, "5D Touch" },
- { velocitySensitivity, 100, 0, 127, false, "Strike Sensitivity", ConfigType::integer, {}, "5D Touch" },
- { glideSensitivity, 100, 0, 127, false, "Glide Sensitivity", ConfigType::integer, {}, "5D Touch" },
- { slideSensitivity, 100, 0, 127, false, "Slide Sensitivity", ConfigType::integer, {}, "5D Touch" },
- { pressureSensitivity, 100, 0, 127, false, "Pressure Sensitivity", ConfigType::integer, {}, "5D Touch" },
- { liftSensitivity, 100, 0, 127, false, "Lift Sensitivity", ConfigType::integer, {}, "5D Touch" },
- { fixedVelocity, 0, 0, 1, false, "Fixed Velocity", ConfigType::boolean, {}, "5D Touch" },
- { fixedVelocityValue, 127, 1, 127, false, "Fixed Velocity Value", ConfigType::integer, {}, "5D Touch" },
- { pianoMode, 0, 0, 1, false, "Piano Mode", ConfigType::boolean, {}, "5D Touch" },
- { glideLock, 0, 0, 127, false, "Glide Lock", ConfigType::integer, {}, "Play mode" },
- { mode, 4, 1, 5, false, "Mode", ConfigType::integer, {}, "Play mode" },
- { volume, 100, 0, 127, false, "Volume", ConfigType::integer, {}, "Play mode" },
- { scale, 0, 0, 18, false, "Scale", ConfigType::integer, {}, "Play mode" }, // NOTE: Should be options
- { hideMode, 0, 0, 1, false, "Hide Mode", ConfigType::boolean, {}, "Play mode" },
- { chord, 0, 0, 127, false, "Chord", ConfigType::integer, {}, "Play mode" }, // NOTE: Should be options
- { arpPattern, 0, 0, 127, false, "Arp Pattern", ConfigType::integer, {}, "Play mode" },
- { tempo, 120, 1, 300, false, "Tempo", ConfigType::integer, {}, "Rhythm" },
- { xTrackingMode, 1, 0, 4, false, "Glide Tracking Mode", ConfigType::options, { "Multi-Channel",
- "Last Played",
- "Highest",
- "Lowest",
- "Disabled" }, "5D Touch" },
- { yTrackingMode, 1, 0, 4, false, "Slide Tracking Mode", ConfigType::options, { "Multi-Channel",
- "Last Played",
- "Highest",
- "Lowest",
- "Disabled" }, "5D Touch" },
- { zTrackingMode, 1, 0, 4, false, "Pressure Tracking Mode", ConfigType::options, { "Multi-Channel",
- "Last Played",
- "Highest",
- "Lowest",
- "Disabled",
- "Hardest" }, "5D Touch" },
- // These can be defined for unique usage for a given Littlefoot script
- { user0, 0, 0, 127, false, {}, ConfigType::integer, {}, {} },
- { user1, 0, 0, 127, false, {}, ConfigType::integer, {}, {} },
- { user2, 0, 0, 127, false, {}, ConfigType::integer, {}, {} },
- { user3, 0, 0, 127, false, {}, ConfigType::integer, {}, {} },
- { user4, 0, 0, 127, false, {}, ConfigType::integer, {}, {} },
- { user5, 0, 0, 127, false, {}, ConfigType::integer, {}, {} },
- { user6, 0, 0, 127, false, {}, ConfigType::integer, {}, {} },
- { user7, 0, 0, 127, false, {}, ConfigType::integer, {}, {} },
- { user8, 0, 0, 127, false, {}, ConfigType::integer, {}, {} },
- { user9, 0, 0, 127, false, {}, ConfigType::integer, {}, {} },
- { user10, 0, 0, 127, false, {}, ConfigType::integer, {}, {} },
- { user11, 0, 0, 127, false, {}, ConfigType::integer, {}, {} },
- { user12, 0, 0, 127, false, {}, ConfigType::integer, {}, {} },
- { user13, 0, 0, 127, false, {}, ConfigType::integer, {}, {} },
- { user14, 0, 0, 127, false, {}, ConfigType::integer, {}, {} },
- { user15, 0, 0, 127, false, {}, ConfigType::integer, {}, {} },
- { user16, 0, 0, 127, false, {}, ConfigType::integer, {}, {} },
- { user17, 0, 0, 127, false, {}, ConfigType::integer, {}, {} },
- { user18, 0, 0, 127, false, {}, ConfigType::integer, {}, {} },
- { user19, 0, 0, 127, false, {}, ConfigType::integer, {}, {} },
- { user20, 0, 0, 127, false, {}, ConfigType::integer, {}, {} },
- { user21, 0, 0, 127, false, {}, ConfigType::integer, {}, {} },
- { user22, 0, 0, 127, false, {}, ConfigType::integer, {}, {} },
- { user23, 0, 0, 127, false, {}, ConfigType::integer, {}, {} },
- { user24, 0, 0, 127, false, {}, ConfigType::integer, {}, {} },
- { user25, 0, 0, 127, false, {}, ConfigType::integer, {}, {} },
- { user26, 0, 0, 127, false, {}, ConfigType::integer, {}, {} },
- { user27, 0, 0, 127, false, {}, ConfigType::integer, {}, {} },
- { user28, 0, 0, 127, false, {}, ConfigType::integer, {}, {} },
- { user29, 0, 0, 127, false, {}, ConfigType::integer, {}, {} },
- { user30, 0, 0, 127, false, {}, ConfigType::integer, {}, {} },
- { user31, 0, 0, 127, false, {}, ConfigType::integer, {}, {} }
- };
-
- //==============================================================================
- int32 getItemValue (ConfigItemId item)
- {
- uint32 itemIndex;
-
- if (getIndexForItem (item, itemIndex))
- return configList[itemIndex].value;
-
- return 0;
- }
-
- void setItemValue (ConfigItemId item, int32 value)
- {
- uint32 itemIndex;
-
- if (getIndexForItem (item, itemIndex))
- configList[itemIndex].value = value;
-
- setBlockConfig (item, value);
- }
-
- int32 getItemMin (ConfigItemId item)
- {
- uint32 itemIndex;
-
- if (getIndexForItem (item, itemIndex))
- return configList[itemIndex].min;
-
- return 0;
- }
-
- void setItemMin (ConfigItemId item, int32 min)
- {
- uint32 itemIndex;
-
- if (getIndexForItem (item, itemIndex))
- configList[itemIndex].min = min;
- }
-
- int32 getItemMax (ConfigItemId item)
- {
- uint32 itemIndex;
-
- if (getIndexForItem (item, itemIndex))
- return configList[itemIndex].max;
-
- return 0;
- }
-
- void setItemMax (ConfigItemId item, int32 max)
- {
- uint32 itemIndex;
-
- if (getIndexForItem (item, itemIndex))
- configList[itemIndex].max = max;
-
- // Send updateConfig message to Block
- }
-
- bool getItemActive (ConfigItemId item)
- {
- uint32 itemIndex;
-
- if (getIndexForItem (item, itemIndex))
- return configList[itemIndex].isActive;
-
- return false;
- }
-
- void setItemActive (ConfigItemId item, bool isActive)
- {
- uint32 itemIndex;
-
- if (getIndexForItem (item, itemIndex))
- configList[itemIndex].isActive = isActive;
-
- // Send setConfigState message to Block
- }
-
- juce::String getOptionName (ConfigItemId item, uint8 optionIndex)
- {
- uint32 itemIndex;
-
- if (getIndexForItem (item, itemIndex) && optionIndex < configMaxOptions)
- return configList[itemIndex].optionNames[optionIndex];
-
- return {};
- }
-
- Block::ConfigMetaData getMetaData (ConfigItemId item)
- {
- uint32 itemIndex;
-
- if (getIndexForItem (item, itemIndex))
- return configList[itemIndex].toConfigMetaData();
-
- return {};
- }
-
- void resetConfigListActiveStatus()
- {
- for (uint32 i = 0; i < numConfigItems; ++i)
- configList[i].isActive = false;
- }
-
- //==============================================================================
- // Set Block Configuration
- void setBlockConfig (ConfigItemId item, int32 value)
- {
- HostPacketBuilder<32> packet;
-
- packet.writePacketSysexHeaderBytes (deviceIndex);
- packet.addConfigSetMessage (item, value);
- packet.writePacketSysexFooter();
-
- if (deviceConnection != nullptr)
- deviceConnection->sendMessageToDevice (packet.getData(), (size_t) packet.size());
- }
-
- void requestBlockConfig (ConfigItemId item)
- {
- HostPacketBuilder<32> packet;
-
- packet.writePacketSysexHeaderBytes (deviceIndex);
- packet.addRequestMessage (item);
- packet.writePacketSysexFooter();
-
- if (deviceConnection != nullptr)
- deviceConnection->sendMessageToDevice(packet.getData(), (size_t) packet.size());
- }
-
- void requestFactoryConfigSync()
- {
- HostPacketBuilder<32> packet;
-
- packet.writePacketSysexHeaderBytes(deviceIndex);
- packet.addRequestFactorySyncMessage();
- packet.writePacketSysexFooter();
-
- if (deviceConnection != nullptr)
- deviceConnection->sendMessageToDevice(packet.getData(), (size_t) packet.size());
- }
-
- void requestUserConfigSync()
- {
- HostPacketBuilder<32> packet;
-
- packet.writePacketSysexHeaderBytes(deviceIndex);
- packet.addRequestUserSyncMessage();
- packet.writePacketSysexFooter();
-
- if (deviceConnection != nullptr)
- deviceConnection->sendMessageToDevice(packet.getData(), (size_t) packet.size());
- }
-
- void handleConfigUpdateMessage (int32 item, int32 value, int32 min, int32 max)
- {
- uint32 index;
-
- if (getIndexForItem ((ConfigItemId) item, index))
- {
- configList[index].value = value;
- configList[index].min = min;
- configList[index].max = max;
- configList[index].isActive = true;
- }
- }
-
- void handleConfigSetMessage(int32 item, int32 value)
- {
- uint32 index;
-
- if (getIndexForItem ((ConfigItemId) item, index))
- configList[index].value = value;
- }
-
- private:
- bool getIndexForItem (ConfigItemId item, uint32& index)
- {
- for (uint32 i = 0; i < numConfigItems; ++i)
- {
- if (configList[i].item == item)
- {
- index = i;
- return true;
- }
- }
-
- return false;
- }
-
- TopologyIndex deviceIndex;
- PhysicalTopologySource::DeviceConnection* deviceConnection;
- };
|