@marmooo/midy 0.4.8 → 0.5.0
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/README.md +18 -2
- package/esm/midy-GM1.d.ts +86 -10
- package/esm/midy-GM1.d.ts.map +1 -1
- package/esm/midy-GM1.js +1190 -101
- package/esm/midy-GM2.d.ts +103 -10
- package/esm/midy-GM2.d.ts.map +1 -1
- package/esm/midy-GM2.js +1402 -162
- package/esm/midy-GMLite.d.ts +84 -9
- package/esm/midy-GMLite.d.ts.map +1 -1
- package/esm/midy-GMLite.js +1183 -98
- package/esm/midy.d.ts +77 -15
- package/esm/midy.d.ts.map +1 -1
- package/esm/midy.js +1416 -175
- package/package.json +1 -1
- package/script/midy-GM1.d.ts +86 -10
- package/script/midy-GM1.d.ts.map +1 -1
- package/script/midy-GM1.js +1190 -101
- package/script/midy-GM2.d.ts +103 -10
- package/script/midy-GM2.d.ts.map +1 -1
- package/script/midy-GM2.js +1402 -162
- package/script/midy-GMLite.d.ts +84 -9
- package/script/midy-GMLite.d.ts.map +1 -1
- package/script/midy-GMLite.js +1183 -98
- package/script/midy.d.ts +77 -15
- package/script/midy.d.ts.map +1 -1
- package/script/midy.js +1416 -175
package/README.md
CHANGED
|
@@ -24,10 +24,14 @@ This library provides several files depending on the implementation level.
|
|
|
24
24
|
- [Humidy](https://marmooo.github.io/humidy/) - GM2 MIDI mixer app
|
|
25
25
|
- [Timidy](https://marmooo.github.io/timidy/) - Timidity++ style MIDI player
|
|
26
26
|
- [4x4pad](https://marmooo.github.io/4x4pad/) - 4x4 grid MPE MIDI controller
|
|
27
|
-
- [Celltone](https://marmooo.github.io/celltone/) - Grid MPE MIDI controller
|
|
28
|
-
Janko-Piano layout
|
|
27
|
+
- [Celltone](https://marmooo.github.io/celltone/) - Grid MPE MIDI controller
|
|
28
|
+
with Janko-Piano layout
|
|
29
29
|
- [Isotone](https://marmooo.github.io/isotone/) - Grid MPE MIDI controller
|
|
30
30
|
optimized for chords
|
|
31
|
+
- [Hexatone](https://marmooo.github.io/hexatone/) - Hexagonal MPE MIDI
|
|
32
|
+
controller with Wicki-Hayden layout
|
|
33
|
+
- [Glisstone](https://marmooo.github.io/glisstone/) - Hexagonal MPE MIDI
|
|
34
|
+
controller optimized for glissando
|
|
31
35
|
|
|
32
36
|
## Support Status
|
|
33
37
|
|
|
@@ -90,6 +94,18 @@ midy.addEventListener("resumed", func);
|
|
|
90
94
|
midy.addEventListener("seeked", func);
|
|
91
95
|
```
|
|
92
96
|
|
|
97
|
+
## Cache Mode
|
|
98
|
+
|
|
99
|
+
- "none" -for full real-time control (dynamic CC, LFO, pitch)
|
|
100
|
+
- "ads" - for real-time playback with higher cache hit rate
|
|
101
|
+
- "adsr" - for real-time playback with accurate release envelope
|
|
102
|
+
- "note" - for efficient playback when note behavior is fixed
|
|
103
|
+
- "audio" - for fully pre-rendered playback (lowest CPU)
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
const midy = new Midy(audioContext, { cacheMode: "note" });
|
|
107
|
+
```
|
|
108
|
+
|
|
93
109
|
### MIDI Message
|
|
94
110
|
|
|
95
111
|
There are functions that handle MIDI messages as they are, as well as simplified
|
package/esm/midy-GM1.d.ts
CHANGED
|
@@ -11,7 +11,7 @@ export class MidyGM1 extends EventTarget {
|
|
|
11
11
|
fineTuning: number;
|
|
12
12
|
coarseTuning: number;
|
|
13
13
|
};
|
|
14
|
-
constructor(audioContext: any);
|
|
14
|
+
constructor(audioContext: any, options?: {});
|
|
15
15
|
perceptualSmoothingTime: number;
|
|
16
16
|
mode: string;
|
|
17
17
|
numChannels: number;
|
|
@@ -28,7 +28,6 @@ export class MidyGM1 extends EventTarget {
|
|
|
28
28
|
voiceCache: Map<any, any>;
|
|
29
29
|
realtimeVoiceCache: Map<any, any>;
|
|
30
30
|
decodeMethod: string;
|
|
31
|
-
decoderQueue: Promise<void>;
|
|
32
31
|
isPlaying: boolean;
|
|
33
32
|
isPausing: boolean;
|
|
34
33
|
isPaused: boolean;
|
|
@@ -42,7 +41,15 @@ export class MidyGM1 extends EventTarget {
|
|
|
42
41
|
notePromises: any[];
|
|
43
42
|
instruments: Set<any>;
|
|
44
43
|
exclusiveClassNotes: any[];
|
|
44
|
+
adsrVoiceCache: Map<any, any>;
|
|
45
|
+
noteOnDurations: Map<any, any>;
|
|
46
|
+
noteOnEvents: Map<any, any>;
|
|
47
|
+
fullVoiceCache: Map<any, any>;
|
|
48
|
+
renderedAudioBuffer: null;
|
|
49
|
+
isRendering: boolean;
|
|
50
|
+
audioModeBufferSource: null;
|
|
45
51
|
audioContext: any;
|
|
52
|
+
cacheMode: any;
|
|
46
53
|
masterVolume: any;
|
|
47
54
|
scheduler: any;
|
|
48
55
|
schedulerBuffer: any;
|
|
@@ -54,33 +61,35 @@ export class MidyGM1 extends EventTarget {
|
|
|
54
61
|
modLfoToVolume: (channel: any, note: any, scheduleTime: any) => void;
|
|
55
62
|
chorusEffectsSend: (_channel: any, _note: any, _scheduleTime: any) => void;
|
|
56
63
|
reverbEffectsSend: (_channel: any, _note: any, _scheduleTime: any) => void;
|
|
57
|
-
delayModLFO: (
|
|
64
|
+
delayModLFO: (channel: any, note: any, scheduleTime: any) => void;
|
|
58
65
|
freqModLFO: (_channel: any, note: any, scheduleTime: any) => void;
|
|
59
66
|
delayVibLFO: (_channel: any, _note: any, _scheduleTime: any) => void;
|
|
60
67
|
freqVibLFO: (_channel: any, _note: any, _scheduleTime: any) => void;
|
|
61
68
|
detune: (channel: any, note: any, scheduleTime: any) => void;
|
|
62
69
|
};
|
|
63
70
|
controlChangeHandlers: any[];
|
|
64
|
-
channels:
|
|
71
|
+
channels: Channel[];
|
|
65
72
|
addSoundFont(soundFont: any): void;
|
|
66
73
|
toUint8Array(input: any): Promise<Uint8Array<ArrayBuffer>>;
|
|
67
74
|
loadSoundFont(input: any): Promise<void>;
|
|
68
75
|
loadMIDI(input: any): Promise<void>;
|
|
76
|
+
buildNoteOnDurations(): void;
|
|
69
77
|
cacheVoiceIds(): void;
|
|
70
|
-
getVoiceId(channel: any, noteNumber: any, velocity: any):
|
|
78
|
+
getVoiceId(channel: any, noteNumber: any, velocity: any): number | undefined;
|
|
71
79
|
createChannelAudioNodes(audioContext: any): {
|
|
72
80
|
gainL: any;
|
|
73
81
|
gainR: any;
|
|
74
82
|
merger: any;
|
|
75
83
|
};
|
|
76
|
-
createChannels(audioContext: any):
|
|
84
|
+
createChannels(audioContext: any): Channel[];
|
|
77
85
|
decodeOggVorbis(sample: any): Promise<any>;
|
|
78
86
|
createAudioBuffer(voiceParams: any): Promise<any>;
|
|
79
|
-
createBufferSource(voiceParams: any,
|
|
87
|
+
createBufferSource(voiceParams: any, renderedOrRaw: any): any;
|
|
80
88
|
scheduleTimelineEvents(scheduleTime: any, queueIndex: any): any;
|
|
81
89
|
getQueueIndex(second: any): number;
|
|
82
90
|
resetAllStates(): void;
|
|
83
91
|
updateStates(queueIndex: any, nextQueueIndex: any): void;
|
|
92
|
+
playAudioBuffer(): Promise<void>;
|
|
84
93
|
playNotes(): Promise<void>;
|
|
85
94
|
ticksToSecond(ticks: any, secondsPerBeat: any): number;
|
|
86
95
|
secondToTicks(second: any, secondsPerBeat: any): number;
|
|
@@ -92,6 +101,7 @@ export class MidyGM1 extends EventTarget {
|
|
|
92
101
|
stopActiveNotes(channelNumber: any, velocity: any, force: any, scheduleTime: any): Promise<any[]>;
|
|
93
102
|
stopChannelNotes(channelNumber: any, velocity: any, force: any, scheduleTime: any): Promise<any[]>;
|
|
94
103
|
stopNotes(velocity: any, force: any, scheduleTime: any): Promise<any[]>;
|
|
104
|
+
render(): Promise<null | undefined>;
|
|
95
105
|
start(): Promise<void>;
|
|
96
106
|
stop(): Promise<void>;
|
|
97
107
|
pause(): Promise<void>;
|
|
@@ -114,12 +124,21 @@ export class MidyGM1 extends EventTarget {
|
|
|
114
124
|
clampCutoffFrequency(frequency: any): number;
|
|
115
125
|
setFilterEnvelope(note: any, scheduleTime: any): void;
|
|
116
126
|
startModulation(channel: any, note: any, scheduleTime: any): void;
|
|
117
|
-
|
|
127
|
+
createAdsRenderedBuffer(note: any, voiceParams: any, audioBuffer: any, isDrum?: boolean): Promise<RenderedBuffer>;
|
|
128
|
+
createAdsrRenderedBuffer(note: any, voiceParams: any, audioBuffer: any, noteDuration: any): Promise<RenderedBuffer>;
|
|
129
|
+
createFullRenderedBuffer(channel: any, note: any, voiceParams: any, noteDuration: any, noteEvent?: {}): Promise<RenderedBuffer>;
|
|
130
|
+
getAudioBuffer(channel: any, note: any, realtime: any): Promise<any>;
|
|
131
|
+
getAdsCachedBuffer(channel: any, note: any, audioBufferId: any, realtime: any): Promise<any>;
|
|
132
|
+
getAdsrCachedBuffer(note: any, audioBufferId: any): Promise<any>;
|
|
133
|
+
getFullCachedBuffer(note: any, audioBufferId: any): Promise<any>;
|
|
118
134
|
setNoteAudioNode(channel: any, note: any, realtime: any): Promise<any>;
|
|
119
135
|
handleExclusiveClass(note: any, channelNumber: any, startTime: any): void;
|
|
120
136
|
setNoteRouting(channelNumber: any, note: any, startTime: any): void;
|
|
121
|
-
noteOn(channelNumber: any, noteNumber: any, velocity: any, startTime: any): Promise<
|
|
137
|
+
noteOn(channelNumber: any, noteNumber: any, velocity: any, startTime: any): Promise<any>;
|
|
138
|
+
createNote(channelNumber: any, noteNumber: any, velocity: any, startTime: any): Note;
|
|
139
|
+
setupNote(channelNumber: any, note: any, startTime: any): Promise<any>;
|
|
122
140
|
disconnectNote(note: any): void;
|
|
141
|
+
releaseFullCache(note: any): void;
|
|
123
142
|
releaseNote(channel: any, note: any, endTime: any): Promise<any>;
|
|
124
143
|
noteOff(channelNumber: any, noteNumber: any, _velocity: any, endTime: any, force: any): any;
|
|
125
144
|
setNoteIndex(channel: any, index: any): void;
|
|
@@ -143,7 +162,7 @@ export class MidyGM1 extends EventTarget {
|
|
|
143
162
|
modLfoToVolume: (channel: any, note: any, scheduleTime: any) => void;
|
|
144
163
|
chorusEffectsSend: (_channel: any, _note: any, _scheduleTime: any) => void;
|
|
145
164
|
reverbEffectsSend: (_channel: any, _note: any, _scheduleTime: any) => void;
|
|
146
|
-
delayModLFO: (
|
|
165
|
+
delayModLFO: (channel: any, note: any, scheduleTime: any) => void;
|
|
147
166
|
freqModLFO: (_channel: any, note: any, scheduleTime: any) => void;
|
|
148
167
|
delayVibLFO: (_channel: any, _note: any, _scheduleTime: any) => void;
|
|
149
168
|
freqVibLFO: (_channel: any, _note: any, _scheduleTime: any) => void;
|
|
@@ -189,4 +208,61 @@ export class MidyGM1 extends EventTarget {
|
|
|
189
208
|
handleSysEx(data: any, scheduleTime: any): void;
|
|
190
209
|
scheduleTask(callback: any, scheduleTime: any): Promise<any>;
|
|
191
210
|
}
|
|
211
|
+
declare class Channel {
|
|
212
|
+
constructor(audioNodes: any, settings: any);
|
|
213
|
+
isDrum: boolean;
|
|
214
|
+
programNumber: number;
|
|
215
|
+
scheduleIndex: number;
|
|
216
|
+
detune: number;
|
|
217
|
+
dataMSB: number;
|
|
218
|
+
dataLSB: number;
|
|
219
|
+
rpnMSB: number;
|
|
220
|
+
rpnLSB: number;
|
|
221
|
+
modulationDepthRange: number;
|
|
222
|
+
fineTuning: number;
|
|
223
|
+
coarseTuning: number;
|
|
224
|
+
scheduledNotes: any[];
|
|
225
|
+
sustainNotes: any[];
|
|
226
|
+
currentBufferSource: null;
|
|
227
|
+
state: ControllerState;
|
|
228
|
+
resetSettings(settings: any): void;
|
|
229
|
+
}
|
|
230
|
+
declare class RenderedBuffer {
|
|
231
|
+
constructor(buffer: any, meta?: {});
|
|
232
|
+
buffer: any;
|
|
233
|
+
isLoop: any;
|
|
234
|
+
isFull: any;
|
|
235
|
+
adsDuration: any;
|
|
236
|
+
loopStart: any;
|
|
237
|
+
loopDuration: any;
|
|
238
|
+
noteDuration: any;
|
|
239
|
+
releaseDuration: any;
|
|
240
|
+
}
|
|
241
|
+
declare class Note {
|
|
242
|
+
constructor(noteNumber: any, velocity: any, startTime: any);
|
|
243
|
+
voice: any;
|
|
244
|
+
voiceParams: any;
|
|
245
|
+
adjustedBaseFreq: number;
|
|
246
|
+
index: number;
|
|
247
|
+
ending: boolean;
|
|
248
|
+
bufferSource: any;
|
|
249
|
+
timelineIndex: null;
|
|
250
|
+
renderedBuffer: null;
|
|
251
|
+
fullCacheVoiceId: null;
|
|
252
|
+
filterEnvelopeNode: any;
|
|
253
|
+
volumeEnvelopeNode: any;
|
|
254
|
+
modLfo: any;
|
|
255
|
+
modLfoToPitch: any;
|
|
256
|
+
modLfoToFilterFc: any;
|
|
257
|
+
modLfoToVolume: any;
|
|
258
|
+
noteNumber: any;
|
|
259
|
+
velocity: any;
|
|
260
|
+
startTime: any;
|
|
261
|
+
ready: Promise<any>;
|
|
262
|
+
resolveReady: (value: any) => void;
|
|
263
|
+
}
|
|
264
|
+
declare class ControllerState {
|
|
265
|
+
array: Float32Array<ArrayBuffer>;
|
|
266
|
+
}
|
|
267
|
+
export {};
|
|
192
268
|
//# sourceMappingURL=midy-GM1.d.ts.map
|
package/esm/midy-GM1.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"midy-GM1.d.ts","sourceRoot":"","sources":["../src/midy-GM1.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"midy-GM1.d.ts","sourceRoot":"","sources":["../src/midy-GM1.js"],"names":[],"mappings":"AA0NA;IA6CE;;;;;;;;;;;MAWE;IAEF,6CAiBC;IAtED,gCAAgC;IAChC,aAAa;IACb,oBAAiB;IACjB,qBAAmB;IACnB,kBAAc;IACd,0BAAwB;IACxB,kBAAc;IACd,mBAAiB;IACjB,kBAAc;IACd,mBAAe;IACf,kBAAgB;IAChB,0BAAuD;IACvD,4BAAyB;IACzB,0BAAuB;IACvB,kCAA+B;IAC/B,qBAAqC;IACrC,mBAAkB;IAClB,mBAAkB;IAClB,kBAAiB;IACjB,oBAAmB;IACnB,mBAAkB;IAClB,iCAA2C;IAC3C,cAAU;IACV,cAAa;IACb,iBAAY;IACZ,gBAAc;IACd,oBAAkB;IAClB,sBAAwB;IACxB,2BAAqC;IAErC,8BAA2B;IAE3B,+BAA4B;IAC5B,4BAAyB;IACzB,8BAA2B;IAE3B,0BAA2B;IAC3B,qBAAoB;IACpB,4BAA6B;IAiB3B,kBAAgC;IAChC,eAAwD;IACxD,kBAA8C;IAC9C,eAAwD;IACxD,qBAGE;IACF,uBAAmD;IACnD;;;;;;;;;;;;MAA2D;IAC3D,6BAA+D;IAC/D,oBAAiD;IAMnD,mCASC;IAED,2DAYC;IAED,yCAmBC;IAED,oCAYC;IAED,6BAiIC;IAED,sBAgCC;IAED,6EAgBC;IAED;;;;MAWC;IAED,6CAMC;IAED,2CAsBC;IAED,kDA6BC;IAED,8DAoBC;IAED,gEAwDC;IAED,mCASC;IAED,uBAUC;IAED,yDAqCC;IAED,iCA4EC;IAED,2BA6EC;IAED,uDAEC;IAED,wDAEC;IAED,qCAKC;IAED;;;MAwDC;IAED,kGAeC;IAED,mGAeC;IAED,wEAQC;IAED,oCAiJC;IAED,uBAMC;IAED,sBAIC;IAED,uBAMC;IAED,wBAIC;IAED,0BAKC;IAED,8BAoBC;IAED,wBAYC;IAED,sBAOC;IAED,kEAWC;IAED,kFAYC;IAED,8BAEC;IAED,8BAEC;IAED,4BAEC;IAED,qCAMC;IAED,2DAKC;IAED,6CAEC;IAED,sDAgBC;IAED,4DAMC;IAED,qDAkBC;IAED,6CAIC;IAED,sDA8BC;IAED,kEAwBC;IAED,kHAoEC;IAED,oHAoGC;IAED,gIA0DC;IAED,qEAwBC;IAED,6FAqCC;IAED,iEA+CC;IAED,iEA0CC;IAED,uEAyDC;IAED,0EAiBC;IAED,oEAUC;IAED,yFAQC;IAED,qFAQC;IAED,uEA4BC;IAED,gCAUC;IAED,kCAWC;IAED,iEAuGC;IAED,4FAaC;IAED,6CAUC;IAED,qDAUC;IAED,qFAeC;IAED,+BAmBC;IAED,kDAOC;IAED,sFAsBC;IAED,mFAGC;IAED,wFAGC;IAED,sEAUC;IAED,mEAYC;IAED,wDAKC;IAED,sDAOC;IAED,mDAMC;IAED,kDAKC;IAED;;;;;;;;;;;;MAoCC;IAED,oFAMC;IAED,6EA4BC;IAED,qCAeC;IAED,+FAYC;IAED,wDAWC;IAED,4EAKC;IAED,mEAKC;IAED;;;MAMC;IAED,gEAKC;IAED,uEAKC;IAED,sEAGC;IAED,2DAUC;IAED,yEAeC;IAED,kFAeC;IAED,2DAMC;IAED,uDAoBC;IAED,gDAEC;IAED,gDAEC;IAED,sEAGC;IAED,qEAKC;IAED,2EAUC;IAED,iEAMC;IAED,uEAQC;IAED,mEAKC;IAED,yEAQC;IAED,gFAGC;IAED,6CAmBC;IAGD,8EAgCC;IAED,gFAGC;IAED,+EAgBC;IAED,qCAUC;IAED,4EAaC;IAED,4DAGC;IAED,qDAKC;IAED,gDAYC;IAGD,6DAgBC;CACF;AApkFD;IAgBE,4CAIC;IAnBD,gBAAe;IACf,sBAAkB;IAClB,sBAAkB;IAClB,eAAW;IACX,gBAAY;IACZ,gBAAY;IACZ,eAAa;IACb,eAAa;IACb,6BAA0B;IAC1B,mBAAe;IACf,qBAAiB;IACjB,sBAAoB;IACpB,oBAAkB;IAClB,0BAA2B;IAKzB,uBAAkC;IAGpC,mCAEC;CACF;AAuED;IAUE,oCASC;IAlBD,YAAO;IACP,YAAO;IACP,YAAO;IACP,iBAAY;IACZ,eAAU;IACV,kBAAa;IACb,kBAAa;IACb,qBAAgB;CAYjB;AA/ID;IAiBE,4DAOC;IAvBD,WAAM;IACN,iBAAY;IACZ,yBAAyB;IACzB,cAAW;IACX,gBAAe;IACf,kBAAa;IACb,oBAAqB;IACrB,qBAAsB;IACtB,uBAAwB;IACxB,wBAAmB;IACnB,wBAAmB;IACnB,YAAO;IACP,mBAAc;IACd,sBAAiB;IACjB,oBAAe;IAGb,gBAA4B;IAC5B,cAAwB;IACxB,eAA0B;IAC1B,oBAEE;IADA,mCAA2B;CAGhC;AAkDD;IACE,iCAA8B;CAa/B"}
|