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