Bankable element - MIDI Channel Btns

Hi, I'm in the process of building a controller for Arturia Synclavier V and I use banks to control the 12 partials which are on 12 MIDI channels.

I'm using the Control_Surface library and I know I can use 2 buttons and 12 LEDs by using IncrementDecrementSelectorLEDs to select the banks but I'd like to use 12 illuminated tactile buttons for each bank/MIDI channel.

I looked but I couldn't find a concise example, how can I do this? Here's my code:

#include <Control_Surface.h>
#include <AH/Hardware/ExtendedInputOutput/SPIShiftRegisterOut.hpp>

using namespace ExtIO; // Bring the ExtIO pin functions into your sketch

USBMIDI_Interface usbmidi;

Bank<12> bank(1); // A bank with one channels, and 12 bank settings

//*** MUX 1 ***
//Instantiate 74HC4067 Digital multiplexer
CD74HC4067 mux1 ={4, {0,1,2,3} };

//*** MUTE ***
Bankable::CCButtonLatched<12> partiel[] {
{bank, mux1.pin(15), {30, CHANNEL_1}}, 
{bank, mux1.pin(14), {31, CHANNEL_1}},
{bank, mux1.pin(13), {32, CHANNEL_1}},
{bank, mux1.pin(12), {33, CHANNEL_1}},
{bank, mux1.pin(11), {34, CHANNEL_1}}, 
{bank, mux1.pin(10), {35, CHANNEL_1}}, 
{bank, mux1.pin(9),  {36, CHANNEL_1}},
{bank, mux1.pin(8),  {37, CHANNEL_1}},
{bank, mux1.pin(7),  {38, CHANNEL_1}},
{bank, mux1.pin(6),  {39, CHANNEL_1}}, 
{bank, mux1.pin(5),  {40, CHANNEL_1}}, 
{bank, mux1.pin(4),  {41, CHANNEL_1}},
{bank, mux1.pin(3),  {42, CHANNEL_1}},
{bank, mux1.pin(2),  {43, CHANNEL_1}},
{bank, mux1.pin(1),  {44, CHANNEL_1}},  
{bank, mux1.pin(0),  {45, CHANNEL_1}}, 
};

//*** POTS ***
Bankable::CCPotentiometer pots [] {
  {{bank, BankType::CHANGE_CHANNEL}, A2, {20, CHANNEL_1}}, 
  {{bank, BankType::CHANGE_CHANNEL}, A3, {21, CHANNEL_1}}, 
  {{bank, BankType::CHANGE_CHANNEL}, A4, {22, CHANNEL_1}}, 
  {{bank, BankType::CHANGE_CHANNEL}, A5, {23, CHANNEL_1}},
  {{bank, BankType::CHANGE_CHANNEL}, A6, {24, CHANNEL_1}}, 
  {{bank, BankType::CHANGE_CHANNEL}, A7, {25, CHANNEL_1}}, 
  {{bank, BankType::CHANGE_CHANNEL}, A8, {26, CHANNEL_1}}, 
  {{bank, BankType::CHANGE_CHANNEL}, A9, {27, CHANNEL_1}}, 
};

IncrementDecrementSelector<12> selector {
    bank,       // Bank to manage
    {6, 7},     // push button pins (increment, decrement)
    Wrap::Wrap, // Wrap around
};

void setup() {
  Control_Surface.begin();
}

void loop() { 
  // Refresh all inputs
  Control_Surface.loop();
}

Like Control Surface: ManyButtonsSelectorLEDs< N > Class Template Reference?

If you want to customize the behavior, you can always poll the switches yourself, and then simply call bank.select(i) to select the i-th bank.

I saw an example using the Control Surface: ManyButtonsSelectorLEDs but when I tried it wasn't working. I think the bank.select(i) is the way to go. May I ask you for an example code that I can use to suit my requirement?

ok I looked at the link you provided and that's exactly what I need. How do you incorporate the bank.select(i)?

It should work. I just tried the following, and it compiles without issues. (You should customize the pins, of course.)

ManyButtonsSelectorLEDs<12> selector {
    bank,       // Bank to manage
    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}, // button pins
    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,}, // LED pins
};

Why? If you don't need custom behavior, you don't need to call bank.select, the selector already does that for you, see:

(this->set(i) calls bank.select(i))

You add code to read the digital inputs, decide which bank you want to activate, and then call bank.select(i) where i is the (zero-based) bank you want.

I modified the code like so but it's giving an error:

#include <Control_Surface.h>
#include <AH/Hardware/ExtendedInputOutput/SPIShiftRegisterOut.hpp>

using namespace ExtIO; // Bring the ExtIO pin functions into your sketch

USBMIDI_Interface usbmidi;

//Instantiate 2 Shift Registers
SPIShiftRegisterOut<16> sreg {
  SPI,      // SPI interface to use
  10,      // Latch pin (ST_CP)
  MSBFIRST, // Bit order
};

Bank<12> bank(1); // A bank with one channels, and 2 bank settings

//*** MUX 1 ***
//Instantiate 74HC4067 Digital multiplexer
CD74HC4067 mux1 ={4, {0,1,2,3} };

//*** MUTE ***
Bankable::CCButtonLatched<12> partial[] {
{bank, mux1.pin(15), {30, CHANNEL_1}}, 
{bank, mux1.pin(14), {31, CHANNEL_1}},
{bank, mux1.pin(13), {32, CHANNEL_1}},
{bank, mux1.pin(12), {33, CHANNEL_1}},
{bank, mux1.pin(11), {34, CHANNEL_1}}, 
{bank, mux1.pin(10), {35, CHANNEL_1}}, 
{bank, mux1.pin(9),  {36, CHANNEL_1}},
{bank, mux1.pin(8),  {37, CHANNEL_1}},
{bank, mux1.pin(7),  {38, CHANNEL_1}},
{bank, mux1.pin(6),  {39, CHANNEL_1}}, 
{bank, mux1.pin(5),  {40, CHANNEL_1}}, 
{bank, mux1.pin(4),  {41, CHANNEL_1}},
{bank, mux1.pin(3),  {42, CHANNEL_1}},
{bank, mux1.pin(2),  {43, CHANNEL_1}},
{bank, mux1.pin(1),  {44, CHANNEL_1}},  
{bank, mux1.pin(0),  {45, CHANNEL_1}}, 
};

//*** POTS ***
Bankable::CCPotentiometer pots [] {
  {{bank, BankType::CHANGE_CHANNEL}, A2, {20, CHANNEL_1}}, 
  {{bank, BankType::CHANGE_CHANNEL}, A3, {21, CHANNEL_1}}, 
  {{bank, BankType::CHANGE_CHANNEL}, A4, {22, CHANNEL_1}}, 
  {{bank, BankType::CHANGE_CHANNEL}, A5, {23, CHANNEL_1}},
  {{bank, BankType::CHANGE_CHANNEL}, A6, {24, CHANNEL_1}}, 
  {{bank, BankType::CHANGE_CHANNEL}, A7, {25, CHANNEL_1}}, 
  {{bank, BankType::CHANGE_CHANNEL}, A8, {26, CHANNEL_1}}, 
  {{bank, BankType::CHANGE_CHANNEL}, A9, {27, CHANNEL_1}}, 
};

pin_t leds1 [] {
sreg.pin(15),  
sreg.pin(14), 
sreg.pin(13),
sreg.pin(12),  
sreg.pin(11), 
sreg.pin(10),
sreg.pin(9),
sreg.pin(8),
sreg.pin(7), 
sreg.pin(6), 
sreg.pin(5),
sreg.pin(4),
sreg.pin(3), 
sreg.pin(2),
sreg.pin(1),
sreg.pin(0),  
};

// Selector to select the active bank
ManyButtonsSelectorLEDs<12> selector = {
  bank,
  {mux1.pin(0), mux1.pin(1), mux1.pin(2), mux1.pin(3), mux1.pin(4), mux1.pin(5), mux1.pin(6), mux1.pin(7), mux1.pin(8), mux1.pin(9), mux1.pin(10), mux1.pin(11), mux1.pin(12), mux1.pin(13), mux1.pin(14), mux1.pin(15)}, // button pins
  {sreg.pin(0), sreg.pin(1), sreg.pin(2), sreg.pin(3), sreg.pin(4), sreg.pin(5), sreg.pin(6), sreg.pin(7), sreg.pin(8), sreg.pin(9), sreg.pin(10), sreg.pin(11), sreg.pin(12), sreg.pin(13), sreg.pin(14), sreg.pin(15)}, // LED pins
};

void setup() {
  Control_Surface.begin();
}

void loop() { 
  // Refresh all inputs
  Control_Surface.loop();
}

on error: could not convert '{{bank, {mux1.AH::AnalogMultiplex<4>::.AH::StaticSizeExtendedIOElement<16>::.AH::ExtendedIOElement::pin(0), mux1.AH::AnalogMultiplex<4>::.AH::StaticSizeExtendedIOElement<16>::.AH::ExtendedIOElement::pin(1), mux1.AH::AnalogMultiplex<4>::.AH::StaticSizeExtendedIOElement<16>::.AH::ExtendedIOElement::pin(2), mux1.AH::AnalogMultiplex<4>::.AH::StaticSizeExtendedIOElement<16>::.AH::ExtendedIOElement::pin(3), mux1.AH::AnalogMultiplex<4>::.AH::StaticSizeExtendedIOElement<16>::.AH::ExtendedIOElement::pin(4), mux1.AH::AnalogMultiplex<4>::.AH::StaticSizeExtendedIOElement<16>::.AH::ExtendedIOElement::pin(5), mux1.AH::AnalogMultiplex<4>::.AH::StaticSizeExtendedIOElement<16>::.AH::ExtendedIOElement::pin(6), mux1.AH::AnalogMultiplex<4>::.AH::StaticSizeExtendedIOElement<16>::.AH::ExtendedIOElement::pin(7), mux1.AH::AnalogMultiplex<4>::.AH::StaticSizeExtendedIOElement<16>::.AH::ExtendedIOElement::pin(8), mux1.AH::AnalogMultiplex<4>::.AH::StaticSizeExtendedIOElement<16>::.AH::ExtendedIOElement::pin(9), mux1.AH::AnalogMultiplex<4>::.AH::StaticSizeExtendedIOElement<16>::.AH::ExtendedIOElement::pin(10), mux1.AH::AnalogMultiplex<4>::.AH::StaticSizeExtendedIOElement<16>::.AH::ExtendedIOElement::pin(11), mux1.AH::AnalogMultiplex<4>::.AH::StaticSizeExtendedIOElement<16>::.AH::ExtendedIOElement::pin(12), mux1.AH::AnalogMultiplex<4>::.AH::StaticSizeExtendedIOElement<16>::.AH::ExtendedIOElement::pin(13), mux1.AH::AnalogMultiplex<4>::.AH::StaticSizeExtendedIOElement<16>::.AH::ExtendedIOElement::pin(14), mux1.AH::AnalogMultiplex<4>::.AH::StaticSizeExtendedIOElement<16>::.AH::ExtendedIOElement::pin(15)}, {sreg.AH::SPIShiftRegisterOut<16>::.AH::ShiftRegisterOutBase<16>::.AH::StaticSizeExtendedIOElement<16>::.AH::ExtendedIOElement::pin(0), sreg.AH::SPIShiftRegisterOut<16>::.AH::ShiftRegisterOutBase<16>::.AH::StaticSizeExtendedIOElement<16>::.AH::ExtendedIOElement::pin(1), sreg.AH::SPIShiftRegisterOut<16>::.AH::ShiftRegisterOutBase<16>::.AH::StaticSizeExtendedIOElement<16>::.AH::ExtendedIOElement::pin(2), sreg.AH::SPIShiftRegisterOut<16>::.AH::ShiftRegisterOutBase<16>::.AH::StaticSizeExtendedIOElement<16>::.AH::ExtendedIOElement::pin(3), sreg.AH::SPIShiftRegisterOut<16>::.AH::ShiftRegisterOutBase<16>::.AH::StaticSizeExtendedIOElement<16>::.AH::ExtendedIOElement::pin(4), sreg.AH::SPIShiftRegisterOut<16>::.AH::ShiftRegisterOutBase<16>::.AH::StaticSizeExtendedIOElement<16>::.AH::ExtendedIOElement::pin(5), sreg.AH::SPIShiftRegisterOut<16>::.AH::ShiftRegisterOutBase<16>::.AH::StaticSizeExtendedIOElement<16>::.AH::ExtendedIOElement::pin(6), sreg.AH::SPIShiftRegisterOut<16>::.AH::ShiftRegisterOutBase<16>::.AH::StaticSizeExtendedIOElement<16>::.AH::ExtendedIOElement::pin(7), sreg.AH::SPIShiftRegisterOut<16>::.AH::ShiftRegisterOutBase<16>::.AH::StaticSizeExtendedIOElement<16>::.AH::ExtendedIOElement::pin(8), sreg.AH::SPIShiftRegisterOut<16>::.AH::ShiftRegisterOutBase<16>::.AH::StaticSizeExtendedIOElement<16>::.AH::ExtendedIOElement::pin(9), sreg.AH::SPIShiftRegisterOut<16>::.AH::ShiftRegisterOutBase<16>::.AH::StaticSizeExtendedIOElement<16>::.AH::ExtendedIOElement::pin(10), sreg.AH::SPIShiftRegisterOut<16>::.AH::ShiftRegisterOutBase<16>::.AH::StaticSizeExtendedIOElement<16>::.AH::ExtendedIOElement::pin(11), sreg.AH::SPIShiftRegisterOut<16>::.AH::ShiftRegisterOutBase<16>::.AH::StaticSizeExtendedIOElement<16>::.AH::ExtendedIOElement::pin(12), sreg.AH::SPIShiftRegisterOut<16>::.AH::ShiftRegisterOutBase<16>::.AH::StaticSizeExtendedIOElement<16>::.AH::ExtendedIOElement::pin(13), sreg.AH::SPIShiftRegisterOut<16>::.AH::ShiftRegisterOutBase<16>::.AH::StaticSizeExtendedIOElement<16>::.AH::ExtendedIOElement::pin(14), sreg.AH::SPIShiftRegisterOut<16>::.AH::ShiftRegisterOutBase<16>::.AH::StaticSizeExt

type or paste code here

It's now compiling, i haven't tried it yet though. here's my code:

#include <Control_Surface.h>
#include <AH/Hardware/ExtendedInputOutput/SPIShiftRegisterOut.hpp>

using namespace ExtIO; // Bring the ExtIO pin functions into your sketch

USBMIDI_Interface usbmidi;

//Instantiate 2 Shift Registers
SPIShiftRegisterOut<16> sreg {
  SPI,      // SPI interface to use
  10,      // Latch pin (ST_CP)
  MSBFIRST, // Bit order
};

Bank<12> bank(1); // A bank with one channels, and 2 bank settings

//*** MUX 1 ***
//Instantiate 74HC4067 Digital multiplexer
CD74HC4067 mux1 ={4, {0,1,2,3} };

//*** PARTIAL SELECT***
Bankable::CCButton partial_Sel[] {
{bank, mux1.pin(15), {30, CHANNEL_1}}, 
{bank, mux1.pin(14), {31, CHANNEL_1}},
{bank, mux1.pin(13), {32, CHANNEL_1}},
{bank, mux1.pin(12), {33, CHANNEL_1}},
{bank, mux1.pin(11), {34, CHANNEL_1}}, 
{bank, mux1.pin(10), {35, CHANNEL_1}}, 
{bank, mux1.pin(9),  {36, CHANNEL_1}},
{bank, mux1.pin(8),  {37, CHANNEL_1}},
{bank, mux1.pin(7),  {38, CHANNEL_1}},
{bank, mux1.pin(6),  {39, CHANNEL_1}}, 
{bank, mux1.pin(5),  {40, CHANNEL_1}}, 
{bank, mux1.pin(4),  {41, CHANNEL_1}},
{bank, mux1.pin(3),  {42, CHANNEL_1}},
{bank, mux1.pin(2),  {43, CHANNEL_1}},
{bank, mux1.pin(1),  {44, CHANNEL_1}},  
{bank, mux1.pin(0),  {45, CHANNEL_1}}, 
};

//*** MUX 2 ***
//Instantiate 74HC4067 Digital multiplexer
CD74HC4067 mux2 ={9, {5,6,7,8} };

//*** PARTIAL BUTTONS***
Bankable::CCButtonLatched<12> partial[] {
{bank, mux2.pin(15), {50, CHANNEL_1}}, 
{bank, mux2.pin(14), {51, CHANNEL_1}},
{bank, mux2.pin(13), {52, CHANNEL_1}},
{bank, mux2.pin(12), {53, CHANNEL_1}},
{bank, mux2.pin(11), {54, CHANNEL_1}}, 
{bank, mux2.pin(10), {55, CHANNEL_1}}, 
{bank, mux2.pin(9),  {56, CHANNEL_1}},
{bank, mux2.pin(8),  {57, CHANNEL_1}},
{bank, mux2.pin(7),  {58, CHANNEL_1}},
{bank, mux2.pin(6),  {59, CHANNEL_1}}, 
{bank, mux2.pin(5),  {60, CHANNEL_1}}, 
{bank, mux2.pin(4),  {61, CHANNEL_1}},
{bank, mux2.pin(3),  {62, CHANNEL_1}},
{bank, mux2.pin(2),  {63, CHANNEL_1}},
{bank, mux2.pin(1),  {64, CHANNEL_1}},  
{bank, mux2.pin(0),  {65, CHANNEL_1}}, 
};

//*** PARTIAL POTS ***
Bankable::CCPotentiometer pots [] {
  {{bank, BankType::CHANGE_CHANNEL}, A2, {20, CHANNEL_1}}, 
  {{bank, BankType::CHANGE_CHANNEL}, A3, {21, CHANNEL_1}}, 
  {{bank, BankType::CHANGE_CHANNEL}, A4, {22, CHANNEL_1}}, 
  {{bank, BankType::CHANGE_CHANNEL}, A5, {23, CHANNEL_1}},
  {{bank, BankType::CHANGE_CHANNEL}, A6, {24, CHANNEL_1}}, 
  {{bank, BankType::CHANGE_CHANNEL}, A7, {25, CHANNEL_1}}, 
  {{bank, BankType::CHANGE_CHANNEL}, A8, {26, CHANNEL_1}}, 
  {{bank, BankType::CHANGE_CHANNEL}, A9, {27, CHANNEL_1}}, 
};

pin_t leds1 [] {
sreg.pin(11), 
sreg.pin(10),
sreg.pin(9),
sreg.pin(8),
sreg.pin(7), 
sreg.pin(6), 
sreg.pin(5),
sreg.pin(4),
sreg.pin(3), 
sreg.pin(2),
sreg.pin(1),
sreg.pin(0),  
};

// Selector to select the active bank
ManyButtonsSelectorLEDs<12> selector = {
 bank,
  {mux1.pin(0), mux1.pin(1), mux1.pin(2), mux1.pin(3), mux1.pin(4), mux1.pin(5), mux1.pin(6), mux1.pin(7), mux1.pin(8), mux1.pin(9), mux1.pin(10), mux1.pin(11),}, // button pins
  {sreg.pin(0), sreg.pin(1), sreg.pin(2), sreg.pin(3), sreg.pin(4), sreg.pin(5), sreg.pin(6), sreg.pin(7), sreg.pin(8), sreg.pin(9), sreg.pin(10), sreg.pin(11),}, // LED pins
};

void setup() {
  Control_Surface.begin();
}

void loop() { 
  // Refresh all inputs
  Control_Surface.loop();
}

Thank you Pieter! It’s now working perfectly.

How would I save the button states (11 btns) for every bank?

What do you mean? Which buttons? What to save? When to save? When to restore?

Every sound/preset has up to 12 partials thus the 12 banks to select every partial. In every partial there will be 13 latched buttons with LED and 31 pots.

I'm using the control surface I built to test the Synclavier V controller so I don't have the exact buttons and pot counts. In the code below I have 16 buttons with LED which 12 are used to select the bank. I don't have the code yet to link the 4 remaining buttons with the 4 LED.

So when I select bank/partial #1 and click on a button, the LED turns on to activate the function. when I switch to bank #2, that same function in partial 2 might not be on. When revert back to bank #1, the code needs to remember the button state to turn on the LED. That's for every bank. I don't care about the pots, unless there's a way to save to reading/midi value?

How would I do this? Here the code:

#include <Control_Surface.h>
#include <AH/Hardware/ExtendedInputOutput/SPIShiftRegisterOut.hpp>

using namespace ExtIO; // Bring the ExtIO pin functions into your sketch

USBMIDI_Interface usbmidi;

//Instantiate 2 Shift Registers
SPIShiftRegisterOut<16> sreg {
  SPI,      // SPI interface to use
  10,      // Latch pin (ST_CP)
  MSBFIRST, // Bit order
};

Bank<12> bank(1); // A bank with one channels, and 2 bank settings

//*** MUX 1 ***
//Instantiate 74HC4067 Digital multiplexer
CD74HC4067 mux1 ={4, {0,1,2,3} };

//*** PARTIAL SELECT***
Bankable::CCButton partial_Sel[] {
{bank, mux1.pin(14), {31, CHANNEL_1}}, // MUTE_1
{bank, mux1.pin(10), {35, CHANNEL_1}}, // MUTE_2
{bank, mux1.pin(6),  {39, CHANNEL_1}}, // MUTE_3
{bank, mux1.pin(2),  {43, CHANNEL_1}}, // MUTE_4
{bank, mux1.pin(13), {32, CHANNEL_1}}, // SOLO_1
{bank, mux1.pin(9),  {36, CHANNEL_1}}, // SOLO_2
{bank, mux1.pin(5),  {40, CHANNEL_1}}, // SOLO_3
{bank, mux1.pin(1),  {44, CHANNEL_1}}, // SOLO_4
{bank, mux1.pin(12), {33, CHANNEL_1}}, // REC_RDY_1
{bank, mux1.pin(8),  {37, CHANNEL_1}}, // REC_RDY_2
{bank, mux1.pin(4),  {41, CHANNEL_1}}, // REC_RDY_3
{bank, mux1.pin(0),  {45, CHANNEL_1}}, // REC_RDY_4
};

//*** PARTIAL BUTTON TEST ***
Bankable::CCButtonLatched<12> partial_BTN_TEST[] {
{{bank, BankType::CHANGE_CHANNEL}, mux1.pin(15), {30, CHANNEL_1}}, // SELECT_1
{{bank, BankType::CHANGE_CHANNEL}, mux1.pin(11), {34, CHANNEL_1}}, // SELECT_2
{{bank, BankType::CHANGE_CHANNEL}, mux1.pin(7),  {38, CHANNEL_1}}, // SELECT_3
{{bank, BankType::CHANGE_CHANNEL}, mux1.pin(3),  {42, CHANNEL_1}}, // SELECT_4
};

//*** MUTE/SOLO ***
Bankable::CCButtonLatched<12> mute_solo [] = {
{{bank, BankType::CHANGE_CHANNEL}, 6, 47},
{{bank, BankType::CHANGE_CHANNEL}, 7, 48},
};

//*** PARTIAL POTS ***
Bankable::CCPotentiometer pots [] {
  {{bank, BankType::CHANGE_CHANNEL}, A2, {20, CHANNEL_1}},
  {{bank, BankType::CHANGE_CHANNEL}, A3, {21, CHANNEL_1}},
  {{bank, BankType::CHANGE_CHANNEL}, A4, {22, CHANNEL_1}},
  {{bank, BankType::CHANGE_CHANNEL}, A5, {23, CHANNEL_1}},
  {{bank, BankType::CHANGE_CHANNEL}, A6, {24, CHANNEL_1}},
  {{bank, BankType::CHANGE_CHANNEL}, A7, {25, CHANNEL_1}},
  {{bank, BankType::CHANGE_CHANNEL}, A8, {26, CHANNEL_1}},
  {{bank, BankType::CHANGE_CHANNEL}, A9, {27, CHANNEL_1}},
};

pin_t leds1 [] {
sreg.pin(15),
sreg.pin(14),
sreg.pin(13),
sreg.pin(12),
sreg.pin(11),
sreg.pin(10),
sreg.pin(9),
sreg.pin(8),
sreg.pin(7),
sreg.pin(6),
sreg.pin(5),
sreg.pin(4),
sreg.pin(3),
sreg.pin(2),
sreg.pin(1),
sreg.pin(0),  
};

// Selector to select the active bank
ManyButtonsSelectorLEDs<12> selector = {
 bank,
  {mux1.pin(12), mux1.pin(8), mux1.pin(4), mux1.pin(0), mux1.pin(13), mux1.pin(9), mux1.pin(5), mux1.pin(1), mux1.pin(14), mux1.pin(10), mux1.pin(6), mux1.pin(2),}, // button pins
  {sreg.pin(12), sreg.pin(13), sreg.pin(14), sreg.pin(15), sreg.pin(8), sreg.pin(9), sreg.pin(10), sreg.pin(11), sreg.pin(4), sreg.pin(5), sreg.pin(6), sreg.pin(7),}, // LED pins
};

//*** Preset Selection ***
CCButton Select_preset [] {
    {14, 37},  
}; 

CCRotaryEncoder Nav_preset []{
  {{16,15},   {74}, 1, 1},   // pulses per click
};

void setup() {
  Control_Surface.begin();
}

void loop() {
  // Refresh all inputs
  Control_Surface.loop();
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.