import { SpessaSynthWrapper } from '../utils/SpessaSynthWrapper'; import { SequencerTimingHelper } from '../utils/SequencerTimingHelper'; import { SeekOptimizer } from '../utils/PreloadCache'; export declare class MIDIPlayer { audioContext: AudioContext | null; player: any; seekOptimizer: SeekOptimizer | null; spessaPlayer: SpessaSynthWrapper | null; useSpessaSynth: boolean; timingHelper: SequencerTimingHelper | null; songStart: number; input: any; currentSongTime: number; nextStepTime: number; nextPositionTime: number; loadedsong: any; stoppedsong: any; stepDuration: number; lastPosition: number; currentPosition: number; duration: number; onload: ((song: any) => void) | null; ontick: ((song: any, position: number) => void) | null; readonly STOPPED = "stopped"; readonly PLAYING = "playing"; readonly PAUSED = "paused"; state: string; private tickInterval; private readonly TICK_INTERVAL_MS; private tempoMultiplier; constructor(); /** * Set tempo multiplier (1.0 = normal speed, 0.5 = half speed, 2.0 = double speed) */ setTempoMultiplier(multiplier: number): void; /** * Get current tempo multiplier */ getTempoMultiplier(): number; setSoundfontEngine(engine: string, spessaPlayerInstance: SpessaSynthWrapper): void; log(msg: any, extra?: any): void; play(): Promise; pause(): void; stop(): void; private stopTicking; startPlay(song: any): void; private startTicking; tick: (song: any) => void; sendNotes(song: any, songStart: number, start: number, end: number): void; initAudioContext(): void; startLoad(song: any): void; loadSong(song: any): void; openFile(fileObj: ArrayBuffer | Uint8Array): void; /** * Open file with EMK support * Automatically converts EMK to KAR if needed * * @param fileObj - File, Blob, ArrayBuffer, or Uint8Array * @param filename - Optional filename for type detection */ openFileWithEmkSupport(fileObj: File | Blob | ArrayBuffer | Uint8Array, filename?: string): Promise; getPosition(): number; setPosition(position: number): void; }