@sudobility/music_codecs 0.1.1

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.
Files changed (81) hide show
  1. package/dist/index.d.ts +43 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +46 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/midi/analyze.d.ts +53 -0
  6. package/dist/midi/analyze.d.ts.map +1 -0
  7. package/dist/midi/analyze.js +58 -0
  8. package/dist/midi/analyze.js.map +1 -0
  9. package/dist/midi/export.d.ts +20 -0
  10. package/dist/midi/export.d.ts.map +1 -0
  11. package/dist/midi/export.js +135 -0
  12. package/dist/midi/export.js.map +1 -0
  13. package/dist/midi/grid-detection.d.ts +41 -0
  14. package/dist/midi/grid-detection.d.ts.map +1 -0
  15. package/dist/midi/grid-detection.js +61 -0
  16. package/dist/midi/grid-detection.js.map +1 -0
  17. package/dist/midi/import-options.d.ts +45 -0
  18. package/dist/midi/import-options.d.ts.map +1 -0
  19. package/dist/midi/import-options.js +38 -0
  20. package/dist/midi/import-options.js.map +1 -0
  21. package/dist/midi/import.d.ts +43 -0
  22. package/dist/midi/import.d.ts.map +1 -0
  23. package/dist/midi/import.js +441 -0
  24. package/dist/midi/import.js.map +1 -0
  25. package/dist/midi/key-detection.d.ts +11 -0
  26. package/dist/midi/key-detection.d.ts.map +1 -0
  27. package/dist/midi/key-detection.js +96 -0
  28. package/dist/midi/key-detection.js.map +1 -0
  29. package/dist/midi/measures.d.ts +39 -0
  30. package/dist/midi/measures.d.ts.map +1 -0
  31. package/dist/midi/measures.js +141 -0
  32. package/dist/midi/measures.js.map +1 -0
  33. package/dist/mod/export.d.ts +54 -0
  34. package/dist/mod/export.d.ts.map +1 -0
  35. package/dist/mod/export.js +172 -0
  36. package/dist/mod/export.js.map +1 -0
  37. package/dist/mod/fill.d.ts +11 -0
  38. package/dist/mod/fill.d.ts.map +1 -0
  39. package/dist/mod/fill.js +50 -0
  40. package/dist/mod/fill.js.map +1 -0
  41. package/dist/mod/import.d.ts +14 -0
  42. package/dist/mod/import.d.ts.map +1 -0
  43. package/dist/mod/import.js +182 -0
  44. package/dist/mod/import.js.map +1 -0
  45. package/dist/mod/limits.d.ts +26 -0
  46. package/dist/mod/limits.d.ts.map +1 -0
  47. package/dist/mod/limits.js +14 -0
  48. package/dist/mod/limits.js.map +1 -0
  49. package/dist/mod/timing.d.ts +29 -0
  50. package/dist/mod/timing.d.ts.map +1 -0
  51. package/dist/mod/timing.js +61 -0
  52. package/dist/mod/timing.js.map +1 -0
  53. package/dist/mod/types.d.ts +8 -0
  54. package/dist/mod/types.d.ts.map +1 -0
  55. package/dist/mod/types.js +2 -0
  56. package/dist/mod/types.js.map +1 -0
  57. package/dist/musicxml/duration-map.d.ts +34 -0
  58. package/dist/musicxml/duration-map.d.ts.map +1 -0
  59. package/dist/musicxml/duration-map.js +79 -0
  60. package/dist/musicxml/duration-map.js.map +1 -0
  61. package/dist/musicxml/export.d.ts +35 -0
  62. package/dist/musicxml/export.d.ts.map +1 -0
  63. package/dist/musicxml/export.js +271 -0
  64. package/dist/musicxml/export.js.map +1 -0
  65. package/dist/musicxml/import.d.ts +52 -0
  66. package/dist/musicxml/import.d.ts.map +1 -0
  67. package/dist/musicxml/import.js +637 -0
  68. package/dist/musicxml/import.js.map +1 -0
  69. package/dist/test/fixtures.d.ts +45 -0
  70. package/dist/test/fixtures.d.ts.map +1 -0
  71. package/dist/test/fixtures.js +420 -0
  72. package/dist/test/fixtures.js.map +1 -0
  73. package/dist/test/musicxml-warnings.d.ts +11 -0
  74. package/dist/test/musicxml-warnings.d.ts.map +1 -0
  75. package/dist/test/musicxml-warnings.js +26 -0
  76. package/dist/test/musicxml-warnings.js.map +1 -0
  77. package/dist/test/platform.d.ts +13 -0
  78. package/dist/test/platform.d.ts.map +1 -0
  79. package/dist/test/platform.js +191 -0
  80. package/dist/test/platform.js.map +1 -0
  81. package/package.json +71 -0
@@ -0,0 +1,191 @@
1
+ /**
2
+ * The platform pieces these tests need, owned here.
3
+ *
4
+ * They used to come from `@sudobility/music_io/mocks`, which made the codecs
5
+ * package depend on the platform package for tests alone — a restricted
6
+ * dependency, in the wrong direction, that dragged in `@tonejs/midi`
7
+ * transitively and failed the moment it was not installed beside it.
8
+ *
9
+ * **This file is test scaffolding and is never shipped.** `@tonejs/midi` is on
10
+ * `__architecture.test.ts`'s forbidden list for the package's own source, and
11
+ * rightly: `music_api` and `music_lib` both consume this package, so it takes
12
+ * its codecs by injection rather than implementing them. A test still needs a
13
+ * real one to round-trip bytes, which is what this provides.
14
+ *
15
+ * XML is `jsdom`, already a dev dependency. `XmlElement` is satisfied
16
+ * *structurally* by a DOM element — five members, chosen so a real parser needs
17
+ * no adapter — so that half is a parse call and an error check.
18
+ */
19
+ import { JSDOM } from 'jsdom';
20
+ import { XmlParseError } from '@sudobility/music_types';
21
+ import * as midiModule from '@tonejs/midi';
22
+ /**
23
+ * `@tonejs/midi` publishes CommonJS as `main` and ESM only via `module`, with
24
+ * no `exports` map — so whether a named import works depends entirely on which
25
+ * build the resolver picked. Bun and Vite pick the ESM build and a named import
26
+ * is fine; Node's ESM loader takes `main` and cannot always detect the named
27
+ * exports of a bundled CommonJS file, which fails at import time with
28
+ * "Named export 'Midi' not found".
29
+ *
30
+ * Reading the constructor off the namespace instead works under every resolver.
31
+ * This is the concrete cost of the one CommonJS dependency in the family.
32
+ */
33
+ const namespace = midiModule;
34
+ const Midi = namespace.Midi ?? namespace.default?.Midi ?? missingMidi();
35
+ function missingMidi() {
36
+ throw new Error('@tonejs/midi did not export Midi under any known module shape.');
37
+ }
38
+ function controlChangesFor(track) {
39
+ return Object.fromEntries(Object.entries(track.controlChanges).map(([number, events]) => [
40
+ Number(number),
41
+ (events ?? []).map((cc) => ({
42
+ number: cc.number,
43
+ ticks: cc.ticks,
44
+ value: cc.value,
45
+ })),
46
+ ]));
47
+ }
48
+ function isTickZeroSetupTrack(track) {
49
+ return (track.notes.length === 0 &&
50
+ track.durationTicks === 0 &&
51
+ Object.values(track.controlChanges).some(events => events.some(event => event.ticks === 0)));
52
+ }
53
+ /**
54
+ * Format-0 files sometimes decode through `@tonejs/midi` as alternating
55
+ * control-only setup tracks and note tracks. The setup track has the CC7/CC10
56
+ * values from the original channel, while the following note track has the
57
+ * program/channel but no controllers. Copy those tick-0 controllers forward so
58
+ * import/playback keeps the source mix.
59
+ */
60
+ function withFormatZeroSetupControls(tracks) {
61
+ return tracks.map((track, index) => {
62
+ if (track.notes.length === 0)
63
+ return track;
64
+ const previous = tracks[index - 1];
65
+ if (!previous || !isTickZeroSetupTrack(previous))
66
+ return track;
67
+ const controlChanges = { ...track.controlChanges };
68
+ let changed = false;
69
+ for (const [number, events] of Object.entries(previous.controlChanges)) {
70
+ const ccNumber = Number(number);
71
+ if (controlChanges[ccNumber]?.length)
72
+ continue;
73
+ controlChanges[ccNumber] = events;
74
+ changed = true;
75
+ }
76
+ return changed ? { ...track, controlChanges } : track;
77
+ });
78
+ }
79
+ /** The same encoding the platform packages ship, so round trips are real. */
80
+ class ToneJsMidiCodec {
81
+ decode(data) {
82
+ const midi = new Midi(data);
83
+ const tracks = midi.tracks.map((track) => ({
84
+ name: track.name,
85
+ channel: track.channel,
86
+ instrument: {
87
+ number: track.instrument.number,
88
+ name: track.instrument.name,
89
+ },
90
+ notes: track.notes.map(note => ({
91
+ midi: note.midi,
92
+ ticks: note.ticks,
93
+ durationTicks: note.durationTicks,
94
+ velocity: note.velocity,
95
+ })),
96
+ // Kept keyed by CC number: the importer looks up sustain (64),
97
+ // volume (7) and pan (10) directly, and flattening them here would
98
+ // lose volume and pan silently.
99
+ controlChanges: controlChangesFor(track),
100
+ durationTicks: track.durationTicks,
101
+ durationSeconds: track.duration,
102
+ }));
103
+ return {
104
+ header: {
105
+ ppq: midi.header.ppq,
106
+ name: midi.header.name,
107
+ tempos: midi.header.tempos.map(tempo => ({
108
+ ticks: tempo.ticks,
109
+ bpm: tempo.bpm,
110
+ })),
111
+ timeSignatures: midi.header.timeSignatures.map(signature => ({
112
+ ticks: signature.ticks,
113
+ timeSignature: [
114
+ signature.timeSignature[0],
115
+ signature.timeSignature[1],
116
+ ],
117
+ })),
118
+ },
119
+ tracks: withFormatZeroSetupControls(tracks),
120
+ duration: midi.duration,
121
+ };
122
+ }
123
+ encode(file) {
124
+ const midi = new Midi();
125
+ midi.header.fromJSON({
126
+ name: file.header.name ?? '',
127
+ ppq: file.header.ppq,
128
+ meta: [],
129
+ tempos: file.header.tempos.map(tempo => ({
130
+ ticks: tempo.ticks,
131
+ bpm: tempo.bpm,
132
+ })),
133
+ timeSignatures: file.header.timeSignatures.map(signature => ({
134
+ ticks: signature.ticks,
135
+ timeSignature: signature.timeSignature,
136
+ })),
137
+ keySignatures: [],
138
+ });
139
+ for (const track of file.tracks) {
140
+ const midiTrack = midi.addTrack();
141
+ midiTrack.name = track.name;
142
+ midiTrack.channel = track.channel;
143
+ midiTrack.instrument.number = track.instrument.number;
144
+ for (const events of Object.values(track.controlChanges)) {
145
+ for (const cc of events) {
146
+ midiTrack.addCC({
147
+ number: cc.number,
148
+ ticks: cc.ticks,
149
+ value: cc.value,
150
+ });
151
+ }
152
+ }
153
+ for (const note of track.notes) {
154
+ midiTrack.addNote({
155
+ midi: note.midi,
156
+ ticks: note.ticks,
157
+ durationTicks: note.durationTicks,
158
+ velocity: note.velocity,
159
+ });
160
+ }
161
+ }
162
+ return midi.toArray();
163
+ }
164
+ }
165
+ /** The real MIDI codec. Encoding is pure byte manipulation, so nothing is faked. */
166
+ export function testMidiCodec() {
167
+ return new ToneJsMidiCodec();
168
+ }
169
+ /**
170
+ * A real XML parser, via jsdom.
171
+ *
172
+ * `DOMParser` reports malformed input by returning a document rooted at
173
+ * `<parsererror>` rather than by throwing, so that is checked explicitly —
174
+ * otherwise a broken document reads as a successful parse of a strange element.
175
+ */
176
+ export function testXmlParser() {
177
+ return {
178
+ parse(text) {
179
+ const { window } = new JSDOM('');
180
+ const doc = new window.DOMParser().parseFromString(text, 'application/xml');
181
+ const root = doc.documentElement;
182
+ if (!root ||
183
+ root.tagName === 'parsererror' ||
184
+ root.getElementsByTagName('parsererror').length > 0) {
185
+ throw new XmlParseError('Malformed XML');
186
+ }
187
+ return root;
188
+ },
189
+ };
190
+ }
191
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/test/platform.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,71 @@
1
+ {
2
+ "name": "@sudobility/music_codecs",
3
+ "version": "0.1.1",
4
+ "description": "Score encoders and decoders for ScoreSmith - MIDI, MusicXML and tracker modules. Shared by frontend and backend; no UI, no audio, no platform.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js",
12
+ "default": "./dist/index.js"
13
+ }
14
+ },
15
+ "scripts": {
16
+ "build": "tsc -p tsconfig.esm.json",
17
+ "clean": "rimraf dist",
18
+ "test": "vitest run",
19
+ "test:watch": "vitest",
20
+ "lint": "eslint src",
21
+ "format": "prettier --write src/**/*.ts",
22
+ "format:check": "prettier --check src/**/*.ts",
23
+ "typecheck": "tsc --noEmit",
24
+ "verify": "bun run format:check && bun run typecheck && bun run lint && bun run test && bun run build",
25
+ "prepublishOnly": "bun run clean && bun run verify"
26
+ },
27
+ "files": [
28
+ "dist/**/*",
29
+ "CLAUDE.md"
30
+ ],
31
+ "keywords": [
32
+ "typescript",
33
+ "music",
34
+ "midi",
35
+ "musicxml",
36
+ "tracker",
37
+ "scoresmith",
38
+ "codec"
39
+ ],
40
+ "author": "Sudobility",
41
+ "license": "BUSL-1.1",
42
+ "peerDependencies": {
43
+ "@sudobility/music_types": "^0.11.22"
44
+ },
45
+ "devDependencies": {
46
+ "@eslint/js": "^9.38.0",
47
+ "@sudobility/music_types": "^0.11.22",
48
+ "@sudobility/types": "^1.9.65",
49
+ "@tonejs/midi": "^2.0.28",
50
+ "@types/jsdom": "^30.0.0",
51
+ "@typescript-eslint/eslint-plugin": "^8.46.2",
52
+ "@typescript-eslint/parser": "^8.46.2",
53
+ "eslint": "^9.38.0",
54
+ "eslint-config-prettier": "^10.1.8",
55
+ "eslint-plugin-prettier": "^5.5.4",
56
+ "globals": "^16.4.0",
57
+ "jsdom": "^25.0.0",
58
+ "prettier": "^3.6.2",
59
+ "rimraf": "^6.0.1",
60
+ "typescript": "^5.9.3",
61
+ "vitest": "^4.0.15"
62
+ },
63
+ "publishConfig": {
64
+ "access": "public"
65
+ },
66
+ "repository": {
67
+ "type": "git",
68
+ "url": "https://github.com/johnqh/music_codecs.git"
69
+ },
70
+ "dependencies": {}
71
+ }