diff --git a/firmware/Rhythm/Rhythm.ino b/firmware/Rhythm/Rhythm.ino index a6a028f..b4e33a4 100644 --- a/firmware/Rhythm/Rhythm.ino +++ b/firmware/Rhythm/Rhythm.ino @@ -475,29 +475,46 @@ void DisplayMainArea() { if (selected_slot > 0) { PatternState &p = patterns[active_pattern]; + int act_val = 0; + switch (current_param) { + case PARAM_KICK_DENS: act_val = p.inst_density[0]; break; + case PARAM_SNARE_DENS: act_val = p.inst_density[1]; break; + case PARAM_HIHAT_DENS: act_val = p.inst_density[2]; break; + case PARAM_CHAOS: act_val = p.chaos_amount; break; + case PARAM_MAP_X: act_val = p.map_x; break; + case PARAM_MAP_Y: act_val = p.map_y; break; + default: break; + } + + if (!editing_param) { + if ((int)cv1_dest == (int)current_param + 1) act_val += cv1_val / 4; + if ((int)cv2_dest == (int)current_param + 1) act_val += cv2_val / 4; + act_val = constrain(act_val, 0, 255); + } + switch (current_param) { case PARAM_KICK_DENS: - mainText = String(map(p.inst_density[0], 0, 255, 0, 100)) + "%"; + mainText = String(map(act_val, 0, 255, 0, 100)) + "%"; subText = "KICK DENS"; break; case PARAM_SNARE_DENS: - mainText = String(map(p.inst_density[1], 0, 255, 0, 100)) + "%"; + mainText = String(map(act_val, 0, 255, 0, 100)) + "%"; subText = "SNAR DENS"; break; case PARAM_HIHAT_DENS: - mainText = String(map(p.inst_density[2], 0, 255, 0, 100)) + "%"; + mainText = String(map(act_val, 0, 255, 0, 100)) + "%"; subText = "HHAT DENS"; break; case PARAM_CHAOS: - mainText = String(map(p.chaos_amount, 0, 255, 0, 100)) + "%"; + mainText = String(map(act_val, 0, 255, 0, 100)) + "%"; subText = "CHAOS"; break; case PARAM_MAP_X: - mainText = String(p.map_x); + mainText = String(act_val); subText = "MAP X"; break; case PARAM_MAP_Y: - mainText = String(p.map_y); + mainText = String(act_val); subText = "MAP Y"; break; default: @@ -633,11 +650,33 @@ void setup() { void loop() { gravity.Process(); - // Apply CV modulation - // CV1 modulates Map X, CV2 modulates Chaos + static int last_cv1_val = 0; + static int last_cv2_val = 0; + cv1_val = gravity.cv1.Read(); // -512 to 512 cv2_val = gravity.cv2.Read(); + // Trigger redraw if we're not editing and the CV modulating the selected param changes + if (!editing_param && selected_slot > 0) { + if ((int)cv1_dest == (int)current_param + 1) { + if (abs(cv1_val - last_cv1_val) >= 4) { + needs_redraw = true; + last_cv1_val = cv1_val; + } + } else { + last_cv1_val = cv1_val; + } + + if ((int)cv2_dest == (int)current_param + 1) { + if (abs(cv2_val - last_cv2_val) >= 4) { + needs_redraw = true; + last_cv2_val = cv2_val; + } + } else { + last_cv2_val = cv2_val; + } + } + if (eeprom_needs_save && (millis() - last_param_change > SAVE_DELAY_MS)) { SaveState(); eeprom_needs_save = false;