diff --git a/Software/Gravity/Gravity.ino b/Software/Gravity/Gravity.ino index f1ece77..626e2e7 100644 --- a/Software/Gravity/Gravity.ino +++ b/Software/Gravity/Gravity.ino @@ -25,7 +25,6 @@ #define ANALOGUE_INPUT_2_PIN A6 const byte outsPins[6] = { 7, 8, 10, 6, 9, 11 }; - const int subDivs[17] = { -24, -12, -8, -6, -4, -3, -2, 1, 2, 3, 4, 5, 6, 7, 8, 16, 32 }; //positive - divide, negative - multiply, 0 - off byte bpm = 130; @@ -69,8 +68,9 @@ bool seqB5[16] = {1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0}; bool seqB6[16] = {0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0}; bool seqB7[16] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; bool seqB8[16] = {1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0}; -bool *currentSeq; byte currentStep = 0; +byte stepNumSelected = 0; +bool *patternToEdit; byte memCode = 'a'; //Change to different letter if you changed the data structure @@ -100,7 +100,6 @@ byte displayScreen = 0; //0 - main, 1 - sequencer, 2 - settings bool playBtnPushed = false; bool shiftBtnPushed = false; - int a1Input = 0; int a2Input = 0; @@ -114,20 +113,21 @@ bool encPressRegistered; U8G2_SSD1306_128X64_NONAME_2_HW_I2C u8g2(U8G2_R2, SCL, SDA, U8X8_PIN_NONE); RotaryEncoder encoder(ENC_D1_PIN, ENC_D2_PIN, RotaryEncoder::LatchMode::TWO03); -const uint8_t velvetscreen[416] U8G2_FONT_SECTION("velvetscreen") = - "\62\0\2\2\3\3\1\3\4\5\5\0\0\5\0\5\0\0\216\0\0\1\203 \4@:%\11m:*" - "\251\134\251$(\6jn\252\14)\7j.\61%\5+\7\333ri%\0,\5Q*\2-\5K" - "\63\3.\5I*\1/\6d\366\261\15\60\10lv*\232I\1\61\6k\62\262\65\62\11l\66\33" - "%\225G\0\63\11l\66\33%\215F\2\64\7l\66Q\16]\65\11l\66Co\64\22\0\66\11l" - "v*\257\230\24\0\67\10l\66#\307:\2\70\11lv*&\25\223\2\71\11lv*\246\235\24\0" - ":\5\331*)A\10lv*\216)\3B\11l\66+\216\24\207\0C\11lv*\352\230\24\0D" - "\10l\66+\232#\1E\10l\66C\17=\2F\10l\66C\257\234\1G\10lv#\247\231\6H" - "\10l\66Q\216)\3I\5i*CJ\7l\366\265L\12K\11l\66Q%\231\312\0L\7l\66" - "\271=\2M\11m:y\255\244u\0N\11m:y\252$w\0O\10lv*\232I\1P\11l" - "\66+\216\224\63\0Q\10lv*Z\61\5R\10l\66+\216\324\14S\11lv##\215F\2T" - "\7k\62+\266\0U\10l\66\321\231\24\0V\11m:Y\247\62\345\10W\12m:Y%\225T\27" - "\0X\11l\66Q&\25e\0Y\12m:\71\325\31e\24\1Z\7k\62\63\225\3r\10k\62Q" - "\15\25\1t\6m:\377\21w\11mz\253R#\247\5x\6[\62\251\3\0\0\0\4\377\377\0"; +const uint8_t velvetscreen[437] U8G2_FONT_SECTION("velvetscreen") = + "\64\0\2\2\3\3\2\3\4\5\5\0\0\5\0\5\0\0\221\0\0\1\230 \4\200\134%\11\255tT" + "R\271RI(\6\252\334T\31)\7\252\134bJ\12+\7\233\345\322J\0,\5\221T\4-\5\213" + "f\6.\5\211T\2/\6\244\354c\33\60\10\254\354T\64\223\2\61\7\353\354\222\254\6\62\11\254l" + "\66J*\217\0\63\11\254l\66J\32\215\4\64\10\254l\242\34\272\0\65\11\254l\206\336h$\0\66" + "\11\254\354T^\61)\0\67\10\254lF\216u\4\70\11\254\354TL*&\5\71\11\254\354TL;" + ")\0:\6\231UR\0A\10\254\354T\34S\6B\11\254lV\34)\216\4C\11\254\354T\324\61" + ")\0D\10\254lV\64G\2E\10\254l\206\36z\4F\10\254l\206^\71\3G\11\254\354TN" + "\63)\0H\10\254l\242\34S\6I\6\251T\206\0J\10\254\354k\231\24\0K\11\254l\242J\62" + "\225\1L\7\254lr{\4M\11\255t\362ZI\353\0N\11\255t\362TI\356\0O\10\254\354T" + "\64\223\2P\11\254lV\34)g\0Q\10\254\354T\264b\12R\10\254lV\34\251\31S\11\254\354" + "FF\32\215\4T\7\253dVl\1U\10\254l\242\63)\0V\11\255t\262Ne\312\21W\12\255" + "t\262J*\251.\0X\11\254l\242L*\312\0Y\12\255tr\252\63\312(\2Z\7\253df*" + "\7p\10\255\364V\266\323\2q\7\255\364\216\257\5r\10\253d\242\32*\2t\6\255t\376#w\11" + "\255\364V\245FN\13x\6\233dR\7\0\0\0\4\377\377\0"; void setup() { @@ -275,6 +275,7 @@ void sendTriggers() { //16th notes for sequencer if (sixteenthPulseCount == 0) { + bool *currentSeq; for (byte i = 0; i < 6; i++) { if (channels[i].seqPattern == 0) { currentSeq = seqA1; diff --git a/Software/Gravity/Interactions.ino b/Software/Gravity/Interactions.ino index 86ef2b6..e0cbc3f 100644 --- a/Software/Gravity/Interactions.ino +++ b/Software/Gravity/Interactions.ino @@ -9,12 +9,49 @@ void checkInputs() { encReleasedTime = millis(); if (encReleasedTime - encPressedTime < 500) { // press shorter than .5s is for entering the submenu - if (insideTab == 0) { + if (!insideTab) { insideTab = 1; - } + } else if (insideTab && channels[displayTab - 1].mode == 2 && menuItem == 1) { //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; + } updateScreen(); } else if (encReleasedTime - encPressedTime < 2000) { // longer press (<2s) is for navigating back. longer than 2s presses are ignored - if (insideTab == 1) { + if (displayScreen != 0) { + displayScreen = 0; + } else if (insideTab == 1) { insideTab = 0; menuItem = 0; } @@ -27,147 +64,156 @@ void checkInputs() { int encPosition = encoder.getPosition(); if (encPositionOld != encPosition) { int change = encPositionOld - encPosition; - if (!insideTab && !shiftBtnPushed) { //Change tab - displayTab = displayTab + change; - if (displayTab > 100) { //to address "negative" numbers - displayTab = 0; - } else if (displayTab > 6) { - displayTab = 6; + 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 && displayTab == 0 && masterClockMode == 0) { //Change BPM - bpm = bpm + change; - if (bpm > MAXBPM) { - bpm = MAXBPM; - } else if (bpm < MINBPM) { - bpm = MINBPM; + 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; + } + 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(); } - 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; + 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(); } - if (!isPlaying) { - calculateCycles(); + 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(); } - 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; + } else if (displayScreen == 1) { + stepNumSelected = stepNumSelected + change; + if (stepNumSelected > 100) { + stepNumSelected = 15; + } else if (stepNumSelected > 15) { + stepNumSelected = 0; } - 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 > 16) { - channels[displayTab - 1].seqPattern = 16; - } - 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; - } - 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(); } updateScreen(); @@ -190,6 +236,10 @@ void checkInputs() { //shift button if (!digitalRead(SHIFT_BTN_PIN) && !shiftBtnPushed) { shiftBtnPushed = true; + if (displayScreen == 1) { + patternToEdit[stepNumSelected] = !patternToEdit[stepNumSelected]; + saveState(); + } updateScreen(); } else if (digitalRead(SHIFT_BTN_PIN) && shiftBtnPushed) { shiftBtnPushed = false; diff --git a/Software/Gravity/UI.ino b/Software/Gravity/UI.ino index 3fbfdfa..a3dcd1e 100644 --- a/Software/Gravity/UI.ino +++ b/Software/Gravity/UI.ino @@ -257,7 +257,31 @@ void updateScreen() { } else { u8g2.drawUTF8(122, yPos, "r"); } - } + } + //Edit Pattern + else if (displayScreen == 1) { + + //patternToEdit = seqA4; + for (byte i = 0; i < 8; i++) { + if (patternToEdit[i]) { + u8g2.drawUTF8(19 + i*12, 20, "q"); + } else { + u8g2.drawUTF8(19 + i*12, 20, "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 (stepNumSelected < 8 ) { + u8g2.drawFrame(16 + stepNumSelected * 12, 12, 11, 11); + } else { + u8g2.drawFrame(16 + (stepNumSelected-8) * 12, 32, 11, 11); + } + } } while ( u8g2.nextPage() ); } \ No newline at end of file