feat: Display CV-modulated parameter values in the UI and trigger redraws when relevant CV inputs change.

This commit is contained in:
2026-03-18 12:36:34 -07:00
parent 37711bc6ef
commit 59fbd37524

View File

@ -475,29 +475,46 @@ void DisplayMainArea() {
if (selected_slot > 0) { if (selected_slot > 0) {
PatternState &p = patterns[active_pattern]; 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) { switch (current_param) {
case PARAM_KICK_DENS: 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"; subText = "KICK DENS";
break; break;
case PARAM_SNARE_DENS: 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"; subText = "SNAR DENS";
break; break;
case PARAM_HIHAT_DENS: 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"; subText = "HHAT DENS";
break; break;
case PARAM_CHAOS: case PARAM_CHAOS:
mainText = String(map(p.chaos_amount, 0, 255, 0, 100)) + "%"; mainText = String(map(act_val, 0, 255, 0, 100)) + "%";
subText = "CHAOS"; subText = "CHAOS";
break; break;
case PARAM_MAP_X: case PARAM_MAP_X:
mainText = String(p.map_x); mainText = String(act_val);
subText = "MAP X"; subText = "MAP X";
break; break;
case PARAM_MAP_Y: case PARAM_MAP_Y:
mainText = String(p.map_y); mainText = String(act_val);
subText = "MAP Y"; subText = "MAP Y";
break; break;
default: default:
@ -633,11 +650,33 @@ void setup() {
void loop() { void loop() {
gravity.Process(); gravity.Process();
// Apply CV modulation static int last_cv1_val = 0;
// CV1 modulates Map X, CV2 modulates Chaos static int last_cv2_val = 0;
cv1_val = gravity.cv1.Read(); // -512 to 512 cv1_val = gravity.cv1.Read(); // -512 to 512
cv2_val = gravity.cv2.Read(); 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)) { if (eeprom_needs_save && (millis() - last_param_change > SAVE_DELAY_MS)) {
SaveState(); SaveState();
eeprom_needs_save = false; eeprom_needs_save = false;