jdxi_editor.midi.playback.controller
Pattern Playback Controller Module
Manages MIDI pattern playback using the PlaybackEngine. Handles: - Starting/stopping/pausing playback - Building MIDI files from patterns - UI synchronization during playback - Muting/unmuting channels - Shuffle play functionality
Classes
Configuration for playback controller. |
|
Represents the current playback position. |
|
Controls pattern playback and synchronization. |
Module Contents
- class jdxi_editor.midi.playback.controller.PlaybackConfig(ticks_per_beat: int = 480, beats_per_measure: int = 4, measure_beats: int = 16, default_bpm: int = 120, playback_interval_ms: int = 20)[source]
Configuration for playback controller.
- class jdxi_editor.midi.playback.controller.PlaybackPosition(global_step: int = 0, bar_index: int = 0, step_in_bar: int = 0)[source]
Represents the current playback position.
- class jdxi_editor.midi.playback.controller.PatternPlaybackController(config: PlaybackConfig | None = None, playback_engine: picomidi.playback.engine.PlaybackEngine | None = None, scope: str = 'PatternPlaybackController')[source]
Bases:
PySide6.QtCore.QObjectControls pattern playback and synchronization.
Manages: - PlaybackEngine operation - UI updates during playback (bar/step highlighting) - Muting/unmuting channels - Pause/resume functionality - Shuffle play
- on_position_changed: Callable[[PlaybackPosition], None] | None = None[source]
- start_playback(measures: List, bpm: int | None = None) bool[source]
Start pattern playback.
- Parameters:
measures – List of PatternMeasure objects to play
bpm – Optional tempo override
- Returns:
True if playback started successfully
- shuffle_play(measures: List, bpm: int | None = None) bool[source]
Select a random bar and start playback.
- Parameters:
measures – List of PatternMeasure objects
bpm – Optional tempo override
- Returns:
True if playback started
- mute_channel(channel: int, mute: bool = True) None[source]
Mute or unmute a specific MIDI channel.
- Parameters:
channel – MIDI channel (0-15)
mute – True to mute, False to unmute
- mute_row(row: int, mute: bool = True) None[source]
Mute or unmute a sequencer row.
Row to channel mapping: - Row 0: Channel 0 (Digital Synth 1) - Row 1: Channel 1 (Digital Synth 2) - Row 2: Channel 2 (Analog Synth) - Row 3: Channel 9 (Drums)
- Parameters:
row – Row index (0-3)
mute – True to mute, False to unmute
- toggle_mute_row(row: int) bool[source]
Toggle mute for a row.
- Parameters:
row – Row index (0-3)
- Returns:
New mute state (True if now muted)
- is_row_muted(row: int) bool[source]
Check if a row is muted.
- Parameters:
row – Row index (0-3)
- Returns:
True if row is muted
- process_playback_tick(total_steps: int) PlaybackPosition | None[source]
Process a playback timer tick.
Called by timer. Updates engine and returns current position.
- Parameters:
total_steps – Total steps in pattern (bars * steps_per_bar)
- Returns:
Updated PlaybackPosition or None if playback has stopped
- get_current_position() PlaybackPosition[source]
Get the current playback position.
- Returns:
PlaybackPosition object
- get_playback_state() Dict[str, bool][source]
Get the current playback state.
- Returns:
Dictionary with is_playing, is_paused, muted_channels
- reload_playback_with_tempo(measures: List, bpm: int) bool[source]
Rebuild MIDI with new tempo and resume from current position. Call when tempo changes during playback.
- Parameters:
measures – Current pattern measures
bpm – New tempo in BPM
- Returns:
True if reload succeeded
- _build_midi_file_for_playback(measures: List) mido.MidiFile[source]
Build a MIDI file from the pattern for playback.
- Parameters:
measures – List of PatternMeasure objects
- Returns:
MidiFile ready for playback
- _collect_sequencer_events(measures: List) List[picomidi.sequencer.event.SequencerEvent][source]
Collect all note events from measures.
- Parameters:
measures – List of PatternMeasure objects
- Returns:
List of SequencerEvent objects
- _sequencer_event(channel: int, duration_ticks: int, spec: picomidi.ui.widget.button.note.NoteButtonEvent, tick: int, velocity: int) picomidi.sequencer.event.SequencerEvent[source]
add sequencer event
- _ms_to_ticks(duration_ms: float) int[source]
Convert milliseconds to MIDI ticks.
Formula: ticks = (duration_ms / 1000) * (bpm / 60) * ticks_per_beat
- Parameters:
duration_ms – Duration in milliseconds
- Returns:
Duration in MIDI ticks
- _get_button_note_spec(button)[source]
Get note specification from a button.
- Parameters:
button – SequencerButton instance
- Returns:
NoteButtonSpec with note, duration_ms, velocity, is_active
- _get_engine_tick() int[source]
Get the current tick position from the playback engine.
- Returns:
Absolute tick position
- set_config(config: PlaybackConfig) None[source]
Update controller configuration.
- Parameters:
config – New PlaybackConfig