diff --git a/.gitignore b/.gitignore index 7b24d82..3272996 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ software/.DS_Store Hardware/gtoe/gtoe-backups Hardware/gtoe/fp-info-cache Hardware/gtoe/#auto_saved_files# + +README.MD.backup diff --git a/README.MD b/README.MD deleted file mode 100644 index 762e120..0000000 --- a/README.MD +++ /dev/null @@ -1,21 +0,0 @@ -Features: -- 6 output channels -- Master BPM -- Separate divider or multiplier per chennel (from /32 to x24) -- Random (currently only for on beat pulses) -- 1 input for external modulation (currently hardcoded to channel 6) - -TODO: -- random for any division (long press encoder) -- External clock -- Switch to U8G2 for screen -- Save state to EEPROM when stopped -- swing -- settings (input mode, pulse length, modulation targets) -- Design PCB - -Timer library available here -https://github.com/PaulStoffregen/FlexiTimer2 - -KiCad SSD1306 display component -https://github.com/pforrmi/KiCad-SSD1306-128x64 \ No newline at end of file diff --git a/software/GToE/GToE.ino b/software/GToE/GToE.ino index c299354..722820d 100644 --- a/software/GToE/GToE.ino +++ b/software/GToE/GToE.ino @@ -19,12 +19,14 @@ #define ENC_D2_PIN 3 #define START_STOP_BTN_PIN 14 #define ANALOGUE_INPUT_1_PIN A1 +#define ANALOGUE_INPUT_2_PIN A1 const int outsPins[6] = {5, 6, 7, 8, 9, 10}; -const int outsModes[21] = {-24, -16, -12, -8, -6, -4, -3, -2, -1, 0, 1, 1.5, 2, 3, 4, 5, 6, 7, 8, 16, 32}; //positive - divide, negative - multiply, 0 - off -int outsModeIndex[6] = {7, 7, 9, 9, 9, 9}; //10 - /1, 9 - off -bool outsModeRandom[6] = {0,0,0,0,0,0}; +const int outsModes[18] = {-24, -16, -12, -8, -6, -4, -3, -2, 1, 2, 3, 4, 5, 6, 7, 8, 16, 32}; //positive - divide, negative - multiply, 0 - off +int outsModeIndex[6] = {8, 9, 10, 7, 6, 6}; //10 - /1, 9 - off +bool outsRandom[6] = {0,0,0,0,0,1}; +bool outsMod[6] = {0,0,0,0,0,1}; //0 - A1, 1 - A2 int outsPeriods[6]; int outsClocksCounts[6]; int outsModesPlay[6]; //actual channel modes array updated from outsModeIndex each beat @@ -50,6 +52,7 @@ bool needToChangeTab = 0; bool buttonPushed = false; int a1Input = 0; +int a2Input = 0; bool changesSaved; @@ -93,16 +96,25 @@ void internalClock() { // Action on each pulse if (pulseClockCount == 0 && !pulseCounted) { + //modulation + for (int i = 0; i<6; i++) { + if (!outsMod[i]) { + outsModesPlay[i] = outsModes[outsModeIndex[i] - a1Input]; + } else { + outsModesPlay[i] = outsModes[outsModeIndex[i] - a2Input]; + } + } + //divider if (pulseCount == 0 && !beatCounted) { for (int i = 0; i<6; i++) { outsModesPlay[i] = outsModes[outsModeIndex[i]]; //updated here to prevent sync problems for multipliers - if (a1Input != 0 && i == 5) { //TESTING THE MODULATION ON 6th CHANNEL + /*if (a1Input != 0 && i == 5) { //TESTING THE MODULATION ON 6th CHANNEL outsModesPlay[i] = outsModes[outsModeIndex[i] - a1Input]; - } + }*/ if (outsModesPlay[i] > 0) { if (outsClocksCounts[i] == 0) { //Pulse on 0 - if (outsModeRandom[i] == 0 || (outsModeRandom[i] == 1 && random(2))) { //random + if (outsRandom[i] == 0 || (outsRandom[i] == 1 && random(2))) { //random digitalWrite(outsPins[i], HIGH); } } @@ -120,7 +132,7 @@ void internalClock() { for (int i = 0; i<6; i++) { if (outsModesPlay[i] < 0) { if (outsClocksCounts[i] == 0) { //Pulse on 0 - if (outsModeRandom[i] == 0 || (outsModeRandom[i] == 1 && random(2))) { //random + if (outsRandom[i] == 0 || (outsRandom[i] == 1 && random(2))) { //random digitalWrite(outsPins[i], HIGH); } } @@ -187,7 +199,7 @@ void checkInputs() { encReleasedTime = millis(); Serial.println(encReleasedTime - encPressedTime); - if (encReleasedTime - encPressedTime < 500) { // press shorter than .5s + if (encReleasedTime - encPressedTime < 500) { // press shorter than .5s switches tabs displayTabOld = displayTab; displayTab++; if (displayTab>6) { @@ -195,25 +207,12 @@ void checkInputs() { } needToChangeTab = 0; updateScreen(); - } else if (displayTab != 0) { // long press switches random mode - outsModeRandom[displayTab-1] = !outsModeRandom[displayTab-1]; + } else if (encReleasedTime - encPressedTime < 2000 && displayTab != 0) { // longer press (<2s) and switches random mode, longer than 2s presses are ignored + outsRandom[displayTab-1] = !outsRandom[displayTab-1]; updateScreen(); } } -/* - if (needToChangeTab == 0 && digitalRead(ENC_BTN_PIN) == 0) { - needToChangeTab = 1; - } else if (needToChangeTab == 1 && digitalRead(ENC_BTN_PIN) == 1) { - displayTabOld = displayTab; - displayTab++; - if (displayTab>6) { - displayTab = 0; - } - needToChangeTab = 0; - updateScreen(); - }*/ - //encoder encoder.tick(); int encPosition = encoder.getPosition(); @@ -228,7 +227,7 @@ void checkInputs() { } updatePeriod(); } else { - outsModeIndex[displayTab-1] = outsModeIndex[displayTab-1] + change; + outsModeIndex[displayTab-1] = outsModeIndex[displayTab-1] - change; if (outsModeIndex[displayTab-1] < 0) { outsModeIndex[displayTab-1] = 0; } else if (outsModeIndex[displayTab-1] > (sizeof(outsModes)/sizeof(int)) - 1) { @@ -251,7 +250,12 @@ void checkInputs() { //modulations a1Input = analogRead(ANALOGUE_INPUT_1_PIN); - a1Input = map (a1Input, 0, 1023, 0, 4); + + a1Input = map (a1Input, 5, 1023, 0, 4); + a2Input = analogRead(ANALOGUE_INPUT_2_PIN); + Serial.println(a2Input); + a2Input = map (a2Input, 5, 1023, 0, 4); + } void updateScreen() { @@ -314,9 +318,21 @@ void updateScreen() { display.println(); //Extra params - display.setTextSize(1); - if (displayTab != 0 && outsModeRandom[displayTab-1] == 1) { - display.print(F("RANDOM")); + display.setTextSize(1); + display.print(F("RND:")); + if (displayTab != 0) { + if (outsRandom[displayTab-1]) { + display.print(F("On")); + } else { + display.print(F("Off")); + } + display.setCursor(64,50); + display.print(F("MOD:")); + if (outsMod[displayTab-1]) { + display.print(F("A2 ")); + } else { + display.print(F("A1 ")); + } } display.display();