From 147d7adbafd8eaa293a04b239fbecbf9bd2f28fa Mon Sep 17 00:00:00 2001 From: Dennis Gunia Date: Thu, 21 Jul 2022 15:35:09 +0200 Subject: [PATCH] firmware update --- Firmware/TREM_test/TREM_test.ino | 136 +++++++++++++++++++++++++++---- 1 file changed, 120 insertions(+), 16 deletions(-) diff --git a/Firmware/TREM_test/TREM_test.ino b/Firmware/TREM_test/TREM_test.ino index 30c58e0..f0989aa 100644 --- a/Firmware/TREM_test/TREM_test.ino +++ b/Firmware/TREM_test/TREM_test.ino @@ -47,29 +47,68 @@ static const uint8_t bumpLUT[256] PROGMEM = { 50, 47, 44, 41, 38, 35, 32, 29, 25, 22, 19, 16, 13, 10, 7, 4 }; +//Rate Modifier Ranges + /* 0 + * 114 + * 228 + * 341 + * 512 + * 683 + * 796 + * 910 + * 1024 + */ + +#define RM_NOTCHES_WIDTH 48 + +#define RM_N0_MID 0 +#define RM_N1_MID 128 +#define RM_N2_MID 256 +#define RM_N3_MID 384 +#define RM_N4_MID 512 +#define RM_N5_MID 640 +#define RM_N6_MID 768 +#define RM_N7_MID 896 +#define RM_N8_MID 1024 + + + + //Waveform Constants #define WF_SAW 1 #define WF_SINE 2 #define WF_SQUARE 4 +#define TS_TAP 0 +#define TS_POT 1 + int depth = 0; -unsigned long delayTime = 1; +unsigned long delayTime = 4000; +unsigned long delayTimeOUT = 4000; uint8_t waveform = WF_SINE; - +uint8_t tempoSource = TS_TAP; uint8_t symetry = 127; +double modifier = 4; uint16_t wfStep = 0; +int potTempoLast = 0; -unsigned long lastStep = millis(); -unsigned long lastTest = millis(); + + +double bpm = 60; + +unsigned long lastStep = lmicros(); +unsigned long lastTest = lmicros(); + +unsigned long lastTap = 0; //IO Pin Definition -#define PIN_A_RATE A1 //Pot Rate -#define PIN_A_DEPTH A2 //Pot Depth -#define PIN_A_SHAPE A0 //Pot Shape +#define PIN_A_RATE A0 //Pot Rate +#define PIN_A_DEPTH A1 //Pot Depth +#define PIN_A_SHAPE A2 //Pot Shape #define PIN_A_MUL A3 //Pot Clock-Modifier -#define PIN_D_WF1 7 //Waveform Switch Pole 1 -#define PIN_D_WF2 10 //Waveform Switch Pole 2 +#define PIN_D_WF1 10 //Waveform Switch Pole 1 +#define PIN_D_WF2 7 //Waveform Switch Pole 2 #define PIN_D_TAP 9 //Tap Tempo Push button #define PIN_D_MOD 8 //Tempo Modulation Switch @@ -87,33 +126,98 @@ void setup() { pinMode(PIN_D_WF2, INPUT_PULLUP); pinMode(PIN_D_TAP, INPUT_PULLUP); pinMode(PIN_D_MOD, INPUT_PULLUP); + + //enable pin change interrupt + GIMSK = 0b00100000; + PCMSK1 = 0b00000010; + MCUCR &= 0b00000011; + MCUCR |= 0b00000010; } +uint8_t pstate = 0; + +ISR(PCINT1_vect) { + if (lastTap > lmicros() - 800000 ){ //debounce + return; + } + if (pstate == 0){ + pstate = 1; + }else{ + pstate = 0; + return; + } + + //delayTime = 500; + if (lastTap == 0){ + lastTap = lmicros(); + }else{ + delayTime = (lmicros() - lastTap)/256; + lastTap = lmicros(); + wfStep = 0; + tempoSource = TS_TAP; + } +} + + //Read pots and switch state void getInput() { - depth = analogRead(PIN_A_DEPTH) / 4; + depth = 255 - (analogRead(PIN_A_DEPTH) / 4); //delayTime = map(analogRead(A1),0,1023,5000,20000); - delayTime = map(analogRead(PIN_A_RATE), 0, 1023, 0, 40000); ; + int raw = analogRead(PIN_A_RATE); + if (tempoSource == TS_POT){ + delayTime = map(raw, 0, 1023, 0, 40000) * 8; + + potTempoLast = raw; + }else{ + if (potTempoLast < (raw - 16)) {tempoSource = TS_POT;} + if (potTempoLast > (raw + 16)) {tempoSource = TS_POT;} + } symetry = map(analogRead(PIN_A_SHAPE), 0, 1023, 4, 251); ; - waveform = WF_SINE; + //float secFracion = 1/((float)bpm*256); + //delayTime = secFracion*10000000; + + waveform = WF_SAW; if (digitalRead(PIN_D_WF1) == LOW) { waveform = WF_SQUARE; } if (digitalRead(PIN_D_WF2) == LOW) { - waveform = WF_SAW; + waveform = WF_SINE; } + + //rate modifier + raw = analogRead(PIN_A_MUL); + if (raw >= 0 && raw <= RM_N0_MID + RM_NOTCHES_WIDTH) {modifier = 16;} + if (raw >= RM_N1_MID - RM_NOTCHES_WIDTH && raw <= RM_N1_MID + RM_NOTCHES_WIDTH) {modifier = 8;} + if (raw >= RM_N2_MID - RM_NOTCHES_WIDTH && raw <= RM_N2_MID + RM_NOTCHES_WIDTH) {modifier = 4;} + if (raw >= RM_N3_MID - RM_NOTCHES_WIDTH && raw <= RM_N3_MID + RM_NOTCHES_WIDTH) {modifier = 2;} + if (raw >= RM_N4_MID - RM_NOTCHES_WIDTH && raw <= RM_N4_MID + RM_NOTCHES_WIDTH) {modifier = 1;} + if (raw >= RM_N5_MID - RM_NOTCHES_WIDTH && raw <= RM_N5_MID + RM_NOTCHES_WIDTH) {modifier = 0.5;} + if (raw >= RM_N6_MID - RM_NOTCHES_WIDTH && raw <= RM_N6_MID + RM_NOTCHES_WIDTH) {modifier = 0.25;} + if (raw >= RM_N7_MID - RM_NOTCHES_WIDTH && raw <= RM_N7_MID + RM_NOTCHES_WIDTH) {modifier = 0.125;} + if (raw >= RM_N8_MID && raw <= 1024) {modifier = 0.0625;} + + applySppedMod(); + +} + +void applySppedMod(){ + if (digitalRead(PIN_D_MOD) == HIGH) { + delayTimeOUT = delayTime*modifier; + }else{ + delayTimeOUT = delayTime; + } } void loop() { - unsigned long millisNow = lmicros() / 8; //Timestamp NOW + unsigned long millisNow = lmicros() ; //Timestamp NOW - if (lastTest + 100 < millisNow) { //Get panel state every 100ms + if (lastTest < millisNow - 800) { //Get panel state every 100ms lastTest = millisNow; getInput(); } - if (lastStep < millisNow - delayTime) { //do waveform stuff + if (lastStep < millisNow - delayTimeOUT) { //do waveform stuff wfStep ++; if (wfStep > 255) wfStep = 0; lastStep = millisNow;