effect-web-midi 0.1.12 → 0.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/Parsing.js +1 -1
- package/dist/src/Parsing.js.map +1 -1
- package/dist/src/internal/Parsing.js +26 -18
- package/dist/src/internal/Parsing.js.map +1 -1
- package/dist-types/src/Parsing.d.ts +1 -1
- package/dist-types/src/Parsing.d.ts.map +1 -1
- package/dist-types/src/internal/Parsing.d.ts +45 -40
- package/dist-types/src/internal/Parsing.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/Parsing.ts +26 -8
- package/src/internal/Parsing.ts +133 -64
package/dist/src/Parsing.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { isControlChange, isPitchBendChange, withParsedDataField, withTouchpadPositionUpdates, } from "./internal/Parsing.js";
|
|
1
|
+
export { isChannelPressure, isChannelPressurePayload, isControlChange, isControlChangePayload, isNotePress, isNotePressPayload, isNoteRelease, isNoteReleasePayload, isPitchBendChange, isPitchBendChangePayload, isTouchpadPositionUpdate, isTouchpadPositionUpdatePayload, isTouchpadRelease, isTouchpadReleasePayload, isUnknownReply, isUnknownReplyPayload, withParsedDataField, withTouchpadPositionUpdates, } from "./internal/Parsing.js";
|
|
2
2
|
//# sourceMappingURL=Parsing.js.map
|
package/dist/src/Parsing.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Parsing.js","sourceRoot":"","sources":["../../src/Parsing.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"Parsing.js","sourceRoot":"","sources":["../../src/Parsing.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,iBAAiB,EACjB,wBAAwB,EACxB,eAAe,EACf,sBAAsB,EACtB,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,wBAAwB,EACxB,wBAAwB,EACxB,+BAA+B,EAC/B,iBAAiB,EACjB,wBAAwB,EACxB,cAAc,EACd,qBAAqB,EAUrB,mBAAmB,EACnB,2BAA2B,GAC5B,MAAM,uBAAuB,CAAA"}
|
|
@@ -13,7 +13,7 @@ import * as Stream from 'effect/Stream';
|
|
|
13
13
|
export const withParsedDataField = (self) => Stream.map(self, ({ midiMessage, ...obj }) => ({
|
|
14
14
|
...obj,
|
|
15
15
|
_tag: 'ParsedMIDIMessage',
|
|
16
|
-
midiMessage:
|
|
16
|
+
midiMessage: parseMidiMessagePayload(midiMessage),
|
|
17
17
|
}));
|
|
18
18
|
/**
|
|
19
19
|
*
|
|
@@ -22,9 +22,9 @@ export const withParsedDataField = (self) => Stream.map(self, ({ midiMessage, ..
|
|
|
22
22
|
*/
|
|
23
23
|
export const withTouchpadPositionUpdates = (self) => Stream.mapAccum(self, { x: null, y: null }, (ctx, current) => {
|
|
24
24
|
const { midiMessage, ...rest } = current;
|
|
25
|
-
const state =
|
|
25
|
+
const state = isControlChangePayload(midiMessage)
|
|
26
26
|
? { ...ctx, y: midiMessage.value }
|
|
27
|
-
:
|
|
27
|
+
: isPitchBendChangePayload(midiMessage)
|
|
28
28
|
? { ...ctx, x: midiMessage.value }
|
|
29
29
|
: midiMessage._tag === 'Touchpad Release'
|
|
30
30
|
? { x: null, y: null }
|
|
@@ -43,7 +43,7 @@ export const withTouchpadPositionUpdates = (self) => Stream.mapAccum(self, { x:
|
|
|
43
43
|
: Stream.succeed(current),
|
|
44
44
|
];
|
|
45
45
|
}).pipe(Stream.flatten());
|
|
46
|
-
function
|
|
46
|
+
function parseMidiMessagePayload(rawPayload) {
|
|
47
47
|
const unknown = () => {
|
|
48
48
|
let stack = '';
|
|
49
49
|
if ('stackTraceLimit' in Error &&
|
|
@@ -58,20 +58,20 @@ function dataEntryParser(midiMessage) {
|
|
|
58
58
|
}
|
|
59
59
|
const result = {
|
|
60
60
|
_tag: 'Unknown Reply',
|
|
61
|
-
unexpectedData:
|
|
61
|
+
unexpectedData: rawPayload.toString(),
|
|
62
62
|
stack,
|
|
63
63
|
};
|
|
64
64
|
return result;
|
|
65
65
|
};
|
|
66
|
-
const status =
|
|
66
|
+
const status = rawPayload.at(0);
|
|
67
67
|
if (status === undefined)
|
|
68
68
|
return unknown();
|
|
69
|
-
const second =
|
|
69
|
+
const second = rawPayload.at(1);
|
|
70
70
|
if (second === undefined)
|
|
71
71
|
return unknown();
|
|
72
72
|
const code = status >> 4;
|
|
73
73
|
const channel = status & 0b1111;
|
|
74
|
-
if (
|
|
74
|
+
if (rawPayload.length === 2) {
|
|
75
75
|
if (code === 0xd) {
|
|
76
76
|
return {
|
|
77
77
|
_tag: 'Channel Pressure',
|
|
@@ -80,9 +80,9 @@ function dataEntryParser(midiMessage) {
|
|
|
80
80
|
};
|
|
81
81
|
}
|
|
82
82
|
}
|
|
83
|
-
if (
|
|
83
|
+
if (rawPayload.length !== 3)
|
|
84
84
|
return unknown();
|
|
85
|
-
const third =
|
|
85
|
+
const third = rawPayload.at(2);
|
|
86
86
|
if (third === undefined)
|
|
87
87
|
return unknown();
|
|
88
88
|
if (code === 0x8) {
|
|
@@ -125,12 +125,20 @@ function dataEntryParser(midiMessage) {
|
|
|
125
125
|
}
|
|
126
126
|
return unknown();
|
|
127
127
|
}
|
|
128
|
-
export const
|
|
129
|
-
export const
|
|
130
|
-
export const
|
|
131
|
-
export const
|
|
132
|
-
export const
|
|
133
|
-
export const
|
|
134
|
-
export const
|
|
135
|
-
export const
|
|
128
|
+
export const isUnknownReplyPayload = (e) => e._tag === 'Unknown Reply';
|
|
129
|
+
export const isUnknownReply = (e) => isUnknownReplyPayload(e.midiMessage);
|
|
130
|
+
export const isNotePressPayload = (e) => e._tag === 'Note Press';
|
|
131
|
+
export const isNotePress = (e) => isNotePressPayload(e.midiMessage);
|
|
132
|
+
export const isChannelPressurePayload = (e) => e._tag === 'Channel Pressure';
|
|
133
|
+
export const isChannelPressure = (e) => isChannelPressurePayload(e.midiMessage);
|
|
134
|
+
export const isNoteReleasePayload = (e) => e._tag === 'Note Release';
|
|
135
|
+
export const isNoteRelease = (e) => isNoteReleasePayload(e.midiMessage);
|
|
136
|
+
export const isControlChangePayload = (e) => e._tag === 'Control Change';
|
|
137
|
+
export const isControlChange = (e) => isControlChangePayload(e.midiMessage);
|
|
138
|
+
export const isTouchpadReleasePayload = (e) => e._tag === 'Touchpad Release';
|
|
139
|
+
export const isTouchpadRelease = (e) => isTouchpadReleasePayload(e.midiMessage);
|
|
140
|
+
export const isPitchBendChangePayload = (e) => e._tag === 'Pitch Bend Change';
|
|
141
|
+
export const isPitchBendChange = (e) => isPitchBendChangePayload(e.midiMessage);
|
|
142
|
+
export const isTouchpadPositionUpdatePayload = (e) => e._tag === 'Touchpad Position Update';
|
|
143
|
+
export const isTouchpadPositionUpdate = (e) => isTouchpadPositionUpdatePayload(e.midiMessage);
|
|
136
144
|
//# sourceMappingURL=Parsing.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Parsing.js","sourceRoot":"","sources":["../../../src/internal/Parsing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"Parsing.js","sourceRoot":"","sources":["../../../src/internal/Parsing.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { type
|
|
1
|
+
export { type ChannelPressurePayload, type ControlChangePayload, type DefaultParsedMIDIMessagePayload, isChannelPressure, isChannelPressurePayload, isControlChange, isControlChangePayload, isNotePress, isNotePressPayload, isNoteRelease, isNoteReleasePayload, isPitchBendChange, isPitchBendChangePayload, isTouchpadPositionUpdate, isTouchpadPositionUpdatePayload, isTouchpadRelease, isTouchpadReleasePayload, isUnknownReply, isUnknownReplyPayload, type MIDIMessage, type NotePressPayload, type NoteReleasePayload, type ParsedMIDIMessage, type PitchBendChangePayload, type TaggedObject, type TouchpadPositionUpdatePayload, type TouchpadReleasePayload, type UnknownReplyPayload, withParsedDataField, withTouchpadPositionUpdates, } from './internal/Parsing.ts';
|
|
2
2
|
//# sourceMappingURL=Parsing.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Parsing.d.ts","sourceRoot":"","sources":["../../src/Parsing.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,
|
|
1
|
+
{"version":3,"file":"Parsing.d.ts","sourceRoot":"","sources":["../../src/Parsing.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EACzB,KAAK,+BAA+B,EACpC,iBAAiB,EACjB,wBAAwB,EACxB,eAAe,EACf,sBAAsB,EACtB,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,wBAAwB,EACxB,wBAAwB,EACxB,+BAA+B,EAC/B,iBAAiB,EACjB,wBAAwB,EACxB,cAAc,EACd,qBAAqB,EACrB,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,YAAY,EACjB,KAAK,6BAA6B,EAClC,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,mBAAmB,EACnB,2BAA2B,GAC5B,MAAM,uBAAuB,CAAA"}
|
|
@@ -3,101 +3,106 @@
|
|
|
3
3
|
* MIDI API with the only MIDI device I have: nanoPAD v1
|
|
4
4
|
*/
|
|
5
5
|
import * as Stream from 'effect/Stream';
|
|
6
|
+
import type * as EMIDIInput from './EMIDIInput.ts';
|
|
6
7
|
/**
|
|
7
8
|
*
|
|
8
9
|
* @param self
|
|
9
10
|
* @returns
|
|
10
11
|
*/
|
|
11
|
-
export declare const withParsedDataField: <A extends
|
|
12
|
-
readonly midiMessage: Uint8Array<ArrayBuffer>;
|
|
13
|
-
}, E, R>(self: Stream.Stream<A, E, R>) => Stream.Stream<Omit<A, "midiMessage" | "_tag"> & {
|
|
14
|
-
readonly _tag: "ParsedMIDIMessage";
|
|
15
|
-
readonly midiMessage: ParsedMIDIMessages;
|
|
16
|
-
}, E, R>;
|
|
12
|
+
export declare const withParsedDataField: <A extends MIDIMessage, E, R>(self: Stream.Stream<A, E, R>) => Stream.Stream<ParsedMIDIMessage, E, R>;
|
|
17
13
|
/**
|
|
18
14
|
*
|
|
19
15
|
* @param self
|
|
20
16
|
* @returns
|
|
21
17
|
*/
|
|
22
18
|
export declare const withTouchpadPositionUpdates: <A extends {
|
|
23
|
-
midiMessage:
|
|
19
|
+
midiMessage: ControlChangePayload | TouchpadReleasePayload | PitchBendChangePayload | {
|
|
24
20
|
_tag: string & {};
|
|
25
21
|
};
|
|
26
22
|
}, E, R>(self: Stream.Stream<A, E, R>) => Stream.Stream<A | (Omit<A, "midiMessage"> & {
|
|
27
|
-
readonly midiMessage:
|
|
23
|
+
readonly midiMessage: TouchpadPositionUpdatePayload;
|
|
28
24
|
}), E, R>;
|
|
29
|
-
export type
|
|
30
|
-
export interface
|
|
25
|
+
export type DefaultParsedMIDIMessagePayload = NoteReleasePayload | NotePressPayload | UnknownReplyPayload | ControlChangePayload | ChannelPressurePayload | TouchpadReleasePayload | PitchBendChangePayload;
|
|
26
|
+
export interface MIDIMessage {
|
|
27
|
+
readonly _tag: 'MIDIMessage';
|
|
28
|
+
readonly cameFrom: EMIDIInput.EMIDIInput;
|
|
29
|
+
readonly capturedAt: Date;
|
|
30
|
+
readonly midiMessage: Uint8Array<ArrayBuffer>;
|
|
31
|
+
}
|
|
32
|
+
export interface ParsedMIDIMessage<Payload extends TaggedObject = DefaultParsedMIDIMessagePayload> {
|
|
33
|
+
readonly _tag: 'ParsedMIDIMessage';
|
|
34
|
+
readonly cameFrom: EMIDIInput.EMIDIInput;
|
|
35
|
+
readonly capturedAt: Date;
|
|
36
|
+
readonly midiMessage: Payload;
|
|
37
|
+
}
|
|
38
|
+
export type TaggedObject = {
|
|
39
|
+
readonly _tag: string;
|
|
40
|
+
};
|
|
41
|
+
export interface UnknownReplyPayload extends Readonly<{
|
|
31
42
|
_tag: 'Unknown Reply';
|
|
32
43
|
unexpectedData: string;
|
|
33
44
|
stack: string;
|
|
34
45
|
}> {
|
|
35
46
|
}
|
|
36
|
-
export declare const
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
export interface NotePress extends Readonly<{
|
|
47
|
+
export declare const isUnknownReplyPayload: (e: TaggedObject) => e is UnknownReplyPayload;
|
|
48
|
+
export declare const isUnknownReply: (e: ParsedMIDIMessage<TaggedObject>) => e is ParsedMIDIMessage<UnknownReplyPayload>;
|
|
49
|
+
export interface NotePressPayload extends Readonly<{
|
|
40
50
|
_tag: 'Note Press';
|
|
41
51
|
channel: number;
|
|
42
52
|
note: number;
|
|
43
53
|
velocity: number;
|
|
44
54
|
}> {
|
|
45
55
|
}
|
|
46
|
-
export declare const
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
export interface ChannelPressure extends Readonly<{
|
|
56
|
+
export declare const isNotePressPayload: (e: TaggedObject) => e is NotePressPayload;
|
|
57
|
+
export declare const isNotePress: (e: ParsedMIDIMessage<TaggedObject>) => e is ParsedMIDIMessage<NotePressPayload>;
|
|
58
|
+
export interface ChannelPressurePayload extends Readonly<{
|
|
50
59
|
_tag: 'Channel Pressure';
|
|
51
60
|
channel: number;
|
|
52
61
|
velocity: number;
|
|
53
62
|
}> {
|
|
54
63
|
}
|
|
55
|
-
export declare const
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
export interface NoteRelease extends Readonly<{
|
|
64
|
+
export declare const isChannelPressurePayload: (e: TaggedObject) => e is ChannelPressurePayload;
|
|
65
|
+
export declare const isChannelPressure: (e: ParsedMIDIMessage<TaggedObject>) => e is ParsedMIDIMessage<ChannelPressurePayload>;
|
|
66
|
+
export interface NoteReleasePayload extends Readonly<{
|
|
59
67
|
_tag: 'Note Release';
|
|
60
68
|
channel: number;
|
|
61
69
|
note: number;
|
|
62
70
|
}> {
|
|
63
71
|
}
|
|
64
|
-
export declare const
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
export interface ControlChange extends Readonly<{
|
|
72
|
+
export declare const isNoteReleasePayload: (e: TaggedObject) => e is NoteReleasePayload;
|
|
73
|
+
export declare const isNoteRelease: (e: ParsedMIDIMessage<TaggedObject>) => e is ParsedMIDIMessage<NoteReleasePayload>;
|
|
74
|
+
export interface ControlChangePayload extends Readonly<{
|
|
68
75
|
_tag: 'Control Change';
|
|
69
76
|
channel: number;
|
|
70
77
|
control: number;
|
|
71
78
|
value: number;
|
|
72
79
|
}> {
|
|
73
80
|
}
|
|
74
|
-
export declare const
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
export interface TouchpadRelease extends Readonly<{
|
|
81
|
+
export declare const isControlChangePayload: (e: TaggedObject) => e is ControlChangePayload;
|
|
82
|
+
export declare const isControlChange: (e: ParsedMIDIMessage<TaggedObject>) => e is ParsedMIDIMessage<ControlChangePayload>;
|
|
83
|
+
export interface TouchpadReleasePayload extends Readonly<{
|
|
78
84
|
_tag: 'Touchpad Release';
|
|
79
85
|
channel: number;
|
|
80
86
|
}> {
|
|
81
87
|
}
|
|
82
|
-
export declare const
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
export interface PitchBendChange extends Readonly<{
|
|
88
|
+
export declare const isTouchpadReleasePayload: (e: TaggedObject) => e is TouchpadReleasePayload;
|
|
89
|
+
export declare const isTouchpadRelease: (e: ParsedMIDIMessage<TaggedObject>) => e is ParsedMIDIMessage<TouchpadReleasePayload>;
|
|
90
|
+
export interface PitchBendChangePayload extends Readonly<{
|
|
86
91
|
_tag: 'Pitch Bend Change';
|
|
87
92
|
channel: number;
|
|
88
93
|
value: number;
|
|
89
94
|
}> {
|
|
90
95
|
}
|
|
91
|
-
export declare const
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
export interface TouchpadPositionUpdate extends Readonly<{
|
|
96
|
+
export declare const isPitchBendChangePayload: (e: TaggedObject) => e is PitchBendChangePayload;
|
|
97
|
+
export declare const isPitchBendChange: (e: ParsedMIDIMessage<TaggedObject>) => e is ParsedMIDIMessage<PitchBendChangePayload>;
|
|
98
|
+
export interface TouchpadPositionUpdatePayload extends Readonly<{
|
|
95
99
|
_tag: 'Touchpad Position Update';
|
|
96
100
|
x: number;
|
|
97
101
|
y: number;
|
|
98
102
|
}> {
|
|
99
103
|
}
|
|
100
|
-
export declare const
|
|
104
|
+
export declare const isTouchpadPositionUpdatePayload: (e: {
|
|
101
105
|
_tag: string;
|
|
102
|
-
}) => e is
|
|
106
|
+
}) => e is TouchpadPositionUpdatePayload;
|
|
107
|
+
export declare const isTouchpadPositionUpdate: (e: ParsedMIDIMessage<TaggedObject>) => e is ParsedMIDIMessage<TouchpadPositionUpdatePayload>;
|
|
103
108
|
//# sourceMappingURL=Parsing.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Parsing.d.ts","sourceRoot":"","sources":["../../../src/internal/Parsing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"Parsing.d.ts","sourceRoot":"","sources":["../../../src/internal/Parsing.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/Parsing.ts
CHANGED
|
@@ -1,14 +1,32 @@
|
|
|
1
1
|
export {
|
|
2
|
-
type
|
|
2
|
+
type ChannelPressurePayload,
|
|
3
|
+
type ControlChangePayload,
|
|
4
|
+
type DefaultParsedMIDIMessagePayload,
|
|
5
|
+
isChannelPressure,
|
|
6
|
+
isChannelPressurePayload,
|
|
3
7
|
isControlChange,
|
|
8
|
+
isControlChangePayload,
|
|
9
|
+
isNotePress,
|
|
10
|
+
isNotePressPayload,
|
|
11
|
+
isNoteRelease,
|
|
12
|
+
isNoteReleasePayload,
|
|
4
13
|
isPitchBendChange,
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
14
|
+
isPitchBendChangePayload,
|
|
15
|
+
isTouchpadPositionUpdate,
|
|
16
|
+
isTouchpadPositionUpdatePayload,
|
|
17
|
+
isTouchpadRelease,
|
|
18
|
+
isTouchpadReleasePayload,
|
|
19
|
+
isUnknownReply,
|
|
20
|
+
isUnknownReplyPayload,
|
|
21
|
+
type MIDIMessage,
|
|
22
|
+
type NotePressPayload,
|
|
23
|
+
type NoteReleasePayload,
|
|
24
|
+
type ParsedMIDIMessage,
|
|
25
|
+
type PitchBendChangePayload,
|
|
26
|
+
type TaggedObject,
|
|
27
|
+
type TouchpadPositionUpdatePayload,
|
|
28
|
+
type TouchpadReleasePayload,
|
|
29
|
+
type UnknownReplyPayload,
|
|
12
30
|
withParsedDataField,
|
|
13
31
|
withTouchpadPositionUpdates,
|
|
14
32
|
} from './internal/Parsing.ts'
|
package/src/internal/Parsing.ts
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import * as Stream from 'effect/Stream'
|
|
7
|
+
import type * as EMIDIInput from './EMIDIInput.ts'
|
|
7
8
|
|
|
8
9
|
//? NOTE: Look at the issue https://github.com/WebAudio/web-midi-api/issues/179
|
|
9
10
|
// which discusses higher-level MIDI message access
|
|
@@ -13,25 +14,14 @@ import * as Stream from 'effect/Stream'
|
|
|
13
14
|
* @param self
|
|
14
15
|
* @returns
|
|
15
16
|
*/
|
|
16
|
-
export const withParsedDataField = <
|
|
17
|
-
A extends { readonly midiMessage: Uint8Array<ArrayBuffer> },
|
|
18
|
-
E,
|
|
19
|
-
R,
|
|
20
|
-
>(
|
|
17
|
+
export const withParsedDataField = <A extends MIDIMessage, E, R>(
|
|
21
18
|
self: Stream.Stream<A, E, R>,
|
|
22
|
-
) =>
|
|
19
|
+
): Stream.Stream<ParsedMIDIMessage, E, R> =>
|
|
23
20
|
Stream.map(self, ({ midiMessage, ...obj }) => ({
|
|
24
21
|
...obj,
|
|
25
|
-
_tag: 'ParsedMIDIMessage'
|
|
26
|
-
midiMessage:
|
|
27
|
-
}))
|
|
28
|
-
Omit<A, 'midiMessage' | '_tag'> & {
|
|
29
|
-
readonly _tag: 'ParsedMIDIMessage'
|
|
30
|
-
readonly midiMessage: ParsedMIDIMessages
|
|
31
|
-
},
|
|
32
|
-
E,
|
|
33
|
-
R
|
|
34
|
-
>
|
|
22
|
+
_tag: 'ParsedMIDIMessage',
|
|
23
|
+
midiMessage: parseMidiMessagePayload(midiMessage),
|
|
24
|
+
}))
|
|
35
25
|
|
|
36
26
|
/**
|
|
37
27
|
*
|
|
@@ -41,9 +31,9 @@ export const withParsedDataField = <
|
|
|
41
31
|
export const withTouchpadPositionUpdates = <
|
|
42
32
|
A extends {
|
|
43
33
|
midiMessage:
|
|
44
|
-
|
|
|
45
|
-
|
|
|
46
|
-
|
|
|
34
|
+
| ControlChangePayload
|
|
35
|
+
| TouchpadReleasePayload
|
|
36
|
+
| PitchBendChangePayload
|
|
47
37
|
| { _tag: string & {} }
|
|
48
38
|
},
|
|
49
39
|
E,
|
|
@@ -52,7 +42,9 @@ export const withTouchpadPositionUpdates = <
|
|
|
52
42
|
self: Stream.Stream<A, E, R>,
|
|
53
43
|
): Stream.Stream<
|
|
54
44
|
| A
|
|
55
|
-
| (Omit<A, 'midiMessage'> & {
|
|
45
|
+
| (Omit<A, 'midiMessage'> & {
|
|
46
|
+
readonly midiMessage: TouchpadPositionUpdatePayload
|
|
47
|
+
}),
|
|
56
48
|
E,
|
|
57
49
|
R
|
|
58
50
|
> =>
|
|
@@ -61,9 +53,9 @@ export const withTouchpadPositionUpdates = <
|
|
|
61
53
|
{ x: null as number | null, y: null as number | null },
|
|
62
54
|
(ctx, current) => {
|
|
63
55
|
const { midiMessage, ...rest } = current
|
|
64
|
-
const state =
|
|
56
|
+
const state = isControlChangePayload(midiMessage)
|
|
65
57
|
? { ...ctx, y: midiMessage.value }
|
|
66
|
-
:
|
|
58
|
+
: isPitchBendChangePayload(midiMessage)
|
|
67
59
|
? { ...ctx, x: midiMessage.value }
|
|
68
60
|
: midiMessage._tag === 'Touchpad Release'
|
|
69
61
|
? { x: null, y: null }
|
|
@@ -78,25 +70,41 @@ export const withTouchpadPositionUpdates = <
|
|
|
78
70
|
_tag: 'Touchpad Position Update' as const,
|
|
79
71
|
x: state.x,
|
|
80
72
|
y: state.y,
|
|
81
|
-
} satisfies
|
|
73
|
+
} satisfies TouchpadPositionUpdatePayload,
|
|
82
74
|
})
|
|
83
75
|
: Stream.succeed(current),
|
|
84
76
|
]
|
|
85
77
|
},
|
|
86
78
|
).pipe(Stream.flatten())
|
|
87
79
|
|
|
88
|
-
export type
|
|
89
|
-
|
|
|
90
|
-
|
|
|
91
|
-
|
|
|
92
|
-
|
|
|
93
|
-
|
|
|
94
|
-
|
|
|
95
|
-
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
80
|
+
export type DefaultParsedMIDIMessagePayload =
|
|
81
|
+
| NoteReleasePayload
|
|
82
|
+
| NotePressPayload
|
|
83
|
+
| UnknownReplyPayload
|
|
84
|
+
| ControlChangePayload
|
|
85
|
+
| ChannelPressurePayload
|
|
86
|
+
| TouchpadReleasePayload
|
|
87
|
+
| PitchBendChangePayload
|
|
88
|
+
|
|
89
|
+
export interface MIDIMessage {
|
|
90
|
+
readonly _tag: 'MIDIMessage'
|
|
91
|
+
readonly cameFrom: EMIDIInput.EMIDIInput
|
|
92
|
+
readonly capturedAt: Date
|
|
93
|
+
readonly midiMessage: Uint8Array<ArrayBuffer>
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export interface ParsedMIDIMessage<
|
|
97
|
+
Payload extends TaggedObject = DefaultParsedMIDIMessagePayload,
|
|
98
|
+
> {
|
|
99
|
+
readonly _tag: 'ParsedMIDIMessage'
|
|
100
|
+
readonly cameFrom: EMIDIInput.EMIDIInput
|
|
101
|
+
readonly capturedAt: Date
|
|
102
|
+
readonly midiMessage: Payload
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function parseMidiMessagePayload(
|
|
106
|
+
rawPayload: Uint8Array<ArrayBuffer>,
|
|
107
|
+
): DefaultParsedMIDIMessagePayload {
|
|
100
108
|
const unknown = () => {
|
|
101
109
|
let stack = ''
|
|
102
110
|
if (
|
|
@@ -113,22 +121,22 @@ function dataEntryParser(
|
|
|
113
121
|
}
|
|
114
122
|
const result = {
|
|
115
123
|
_tag: 'Unknown Reply' as const,
|
|
116
|
-
unexpectedData:
|
|
124
|
+
unexpectedData: rawPayload.toString(),
|
|
117
125
|
stack,
|
|
118
126
|
}
|
|
119
127
|
return result
|
|
120
128
|
}
|
|
121
129
|
|
|
122
|
-
const status =
|
|
130
|
+
const status = rawPayload.at(0)
|
|
123
131
|
if (status === undefined) return unknown()
|
|
124
132
|
|
|
125
|
-
const second =
|
|
133
|
+
const second = rawPayload.at(1)
|
|
126
134
|
if (second === undefined) return unknown()
|
|
127
135
|
|
|
128
136
|
const code = status >> 4
|
|
129
137
|
const channel = status & 0b1111
|
|
130
138
|
|
|
131
|
-
if (
|
|
139
|
+
if (rawPayload.length === 2) {
|
|
132
140
|
if (code === 0xd) {
|
|
133
141
|
return {
|
|
134
142
|
_tag: 'Channel Pressure',
|
|
@@ -138,9 +146,9 @@ function dataEntryParser(
|
|
|
138
146
|
}
|
|
139
147
|
}
|
|
140
148
|
|
|
141
|
-
if (
|
|
149
|
+
if (rawPayload.length !== 3) return unknown()
|
|
142
150
|
|
|
143
|
-
const third =
|
|
151
|
+
const third = rawPayload.at(2)
|
|
144
152
|
if (third === undefined) return unknown()
|
|
145
153
|
|
|
146
154
|
if (code === 0x8) {
|
|
@@ -189,17 +197,27 @@ function dataEntryParser(
|
|
|
189
197
|
return unknown()
|
|
190
198
|
}
|
|
191
199
|
|
|
192
|
-
export
|
|
200
|
+
export type TaggedObject = { readonly _tag: string }
|
|
201
|
+
|
|
202
|
+
export interface UnknownReplyPayload
|
|
193
203
|
extends Readonly<{
|
|
194
204
|
_tag: 'Unknown Reply'
|
|
195
205
|
unexpectedData: string
|
|
196
206
|
stack: string
|
|
197
207
|
}> {}
|
|
198
208
|
|
|
199
|
-
export const
|
|
200
|
-
e
|
|
209
|
+
export const isUnknownReplyPayload = (
|
|
210
|
+
e: TaggedObject,
|
|
211
|
+
): e is UnknownReplyPayload => e._tag === 'Unknown Reply'
|
|
201
212
|
|
|
202
|
-
export
|
|
213
|
+
export const isUnknownReply = (
|
|
214
|
+
e: ParsedMIDIMessage<TaggedObject>,
|
|
215
|
+
): e is ParsedMIDIMessage<UnknownReplyPayload> =>
|
|
216
|
+
isUnknownReplyPayload(e.midiMessage)
|
|
217
|
+
|
|
218
|
+
/////////////////////////////////////////////
|
|
219
|
+
|
|
220
|
+
export interface NotePressPayload
|
|
203
221
|
extends Readonly<{
|
|
204
222
|
_tag: 'Note Press'
|
|
205
223
|
channel: number
|
|
@@ -207,26 +225,48 @@ export interface NotePress
|
|
|
207
225
|
velocity: number
|
|
208
226
|
}> {}
|
|
209
227
|
|
|
210
|
-
export const
|
|
228
|
+
export const isNotePressPayload = (e: TaggedObject): e is NotePressPayload =>
|
|
211
229
|
e._tag === 'Note Press'
|
|
212
230
|
|
|
213
|
-
export
|
|
231
|
+
export const isNotePress = (
|
|
232
|
+
e: ParsedMIDIMessage<TaggedObject>,
|
|
233
|
+
): e is ParsedMIDIMessage<NotePressPayload> => isNotePressPayload(e.midiMessage)
|
|
234
|
+
|
|
235
|
+
/////////////////////////////////////////////
|
|
236
|
+
|
|
237
|
+
export interface ChannelPressurePayload
|
|
214
238
|
extends Readonly<{
|
|
215
239
|
_tag: 'Channel Pressure'
|
|
216
240
|
channel: number
|
|
217
241
|
velocity: number
|
|
218
242
|
}> {}
|
|
219
243
|
|
|
220
|
-
export const
|
|
221
|
-
e
|
|
244
|
+
export const isChannelPressurePayload = (
|
|
245
|
+
e: TaggedObject,
|
|
246
|
+
): e is ChannelPressurePayload => e._tag === 'Channel Pressure'
|
|
247
|
+
|
|
248
|
+
export const isChannelPressure = (
|
|
249
|
+
e: ParsedMIDIMessage<TaggedObject>,
|
|
250
|
+
): e is ParsedMIDIMessage<ChannelPressurePayload> =>
|
|
251
|
+
isChannelPressurePayload(e.midiMessage)
|
|
252
|
+
|
|
253
|
+
/////////////////////////////////////////////
|
|
222
254
|
|
|
223
|
-
export interface
|
|
255
|
+
export interface NoteReleasePayload
|
|
224
256
|
extends Readonly<{ _tag: 'Note Release'; channel: number; note: number }> {}
|
|
225
257
|
|
|
226
|
-
export const
|
|
227
|
-
e
|
|
258
|
+
export const isNoteReleasePayload = (
|
|
259
|
+
e: TaggedObject,
|
|
260
|
+
): e is NoteReleasePayload => e._tag === 'Note Release'
|
|
228
261
|
|
|
229
|
-
export
|
|
262
|
+
export const isNoteRelease = (
|
|
263
|
+
e: ParsedMIDIMessage<TaggedObject>,
|
|
264
|
+
): e is ParsedMIDIMessage<NoteReleasePayload> =>
|
|
265
|
+
isNoteReleasePayload(e.midiMessage)
|
|
266
|
+
|
|
267
|
+
/////////////////////////////////////////////
|
|
268
|
+
|
|
269
|
+
export interface ControlChangePayload
|
|
230
270
|
extends Readonly<{
|
|
231
271
|
_tag: 'Control Change'
|
|
232
272
|
channel: number
|
|
@@ -234,32 +274,61 @@ export interface ControlChange
|
|
|
234
274
|
value: number
|
|
235
275
|
}> {}
|
|
236
276
|
|
|
237
|
-
export const
|
|
238
|
-
e
|
|
277
|
+
export const isControlChangePayload = (
|
|
278
|
+
e: TaggedObject,
|
|
279
|
+
): e is ControlChangePayload => e._tag === 'Control Change'
|
|
280
|
+
|
|
281
|
+
export const isControlChange = (
|
|
282
|
+
e: ParsedMIDIMessage<TaggedObject>,
|
|
283
|
+
): e is ParsedMIDIMessage<ControlChangePayload> =>
|
|
284
|
+
isControlChangePayload(e.midiMessage)
|
|
239
285
|
|
|
240
|
-
|
|
286
|
+
/////////////////////////////////////////////
|
|
287
|
+
|
|
288
|
+
export interface TouchpadReleasePayload
|
|
241
289
|
extends Readonly<{ _tag: 'Touchpad Release'; channel: number }> {}
|
|
242
290
|
|
|
243
|
-
export const
|
|
244
|
-
e
|
|
291
|
+
export const isTouchpadReleasePayload = (
|
|
292
|
+
e: TaggedObject,
|
|
293
|
+
): e is TouchpadReleasePayload => e._tag === 'Touchpad Release'
|
|
294
|
+
|
|
295
|
+
export const isTouchpadRelease = (
|
|
296
|
+
e: ParsedMIDIMessage<TaggedObject>,
|
|
297
|
+
): e is ParsedMIDIMessage<TouchpadReleasePayload> =>
|
|
298
|
+
isTouchpadReleasePayload(e.midiMessage)
|
|
299
|
+
|
|
300
|
+
/////////////////////////////////////////////
|
|
245
301
|
|
|
246
|
-
export interface
|
|
302
|
+
export interface PitchBendChangePayload
|
|
247
303
|
extends Readonly<{
|
|
248
304
|
_tag: 'Pitch Bend Change'
|
|
249
305
|
channel: number
|
|
250
306
|
value: number
|
|
251
307
|
}> {}
|
|
252
308
|
|
|
253
|
-
export const
|
|
254
|
-
e
|
|
309
|
+
export const isPitchBendChangePayload = (
|
|
310
|
+
e: TaggedObject,
|
|
311
|
+
): e is PitchBendChangePayload => e._tag === 'Pitch Bend Change'
|
|
255
312
|
|
|
256
|
-
export
|
|
313
|
+
export const isPitchBendChange = (
|
|
314
|
+
e: ParsedMIDIMessage<TaggedObject>,
|
|
315
|
+
): e is ParsedMIDIMessage<PitchBendChangePayload> =>
|
|
316
|
+
isPitchBendChangePayload(e.midiMessage)
|
|
317
|
+
|
|
318
|
+
/////////////////////////////////////////////
|
|
319
|
+
|
|
320
|
+
export interface TouchpadPositionUpdatePayload
|
|
257
321
|
extends Readonly<{
|
|
258
322
|
_tag: 'Touchpad Position Update'
|
|
259
323
|
x: number
|
|
260
324
|
y: number
|
|
261
325
|
}> {}
|
|
262
326
|
|
|
263
|
-
export const
|
|
327
|
+
export const isTouchpadPositionUpdatePayload = (e: {
|
|
264
328
|
_tag: string
|
|
265
|
-
}): e is
|
|
329
|
+
}): e is TouchpadPositionUpdatePayload => e._tag === 'Touchpad Position Update'
|
|
330
|
+
|
|
331
|
+
export const isTouchpadPositionUpdate = (
|
|
332
|
+
e: ParsedMIDIMessage<TaggedObject>,
|
|
333
|
+
): e is ParsedMIDIMessage<TouchpadPositionUpdatePayload> =>
|
|
334
|
+
isTouchpadPositionUpdatePayload(e.midiMessage)
|