diff --git a/sketch/sketch.ino b/sketch/sketch.ino index c525e2a..68ed089 100644 --- a/sketch/sketch.ino +++ b/sketch/sketch.ino @@ -20,6 +20,7 @@ float VOL = 0.5f; float ABS_VOL = 0.5f; //float decay = 1.0f; float decay = 0.99998f; +float decay_off = 0.9995f; Adafruit_SSD1306 display(OLED_W, OLED_H, &Wire); // ----- Menu Functions int sound = 0; //Default voice @@ -28,7 +29,7 @@ int sound_count = sizeof(sounds) / sizeof(sounds[0]); // Modes int mode = 0; -String mode_names[7] = { "Vol", "Sou", "Oct", "Env", "Arp", "ArpĪ”", "Arp"}; +String mode_names[7] = { "Volume", "Sound", "Octave", "Envel.", "ArpTyp", "ArpSpd", "ArpDir"}; int mode_count = sizeof(mode_names) / sizeof(mode_names[0]); // Octave @@ -90,6 +91,7 @@ struct Voice { float startFreq = 0; float phase1 = 0; float phase2 = 0; + float decay = decay; float env = 0; float amp = 0; long arp_time = 0; @@ -109,6 +111,7 @@ void noteOn(float freq) { v.arp_position = 0; v.phase1 = 0.5f; v.phase2 = 0.5f; + v.decay = decay; return; } } @@ -117,7 +120,8 @@ void noteOn(float freq) { void noteOff(float freq) { for (auto &v : voices) { if (v.active && fabs(v.startFreq - freq) < 0.01f) { - v.active = false; + //v.active = false; + v.decay = decay_off; } } } @@ -254,7 +258,7 @@ private: if (v.phase2 >= 1) v.phase2 -= 1; v.amp = v.env; - v.env *= decay; + v.env *= v.decay; if (v.env < 0.0005f) v.active = false; mix += osc * v.amp; @@ -461,11 +465,11 @@ void drawInfo() { // Show current menu mode display.setCursor(64, 6); - display.print("Set:"); - display.setCursor(100, 6); - display.print(mode_names[mode]); + display.print("Set:" + mode_names[mode]); display.setCursor(90, 18); display.print("Oct:" + String(octave)); + display.setCursor(40, 18); + display.print("Arp: "+ String((arpeggio ? "On" : "Off"))); } void updateOLED(uint16_t keys) {