Source code for jdxi_editor.midi.track.stats

"""
Track classification utilities for MIDI files.

This module provides functions to classify MIDI tracks into categories:
- Bass: Low-pitched, monophonic or low polyphony tracks
- Keys/Guitars: Wide range, polyphonic tracks (piano, guitar, etc.)
- Strings: Sustained, legato tracks with ensemble-like patterns
"""

from dataclasses import dataclass, field


@dataclass
[docs] class TrackStats: """Track Stats"""
[docs] track_index: int
[docs] track_name: str | None = None
[docs] channels: set[int] = field(default_factory=set)
[docs] note_count: int = 0
[docs] notes: list[int] = field(default_factory=list)
[docs] velocities: list[int] = field(default_factory=list)
[docs] lowest_note: int = 127
[docs] highest_note: int = 0
[docs] bass_note_count: int = 0
[docs] mid_range_note_count: int = 0
[docs] high_note_count: int = 0
[docs] note_ons: list[tuple[int, int, int]] = field(default_factory=list)
[docs] note_offs: list[tuple[int, int]] = field(default_factory=list)
[docs] has_pitch_bend: bool = False
[docs] has_control_change: bool = False
[docs] program_changes: list[int] = field(default_factory=list)
[docs] avg_note_duration: float = 0.0
[docs] max_simultaneous: int = 0
[docs] note_range: int = 0
[docs] legato_score: float = 0.0
[docs] scores: dict[str, float] = field( default_factory=lambda: {"bass": 0.0, "keys_guitars": 0.0, "strings": 0.0} )