diff --git a/README.md b/README.md index 19ed3c0..26c4baf 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@ import { createLaunchpadCore } from "launchpadcore"; const App = createLaunchpadCore("LaunchpadX"); -App.on("onEnabled", (instance, driver) => { +App.on("onConnected", (instance, driver) => { instance.out.send(driver.textScrolling(15, "Welcome!")) instance.out.noteOn(0, 11, 25) // Pad 11 to color 25 }) @@ -67,6 +67,10 @@ App.on("onMidiIn", (data) => { App.on("onDisabled", () => { console.log("Shutdown...") }) + +App.on("onDisconnected", () => { + console.log("Device disconnected") +}) ``` ## What's can I do ? @@ -74,9 +78,10 @@ App.on("onDisabled", () => { ### Events | Name | Description | | :---------- | :------------------------- | -| `onConnected` | When connected to Launchpad | -| `onDisabled` | When disabled (exit the program) | -| `onMidiIn` | When new MIDI message received | +| `onConnected` | When connected to Launchpad | +| `onDisabled` | When disabled (exit the program) | +| `onDisconnected` | When the device disconnects | +| `onMidiIn` | When new MIDI message received | ### MIDI methods diff --git a/src/Service/Midi/index.ts b/src/Service/Midi/index.ts index cbd0671..c779075 100644 --- a/src/Service/Midi/index.ts +++ b/src/Service/Midi/index.ts @@ -16,27 +16,33 @@ export default class MidiService { private _midiIn: string; private _midiOut: string; + private _onDisconnect?: () => void; - constructor(midiIn: string, midiOut: string) { + constructor(midiIn: string, midiOut: string, onDisconnect?: () => void) { this._midiIn = midiIn; this._midiOut = midiOut; + this._onDisconnect = onDisconnect; this._midiInput = midi() .openMidiIn(midiIn) - .or(() => this.midiError); + .or(() => this.midiError()); this._midiOutput = midi() - .openMidiOut(midiIn) - .or(() => this.midiError); + .openMidiOut(midiOut) + .or(() => this.midiError()); } - private get midiError() { - throw new midiError('Device not connected.'); + private midiError() { + if (this._onDisconnect) { + this._onDisconnect(); + } + this.closeAll(); + console.error(new midiError('Device not connected.')); } private openOutput() { this._midiOutput = midi() .openMidiOut(this._midiOut) - .or(() => this.midiError); + .or(() => this.midiError()); } private closeOutput() { diff --git a/src/index.ts b/src/index.ts index 23e3b89..0535d82 100644 --- a/src/index.ts +++ b/src/index.ts @@ -14,6 +14,7 @@ class LaunchpadCore { onMidiIn: [], onConnected: [], onDisabled: [], + onDisconnected: [], }; constructor(driverName: T) { @@ -23,7 +24,11 @@ class LaunchpadCore { MidiService.requestWebAccess().catch(() => {}); } - this._instance = new MidiService(this._driver.MidiIn, this._driver.MidiOut); + this._instance = new MidiService( + this._driver.MidiIn, + this._driver.MidiOut, + () => this.onDisconnected(), + ); this.onEnabled(); @@ -45,6 +50,10 @@ class LaunchpadCore { this._instance.closeAll(); } + private async onDisconnected() { + await this.handleEvent('onDisconnected', this._instance, this._driver); + } + /** * Events */ @@ -55,6 +64,7 @@ class LaunchpadCore { public on(event: 'onMidiIn', callback: (data: any) => void): void; public on(event: 'onConnected', callback: (instance: MidiService, driver: DriverMap[T]) => void): void; public on(event: 'onDisabled', callback: (instance: MidiService, driver: DriverMap[T]) => void): void; + public on(event: 'onDisconnected', callback: (instance: MidiService, driver: DriverMap[T]) => void): void; public on(event: string, callback: any) { if (!this.callbacks[event]) throw new Error(`Unknown event name: '${event}'`);