@ng-web-apis/midi
Version:
An Observable based library for the use of Web MIDI API with Angular
1 lines • 27 kB
Source Map (JSON)
{"version":3,"file":"ng-web-apis-midi.mjs","sources":["../../../libs/midi/src/utils/between.ts","../../../libs/midi/src/monotype-operators/aftertouch.ts","../../../libs/midi/src/monotype-operators/filter-by-channel.ts","../../../libs/midi/src/monotype-operators/filter-by-id.ts","../../../libs/midi/src/monotype-operators/filter-by-name.ts","../../../libs/midi/src/monotype-operators/main-volume.ts","../../../libs/midi/src/monotype-operators/modulation-wheel.ts","../../../libs/midi/src/monotype-operators/notes.ts","../../../libs/midi/src/monotype-operators/pan.ts","../../../libs/midi/src/monotype-operators/pitch-bend.ts","../../../libs/midi/src/monotype-operators/polyphonic-aftertouch.ts","../../../libs/midi/src/monotype-operators/program-change.ts","../../../libs/midi/src/monotype-operators/sustain-pedal.ts","../../../libs/midi/src/operators/to-data.ts","../../../libs/midi/src/operators/to-data-byte.ts","../../../libs/midi/src/operators/to-status-byte.ts","../../../libs/midi/src/operators/to-time-stamp.ts","../../../libs/midi/src/operators/to-value-byte.ts","../../../libs/midi/src/utils/to-frequency.ts","../../../libs/midi/src/pipes/frequency/frequency.pipe.ts","../../../libs/midi/src/tokens/sysex.ts","../../../libs/midi/src/tokens/midi-access.ts","../../../libs/midi/src/tokens/midi-input.ts","../../../libs/midi/src/utils/get-ports-stream.ts","../../../libs/midi/src/tokens/midi-inputs.ts","../../../libs/midi/src/tokens/midi-messages.ts","../../../libs/midi/src/tokens/midi-output.ts","../../../libs/midi/src/tokens/midi-outputs.ts","../../../libs/midi/src/tokens/midi-support.ts","../../../libs/midi/src/tokens/midi-input-query.ts","../../../libs/midi/src/utils/input-by-id.ts","../../../libs/midi/src/utils/input-by-name.ts","../../../libs/midi/src/tokens/midi-output-query.ts","../../../libs/midi/src/utils/output-by-id.ts","../../../libs/midi/src/utils/output-by-name.ts","../../../libs/midi/src/utils/to-note.ts","../../../libs/midi/src/ng-web-apis-midi.ts"],"sourcesContent":["export function between(value: number, min: number, max: number): boolean {\n return value >= min && value <= max;\n}\n","import {filter, type MonoTypeOperatorFunction} from 'rxjs';\n\nimport {between} from '../utils/between';\n\n/**\n * Filter MIDI messages to aftertouch changes only\n */\nexport function aftertouch(): MonoTypeOperatorFunction<WebMidi.MIDIMessageEvent> {\n return (source) => source.pipe(filter(({data}) => between(data[0] ?? 0, 208, 223)));\n}\n","import {filter, type MonoTypeOperatorFunction} from 'rxjs';\n\nimport {type MidiChannel} from '../types/midi-channel';\n\n/**\n * Filter MIDI messages by channel\n *\n * @param channel number from 0 to 15\n */\nexport function filterByChannel(\n channel: MidiChannel,\n): MonoTypeOperatorFunction<WebMidi.MIDIMessageEvent> {\n return (source) => source.pipe(filter(({data}) => (data[0] ?? 0) % 16 === channel));\n}\n","import {filter, type MonoTypeOperatorFunction} from 'rxjs';\n\n/**\n * Filter MIDI messages by MIDIInput id\n *\n * @param id\n */\nexport function filterById(id: string): MonoTypeOperatorFunction<MIDIMessageEvent> {\n return (source) => source.pipe(filter(({target}) => (target as MIDIPort).id === id));\n}\n","import {filter, type MonoTypeOperatorFunction} from 'rxjs';\n\n/**\n * Filter MIDI messages by MIDIInput name\n *\n * @param name\n */\nexport function filterByName(name: string): MonoTypeOperatorFunction<MIDIMessageEvent> {\n return (source) =>\n source.pipe(filter(({target}) => (target as MIDIPort).name === name));\n}\n","import {filter, type MonoTypeOperatorFunction} from 'rxjs';\n\nimport {between} from '../utils/between';\n\n/**\n * Filter MIDI messages to main volume changes only\n */\nexport function mainVolume(): MonoTypeOperatorFunction<WebMidi.MIDIMessageEvent> {\n return (source) =>\n source.pipe(filter(({data}) => between(data[0] ?? 0, 176, 191) && data[1] === 7));\n}\n","import {filter, type MonoTypeOperatorFunction} from 'rxjs';\n\nimport {between} from '../utils/between';\n\n/**\n * Filter MIDI messages to modulation wheel changes only\n */\nexport function modulationWheel(): MonoTypeOperatorFunction<WebMidi.MIDIMessageEvent> {\n return (source) =>\n source.pipe(filter(({data}) => between(data[0] ?? 0, 176, 191) && data[1] === 1));\n}\n","import {filter, map, type MonoTypeOperatorFunction} from 'rxjs';\n\nimport {between} from '../utils/between';\n\n/**\n * Filter MIDI messages to notes only\n *\n * IMPORTANT: It normalizes noteOff events to noteOn with 0 velocity\n */\nexport function notes(): MonoTypeOperatorFunction<WebMidi.MIDIMessageEvent> {\n return (source) =>\n source.pipe(\n filter(({data}) => between(data[0] ?? 0, 128, 159)),\n map((event) => {\n if (between(event.data[0] ?? 0, 128, 143)) {\n if (event.data[0]) {\n event.data[0] += 16;\n }\n\n if (event.data[2]) {\n event.data[2] = 0;\n }\n }\n\n return event;\n }),\n );\n}\n","import {filter, type MonoTypeOperatorFunction} from 'rxjs';\n\nimport {between} from '../utils/between';\n\n/**\n * Filter MIDI messages to pan changes only\n */\nexport function pan(): MonoTypeOperatorFunction<WebMidi.MIDIMessageEvent> {\n return (source) =>\n source.pipe(\n filter(({data}) => between(data[0] ?? 0, 176, 191) && data[1] === 10),\n );\n}\n","import {filter, type MonoTypeOperatorFunction} from 'rxjs';\n\nimport {between} from '../utils/between';\n\n/**\n * Filter MIDI messages to pitch bend changes only\n */\nexport function pitchBend(): MonoTypeOperatorFunction<WebMidi.MIDIMessageEvent> {\n return (source) => source.pipe(filter(({data}) => between(data[0] ?? 0, 224, 239)));\n}\n","import {filter, type MonoTypeOperatorFunction} from 'rxjs';\n\nimport {between} from '../utils/between';\n\n/**\n * Filter MIDI messages to polyphonic aftertouch changes only\n */\nexport function polyphonicAftertouch(): MonoTypeOperatorFunction<WebMidi.MIDIMessageEvent> {\n return (source) => source.pipe(filter(({data}) => between(data[0] ?? 0, 160, 175)));\n}\n","import {filter, type MonoTypeOperatorFunction} from 'rxjs';\n\nimport {between} from '../utils/between';\n\n/**\n * Filter MIDI messages to program changes only\n */\nexport function programChange(): MonoTypeOperatorFunction<WebMidi.MIDIMessageEvent> {\n return (source) => source.pipe(filter(({data}) => between(data[0] ?? 0, 208, 223)));\n}\n","import {filter, type MonoTypeOperatorFunction} from 'rxjs';\n\nimport {between} from '../utils/between';\n\n/**\n * Filter MIDI messages to sustain pedal changes only\n */\nexport function sustainPedal(): MonoTypeOperatorFunction<WebMidi.MIDIMessageEvent> {\n return (source) =>\n source.pipe(\n filter(({data}) => between(data[0] ?? 0, 176, 191) && data[1] === 64),\n );\n}\n","import {map, type OperatorFunction} from 'rxjs';\n\n/**\n * Extract MIDI data from event\n */\nexport function toData(): OperatorFunction<WebMidi.MIDIMessageEvent, Uint8Array> {\n return (source) => source.pipe(map(({data}) => data));\n}\n","import {map, type OperatorFunction} from 'rxjs';\n\n/**\n * Extract data byte (2nd) from MIDI message\n *\n * NOTE: Some status messages do not have 2nd byte, use it when you're certain\n */\nexport function toDataByte(): OperatorFunction<WebMidi.MIDIMessageEvent, number> {\n return (source) => source.pipe(map(({data}) => data[1] ?? 0));\n}\n","import {map, type OperatorFunction} from 'rxjs';\n\n/**\n * Extract status byte (1st) from MIDI message\n */\nexport function toStatusByte(): OperatorFunction<MIDIMessageEvent, number> {\n return (source) => source.pipe(map(({data}) => data?.[0] ?? 0));\n}\n","import {map, type OperatorFunction} from 'rxjs';\n\n/**\n * Extract received time from MIDI event\n */\nexport function toTimeStamp(): OperatorFunction<WebMidi.MIDIMessageEvent, number> {\n return (source) => source.pipe(map(({timeStamp}) => timeStamp));\n}\n","import {map, type OperatorFunction} from 'rxjs';\n\n/**\n * Extract value byte (3rd) from MIDI message\n *\n * NOTE: Some status messages do not have 3rd byte, use it when you're certain\n */\nexport function toValueByte(): OperatorFunction<WebMidi.MIDIMessageEvent, number> {\n return (source) => source.pipe(map(({data}) => data[2] ?? 0));\n}\n","/**\n * Convert MIDI notes to frequencies\n *\n * @param note MIDI note\n * @param tuning tuning for middle A (440 by default)\n */\nexport function toFrequency(note: number, tuning = 440): number {\n return 2 ** ((note - 69) / 12) * tuning;\n}\n","import {Pipe, type PipeTransform} from '@angular/core';\n\nimport {toFrequency} from '../../utils/to-frequency';\n\n@Pipe({name: 'frequency'})\nexport class WaMidiFrequencyPipe implements PipeTransform {\n public readonly transform = toFrequency;\n}\n","import {InjectionToken} from '@angular/core';\n\nexport const WA_SYSEX = new InjectionToken<boolean>('[WA_SYSEX]', {factory: () => false});\n","import {inject, InjectionToken} from '@angular/core';\nimport {WA_NAVIGATOR} from '@ng-web-apis/common';\n\nimport {WA_SYSEX} from './sysex';\n\nexport const WA_MIDI_ACCESS = new InjectionToken<Promise<globalThis.MIDIAccess>>(\n '[WA_MIDI_ACCESS]',\n {\n factory: async () => {\n const navigatorRef = inject<Navigator | Partial<Navigator>>(WA_NAVIGATOR);\n const sysex = inject(WA_SYSEX);\n\n return navigatorRef.requestMIDIAccess\n ? navigatorRef.requestMIDIAccess({sysex})\n : Promise.reject(new Error('Web MIDI API is not supported'));\n },\n },\n);\n","import {InjectionToken} from '@angular/core';\n\nexport const WA_MIDI_INPUT = new InjectionToken<Promise<MIDIInput | undefined>>(\n '[WA_MIDI_INPUT]',\n);\n","import {inject} from '@angular/core';\nimport {\n from,\n fromEvent,\n map,\n type Observable,\n of,\n shareReplay,\n startWith,\n switchMap,\n} from 'rxjs';\n\nimport {WA_MIDI_ACCESS} from '../tokens/midi-access';\n\nexport function getPortsStream(ports: 'inputs'): Observable<MIDIInput[]>;\nexport function getPortsStream(ports: 'outputs'): Observable<MIDIOutput[]>;\nexport function getPortsStream(\n ports: 'inputs' | 'outputs',\n): Observable<Array<MIDIInput | MIDIOutput>> {\n return from(inject(WA_MIDI_ACCESS).catch(() => null)).pipe(\n switchMap((access) => {\n const inputs: Array<MIDIInput | MIDIOutput> = [];\n\n access?.[ports].forEach((input) => {\n inputs.push(input);\n });\n\n return access\n ? fromEvent(access, 'statechange').pipe(\n map(() => inputs),\n startWith(inputs),\n )\n : of([]);\n }),\n\n shareReplay(1),\n );\n}\n","import {InjectionToken} from '@angular/core';\nimport {type Observable} from 'rxjs';\n\nimport {getPortsStream} from '../utils/get-ports-stream';\n\nexport const WA_MIDI_INPUTS = new InjectionToken<Observable<MIDIInput[]>>(\n '[WA_MIDI_INPUTS]',\n {factory: () => getPortsStream('inputs')},\n);\n","import {inject, InjectionToken} from '@angular/core';\nimport {\n from,\n fromEvent,\n merge,\n type Observable,\n share,\n startWith,\n switchMap,\n throwError,\n} from 'rxjs';\n\nimport {WA_MIDI_ACCESS} from './midi-access';\n\nexport const WA_MIDI_MESSAGES = new InjectionToken<Observable<WebMidi.MIDIMessageEvent>>(\n '[WA_MIDI_MESSAGES]',\n {\n factory: () =>\n from(inject(WA_MIDI_ACCESS).catch((e: unknown) => e as Error)).pipe(\n switchMap((access: Error | MIDIAccess) =>\n access instanceof Error\n ? throwError(access)\n : fromEvent(access as any, 'statechange').pipe(\n startWith(null),\n switchMap(() => {\n const inputs: MIDIInput[] = [];\n\n access.inputs.forEach((input) => {\n inputs.push(input);\n });\n\n return merge(\n ...inputs.map((input) =>\n fromEvent(input, 'midimessage'),\n ),\n );\n }),\n ),\n ),\n share(),\n ) as unknown as Observable<WebMidi.MIDIMessageEvent>,\n },\n);\n","import {InjectionToken} from '@angular/core';\n\nexport const WA_MIDI_OUTPUT = new InjectionToken<Promise<MIDIOutput | undefined>>(\n '[WA_MIDI_OUTPUT]',\n);\n","import {InjectionToken} from '@angular/core';\nimport {type Observable} from 'rxjs';\n\nimport {getPortsStream} from '../utils/get-ports-stream';\n\nexport const WA_MIDI_OUTPUTS = new InjectionToken<Observable<MIDIOutput[]>>(\n '[WA_MIDI_OUTPUTS]',\n {factory: () => getPortsStream('outputs')},\n);\n","import {inject, InjectionToken} from '@angular/core';\nimport {WA_NAVIGATOR} from '@ng-web-apis/common';\n\nexport const WA_MIDI_SUPPORT = new InjectionToken<boolean>('[WA_MIDI_SUPPORT]', {\n factory: () => !!inject(WA_NAVIGATOR).requestMIDIAccess,\n});\n","import {InjectionToken} from '@angular/core';\n\nexport const WA_MIDI_INPUT_QUERY = new InjectionToken<string>('[WA_MIDI_INPUT_QUERY]');\n","import {type Provider} from '@angular/core';\n\nimport {WA_MIDI_ACCESS} from '../tokens/midi-access';\nimport {WA_MIDI_INPUT} from '../tokens/midi-input';\nimport {WA_MIDI_INPUT_QUERY} from '../tokens/midi-input-query';\n\n/**\n * Provide MIDIInput by id\n *\n * @param id\n */\nexport function inputById(id: string): Provider[] {\n return [\n {provide: WA_MIDI_INPUT_QUERY, useValue: id},\n {\n provide: WA_MIDI_INPUT,\n deps: [WA_MIDI_ACCESS, WA_MIDI_INPUT_QUERY],\n useFactory: async (\n midiAccess: Promise<MIDIAccess>,\n id: string,\n ): Promise<MIDIInput | undefined> =>\n midiAccess.then((access) => {\n let result: MIDIInput | undefined;\n\n access.inputs.forEach((input) => {\n if (input.id === id) {\n result = input;\n }\n });\n\n return result;\n }),\n },\n ];\n}\n","import {type Provider} from '@angular/core';\n\nimport {WA_MIDI_ACCESS} from '../tokens/midi-access';\nimport {WA_MIDI_INPUT} from '../tokens/midi-input';\nimport {WA_MIDI_INPUT_QUERY} from '../tokens/midi-input-query';\n\n/**\n * Provide MIDIInput by name\n *\n * @param name\n */\nexport function inputByName(name: string): Provider[] {\n return [\n {provide: WA_MIDI_INPUT_QUERY, useValue: name},\n {\n provide: WA_MIDI_INPUT,\n deps: [WA_MIDI_ACCESS, WA_MIDI_INPUT_QUERY],\n useFactory: async (\n midiAccess: Promise<MIDIAccess>,\n name: string,\n ): Promise<MIDIInput | undefined> =>\n midiAccess.then((access: MIDIAccess) => {\n let result: MIDIInput | undefined;\n\n access.inputs.forEach((input) => {\n if (input.name === name) {\n result = input;\n }\n });\n\n return result;\n }),\n },\n ];\n}\n","import {InjectionToken} from '@angular/core';\n\nexport const WA_MIDI_OUTPUT_QUERY = new InjectionToken<string>('[WA_MIDI_OUTPUT_QUERY]');\n","import {type Provider} from '@angular/core';\n\nimport {WA_MIDI_ACCESS} from '../tokens/midi-access';\nimport {WA_MIDI_OUTPUT} from '../tokens/midi-output';\nimport {WA_MIDI_OUTPUT_QUERY} from '../tokens/midi-output-query';\n\n/**\n * Provide MIDIOutput by id\n *\n * @param id\n */\nexport function outputById(id: string): Provider[] {\n return [\n {provide: WA_MIDI_OUTPUT_QUERY, useValue: id},\n {\n provide: WA_MIDI_OUTPUT,\n deps: [WA_MIDI_ACCESS, WA_MIDI_OUTPUT_QUERY],\n useFactory: async (\n midiAccess: Promise<MIDIAccess>,\n id: string,\n ): Promise<MIDIOutput | undefined> =>\n midiAccess.then((access: MIDIAccess): MIDIOutput | undefined => {\n let result: MIDIOutput | undefined;\n\n access.outputs.forEach((output) => {\n if (output.id === id) {\n result = output;\n }\n });\n\n return result;\n }),\n },\n ];\n}\n","import {type Provider} from '@angular/core';\n\nimport {WA_MIDI_ACCESS} from '../tokens/midi-access';\nimport {WA_MIDI_OUTPUT} from '../tokens/midi-output';\nimport {WA_MIDI_OUTPUT_QUERY} from '../tokens/midi-output-query';\n\n/**\n * Provide MIDIOutput by name\n *\n * @param name\n */\nexport function outputByName(name: string): Provider[] {\n return [\n {provide: WA_MIDI_OUTPUT_QUERY, useValue: name},\n {\n provide: WA_MIDI_OUTPUT,\n deps: [WA_MIDI_ACCESS, WA_MIDI_OUTPUT_QUERY],\n useFactory: async (\n midiAccess: Promise<MIDIAccess>,\n name: string,\n ): Promise<MIDIOutput | undefined> =>\n midiAccess.then((access: MIDIAccess): MIDIOutput | undefined => {\n let result: MIDIOutput | undefined;\n\n access.outputs.forEach((output) => {\n if (output.name === name) {\n result = output;\n }\n });\n\n return result;\n }),\n },\n ];\n}\n","const COEFFICIENT = 2 ** (1 / 12);\n\n/**\n * Convert frequencies to MIDI notes\n *\n * @param frequency\n * @param tuning tuning for middle A (440 by default)\n */\nexport function toNote(frequency: number, tuning = 440): number {\n return Math.round(Math.log(frequency / tuning) / Math.log(COEFFICIENT)) + 69;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}