#pragma once #include "BankableAddresses.hpp" BEGIN_CS_NAMESPACE namespace Bankable { class SingleAddress : public OutputBankableMIDIAddress { public: SingleAddress(BaseOutputBankConfig config, MIDIAddress address) : OutputBankableMIDIAddress(config), address(address) {} MIDIAddress getBaseAddress() const { return address; } MIDIAddress getActiveAddress() const { return getBaseAddress() + getAddressOffset(); } private: MIDIAddress address; }; template class SingleAddressMultipleBanks { public: SingleAddressMultipleBanks(const Array &banks, MIDIAddress address) : banks(banks), address(address) {} MIDIAddress getBaseAddress() const { return address; } MIDIAddress getActiveAddress() const { auto address = getBaseAddress(); for (const OutputBankableMIDIAddress &bank : banks) address += bank.getAddressOffset(); return address; } void lock() { for (OutputBankableMIDIAddress &bank : banks) bank.lock(); } void unlock() { for (OutputBankableMIDIAddress &bank : banks) bank.unlock(); } private: Array banks; MIDIAddress address; }; class DualAddresses : public OutputBankableMIDIAddress { public: DualAddresses(BaseOutputBankConfig config, const Array &addresses) : OutputBankableMIDIAddress(config), first(addresses[0]), second(addresses[1]) {} MIDIAddress getFirstBaseAddress() const { return first; } MIDIAddress getSecondBaseAddress() const { return second; } MIDIAddress getFirstActiveAddress() const { return getFirstBaseAddress() + getAddressOffset(); } MIDIAddress getSecondActiveAddress() const { return getSecondBaseAddress() + getAddressOffset(); } private: MIDIAddress first, second; }; template class MatrixAddress : public OutputBankableMIDIAddress { public: MatrixAddress(BaseOutputBankConfig config, const AddressMatrix &addresses, MIDIChannelCable channelCN) : OutputBankableMIDIAddress(config), addresses(addresses), channelCN(channelCN) {} uint8_t getBaseAddress(uint8_t row, uint8_t col) const { return addresses[row][col]; } MIDIAddress getActiveAddress(uint8_t row, uint8_t col) const { MIDIAddress address = {getBaseAddress(row, col), channelCN}; return address + getAddressOffset(); } private: AddressMatrix addresses; MIDIChannelCable channelCN; }; namespace ManyAddresses { /** * @tparam NumBanks * The number of bank settings the bank has. */ template class ManyAddresses : public ManyAddresses_Base { public: /** * @brief Constructor. * * @param bank * The bank to add this element to. * @param addresses * The list of alternative addresses. */ ManyAddresses(const Bank &bank, const Array &addresses) : ManyAddresses_Base(bank), addresses(addresses) {} MIDIAddress getActiveAddress() const { return addresses[getSelection()]; } private: Array addresses; }; /** * @tparam NumBanks * The number of bank settings the bank has. */ template class DualManyAddresses : public ManyAddresses_Base { public: DualManyAddresses(const Bank &bank, const Array2D &addresses) : ManyAddresses_Base(bank), first {addresses[0]}, second {addresses[1]} {} MIDIAddress getFirstActiveAddress() const { return first[getSelection()]; } MIDIAddress getSecondActiveAddress() const { return second[getSelection()]; } private: Array first, second; }; template class ManyMatrixAddresses : public ManyAddresses_Base { public: ManyMatrixAddresses( const Bank &bank, const Array, NumBanks> &addresses, const Array &channelCNs) : ManyAddresses_Base(bank), addresses(addresses), channelCNs(channelCNs) {} MIDIAddress getActiveAddress(uint8_t row, uint8_t col) const { return {addresses[getSelection()][row][col], channelCNs[getSelection()]}; } private: Array, NumBanks> addresses; Array channelCNs; }; } // namespace ManyAddresses } // namespace Bankable END_CS_NAMESPACE