UNPKG

wave-roll

Version:

JavaScript Library for Comparative MIDI Piano-Roll Visualization

246 lines 7.11 kB
import * as Tone from 'tone'; import type { PlayerGroup, SynchronizationInfo } from '../master-clock'; /** * MIDI Player Group - Synchronized with AudioMasterClock * * User requirements: Individual control of volume, pan, mute for each MIDI player */ export declare class MidiPlayerGroup implements PlayerGroup { private static DEBUG; private players; private part; private notes; private applyZeroEps; private tempoScale; private originalTempoBase; private lastStartGen; private masterVolume; private midiManager; /** Map of MIDI Program Number -> loaded Tone.Sampler for auto-instrument routing */ private programSamplers; /** Map of MIDI Program Number -> loading Promise to prevent duplicate loads */ private programSamplerLoading; /** Stores mute/volume/pan states set before the player is initialized */ private pendingPlayerStates; private errorStats; constructor(); /** * Get or create a sampler for a specific MIDI Program Number (lazy loading). */ getOrCreateProgramSampler(program: number): Promise<Tone.Sampler>; /** * Get the program sampler synchronously if already loaded. */ getProgramSamplerSync(program: number): Tone.Sampler | null; /** * Check if a program sampler is already loaded or currently loading. */ isProgramLoadedOrLoading(program: number): boolean; /** * Preload samplers for specific MIDI Program Numbers. * Useful for loading all programs used in a MIDI file at initialization. * @param programs - Array of MIDI Program Numbers to preload */ preloadProgramSamplers(programs: number[]): Promise<void>; /** * Set MIDI manager (compatibility with existing code) */ setMidiManager(midiManager: any): void; /** * Initialize MIDI samplers */ initialize(): Promise<void>; /** * Wait until all MIDI samplers are ready. */ waitUntilReady(): Promise<void>; /** * Create sampler for file */ private createSamplerForFile; /** * Create MIDI Part */ /** * Validate MIDI note data */ private validateMidiNote; /** * Validate note name format (supports standard notation like "C4", "C#4", "Bb3") */ private isValidNoteName; /** * Normalize pitch input to consistent note name format * Handles both numeric MIDI notes (0-127) and string note names ('C#4', 'Db3', etc.) */ private normalizeNoteName; /** * Sanitize and filter MIDI notes */ /** * Update error statistics */ private updateErrorStats; /** * Get error statistics */ getErrorStats(): { uptimeMs: number; successRate: number; totalNoteAttempts: number; failedNotes: number; invalidDataErrors: number; synthErrors: number; lastResetTime: number; }; /** * Reset error statistics */ resetErrorStats(): void; /** * Comprehensive MIDI data quality analysis */ analyzeMidiDataQuality(): { timestamp: string; totalNotes: number; fileIds: (string | undefined)[]; dataQuality: { validNotes: number; invalidNotes: number; pitchRange: { min: number; max: number; }; velocityRange: { min: number; max: number; }; durationRange: { min: number; max: number; }; timeRange: { min: number; max: number; }; }; issues: string[]; recommendations: string[]; }; /** * Get comprehensive performance report */ getPerformanceReport(): { timestamp: string; playbackPerformance: { isHealthy: boolean; healthStatus: string; uptimeMs: number; successRate: number; totalNoteAttempts: number; failedNotes: number; invalidDataErrors: number; synthErrors: number; lastResetTime: number; }; dataQuality: { timestamp: string; totalNotes: number; fileIds: (string | undefined)[]; dataQuality: { validNotes: number; invalidNotes: number; pitchRange: { min: number; max: number; }; velocityRange: { min: number; max: number; }; durationRange: { min: number; max: number; }; timeRange: { min: number; max: number; }; }; issues: string[]; recommendations: string[]; }; systemStatus: { activePlayers: number; totalNotes: number; partActive: boolean; masterVolume: number; }; recommendations: string[]; }; /** * Generate system recommendations based on performance and data quality */ private generateRecommendations; /** * Log comprehensive health status to console */ logHealthStatus(): void; private sanitizeMidiNotes; private createMidiPart; /** * Convert MIDI note number to note name */ private midiNoteNumberToName; /** * PlayerGroup interface implementation: Synchronized start */ startSynchronized(syncInfo: SynchronizationInfo): Promise<void>; /** * PlayerGroup interface implementation: Synchronized stop */ stopSynchronized(): void; /** * PlayerGroup interface implementation: Seek to time */ seekTo(time: number): void; /** * PlayerGroup interface implementation: Set tempo */ setTempo(bpm: number): void; /** Set baseline tempo used to compute MIDI scheduling scale. */ setOriginalTempoBase(bpm: number): void; /** * PlayerGroup interface implementation: Set master volume */ setMasterVolume(volume: number): void; /** * PlayerGroup interface implementation: Set loop */ setLoop(mode: 'off' | 'repeat' | 'ab', markerA: number | null, markerB: number | null): void; /** * Set individual MIDI player volume */ setPlayerVolume(fileId: string, volume: number): void; /** * Set individual MIDI player pan */ setPlayerPan(fileId: string, pan: number): void; /** * Set individual MIDI player mute */ setPlayerMute(fileId: string, muted: boolean): void; /** * Get individual player states */ getPlayerStates(): Record<string, { volume: number; pan: number; muted: boolean; }>; /** * Resource cleanup */ destroy(): void; } //# sourceMappingURL=midi-player-group.d.ts.map