void updateScreen() { u8g2.firstPage(); do { uint8_t leftOffset; uint8_t width; String valueStr; u8g2.setDrawColor(1); if (displayScreen == 0) { //BPM Tab if (displayTab == 0) { //BPM u8g2.setFont(stkS); //Menu items lastMenuItem = 4; width = 32; leftOffset = 62; if (masterClockMode == 0 && bpmModulationRange == 0) { lastMenuItem = 2; } else if (masterClockMode == 0 && bpmModulationRange != 0) { lastMenuItem = 3; } else if (masterClockMode == 1) { lastMenuItem = 2; } else if (masterClockMode == 2) { lastMenuItem = 1; } for (uint8_t i = 1; i <= lastMenuItem; i++) { if (i == 1) { valueStr = F("MODE:"); } else if (i == 2 && masterClockMode == 0) { valueStr = F("MOD:"); } else if (i == 2 && masterClockMode == 1) { valueStr = F("PPQN:"); } else if (i == 3 && masterClockMode == 0) { valueStr = F("RANGE:"); } if (menuItem == i && insideTab) { u8g2.drawButtonUTF8(leftOffset, 8 + (i-1) *11, U8G2_BTN_BW1|U8G2_BTN_INV, width, 1, 2, valueStr.c_str() ); } else { u8g2.drawButtonUTF8(leftOffset, 8 + (i-1) *11, U8G2_BTN_BW0, width, 1, 2, valueStr.c_str()); } } if (masterClockMode != 0 && menuItem == 0) { //to make main param non selectable for external clock menuItem = 1; } //Values for (uint8_t i = 1; i <= lastMenuItem; i++) { if (i == 1 && masterClockMode == 0) { //Channel mode valueStr = F("INT"); } else if (i == 1 && masterClockMode == 1) { valueStr = F("EXT"); } else if (i == 1 && masterClockMode == 2) { valueStr = F("MIDI"); } else if (i == 2 && masterClockMode == 0 && bpmModulationRange != 0 && bpmModulationChannel == 0) { valueStr = F("CV1"); } else if (i == 2 && masterClockMode == 0 && bpmModulationRange != 0 && bpmModulationChannel == 1) { valueStr = F("CV2"); } else if (i == 2 && masterClockMode == 0 && bpmModulationRange == 0) { valueStr = F("OFF"); } else if (i == 2 && masterClockMode == 1 && extClockPPQN == 0) { valueStr = F("24"); } else if (i == 2 && masterClockMode == 1 && extClockPPQN == 1) { valueStr = F("4"); } else if (i == 3 && bpmModulationRange != 0) { valueStr = String(bpmModulationRange * 10); } if (menuItem == i && insideTab && (menuItemSelected || shiftBtnPushed)) { u8g2.drawButtonUTF8(leftOffset + 37, 8 + (i-1) *11, U8G2_BTN_BW1, 26, 2, 2, valueStr.c_str() ); } else if (menuItem == i && insideTab && (!menuItemSelected || !shiftBtnPushed)) { u8g2.drawButtonUTF8(leftOffset + 37, 8 + (i-1) *11, U8G2_BTN_BW1|U8G2_BTN_INV, 26, 2, 2, valueStr.c_str() ); } else { u8g2.drawButtonUTF8(leftOffset + 37, 8 + (i-1) *11, U8G2_BTN_BW0, 26, 2, 2, valueStr.c_str() ); } } if (masterClockMode == 0) { valueStr = String(bpm); } else if (masterClockMode == 1) { valueStr = F("EXT"); } else if (masterClockMode == 2) { valueStr = F("MIDI"); } leftOffset = 29; width = 55; if (masterClockMode == 0) { if ((!insideTab && !shiftBtnPushed) || (insideTab && menuItem != 0)) { //default view, nothing is selected or editable u8g2.setFont(stkL); u8g2.drawButtonUTF8(leftOffset-1, 28, U8G2_BTN_BW0|U8G2_BTN_HCENTER, width, 0, 3, valueStr.c_str() ); u8g2.setFont(stkS); valueStr = F("BPM"); u8g2.drawButtonUTF8(leftOffset, 40, U8G2_BTN_BW0|U8G2_BTN_HCENTER, width, 0, 2, valueStr.c_str() ); } else if ((!insideTab && shiftBtnPushed) || (insideTab && menuItem == 0 && (menuItemSelected || shiftBtnPushed))) { //show value as editable u8g2.setFont(stkL); u8g2.drawButtonUTF8(leftOffset-1, 28, U8G2_BTN_BW1|U8G2_BTN_HCENTER, width, 0, 3, valueStr.c_str() ); u8g2.setFont(stkS); valueStr = F("BPM"); u8g2.drawButtonUTF8(leftOffset, 40, U8G2_BTN_BW1|U8G2_BTN_INV|U8G2_BTN_HCENTER, width, 0, 2, valueStr.c_str() ); } else if (insideTab && menuItem == 0 && !menuItemSelected) { //show as selected menu item u8g2.setFont(stkL); u8g2.drawButtonUTF8(leftOffset-1, 28, U8G2_BTN_BW1|U8G2_BTN_INV|U8G2_BTN_HCENTER, width, 0, 3, valueStr.c_str() ); u8g2.setFont(stkS); valueStr = F("BPM"); u8g2.drawButtonUTF8(leftOffset, 40, U8G2_BTN_BW1|U8G2_BTN_INV|U8G2_BTN_HCENTER, width, 0, 2, valueStr.c_str() ); } } if (masterClockMode != 0) { //EXT and MIDI u8g2.setFont(stkL); u8g2.drawButtonUTF8(leftOffset, 28, U8G2_BTN_BW0|U8G2_BTN_HCENTER, width, 0, 0, valueStr.c_str() ); } } //Channel Tabs else { //Menu items if (channels[displayTab - 1].mode == Swing) { lastMenuItem = 1; } else if (channels[displayTab - 1].mode == Gate) { lastMenuItem = 3; } else { lastMenuItem = 3; } width = 32; leftOffset = 62; for (uint8_t i = 1; i <= lastMenuItem; i++) { if (i == 1) { valueStr = F("MODE:"); } else if (i == 2 && channels[displayTab - 1].mode == Clock) { valueStr = F("OFFSET:"); } else if (i == 2 && (channels[displayTab - 1].mode == Random || channels[displayTab - 1].mode == Gate)) { valueStr = F("SUBDIV:"); } else if (i == 2 && channels[displayTab - 1].mode == Sequencer) { valueStr = F("EDIT PATTERN"); } else if (i == 3 && channels[displayTab - 1].mode == Gate) { valueStr = (String(pulsePeriod) + " " + String(channelPulsesPerCycle[displayTab - 1])); } else if (i == 3) { valueStr = F("MOD:"); } if (menuItem == i && insideTab) { u8g2.drawButtonUTF8(leftOffset, 8 + (i-1) *11, U8G2_BTN_BW1|U8G2_BTN_INV, width, 1, 2, valueStr.c_str() ); } else { u8g2.drawButtonUTF8(leftOffset, 8 + (i-1) *11, U8G2_BTN_BW0, width, 1, 2, valueStr.c_str()); } } //Values for (uint8_t i = 1; i <= lastMenuItem; i++) { if (i == 1 && channels[displayTab - 1].mode == Clock) { //Channel mode valueStr = F("CLOCK"); } else if (i == 1 && channels[displayTab - 1].mode == Random) { valueStr = F("RAND"); } else if (i == 1 && channels[displayTab - 1].mode == Sequencer) { valueStr = F("SEQ"); } else if (i == 1 && channels[displayTab - 1].mode == Swing) { valueStr = F("SWING"); } else if (i == 1 && channels[displayTab - 1].mode == Gate) { valueStr = F("GATE"); } else if (i == 2 && channels[displayTab - 1].mode == Clock) { //SubDiv and offset valueStr = String(channels[displayTab - 1].offset) + F("/"); int PulsesPerStep; if (subDivs[channels[displayTab - 1].subDiv] < 0) { PulsesPerStep = PPQN / subDivs[channels[displayTab - 1].subDiv] * -1 ; } else { PulsesPerStep = subDivs[channels[displayTab - 1].subDiv] * PPQN; } valueStr = valueStr + String(PulsesPerStep); //(playingModes[i] * PPQN) - 1 //String(channelPulsesPerCycle[displayTab-1]+1) } else if (i == 2 && (channels[displayTab - 1].mode == Random || channels[displayTab - 1].mode == Gate) && subDivs[channels[displayTab - 1].subDiv] > 0) { valueStr = F("/"); valueStr = valueStr + String(subDivs[channels[displayTab - 1].subDiv]); } else if (i == 2 && (channels[displayTab - 1].mode == Random || channels[displayTab - 1].mode == Gate) && subDivs[channels[displayTab - 1].subDiv] < 0) { valueStr = F("x"); valueStr = valueStr + String(abs(subDivs[channels[displayTab - 1].subDiv])); } else if (i == 3 && channels[displayTab - 1].CV1Target == 0 && channels[displayTab - 1].CV2Target == 0) { //MOD valueStr = F("OFF"); } else if (i == 3 && channels[displayTab - 1].CV1Target != 0 && channels[displayTab - 1].CV2Target == 0) { valueStr = F("CV1"); } else if (i == 3 && channels[displayTab - 1].CV1Target == 0 && channels[displayTab - 1].CV2Target != 0) { valueStr = F("CV2"); } if (i == 2 && channels[displayTab - 1].mode == Sequencer) { //EDIT PATTERN thing if (menuItem == i && insideTab) { u8g2.drawBox(leftOffset + 54, ((i-1) * 11), 11, 11); } } else { if (menuItem == i && insideTab && (menuItemSelected || shiftBtnPushed)) { u8g2.drawButtonUTF8(leftOffset + 37, 8 + (i-1) *11, U8G2_BTN_BW1, 26, 2, 2, valueStr.c_str() ); } else if (menuItem == i && insideTab && (!menuItemSelected || !shiftBtnPushed)) { u8g2.drawButtonUTF8(leftOffset + 37, 8 + (i-1) *11, U8G2_BTN_BW1|U8G2_BTN_INV, 26, 2, 2, valueStr.c_str() ); } else { u8g2.drawButtonUTF8(leftOffset + 37, 8 + (i-1) *11, U8G2_BTN_BW0, 26, 2, 2, valueStr.c_str() ); } } } //Main Param leftOffset = 29; width = 55; if (channels[displayTab - 1].mode == Clock) { valueStr = F("SUBDIVISION"); } else if (channels[displayTab - 1].mode == Random) { valueStr = F("SKIP CHANCE"); } else if (channels[displayTab - 1].mode == Sequencer) { valueStr = F("PATTERN"); } else if (channels[displayTab - 1].mode == Swing) { valueStr = F("SWING"); } else if (channels[displayTab - 1].mode == Gate) { valueStr = gateLengthTime[displayTab - 1]; } if ((!insideTab && shiftBtnPushed) || (insideTab && menuItem == 0)) { u8g2.drawButtonUTF8(leftOffset, 41, U8G2_BTN_BW1|U8G2_BTN_INV|U8G2_BTN_HCENTER, width, 0, 3, valueStr.c_str() ); } else { u8g2.drawButtonUTF8(leftOffset, 41, U8G2_BTN_BW0|U8G2_BTN_HCENTER, width, 1, 2, valueStr.c_str() ); } if (channels[displayTab - 1].mode == Clock) { if (subDivs[channels[displayTab - 1].subDiv] > 0) { valueStr = F("/"); } else { valueStr = F("x"); } valueStr = valueStr + String(abs(subDivs[channels[displayTab - 1].subDiv])); } else if (channels[displayTab - 1].mode == Random) { valueStr = String(channels[displayTab - 1].random) + (channels[displayTab - 1].random == 0 ? "%" : "0%"); } else if (channels[displayTab - 1].mode == Sequencer) { if (channels[displayTab - 1].seqPattern < 8) { valueStr = F("A"); valueStr = valueStr + String(channels[displayTab - 1].seqPattern + 1); } else if (channels[displayTab - 1].seqPattern >= 8 && channels[displayTab - 1].seqPattern < 16) { valueStr = F("B"); valueStr = valueStr + String(channels[displayTab - 1].seqPattern - 7); } else if (channels[displayTab - 1].seqPattern >= 16 && channels[displayTab - 1].seqPattern < 24) { valueStr = F("C"); valueStr = valueStr + String(channels[displayTab - 1].seqPattern - 15); } else if (channels[displayTab - 1].seqPattern >= 24 && channels[displayTab - 1].seqPattern < 32) { valueStr = F("D"); valueStr = valueStr + String(channels[displayTab - 1].seqPattern - 23); } } else if (channels[displayTab - 1].mode == Swing) { uint8_t swingVals[6] = {50, 58, 66, 75, 83, 92}; valueStr = String(swingVals[channels[displayTab - 1].swing]) + "%"; } else if (channels[displayTab - 1].mode == Gate) { valueStr = String(channels[displayTab - 1].gate) + "%"; } u8g2.setFont(stkL); if ((!insideTab && shiftBtnPushed) || (insideTab && menuItem == 0 && (menuItemSelected || shiftBtnPushed))) { u8g2.drawButtonUTF8(leftOffset, 28, U8G2_BTN_BW1|U8G2_BTN_HCENTER, width, 0, 3, valueStr.c_str() ); } else if (insideTab && menuItem == 0 && !menuItemSelected) { u8g2.drawButtonUTF8(leftOffset, 28, U8G2_BTN_BW1|U8G2_BTN_INV|U8G2_BTN_HCENTER, width, 0, 3, valueStr.c_str() ); } else { u8g2.drawButtonUTF8(leftOffset, 28, U8G2_BTN_BW0|U8G2_BTN_HCENTER, width, 0, 3, valueStr.c_str() ); } } //Tabs u8g2.drawHLine(0, 53, 128); u8g2.setFont(stkS); uint8_t yPos = 61; uint8_t xWidth = 12; valueStr = F("w"); if (displayTab == 0) { if (insideTab == true || shiftBtnPushed == true) { u8g2.drawButtonUTF8(xWidth/2, yPos, U8G2_BTN_BW1|U8G2_BTN_HCENTER, xWidth-2, 0, 2, valueStr.c_str() ); } else { u8g2.drawButtonUTF8(xWidth/2, yPos, U8G2_BTN_BW1|U8G2_BTN_INV|U8G2_BTN_HCENTER, xWidth-2, 0, 2, valueStr.c_str() ); } } else { u8g2.drawButtonUTF8(xWidth/2, yPos, U8G2_BTN_BW0|U8G2_BTN_HCENTER, xWidth, 0, 2, valueStr.c_str() ); } for (uint8_t i = 1; i <= (extraChannel ? 7 : 6); i++) { valueStr = String(i); if (displayTab == i) { if (insideTab == true || shiftBtnPushed == true) { u8g2.drawButtonUTF8(i*xWidth + xWidth/2, yPos, U8G2_BTN_BW1|U8G2_BTN_HCENTER, xWidth-2, 0, 2, valueStr.c_str()); } else { u8g2.drawButtonUTF8(i*xWidth + xWidth/2, yPos, U8G2_BTN_BW1|U8G2_BTN_INV|U8G2_BTN_HCENTER, xWidth-2, 0, 2, valueStr.c_str()); } } else { u8g2.drawButtonUTF8(i*xWidth + xWidth/2, yPos, U8G2_BTN_BW0|U8G2_BTN_HCENTER, xWidth, 0, 2, valueStr.c_str()); } } if (masterClockMode == 0 && !isPlaying) { valueStr = F("t"); u8g2.drawUTF8(121, yPos, valueStr.c_str() ); } else if (masterClockMode == 0 && isPlaying) { valueStr = F("r"); u8g2.drawUTF8(122, yPos, valueStr.c_str() ); } } //Edit Pattern Screen (Sequencer) else if (displayScreen == 1) { u8g2.setFont(stkS); uint8_t pattern = channels[displayTab - 1].seqPattern; if (pattern < 8) { valueStr = F("PATTERN A"); valueStr = valueStr + String(pattern + 1); } else { valueStr = F("PATTERN B"); valueStr = valueStr + String(pattern - 7); } u8g2.drawUTF8(8, 6, valueStr.c_str() ); valueStr = F("L: "); //u8g2.drawUTF8(100, 5, valueStr.c_str() ); if (!isRecording && stepNumSelected == -1) { u8g2.drawButtonUTF8(97, 6, U8G2_BTN_BW1|U8G2_BTN_INV, 5, 1, 2, valueStr.c_str() ); } else { u8g2.drawButtonUTF8(97, 6, U8G2_BTN_BW0, 5, 1, 2, valueStr.c_str() ); } valueStr = String(sequences[patternToEdit].length + 1); //u8g2.drawUTF8(110, 5, valueStr.c_str() ); if (!isRecording && stepNumSelected == -1 && (menuItemSelected || shiftBtnPushed)) { u8g2.drawButtonUTF8(110, 6, U8G2_BTN_BW1, 8, 1, 2, valueStr.c_str() ); } else if (!isRecording && stepNumSelected == -1 && (!menuItemSelected || !shiftBtnPushed)) { u8g2.drawButtonUTF8(110, 6, U8G2_BTN_BW1|U8G2_BTN_INV, 8, 1, 2, valueStr.c_str() ); } else { u8g2.drawButtonUTF8(110, 6, U8G2_BTN_BW0, 8, 1, 2, valueStr.c_str() ); } u8g2.drawHLine(0, 8, 128); for (uint8_t i = 0; i <= sequences[patternToEdit].length; i++) { u8g2.drawUTF8(19 + (i % 8)*12, 33 - ((sequences[patternToEdit].length / 8) * 5) + ((i / 8) * 11), (bitRead(sequences[patternToEdit].sequence, i) ? "q" : "p")); } if (!isRecording && stepNumSelected >= 0) { u8g2.drawFrame(16 + (stepNumSelected % 8)*12, 25 - ((sequences[patternToEdit].length / 8) * 5) + ((stepNumSelected / 8) * 11), 11, 11); //cursor } if (isRecording) { valueStr = F("RECORDING"); u8g2.drawButtonUTF8(64, 62, U8G2_BTN_BW1|U8G2_BTN_HCENTER|U8G2_BTN_INV, 50, 0, 2, valueStr.c_str() ); } } //Settings Screen else if (displayScreen == 2) { valueStr = F("SETTINGS"); u8g2.drawStr(8, 5, valueStr.c_str() ); u8g2.drawStr(122 - (u8g2.getStrWidth(version.c_str())), 5, version.c_str() ); u8g2.drawHLine(0, 8, 128); lastMenuItem = 4; uint8_t width = 112; for (uint8_t i = 0; i <= lastMenuItem; i++) { switch(i) { case 0: valueStr = F("CALIBRATE CV INS"); break; case 1: valueStr = F("ROTATE SCREEN"); break; case 2: valueStr = F("REVERSE ENCODER"); break; case 3: valueStr = (extraChannel ? F("7TH CHANNEL: ON") : F("7TH CHANNEL: OFF")); break; case 4: valueStr = F("FACTORY RESET"); break; }; if (menuItem == i) { u8g2.drawButtonUTF8(8, 19 + (i*11), U8G2_BTN_BW0|U8G2_BTN_INV, width, 2, 3, valueStr.c_str() ); } else { u8g2.drawButtonUTF8(8, 19 + (i*11), U8G2_BTN_BW0, width, 2, 3, valueStr.c_str() ); } } } if (showDone) { //u8g2.clear(); u8g2.setDrawColor(0); u8g2.setFontMode(0); u8g2.drawBox(18,13,93,32); u8g2.drawBox(18,16,96,30); u8g2.setDrawColor(1); valueStr = F("DONE"); u8g2.drawButtonUTF8(64, 32, U8G2_BTN_BW1|U8G2_BTN_HCENTER|U8G2_BTN_SHADOW2|U8G2_BTN_INV, 64, 12, 12, valueStr.c_str() ); } } while ( u8g2.nextPage() ); }