jdxi_editor.ui.editors.midi_player.midi_analyzer

MIDI analysis for the file player: tempo, drum detection, track classification, channel selection.

Pure domain logic — no Qt, no UI. The editor calls these methods and applies results to state/UI.

Classes

MidiAnalyzer

MIDI file analysis: initial tempo, drum track detection, track classification,

Module Contents

class jdxi_editor.ui.editors.midi_player.midi_analyzer.MidiAnalyzer[source]

MIDI file analysis: initial tempo, drum track detection, track classification, and preferred playback channel selection.

get_initial_tempo(midi_file) tuple[int, dict[int, int]][source]

Detect initial tempo from the first set_tempo message in the file.

Parameters:

midi_file – mido.MidiFile

Returns:

(tempo_initial_usec, initial_track_tempos) tempo_initial_usec: first tempo found or default 120 BPM initial_track_tempos: map track_number -> tempo (for tracks that have set_tempo)

get_drum_tracks(midi_file, min_score: float = 70.0) list[tuple[int, dict]][source]

Detect drum tracks in the MIDI file.

Parameters:
  • midi_file – mido.MidiFile

  • min_score – minimum score to consider a track as drums

Returns:

list of (track_index, analysis_dict) sorted by score descending

get_classifications(midi_file, exclude_drum_indices: list[int] | None = None, min_score: float = 30.0) dict[source]

Classify non-drum tracks into Bass, Keys/Guitars, Strings.

Parameters:
  • midi_file – mido.MidiFile

  • exclude_drum_indices – track indices to exclude (e.g. drum tracks)

  • min_score – minimum score for a track to be classified

Returns:

dict with keys “bass”, “keys_guitars”, “strings”, “unclassified”; each value is a list of (track_index, TrackStats)

get_preferred_channel(midi_file, preferred_channels: set[int]) int | None[source]

Pick a playback channel from the file that is in the preferred set.

Parameters:
  • midi_file – mido.MidiFile

  • preferred_channels – set of channel numbers (e.g. 0, 1, 2, 9 for 1-based 1,2,3,10)

Returns:

channel index 0–15, or None if no message uses a preferred channel