Sequencer editor

This commit is contained in:
2023-08-01 23:21:17 +03:00
parent fb1436db18
commit 0744c199c7
3 changed files with 232 additions and 157 deletions

View File

@ -25,7 +25,6 @@
#define ANALOGUE_INPUT_2_PIN A6 #define ANALOGUE_INPUT_2_PIN A6
const byte outsPins[6] = { 7, 8, 10, 6, 9, 11 }; 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 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; 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 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 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 seqB8[16] = {1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0};
bool *currentSeq;
byte currentStep = 0; byte currentStep = 0;
byte stepNumSelected = 0;
bool *patternToEdit;
byte memCode = 'a'; //Change to different letter if you changed the data structure 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 playBtnPushed = false;
bool shiftBtnPushed = false; bool shiftBtnPushed = false;
int a1Input = 0; int a1Input = 0;
int a2Input = 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); 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); RotaryEncoder encoder(ENC_D1_PIN, ENC_D2_PIN, RotaryEncoder::LatchMode::TWO03);
const uint8_t velvetscreen[416] U8G2_FONT_SECTION("velvetscreen") = const uint8_t velvetscreen[437] 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:*" "\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"
"\251\134\251$(\6jn\252\14)\7j.\61%\5+\7\333ri%\0,\5Q*\2-\5K" "R\271RI(\6\252\334T\31)\7\252\134bJ\12+\7\233\345\322J\0,\5\221T\4-\5\213"
"\63\3.\5I*\1/\6d\366\261\15\60\10lv*\232I\1\61\6k\62\262\65\62\11l\66\33" "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"
"%\225G\0\63\11l\66\33%\215F\2\64\7l\66Q\16]\65\11l\66Co\64\22\0\66\11l" "\66J*\217\0\63\11\254l\66J\32\215\4\64\10\254l\242\34\272\0\65\11\254l\206\336h$\0\66"
"v*\257\230\24\0\67\10l\66#\307:\2\70\11lv*&\25\223\2\71\11lv*\246\235\24\0" "\11\254\354T^\61)\0\67\10\254lF\216u\4\70\11\254\354TL*&\5\71\11\254\354TL;"
":\5\331*)A\10lv*\216)\3B\11l\66+\216\24\207\0C\11lv*\352\230\24\0D" ")\0:\6\231UR\0A\10\254\354T\34S\6B\11\254lV\34)\216\4C\11\254\354T\324\61"
"\10l\66+\232#\1E\10l\66C\17=\2F\10l\66C\257\234\1G\10lv#\247\231\6H" ")\0D\10\254lV\64G\2E\10\254l\206\36z\4F\10\254l\206^\71\3G\11\254\354TN"
"\10l\66Q\216)\3I\5i*CJ\7l\366\265L\12K\11l\66Q%\231\312\0L\7l\66" "\63)\0H\10\254l\242\34S\6I\6\251T\206\0J\10\254\354k\231\24\0K\11\254l\242J\62"
"\271=\2M\11m:y\255\244u\0N\11m:y\252$w\0O\10lv*\232I\1P\11l" "\225\1L\7\254lr{\4M\11\255t\362ZI\353\0N\11\255t\362TI\356\0O\10\254\354T"
"\66+\216\224\63\0Q\10lv*Z\61\5R\10l\66+\216\324\14S\11lv##\215F\2T" "\64\223\2P\11\254lV\34)g\0Q\10\254\354T\264b\12R\10\254lV\34\251\31S\11\254\354"
"\7k\62+\266\0U\10l\66\321\231\24\0V\11m:Y\247\62\345\10W\12m:Y%\225T\27" "FF\32\215\4T\7\253dVl\1U\10\254l\242\63)\0V\11\255t\262Ne\312\21W\12\255"
"\0X\11l\66Q&\25e\0Y\12m:\71\325\31e\24\1Z\7k\62\63\225\3r\10k\62Q" "t\262J*\251.\0X\11\254l\242L*\312\0Y\12\255tr\252\63\312(\2Z\7\253df*"
"\15\25\1t\6m:\377\21w\11mz\253R#\247\5x\6[\62\251\3\0\0\0\4\377\377\0"; "\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() { void setup() {
@ -275,6 +275,7 @@ void sendTriggers() {
//16th notes for sequencer //16th notes for sequencer
if (sixteenthPulseCount == 0) { if (sixteenthPulseCount == 0) {
bool *currentSeq;
for (byte i = 0; i < 6; i++) { for (byte i = 0; i < 6; i++) {
if (channels[i].seqPattern == 0) { if (channels[i].seqPattern == 0) {
currentSeq = seqA1; currentSeq = seqA1;

View File

@ -9,12 +9,49 @@ void checkInputs() {
encReleasedTime = millis(); encReleasedTime = millis();
if (encReleasedTime - encPressedTime < 500) { // press shorter than .5s is for entering the submenu if (encReleasedTime - encPressedTime < 500) { // press shorter than .5s is for entering the submenu
if (insideTab == 0) { if (!insideTab) {
insideTab = 1; 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(); updateScreen();
} else if (encReleasedTime - encPressedTime < 2000) { // longer press (<2s) is for navigating back. longer than 2s presses are ignored } 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; insideTab = 0;
menuItem = 0; menuItem = 0;
} }
@ -27,6 +64,7 @@ void checkInputs() {
int encPosition = encoder.getPosition(); int encPosition = encoder.getPosition();
if (encPositionOld != encPosition) { if (encPositionOld != encPosition) {
int change = encPositionOld - encPosition; int change = encPositionOld - encPosition;
if (displayScreen == 0) {
if (!insideTab && !shiftBtnPushed) { //Change tab if (!insideTab && !shiftBtnPushed) { //Change tab
displayTab = displayTab + change; displayTab = displayTab + change;
if (displayTab > 100) { //to address "negative" numbers if (displayTab > 100) { //to address "negative" numbers
@ -66,8 +104,8 @@ void checkInputs() {
channels[displayTab - 1].seqPattern = channels[displayTab - 1].seqPattern + change; channels[displayTab - 1].seqPattern = channels[displayTab - 1].seqPattern + change;
if (channels[displayTab - 1].seqPattern > 100) { if (channels[displayTab - 1].seqPattern > 100) {
channels[displayTab - 1].seqPattern = 0; channels[displayTab - 1].seqPattern = 0;
} else if (channels[displayTab - 1].seqPattern > 16) { } else if (channels[displayTab - 1].seqPattern > 15) {
channels[displayTab - 1].seqPattern = 16; channels[displayTab - 1].seqPattern = 15;
} }
saveState(); saveState();
} }
@ -169,6 +207,14 @@ void checkInputs() {
} }
saveState(); saveState();
} }
} else if (displayScreen == 1) {
stepNumSelected = stepNumSelected + change;
if (stepNumSelected > 100) {
stepNumSelected = 15;
} else if (stepNumSelected > 15) {
stepNumSelected = 0;
}
}
updateScreen(); updateScreen();
encPositionOld = encPosition; encPositionOld = encPosition;
@ -190,6 +236,10 @@ void checkInputs() {
//shift button //shift button
if (!digitalRead(SHIFT_BTN_PIN) && !shiftBtnPushed) { if (!digitalRead(SHIFT_BTN_PIN) && !shiftBtnPushed) {
shiftBtnPushed = true; shiftBtnPushed = true;
if (displayScreen == 1) {
patternToEdit[stepNumSelected] = !patternToEdit[stepNumSelected];
saveState();
}
updateScreen(); updateScreen();
} else if (digitalRead(SHIFT_BTN_PIN) && shiftBtnPushed) { } else if (digitalRead(SHIFT_BTN_PIN) && shiftBtnPushed) {
shiftBtnPushed = false; shiftBtnPushed = false;

View File

@ -258,6 +258,30 @@ void updateScreen() {
u8g2.drawUTF8(122, yPos, "r"); 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() ); } while ( u8g2.nextPage() );
} }