188 lines
4.5 KiB
C++
188 lines
4.5 KiB
C++
/*
|
|
[page select]: press button1 and button2 together
|
|
knobs: none, none, none, none
|
|
|
|
buttons: track 1, track 2, [live mode], [generative], [step edit], play/stop
|
|
*/
|
|
|
|
uint32_t _page_blink_timer = 0;
|
|
uint8_t _bpm_blink_timer = 1;
|
|
uint8_t _selected_page = 0;
|
|
|
|
void configureInterface()
|
|
{
|
|
// Buttons config
|
|
connectButton(GENERIC_BUTTON_1, GENERIC_BUTTON_1_PIN);
|
|
connectButton(GENERIC_BUTTON_2, GENERIC_BUTTON_2_PIN);
|
|
connectButton(GENERIC_BUTTON_3, GENERIC_BUTTON_3_PIN);
|
|
connectButton(GENERIC_BUTTON_4, GENERIC_BUTTON_4_PIN);
|
|
connectButton(GENERIC_BUTTON_5, GENERIC_BUTTON_5_PIN);
|
|
connectButton(GENERIC_BUTTON_6, GENERIC_BUTTON_6_PIN);
|
|
|
|
// Pots config
|
|
connectPot(GENERIC_POT_1, GENERIC_POT_1_PIN);
|
|
connectPot(GENERIC_POT_2, GENERIC_POT_2_PIN);
|
|
connectPot(GENERIC_POT_3, GENERIC_POT_3_PIN);
|
|
connectPot(GENERIC_POT_4, GENERIC_POT_4_PIN);
|
|
|
|
// Leds config
|
|
pinMode(GENERIC_LED_1, OUTPUT);
|
|
pinMode(GENERIC_LED_2, OUTPUT);
|
|
pinMode(GENERIC_LED_3, OUTPUT);
|
|
pinMode(GENERIC_LED_4, OUTPUT);
|
|
pinMode(GENERIC_LED_5, OUTPUT);
|
|
pinMode(GENERIC_LED_6, OUTPUT);
|
|
digitalWrite(GENERIC_LED_1, LOW);
|
|
digitalWrite(GENERIC_LED_2, LOW);
|
|
digitalWrite(GENERIC_LED_3, LOW);
|
|
digitalWrite(GENERIC_LED_4, LOW);
|
|
digitalWrite(GENERIC_LED_5, LOW);
|
|
digitalWrite(GENERIC_LED_6, LOW);
|
|
|
|
// first read to fill our registers
|
|
getPotChanges(GENERIC_POT_1, 0, ADC_RESOLUTION);
|
|
getPotChanges(GENERIC_POT_2, 0, ADC_RESOLUTION);
|
|
getPotChanges(GENERIC_POT_3, 0, ADC_RESOLUTION);
|
|
getPotChanges(GENERIC_POT_4, 0, ADC_RESOLUTION);
|
|
}
|
|
|
|
void processInterface()
|
|
{
|
|
static int16_t tempo;
|
|
|
|
// set external sync on/off
|
|
if ( holded(GENERIC_BUTTON_6, 2) ) {
|
|
if ( uClock.getMode() == uClock.INTERNAL_CLOCK ) {
|
|
setExternalSync(true);
|
|
} else {
|
|
setExternalSync(false);
|
|
}
|
|
}
|
|
|
|
// global controllers play and tempo
|
|
// play/stop
|
|
if ( pressed(GENERIC_BUTTON_6) ) {
|
|
if ( _playing == false ) {
|
|
// Starts the clock, tick-tac-tick-tac...
|
|
uClock.start();
|
|
} else {
|
|
// stop the clock
|
|
uClock.stop();
|
|
}
|
|
}
|
|
|
|
// internal/external led control
|
|
if ( uClock.getMode() == uClock.INTERNAL_CLOCK ) {
|
|
if ( _playing == false ) {
|
|
digitalWrite(GENERIC_LED_6 , LOW);
|
|
}
|
|
} else {
|
|
// external clock keeps the timer led always on
|
|
digitalWrite(GENERIC_LED_6 , HIGH);
|
|
}
|
|
|
|
// page select request
|
|
if ( doublePressed(GENERIC_BUTTON_1, GENERIC_BUTTON_2) ) {
|
|
lockPotsState(true);
|
|
_selected_page = 0;
|
|
}
|
|
|
|
switch ( _selected_page ) {
|
|
|
|
// Select Track/Page
|
|
case 0:
|
|
processPageButtons();
|
|
processPageLeds();
|
|
break;
|
|
|
|
// Midi controller
|
|
case 1:
|
|
processControllerButtons();
|
|
processControllerLeds();
|
|
processControllerPots();
|
|
break;
|
|
|
|
// Generative
|
|
case 2:
|
|
processGenerativeButtons();
|
|
processGenerativeLeds();
|
|
processGenerativePots();
|
|
break;
|
|
|
|
// Sequencer
|
|
case 3:
|
|
processSequencerButtons();
|
|
processSequencerLeds();
|
|
processSequencerPots();
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
void processPageButtons()
|
|
{
|
|
|
|
if ( pressed(GENERIC_BUTTON_1) ) {
|
|
_selected_track = 0;
|
|
}
|
|
|
|
if ( pressed(GENERIC_BUTTON_2) ) {
|
|
_selected_track = 1;
|
|
}
|
|
|
|
if ( pressed(GENERIC_BUTTON_3) ) {
|
|
lockPotsState(true);
|
|
_selected_page = 1;
|
|
}
|
|
|
|
if ( pressed(GENERIC_BUTTON_4) ) {
|
|
lockPotsState(true);
|
|
_selected_page = 2;
|
|
}
|
|
|
|
if ( pressed(GENERIC_BUTTON_5) ) {
|
|
lockPotsState(true);
|
|
_selected_page = 3;
|
|
}
|
|
|
|
}
|
|
|
|
void processPageLeds()
|
|
{
|
|
static bool blink_state = true;
|
|
|
|
// blink interface here for button 3 to 5
|
|
if ( millis() - _page_blink_timer >= 300 ) {
|
|
blink_state = !blink_state;
|
|
_page_blink_timer = millis();
|
|
}
|
|
|
|
digitalWrite(GENERIC_LED_3, blink_state);
|
|
digitalWrite(GENERIC_LED_4, blink_state);
|
|
digitalWrite(GENERIC_LED_5, blink_state);
|
|
|
|
if ( _selected_track == 0 ) {
|
|
digitalWrite(GENERIC_LED_1, HIGH);
|
|
digitalWrite(GENERIC_LED_2, LOW);
|
|
} else if ( _selected_track == 1 ) {
|
|
digitalWrite(GENERIC_LED_1, LOW);
|
|
digitalWrite(GENERIC_LED_2, HIGH);
|
|
}
|
|
}
|
|
|
|
void tempoInterface(uint32_t * tick)
|
|
{
|
|
if (uClock.getMode() == uClock.INTERNAL_CLOCK) {
|
|
// BPM led indicator
|
|
if ( !(*tick % (96)) || (*tick == 0) ) { // first compass step will flash longer
|
|
_bpm_blink_timer = 8;
|
|
digitalWrite(GENERIC_LED_6 , HIGH);
|
|
} else if ( !(*tick % (24)) ) { // each quarter led on
|
|
digitalWrite(GENERIC_LED_6 , HIGH);
|
|
} else if ( !(*tick % _bpm_blink_timer) ) { // get led off
|
|
digitalWrite(GENERIC_LED_6 , LOW);
|
|
_bpm_blink_timer = 1;
|
|
}
|
|
}
|
|
}
|