"""
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_name: str | None = None
[docs]
channels: set[int] = field(default_factory=set)
[docs]
notes: list[int] = field(default_factory=list)
[docs]
velocities: list[int] = field(default_factory=list)
[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]
legato_score: float = 0.0
[docs]
scores: dict[str, float] = field(
default_factory=lambda: {"bass": 0.0, "keys_guitars": 0.0, "strings": 0.0}
)