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 (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 == 1 && 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 (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(); setup(); } else if (displayScreen == 2 && menuItem == 2) { EEPROM.put(1023, memCode - 1); //delay(500); //setup(); } updateScreen(); } 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 (insideTab == 1) { insideTab = 0; menuItem = 0; isRecording = 0; } updateScreen(); } 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) { 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 && 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 && 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 && 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 && 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) { menuItem = menuItem + change; if (menuItem > 100) { //for "negative" values menuItem = 0; } else if (menuItem > lastMenuItem) { menuItem = lastMenuItem; } } else if (insideTab && shiftBtnPushed && displayTab == 0 && menuItem == 0) { //Master Clock Mode masterClockMode = masterClockMode + change; if (masterClockMode > 100) { masterClockMode = 0; } else if (masterClockMode > 1) { masterClockMode = 1; } saveState(); } else if (insideTab && shiftBtnPushed && displayTab == 0 && menuItem == 1) { //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 && shiftBtnPushed && displayTab == 0 && menuItem == 2) { //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 && shiftBtnPushed && displayTab != 0 && menuItem == 0) { //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 && shiftBtnPushed && displayTab != 0 && menuItem == 1 && 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 && shiftBtnPushed && displayTab != 0 && menuItem == 1 && 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 && shiftBtnPushed && displayTab != 0 && menuItem == 2 && channels[displayTab - 1].mode == 0) { //CV1 for CLK channels[displayTab - 1].CV1Target = channels[displayTab - 1].CV1Target + change; if (channels[displayTab - 1].CV1Target > 100) { channels[displayTab - 1].CV1Target = 0; } else if (channels[displayTab - 1].CV1Target > 1) { channels[displayTab - 1].CV1Target = 1; } saveState(); } else if (insideTab && shiftBtnPushed && displayTab != 0 && menuItem == 3 && channels[displayTab - 1].mode == 0) { //CV2 for CLK channels[displayTab - 1].CV2Target = channels[displayTab - 1].CV2Target + change; if (channels[displayTab - 1].CV2Target > 100) { channels[displayTab - 1].CV2Target = 0; } else if (channels[displayTab - 1].CV2Target > 1) { channels[displayTab - 1].CV2Target = 1; } saveState(); } else if (insideTab && shiftBtnPushed && displayTab != 0 && menuItem == 2 && channels[displayTab - 1].mode == 1) { //CV1 for RND channels[displayTab - 1].CV1Target = channels[displayTab - 1].CV1Target + change; if (channels[displayTab - 1].CV1Target > 100) { channels[displayTab - 1].CV1Target = 0; } else if (channels[displayTab - 1].CV1Target > 2) { channels[displayTab - 1].CV1Target = 2; } saveState(); } else if (insideTab && shiftBtnPushed && displayTab != 0 && menuItem == 3 && channels[displayTab - 1].mode == 1) { //CV2 for RND channels[displayTab - 1].CV2Target = channels[displayTab - 1].CV2Target + change; if (channels[displayTab - 1].CV2Target > 100) { channels[displayTab - 1].CV2Target = 0; } else if (channels[displayTab - 1].CV2Target > 2) { channels[displayTab - 1].CV2Target = 2; } 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(); } //modulations map(randMod, 0, 1023, -5, +5) a1Input = map(analogRead(ANALOGUE_INPUT_1_PIN), 0 - CV1Calibration, 1023 - CV1Calibration, 0, 1023); a2Input = map(analogRead(ANALOGUE_INPUT_2_PIN), 0 - CV2Calibration, 1023 - CV2Calibration, 0, 1023); }