| 32 | * @internal |
| 33 | */ |
| 34 | export class AlphaSynthWrapper implements IAlphaSynth { |
| 35 | // relevant state information we want to remember when switching between player instances |
| 36 | private _masterVolume: number = 1; |
| 37 | private _metronomeVolume: number = 0; |
| 38 | private _countInVolume: number = 0; |
| 39 | private _playbackSpeed: number = 1; |
| 40 | private _isLooping: boolean = false; |
| 41 | private _midiEventsPlayedFilter: MidiEventType[] = []; |
| 42 | |
| 43 | private _instance?: IAlphaSynth; |
| 44 | private _instanceEventUnregister?: (() => void)[]; |
| 45 | |
| 46 | public midiTickShift = 0; |
| 47 | |
| 48 | public constructor() { |
| 49 | this.ready = new EventEmitter(() => this.isReady); |
| 50 | this.readyForPlayback = new EventEmitter(() => this.isReadyForPlayback); |
| 51 | this.midiLoaded = new EventEmitterOfT<PositionChangedEventArgs>(() => { |
| 52 | return this._instance?.loadedMidiInfo ?? null; |
| 53 | }); |
| 54 | this.stateChanged = new EventEmitterOfT<PlayerStateChangedEventArgs>(() => { |
| 55 | return new PlayerStateChangedEventArgs(this.state, false); |
| 56 | }); |
| 57 | this.positionChanged = new EventEmitterOfT<PositionChangedEventArgs>(() => { |
| 58 | return this.currentPosition; |
| 59 | }); |
| 60 | this.playbackRangeChanged = new EventEmitterOfT<PlaybackRangeChangedEventArgs>(() => { |
| 61 | const range = this.playbackRange; |
| 62 | if (range) { |
| 63 | return new PlaybackRangeChangedEventArgs(range); |
| 64 | } |
| 65 | return null; |
| 66 | }); |
| 67 | } |
| 68 | |
| 69 | public get instance(): IAlphaSynth | undefined { |
| 70 | return this._instance; |
| 71 | } |
| 72 | |
| 73 | public set instance(value: IAlphaSynth | undefined) { |
| 74 | this._instance = value; |
| 75 | |
| 76 | // unregister all events from previous instance |
| 77 | const unregister = this._instanceEventUnregister; |
| 78 | if (unregister) { |
| 79 | for (const e of unregister) { |
| 80 | e(); |
| 81 | } |
| 82 | } |
| 83 | |
| 84 | if (value) { |
| 85 | // regsiter to events of new player and forward them to existing listeners |
| 86 | const newUnregister: (() => void)[] = []; |
| 87 | newUnregister.push(value.ready.on(() => (this.ready as EventEmitter).trigger())); |
| 88 | newUnregister.push(value.readyForPlayback.on(() => (this.readyForPlayback as EventEmitter).trigger())); |
| 89 | newUnregister.push(value.finished.on(() => (this.finished as EventEmitter).trigger())); |
| 90 | newUnregister.push(value.soundFontLoaded.on(() => (this.soundFontLoaded as EventEmitter).trigger())); |
| 91 | newUnregister.push( |
nothing calls this directly
no outgoing calls
no test coverage detected