@marmooo/midy 0.3.7 → 0.4.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 +31 -11
- package/esm/midy-GM1.d.ts +15 -30
- package/esm/midy-GM1.d.ts.map +1 -1
- package/esm/midy-GM1.js +161 -104
- package/esm/midy-GM2.d.ts +19 -36
- package/esm/midy-GM2.d.ts.map +1 -1
- package/esm/midy-GM2.js +245 -205
- package/esm/midy-GMLite.d.ts +14 -30
- package/esm/midy-GMLite.d.ts.map +1 -1
- package/esm/midy-GMLite.js +163 -107
- package/esm/midy.d.ts +19 -37
- package/esm/midy.d.ts.map +1 -1
- package/esm/midy.js +306 -277
- package/package.json +2 -2
- package/script/midy-GM1.d.ts +15 -30
- package/script/midy-GM1.d.ts.map +1 -1
- package/script/midy-GM1.js +161 -104
- package/script/midy-GM2.d.ts +19 -36
- package/script/midy-GM2.d.ts.map +1 -1
- package/script/midy-GM2.js +245 -205
- package/script/midy-GMLite.d.ts +14 -30
- package/script/midy-GMLite.d.ts.map +1 -1
- package/script/midy-GMLite.js +163 -107
- package/script/midy.d.ts +19 -37
- package/script/midy.d.ts.map +1 -1
- package/script/midy.js +306 -277
package/README.md
CHANGED
|
@@ -23,6 +23,26 @@ This library provides several files depending on the implementation level.
|
|
|
23
23
|
- [@marmooo/midi-player](https://marmooo.github.io/midi-player/) - GUI library
|
|
24
24
|
- [Humidy](https://marmooo.github.io/humidy/) - GM2 MIDI mixer app
|
|
25
25
|
|
|
26
|
+
## Support Status
|
|
27
|
+
|
|
28
|
+
All implementations follow the specification.
|
|
29
|
+
|
|
30
|
+
| Message | Support | Notes |
|
|
31
|
+
| :----------------------- | :-----: | :------- |
|
|
32
|
+
| Note Off | ✔️ | |
|
|
33
|
+
| Note On | ✔️ | |
|
|
34
|
+
| Polyphonic Key Pressure | ✔️ | full GM2 |
|
|
35
|
+
| Controller Change | ✔️ | full GM2 |
|
|
36
|
+
| Program Change | ✔️ | full GM2 |
|
|
37
|
+
| Channel Pressure | ✔️ | full GM2 |
|
|
38
|
+
| Pitch Bend | ✔️ | |
|
|
39
|
+
| System Exclusive Message | ✔️ | full GM2 |
|
|
40
|
+
| System Common Message | ❌ | |
|
|
41
|
+
| System Real Time Message | ✔️ | full GM2 |
|
|
42
|
+
| MIDI Time Code | ❌ | |
|
|
43
|
+
| MIDI Show Control | ❌ | |
|
|
44
|
+
| MIDI Machine Control | ❌ | |
|
|
45
|
+
|
|
26
46
|
## Usage
|
|
27
47
|
|
|
28
48
|
### Initialization
|
|
@@ -34,6 +54,7 @@ This library provides several files depending on the implementation level.
|
|
|
34
54
|
import { Midy } from "midy.js";
|
|
35
55
|
|
|
36
56
|
const audioContext = new AudioContext();
|
|
57
|
+
await audioContext.suspend();
|
|
37
58
|
const midy = new Midy(audioContext);
|
|
38
59
|
await midy.loadMIDI("test.mid");
|
|
39
60
|
await midy.loadSoundFont("test.sf3");
|
|
@@ -56,9 +77,9 @@ There are functions that handle MIDI messages as they are, as well as simplified
|
|
|
56
77
|
functions.
|
|
57
78
|
|
|
58
79
|
```js
|
|
59
|
-
midy.
|
|
80
|
+
midy.handleMessage(data, scheduleTime);
|
|
60
81
|
midy.noteOn(channelNumber, noteNumber, velocity);
|
|
61
|
-
midy.setProgramChange(channelNumber,
|
|
82
|
+
midy.setProgramChange(channelNumber, programNumber);
|
|
62
83
|
```
|
|
63
84
|
|
|
64
85
|
### Control Change
|
|
@@ -101,19 +122,18 @@ const soundFontURL = "https://soundfonts.pages.dev/GeneralUser_GS_v1.471";
|
|
|
101
122
|
function getSoundFontPaths() {
|
|
102
123
|
const paths = [];
|
|
103
124
|
for (const instrument of midy.instruments) {
|
|
104
|
-
const [
|
|
105
|
-
const
|
|
106
|
-
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
paths.push(path);
|
|
125
|
+
const [bank, program] = instrument.split(":");
|
|
126
|
+
const bankNumber = Number(bank);
|
|
127
|
+
const programNumber = Number(program);
|
|
128
|
+
const index = midy.soundFontTable[programNumber][bankNumber];
|
|
129
|
+
if (index !== undefined) continue;
|
|
130
|
+
const baseName = bankNumber === 128 ? "128" : program;
|
|
131
|
+
paths.push(`${soundFontURL}/${baseName}.sf3`);
|
|
112
132
|
}
|
|
113
133
|
return paths;
|
|
114
134
|
}
|
|
115
135
|
|
|
116
|
-
const paths =
|
|
136
|
+
const paths = getSoundFontPaths();
|
|
117
137
|
await midy.loadSoundFont(paths);
|
|
118
138
|
```
|
|
119
139
|
|
package/esm/midy-GM1.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export class MidyGM1 {
|
|
2
2
|
static channelSettings: {
|
|
3
|
+
scheduleIndex: number;
|
|
3
4
|
detune: number;
|
|
4
5
|
programNumber: number;
|
|
5
|
-
bank: number;
|
|
6
6
|
dataMSB: number;
|
|
7
7
|
dataLSB: number;
|
|
8
8
|
rpnMSB: number;
|
|
@@ -22,9 +22,10 @@ export class MidyGM1 {
|
|
|
22
22
|
startTime: number;
|
|
23
23
|
resumeTime: number;
|
|
24
24
|
soundFonts: any[];
|
|
25
|
-
soundFontTable:
|
|
25
|
+
soundFontTable: never[][];
|
|
26
26
|
voiceCounter: Map<any, any>;
|
|
27
27
|
voiceCache: Map<any, any>;
|
|
28
|
+
realtimeVoiceCache: Map<any, any>;
|
|
28
29
|
isPlaying: boolean;
|
|
29
30
|
isPausing: boolean;
|
|
30
31
|
isPaused: boolean;
|
|
@@ -39,6 +40,7 @@ export class MidyGM1 {
|
|
|
39
40
|
masterVolume: any;
|
|
40
41
|
scheduler: any;
|
|
41
42
|
schedulerBuffer: any;
|
|
43
|
+
messageHandlers: any[];
|
|
42
44
|
voiceParamsHandlers: {
|
|
43
45
|
modLfoToPitch: (channel: any, note: any, scheduleTime: any) => void;
|
|
44
46
|
vibLfoToPitch: (_channel: any, _note: any, _scheduleTime: any) => void;
|
|
@@ -53,7 +55,6 @@ export class MidyGM1 {
|
|
|
53
55
|
};
|
|
54
56
|
controlChangeHandlers: any[];
|
|
55
57
|
channels: any[];
|
|
56
|
-
initSoundFontTable(): any[];
|
|
57
58
|
addSoundFont(soundFont: any): void;
|
|
58
59
|
toUint8Array(input: any): Promise<Uint8Array<ArrayBuffer>>;
|
|
59
60
|
loadSoundFont(input: any): Promise<void>;
|
|
@@ -68,13 +69,14 @@ export class MidyGM1 {
|
|
|
68
69
|
createChannels(audioContext: any): any[];
|
|
69
70
|
createAudioBuffer(voiceParams: any): Promise<any>;
|
|
70
71
|
createBufferSource(voiceParams: any, audioBuffer: any): any;
|
|
71
|
-
scheduleTimelineEvents(
|
|
72
|
+
scheduleTimelineEvents(scheduleTime: any, queueIndex: any): Promise<any>;
|
|
72
73
|
getQueueIndex(second: any): number;
|
|
73
74
|
resetAllStates(): void;
|
|
74
75
|
updateStates(queueIndex: any, nextQueueIndex: any): void;
|
|
75
76
|
playNotes(): Promise<void>;
|
|
76
77
|
ticksToSecond(ticks: any, secondsPerBeat: any): number;
|
|
77
78
|
secondToTicks(second: any, secondsPerBeat: any): number;
|
|
79
|
+
getSoundFontId(channel: any): string;
|
|
78
80
|
extractMidiData(midi: any): {
|
|
79
81
|
instruments: Set<any>;
|
|
80
82
|
timeline: any[];
|
|
@@ -103,19 +105,20 @@ export class MidyGM1 {
|
|
|
103
105
|
clampCutoffFrequency(frequency: any): number;
|
|
104
106
|
setFilterEnvelope(note: any, scheduleTime: any): void;
|
|
105
107
|
startModulation(channel: any, note: any, scheduleTime: any): void;
|
|
106
|
-
getAudioBuffer(channel: any, noteNumber: any, velocity: any, voiceParams: any): Promise<any>;
|
|
107
|
-
|
|
108
|
+
getAudioBuffer(channel: any, noteNumber: any, velocity: any, voiceParams: any, realtime: any): Promise<any>;
|
|
109
|
+
setNoteAudioNode(channel: any, note: any, realtime: any): Promise<any>;
|
|
108
110
|
handleExclusiveClass(note: any, channelNumber: any, startTime: any): void;
|
|
109
|
-
|
|
110
|
-
noteOn(channelNumber: any, noteNumber: any, velocity: any,
|
|
111
|
+
setNoteRouting(channelNumber: any, note: any, startTime: any): void;
|
|
112
|
+
noteOn(channelNumber: any, noteNumber: any, velocity: any, startTime: any): Promise<void>;
|
|
111
113
|
disconnectNote(note: any): void;
|
|
112
114
|
releaseNote(channel: any, note: any, endTime: any): Promise<any>;
|
|
113
|
-
|
|
115
|
+
noteOff(channelNumber: any, noteNumber: any, velocity: any, endTime: any, force: any): void;
|
|
114
116
|
setNoteIndex(channel: any, index: any): void;
|
|
115
117
|
findNoteOffIndex(channel: any, noteNumber: any): any;
|
|
116
|
-
noteOff(channelNumber: any, noteNumber: any, velocity: any, scheduleTime: any): void;
|
|
117
118
|
releaseSustainPedal(channelNumber: any, halfVelocity: any, scheduleTime: any): void[];
|
|
118
|
-
|
|
119
|
+
createMessageHandlers(): any[];
|
|
120
|
+
handleMessage(data: any, scheduleTime: any): void;
|
|
121
|
+
handleChannelMessage(statusByte: any, data1: any, data2: any, scheduleTime: any): void | Promise<void>;
|
|
119
122
|
setProgramChange(channelNumber: any, programNumber: any, _scheduleTime: any): void;
|
|
120
123
|
handlePitchBendMessage(channelNumber: any, lsb: any, msb: any, scheduleTime: any): void;
|
|
121
124
|
setPitchBend(channelNumber: any, value: any, scheduleTime: any): void;
|
|
@@ -172,26 +175,8 @@ export class MidyGM1 {
|
|
|
172
175
|
GM1SystemOn(scheduleTime: any): void;
|
|
173
176
|
handleUniversalRealTimeExclusiveMessage(data: any, scheduleTime: any): void;
|
|
174
177
|
handleMasterVolumeSysEx(data: any, scheduleTime: any): void;
|
|
175
|
-
setMasterVolume(
|
|
178
|
+
setMasterVolume(value: any, scheduleTime: any): void;
|
|
176
179
|
handleSysEx(data: any, scheduleTime: any): void;
|
|
177
180
|
scheduleTask(callback: any, scheduleTime: any): Promise<any>;
|
|
178
181
|
}
|
|
179
|
-
declare class Note {
|
|
180
|
-
constructor(noteNumber: any, velocity: any, startTime: any, voice: any, voiceParams: any);
|
|
181
|
-
index: number;
|
|
182
|
-
ending: boolean;
|
|
183
|
-
bufferSource: any;
|
|
184
|
-
filterNode: any;
|
|
185
|
-
filterDepth: any;
|
|
186
|
-
volumeEnvelopeNode: any;
|
|
187
|
-
volumeDepth: any;
|
|
188
|
-
modulationLFO: any;
|
|
189
|
-
modulationDepth: any;
|
|
190
|
-
noteNumber: any;
|
|
191
|
-
velocity: any;
|
|
192
|
-
startTime: any;
|
|
193
|
-
voice: any;
|
|
194
|
-
voiceParams: any;
|
|
195
|
-
}
|
|
196
|
-
export {};
|
|
197
182
|
//# 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":"AA6FA;IA0BE;;;;;;;;;;;MAWE;IAEF,+BAeC;IArDD,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,mBAAkB;IAClB,mBAAkB;IAClB,kBAAiB;IACjB,oBAAmB;IACnB,mBAAkB;IAClB,iBAAY;IACZ,gBAAc;IACd,oBAAkB;IAClB,sBAAwB;IACxB,2BAAqC;IAgBnC,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,sBAoCC;IAED,8DAWC;IAED;;;;MAeC;IAED,yCAaC;IAED,kDAUC;IAED,4DASC;IAED,yEAqDC;IAED,mCAOC;IAED,uBASC;IAED,yDA2BC;IAED,2BAwCC;IAED,uDAEC;IAED,wDAEC;IAED,qCAKC;IAED;;;MAwDC;IAED,kGAeC;IAED,mGAeC;IAED,wEAMC;IAED,uBAMC;IAED,sBAKC;IAED,uBAQC;IAED,wBAKC;IAED,0BAKC;IAED,wBAOC;IAED,sBAIC;IAED,yDAQC;IAED,yEASC;IAED,2BAEC;IAED,8BAEC;IAED,8BAEC;IAED,4BAEC;IAED,qCAMC;IAED,2DAIC;IAED,+DAIC;IAED,sDAeC;IAED,qDAoBC;IAED,6CAIC;IAED,sDAsBC;IAED,kEAoBC;IAED,4GAkCC;IAED,uEAmCC;IAED,0EAiBC;IAED,oEASC;IAED,0FAwBC;IAED,gCASC;IAED,iEAqBC;IAED,4FAmBC;IAED,6CAUC;IAED,qDAUC;IAED,sFAeC;IAED,+BAmBC;IAED,kDAOC;IAED,uGA2BC;IAED,mFAGC;IAED,wFAGC;IAED,sEAUC;IAED,mEAWC;IAED,wDAKC;IAED,sDAOC;IAED,mDAMC;IAED,kDAKC;IAED;;;;;;;;;;;MAiCC;IAED,oFAMC;IAED,6EA2BC;IAED,qCAeC;IAED,+FAWC;IAED,wDASC;IAED,iFAKC;IAED,oEAKC;IAED;;;MAMC;IAED,8DAKC;IAED,4EAKC;IAED,sEAGC;IAED,2DAUC;IAED,yEAWC;IAED,kFAeC;IAED,2DAMC;IAED,uDAkBC;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,qCASC;IAED,4EAaC;IAED,4DAGC;IAED,qDAKC;IAED,gDAYC;IAGD,6DAgBC;CACF"}
|