@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 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 with
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: (_channel: any, note: any, scheduleTime: any) => void;
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: any[];
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): 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): any[];
84
+ createChannels(audioContext: any): Channel[];
77
85
  decodeOggVorbis(sample: any): Promise<any>;
78
86
  createAudioBuffer(voiceParams: any): Promise<any>;
79
- createBufferSource(voiceParams: any, audioBuffer: any): 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
- getAudioBuffer(channel: any, noteNumber: any, velocity: any, voiceParams: any, realtime: any): Promise<any>;
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<void>;
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: (_channel: any, note: any, scheduleTime: any) => void;
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
@@ -1 +1 @@
1
- {"version":3,"file":"midy-GM1.d.ts","sourceRoot":"","sources":["../src/midy-GM1.js"],"names":[],"mappings":"AAmHA;IAsCE;;;;;;;;;;;MAWE;IAEF,+BAgBC;IA9DD,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,4BAAiC;IACjC,mBAAkB;IAClB,mBAAkB;IAClB,kBAAiB;IACjB,oBAAmB;IACnB,mBAAkB;IAClB,iCAEG;IACH,cAAU;IACV,cAAa;IACb,iBAAY;IACZ,gBAAc;IACd,oBAAkB;IAClB,sBAAwB;IACxB,2BAAqC;IAiBnC,kBAAgC;IAChC,kBAA8C;IAC9C,eAAwD;IACxD,qBAGE;IACF,uBAAmD;IACnD;;;;;;;;;;;;MAA2D;IAC3D,6BAA+D;IAC/D,gBAAiD;IAMnD,mCASC;IAED,2DAYC;IAED,yCAmBC;IAED,oCASC;IAED,sBA6BC;IAED,8DAeC;IAED;;;;MAeC;IAED,yCAaC;IAED,2CAsBC;IAED,kDA6BC;IAED,4DASC;IAED,gEAsDC;IAED,mCASC;IAED,uBAUC;IAED,yDAqCC;IAED,2BA0EC;IAED,uDAEC;IAED,wDAEC;IAED,qCAKC;IAED;;;MAwDC;IAED,kGAeC;IAED,mGAeC;IAED,wEAQC;IAED,uBAMC;IAED,sBAIC;IAED,uBAMC;IAED,wBAIC;IAED,0BAKC;IAED,8BAMC;IAED,wBAYC;IAED,sBAIC;IAED,kEAWC;IAED,kFAYC;IAED,8BAEC;IAED,8BAEC;IAED,4BAEC;IAED,qCAMC;IAED,2DAIC;IAED,6CAEC;IAED,sDAeC;IAED,4DASC;IAED,qDAkBC;IAED,6CAIC;IAED,sDA6BC;IAED,kEAqBC;IAED,4GAkCC;IAED,uEAyCC;IAED,0EAiBC;IAED,oEASC;IAED,0FAwBC;IAED,gCASC;IAED,iEAwBC;IAED,4FAmBC;IAED,6CAUC;IAED,qDAUC;IAED,qFAeC;IAED,+BAmBC;IAED,kDAOC;IAED,sFA2BC;IAED,mFAGC;IAED,wFAGC;IAED,sEAUC;IAED,mEAYC;IAED,wDAKC;IAED,sDAOC;IAED,mDAMC;IAED,kDAKC;IAED;;;;;;;;;;;;MAoCC;IAED,oFAMC;IAED,6EA2BC;IAED,qCAeC;IAED,+FAYC;IAED,wDAUC;IAED,4EAKC;IAED,mEAKC;IAED;;;MAMC;IAED,gEAKC;IAED,uEAKC;IAED,sEAGC;IAED,2DAUC;IAED,yEAWC;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,6CAqBC;IAGD,8EAgCC;IAED,gFAGC;IAED,+EAgBC;IAED,qCAUC;IAED,4EAaC;IAED,4DAGC;IAED,qDAKC;IAED,gDAYC;IAGD,6DAgBC;CACF"}
1
+ {"version":3,"file":"midy-GM1.d.ts","sourceRoot":"","sources":["../src/midy-GM1.js"],"names":[],"mappings":"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"}