diff --git a/Software/Gravity/Gravity.ino b/Software/Gravity/Gravity.ino index 8e32520..90bab64 100644 --- a/Software/Gravity/Gravity.ino +++ b/Software/Gravity/Gravity.ino @@ -1,11 +1,12 @@ #include +#include #include #include #include #include #include -#define VERSION "V:1.1.3B" +#define VERSION "V:1.1.3B3" byte memCode = 'D'; //Change to different letter if you changed the data structure @@ -50,7 +51,7 @@ bool rotateScreen = true; uint16_t CV1Calibration = 512; uint16_t CV2Calibration = 512; - +bool showDone = false; const int subDivs[20] = { -24, -12, -8, -6, -4, -3, -2, 1, 2, 3, 4, 5, 6, 7, 8, 16, 24, 32, 64, 128 }; //positive - divide, negative - multiply, 0 - off @@ -127,7 +128,6 @@ byte menuItem = 0; bool menuItemSelected = false; byte lastMenuItem = 3; byte displayScreen = 0; //0 - main, 1 - sequencer, 2 - settings -bool showDone = false; bool playBtnPushed = false; bool shiftBtnPushed = false; @@ -151,6 +151,7 @@ int extTriggerCount; //unsigned long lastInteractionTime; // used for display timeout 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::FOUR3); //Font const PROGMEM uint8_t velvetscreen[437] U8G2_FONT_SECTION("velvetscreen") = @@ -208,10 +209,7 @@ void setup() { } pinMode(clockOutPin, OUTPUT); - - pinMode(ENC_D1_PIN, INPUT_PULLUP); - pinMode(ENC_D2_PIN, INPUT_PULLUP); - + //Enabling PinChange Interrupts for the encoder //pins 17 (PC3/PCINT11) and 4 (PD4/PCINT20), ports C and D PCICR |= 0b00000110; @@ -226,7 +224,6 @@ void setup() { calculateCycles(); calculateBPMTiming(); - checkEncoderStatus(); resetClocks(); @@ -243,56 +240,10 @@ void loop() { //Encoder interrupts ISR (PCINT1_vect) { - checkEncoderStatus(); + encoder.tick(); } ISR (PCINT2_vect) { - checkEncoderStatus(); -} - -uint8_t encoderStatus; -uint32_t encoderCheckTime = 0; -uint32_t encoderTimeBetweenPulses = 0; -bool encoderDirectionOld; //0 = -, 1 = +, Old because current direction can be determined by encoderChange -int8_t encoderChange = 0; -//uint8_t encoderBurstCount = 0; - -void checkEncoderStatus() { - uint8_t newStatus = (digitalRead(ENC_D1_PIN) << 1) | digitalRead(ENC_D2_PIN); - switch(encoderStatus) { - case 0b00: - if (newStatus == 0b01) { - encoderChange++; - } else if (newStatus == 0b10) { - encoderChange--; - } - break; - case 0b01: - if (newStatus == 0b11) { - encoderChange++; - } else if (newStatus == 0b00) { - encoderChange--; - } - break; - case 0b11: - if (newStatus == 0b10) { - encoderChange++; - } else if (newStatus == 0b01) { - encoderChange--; - } - break; - case 0b10: - if (newStatus == 0b00) { - encoderChange++; - } else if (newStatus == 0b11) { - encoderChange--; - } - break; - } - encoderStatus = newStatus; - - uint32_t currentTime = millis(); - encoderTimeBetweenPulses = currentTime - encoderCheckTime; - encoderCheckTime = currentTime; + encoder.tick(); } void sendMIDIClock() { @@ -387,8 +338,8 @@ void externalClock() { //reset cycles if there were no pulses for a while if ((newExtPulseTime - lastExtPulseTime) > 125) { //125ms is 20bpm + resetClocks(); - sendMIDIStart(); } tickCount = 0; //to make things happen in the main clock function @@ -403,7 +354,6 @@ void externalClock() { } if ((newExtPulseTime - lastExtPulseTime) > 750) { resetClocks(); - sendMIDIStart(); extResetCountdown = 0; extTriggerCount = 0; } diff --git a/Software/Gravity/Interactions.ino b/Software/Gravity/Interactions.ino index 58c7cb0..9d6462e 100644 --- a/Software/Gravity/Interactions.ino +++ b/Software/Gravity/Interactions.ino @@ -87,31 +87,28 @@ void checkInputs() { updateScreen(); } - //encoder - if (encoderChange != 0) { - if (!reverseEnc) { - encoderChange = encoderChange * -1; + //encoder + //encoder.tick(); + int encPosition = encoder.getPosition(); + int encDirection = (int)(encoder.getDirection()); + if (encPositionOld != encPosition) { + int change = encPositionOld - encPosition; + if (reverseEnc) { + change = change * -1; } - - /*if (((encoderChange > 0) != encoderDirectionOld) && encoderTimeBetweenPulses < 60) { //filter out encoder "jumps". - encoderChange = 0; //Comented out because it seems like sometimes it was preventing normal scroll - } //if it works ok without it delete encoderDirectionOld var altogether - encoderDirectionOld = (encoderChange > 0);*/ - - //encoder acceleration - /*if (encoderTimeBetweenPulses < 15) { // <-- - encoderBurstCount++; - } else { - encoderBurstCount = 0; + unsigned long ms = encoder.getMillisBetweenRotations(); + /*if (encDirectionOld == encDirection && ms < 20) { //encoder acceleration + change = change * 5; + } else if (encDirectionOld == encDirection && ms < 80) { + change = change * 2; + } else */ if (encDirectionOld != encDirection && ms < 200) { //filter out encoder "jumps" + change = 0; } - if (encoderBurstCount > 3) { // <-- - encoderChange = encoderChange * 3; // <-- The three params need to be finetuned to feel natural - }*/ - + encDirectionOld = encDirection; if (displayScreen == 0) { byte channelCV; if (!insideTab && !shiftBtnPushed) { //Change tab - displayTab = displayTab + encoderChange; + displayTab = displayTab + change; if (displayTab > 100) { //to address "negative" numbers displayTab = 0; } else if (displayTab > 6) { @@ -121,7 +118,7 @@ void checkInputs() { || (insideTab && menuItem == 0 && (menuItemSelected || shiftBtnPushed))) && displayTab == 0 && masterClockMode == 0) { //Change BPM - bpm = bpm + encoderChange; + bpm = bpm + change; if (bpm > MAXBPM) { bpm = MAXBPM; } else if (bpm < MINBPM) { @@ -134,7 +131,7 @@ void checkInputs() { && (menuItemSelected || shiftBtnPushed))) && displayTab != 0 && channels[displayTab - 1].mode == 0) { - channels[displayTab - 1].subDiv = channels[displayTab - 1].subDiv -encoderChange; + channels[displayTab - 1].subDiv = channels[displayTab - 1].subDiv - change; //channels[displayTab - 1].offset = 0; if (channels[displayTab - 1].subDiv > 100) { channels[displayTab - 1].subDiv = 0; @@ -159,7 +156,7 @@ void checkInputs() { && (menuItemSelected || shiftBtnPushed))) && displayTab != 0 && channels[displayTab - 1].mode == 1) { //Change Random - channels[displayTab - 1].random = channels[displayTab - 1].random + encoderChange; + 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) { @@ -171,7 +168,7 @@ void checkInputs() { && (menuItemSelected || shiftBtnPushed))) && displayTab != 0 && channels[displayTab - 1].mode == 2) { //Change SEQ pattern - channels[displayTab - 1].seqPattern = channels[displayTab - 1].seqPattern + encoderChange; + 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) { @@ -179,7 +176,7 @@ void checkInputs() { } saveState(); } else if (insideTab && !shiftBtnPushed && !menuItemSelected) { - menuItem = menuItem + encoderChange; + menuItem = menuItem + change; if (menuItem > 100) { //for "negative" values menuItem = 0; } else if (menuItem > lastMenuItem) { @@ -193,7 +190,7 @@ void checkInputs() { isPlaying = false; } - masterClockMode = masterClockMode + encoderChange; + masterClockMode = masterClockMode + change; if (masterClockMode > 100) { masterClockMode = 0; } else if (masterClockMode > 2) { //Set to 1 to hide MIDI mode @@ -205,7 +202,7 @@ void checkInputs() { && displayTab == 0 && menuItem == 2 && masterClockMode == 0) { //Modulation channel - bpmModulationChannel = bpmModulationChannel + encoderChange; + bpmModulationChannel = bpmModulationChannel + change; if (bpmModulationChannel == 0 || bpmModulationChannel == 1) { bpmModulationRange = 1; } else if (bpmModulationChannel > 100) { @@ -220,7 +217,7 @@ void checkInputs() { && displayTab == 0 && menuItem == 2 && masterClockMode == 1) { //PPQN - extClockPPQN = extClockPPQN + encoderChange; + extClockPPQN = extClockPPQN + change; if (extClockPPQN > 100) { extClockPPQN = 0; } else if (extClockPPQN > 1) { @@ -231,7 +228,7 @@ void checkInputs() { && (menuItemSelected || shiftBtnPushed) && displayTab == 0 && menuItem == 3) { //Modulation range - bpmModulationRange = bpmModulationRange + encoderChange; + bpmModulationRange = bpmModulationRange + change; if (bpmModulationRange == 0) { bpmModulationRange = 1; } else if (bpmModulationRange > 100) { @@ -244,7 +241,7 @@ void checkInputs() { && (menuItemSelected || shiftBtnPushed) && displayTab != 0 && menuItem == 1) { //Channel Mode - channels[displayTab - 1].mode = channels[displayTab - 1].mode + encoderChange; + 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) { @@ -257,7 +254,7 @@ void checkInputs() { && (menuItemSelected || shiftBtnPushed) && displayTab != 0 && menuItem == 2 && channels[displayTab - 1].mode == 0) { //Offset - channels[displayTab - 1].offset = channels[displayTab - 1].offset + encoderChange; + channels[displayTab - 1].offset = channels[displayTab - 1].offset + change; if (channels[displayTab - 1].offset == 255) { // 0 - 1 for uint8 is 255 channels[displayTab - 1].offset = 0; } else if (channels[displayTab - 1].offset > channelPulsesPerCycle[displayTab-1]) { @@ -269,7 +266,7 @@ void checkInputs() { && displayTab != 0 && menuItem == 2 && channels[displayTab - 1].mode == 1) { //SUBDIV for RANDOM - channels[displayTab - 1].subDiv = channels[displayTab - 1].subDiv - encoderChange; + 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(int)) - 1) { @@ -291,7 +288,7 @@ void checkInputs() { } else { channelCV = 0; } - channelCV = channelCV + encoderChange; + channelCV = channelCV + change; if (channelCV == 0 || channelCV > 100) { channelCV = 0; channels[displayTab - 1].CV1Target = 0; @@ -313,7 +310,7 @@ void checkInputs() { } else { channelCV = 0; } - channelCV = channelCV + encoderChange; + channelCV = channelCV + change; if (channelCV == 0 || channelCV > 100) { channelCV = 0; channels[displayTab - 1].CV1Target = 0; @@ -335,7 +332,7 @@ void checkInputs() { } else { channelCV = 0; } - channelCV = channelCV + encoderChange; + channelCV = channelCV + change; if (channelCV == 0 || channelCV > 100) { channelCV = 0; channels[displayTab - 1].CV1Target = 0; @@ -351,14 +348,14 @@ void checkInputs() { saveState(); } } else if (displayScreen == 1 && !isRecording) { - stepNumSelected = stepNumSelected + encoderChange; + stepNumSelected = stepNumSelected + change; if (stepNumSelected > 100) { stepNumSelected = 15; } else if (stepNumSelected > 15) { stepNumSelected = 0; } } else if (displayScreen == 2 && !shiftBtnPushed) { - menuItem = menuItem + encoderChange; + menuItem = menuItem + change; if (menuItem > 100) { //for "negative" values menuItem = 0; } else if (menuItem > lastMenuItem) { @@ -367,8 +364,7 @@ void checkInputs() { } updateScreen(); - //encPositionOld = encPosition; - encoderChange = 0; + encPositionOld = encPosition; } //play button