void checkInputs() { //encoder button if (!digitalRead(ENC_BTN_PIN) && !encBtnPushed) { encBtnPushed = true; encPressedTime = millis(); } else if (digitalRead(ENC_BTN_PIN) && encBtnPushed) { encBtnPushed = false; encReleasedTime = millis(); if (showDone) { showDone = false; } else if (encReleasedTime - encPressedTime < 500) { // press shorter than .5s is for entering the submenu if (!insideTab && displayScreen == 0) { insideTab = true; } else if (insideTab && channels[displayTab - 1].mode == 2 && menuItem == 2 && displayScreen == 0) { //enter the pattern editor if (channels[displayTab - 1].seqPattern == 0) { patternToEdit = seqA1; } else if (channels[displayTab - 1].seqPattern == 1) { patternToEdit = seqA2; } else if (channels[displayTab - 1].seqPattern == 2) { patternToEdit = seqA3; } else if (channels[displayTab - 1].seqPattern == 3) { patternToEdit = seqA4; } else if (channels[displayTab - 1].seqPattern == 4) { patternToEdit = seqA5; } else if (channels[displayTab - 1].seqPattern == 5) { patternToEdit = seqA6; } else if (channels[displayTab - 1].seqPattern == 6) { patternToEdit = seqA7; } else if (channels[displayTab - 1].seqPattern == 7) { patternToEdit = seqA8; } else if (channels[displayTab - 1].seqPattern == 8) { patternToEdit = seqB1; } else if (channels[displayTab - 1].seqPattern == 9) { patternToEdit = seqB2; } else if (channels[displayTab - 1].seqPattern == 10) { patternToEdit = seqB3; } else if (channels[displayTab - 1].seqPattern == 11) { patternToEdit = seqB4; } else if (channels[displayTab - 1].seqPattern == 12) { patternToEdit = seqB5; } else if (channels[displayTab - 1].seqPattern == 13) { patternToEdit = seqB6; } else if (channels[displayTab - 1].seqPattern == 14) { patternToEdit = seqB7; } else if (channels[displayTab - 1].seqPattern == 15) { patternToEdit = seqB8; } displayScreen = 1; isRecording = 0; } else if (insideTab && displayScreen == 0) { menuItemSelected = !menuItemSelected; } else if (displayScreen == 1 && !isRecording) { isPlaying = 1; isRecording = 1; } else if (displayScreen == 1 && isRecording) { isRecording = 0; } else if (displayScreen == 2 && menuItem == 0) { calibrateCVs(); } else if (displayScreen == 2 && menuItem == 1) { rotateScreen = !rotateScreen; saveState(); checkScreenRotation(); } else if (displayScreen == 2 && menuItem == 2) { EEPROM.put(1023, memCode - 1); reboot(); } } else if (encReleasedTime - encPressedTime < 2000) { // longer press (<2s) is for navigating back. longer than 2s presses are ignored if (displayScreen != 0) { displayScreen = 0; } else if (menuItemSelected == 1) { menuItemSelected = 0; } else if (insideTab == 1) { insideTab = 0; menuItem = 0; isRecording = 0; menuItemSelected = 0; } } else if (encReleasedTime - encPressedTime > 2000 && shiftBtnPushed) { //2s+ combo with shift to open the settings displayScreen = 2; } updateScreen(); } //encoder encoder.tick(); int encPosition = encoder.getPosition(); if (encPositionOld != encPosition) { int change = encPositionOld - encPosition; if (displayScreen == 0) { byte channelCV; if (!insideTab && !shiftBtnPushed) { //Change tab displayTab = displayTab + change; if (displayTab > 100) { //to address "negative" numbers displayTab = 0; } else if (displayTab > 6) { displayTab = 6; } } else if (((!insideTab && shiftBtnPushed) || (insideTab && menuItem == 0 && (menuItemSelected || shiftBtnPushed))) && displayTab == 0 && masterClockMode == 0) { //Change BPM bpm = bpm + change; if (bpm > MAXBPM) { bpm = MAXBPM; } else if (bpm < MINBPM) { bpm = MINBPM; } saveState(); calculateBPMTiming(); } else if (((!insideTab && shiftBtnPushed) || (insideTab && menuItem == 0 && (menuItemSelected || shiftBtnPushed))) && displayTab != 0 && channels[displayTab - 1].mode == 0) { //Change Subdiv channels[displayTab - 1].subDiv = channels[displayTab - 1].subDiv - change; if (channels[displayTab - 1].subDiv > 100) { channels[displayTab - 1].subDiv = 0; } if (channels[displayTab - 1].subDiv > (sizeof(subDivs) / sizeof(int)) - 1) { channels[displayTab - 1].subDiv = (sizeof(subDivs) / sizeof(int)) - 1; } if (!isPlaying) { calculateCycles(); } saveState(); } else if (((!insideTab && shiftBtnPushed) || (insideTab && menuItem == 0 && (menuItemSelected || shiftBtnPushed))) && displayTab != 0 && channels[displayTab - 1].mode == 1) { //Change Random channels[displayTab - 1].random = channels[displayTab - 1].random + change; if (channels[displayTab - 1].random > 100) { channels[displayTab - 1].random = 0; } else if (channels[displayTab - 1].random > 9) { channels[displayTab - 1].random = 9; } saveState(); } else if (((!insideTab && shiftBtnPushed) || (insideTab && menuItem == 0 && (menuItemSelected || shiftBtnPushed))) && displayTab != 0 && channels[displayTab - 1].mode == 2) { //Change SEQ pattern channels[displayTab - 1].seqPattern = channels[displayTab - 1].seqPattern + change; if (channels[displayTab - 1].seqPattern > 100) { channels[displayTab - 1].seqPattern = 0; } else if (channels[displayTab - 1].seqPattern > 15) { channels[displayTab - 1].seqPattern = 15; } saveState(); } else if (insideTab && !shiftBtnPushed && !menuItemSelected) { menuItem = menuItem + change; if (menuItem > 100) { //for "negative" values menuItem = 0; } else if (menuItem > lastMenuItem) { menuItem = lastMenuItem; } } else if (insideTab && (shiftBtnPushed || menuItemSelected) && displayTab == 0 && menuItem == 1) { //Master Clock Mode masterClockMode = masterClockMode + change; if (masterClockMode > 100) { masterClockMode = 0; } else if (masterClockMode > 1) { masterClockMode = 1; } saveState(); } else if (insideTab && (menuItemSelected || shiftBtnPushed) && displayTab == 0 && menuItem == 2) { //Modulation channel bpmModulationChannel = bpmModulationChannel + change; if (bpmModulationChannel == 0 || bpmModulationChannel == 1) { bpmModulationRange = 1; } else if (bpmModulationChannel > 100) { bpmModulationRange = 0; bpmModulationChannel = 255; } else if (bpmModulationChannel > 1) { bpmModulationChannel = 1; } saveState(); } else if (insideTab && (menuItemSelected || shiftBtnPushed) && displayTab == 0 && menuItem == 3) { //Modulation range bpmModulationRange = bpmModulationRange + change; if (bpmModulationRange == 0) { bpmModulationRange = 1; } else if (bpmModulationRange > 100) { bpmModulationRange = 1; } else if (bpmModulationRange > 5) { //50bpm bpmModulationRange = 5; } saveState(); } else if (insideTab && (menuItemSelected || shiftBtnPushed) && displayTab != 0 && menuItem == 1) { //Channel Mode channels[displayTab - 1].mode = channels[displayTab - 1].mode + change; if (channels[displayTab - 1].mode > 100) { channels[displayTab - 1].mode = 0; } else if (channels[displayTab - 1].mode > 2) { channels[displayTab - 1].mode = 2; } channels[displayTab - 1].CV1Target = 0; channels[displayTab - 1].CV2Target = 0; saveState(); } else if (insideTab && (menuItemSelected || shiftBtnPushed) && displayTab != 0 && menuItem == 2 && channels[displayTab - 1].mode == 0) { //Offset channels[displayTab - 1].offset = channels[displayTab - 1].offset + change; if (channels[displayTab - 1].offset > 100) { channels[displayTab - 1].offset = 0; } else if (channels[displayTab - 1].offset > channelPulsesPerCycle[displayTab-1]) { channels[displayTab - 1].offset = channelPulsesPerCycle[displayTab-1]; } saveState(); } else if (insideTab && (menuItemSelected || shiftBtnPushed) && displayTab != 0 && menuItem == 2 && channels[displayTab - 1].mode == 1) { //SUBDIV for RANDOM channels[displayTab - 1].subDiv = channels[displayTab - 1].subDiv - change; if (channels[displayTab - 1].subDiv > 200) { channels[displayTab - 1].subDiv = 0; } else if (channels[displayTab - 1].subDiv > (sizeof(subDivs) / sizeof(byte)) - 1) { channels[displayTab - 1].subDiv = (sizeof(subDivs) / sizeof(byte)) - 1; } if (!isPlaying) { calculateCycles(); } saveState(); } else if (insideTab && (menuItemSelected || shiftBtnPushed) && displayTab != 0 && menuItem == 3 && channels[displayTab - 1].mode == 0) { //CV for CLK if (channels[displayTab - 1].CV1Target == 1 && channels[displayTab - 1].CV2Target == 0) { channelCV = 1; } else if (channels[displayTab - 1].CV1Target == 0 && channels[displayTab - 1].CV2Target == 1) { channelCV = 2; } else { channelCV = 0; } channelCV = channelCV + change; if (channelCV == 0 || channelCV > 100) { channelCV = 0; channels[displayTab - 1].CV1Target = 0; channels[displayTab - 1].CV2Target = 0; } else if (channelCV == 1) { channels[displayTab - 1].CV1Target = 1; channels[displayTab - 1].CV2Target = 0; } else if (channelCV >= 2) { channelCV = 2; channels[displayTab - 1].CV1Target = 0; channels[displayTab - 1].CV2Target = 1; } saveState(); } else if (insideTab && (menuItemSelected || shiftBtnPushed) && displayTab != 0 && menuItem == 3 && channels[displayTab - 1].mode == 1) { //CV for RND if (channels[displayTab - 1].CV1Target == 2 && channels[displayTab - 1].CV2Target == 0) { channelCV = 1; } else if (channels[displayTab - 1].CV1Target == 0 && channels[displayTab - 1].CV2Target == 2) { channelCV = 2; } else { channelCV = 0; } channelCV = channelCV + change; if (channelCV == 0 || channelCV > 100) { channelCV = 0; channels[displayTab - 1].CV1Target = 0; channels[displayTab - 1].CV2Target = 0; } else if (channelCV == 1) { channels[displayTab - 1].CV1Target = 2; channels[displayTab - 1].CV2Target = 0; } else if (channelCV >= 2) { channelCV = 2; channels[displayTab - 1].CV1Target = 0; channels[displayTab - 1].CV2Target = 2; } saveState(); } else if (insideTab && (menuItemSelected || shiftBtnPushed) && displayTab != 0 && menuItem == 3 && channels[displayTab - 1].mode == 2) { //CV1 for SEQ if (channels[displayTab - 1].CV1Target == 3 && channels[displayTab - 1].CV2Target == 0) { channelCV = 1; } else if (channels[displayTab - 1].CV1Target == 0 && channels[displayTab - 1].CV2Target == 3) { channelCV = 2; } else { channelCV = 0; } channelCV = channelCV + change; if (channelCV == 0 || channelCV > 100) { channelCV = 0; channels[displayTab - 1].CV1Target = 0; channels[displayTab - 1].CV2Target = 0; } else if (channelCV == 1) { channels[displayTab - 1].CV1Target = 3; channels[displayTab - 1].CV2Target = 0; } else if (channelCV >= 2) { channelCV = 2; channels[displayTab - 1].CV1Target = 0; channels[displayTab - 1].CV2Target = 3; } saveState(); } } else if (displayScreen == 1 && !isRecording) { stepNumSelected = stepNumSelected + change; if (stepNumSelected > 100) { stepNumSelected = 15; } else if (stepNumSelected > 15) { stepNumSelected = 0; } } else if (displayScreen == 2 && !shiftBtnPushed) { menuItem = menuItem + change; if (menuItem > 100) { //for "negative" values menuItem = 0; } else if (menuItem > lastMenuItem) { menuItem = lastMenuItem; } } updateScreen(); encPositionOld = encPosition; } //play button if (!digitalRead(START_STOP_BTN_PIN) && !playBtnPushed) { if (masterClockMode == 0) { calculateBPMTiming(); resetClocks(); isPlaying = !isPlaying; } playBtnPushed = true; updateScreen(); //to wake up the screen if turned off } else if (digitalRead(START_STOP_BTN_PIN) && playBtnPushed) { playBtnPushed = false; } //shift button if (!digitalRead(SHIFT_BTN_PIN) && !shiftBtnPushed) { shiftBtnPushed = true; shiftPressedTime = millis(); if (isRecording) { //Live triggering digitalWrite(outsPins[displayTab - 1], HIGH); } if (displayScreen == 1 && !isRecording) { patternToEdit[stepNumSelected] = !patternToEdit[stepNumSelected]; } else if (displayScreen == 1 && isRecording && !recordToNextStep) { //Recording patternToEdit[currentStep] = 1; } else if (displayScreen == 1 && isRecording && recordToNextStep && currentStep != 15) { patternToEdit[currentStep+1] = 1; } else if (displayScreen == 1 && isRecording && recordToNextStep && currentStep == 15) { patternToEdit[0] = 1; } saveState(); updateScreen(); } else if (digitalRead(SHIFT_BTN_PIN) && shiftBtnPushed) { shiftBtnPushed = false; shiftReleasedTime = millis(); if (shiftReleasedTime - shiftPressedTime > 500 && shiftReleasedTime - shiftPressedTime < 2000 && isRecording) { for (byte i = 0; i < 16; i++) { patternToEdit[i] = 0; } } else if (shiftReleasedTime - shiftPressedTime > 2000 && encBtnPushed) { displayScreen = 2; } saveState(); updateScreen(); } if (analogRead(ANALOGUE_INPUT_1_PIN) > (CV1Calibration)) { CV1Input = map(analogRead(ANALOGUE_INPUT_1_PIN), CV1Calibration, 1023, 512, 1023); } else if (analogRead(ANALOGUE_INPUT_1_PIN) < (CV1Calibration-5)) { //-5 is to shift a -1 break point a little lower CV1Input = map(analogRead(ANALOGUE_INPUT_1_PIN), 0, CV1Calibration-5, 0, 512); } else { CV1Input = 512; } if (analogRead(ANALOGUE_INPUT_2_PIN) > (CV1Calibration)) { CV2Input = map(analogRead(ANALOGUE_INPUT_2_PIN), CV1Calibration, 1023, 512, 1023); } else if (analogRead(ANALOGUE_INPUT_2_PIN) < (CV1Calibration-5)) { CV2Input = map(analogRead(ANALOGUE_INPUT_2_PIN), 0, CV1Calibration-5, 0, 512); } else { CV2Input = 512; } }