From e3661bf98efd5e219d9220d5ac63ebba1b128e06 Mon Sep 17 00:00:00 2001 From: melancholytron Date: Mon, 8 Sep 2025 13:23:50 -0500 Subject: [PATCH] Fix delay timing - add slower divisions for proper echo spacing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Delay Timing Improvements: - Remove overly fast timings (1/32, 1/32T, 1/16, 1/16T) - Add slower echo-appropriate timings: 1/2, 1/1, 2/1, 4/1 - New range: 1/8 to 4/1 for realistic echo spacing - Change default from 1/8 to 1/4 (quarter note delays) Layout Adjustments: - Reorganize delay buttons in 2 rows (5 top, 4 bottom) - 9 total timing options optimized for echo/delay effects - Better spacing for slower, more musical delay patterns Technical Updates: - Add 4/1 (4 beats) to NOTE_SPEEDS dictionary - Update default delay timing in both GUI and engine - Maintain triplet support for 1/8T, 1/4T, 1/2T options Result: Delay timing now provides proper echo spacing from 1/8 note (fast) to 4 whole notes (very slow echoes), perfect for musical delay effects. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- core/arpeggiator_engine.py | 4 ++-- gui/arpeggiator_controls.py | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/core/arpeggiator_engine.py b/core/arpeggiator_engine.py index d460f5e..677ac33 100644 --- a/core/arpeggiator_engine.py +++ b/core/arpeggiator_engine.py @@ -62,7 +62,7 @@ class ArpeggiatorEngine(QObject): NOTE_SPEEDS = { "1/32": 1/32, "1/32T": 1/48, "1/16": 1/16, "1/16T": 1/24, "1/8": 1/8, "1/8T": 1/12, "1/4": 1/4, "1/4T": 1/6, - "1/2": 1/2, "1/2T": 1/3, "1/1": 1, "2/1": 2 + "1/2": 1/2, "1/2T": 1/3, "1/1": 1, "2/1": 2, "4/1": 4 } def __init__(self, channel_manager: MIDIChannelManager, synth_router: SynthRouter, @@ -108,7 +108,7 @@ class ArpeggiatorEngine(QObject): # Delay/Echo settings self.delay_enabled = False self.delay_length = 3 # Number of repeats (0-8) - self.delay_timing = "1/8" # Timing between delays + self.delay_timing = "1/4" # Timing between delays self.delay_fade = 0.3 # Volume fade per repeat (0.0-1.0) self.delay_step_duration = 0.0 # Calculated delay timing self.scheduled_delays = [] # List of (time, channel, note, volume) tuples diff --git a/gui/arpeggiator_controls.py b/gui/arpeggiator_controls.py index 01ef27f..28e92ba 100644 --- a/gui/arpeggiator_controls.py +++ b/gui/arpeggiator_controls.py @@ -34,7 +34,7 @@ class ArpeggiatorControls(QWidget): self.current_distribution = "up" self.current_speed = "1/8" self.current_pattern_length = 8 - self.current_delay_timing = "1/8" + self.current_delay_timing = "1/4" # Armed state tracking self.armed_root_note_button = None @@ -400,7 +400,7 @@ class ArpeggiatorControls(QWidget): delay_timing_layout.setContentsMargins(0, 0, 0, 0) self.delay_timing_buttons = {} - delay_speeds = ["1/32", "1/32T", "1/16", "1/16T", "1/8", "1/8T", "1/4", "1/4T", "1/2", "1/2T", "1/1"] + delay_speeds = ["1/8", "1/8T", "1/4", "1/4T", "1/2", "1/2T", "1/1", "2/1", "4/1"] for i, speed in enumerate(delay_speeds): btn = QPushButton(speed) btn.setFixedSize(35, 18) # Slightly smaller to fit more @@ -409,13 +409,13 @@ class ArpeggiatorControls(QWidget): btn.setEnabled(False) btn.clicked.connect(lambda checked, s=speed: self.on_delay_timing_clicked(s)) - if speed == "1/8": + if speed == "1/4": btn.setChecked(True) self.delay_timing_buttons[speed] = btn - # Arrange in 2 rows - row = i // 6 - col = i % 6 + # Arrange in 2 rows (5 on top, 4 on bottom) + row = i // 5 + col = i % 5 delay_timing_layout.addWidget(btn, row, col) delay_timing_widget.setEnabled(False)