@jeffy-g/live-midi-types 0.9.1 → 0.10.1
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/ESMFEventType.d.ts +105 -0
- package/dist/ESMFEventType.js +11 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/midi-clip.d.ts +13 -1
- package/dist/midi-event.d.ts +64 -0
- package/dist/midi10-smf-types.d.ts +184 -0
- package/dist/midi10-smf-types.js +13 -0
- package/dist/project.d.ts +14 -2
- package/dist/smf-event-type.d.ts +105 -0
- package/dist/smf-event-type.js +105 -0
- package/package.json +11 -1
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
3
|
+
// Copyright (C) 2026 jeffy-g <hirotom1107@gmail.com>
|
|
4
|
+
// Released under the MIT license
|
|
5
|
+
// https://opensource.org/licenses/mit-license.php
|
|
6
|
+
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* @file live-midi-types/src/ESMFEventType.ts
|
|
10
|
+
*/
|
|
11
|
+
export declare const enum ESMFEventType {
|
|
12
|
+
/**
|
|
13
|
+
* ```
|
|
14
|
+
* 0x00
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
sequenceNumber = 0,
|
|
18
|
+
text = 1, // 1
|
|
19
|
+
copyrightNotice = 2, // 2
|
|
20
|
+
trackName = 3, // 3
|
|
21
|
+
instrumentName = 4, // 4
|
|
22
|
+
lyrics = 5, // 5
|
|
23
|
+
marker = 6, // 6
|
|
24
|
+
cuePoint = 7, // 7
|
|
25
|
+
noteOff = 8, // 8
|
|
26
|
+
noteOn = 9, // velocity === 0 ? 'noteOff' : 'noteOn'
|
|
27
|
+
noteAftertouch = 10, // 10
|
|
28
|
+
/**
|
|
29
|
+
* means control change event type.
|
|
30
|
+
* ```
|
|
31
|
+
* [0xb0 | event.channel][controllerType:0..127][value:0..127]
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
controller = 11, // 11
|
|
35
|
+
/**
|
|
36
|
+
* ```
|
|
37
|
+
* [0xc0 | event.channel][programNumber:0..127]
|
|
38
|
+
* ```
|
|
39
|
+
* @see {@linkcode https://midiprog.com/program-numbers/ Program Change Numbers}
|
|
40
|
+
*/
|
|
41
|
+
programChange = 12, // 12
|
|
42
|
+
/**
|
|
43
|
+
* ```
|
|
44
|
+
* [0xd0 | event.channel][0..127]
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
channelAftertouch = 13, // 13
|
|
48
|
+
/**
|
|
49
|
+
* ```
|
|
50
|
+
* [0xe0 | event.channel][LSB:0..127][MSB:0..127]
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
pitchBend = 14, // 14
|
|
54
|
+
/**
|
|
55
|
+
* ```
|
|
56
|
+
* 0x20
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
channelPrefix = 32, //
|
|
60
|
+
portPrefix = 33, // 33
|
|
61
|
+
/**
|
|
62
|
+
* ```
|
|
63
|
+
* 0x2F
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
endOfTrack = 47, // 47
|
|
67
|
+
/**
|
|
68
|
+
* ```
|
|
69
|
+
* 0x51
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
setTempo = 81, // 81
|
|
73
|
+
/**
|
|
74
|
+
* ```
|
|
75
|
+
* 0x54
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
smpteOffset = 84, // 84
|
|
79
|
+
/**
|
|
80
|
+
* ```
|
|
81
|
+
* 0x58
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
84
|
+
timeSignature = 88, // 88
|
|
85
|
+
keySignature = 89, //
|
|
86
|
+
/**
|
|
87
|
+
* ```
|
|
88
|
+
* 0x7F
|
|
89
|
+
* ```
|
|
90
|
+
*/
|
|
91
|
+
sequencerSpecific = 127, //127
|
|
92
|
+
/**
|
|
93
|
+
* ```
|
|
94
|
+
* 0xF0
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
sysEx = 240, // 240 eventTypeByte
|
|
98
|
+
/**
|
|
99
|
+
* ```
|
|
100
|
+
* 0xF7
|
|
101
|
+
* ```
|
|
102
|
+
*/
|
|
103
|
+
endSysEx = 247, // 247 eventTypeByte
|
|
104
|
+
unknownMeta = -1,
|
|
105
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
3
|
+
// Copyright (C) 2026 jeffy-g <hirotom1107@gmail.com>
|
|
4
|
+
// Released under the MIT license
|
|
5
|
+
// https://opensource.org/licenses/mit-license.php
|
|
6
|
+
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* @file live-midi-types/src/ESMFEventType.ts
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
package/dist/midi-clip.d.ts
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* @file src/midi-clip.ts
|
|
10
10
|
* @summary Common MIDI clip data type for Ableton Live and related tools.
|
|
11
11
|
*/
|
|
12
|
-
import type { NoteEvent, ControlChangeEvent } from "./midi-event.ts";
|
|
12
|
+
import type { NoteEvent, MetaTextEvent, PitchBendEvent, ControlChangeEvent, ChannelPressureEvent } from "./midi-event.ts";
|
|
13
13
|
/**
|
|
14
14
|
* MIDI clip data extracted from Ableton Live's MidiClip object.
|
|
15
15
|
*
|
|
@@ -68,6 +68,18 @@ export type TMidiClipData = {
|
|
|
68
68
|
* @see {@link flattenCCEventMap}
|
|
69
69
|
*/
|
|
70
70
|
cc?(): ControlChangeEvent[];
|
|
71
|
+
/**
|
|
72
|
+
* @since v0.10.0
|
|
73
|
+
*/
|
|
74
|
+
pitchBends?: PitchBendEvent[];
|
|
75
|
+
/**
|
|
76
|
+
* @since v0.10.0
|
|
77
|
+
*/
|
|
78
|
+
channelPressures?: ChannelPressureEvent[];
|
|
79
|
+
/**
|
|
80
|
+
* @since v0.10.0
|
|
81
|
+
*/
|
|
82
|
+
meta?: MetaTextEvent[];
|
|
71
83
|
};
|
|
72
84
|
/**
|
|
73
85
|
* @param {Record<string, ControlChangeEvent[]>} ccEventMap
|
package/dist/midi-event.d.ts
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
* @file src/midi-event.ts
|
|
10
10
|
* @summary Common MIDI event types for Ableton Live and related tools.
|
|
11
11
|
*/
|
|
12
|
+
import type { TextEventTypesUnion } from "./midi10-smf-types.ts";
|
|
12
13
|
export type BaseEvent = {
|
|
13
14
|
/**
|
|
14
15
|
* Time relative to the start of the clip.
|
|
@@ -100,6 +101,69 @@ export type TempoEvent = BaseEvent & {
|
|
|
100
101
|
*/
|
|
101
102
|
bpm: number;
|
|
102
103
|
};
|
|
104
|
+
/**
|
|
105
|
+
* Shared processing shape for Control Change, Channel Pressure, and Pitch Bend
|
|
106
|
+
* envelope events extracted from an Ableton Live MIDI clip.
|
|
107
|
+
*
|
|
108
|
+
* + This is an intermediate event type, not an SMF wire event.
|
|
109
|
+
* + It retains beat-based time, fractional Live values, and optional interpolation diagnostics until the target-specific MIDI encoding step.
|
|
110
|
+
* + A Control Change carries `controller`, Pitch Bend and Channel Pressure do not.
|
|
111
|
+
*
|
|
112
|
+
* @see {@linkcode ControlChangeEvent}
|
|
113
|
+
* @see {@linkcode ChannelPressureEvent}
|
|
114
|
+
* @see {@linkcode PitchBendEvent}
|
|
115
|
+
*
|
|
116
|
+
* @since v0.10.0
|
|
117
|
+
*/
|
|
118
|
+
export type TEnvelopeEvent = BaseEvent & {
|
|
119
|
+
/**
|
|
120
|
+
* Floating-point envelope value in the target's native Live range.
|
|
121
|
+
*
|
|
122
|
+
* - Control Change / Channel Pressure: `0..127`
|
|
123
|
+
* - Pitch Bend: signed `-8192..8191` with center `0`
|
|
124
|
+
*
|
|
125
|
+
* Preserve fractional values while processing the envelope. At the SMF encode
|
|
126
|
+
* boundary, values are quantized with `Math.floor()`; Pitch Bend remains signed
|
|
127
|
+
* until the MIDI writer applies the single `+0x2000` conversion.
|
|
128
|
+
*/
|
|
129
|
+
value: number;
|
|
130
|
+
/**
|
|
131
|
+
* MIDI controller number (`0..127`) for a Control Change event.
|
|
132
|
+
*
|
|
133
|
+
* Omitted for Pitch Bend and Channel Pressure. Their internal target numbers
|
|
134
|
+
* (`-2` and `-1`) identify envelope-map buckets and must not be stored here.
|
|
135
|
+
*/
|
|
136
|
+
controller?: number;
|
|
137
|
+
};
|
|
138
|
+
/**
|
|
139
|
+
* @since v0.10.0
|
|
140
|
+
*/
|
|
141
|
+
export type MetaTextEvent = {
|
|
142
|
+
/** Time in quarter-note beats. */
|
|
143
|
+
time: number;
|
|
144
|
+
text: string;
|
|
145
|
+
type: TextEventTypesUnion;
|
|
146
|
+
};
|
|
147
|
+
/**
|
|
148
|
+
* @since v0.10.0
|
|
149
|
+
*/
|
|
150
|
+
export type TimeSignatureEvent = {
|
|
151
|
+
/** Time in quarter-note beats. */
|
|
152
|
+
time: number;
|
|
153
|
+
numerator: number;
|
|
154
|
+
denominator: number;
|
|
155
|
+
metronome?: number;
|
|
156
|
+
thirtyseconds?: number;
|
|
157
|
+
};
|
|
158
|
+
/**
|
|
159
|
+
* @since v0.10.0
|
|
160
|
+
*/
|
|
161
|
+
export type KeySignatureEvent = {
|
|
162
|
+
/** Time in quarter-note beats. */
|
|
163
|
+
time: number;
|
|
164
|
+
key: string;
|
|
165
|
+
scale: "major" | "minor";
|
|
166
|
+
};
|
|
103
167
|
/**
|
|
104
168
|
* Type alias for MIDI event types.
|
|
105
169
|
*
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Original Source: midi-file (https://github.com/carter-thaxton/midi-file/blob/master/index.d.ts)
|
|
3
|
+
* Original License: MIT License
|
|
4
|
+
*
|
|
5
|
+
* + Adapted the original string-based `type` discriminants to use numeric SMF event type codes.
|
|
6
|
+
*
|
|
7
|
+
* Copyright (c) 2025 jeffy-g
|
|
8
|
+
* Released under the MIT license.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* @file src/midi10-smf-types.ts
|
|
12
|
+
*/
|
|
13
|
+
import type { ESMFEventType } from "./ESMFEventType.ts";
|
|
14
|
+
export interface MidiHeader {
|
|
15
|
+
format: 0 | 1 | 2;
|
|
16
|
+
numTracks: number;
|
|
17
|
+
timeDivision?: number;
|
|
18
|
+
framesPerSecond?: number;
|
|
19
|
+
ticksPerFrame?: number;
|
|
20
|
+
ticksPerBeat?: number;
|
|
21
|
+
}
|
|
22
|
+
export type TextEventTypesUnion = ESMFEventType.text | ESMFEventType.copyrightNotice | ESMFEventType.trackName | ESMFEventType.instrumentName | ESMFEventType.lyrics | ESMFEventType.marker | ESMFEventType.cuePoint;
|
|
23
|
+
export interface MidiBaseEvent<T> {
|
|
24
|
+
/**
|
|
25
|
+
* serialize/deserialize by `writeVarInt/readVarInt`
|
|
26
|
+
* + byte range are __`1 to 4`__ (unsigned integer)
|
|
27
|
+
*/
|
|
28
|
+
deltaTime: number;
|
|
29
|
+
/**
|
|
30
|
+
* MUST be `ESMFEventType`
|
|
31
|
+
* @see {@link ESMFEventType}
|
|
32
|
+
*/
|
|
33
|
+
type: T;
|
|
34
|
+
}
|
|
35
|
+
export interface MidiMetaEvent<T> extends MidiBaseEvent<T> {
|
|
36
|
+
meta?: true;
|
|
37
|
+
}
|
|
38
|
+
export type MidiEndOfTrackEvent = MidiMetaEvent<ESMFEventType.endOfTrack>;
|
|
39
|
+
export type FrameRate = 24 | 25 | 29.97 | 30;
|
|
40
|
+
export interface MidiSmpteOffsetMixins {
|
|
41
|
+
frameRate: FrameRate;
|
|
42
|
+
hour: number;
|
|
43
|
+
min: number;
|
|
44
|
+
sec: number;
|
|
45
|
+
frame: number;
|
|
46
|
+
subFrame: number;
|
|
47
|
+
}
|
|
48
|
+
export type MidiSmpteOffsetEvent = MidiMetaEvent<ESMFEventType.smpteOffset> & MidiSmpteOffsetMixins;
|
|
49
|
+
export interface MidiTimeSignatureMixins {
|
|
50
|
+
numerator: number;
|
|
51
|
+
denominator: number;
|
|
52
|
+
/** @todo whats this? */
|
|
53
|
+
metronome: number;
|
|
54
|
+
/** @todo whats this? */
|
|
55
|
+
thirtyseconds: number;
|
|
56
|
+
}
|
|
57
|
+
export type MidiTimeSignatureEvent = MidiMetaEvent<ESMFEventType.timeSignature> & MidiTimeSignatureMixins;
|
|
58
|
+
export interface MidiKeySignatureMixins {
|
|
59
|
+
key: number;
|
|
60
|
+
scale: number;
|
|
61
|
+
}
|
|
62
|
+
export type MidiKeySignatureEvent = MidiMetaEvent<ESMFEventType.keySignature> & MidiKeySignatureMixins;
|
|
63
|
+
export interface MidiDataMixins {
|
|
64
|
+
data: ArrayLike<number>;
|
|
65
|
+
}
|
|
66
|
+
export type MidiSysExEvent = MidiBaseEvent<ESMFEventType.sysEx> & MidiDataMixins;
|
|
67
|
+
export type MidiEndSysExEvent = MidiBaseEvent<ESMFEventType.endSysEx> & MidiDataMixins;
|
|
68
|
+
export type MidiSequencerSpecificEvent = MidiMetaEvent<ESMFEventType.sequencerSpecific> & MidiDataMixins;
|
|
69
|
+
export interface MidiUnknownMixins {
|
|
70
|
+
data: ArrayLike<number>;
|
|
71
|
+
metatypeByte: number;
|
|
72
|
+
}
|
|
73
|
+
export type MidiUnknownEvent = MidiMetaEvent<ESMFEventType.unknownMeta> & MidiUnknownMixins;
|
|
74
|
+
export interface MidiNumberMixins {
|
|
75
|
+
number: number;
|
|
76
|
+
}
|
|
77
|
+
export type MidiSequenceNumberEvent = MidiMetaEvent<ESMFEventType.sequenceNumber> & MidiNumberMixins;
|
|
78
|
+
export interface MidiTextMixins {
|
|
79
|
+
text: string;
|
|
80
|
+
}
|
|
81
|
+
export type MidiTextEvent = MidiMetaEvent<ESMFEventType.text> & MidiTextMixins;
|
|
82
|
+
export type MidiLyricsEvent = MidiMetaEvent<ESMFEventType.lyrics> & MidiTextMixins;
|
|
83
|
+
export type MidiMarkerEvent = MidiMetaEvent<ESMFEventType.marker> & MidiTextMixins;
|
|
84
|
+
export type MidiCuePointEvent = MidiMetaEvent<ESMFEventType.cuePoint> & MidiTextMixins;
|
|
85
|
+
export type MidiTrackNameEvent = MidiMetaEvent<ESMFEventType.trackName> & MidiTextMixins;
|
|
86
|
+
export type MidiInstrumentNameEvent = MidiMetaEvent<ESMFEventType.instrumentName> & MidiTextMixins;
|
|
87
|
+
export type MidiCopyrightNoticeEvent = MidiMetaEvent<ESMFEventType.copyrightNotice> & MidiTextMixins;
|
|
88
|
+
export type MidiSetTempoEvent = MidiMetaEvent<ESMFEventType.setTempo> & {
|
|
89
|
+
/**
|
|
90
|
+
* __`unsigned 24-bit integer`__
|
|
91
|
+
*/
|
|
92
|
+
microsecondsPerBeat: number;
|
|
93
|
+
};
|
|
94
|
+
export type MidiPortPrefixEvent = MidiMetaEvent<ESMFEventType.portPrefix> & {
|
|
95
|
+
port: number;
|
|
96
|
+
};
|
|
97
|
+
export type MidiChannelPrefixEvent = MidiMetaEvent<ESMFEventType.channelPrefix> & {
|
|
98
|
+
channel: number;
|
|
99
|
+
};
|
|
100
|
+
export interface MidiNoteMixins {
|
|
101
|
+
noteNumber: number;
|
|
102
|
+
/**
|
|
103
|
+
* __`unsigned 7-bit integer`__
|
|
104
|
+
* + `0 to 127(0x7f)`
|
|
105
|
+
*/
|
|
106
|
+
velocity: number;
|
|
107
|
+
byte9?: true;
|
|
108
|
+
}
|
|
109
|
+
export type MidiNoteOnEvent = MidiChannelEvent<ESMFEventType.noteOn> & MidiNoteMixins;
|
|
110
|
+
export type MidiNoteOffEvent = MidiChannelEvent<ESMFEventType.noteOff> & MidiNoteMixins;
|
|
111
|
+
export interface MidiNoteAftertouchMixins {
|
|
112
|
+
noteNumber: number;
|
|
113
|
+
amount: number;
|
|
114
|
+
}
|
|
115
|
+
export type MidiNoteAftertouchEvent = MidiChannelEvent<ESMFEventType.noteAftertouch> & MidiNoteAftertouchMixins;
|
|
116
|
+
export interface MidiControllerMixins {
|
|
117
|
+
controllerType: number;
|
|
118
|
+
/**
|
|
119
|
+
* __`unsigned 7-bit integer`__
|
|
120
|
+
* + `0 to 127(0x7f)`
|
|
121
|
+
*/
|
|
122
|
+
value: number;
|
|
123
|
+
}
|
|
124
|
+
export interface MidiChannelEvent<T> extends MidiBaseEvent<T> {
|
|
125
|
+
running?: true;
|
|
126
|
+
channel: number;
|
|
127
|
+
}
|
|
128
|
+
export type MidiPitchBendEvent = MidiChannelEvent<ESMFEventType.pitchBend> & {
|
|
129
|
+
/**
|
|
130
|
+
* __`SPEC`__: 14bit `-8192 to 8191` (integer)
|
|
131
|
+
*/
|
|
132
|
+
value: number;
|
|
133
|
+
};
|
|
134
|
+
/**
|
|
135
|
+
* @see {@link https://anotherproducer.com/online-tools-for-musicians/midi-cc-list/ MIDI CC List for Continuous Controllers}
|
|
136
|
+
*/
|
|
137
|
+
export type MidiControllerEvent = MidiChannelEvent<ESMFEventType.controller> & MidiControllerMixins;
|
|
138
|
+
export type MidiProgramChangeEvent = MidiChannelEvent<ESMFEventType.programChange> & {
|
|
139
|
+
programNumber: number;
|
|
140
|
+
};
|
|
141
|
+
export type MidiChannelAftertouchEvent = MidiChannelEvent<ESMFEventType.channelAftertouch> & {
|
|
142
|
+
amount: number;
|
|
143
|
+
};
|
|
144
|
+
export type MidiEvent =
|
|
145
|
+
| MidiTextEvent
|
|
146
|
+
| MidiSysExEvent
|
|
147
|
+
| MidiLyricsEvent
|
|
148
|
+
| MidiMarkerEvent
|
|
149
|
+
| MidiNoteOnEvent
|
|
150
|
+
| MidiNoteOffEvent
|
|
151
|
+
| MidiUnknownEvent
|
|
152
|
+
| MidiCuePointEvent
|
|
153
|
+
| MidiEndSysExEvent
|
|
154
|
+
| MidiSetTempoEvent
|
|
155
|
+
| MidiPitchBendEvent
|
|
156
|
+
| MidiTrackNameEvent
|
|
157
|
+
| MidiControllerEvent
|
|
158
|
+
| MidiEndOfTrackEvent
|
|
159
|
+
| MidiPortPrefixEvent
|
|
160
|
+
| MidiSmpteOffsetEvent
|
|
161
|
+
| MidiKeySignatureEvent
|
|
162
|
+
| MidiChannelPrefixEvent
|
|
163
|
+
| MidiProgramChangeEvent
|
|
164
|
+
| MidiTimeSignatureEvent
|
|
165
|
+
| MidiInstrumentNameEvent
|
|
166
|
+
| MidiNoteAftertouchEvent
|
|
167
|
+
| MidiSequenceNumberEvent
|
|
168
|
+
| MidiCopyrightNoticeEvent
|
|
169
|
+
| MidiChannelAftertouchEvent
|
|
170
|
+
| MidiSequencerSpecificEvent;
|
|
171
|
+
export interface MidiData {
|
|
172
|
+
header: MidiHeader;
|
|
173
|
+
tracks: MidiEvent[][];
|
|
174
|
+
}
|
|
175
|
+
export interface MidiWriteOption {
|
|
176
|
+
/**
|
|
177
|
+
* reuse previous eventTypeByte when possible, to compress file
|
|
178
|
+
*/
|
|
179
|
+
running?: boolean;
|
|
180
|
+
/**
|
|
181
|
+
* use 0x09 for noteOff when velocity is zero
|
|
182
|
+
*/
|
|
183
|
+
useByte9ForNoteOff?: boolean;
|
|
184
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Original Source: midi-file (https://github.com/carter-thaxton/midi-file/blob/master/index.d.ts)
|
|
3
|
+
* Original License: MIT License
|
|
4
|
+
*
|
|
5
|
+
* + Adapted the original string-based `type` discriminants to use numeric SMF event type codes.
|
|
6
|
+
*
|
|
7
|
+
* Copyright (c) 2025 jeffy-g
|
|
8
|
+
* Released under the MIT license.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* @file src/midi10-smf-types.ts
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
package/dist/project.d.ts
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
/**
|
|
9
9
|
* @file src/project.ts
|
|
10
10
|
*/
|
|
11
|
-
import type { TempoEvent } from "./midi-event.ts";
|
|
11
|
+
import type { TempoEvent, MetaTextEvent, TimeSignatureEvent, KeySignatureEvent } from "./midi-event.ts";
|
|
12
12
|
/**
|
|
13
13
|
* Summary information for an Ableton Live MIDI clip.
|
|
14
14
|
*/
|
|
@@ -137,6 +137,10 @@ export type TTrackInfo<T extends Record<string, any>> = {
|
|
|
137
137
|
* MIDI clips indexed by {@linkcode TClipSummary.id TClipSummary.id}
|
|
138
138
|
*/
|
|
139
139
|
clips: Record<string, TClipSummary<T>>;
|
|
140
|
+
/**
|
|
141
|
+
* @since v0.10.0
|
|
142
|
+
*/
|
|
143
|
+
meta?: MetaTextEvent[];
|
|
140
144
|
};
|
|
141
145
|
/**
|
|
142
146
|
* Parsed data required by the Ableton Live project UI.
|
|
@@ -159,7 +163,7 @@ export type TParsedAbletonLiveSet<T extends Record<string, any>> = {
|
|
|
159
163
|
*
|
|
160
164
|
* + Currently contains only MIDI tracks.
|
|
161
165
|
*/
|
|
162
|
-
tracks: TTrackInfo<T
|
|
166
|
+
tracks: Array<TTrackInfo<T>>;
|
|
163
167
|
/**
|
|
164
168
|
* Tempo automation events extracted from the master track.
|
|
165
169
|
*
|
|
@@ -170,4 +174,12 @@ export type TParsedAbletonLiveSet<T extends Record<string, any>> = {
|
|
|
170
174
|
* ```
|
|
171
175
|
*/
|
|
172
176
|
tempoAutomation: TempoEvent[];
|
|
177
|
+
/**
|
|
178
|
+
* @since v0.10.0
|
|
179
|
+
*/
|
|
180
|
+
timeSignatures?: TimeSignatureEvent[];
|
|
181
|
+
/**
|
|
182
|
+
* @since v0.10.0
|
|
183
|
+
*/
|
|
184
|
+
keySignatures?: KeySignatureEvent[];
|
|
173
185
|
};
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
3
|
+
// Copyright (C) 2025 jeffy-g <hirotom1107@gmail.com>
|
|
4
|
+
// Released under the MIT license
|
|
5
|
+
// https://opensource.org/licenses/mit-license.php
|
|
6
|
+
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* @file live-midi-types/src/smf-event-type.ts
|
|
10
|
+
*/
|
|
11
|
+
export declare const ESMFEventType: {
|
|
12
|
+
/**
|
|
13
|
+
* ```
|
|
14
|
+
* 0x00
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
readonly sequenceNumber: 0;
|
|
18
|
+
readonly text: 1;
|
|
19
|
+
readonly copyrightNotice: 2;
|
|
20
|
+
readonly trackName: 3;
|
|
21
|
+
readonly instrumentName: 4;
|
|
22
|
+
readonly lyrics: 5;
|
|
23
|
+
readonly marker: 6;
|
|
24
|
+
readonly cuePoint: 7;
|
|
25
|
+
readonly noteOff: 8;
|
|
26
|
+
readonly noteOn: 9;
|
|
27
|
+
readonly noteAftertouch: 10;
|
|
28
|
+
/**
|
|
29
|
+
* means control change event type.
|
|
30
|
+
* ```
|
|
31
|
+
* [0xb0 | event.channel][controllerType:0..127][value:0..127]
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
readonly controller: 11;
|
|
35
|
+
/**
|
|
36
|
+
* ```
|
|
37
|
+
* [0xc0 | event.channel][programNumber:0..127]
|
|
38
|
+
* ```
|
|
39
|
+
* @see {@linkcode https://midiprog.com/program-numbers/ Program Change Numbers}
|
|
40
|
+
*/
|
|
41
|
+
readonly programChange: 12;
|
|
42
|
+
/**
|
|
43
|
+
* ```
|
|
44
|
+
* [0xd0 | event.channel][0..127]
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
readonly channelAftertouch: 13;
|
|
48
|
+
/**
|
|
49
|
+
* ```
|
|
50
|
+
* [0xe0 | event.channel][LSB:0..127][MSB:0..127]
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
readonly pitchBend: 14;
|
|
54
|
+
/**
|
|
55
|
+
* ```
|
|
56
|
+
* 0x20
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
readonly channelPrefix: 32;
|
|
60
|
+
readonly portPrefix: 33;
|
|
61
|
+
/**
|
|
62
|
+
* ```
|
|
63
|
+
* 0x2F
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
readonly endOfTrack: 47;
|
|
67
|
+
/**
|
|
68
|
+
* ```
|
|
69
|
+
* 0x51
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
readonly setTempo: 81;
|
|
73
|
+
/**
|
|
74
|
+
* ```
|
|
75
|
+
* 0x54
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
readonly smpteOffset: 84;
|
|
79
|
+
/**
|
|
80
|
+
* ```
|
|
81
|
+
* 0x58
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
84
|
+
readonly timeSignature: 88;
|
|
85
|
+
readonly keySignature: 89;
|
|
86
|
+
/**
|
|
87
|
+
* ```
|
|
88
|
+
* 0x7F
|
|
89
|
+
* ```
|
|
90
|
+
*/
|
|
91
|
+
readonly sequencerSpecific: 127;
|
|
92
|
+
/**
|
|
93
|
+
* ```
|
|
94
|
+
* 0xF0
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
readonly sysEx: 240;
|
|
98
|
+
/**
|
|
99
|
+
* ```
|
|
100
|
+
* 0xF7
|
|
101
|
+
* ```
|
|
102
|
+
*/
|
|
103
|
+
readonly endSysEx: 247;
|
|
104
|
+
readonly unknownMeta: -1;
|
|
105
|
+
};
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
3
|
+
// Copyright (C) 2025 jeffy-g <hirotom1107@gmail.com>
|
|
4
|
+
// Released under the MIT license
|
|
5
|
+
// https://opensource.org/licenses/mit-license.php
|
|
6
|
+
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* @file live-midi-types/src/smf-event-type.ts
|
|
10
|
+
*/
|
|
11
|
+
export const ESMFEventType = {
|
|
12
|
+
/**
|
|
13
|
+
* ```
|
|
14
|
+
* 0x00
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
sequenceNumber: 0,
|
|
18
|
+
text: 1,
|
|
19
|
+
copyrightNotice: 2,
|
|
20
|
+
trackName: 3,
|
|
21
|
+
instrumentName: 4,
|
|
22
|
+
lyrics: 5,
|
|
23
|
+
marker: 6,
|
|
24
|
+
cuePoint: 7,
|
|
25
|
+
noteOff: 8,
|
|
26
|
+
noteOn: 9,
|
|
27
|
+
noteAftertouch: 10,
|
|
28
|
+
/**
|
|
29
|
+
* means control change event type.
|
|
30
|
+
* ```
|
|
31
|
+
* [0xb0 | event.channel][controllerType:0..127][value:0..127]
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
controller: 11,
|
|
35
|
+
/**
|
|
36
|
+
* ```
|
|
37
|
+
* [0xc0 | event.channel][programNumber:0..127]
|
|
38
|
+
* ```
|
|
39
|
+
* @see {@linkcode https://midiprog.com/program-numbers/ Program Change Numbers}
|
|
40
|
+
*/
|
|
41
|
+
programChange: 12,
|
|
42
|
+
/**
|
|
43
|
+
* ```
|
|
44
|
+
* [0xd0 | event.channel][0..127]
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
channelAftertouch: 13,
|
|
48
|
+
/**
|
|
49
|
+
* ```
|
|
50
|
+
* [0xe0 | event.channel][LSB:0..127][MSB:0..127]
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
pitchBend: 14,
|
|
54
|
+
/**
|
|
55
|
+
* ```
|
|
56
|
+
* 0x20
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
channelPrefix: 0x20,
|
|
60
|
+
portPrefix: 0x21,
|
|
61
|
+
/**
|
|
62
|
+
* ```
|
|
63
|
+
* 0x2F
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
endOfTrack: 0x2f,
|
|
67
|
+
/**
|
|
68
|
+
* ```
|
|
69
|
+
* 0x51
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
setTempo: 0x51,
|
|
73
|
+
/**
|
|
74
|
+
* ```
|
|
75
|
+
* 0x54
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
smpteOffset: 0x54,
|
|
79
|
+
/**
|
|
80
|
+
* ```
|
|
81
|
+
* 0x58
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
84
|
+
timeSignature: 0x58,
|
|
85
|
+
keySignature: 0x59,
|
|
86
|
+
/**
|
|
87
|
+
* ```
|
|
88
|
+
* 0x7F
|
|
89
|
+
* ```
|
|
90
|
+
*/
|
|
91
|
+
sequencerSpecific: 0x7f,
|
|
92
|
+
/**
|
|
93
|
+
* ```
|
|
94
|
+
* 0xF0
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
sysEx: 0xf0,
|
|
98
|
+
/**
|
|
99
|
+
* ```
|
|
100
|
+
* 0xF7
|
|
101
|
+
* ```
|
|
102
|
+
*/
|
|
103
|
+
endSysEx: 0xf7,
|
|
104
|
+
unknownMeta: -1,
|
|
105
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jeffy-g/live-midi-types",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.1",
|
|
4
4
|
"description": "Common TypeScript types for Ableton Live MIDI clip and event data.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -10,6 +10,16 @@
|
|
|
10
10
|
"import": "./dist/index.js",
|
|
11
11
|
"require": "./dist/index.js",
|
|
12
12
|
"types": "./dist/index.d.ts"
|
|
13
|
+
},
|
|
14
|
+
"./midi10-smf-types": {
|
|
15
|
+
"import": "./dist/midi10-smf-types.js",
|
|
16
|
+
"require": "./dist/midi10-smf-types.js",
|
|
17
|
+
"types": "./dist/midi10-smf-types.d.ts"
|
|
18
|
+
},
|
|
19
|
+
"./ESMFEventType": {
|
|
20
|
+
"types": "./dist/ESMFEventType.d.ts",
|
|
21
|
+
"import": "./dist/smf-event-type.js",
|
|
22
|
+
"default": "./dist/smf-event-type.js"
|
|
13
23
|
}
|
|
14
24
|
},
|
|
15
25
|
"files": [
|