@marmooo/midy 0.4.7 → 0.4.9
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 +6 -2
- package/esm/midy-GM1.d.ts +25 -2
- package/esm/midy-GM1.d.ts.map +1 -1
- package/esm/midy-GM1.js +97 -16
- package/esm/midy-GM2.d.ts +39 -3
- package/esm/midy-GM2.d.ts.map +1 -1
- package/esm/midy-GM2.js +176 -39
- package/esm/midy-GMLite.d.ts +23 -2
- package/esm/midy-GMLite.d.ts.map +1 -1
- package/esm/midy-GMLite.js +85 -15
- package/esm/midy.d.ts +41 -3
- package/esm/midy.d.ts.map +1 -1
- package/esm/midy.js +212 -51
- package/package.json +1 -1
- package/script/midy-GM1.d.ts +25 -2
- package/script/midy-GM1.d.ts.map +1 -1
- package/script/midy-GM1.js +97 -16
- package/script/midy-GM2.d.ts +39 -3
- package/script/midy-GM2.d.ts.map +1 -1
- package/script/midy-GM2.js +176 -39
- package/script/midy-GMLite.d.ts +23 -2
- package/script/midy-GMLite.d.ts.map +1 -1
- package/script/midy-GMLite.js +85 -15
- package/script/midy.d.ts +41 -3
- package/script/midy.d.ts.map +1 -1
- package/script/midy.js +212 -51
package/esm/midy-GMLite.js
CHANGED
|
@@ -92,6 +92,88 @@ class Note {
|
|
|
92
92
|
});
|
|
93
93
|
}
|
|
94
94
|
}
|
|
95
|
+
class Channel {
|
|
96
|
+
constructor(audioNodes, settings) {
|
|
97
|
+
Object.defineProperty(this, "isDrum", {
|
|
98
|
+
enumerable: true,
|
|
99
|
+
configurable: true,
|
|
100
|
+
writable: true,
|
|
101
|
+
value: false
|
|
102
|
+
});
|
|
103
|
+
Object.defineProperty(this, "programNumber", {
|
|
104
|
+
enumerable: true,
|
|
105
|
+
configurable: true,
|
|
106
|
+
writable: true,
|
|
107
|
+
value: 0
|
|
108
|
+
});
|
|
109
|
+
Object.defineProperty(this, "scheduleIndex", {
|
|
110
|
+
enumerable: true,
|
|
111
|
+
configurable: true,
|
|
112
|
+
writable: true,
|
|
113
|
+
value: 0
|
|
114
|
+
});
|
|
115
|
+
Object.defineProperty(this, "detune", {
|
|
116
|
+
enumerable: true,
|
|
117
|
+
configurable: true,
|
|
118
|
+
writable: true,
|
|
119
|
+
value: 0
|
|
120
|
+
});
|
|
121
|
+
Object.defineProperty(this, "dataMSB", {
|
|
122
|
+
enumerable: true,
|
|
123
|
+
configurable: true,
|
|
124
|
+
writable: true,
|
|
125
|
+
value: 0
|
|
126
|
+
});
|
|
127
|
+
Object.defineProperty(this, "dataLSB", {
|
|
128
|
+
enumerable: true,
|
|
129
|
+
configurable: true,
|
|
130
|
+
writable: true,
|
|
131
|
+
value: 0
|
|
132
|
+
});
|
|
133
|
+
Object.defineProperty(this, "rpnMSB", {
|
|
134
|
+
enumerable: true,
|
|
135
|
+
configurable: true,
|
|
136
|
+
writable: true,
|
|
137
|
+
value: 127
|
|
138
|
+
});
|
|
139
|
+
Object.defineProperty(this, "rpnLSB", {
|
|
140
|
+
enumerable: true,
|
|
141
|
+
configurable: true,
|
|
142
|
+
writable: true,
|
|
143
|
+
value: 127
|
|
144
|
+
});
|
|
145
|
+
Object.defineProperty(this, "modulationDepthRange", {
|
|
146
|
+
enumerable: true,
|
|
147
|
+
configurable: true,
|
|
148
|
+
writable: true,
|
|
149
|
+
value: 50
|
|
150
|
+
}); // cent
|
|
151
|
+
Object.defineProperty(this, "scheduledNotes", {
|
|
152
|
+
enumerable: true,
|
|
153
|
+
configurable: true,
|
|
154
|
+
writable: true,
|
|
155
|
+
value: []
|
|
156
|
+
});
|
|
157
|
+
Object.defineProperty(this, "sustainNotes", {
|
|
158
|
+
enumerable: true,
|
|
159
|
+
configurable: true,
|
|
160
|
+
writable: true,
|
|
161
|
+
value: []
|
|
162
|
+
});
|
|
163
|
+
Object.defineProperty(this, "currentBufferSource", {
|
|
164
|
+
enumerable: true,
|
|
165
|
+
configurable: true,
|
|
166
|
+
writable: true,
|
|
167
|
+
value: null
|
|
168
|
+
});
|
|
169
|
+
Object.assign(this, audioNodes);
|
|
170
|
+
Object.assign(this, settings);
|
|
171
|
+
this.state = new ControllerState();
|
|
172
|
+
}
|
|
173
|
+
resetSettings(settings) {
|
|
174
|
+
Object.assign(this, settings);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
95
177
|
const drumExclusiveClasses = new Uint8Array(128);
|
|
96
178
|
drumExclusiveClasses[42] = 1;
|
|
97
179
|
drumExclusiveClasses[44] = 1;
|
|
@@ -495,18 +577,8 @@ export class MidyGMLite extends EventTarget {
|
|
|
495
577
|
};
|
|
496
578
|
}
|
|
497
579
|
createChannels(audioContext) {
|
|
498
|
-
const
|
|
499
|
-
|
|
500
|
-
currentBufferSource: null,
|
|
501
|
-
isDrum: false,
|
|
502
|
-
state: new ControllerState(),
|
|
503
|
-
...this.constructor.channelSettings,
|
|
504
|
-
...this.createChannelAudioNodes(audioContext),
|
|
505
|
-
scheduledNotes: [],
|
|
506
|
-
sustainNotes: [],
|
|
507
|
-
};
|
|
508
|
-
});
|
|
509
|
-
return channels;
|
|
580
|
+
const settings = this.constructor.channelSettings;
|
|
581
|
+
return Array.from({ length: this.numChannels }, () => new Channel(this.createChannelAudioNodes(audioContext), settings));
|
|
510
582
|
}
|
|
511
583
|
decodeOggVorbis(sample) {
|
|
512
584
|
const task = decoderQueue.then(async () => {
|
|
@@ -1612,9 +1684,7 @@ export class MidyGMLite extends EventTarget {
|
|
|
1612
1684
|
state[key] = defaultValue;
|
|
1613
1685
|
}
|
|
1614
1686
|
}
|
|
1615
|
-
|
|
1616
|
-
channel[key] = this.constructor.channelSettings[key];
|
|
1617
|
-
}
|
|
1687
|
+
channel.resetSettings(this.constructor.channelSettings);
|
|
1618
1688
|
this.mode = "GM1";
|
|
1619
1689
|
}
|
|
1620
1690
|
// https://amei.or.jp/midistandardcommittee/Recommended_Practice/e/rp15.pdf
|
package/esm/midy.d.ts
CHANGED
|
@@ -96,7 +96,7 @@ export class Midy extends EventTarget {
|
|
|
96
96
|
controlChangeHandlers: any[];
|
|
97
97
|
keyBasedControllerHandlers: any[];
|
|
98
98
|
effectHandlers: any[];
|
|
99
|
-
channels:
|
|
99
|
+
channels: Channel[];
|
|
100
100
|
reverbEffect: {
|
|
101
101
|
input: any;
|
|
102
102
|
output: any;
|
|
@@ -121,8 +121,7 @@ export class Midy extends EventTarget {
|
|
|
121
121
|
gainR: any;
|
|
122
122
|
merger: any;
|
|
123
123
|
};
|
|
124
|
-
|
|
125
|
-
createChannels(audioContext: any): any[];
|
|
124
|
+
createChannels(audioContext: any): Channel[];
|
|
126
125
|
decodeOggVorbis(sample: any): Promise<any>;
|
|
127
126
|
createAudioBuffer(voiceParams: any): Promise<any>;
|
|
128
127
|
isLoopDrum(channel: any, noteNumber: any): boolean;
|
|
@@ -260,6 +259,7 @@ export class Midy extends EventTarget {
|
|
|
260
259
|
updatePortamento(channel: any, scheduleTime: any): void;
|
|
261
260
|
setPortamentoTime(channelNumber: any, value: any, scheduleTime: any): void;
|
|
262
261
|
setVolume(channelNumber: any, value: any, scheduleTime: any): void;
|
|
262
|
+
applyVolume(channel: any, scheduleTime: any): void;
|
|
263
263
|
panToGain(pan: any): {
|
|
264
264
|
gainLeft: number;
|
|
265
265
|
gainRight: number;
|
|
@@ -363,7 +363,11 @@ export class Midy extends EventTarget {
|
|
|
363
363
|
getLFOAmplitudeDepth(channel: any, note: any): number;
|
|
364
364
|
createEffectHandlers(): any[];
|
|
365
365
|
setControlChangeEffects(channel: any, note: any, scheduleTime: any): void;
|
|
366
|
+
setChannelPressureEffects(channel: any, note: any, scheduleTime: any): void;
|
|
367
|
+
setPolyphonicKeyPressureEffects(channel: any, note: any, scheduleTime: any): void;
|
|
366
368
|
setPressureEffects(channel: any, note: any, tableName: any, scheduleTime: any): void;
|
|
369
|
+
handleChannelPressureSysEx(data: any, scheduleTime: any): void;
|
|
370
|
+
handlePolyphonicKeyPressureSysEx(data: any, scheduleTime: any): void;
|
|
367
371
|
handlePressureSysEx(data: any, tableName: any, scheduleTime: any): void;
|
|
368
372
|
handleControlChangeSysEx(data: any, scheduleTime: any): void;
|
|
369
373
|
getRelativeKeyBasedValue(channel: any, keyNumber: any, controllerType: any): any;
|
|
@@ -374,6 +378,37 @@ export class Midy extends EventTarget {
|
|
|
374
378
|
scheduleTask(callback: any, scheduleTime: any): Promise<any>;
|
|
375
379
|
}
|
|
376
380
|
import { OggVorbisDecoderWebWorker } from "@wasm-audio-decoders/ogg-vorbis";
|
|
381
|
+
declare class Channel {
|
|
382
|
+
constructor(audioNodes: any, settings: any);
|
|
383
|
+
isDrum: boolean;
|
|
384
|
+
programNumber: number;
|
|
385
|
+
scheduleIndex: number;
|
|
386
|
+
detune: number;
|
|
387
|
+
bankMSB: number;
|
|
388
|
+
bankLSB: number;
|
|
389
|
+
dataMSB: number;
|
|
390
|
+
dataLSB: number;
|
|
391
|
+
rpnMSB: number;
|
|
392
|
+
rpnLSB: number;
|
|
393
|
+
mono: boolean;
|
|
394
|
+
modulationDepthRange: number;
|
|
395
|
+
fineTuning: number;
|
|
396
|
+
coarseTuning: number;
|
|
397
|
+
scheduledNotes: any[];
|
|
398
|
+
sustainNotes: any[];
|
|
399
|
+
sostenutoNotes: any[];
|
|
400
|
+
controlTable: Int8Array<ArrayBuffer>;
|
|
401
|
+
scaleOctaveTuningTable: Float32Array<ArrayBuffer>;
|
|
402
|
+
channelPressureTable: Int8Array<ArrayBuffer>;
|
|
403
|
+
polyphonicKeyPressureTable: Int8Array<ArrayBuffer>;
|
|
404
|
+
keyBasedTable: Int8Array<ArrayBuffer>;
|
|
405
|
+
keyBasedGainLs: any[];
|
|
406
|
+
keyBasedGainRs: any[];
|
|
407
|
+
currentBufferSource: null;
|
|
408
|
+
state: ControllerState;
|
|
409
|
+
resetSettings(settings: any): void;
|
|
410
|
+
resetTable(channel: any): void;
|
|
411
|
+
}
|
|
377
412
|
declare class Note {
|
|
378
413
|
constructor(noteNumber: any, velocity: any, startTime: any);
|
|
379
414
|
voice: any;
|
|
@@ -401,5 +436,8 @@ declare class Note {
|
|
|
401
436
|
ready: Promise<any>;
|
|
402
437
|
resolveReady: (value: any) => void;
|
|
403
438
|
}
|
|
439
|
+
declare class ControllerState {
|
|
440
|
+
array: Float32Array<ArrayBuffer>;
|
|
441
|
+
}
|
|
404
442
|
export {};
|
|
405
443
|
//# sourceMappingURL=midy.d.ts.map
|
package/esm/midy.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"midy.d.ts","sourceRoot":"","sources":["../src/midy.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"midy.d.ts","sourceRoot":"","sources":["../src/midy.js"],"names":[],"mappings":"AAwPA;IAgEE;;;;;;;;;;;;;;;;;MAiBE;IAEF,+BAyBC;IAvGD,gCAAgC;IAChC,aAAa;IACb,yBAAqB;IACrB,2BAAuB;IACvB;;;;MAIE;IACF;;;;;;MAME;IACF,oBAAiB;IACjB,qBAAmB;IACnB,kBAAc;IACd,0BAAsB;IACtB,+BAA6B;IAC7B,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,iCAEG;IACH,cAAU;IACV,cAAa;IACb,kBAAc;IACd,iBAAY;IACZ,gBAAc;IACd,oBAAkB;IAClB,sBAAwB;IACxB,2BAAqC;IACrC,+BAEE;IACF,oBAAmB;IACnB,wBAAoB;IACpB,wBAAoB;IACpB;;;MAGE;IAuBA,mCAA8C;IAC9C,4BAAsC;IACtC,4BAAqC;IACrC,kBAAgC;IAChC,kBAA8C;IAC9C,eAAwD;IACxD,qBAGE;IACF,uBAAmD;IACnD;;;;;;;;;;;;MAA2D;IAC3D,6BAA+D;IAC/D,kCAAyE;IACzE,sBAAiD;IACjD,oBAAiD;IACjD;;;kBAAyD;IACzD;;;;;;;;MAAyD;IAQ3D,mCASC;IAED,2DAYC;IAED,yCAmBC;IAED,oCASC;IAED,sBAoCC;IAED,8DAeC;IAED;;;;MAeC;IAED,6CAMC;IAED,2CAsBC;IAED,kDA6BC;IAED,mDAIC;IAED,2FAWC;IAED,gEAiEC;IAED,mCASC;IAED,uBAUC;IAED,yDAqCC;IAED,2BA0FC;IAED,uDAEC;IAED,wDAEC;IAED,qCAMC;IAED;;;MAqFC;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,sDAaC;IAED,kFAuBC;IAED;;;;MASC;IAED,gFAUC;IAED,mFAYC;IAED,sGAcC;IAID;;;MA8BC;IAED;;;kBA6BC;IAED;;;;;;;;MA0CC;IAED,8BAEC;IAED,8BAEC;IAED,4BAEC;IAED,qCAWC;IAED,2DAQC;IAED,oDAEC;IAED,6CAKC;IAED,mDAMC;IAED,2CAoDC;IAED,8EASC;IAED,oEAoBC;IAED,gEAKC;IAED,sEAgBC;IAED,4DASC;IAED,6EAOC;IAED,qDAkBC;IAED,6CAIC;IAED,8EAsBC;IAED,oEAkCC;IAED,kEAqBC;IAED,+DAgBC;IAED,4GAkCC;IAED,uEA2EC;IAED,0EAiBC;IAED,8EAoBC;IAED,oEAuBC;IAED,0FAWC;IAED,yGAyBC;IAED,gCAoBC;IAED,iEA0BC;IAED,2FAwCC;IAED,6FA2BC;IAED,6CAUC;IAED,qDAUC;IAED,qFAeC;IAED,uFAkBC;IAED,+BAyCC;IAED,kDAOC;IAED,sBAEC;IAED,sGAgBC;IAED,kFAIC;IAED,qFAcC;IAED,4EAKC;IAED,8EAWC;IAED,wFAGC;IAED,sEAIC;IAED,wEAWC;IAED,mEAcC;IAED,mEAaC;IAED,sEAMC;IAED,oEAQC;IAED,gEAyBC;IAED,gEAyBC;IAED,gCAKC;IAED,kDAKC;IAED,8CAQC;IAED,gEAOC;IAED;;;;;;;;;;;;MA6DC;IAED,gHAQC;IAED,6EAgCC;IAED,qCA4CC;IAED,+FAKC;IAED,iGAcC;IAED,+CAEC;IAED,wDAWC;IAED,4EASC;IAED,wDAeC;IAED,2EASC;IAED,mEAQC;IAED,mDAQC;IAED;;;MAMC;IAED,gEAcC;IAED,uEAQC;IAED,+CAEC;IAED,sEAGC;IAED,2DAqBC;IAED,4EA6BC;IAED,yEAYC;IAED,+CAEC;IAED,uEAMC;IAED,2EAcC;IAED,oDAEC;IAED,0EAeC;IAED,8EAeC;IAED,8EAKC;IAED,4EAUC;IAED,4EAaC;IAED,0EAQC;IAED,8EASC;IAED,gFAeC;IAED,gFAUC;IAED,iFAKC;IAED,sFAQC;IAED,sFAQC;IAED,kFAeC;IAED,2DAMC;IAED,mEA+BC;IAGD,2DAGC;IAGD,2DAGC;IAED,gDAEC;IAED,gDAEC;IAED,sEAGC;IAED,qEAKC;IAED,2EAWC;IAED,iEAMC;IAED,uEASC;IAED,mEAKC;IAED,yEASC;IAED,2EAKC;IAED,iFAMC;IAED,gFAGC;IAED,kEAoBC;IAED,2EAGC;IAED,qEAGC;IAED,iGAIC;IAED,6CAsBC;IAGD,8EAuCC;IAED,gFAGC;IAED,iEAGC;IAED,gEAGC;IAED,gEAKC;IAED,gEAKC;IAED,+EAuCC;IAED,qCAaC;IAED,qCAaC;IAED,4EA6DC;IAED,4DAGC;IAED,qDAKC;IAED,gEAIC;IAED,yDAYC;IAED,kEAGC;IAED,2DAYC;IAED,sEAeC;IAED,4CAOC;IAED,+BAIC;IAED,qDAiBC;IAED,gCAGC;IAED,kCAEC;IA6BD,4CAEC;IAED,+DAaC;IAED,kDAiBC;IAED,2GAKC;IAED,sDAIC;IAED,qCAEC;IAED,uDAMC;IAED,sCAEC;IAED,uDASC;IAED,sCAEC;IAED,2DAqBC;IAED,0CAEC;IAED,mCAeC;IAED,2FAgBC;IAED,2FAoBC;IAED,mEAGC;IAED,+DAGC;IAED,qEASC;IAED,uEAOC;IAED,uEAOC;IAED,6CAEC;IAED,qDAEC;IAED,iDAEC;IAED,wDAEC;IAED,iDAEC;IAED,yDAEC;IAED,qDAEC;IAED,kDAEC;IAED,mDAEC;IAED,sDAEC;IAED,8BA8BC;IAED,0EAQC;IAED,4EAOC;IAED,kFAOC;IAED,qFASC;IAED,+DAEC;IAED,qEAEC;IAED,wEAcC;IAED,6DAiBC;IAED,iFAUC;IAED,yEAIC;IAED,0CAuEC;IAED,yEAcC;IAED,gDAYC;IAGD,6DAgBC;CACF;0CA5uHyC,iCAAiC;AA4C3E;IA2BE,4CAIC;IA9BD,gBAAe;IACf,sBAAkB;IAClB,sBAAkB;IAClB,eAAW;IACX,gBAAc;IACd,gBAAY;IACZ,gBAAY;IACZ,gBAAY;IACZ,eAAa;IACb,eAAa;IACb,cAAa;IACb,6BAA0B;IAC1B,mBAAe;IACf,qBAAiB;IACjB,sBAAoB;IACpB,oBAAkB;IAClB,sBAAoB;IACpB,qCAAmD;IACnD,kDAA8C;IAC9C,6CAA4D;IAC5D,mDAAkE;IAClE,sCAAkD;IAClD,sBAAgC;IAChC,sBAAgC;IAChC,0BAA2B;IAKzB,uBAAkC;IAGpC,mCAEC;IAED,+BAMC;CACF;AA3ED;IAqBE,4DAOC;IA3BD,WAAM;IACN,iBAAY;IACZ,yBAAyB;IACzB,cAAW;IACX,gBAAe;IACf,kBAAa;IACb,wBAAmB;IACnB,wBAAmB;IACnB,gBAAW;IACX,YAAO;IACP,mBAAc;IACd,sBAAiB;IACjB,oBAAe;IACf,YAAO;IACP,mBAAc;IACd,gBAAW;IACX,gBAAW;IACX,6BAA0B;IAC1B,iBAAa;IAGX,gBAA4B;IAC5B,cAAwB;IACxB,eAA0B;IAC1B,oBAEE;IADA,mCAA2B;CAGhC;AAsID;IACE,iCAA8B;CAa/B"}
|
package/esm/midy.js
CHANGED
|
@@ -134,6 +134,173 @@ class Note {
|
|
|
134
134
|
});
|
|
135
135
|
}
|
|
136
136
|
}
|
|
137
|
+
class Channel {
|
|
138
|
+
constructor(audioNodes, settings) {
|
|
139
|
+
Object.defineProperty(this, "isDrum", {
|
|
140
|
+
enumerable: true,
|
|
141
|
+
configurable: true,
|
|
142
|
+
writable: true,
|
|
143
|
+
value: false
|
|
144
|
+
});
|
|
145
|
+
Object.defineProperty(this, "programNumber", {
|
|
146
|
+
enumerable: true,
|
|
147
|
+
configurable: true,
|
|
148
|
+
writable: true,
|
|
149
|
+
value: 0
|
|
150
|
+
});
|
|
151
|
+
Object.defineProperty(this, "scheduleIndex", {
|
|
152
|
+
enumerable: true,
|
|
153
|
+
configurable: true,
|
|
154
|
+
writable: true,
|
|
155
|
+
value: 0
|
|
156
|
+
});
|
|
157
|
+
Object.defineProperty(this, "detune", {
|
|
158
|
+
enumerable: true,
|
|
159
|
+
configurable: true,
|
|
160
|
+
writable: true,
|
|
161
|
+
value: 0
|
|
162
|
+
});
|
|
163
|
+
Object.defineProperty(this, "bankMSB", {
|
|
164
|
+
enumerable: true,
|
|
165
|
+
configurable: true,
|
|
166
|
+
writable: true,
|
|
167
|
+
value: 121
|
|
168
|
+
});
|
|
169
|
+
Object.defineProperty(this, "bankLSB", {
|
|
170
|
+
enumerable: true,
|
|
171
|
+
configurable: true,
|
|
172
|
+
writable: true,
|
|
173
|
+
value: 0
|
|
174
|
+
});
|
|
175
|
+
Object.defineProperty(this, "dataMSB", {
|
|
176
|
+
enumerable: true,
|
|
177
|
+
configurable: true,
|
|
178
|
+
writable: true,
|
|
179
|
+
value: 0
|
|
180
|
+
});
|
|
181
|
+
Object.defineProperty(this, "dataLSB", {
|
|
182
|
+
enumerable: true,
|
|
183
|
+
configurable: true,
|
|
184
|
+
writable: true,
|
|
185
|
+
value: 0
|
|
186
|
+
});
|
|
187
|
+
Object.defineProperty(this, "rpnMSB", {
|
|
188
|
+
enumerable: true,
|
|
189
|
+
configurable: true,
|
|
190
|
+
writable: true,
|
|
191
|
+
value: 127
|
|
192
|
+
});
|
|
193
|
+
Object.defineProperty(this, "rpnLSB", {
|
|
194
|
+
enumerable: true,
|
|
195
|
+
configurable: true,
|
|
196
|
+
writable: true,
|
|
197
|
+
value: 127
|
|
198
|
+
});
|
|
199
|
+
Object.defineProperty(this, "mono", {
|
|
200
|
+
enumerable: true,
|
|
201
|
+
configurable: true,
|
|
202
|
+
writable: true,
|
|
203
|
+
value: false
|
|
204
|
+
}); // CC#124, CC#125
|
|
205
|
+
Object.defineProperty(this, "modulationDepthRange", {
|
|
206
|
+
enumerable: true,
|
|
207
|
+
configurable: true,
|
|
208
|
+
writable: true,
|
|
209
|
+
value: 50
|
|
210
|
+
}); // cent
|
|
211
|
+
Object.defineProperty(this, "fineTuning", {
|
|
212
|
+
enumerable: true,
|
|
213
|
+
configurable: true,
|
|
214
|
+
writable: true,
|
|
215
|
+
value: 0
|
|
216
|
+
}); // cent
|
|
217
|
+
Object.defineProperty(this, "coarseTuning", {
|
|
218
|
+
enumerable: true,
|
|
219
|
+
configurable: true,
|
|
220
|
+
writable: true,
|
|
221
|
+
value: 0
|
|
222
|
+
}); // cent
|
|
223
|
+
Object.defineProperty(this, "scheduledNotes", {
|
|
224
|
+
enumerable: true,
|
|
225
|
+
configurable: true,
|
|
226
|
+
writable: true,
|
|
227
|
+
value: []
|
|
228
|
+
});
|
|
229
|
+
Object.defineProperty(this, "sustainNotes", {
|
|
230
|
+
enumerable: true,
|
|
231
|
+
configurable: true,
|
|
232
|
+
writable: true,
|
|
233
|
+
value: []
|
|
234
|
+
});
|
|
235
|
+
Object.defineProperty(this, "sostenutoNotes", {
|
|
236
|
+
enumerable: true,
|
|
237
|
+
configurable: true,
|
|
238
|
+
writable: true,
|
|
239
|
+
value: []
|
|
240
|
+
});
|
|
241
|
+
Object.defineProperty(this, "controlTable", {
|
|
242
|
+
enumerable: true,
|
|
243
|
+
configurable: true,
|
|
244
|
+
writable: true,
|
|
245
|
+
value: new Int8Array(defaultControlValues)
|
|
246
|
+
});
|
|
247
|
+
Object.defineProperty(this, "scaleOctaveTuningTable", {
|
|
248
|
+
enumerable: true,
|
|
249
|
+
configurable: true,
|
|
250
|
+
writable: true,
|
|
251
|
+
value: new Float32Array(12)
|
|
252
|
+
}); // [-100, 100] cent
|
|
253
|
+
Object.defineProperty(this, "channelPressureTable", {
|
|
254
|
+
enumerable: true,
|
|
255
|
+
configurable: true,
|
|
256
|
+
writable: true,
|
|
257
|
+
value: new Int8Array(defaultPressureValues)
|
|
258
|
+
});
|
|
259
|
+
Object.defineProperty(this, "polyphonicKeyPressureTable", {
|
|
260
|
+
enumerable: true,
|
|
261
|
+
configurable: true,
|
|
262
|
+
writable: true,
|
|
263
|
+
value: new Int8Array(defaultPressureValues)
|
|
264
|
+
});
|
|
265
|
+
Object.defineProperty(this, "keyBasedTable", {
|
|
266
|
+
enumerable: true,
|
|
267
|
+
configurable: true,
|
|
268
|
+
writable: true,
|
|
269
|
+
value: new Int8Array(128 * 128).fill(-1)
|
|
270
|
+
});
|
|
271
|
+
Object.defineProperty(this, "keyBasedGainLs", {
|
|
272
|
+
enumerable: true,
|
|
273
|
+
configurable: true,
|
|
274
|
+
writable: true,
|
|
275
|
+
value: new Array(128)
|
|
276
|
+
});
|
|
277
|
+
Object.defineProperty(this, "keyBasedGainRs", {
|
|
278
|
+
enumerable: true,
|
|
279
|
+
configurable: true,
|
|
280
|
+
writable: true,
|
|
281
|
+
value: new Array(128)
|
|
282
|
+
});
|
|
283
|
+
Object.defineProperty(this, "currentBufferSource", {
|
|
284
|
+
enumerable: true,
|
|
285
|
+
configurable: true,
|
|
286
|
+
writable: true,
|
|
287
|
+
value: null
|
|
288
|
+
});
|
|
289
|
+
Object.assign(this, audioNodes);
|
|
290
|
+
Object.assign(this, settings);
|
|
291
|
+
this.state = new ControllerState();
|
|
292
|
+
}
|
|
293
|
+
resetSettings(settings) {
|
|
294
|
+
Object.assign(this, settings);
|
|
295
|
+
}
|
|
296
|
+
resetTable(channel) {
|
|
297
|
+
channel.controlTable.set(defaultControlValues);
|
|
298
|
+
channel.scaleOctaveTuningTable.fill(0); // [-100, 100] cent
|
|
299
|
+
channel.channelPressureTable.set(defaultPressureValues);
|
|
300
|
+
channel.polyphonicKeyPressureTable.set(defaultPressureValues);
|
|
301
|
+
channel.keyBasedTable.fill(-1);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
137
304
|
const drumExclusiveClassesByKit = new Array(57);
|
|
138
305
|
const drumExclusiveClassCount = 10;
|
|
139
306
|
const standardSet = new Uint8Array(128);
|
|
@@ -697,34 +864,9 @@ export class Midy extends EventTarget {
|
|
|
697
864
|
merger,
|
|
698
865
|
};
|
|
699
866
|
}
|
|
700
|
-
resetChannelTable(channel) {
|
|
701
|
-
channel.controlTable.set(defaultControlValues);
|
|
702
|
-
channel.scaleOctaveTuningTable.fill(0); // [-100, 100] cent
|
|
703
|
-
channel.channelPressureTable.set(defaultPressureValues);
|
|
704
|
-
channel.polyphonicKeyPressureTable.set(defaultPressureValues);
|
|
705
|
-
channel.keyBasedTable.fill(-1);
|
|
706
|
-
}
|
|
707
867
|
createChannels(audioContext) {
|
|
708
|
-
const
|
|
709
|
-
|
|
710
|
-
currentBufferSource: null,
|
|
711
|
-
isDrum: false,
|
|
712
|
-
state: new ControllerState(),
|
|
713
|
-
...this.constructor.channelSettings,
|
|
714
|
-
...this.createChannelAudioNodes(audioContext),
|
|
715
|
-
scheduledNotes: [],
|
|
716
|
-
sustainNotes: [],
|
|
717
|
-
sostenutoNotes: [],
|
|
718
|
-
controlTable: new Int8Array(defaultControlValues),
|
|
719
|
-
scaleOctaveTuningTable: new Float32Array(12), // [-100, 100] cent
|
|
720
|
-
channelPressureTable: new Int8Array(defaultPressureValues),
|
|
721
|
-
polyphonicKeyPressureTable: new Int8Array(defaultPressureValues),
|
|
722
|
-
keyBasedTable: new Int8Array(128 * 128).fill(-1),
|
|
723
|
-
keyBasedGainLs: new Array(128),
|
|
724
|
-
keyBasedGainRs: new Array(128),
|
|
725
|
-
};
|
|
726
|
-
});
|
|
727
|
-
return channels;
|
|
868
|
+
const settings = this.constructor.channelSettings;
|
|
869
|
+
return Array.from({ length: this.numChannels }, () => new Channel(this.createChannelAudioNodes(audioContext), settings));
|
|
728
870
|
}
|
|
729
871
|
decodeOggVorbis(sample) {
|
|
730
872
|
const task = decoderQueue.then(async () => {
|
|
@@ -1783,16 +1925,15 @@ export class Midy extends EventTarget {
|
|
|
1783
1925
|
}
|
|
1784
1926
|
async noteOn(channelNumber, noteNumber, velocity, startTime) {
|
|
1785
1927
|
if (this.mpeEnabled) {
|
|
1786
|
-
const
|
|
1928
|
+
const channel = this.channels[channelNumber];
|
|
1929
|
+
const noteIndex = channel.scheduledNotes.length;
|
|
1787
1930
|
if (!this.mpeState.channelToNotes.has(channelNumber)) {
|
|
1788
1931
|
this.mpeState.channelToNotes.set(channelNumber, new Set());
|
|
1789
1932
|
}
|
|
1790
|
-
this.mpeState.channelToNotes.get(channelNumber).add(
|
|
1791
|
-
this.mpeState.noteToChannel.set(
|
|
1792
|
-
}
|
|
1793
|
-
else {
|
|
1794
|
-
await this.startNote(channelNumber, noteNumber, velocity, startTime);
|
|
1933
|
+
this.mpeState.channelToNotes.get(channelNumber).add(noteIndex);
|
|
1934
|
+
this.mpeState.noteToChannel.set(noteIndex, channelNumber);
|
|
1795
1935
|
}
|
|
1936
|
+
await this.startNote(channelNumber, noteNumber, velocity, startTime);
|
|
1796
1937
|
}
|
|
1797
1938
|
async startNote(channelNumber, noteNumber, velocity, startTime) {
|
|
1798
1939
|
const channel = this.channels[channelNumber];
|
|
@@ -2024,7 +2165,7 @@ export class Midy extends EventTarget {
|
|
|
2024
2165
|
this.processActiveNotes(channel, scheduleTime, (note) => {
|
|
2025
2166
|
if (note.noteNumber === noteNumber) {
|
|
2026
2167
|
note.pressure = pressure;
|
|
2027
|
-
this.
|
|
2168
|
+
this.setPolyphonicKeyPressureEffects(channel, note, scheduleTime);
|
|
2028
2169
|
}
|
|
2029
2170
|
});
|
|
2030
2171
|
this.applyVoiceParams(channel, 10, scheduleTime);
|
|
@@ -2065,7 +2206,7 @@ export class Midy extends EventTarget {
|
|
|
2065
2206
|
const next = this.calcChannelPressureEffectValue(channel, 0);
|
|
2066
2207
|
channel.detune += next - prev;
|
|
2067
2208
|
this.processActiveNotes(channel, scheduleTime, (note) => {
|
|
2068
|
-
this.
|
|
2209
|
+
this.setChannelPressureEffects(channel, note, scheduleTime);
|
|
2069
2210
|
});
|
|
2070
2211
|
this.applyVoiceParams(channel, 13, scheduleTime);
|
|
2071
2212
|
}
|
|
@@ -2465,6 +2606,9 @@ export class Midy extends EventTarget {
|
|
|
2465
2606
|
const intPart = Math.trunc(value);
|
|
2466
2607
|
state.volumeMSB = intPart / 127;
|
|
2467
2608
|
state.volumeLSB = value - intPart;
|
|
2609
|
+
this.applyVolume(channel, scheduleTime);
|
|
2610
|
+
}
|
|
2611
|
+
applyVolume(channel, scheduleTime) {
|
|
2468
2612
|
if (channel.isDrum) {
|
|
2469
2613
|
for (let i = 0; i < 128; i++) {
|
|
2470
2614
|
this.updateKeyBasedVolume(channel, i, scheduleTime);
|
|
@@ -2963,10 +3107,8 @@ export class Midy extends EventTarget {
|
|
|
2963
3107
|
state[key] = defaultValue;
|
|
2964
3108
|
}
|
|
2965
3109
|
}
|
|
2966
|
-
|
|
2967
|
-
|
|
2968
|
-
}
|
|
2969
|
-
this.resetChannelTable(channel);
|
|
3110
|
+
channel.resetSettings(this.constructor.channelSettings);
|
|
3111
|
+
this.resetTable(channel);
|
|
2970
3112
|
this.mode = "GM2";
|
|
2971
3113
|
this.masterFineTuning = 0; // cent
|
|
2972
3114
|
this.masterCoarseTuning = 0; // cent
|
|
@@ -3129,9 +3271,9 @@ export class Midy extends EventTarget {
|
|
|
3129
3271
|
case 9:
|
|
3130
3272
|
switch (data[3]) {
|
|
3131
3273
|
case 1: // https://amei.or.jp/midistandardcommittee/Recommended_Practice/e/ca22.pdf
|
|
3132
|
-
return this.
|
|
3274
|
+
return this.handleChannelPressureSysEx(data, scheduelTime);
|
|
3133
3275
|
case 2: // https://amei.or.jp/midistandardcommittee/Recommended_Practice/e/ca22.pdf
|
|
3134
|
-
return this.
|
|
3276
|
+
return this.handlePolyphonicKeyPressureSysEx(data, scheduleTime);
|
|
3135
3277
|
case 3: // https://amei.or.jp/midistandardcommittee/Recommended_Practice/e/ca22.pdf
|
|
3136
3278
|
return this.handleControlChangeSysEx(data, scheduleTime);
|
|
3137
3279
|
default:
|
|
@@ -3510,7 +3652,7 @@ export class Midy extends EventTarget {
|
|
|
3510
3652
|
}
|
|
3511
3653
|
createEffectHandlers() {
|
|
3512
3654
|
const handlers = new Array(6);
|
|
3513
|
-
handlers[0] = (channel, note, scheduleTime) => {
|
|
3655
|
+
handlers[0] = (channel, note, _tableName, scheduleTime) => {
|
|
3514
3656
|
if (this.isPortamento(channel, note)) {
|
|
3515
3657
|
this.setPortamentoDetune(channel, note, scheduleTime);
|
|
3516
3658
|
}
|
|
@@ -3518,7 +3660,7 @@ export class Midy extends EventTarget {
|
|
|
3518
3660
|
this.setDetune(channel, note, scheduleTime);
|
|
3519
3661
|
}
|
|
3520
3662
|
};
|
|
3521
|
-
handlers[1] = (channel, note, scheduleTime) => {
|
|
3663
|
+
handlers[1] = (channel, note, _tableName, scheduleTime) => {
|
|
3522
3664
|
if (0.5 <= channel.state.portamento && 0 <= note.portamentoNoteNumber) {
|
|
3523
3665
|
this.setPortamentoFilterEnvelope(channel, note, scheduleTime);
|
|
3524
3666
|
}
|
|
@@ -3526,10 +3668,17 @@ export class Midy extends EventTarget {
|
|
|
3526
3668
|
this.setFilterEnvelope(channel, note, scheduleTime);
|
|
3527
3669
|
}
|
|
3528
3670
|
};
|
|
3529
|
-
handlers[2] = (channel, note, scheduleTime) =>
|
|
3530
|
-
|
|
3531
|
-
|
|
3532
|
-
|
|
3671
|
+
handlers[2] = (channel, note, tableName, scheduleTime) => {
|
|
3672
|
+
if (tableName === "polyphonicKeyPressureTable") {
|
|
3673
|
+
this.setVolumeNode(channel, note, scheduleTime);
|
|
3674
|
+
}
|
|
3675
|
+
else {
|
|
3676
|
+
this.applyVolume(channel, scheduleTime);
|
|
3677
|
+
}
|
|
3678
|
+
};
|
|
3679
|
+
handlers[3] = (channel, note, _tableName, scheduleTime) => this.setModLfoToPitch(channel, note, scheduleTime);
|
|
3680
|
+
handlers[4] = (channel, note, _tableName, scheduleTime) => this.setModLfoToFilterFc(channel, note, scheduleTime);
|
|
3681
|
+
handlers[5] = (channel, note, _tableName, scheduleTime) => this.setModLfoToVolume(channel, note, scheduleTime);
|
|
3533
3682
|
return handlers;
|
|
3534
3683
|
}
|
|
3535
3684
|
setControlChangeEffects(channel, note, scheduleTime) {
|
|
@@ -3539,9 +3688,15 @@ export class Midy extends EventTarget {
|
|
|
3539
3688
|
const tableValue = channel.controlTable[i + 6];
|
|
3540
3689
|
if (baseline === tableValue)
|
|
3541
3690
|
continue;
|
|
3542
|
-
handlers[i](channel, note, scheduleTime);
|
|
3691
|
+
handlers[i](channel, note, "controlTable", scheduleTime);
|
|
3543
3692
|
}
|
|
3544
3693
|
}
|
|
3694
|
+
setChannelPressureEffects(channel, note, scheduleTime) {
|
|
3695
|
+
this.setPressureEffects(channel, note, "channelPressureTable", scheduleTime);
|
|
3696
|
+
}
|
|
3697
|
+
setPolyphonicKeyPressureEffects(channel, note, scheduleTime) {
|
|
3698
|
+
this.setPressureEffects(channel, note, "polyphonicKeyPressureTable", scheduleTime);
|
|
3699
|
+
}
|
|
3545
3700
|
setPressureEffects(channel, note, tableName, scheduleTime) {
|
|
3546
3701
|
const handlers = this.effectHandlers;
|
|
3547
3702
|
const table = channel[tableName];
|
|
@@ -3550,9 +3705,15 @@ export class Midy extends EventTarget {
|
|
|
3550
3705
|
const tableValue = table[i];
|
|
3551
3706
|
if (baseline === tableValue)
|
|
3552
3707
|
continue;
|
|
3553
|
-
handlers[i](channel, note, scheduleTime);
|
|
3708
|
+
handlers[i](channel, note, tableName, scheduleTime);
|
|
3554
3709
|
}
|
|
3555
3710
|
}
|
|
3711
|
+
handleChannelPressureSysEx(data, scheduleTime) {
|
|
3712
|
+
this.handlePressureSysEx(data, "channelPressureTable", scheduleTime);
|
|
3713
|
+
}
|
|
3714
|
+
handlePolyphonicKeyPressureSysEx(data, scheduleTime) {
|
|
3715
|
+
this.handlePressureSysEx(data, "polyphonicKeyPressureTable", scheduleTime);
|
|
3716
|
+
}
|
|
3556
3717
|
handlePressureSysEx(data, tableName, scheduleTime) {
|
|
3557
3718
|
const channelNumber = data[4];
|
|
3558
3719
|
const channel = this.channels[channelNumber];
|
|
@@ -3566,7 +3727,7 @@ export class Midy extends EventTarget {
|
|
|
3566
3727
|
const handler = this.effectHandlers[pp];
|
|
3567
3728
|
this.processActiveNotes(channel, scheduleTime, (note) => {
|
|
3568
3729
|
if (handler)
|
|
3569
|
-
handler(channel, note, scheduleTime);
|
|
3730
|
+
handler(channel, note, tableName, scheduleTime);
|
|
3570
3731
|
});
|
|
3571
3732
|
}
|
|
3572
3733
|
}
|
|
@@ -3586,7 +3747,7 @@ export class Midy extends EventTarget {
|
|
|
3586
3747
|
const handler = this.effectHandlers[pp];
|
|
3587
3748
|
this.processActiveNotes(channel, scheduleTime, (note) => {
|
|
3588
3749
|
if (handler)
|
|
3589
|
-
handler(channel, note, scheduleTime);
|
|
3750
|
+
handler(channel, note, "controlTable", scheduleTime);
|
|
3590
3751
|
});
|
|
3591
3752
|
}
|
|
3592
3753
|
}
|
package/package.json
CHANGED
package/script/midy-GM1.d.ts
CHANGED
|
@@ -61,7 +61,7 @@ export class MidyGM1 extends EventTarget {
|
|
|
61
61
|
detune: (channel: any, note: any, scheduleTime: any) => void;
|
|
62
62
|
};
|
|
63
63
|
controlChangeHandlers: any[];
|
|
64
|
-
channels:
|
|
64
|
+
channels: Channel[];
|
|
65
65
|
addSoundFont(soundFont: any): void;
|
|
66
66
|
toUint8Array(input: any): Promise<Uint8Array<ArrayBuffer>>;
|
|
67
67
|
loadSoundFont(input: any): Promise<void>;
|
|
@@ -73,7 +73,7 @@ export class MidyGM1 extends EventTarget {
|
|
|
73
73
|
gainR: any;
|
|
74
74
|
merger: any;
|
|
75
75
|
};
|
|
76
|
-
createChannels(audioContext: any):
|
|
76
|
+
createChannels(audioContext: any): Channel[];
|
|
77
77
|
decodeOggVorbis(sample: any): Promise<any>;
|
|
78
78
|
createAudioBuffer(voiceParams: any): Promise<any>;
|
|
79
79
|
createBufferSource(voiceParams: any, audioBuffer: any): any;
|
|
@@ -189,4 +189,27 @@ export class MidyGM1 extends EventTarget {
|
|
|
189
189
|
handleSysEx(data: any, scheduleTime: any): void;
|
|
190
190
|
scheduleTask(callback: any, scheduleTime: any): Promise<any>;
|
|
191
191
|
}
|
|
192
|
+
declare class Channel {
|
|
193
|
+
constructor(audioNodes: any, settings: any);
|
|
194
|
+
isDrum: boolean;
|
|
195
|
+
programNumber: number;
|
|
196
|
+
scheduleIndex: number;
|
|
197
|
+
detune: number;
|
|
198
|
+
dataMSB: number;
|
|
199
|
+
dataLSB: number;
|
|
200
|
+
rpnMSB: number;
|
|
201
|
+
rpnLSB: number;
|
|
202
|
+
modulationDepthRange: number;
|
|
203
|
+
fineTuning: number;
|
|
204
|
+
coarseTuning: number;
|
|
205
|
+
scheduledNotes: any[];
|
|
206
|
+
sustainNotes: any[];
|
|
207
|
+
currentBufferSource: null;
|
|
208
|
+
state: ControllerState;
|
|
209
|
+
resetSettings(settings: any): void;
|
|
210
|
+
}
|
|
211
|
+
declare class ControllerState {
|
|
212
|
+
array: Float32Array<ArrayBuffer>;
|
|
213
|
+
}
|
|
214
|
+
export {};
|
|
192
215
|
//# sourceMappingURL=midy-GM1.d.ts.map
|
package/script/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":"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"}
|