Skip to content

Commit 9415465

Browse files
committed
feat: midi/musicxml support
1 parent 230a294 commit 9415465

File tree

10 files changed

+81
-38
lines changed

10 files changed

+81
-38
lines changed

.vscode/settings.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
2-
"editor.formatOnSave": true,
3-
"editor.codeActionsOnSave": {
4-
"source.fixAll.eslint": true
5-
},
6-
"files.eol": "\n",
7-
}
2+
"editor.formatOnSave": false,
3+
"editor.codeActionsOnSave": {
4+
"source.fixAll.eslint": true
5+
},
6+
"files.eol": "\n"
7+
}

package-lock.json

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
"firebase-functions": "^3.13.1",
3434
"nconf": "^0.11.2",
3535
"ts-custom-error": "^3.2.0",
36-
"webmscore": "^0.19.0",
36+
"webmscore": "^0.21.0",
3737
"winston": "^3.3.3"
3838
},
3939
"devDependencies": {

src/audio.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export default (async (req, res) => {
88
winston.http("AUDIO accessed");
99

1010
let score: webmscore;
11-
try { score = await mscore.mkScore(req.body, req.params.eid, false); }
11+
try { score = await mscore.mkScore(res.locals.type, req.body, req.params.eid, false); }
1212
catch (e) {
1313
return error.handleHTTP(res, e);
1414
}

src/meta.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export default (async (req, res) => {
88
winston.http("META accessed.");
99

1010
let score: webmscore;
11-
try { score = await mscore.mkScore(req.body) }
11+
try { score = await mscore.mkScore(res.locals.type, req.body) }
1212
catch (e) {
1313
return error.handleHTTP(res, e);
1414
}

src/midi.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export default (async (req, res) => {
88
winston.http("MIDI accessed.");
99

1010
let score: webmscore;
11-
try { score = await mscore.mkScore(req.body, req.params.eid); }
11+
try { score = await mscore.mkScore(res.locals.type, req.body, req.params.eid); }
1212
catch (e) {
1313
return error.handleHTTP(res, e);
1414
}

src/mscore.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import LocalError from "./error";
1010
import { getStreamWriter } from "./logger";
1111
import winston from "winston";
1212

13+
type scoreType = "mscz" | "mxl" | "musicxml" | "midi";
14+
1315
const ready = (async function () {
1416
webmscore["stderr"] = getStreamWriter(winston.debug);
1517
webmscore["stdout"] = getStreamWriter(winston.debug);
@@ -24,21 +26,24 @@ const ready = (async function () {
2426
})();
2527

2628
// Init score with boost mode.
27-
async function mkScore(scoreData: Uint8Array, excerpt = "", boost = true): Promise<webmscore> {
29+
async function mkScore(t: scoreType, scoreData: Uint8Array, excerpt = "", boost = true): Promise<webmscore> {
2830
await ready;
2931

32+
winston.debug(`Type: ${t}`);
33+
3034
let score: webmscore;
3135
if (boost) {
3236
try {
33-
score = await webmscore.load("mscz", scoreData, [], false);
37+
score = await webmscore.load(t, scoreData, [], false);
3438
} catch (e) {
35-
console.warn(e);
39+
winston.debug(`(mscore 39): ${e}`);
3640
throw new LocalError(0);
3741
}
3842
} else {
3943
try {
40-
score = await webmscore.load("mscz", scoreData);
44+
score = await webmscore.load(t, scoreData);
4145
} catch (e) {
46+
winston.debug(`(mscore 46): ${e}`);
4247
throw new LocalError(0);
4348
}
4449
}

src/musicxml.ts

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,29 +5,45 @@ import * as mscore from "./mscore";
55
import * as error from "./error";
66

77
export default (async (req, res) => {
8-
winston.http("MUSICXML accessed.");
8+
winston.http("MUSICXML accessed.");
99

10-
let score: webmscore;
11-
try { score = await mscore.mkScore(req.body, req.params.eid, false); }
12-
catch (e) {
13-
return error.handleHTTP(res, e);
14-
}
10+
let score: webmscore;
11+
try {
12+
score = await mscore.mkScore(
13+
res.locals.type,
14+
req.body,
15+
req.params.eid,
16+
false
17+
);
18+
} catch (e) {
19+
return error.handleHTTP(res, e);
20+
}
1521

16-
if (req.params.target === "mmxl") {
17-
const mxml = await (score.saveMxl());
22+
if (req.params.target === "mmxl") {
23+
const mxml = await score.saveMxl();
1824

19-
// Send it off.
20-
res.setHeader("Content-Disposition", `attachement; filename=${await score.titleFilenameSafe()}_${req.params.eid || "FULLSCORE"}.mxl`);
21-
res.contentType("application/vnd.recordare.musicxml");
22-
res.send(Buffer.from(mxml));
23-
} else {
24-
const mxml = await (score.saveXml());
25+
// Send it off.
26+
res.setHeader(
27+
"Content-Disposition",
28+
`attachement; filename=${await score.titleFilenameSafe()}_${
29+
req.params.eid || "FULLSCORE"
30+
}.mxl`
31+
);
32+
res.contentType("application/vnd.recordare.musicxml");
33+
res.send(Buffer.from(mxml));
34+
} else {
35+
const mxml = await score.saveXml();
2536

26-
// Send it off.
27-
res.setHeader("Content-Disposition", `attachement; filename=${await score.titleFilenameSafe()}_${req.params.eid || "FULLSCORE"}.musicxml`);
28-
res.contentType("application/xml");
29-
res.send(mxml);
30-
}
37+
// Send it off.
38+
res.setHeader(
39+
"Content-Disposition",
40+
`attachement; filename=${await score.titleFilenameSafe()}_${
41+
req.params.eid || "FULLSCORE"
42+
}.musicxml`
43+
);
44+
res.contentType("application/xml");
45+
res.send(mxml);
46+
}
3147

32-
score.destroy();
48+
score.destroy();
3349
}) as RequestHandler;

src/server.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,28 @@ app.use(rateLimit({
1616
max: nconf.get("limiter:requests") || 100
1717
}));
1818

19+
// Set source type
20+
app.use((req, res, next) => {
21+
if (!req.headers["content-type"]) {
22+
return res.status(400).end("Content-Type not specified");
23+
}
24+
25+
const ctype = req.headers["content-type"]
26+
if (ctype == "application/x-musescore") {
27+
res.locals.type = "mscz";
28+
} else if (ctype == "audio/midi") {
29+
res.locals.type = "midi";
30+
} else if (ctype == "application/xml") {
31+
res.locals.type = "musicxml";
32+
} else if (ctype == "application/vnd.recordare.musicxml") {
33+
res.locals.type = "mxl";
34+
} else {
35+
return res.status(400).end("Invalid Content-Type");
36+
}
37+
38+
next();
39+
});
40+
1941
// Raw body for MSCZ file.
2042
app.use(bodyParser.raw({
2143
type: "application/x-musescore",

src/sheet.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export default (async (req, res) => {
88
winston.http("SHEET accessed.");
99

1010
let score: webmscore;
11-
try { score = await mscore.mkScore(req.body, req.params.eid, false); }
11+
try { score = await mscore.mkScore(res.locals.type, req.body, req.params.eid, false); }
1212
catch (e) {
1313
return error.handleHTTP(res, e);
1414
}

0 commit comments

Comments
 (0)