@datamoc/mw_games 0.22.0 → 0.23.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.
Files changed (62) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/dist/audio/Midi.d.ts +24 -0
  3. package/dist/audio/Midi.d.ts.map +1 -1
  4. package/dist/audio/Midi.js +21 -0
  5. package/dist/audio/Midi.js.map +1 -1
  6. package/dist/audio/humanize/Groove.d.ts +80 -0
  7. package/dist/audio/humanize/Groove.d.ts.map +1 -0
  8. package/dist/audio/humanize/Groove.js +102 -0
  9. package/dist/audio/humanize/Groove.js.map +1 -0
  10. package/dist/audio/humanize/GrooveConverter.d.ts +49 -0
  11. package/dist/audio/humanize/GrooveConverter.d.ts.map +1 -0
  12. package/dist/audio/humanize/GrooveConverter.js +344 -0
  13. package/dist/audio/humanize/GrooveConverter.js.map +1 -0
  14. package/dist/audio/humanize/GrooveExtractor.d.ts +49 -0
  15. package/dist/audio/humanize/GrooveExtractor.d.ts.map +1 -0
  16. package/dist/audio/humanize/GrooveExtractor.js +179 -0
  17. package/dist/audio/humanize/GrooveExtractor.js.map +1 -0
  18. package/dist/audio/humanize/GrooveHumanizer.d.ts +34 -0
  19. package/dist/audio/humanize/GrooveHumanizer.d.ts.map +1 -0
  20. package/dist/audio/humanize/GrooveHumanizer.js +37 -0
  21. package/dist/audio/humanize/GrooveHumanizer.js.map +1 -0
  22. package/dist/audio/humanize/Humanize.d.ts +54 -0
  23. package/dist/audio/humanize/Humanize.d.ts.map +1 -0
  24. package/dist/audio/humanize/Humanize.js +239 -0
  25. package/dist/audio/humanize/Humanize.js.map +1 -0
  26. package/dist/audio/humanize/HumanizerFactory.d.ts +68 -0
  27. package/dist/audio/humanize/HumanizerFactory.d.ts.map +1 -0
  28. package/dist/audio/humanize/HumanizerFactory.js +84 -0
  29. package/dist/audio/humanize/HumanizerFactory.js.map +1 -0
  30. package/dist/audio/humanize/LiteHumanizer.d.ts +30 -0
  31. package/dist/audio/humanize/LiteHumanizer.d.ts.map +1 -0
  32. package/dist/audio/humanize/LiteHumanizer.js +35 -0
  33. package/dist/audio/humanize/LiteHumanizer.js.map +1 -0
  34. package/dist/audio/humanize/Onsets.d.ts +26 -0
  35. package/dist/audio/humanize/Onsets.d.ts.map +1 -0
  36. package/dist/audio/humanize/Onsets.js +164 -0
  37. package/dist/audio/humanize/Onsets.js.map +1 -0
  38. package/dist/audio/index.d.ts +11 -0
  39. package/dist/audio/index.d.ts.map +1 -1
  40. package/dist/audio/index.js +6 -0
  41. package/dist/audio/index.js.map +1 -1
  42. package/dist/mw_games.global.js +112 -112
  43. package/dist/rpg/MoveRoute.d.ts +35 -4
  44. package/dist/rpg/MoveRoute.d.ts.map +1 -1
  45. package/dist/rpg/MoveRoute.js +40 -11
  46. package/dist/rpg/MoveRoute.js.map +1 -1
  47. package/dist/two-d/render/RpgmAutotile.d.ts +37 -0
  48. package/dist/two-d/render/RpgmAutotile.d.ts.map +1 -1
  49. package/dist/two-d/render/RpgmAutotile.js +67 -1
  50. package/dist/two-d/render/RpgmAutotile.js.map +1 -1
  51. package/dist/two-d/render/TileMap.d.ts +36 -0
  52. package/dist/two-d/render/TileMap.d.ts.map +1 -1
  53. package/dist/two-d/render/TileMap.js +89 -1
  54. package/dist/two-d/render/TileMap.js.map +1 -1
  55. package/dist/two-d/render/index.d.ts +3 -3
  56. package/dist/two-d/render/index.d.ts.map +1 -1
  57. package/dist/two-d/render/index.js +1 -1
  58. package/dist/two-d/render/index.js.map +1 -1
  59. package/dist/version.d.ts +1 -1
  60. package/dist/version.js +1 -1
  61. package/package.json +6 -6
  62. package/sbom.cdx.json +194 -32
package/CHANGELOG.md CHANGED
@@ -7,6 +7,51 @@ the public API may still change between minor versions.
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.23.0] - 2026-09-30
11
+
12
+ MIDI humanization and groove tooling (`audio`), plus RPG Maker map details from the MWGP
13
+ player: shadow layers, A2 table-edge strips and richer move routes.
14
+
15
+ ### Added
16
+
17
+ - `TileMap.addShadowLayer`: RPG Maker's per-cell shadow bits (map layer 4) as translucent
18
+ quarter-tile quads, editable with `setTile` and left alone by `setCellColor`.
19
+ - `AutotileSet.tableEdge` (MV slot 1) and `rpgmTableEdgeCells`: the front-edge strip the engine
20
+ draws under an A2 table (`Tilemap._drawTableEdge`), with the engine's rule for which cells
21
+ get one (a table tile above, none here, no A3/A4 wall on the ground layer).
22
+
23
+ - `MoveRouteStep` covers what RPG Maker routes use beyond the four directions: `{ step: { dx, dy } }`
24
+ (diagonals), `{ dir: 'forward' | 'backward' }` (from the mover's facing), `{ turn: 'around' | 'left90' | 'right90' }`,
25
+ `{ turn: 'toward' | 'away' }`, and a `target: () => { x, y }` on `toward`/`away` steps for a target
26
+ that keeps moving (`RouteTarget`).
27
+ - MIDI humanization: `humanizeMidi` and `HumanizerFactory` run one shared pass that moves note
28
+ events and nothing else (tempo, program, controller and meta events pass through untouched,
29
+ note durations survive, `intensity: 0` reproduces the input exactly, a `seed` reproduces a
30
+ run, and nothing lands before tick 0) under either shipped engine. `LiteHumanizer` shakes
31
+ timing and velocity with gaussian noise over a seeded gradient drift, scaled by `style`, and
32
+ holds the kick and the lowest notes near their slots; `GrooveHumanizer` applies a
33
+ `GrooveTemplate`'s per-slot offsets and velocities instead, converted through the file's own
34
+ tempo map (a mismatch reports itself through `onWarn`) and accenting local melody peaks. The
35
+ `'magenta'` tier stays in the API and throws naming what it needs, since neither
36
+ `@magenta/music` nor a PerformanceRNN checkpoint can be fetched from a `file://` build, and
37
+ `MidiPlayer.create(file, { humanize })` humanizes before it schedules.
38
+ - `GrooveExtractor` builds a `GrooveTemplate` three ways, each reduced to the median of each
39
+ slot's deviations: a played pass against a straight one (matching within half a slot), a
40
+ single file projected onto its own implied grid, or an `AudioBuffer` (hand-rolled spectral
41
+ flux onset detection, no analysis dependency, tempo as an argument because a recording
42
+ carries none). `GrooveConverter` round-trips a template through JSON exactly and through a
43
+ Standard MIDI File within a tick and a hundredth, with the MIDI path enforcing its anchor
44
+ and velocity bounds rather than rounding past them and reading back with a dedicated parser
45
+ for the metas `parseMidi` drops; `ableton-agr` and `reaper-groove` are named in the format
46
+ union and throw as not shipped. `subdivisionCount`/`assertGrooveTemplate` are the invariants
47
+ both the extractor and the converter run on.
48
+
49
+ ### Fixed
50
+
51
+ - `RPGM_FLOOR_AUTOTILE_TABLE[46]` had the wrong bottom-left quadrant (`[0, 3]`, the engine has
52
+ `[0, 5]`), so shape 46 of every floor-table kind, A4 `mixed` wall tops included, drew a stray
53
+ corner.
54
+
10
55
  ## [0.22.0] - 2026-09-29
11
56
 
12
57
  Audio and event-runner asks from the MWGP player, plus the small widgets the Pixel
@@ -1,5 +1,6 @@
1
1
  import { type ToneOptions, type Waveform } from './Synth.ts';
2
2
  import type { Playable } from './Playable.ts';
3
+ import { type HumanizeRequest } from './humanize/HumanizerFactory.ts';
3
4
  /**
4
5
  * A Standard MIDI File (SMF) reader plus a player that voices each note through
5
6
  * `audio.synthesizeTone` - `.mid` is a small, patent-free, well-documented event format,
@@ -137,6 +138,11 @@ export interface MidiPlayerOptions {
137
138
  volume?: number;
138
139
  /** voices one scheduled note; defaults to `audio.playTone` */
139
140
  play?: (options: ToneOptions) => Playable;
141
+ /**
142
+ * humanizes the file before it is scheduled; omitted, the performance plays exactly as
143
+ * written. Use `MidiPlayer.create` to have this applied, or call `humanizeMidi` first.
144
+ */
145
+ humanize?: HumanizeRequest;
140
146
  }
141
147
  /** Plays a parsed `MidiFile` back through `mwg/audio`'s waveform synth, one tone per note, driven by `update(dt)` like every other dt-driven piece of `mwg/core`. */
142
148
  export declare class MidiPlayer {
@@ -148,6 +154,24 @@ export declare class MidiPlayer {
148
154
  private index;
149
155
  private playing;
150
156
  constructor(file: MidiFile, options?: MidiPlayerOptions);
157
+ /**
158
+ * Humanizes first, then schedules: the one call a game needs when a file should sound
159
+ * played rather than played back. The constructor stays synchronous, so the async work
160
+ * of resolving an engine happens here instead of inside frame-time code.
161
+ *
162
+ * @example
163
+ * ```ts
164
+ * import { MidiPlayer, parseMidi } from '@datamoc/mw_games/audio';
165
+ *
166
+ * declare const midiBytes: ArrayBuffer;
167
+ *
168
+ * const player = await MidiPlayer.create(parseMidi(midiBytes), {
169
+ * humanize: { intensity: 0.5, seed: 3, style: 'jazz' },
170
+ * });
171
+ * player.play();
172
+ * ```
173
+ */
174
+ static create(file: MidiFile, options?: MidiPlayerOptions): Promise<MidiPlayer>;
151
175
  play(): void;
152
176
  pause(): void;
153
177
  /** stops and rewinds to the beginning */
@@ -1 +1 @@
1
- {"version":3,"file":"Midi.d.ts","sourceRoot":"","sources":["../../src/audio/Midi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,WAAW,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AACvE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,oCAAoC;IACpC,sBAAsB,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,gIAAgI;IAChI,UAAU,EAAE,MAAM,CAAC;IACnB,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,KAAK,EAAE,MAAM,CAAC;CACd;AAED,+DAA+D;AAC/D,MAAM,WAAW,SAAS;IACzB,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,GAAG,EAAE,MAAM,CAAC;IACZ;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,cAAc,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,kBAAkB,CAAC;AAElH,MAAM,WAAW,QAAQ;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,mEAAmE;IACnE,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;IAC7B;;;OAGG;IACH,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAOD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,WAAW,GAAG,eAAe,GAAG,QAAQ,CAyGvE;AAKD,MAAM,WAAW,aAAc,SAAQ,SAAS;IAC/C,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CAChB;AAkCD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAG3D;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,aAAa,EAAE,CAqE5D;AAED,+EAA+E;AAC/E,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,QAAQ,CAAC;CAC1C;AAED,qKAAqK;AACrK,qBAAa,UAAU;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2B;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqC;IAC5D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAEhC,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,OAAO,CAAS;IAExB,YAAY,IAAI,EAAE,QAAQ,EAAE,OAAO,GAAE,iBAAsB,EAK1D;IAED,IAAI,IAAI,IAAI,CAEX;IAED,KAAK,IAAI,IAAI,CAEZ;IAED,yCAAyC;IACzC,IAAI,IAAI,IAAI,CAIX;IAED,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAgBvB;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,+EAA+E;IAC/E,IAAI,QAAQ,IAAI,MAAM,CAGrB;CACD"}
1
+ {"version":3,"file":"Midi.d.ts","sourceRoot":"","sources":["../../src/audio/Midi.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { playTone } from './Synth.js';
2
+ import { humanizeMidi } from './humanize/HumanizerFactory.js';
2
3
  const DEFAULT_TEMPO = 500000; // 120 BPM
3
4
  /** RPG Maker XP/VX/Ace loop a MIDI from this controller to the end (whole file when absent) */
4
5
  const LOOP_CONTROLLER = 111;
@@ -277,6 +278,26 @@ export class MidiPlayer {
277
278
  this.waveform = options.waveform ?? 'square';
278
279
  this.volume = options.volume ?? 0.2;
279
280
  }
281
+ /**
282
+ * Humanizes first, then schedules: the one call a game needs when a file should sound
283
+ * played rather than played back. The constructor stays synchronous, so the async work
284
+ * of resolving an engine happens here instead of inside frame-time code.
285
+ *
286
+ * @example
287
+ * ```ts
288
+ * import { MidiPlayer, parseMidi } from '@datamoc/mw_games/audio';
289
+ *
290
+ * declare const midiBytes: ArrayBuffer;
291
+ *
292
+ * const player = await MidiPlayer.create(parseMidi(midiBytes), {
293
+ * humanize: { intensity: 0.5, seed: 3, style: 'jazz' },
294
+ * });
295
+ * player.play();
296
+ * ```
297
+ */
298
+ static async create(file, options = {}) {
299
+ return new MidiPlayer(options.humanize ? await humanizeMidi(file, options.humanize) : file, options);
300
+ }
280
301
  play() {
281
302
  this.playing = this.index < this.notes.length;
282
303
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Midi.js","sourceRoot":"","sources":["../../src/audio/Midi.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Midi.js","sourceRoot":"","sources":["../../src/audio/Midi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Groove templates: a quantized performance carried as data. Every slot of one bar says
3
+ * how far its notes sit from the grid and how loud they are relative to usual, so a
4
+ * template can be extracted from a performance, exchanged, and played back into another.
5
+ *
6
+ * The offsets are dense and ordered by construction - slot 0 through the last slot of the
7
+ * bar - which is what lets a consumer look a note's slot up directly instead of searching,
8
+ * and what lets an import recognise a truncated or hand-edited file by its length alone.
9
+ * `timeSignature` and `subdivision` are part of the data rather than outside context: the
10
+ * same offsets mean different things against a bar of 4/4 and a bar of 6/8, and a template
11
+ * moved between the two without saying so is a silent misreading.
12
+ */
13
+ /** how finely a bar is cut up: an eighth, sixteenth or thirty-second grid */
14
+ export type GridSubdivision = '8n' | '16n' | '32n';
15
+ export interface GrooveOffset {
16
+ /** which slot of the bar this describes, counting from 0 */
17
+ subdivisionIndex: number;
18
+ /** how far the slot is played from its grid position, in ticks; negative is early */
19
+ timeOffsetTicks: number;
20
+ /** velocity multiplier for the slot: 1 unchanged, 1.1 a tenth louder, 0 muted */
21
+ velocityFactor: number;
22
+ }
23
+ export interface GrooveTemplate {
24
+ /** a stable name: the file it came from, or whatever a DAW calls it */
25
+ name: string;
26
+ /** numerator and denominator of the bar the slots divide up, e.g. [4, 4] */
27
+ timeSignature: [number, number];
28
+ /** ticks per quarter note, the same quantity `MidiFile.ticksPerQuarter` reports */
29
+ ppq: number;
30
+ /** the tempo the offsets were measured at; applying it elsewhere rescales them in time */
31
+ tempoBpm: number;
32
+ subdivision: GridSubdivision;
33
+ /** one entry per slot of the bar, in slot order */
34
+ offsets: GrooveOffset[];
35
+ }
36
+ /**
37
+ * How many slots a bar of this signature has on this grid: the number of subdivisions
38
+ * that fit in `beats * (4 / beatValue)` quarters. It throws when the grid does not tile
39
+ * the bar exactly (an eighth grid against a bar of three sixteenths), because a template
40
+ * with a fractional slot count would wrap onto a position no note can land on.
41
+ *
42
+ * @example
43
+ * ```ts
44
+ * import { subdivisionCount } from '@datamoc/mw_games/audio';
45
+ *
46
+ * console.log(subdivisionCount([4, 4], '16n')); // 16: a bar of 4/4 cut into sixteenths
47
+ * console.log(subdivisionCount([6, 8], '8n')); // 6: a bar of 6/8 cut into eighths
48
+ * ```
49
+ */
50
+ export declare function subdivisionCount(timeSignature: [number, number], subdivision: GridSubdivision): number;
51
+ /** ticks between two grid slots of this subdivision in a file with this ppq (480 and '16n' is 120) */
52
+ export declare function subdivisionTicks(pq: number, subdivision: GridSubdivision): number;
53
+ /**
54
+ * Checks every invariant of a `GrooveTemplate` at once, so a template read from a file or
55
+ * handed in from outside fails here rather than as a misaligned grid several frames later.
56
+ * The engines call it before applying a template, and the JSON import calls it before
57
+ * returning one.
58
+ *
59
+ * @example
60
+ * ```ts
61
+ * import { assertGrooveTemplate, subdivisionCount } from '@datamoc/mw_games/audio';
62
+ *
63
+ * const template = {
64
+ * name: 'four-on-the-floor',
65
+ * timeSignature: [4, 4] as [number, number],
66
+ * ppq: 480,
67
+ * tempoBpm: 120,
68
+ * subdivision: '16n' as const,
69
+ * offsets: Array.from({ length: subdivisionCount([4, 4], '16n') }, (_, index) => ({
70
+ * subdivisionIndex: index,
71
+ * timeOffsetTicks: 0,
72
+ * velocityFactor: 1,
73
+ * })),
74
+ * };
75
+ *
76
+ * assertGrooveTemplate(template); // throws when a slot is missing or a tick is fractional
77
+ * ```
78
+ */
79
+ export declare function assertGrooveTemplate(template: GrooveTemplate): void;
80
+ //# sourceMappingURL=Groove.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Groove.d.ts","sourceRoot":"","sources":["../../../src/audio/humanize/Groove.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,6EAA6E;AAC7E,MAAM,MAAM,eAAe,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC;AAEnD,MAAM,WAAW,YAAY;IAC5B,4DAA4D;IAC5D,gBAAgB,EAAE,MAAM,CAAC;IACzB,qFAAqF;IACrF,eAAe,EAAE,MAAM,CAAC;IACxB,iFAAiF;IACjF,cAAc,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC9B,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,mFAAmF;IACnF,GAAG,EAAE,MAAM,CAAC;IACZ,0FAA0F;IAC1F,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,eAAe,CAAC;IAC7B,mDAAmD;IACnD,OAAO,EAAE,YAAY,EAAE,CAAC;CACxB;AAKD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,eAAe,GAAG,MAAM,CAQtG;AAED,sGAAsG;AACtG,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,GAAG,MAAM,CAEjF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAqDnE"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Groove templates: a quantized performance carried as data. Every slot of one bar says
3
+ * how far its notes sit from the grid and how loud they are relative to usual, so a
4
+ * template can be extracted from a performance, exchanged, and played back into another.
5
+ *
6
+ * The offsets are dense and ordered by construction - slot 0 through the last slot of the
7
+ * bar - which is what lets a consumer look a note's slot up directly instead of searching,
8
+ * and what lets an import recognise a truncated or hand-edited file by its length alone.
9
+ * `timeSignature` and `subdivision` are part of the data rather than outside context: the
10
+ * same offsets mean different things against a bar of 4/4 and a bar of 6/8, and a template
11
+ * moved between the two without saying so is a silent misreading.
12
+ */
13
+ /** subdivisions that fit in one quarter note: a quarter is two eighths, four sixteenths */
14
+ const SUBDIVISIONS_PER_QUARTER = { '8n': 2, '16n': 4, '32n': 8 };
15
+ /**
16
+ * How many slots a bar of this signature has on this grid: the number of subdivisions
17
+ * that fit in `beats * (4 / beatValue)` quarters. It throws when the grid does not tile
18
+ * the bar exactly (an eighth grid against a bar of three sixteenths), because a template
19
+ * with a fractional slot count would wrap onto a position no note can land on.
20
+ *
21
+ * @example
22
+ * ```ts
23
+ * import { subdivisionCount } from '@datamoc/mw_games/audio';
24
+ *
25
+ * console.log(subdivisionCount([4, 4], '16n')); // 16: a bar of 4/4 cut into sixteenths
26
+ * console.log(subdivisionCount([6, 8], '8n')); // 6: a bar of 6/8 cut into eighths
27
+ * ```
28
+ */
29
+ export function subdivisionCount(timeSignature, subdivision) {
30
+ const [beats, beatValue] = timeSignature;
31
+ const slots = (beats * 4 * SUBDIVISIONS_PER_QUARTER[subdivision]) / beatValue;
32
+ if (!Number.isInteger(slots) || slots < 1)
33
+ throw new Error(`a ${subdivision} grid does not cut a ${beats}/${beatValue} bar into whole slots (it needs ${slots})`);
34
+ return slots;
35
+ }
36
+ /** ticks between two grid slots of this subdivision in a file with this ppq (480 and '16n' is 120) */
37
+ export function subdivisionTicks(pq, subdivision) {
38
+ return pq / SUBDIVISIONS_PER_QUARTER[subdivision];
39
+ }
40
+ /**
41
+ * Checks every invariant of a `GrooveTemplate` at once, so a template read from a file or
42
+ * handed in from outside fails here rather than as a misaligned grid several frames later.
43
+ * The engines call it before applying a template, and the JSON import calls it before
44
+ * returning one.
45
+ *
46
+ * @example
47
+ * ```ts
48
+ * import { assertGrooveTemplate, subdivisionCount } from '@datamoc/mw_games/audio';
49
+ *
50
+ * const template = {
51
+ * name: 'four-on-the-floor',
52
+ * timeSignature: [4, 4] as [number, number],
53
+ * ppq: 480,
54
+ * tempoBpm: 120,
55
+ * subdivision: '16n' as const,
56
+ * offsets: Array.from({ length: subdivisionCount([4, 4], '16n') }, (_, index) => ({
57
+ * subdivisionIndex: index,
58
+ * timeOffsetTicks: 0,
59
+ * velocityFactor: 1,
60
+ * })),
61
+ * };
62
+ *
63
+ * assertGrooveTemplate(template); // throws when a slot is missing or a tick is fractional
64
+ * ```
65
+ */
66
+ export function assertGrooveTemplate(template) {
67
+ if (typeof template !== 'object' || template === null)
68
+ throw new Error('a groove template must be an object');
69
+ const { name, timeSignature, ppq, tempoBpm, subdivision, offsets } = template;
70
+ if (typeof name !== 'string' || name.length === 0)
71
+ throw new Error('a groove template needs a non-empty name');
72
+ if (!Array.isArray(timeSignature) || timeSignature.length !== 2)
73
+ throw new Error(`groove template "${name}": timeSignature must be [beats, beatValue]`);
74
+ const [beats, beatValue] = timeSignature;
75
+ if (!Number.isInteger(beats) || beats < 1)
76
+ throw new Error(`groove template "${name}": time signature numerator must be a positive integer, got ${String(beats)}`);
77
+ if (!Number.isInteger(beatValue) || beatValue < 1 || (beatValue & (beatValue - 1)) !== 0)
78
+ throw new Error(`groove template "${name}": time signature denominator must be a power of two, got ${String(beatValue)}`);
79
+ if (!Number.isInteger(ppq) || ppq < 1)
80
+ throw new Error(`groove template "${name}": ppq must be a positive integer, got ${String(ppq)}`);
81
+ if (!Number.isFinite(tempoBpm) || tempoBpm <= 0)
82
+ throw new Error(`groove template "${name}": tempoBpm must be greater than 0, got ${String(tempoBpm)}`);
83
+ if (subdivision !== '8n' && subdivision !== '16n' && subdivision !== '32n')
84
+ throw new Error(`groove template "${name}": subdivision must be 8n, 16n or 32n, got ${String(subdivision)}`);
85
+ const tickSpan = subdivisionTicks(ppq, subdivision);
86
+ if (!Number.isInteger(tickSpan) || tickSpan < 1)
87
+ throw new Error(`groove template "${name}": ${ppq} ppq does not cut into whole ${subdivision} ticks (it needs ${String(tickSpan)})`);
88
+ const slots = subdivisionCount(timeSignature, subdivision);
89
+ if (!Array.isArray(offsets) || offsets.length !== slots)
90
+ throw new Error(`groove template "${name}": a ${subdivision} grid in ${beats}/${beatValue} has ${slots} slots, this carries ${Array.isArray(offsets) ? offsets.length : String(offsets)}`);
91
+ offsets.forEach((offset, index) => {
92
+ if (typeof offset !== 'object' || offset === null)
93
+ throw new Error(`groove template "${name}": slot ${index} must be an object`);
94
+ if (offset.subdivisionIndex !== index)
95
+ throw new Error(`groove template "${name}": slots must run in order, slot ${index} carries ${String(offset.subdivisionIndex)}`);
96
+ if (!Number.isInteger(offset.timeOffsetTicks))
97
+ throw new Error(`groove template "${name}": slot ${index} has a fractional timeOffsetTicks (${String(offset.timeOffsetTicks)}); ticks are whole numbers`);
98
+ if (!Number.isFinite(offset.velocityFactor) || offset.velocityFactor < 0)
99
+ throw new Error(`groove template "${name}": slot ${index} has velocityFactor ${String(offset.velocityFactor)}, which must be a finite number of at least 0`);
100
+ });
101
+ }
102
+ //# sourceMappingURL=Groove.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Groove.js","sourceRoot":"","sources":["../../../src/audio/humanize/Groove.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import { type GrooveTemplate } from './Groove.ts';
2
+ /**
3
+ * Moving a `GrooveTemplate` in and out of the two formats that can actually carry one:
4
+ * JSON, which carries every field exactly, and a Standard MIDI File, which cannot hold a
5
+ * fractional slot or an unbounded velocity and says so instead of rounding quietly.
6
+ *
7
+ * The MIDI encoding is one note per slot, with a note one subdivision ahead of slot 0 as
8
+ * an anchor. That anchor is why the writer demands `|timeOffsetTicks| < slotTicks`: the
9
+ * reader recovers each offset as *its own grid position*, so an offset a full slot long
10
+ * would be indistinguishable from a slot shift. Velocity rides on the note-on velocity at
11
+ * 1/64 per unit of `velocityFactor`, which fixes the valid factor range to
12
+ * `[1/64, 127/64]` - both ends are enforced rather than clamped.
13
+ *
14
+ * `.agr` and `.reaper-groove` are names in the format union, not shipped readers: both
15
+ * are undocumented proprietary containers, and a half-working guess would silently load
16
+ * the wrong groove rather than fail.
17
+ */
18
+ /** what a template can be written to and read back from */
19
+ export type GrooveFormat = 'json' | 'midi' | 'ableton-agr' | 'reaper-groove';
20
+ export interface GrooveConverterEngine {
21
+ /** `json` and `midi` return bytes only where the format needs them (MIDI); JSON is text */
22
+ exportFormat(template: GrooveTemplate, format: GrooveFormat): Promise<Uint8Array | string>;
23
+ importFormat(data: Uint8Array | string, format: GrooveFormat): Promise<GrooveTemplate>;
24
+ }
25
+ /**
26
+ * Writes a template out and reads one back, through JSON (exact) or MIDI (encoded, with
27
+ * the bounds above enforced on the way in). Asking for `.agr` or `.reaper-groove` throws
28
+ * naming what is missing rather than returning something that merely resembles them.
29
+ *
30
+ * @example
31
+ * ```ts
32
+ * import { GrooveConverter, type GrooveTemplate } from '@datamoc/mw_games/audio';
33
+ *
34
+ * declare const template: GrooveTemplate;
35
+ *
36
+ * const converter = new GrooveConverter();
37
+ * const text = await converter.exportFormat(template, 'json');
38
+ * const copy = await converter.importFormat(text, 'json'); // same offsets, same name
39
+ *
40
+ * const bytes = await converter.exportFormat(template, 'midi');
41
+ * const fromMidi = await converter.importFormat(bytes, 'midi');
42
+ * console.log(fromMidi.tempoBpm === template.tempoBpm); // true: tempo travels as microseconds
43
+ * ```
44
+ */
45
+ export declare class GrooveConverter implements GrooveConverterEngine {
46
+ exportFormat(template: GrooveTemplate, format: GrooveFormat): Promise<Uint8Array | string>;
47
+ importFormat(data: Uint8Array | string, format: GrooveFormat): Promise<GrooveTemplate>;
48
+ }
49
+ //# sourceMappingURL=GrooveConverter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GrooveConverter.d.ts","sourceRoot":"","sources":["../../../src/audio/humanize/GrooveConverter.ts"],"names":[],"mappings":"AAAA,OAAO,EAMN,KAAK,cAAc,EACnB,MAAM,aAAa,CAAC;AAErB;;;;;;;;;;;;;;;GAeG;AAEH,2DAA2D;AAC3D,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,aAAa,GAAG,eAAe,CAAC;AAE7E,MAAM,WAAW,qBAAqB;IACrC,2FAA2F;IAC3F,YAAY,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC,CAAC;IAC3F,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CACvF;AAyTD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,eAAgB,YAAW,qBAAqB;IACtD,YAAY,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC,CAa/F;IAEK,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAY3F;CACD"}