Skip to content

Commit db08a4c

Browse files
Some further safeguards.
1 parent 7eb9c50 commit db08a4c

7 files changed

Lines changed: 184 additions & 115 deletions

File tree

src/micc/eventObjects.mjs

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
// 2022-2026 © Lightingale Community
2+
// Licensed under GNU LGPL v3.0 license.
3+
4+
const MICCBaseElement = class MICCBaseElement {
5+
group = "micc.unknown";
6+
constructor(group) {
7+
if (group?.length > 0) {
8+
this.group = group;
9+
};
10+
};
11+
};
12+
13+
// Octavia natives
14+
15+
const NakedMIDIEvent = class NakedMIDIEvent extends MICCBaseElement {
16+
delta = 0;
17+
type = 0;
18+
ch = 256;
19+
meta;
20+
data;
21+
isStale = false;
22+
offset;
23+
parsed;
24+
time;
25+
port = 255;
26+
track = 65535;
27+
label;
28+
constructor(type, delta) {
29+
super("mma.midiEvent");
30+
if (typeof type === "number") {
31+
this.type = type;
32+
};
33+
if (typeof delta === "number") {
34+
this.delta = delta;
35+
};
36+
};
37+
};
38+
const WrappedMIDIEvent = class WrappedMIDIEvent {
39+
event;
40+
type;
41+
chunk;
42+
};
43+
44+
// Colxi compatibles
45+
46+
const ColxiMIDIEvent = class ColxiMIDIEvent extends MICCBaseElement {
47+
deltaTime = 0;
48+
type = 255;
49+
channel;
50+
metaType;
51+
data;
52+
constructor(type, deltaTime) {
53+
super("colxi.midiEvent");
54+
if (typeof type === "number") {
55+
this.type = type;
56+
};
57+
if (typeof deltaTime === "number") {
58+
this.deltaTime = deltaTime;
59+
};
60+
};
61+
};
62+
63+
export {
64+
MICCBaseElement,
65+
NakedMIDIEvent,
66+
ColxiMIDIEvent
67+
};

src/micc/index.d.mts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -97,15 +97,15 @@ export class NakedMIDIEvent extends MICCBaseElement {
9797
*/
9898
delta: number;
9999
/**
100-
* MIDI event type. Type `8` to `15` (or `240`), and `241` to `255` are all available.
100+
* MIDI event type. Type `8` to `15` (or `240`), and `241` to `255` are all available. `0` means "unset".
101101
*/
102102
type: number;
103103
/**
104-
* The desinated channel of the MIDI event. Valid values range from `0` to `255` for events without port defined, or `0` to `15` for events with port defined. Will not appear for `0xf0`-`0xff` events.
104+
* The desinated channel of the MIDI event. Valid values range from `0` to `255` for events without port defined, or `0` to `15` for events with port defined. Will not appear for `0xf0`-`0xff` events. `256` means "unset".
105105
*/
106-
ch?: number;
106+
ch: number;
107107
/**
108-
* The meta event type. Only applicable for `0xff` (meta) events.
108+
* The meta event type. Only applicable to `0xff` (meta) events.
109109
*/
110110
meta?: number;
111111
/**
@@ -154,7 +154,7 @@ export class WrappedMIDIEvent {
154154
*/
155155
chunk: number;
156156
}
157-
/** A pointer to the actual clip tracks. The group specifier is `ltgc.pointer`. */
157+
/** A pointer to the actual clip tracks. The group specifier is `micc.pointer`. */
158158
export class MICCPointer extends MICCBaseElement {
159159
/** Type of the current pointer. Largely follows XGworks. */
160160
type: number;

src/micc/index.mjs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,16 @@
11
// 2022-2026 © Lightingale Community
22
// Licensed under GNU LGPL v3.0 license.
3+
4+
import {
5+
MICCBaseElement,
6+
NakedMIDIEvent
7+
} from "./eventObjects.mjs";
8+
import {
9+
ColxiMIDIParser
10+
} from "./parser.mjs";
11+
12+
export {
13+
MICCBaseElement,
14+
NakedMIDIEvent,
15+
ColxiMIDIParser
16+
};

src/micc/parser.js

Lines changed: 0 additions & 62 deletions
This file was deleted.

src/micc/parser.mjs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
"use strict";
2+
3+
import {
4+
NakedMIDIEvent,
5+
WrappedMIDIEvent,
6+
ColxiMIDIEvent
7+
} from "./objects.mjs";
8+
9+
const smfEventParser = function (buffer, context) {
10+
let nakedEvent = {};
11+
return nakedEvent;
12+
};
13+
const smfEventContextParser = function (chunkInfo) {
14+
let parsedEvent = smfEventParser(chunkInfo.data);
15+
return parsedEvent;
16+
};
17+
18+
// Colxi compatibility
19+
20+
21+
const ColxiMIDITrack = class ColxiMIDITrack {
22+
event;
23+
type;
24+
};
25+
const ColxiMIDIFile = class ColxiMIDIFile {
26+
formatType = 0;
27+
timeDivision = 480;
28+
tracks;
29+
track = [];
30+
};
31+
const ColxiMIDIView = class ColxiMIDIView {};
32+
const ColxiMIDIParser = class ColxiMIDIParser {};
33+
34+
export {
35+
smfEventParser,
36+
smfEventContextParser,
37+
ColxiMIDIEvent,
38+
ColxiMIDITrack,
39+
ColxiMIDIFile,
40+
ColxiMIDIView,
41+
ColxiMIDIParser
42+
};

src/micc/utils.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"use strict";
22

3-
let smfEventRegulator = function (offset, subchunk) {
3+
const smfEventRegulator = function (offset, subchunk) {
44
switch (subchunk.type) {
55
case "MTrk":
66
case "XFIH":

src/state/index.mjs

Lines changed: 55 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -2956,62 +2956,70 @@ let OctaviaDevice = class OctaviaDevice extends CustomEventSource {
29562956
};
29572957
const upThis = this;
29582958
let warningMessage;
2959-
let mappedType = ingressEvent.type;
2960-
if (mappedType === 15) {
2961-
mappedType = 240;
2962-
};
2963-
if (mappedType >= 240) {
2964-
// System messages
2965-
switch (ingressEvent.data.constructor) {
2966-
case Uint8Array:
2967-
case Uint8ClampedArray: {
2968-
break;
2969-
};
2970-
default: {
2971-
if (ingressEvent?.length > 0) {
2972-
ingressEvent.data = Uint8Array.from(ingressEvent.data);
2959+
switch (ingressEvent.group) {
2960+
case "mma.midiEvent": {
2961+
let mappedType = ingressEvent.type;
2962+
if (mappedType === 15) {
2963+
mappedType = 240;
2964+
};
2965+
if (mappedType >= 240) {
2966+
// System messages
2967+
switch (ingressEvent.data.constructor) {
2968+
case Uint8Array:
2969+
case Uint8ClampedArray: {
2970+
break;
2971+
};
2972+
default: {
2973+
if (ingressEvent?.length > 0) {
2974+
ingressEvent.data = Uint8Array.from(ingressEvent.data);
2975+
};
2976+
};
29732977
};
2974-
};
2975-
};
2976-
const eventRunner = upThis.#chEventRun.get(mappedType);
2977-
if (typeof eventRunner === "function") {
2978-
eventRunner.call(upThis, ingressEvent);
2979-
} else {
2980-
warningMessage = `Received an unknown type ${ingressEvent.type} message.`;
2981-
};
2982-
} else if (mappedType >= 15) {
2983-
warningMessage = `Received an unknown type ${ingressEvent.type} message.`;
2984-
} else if (mappedType >= 8) {
2985-
const msgTypeSpec = eventTypes[mappedType]?.length > 0 ? `${eventTypes[mappedType]}${(0b11000 >> (mappedType - 8)) ? ingressEvent.data[0] : ""}` : `unknown type ${mappedType}`;
2986-
if (typeof ingressEvent.ch === "number") {
2987-
// Channel messages
2988-
const mappedCh = (ingressEvent?.port < 16) ? (ingressEvent.port << 4) | ingressEvent.ch : upThis.chRedir(ingressEvent.ch, (ingressEvent.track < 16384) ? ingressEvent.track : 0, false);
2989-
const eventRunner = upThis.#chEventRun.get(mappedType);
2990-
if (typeof eventRunner === "function") {
2991-
let noReceipient = true;
2992-
for (const mappedPart of upThis.#receiveTree[mappedCh] ?? []) {
2993-
noReceipient = false;
2994-
eventRunner.call(upThis, ingressEvent, mappedPart);
2978+
const eventRunner = upThis.#chEventRun.get(mappedType);
2979+
if (typeof eventRunner === "function") {
2980+
eventRunner.call(upThis, ingressEvent);
2981+
} else {
2982+
warningMessage = `Received an unknown type ${ingressEvent.type} message.`;
29952983
};
2996-
if (noReceipient) {
2997-
let msgPortCh = `CH${ingressEvent.ch + 1}`;
2998-
if (ingressEvent.port < 255) {
2999-
msgPortCh += ` on port ${ingressEvent.port + 1}`;
2984+
} else if (mappedType >= 15) {
2985+
warningMessage = `Received an unknown type ${ingressEvent.type} message.`;
2986+
} else if (mappedType >= 8) {
2987+
const msgTypeSpec = eventTypes[mappedType]?.length > 0 ? `${eventTypes[mappedType]}${(0b11000 >> (mappedType - 8)) ? ingressEvent.data[0] : ""}` : `unknown type ${mappedType}`;
2988+
if (typeof ingressEvent.ch === "number") {
2989+
// Channel messages
2990+
const mappedCh = (ingressEvent?.port < 16) ? (ingressEvent.port << 4) | (ingressEvent.ch & 15) : upThis.chRedir(ingressEvent.ch, (ingressEvent.track < 16384) ? ingressEvent.track : 0, false);
2991+
const eventRunner = upThis.#chEventRun.get(mappedType);
2992+
if (typeof eventRunner === "function") {
2993+
let norecipient = true;
2994+
for (const mappedPart of upThis.#receiveTree[mappedCh] ?? []) {
2995+
norecipient = false;
2996+
eventRunner.call(upThis, ingressEvent, mappedPart);
2997+
};
2998+
if (norecipient) {
2999+
let msgPortCh = `CH${ingressEvent.ch + 1}`;
3000+
if (ingressEvent.port < 255) {
3001+
msgPortCh += ` on port ${ingressEvent.port + 1}`;
3002+
};
3003+
msgPortCh += ` (CH${mappedCh})`;
3004+
console.warn(`A ${msgTypeSpec} message sent to ${msgPortCh} had no recipient.`);
3005+
};
3006+
} else {
3007+
warningMessage = `Event type ${ingressEvent.type} does not have a valid runner.`;
30003008
};
3001-
msgPortCh += ` (CH${mappedCh})`;
3002-
console.warn(`A ${msgTypeSpec} message sent to ${msgPortCh} had no receipient.`);
3009+
} else {
3010+
warningMessage = `Received a ${msgTypeSpec} message without a specified channel.`;
30033011
};
30043012
} else {
3005-
warningMessage = `Event type ${ingressEvent.type} does not have a valid runner.`;
3013+
warningMessage = `Received an unknown type ${ingressEvent.type} message.`;
30063014
};
3007-
} else {
3008-
warningMessage = `Received a ${msgTypeSpec} message without a specified channel.`;
3015+
break;
3016+
};
3017+
default: {
3018+
warningMessage = `Unknown message group "${ingressEvent.group}".`;
30093019
};
3010-
} else {
3011-
warningMessage = `Received an unknown type ${ingressEvent.type} message.`;
30123020
};
30133021
if (warningMessage?.length > 0) {
3014-
console.warning(`${warningMessage}`);
3022+
console.warn(warningMessage);
30153023
if (typeof ingressEvent.offset === "number") {
30163024
console.debug(`Binary stream offset at 0x${ingressEvent.offset.toString(16).padStart(6, "0")}.`);
30173025
};

0 commit comments

Comments
 (0)