@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 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.handleMIDIMessage(statusByte, data1, data2, scheduleTime);
80
+ midy.handleMessage(data, scheduleTime);
60
81
  midy.noteOn(channelNumber, noteNumber, velocity);
61
- midy.setProgramChange(channelNumber, program);
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 [bankNumber, programNumber] = instrument.split(":").map(Number);
105
- const table = midy.soundFontTable[programNumber];
106
- if (table.has(bankNumber)) continue;
107
- const program = programNumber.toString().padStart(3, "0");
108
- const path = bankNumber === 128
109
- ? `${soundFontURL}/128.sf3`
110
- : `${soundFontURL}/${program}.sf3`;
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 = this.getSoundFontPaths();
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: any[];
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(t: any, resumeTime: any, queueIndex: any): Promise<any>;
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
- createNote(channel: any, voice: any, noteNumber: any, velocity: any, startTime: any): Promise<Note>;
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
- scheduleNoteOn(channelNumber: any, noteNumber: any, velocity: any, startTime: any): Promise<void>;
110
- noteOn(channelNumber: any, noteNumber: any, velocity: any, scheduleTime: any): Promise<void>;
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
- scheduleNoteOff(channelNumber: any, noteNumber: any, _velocity: any, endTime: any, force: any): void;
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
- handleMIDIMessage(statusByte: any, data1: any, data2: any, scheduleTime: any): void | Promise<void>;
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(volume: any, scheduleTime: any): void;
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
@@ -1 +1 @@
1
- {"version":3,"file":"midy-GM1.d.ts","sourceRoot":"","sources":["../src/midy-GM1.js"],"names":[],"mappings":"AA4FA;IAyBE;;;;;;;;;;;MAWE;IAEF,+BAcC;IAnDD,aAAa;IACb,oBAAiB;IACjB,qBAAmB;IACnB,kBAAc;IACd,0BAAwB;IACxB,kBAAc;IACd,mBAAiB;IACjB,kBAAc;IACd,mBAAe;IACf,kBAAgB;IAChB,sBAA2C;IAC3C,4BAAyB;IACzB,0BAAuB;IACvB,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;;;;;;;;;;;MAA2D;IAC3D,6BAA+D;IAC/D,gBAAiD;IAMnD,4BAMC;IAED,mCASC;IAED,2DAYC;IAED,yCAmBC;IAED,oCASC;IAED,sBAoCC;IAED,8DAcC;IAED;;;;MAeC;IAED,yCAaC;IAED,kDAUC;IAED,4DASC;IAED,+EAkDC;IAED,mCAOC;IAED,uBAQC;IAED,yDA2BC;IAED,2BA+CC;IAED,uDAEC;IAED,wDAEC;IAED;;;MAgEC;IAED,kGAeC;IAED,mGAeC;IAED,wEAMC;IAED,uBAMC;IAED,sBAKC;IAED,uBAQC;IAED,wBAKC;IAED,0BAKC;IAED,wBAOC;IAED,sBAGC;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,6FAyBC;IAED,oGAuCC;IAED,0EAiBC;IAED,kGAmCC;IAED,6FASC;IAED,gCASC;IAED,iEAoBC;IAED,qGAeC;IAED,6CAUC;IAED,qDAUC;IAED,qFASC;IAED,sFAeC;IAED,oGA2BC;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,qCAWC;IAED,4EAaC;IAED,4DAGC;IAED,sDASC;IAED,gDAYC;IAGD,6DAgBC;CACF;AAhiDD;IAWE,0FAMC;IAhBD,cAAW;IACX,gBAAe;IACf,kBAAa;IACb,gBAAW;IACX,iBAAY;IACZ,wBAAmB;IACnB,iBAAY;IACZ,mBAAc;IACd,qBAAgB;IAGd,gBAA4B;IAC5B,cAAwB;IACxB,eAA0B;IAC1B,WAAkB;IAClB,iBAA8B;CAEjC"}
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"}