From c0b15473e663269aad5d73ff36dba1127c939bf0 Mon Sep 17 00:00:00 2001 From: Ebbe Date: Mon, 23 Jun 2025 10:05:35 +0200 Subject: [PATCH] finished code Signed-off-by: Ebbe --- boot.py | 14 +++++++++ code.py | 94 ++++++++++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 93 insertions(+), 15 deletions(-) create mode 100644 boot.py diff --git a/boot.py b/boot.py new file mode 100644 index 0000000..ad600d1 --- /dev/null +++ b/boot.py @@ -0,0 +1,14 @@ +import storage +import usb_midi + +usb_midi.disable() # Disable USB MIDI temporarily for reconfiguration +usb_midi.set_names( + audio_control_interface_name="gMA3_ENC", +) +usb_midi.enable() + +storage.remount("/", readonly=False) +m = storage.getmount("/") +m.label = "gMA3_ENC" +storage.remount("/", readonly=False) +storage.enable_usb_drive() \ No newline at end of file diff --git a/code.py b/code.py index 59049a4..231902a 100644 --- a/code.py +++ b/code.py @@ -57,21 +57,42 @@ mode_toggle_note = 21 # Functions def encoder_sweep(direction): - sweep_order = [3, 4, 5, 6] if direction == "CW" else [6, 5, 4, 3] - for i in sweep_order: - led[i] = (255, 255, 255) - if direction == "CW" and i > 3: - led[i - 1] = (100, 100, 100) - elif direction == "CCW" and i < 6: - led[i + 1] = (100, 100, 100) - - time.sleep(0.02) + trail_length = 3 + delay = 0.03 # smoother transition + encoder_range = [3, 4, 5, 6] + if direction == "CCW": + encoder_range = list(reversed(encoder_range)) + + for i in range(len(encoder_range)): + for j in range(trail_length): + idx = i - j + if 0 <= idx < len(encoder_range): + blend_ratio = (trail_length - j) / trail_length # 1.0 to 0.33 + white = (255, 255, 255) + base_color = encoder_colors[current_encoder] + + # Blend white → base_color + blended = tuple( + int(white[k] * blend_ratio + base_color[k] * (1 - blend_ratio)) + for k in range(3) + ) + led[encoder_range[idx]] = blended + + time.sleep(delay) + + # Reset all encoder LEDs to base color at end + for i in encoder_range: led[i] = encoder_colors[current_encoder] - if direction == "CW" and i > 3: - led[i - 1] = encoder_colors[current_encoder] - elif direction == "CCW" and i < 6: - led[i + 1] = encoder_colors[current_encoder] +def fade_leds_parallel(led_targets, steps=10, delay=0.01): + for step in range(steps + 1): + for index, start_color, end_color in led_targets: + blended = tuple( + int(start_color[i] + (end_color[i] - start_color[i]) * step / steps) + for i in range(3) + ) + led[index] = blended + time.sleep(delay) def startup_animation(): @@ -111,7 +132,7 @@ def startup_animation(): led[i] = tuple(int(c * step / 100) for c in encoder_colors[current_encoder]) time.sleep(0.02) -# -------------------- Startup ----------------------- +# Startup print("MIDI Encoder Controller started.") startup_animation() led[3:7] = [encoder_colors[current_encoder]] * 4 @@ -120,7 +141,16 @@ led[1] = encoder_colors[(current_encoder - 1) % len(encoder_colors)] led[2] = (63, 63, 63) # Mode toggle LED default 25% white mode_button_state_note = 0 -# -------------------- Main Loop --------------------- +should_interrupt = False + +def animation_interrupt(): + global should_interrupt + if should_interrupt: + should_interrupt = False + return True + return False + +# Main Loop while True: enc_button.update() next_button.update() @@ -148,6 +178,23 @@ while True: # Next Encoder Button if next_button.fell: current_encoder = (current_encoder + 1) % len(encoder_cc_notes) + + # Prepare fade targets + led_targets = [] + + # Fade main encoder LEDs (3 to 6) + for i in range(3, 7): + led_targets.append((i, led[i], encoder_colors[current_encoder])) + + # Fade forward/backward indicators (0 and 1) + forward_color = encoder_colors[(current_encoder + 1) % len(encoder_colors)] + backward_color = encoder_colors[(current_encoder - 1) % len(encoder_colors)] + led_targets.append((0, led[0], forward_color)) + led_targets.append((1, led[1], backward_color)) + + # Run the simultaneous fade + fade_leds_parallel(led_targets) + forward_color = encoder_colors[(current_encoder + 1) % len(encoder_colors)] backward_color = encoder_colors[(current_encoder - 1) % len(encoder_colors)] led[3:7] = [encoder_colors[current_encoder]] * 4 @@ -157,6 +204,23 @@ while True: # Back Encoder Button if back_button.fell: current_encoder = (current_encoder - 1) % len(encoder_cc_notes) + + # Prepare fade targets + led_targets = [] + + # Fade main encoder LEDs (3 to 6) + for i in range(3, 7): + led_targets.append((i, led[i], encoder_colors[current_encoder])) + + # Fade forward/backward indicators (0 and 1) + forward_color = encoder_colors[(current_encoder + 1) % len(encoder_colors)] + backward_color = encoder_colors[(current_encoder - 1) % len(encoder_colors)] + led_targets.append((0, led[0], forward_color)) + led_targets.append((1, led[1], backward_color)) + + # Run the simultaneous fade + fade_leds_parallel(led_targets) + forward_color = encoder_colors[(current_encoder + 1) % len(encoder_colors)] backward_color = encoder_colors[(current_encoder - 1) % len(encoder_colors)] led[3:7] = [encoder_colors[current_encoder]] * 4