Browse Source

Fix delay timing - add slower divisions for proper echo spacing

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 <noreply@anthropic.com>
master
melancholytron 2 months ago
parent
commit
e3661bf98e
  1. 4
      core/arpeggiator_engine.py
  2. 12
      gui/arpeggiator_controls.py

4
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

12
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)

Loading…
Cancel
Save