jdxi_editor.midi.file.controller

MIDI File Controller Module

Manages MIDI file operations including saving, loading, and pattern conversion. Handles tempo management, bar detection, and note-to-button mapping.

Classes

MidiFileControllerConfig

Configuration for MIDI file controller.

MidiFileLoadResult

Result of loading a MIDI file.

MidiFileController

Manages MIDI file I/O operations for pattern sequencer.

Module Contents

class jdxi_editor.midi.file.controller.MidiFileControllerConfig(ticks_per_beat: int = 480, beats_per_measure: int = 4, default_bpm: int = 120, default_velocity: int = 100)[source]

Configuration for MIDI file controller.

ticks_per_beat = 480[source]
beats_per_measure = 4[source]
default_bpm = 120[source]
default_velocity = 100[source]
property ticks_per_measure: int[source]

Calculate ticks per bar.

class jdxi_editor.midi.file.controller.MidiFileLoadResult(success: bool, num_bars: int = 0, notes_loaded: int = 0, tempo_bpm: int | None = None, error_message: str | None = None)[source]

Result of loading a MIDI file.

success[source]
num_bars = 0[source]
notes_loaded = 0[source]
tempo_bpm = None[source]
error_message = None[source]
class jdxi_editor.midi.file.controller.MidiFileController(config: MidiFileControllerConfig | None = None, midi_converter: jdxi_editor.midi.conversion.note.MidiNoteConverter | None = None, scope: str = 'MidiFileController')[source]

Manages MIDI file I/O operations for pattern sequencer.

Handles: - Loading MIDI files and converting to patterns - Saving patterns to MIDI files - Tempo management - Bar/measure detection - MIDI note-to-button mapping

CHANNEL_TO_ROW[source]
ROW_TO_CHANNEL[source]
config[source]
midi_converter = None[source]
scope = 'MidiFileController'[source]
midi_file: mido.MidiFile | None = None[source]
current_bpm = 120[source]
on_file_loaded: Callable[[MidiFileLoadResult], None] | None = None[source]
on_file_saved: Callable[[str], None] | None = None[source]
on_tempo_changed: Callable[[int], None] | None = None[source]
create_new_file() mido.MidiFile[source]

Create a new MIDI file with default settings.

Returns:

New MidiFile object

set_tempo(bpm: int) None[source]

Set the MIDI file tempo.

Updates the current file’s tempo and triggers callback.

Parameters:

bpm – Tempo in beats per minute (20-300)

get_tempo() int[source]

Get the current MIDI file tempo.

Returns:

Tempo in BPM

save_pattern(filename: str, measures: List, pattern_name: str | None = None) bool[source]

Save pattern to a MIDI file.

Creates a MIDI file from the current pattern with proper formatting.

Parameters:
  • filename – Path to save file

  • measures – List of PatternMeasure objects to save

  • pattern_name – Optional name for the pattern (used as metadata)

Returns:

True if successful, False otherwise

load_pattern(filename: str, measures_container: List | None = None) MidiFileLoadResult[source]

Load pattern from a MIDI file.

Parses MIDI file and returns data for populating measures/buttons.

Parameters:
  • filename – Path to MIDI file

  • measures_container – Optional list to populate with loaded measures

Returns:

MidiFileLoadResult with load status and metadata

load_from_midi_file_editor(midi_file_editor) MidiFileLoadResult[source]

Load pattern from a MidiFileEditor instance.

Useful for sharing MIDI files between editor windows.

Parameters:

midi_file_editor – MidiFileEditor instance with loaded file

Returns:

MidiFileLoadResult with load status

_load_from_midi_file_object(midi_file: mido.MidiFile) MidiFileLoadResult[source]

Load pattern from a MidiFile object (internal method).

Parameters:

midi_file – MidiFile instance

Returns:

MidiFileLoadResult with load status

_detect_bars_from_midi(midi_file: mido.MidiFile) int[source]

Detect the number of bars in a MIDI file.

Counts the maximum absolute time and divides by ticks per bar.

Parameters:

midi_file – MidiFile to analyze

Returns:

Number of bars detected (minimum 1)

_parse_midi_file(midi_file: mido.MidiFile, ppq: int, ticks_per_measure: int) List[Dict][source]

Parse MIDI file and extract note events.

Returns list of note dictionaries with timing and metadata.

Parameters:
  • midi_file – MidiFile to parse

  • ppq – Ticks per beat from the file

  • ticks_per_measure – Ticks per bar calculation

Returns:

List of parsed note events

_extract_tempo_from_midi(midi_file: mido.MidiFile) int | None[source]

Extract tempo from MIDI file.

Searches all tracks for the first SET_TEMPO message.

Parameters:

midi_file – MidiFile to search

Returns:

Tempo in BPM, or None if not found

_add_tempo_to_track(track: mido.MidiTrack, bpm: int) None[source]

Add tempo message to a track.

Parameters:
  • track – MidiTrack to add tempo to

  • bpm – Tempo in BPM

_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

set_config(config: MidiFileControllerConfig) None[source]

Update controller configuration.

Parameters:

config – New configuration

set_midi_converter(converter: jdxi_editor.midi.conversion.note.MidiNoteConverter) None[source]

Set or update the MIDI converter.

Parameters:

converter – MidiNoteConverter instance

get_current_file() mido.MidiFile | None[source]

Get the currently loaded MIDI file.

Returns:

MidiFile instance or None