@marmooo/midy 0.4.9 → 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
@@ -30,7 +30,7 @@ This library provides several files depending on the implementation level.
30
30
  optimized for chords
31
31
  - [Hexatone](https://marmooo.github.io/hexatone/) - Hexagonal MPE MIDI
32
32
  controller with Wicki-Hayden layout
33
- - [Chromatone](https://marmooo.github.io/chromatone/) - Hexagonal MPE MIDI
33
+ - [Glisstone](https://marmooo.github.io/glisstone/) - Hexagonal MPE MIDI
34
34
  controller optimized for glissando
35
35
 
36
36
  ## Support Status
@@ -94,6 +94,18 @@ midy.addEventListener("resumed", func);
94
94
  midy.addEventListener("seeked", func);
95
95
  ```
96
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
+
97
109
  ### MIDI Message
98
110
 
99
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,7 +61,7 @@ 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;
@@ -66,8 +73,9 @@ export class MidyGM1 extends EventTarget {
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;
@@ -76,11 +84,12 @@ export class MidyGM1 extends EventTarget {
76
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;
@@ -208,6 +227,40 @@ declare class Channel {
208
227
  state: ControllerState;
209
228
  resetSettings(settings: any): void;
210
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
+ }
211
264
  declare class ControllerState {
212
265
  array: Float32Array<ArrayBuffer>;
213
266
  }
@@ -1 +1 @@
1
- {"version":3,"file":"midy-GM1.d.ts","sourceRoot":"","sources":["../src/midy-GM1.js"],"names":[],"mappings":"AA8IA;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,oBAAiD;IAMnD,mCASC;IAED,2DAYC;IAED,yCAmBC;IAED,oCASC;IAED,sBA6BC;IAED,8DAeC;IAED;;;;MAeC;IAED,6CAMC;IAED,2CAsBC;IAED,kDA6BC;IAED,4DASC;IAED,gEAsDC;IAED,mCASC;IAED,uBASC;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,6CAmBC;IAGD,8EAgCC;IAED,gFAGC;IAED,+EAgBC;IAED,qCAUC;IAED,4EAaC;IAED,4DAGC;IAED,qDAKC;IAED,gDAYC;IAGD,6DAgBC;CACF;AAvrDD;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;AAuBD;IACE,iCAA8B;CAa/B"}
1
+ {"version":3,"file":"midy-GM1.d.ts","sourceRoot":"","sources":["../src/midy-GM1.js"],"names":[],"mappings":"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"}