void updateScreen() { u8g2.firstPage(); do { byte leftOffset; byte width; String valueStr; u8g2.setDrawColor(1); if (displayScreen == 0) { //BPM Tab if (displayTab == 0) { //BPM u8g2.setFont(velvetscreen); //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 (byte 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 (byte 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(velvetscreen); 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(velvetscreen); 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(velvetscreen); 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 == 3) { lastMenuItem = 1; } else if (channels[displayTab - 1].mode == 4) { lastMenuItem = 2; } else { lastMenuItem = 3; } width = 32; leftOffset = 62; for (byte i = 1; i <= lastMenuItem; i++) { if (i == 1) { valueStr = F("MODE:"); } else if (i == 2 && channels[displayTab - 1].mode == 0) { valueStr = F("OFFSET:"); } else if (i == 2 && (channels[displayTab - 1].mode == 1 || channels[displayTab - 1].mode == 4)) { valueStr = F("SUBDIV:"); } else if (i == 2 && channels[displayTab - 1].mode == 2) { valueStr = F("EDIT PATTERN"); } 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 (byte i = 1; i <= lastMenuItem; i++) { if (i == 1 && channels[displayTab - 1].mode == 0) { //Channel mode valueStr = F("CLOCK"); } else if (i == 1 && channels[displayTab - 1].mode == 1) { valueStr = F("RAND"); } else if (i == 1 && channels[displayTab - 1].mode == 2) { valueStr = F("SEQ"); } else if (i == 1 && channels[displayTab - 1].mode == 3) { valueStr = F("SWING"); } else if (i == 1 && channels[displayTab - 1].mode == 4) { valueStr = F("GATE"); } else if (i == 2 && channels[displayTab - 1].mode == 0) { //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 == 1 || channels[displayTab - 1].mode == 4) && subDivs[channels[displayTab - 1].subDiv] > 0) { valueStr = F("/"); valueStr = valueStr + String(subDivs[channels[displayTab - 1].subDiv]); } else if (i == 2 && (channels[displayTab - 1].mode == 1 || channels[displayTab - 1].mode == 4) && 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 == 2) { //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 == 0) { valueStr = F("SUBDIVISION"); } else if (channels[displayTab - 1].mode == 1) { valueStr = F("SKIP CHANCE"); } else if (channels[displayTab - 1].mode == 2) { valueStr = F("PATTERN"); } else if (channels[displayTab - 1].mode == 3) { valueStr = F("SWING"); } else if (channels[displayTab - 1].mode == 4) { valueStr = F("PULSES"); } 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 == 0) { 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 == 1) { valueStr = String(channels[displayTab - 1].random) + "0%"; } else if (channels[displayTab - 1].mode == 2) { if (channels[displayTab - 1].seqPattern < 8) { valueStr = F("A"); valueStr = valueStr + String(channels[displayTab - 1].seqPattern + 1); } else { valueStr = F("B"); valueStr = valueStr + String(channels[displayTab - 1].seqPattern - 7); } } else if (channels[displayTab - 1].mode == 3) { byte swingVals[6] = {50, 54, 58, 62, 66, 71}; valueStr = String(swingVals[channels[displayTab - 1].swing]) + "%"; } else if (channels[displayTab - 1].mode == 4) { 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(velvetscreen); byte yPos = 61; byte 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 (int i = 1; i <= 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(velvetscreen); byte 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.drawButtonUTF8(64, 5, U8G2_BTN_BW1|U8G2_BTN_HCENTER, 128, 0, 2, valueStr.c_str() ); for (byte i = 0; i < 8; i++) { if (patternToEdit[i]) { u8g2.drawUTF8(19 + i*12, 24, "q"); } else { u8g2.drawUTF8(19 + i*12, 24, "p"); } } for (byte i = 8; i < 16; i++) { if (patternToEdit[i]) { u8g2.drawUTF8(19 + (i-8)*12, 40, "q"); } else { u8g2.drawUTF8(19 + (i-8)*12, 40, "p"); } } if (!isRecording) { if (stepNumSelected < 8 ) { u8g2.drawFrame(16 + stepNumSelected * 12, 16, 11, 11); } else { u8g2.drawFrame(16 + (stepNumSelected-8) * 12, 32, 11, 11); } } 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 = 3; byte width = 112; for (byte 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 = 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() ); }