picopilot 0.2.1 → 0.3.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/dist/commands/audio.d.ts +23 -2
  2. package/dist/commands/audio.d.ts.map +1 -1
  3. package/dist/commands/audio.js +228 -23
  4. package/dist/commands/audio.js.map +1 -1
  5. package/dist/commands/doctor.d.ts.map +1 -1
  6. package/dist/commands/doctor.js +1 -0
  7. package/dist/commands/doctor.js.map +1 -1
  8. package/dist/commands/music.d.ts +2 -1
  9. package/dist/commands/music.d.ts.map +1 -1
  10. package/dist/commands/music.js +209 -2
  11. package/dist/commands/music.js.map +1 -1
  12. package/dist/commands/sfx.d.ts.map +1 -1
  13. package/dist/commands/sfx.js +99 -11
  14. package/dist/commands/sfx.js.map +1 -1
  15. package/dist/engine/audio/analyze.d.ts +164 -0
  16. package/dist/engine/audio/analyze.d.ts.map +1 -0
  17. package/dist/engine/audio/analyze.js +512 -0
  18. package/dist/engine/audio/analyze.js.map +1 -0
  19. package/dist/engine/audio/index.d.ts +4 -2
  20. package/dist/engine/audio/index.d.ts.map +1 -1
  21. package/dist/engine/audio/index.js +4 -2
  22. package/dist/engine/audio/index.js.map +1 -1
  23. package/dist/engine/audio/score.d.ts +137 -0
  24. package/dist/engine/audio/score.d.ts.map +1 -0
  25. package/dist/engine/audio/score.js +420 -0
  26. package/dist/engine/audio/score.js.map +1 -0
  27. package/dist/engine/audio/section.d.ts +7 -0
  28. package/dist/engine/audio/section.d.ts.map +1 -1
  29. package/dist/engine/audio/section.js +17 -0
  30. package/dist/engine/audio/section.js.map +1 -1
  31. package/dist/engine/audio/sfx.d.ts +114 -12
  32. package/dist/engine/audio/sfx.d.ts.map +1 -1
  33. package/dist/engine/audio/sfx.js +236 -33
  34. package/dist/engine/audio/sfx.js.map +1 -1
  35. package/dist/engine/pico8/harness.d.ts +11 -5
  36. package/dist/engine/pico8/harness.d.ts.map +1 -1
  37. package/dist/engine/pico8/harness.js +24 -10
  38. package/dist/engine/pico8/harness.js.map +1 -1
  39. package/dist/engine/scaffold/scaffold.d.ts.map +1 -1
  40. package/dist/engine/scaffold/scaffold.js +5 -1
  41. package/dist/engine/scaffold/scaffold.js.map +1 -1
  42. package/package.json +1 -1
  43. package/src/commands/audio.test.ts +170 -1
  44. package/src/commands/audio.ts +284 -27
  45. package/src/commands/doctor.test.ts +1 -0
  46. package/src/commands/doctor.ts +1 -0
  47. package/src/commands/music.test.ts +119 -0
  48. package/src/commands/music.ts +251 -1
  49. package/src/commands/sfx.test.ts +55 -0
  50. package/src/commands/sfx.ts +118 -11
  51. package/src/engine/audio/analyze.test.ts +239 -0
  52. package/src/engine/audio/analyze.ts +664 -0
  53. package/src/engine/audio/index.ts +46 -1
  54. package/src/engine/audio/score.test.ts +402 -0
  55. package/src/engine/audio/score.ts +630 -0
  56. package/src/engine/audio/section.ts +19 -0
  57. package/src/engine/audio/sfx.test.ts +219 -4
  58. package/src/engine/audio/sfx.ts +326 -40
  59. package/src/engine/pico8/harness.test.ts +19 -0
  60. package/src/engine/pico8/harness.ts +29 -11
  61. package/src/engine/scaffold/scaffold.ts +5 -1
  62. package/src/skills/picopilot-audio/SKILL.md +74 -184
@@ -1,7 +1,7 @@
1
1
  import { existsSync, readFileSync, writeFileSync } from 'node:fs';
2
2
  import { isAbsolute, resolve } from 'node:path';
3
3
  import { Cli, z } from 'incur';
4
- import { MusicError, patternsToMusic, SFX_INDEX_MAX, setMusicSection, } from '../engine/audio/index.js';
4
+ import { AudioMmlError, clearSfxSlot, formatSlots, mergeSfxRow, MusicError, musicSfxRefs, parseSlotList, patternsToMusic, planScore, readScore, readSfxRows, ScoreError, SFX_INDEX_MAX, setMusicSection, } from '../engine/audio/index.js';
5
5
  import { Cart, CartParseError } from '../engine/cart/index.js';
6
6
  /** Resolves a path argument to an absolute path (relative to cwd). */
7
7
  function resolvePath(p) {
@@ -223,10 +223,217 @@ function buildMusicGroup() {
223
223
  });
224
224
  },
225
225
  });
226
+ music.command('from-score', {
227
+ description: "Write whole SONGS from a score: up to 4 channels per song, each a picopilot-MML string of ANY length (ADR-0020). picopilot cuts every channel into 32-row SFX aligned across channels, makes a channel that is silent for a whole pattern OFF (null), de-duplicates identical SFX, allocates slots, and writes __sfx__ + __music__ (only the slots it writes or clears and __music__ change). Several songs (e.g. title + in-game) are laid out back to back; the report gives each song's start pattern for `music(n)`. Slots: by default only FREE (note-less) slots, filled from 63 down, never touching other content; --slots <from-to> gives the score a range it OWNS (it overwrites and clears that range; recommended when iterating, so re-runs are idempotent).",
228
+ args: z.object({
229
+ score: z
230
+ .string()
231
+ .optional()
232
+ .describe('The score as JSON: {"songs":[{"name":"title","speed":16,"loop":true,"channels":["<mml ch0>", {"mml":"<mml ch1>","filters":"!dampen"}, null, null]}]}. Per song: speed (ticks/row, default the channels\' shared s<N> or 16), patternRows (1-32, default 32), loop (default true; false = stop at the end), loopFrom (pattern within the song the loop returns to, default 0). One song may be given directly as {"channels":[...]}. Omit and pass --file instead.'),
233
+ }),
234
+ options: z.object({
235
+ cart: z
236
+ .string()
237
+ .default('main.p8')
238
+ .describe('The .p8 cart to write. Defaults to main.p8 in the current folder.'),
239
+ file: z
240
+ .string()
241
+ .optional()
242
+ .describe('Read the JSON score from this file instead of the `score` argument.'),
243
+ slots: z
244
+ .string()
245
+ .optional()
246
+ .describe('A slot range the score OWNS, e.g. "16-63": any slot in it may be overwritten, and the ones the score does not use are cleared. Without it, only free (note-less) slots are used.'),
247
+ }),
248
+ output: z.object({
249
+ cart: z
250
+ .string()
251
+ .describe('The absolute path of the cart that was written.'),
252
+ songs: z
253
+ .array(z.object({
254
+ name: z.string(),
255
+ startPattern: z
256
+ .number()
257
+ .describe('Play this song with music(startPattern).'),
258
+ endPattern: z.number(),
259
+ patterns: z.number(),
260
+ speed: z.number(),
261
+ patternRows: z.number(),
262
+ loop: z.boolean(),
263
+ loopStartPattern: z.number().optional(),
264
+ seconds: z.number().describe('Length of one pass, in seconds.'),
265
+ }))
266
+ .describe('Each song as laid out in __music__.'),
267
+ patterns: z.number().describe('Total patterns written to __music__.'),
268
+ slots: z
269
+ .array(z.object({
270
+ slot: z.number(),
271
+ uses: z.array(z.string()),
272
+ overwrote: z
273
+ .boolean()
274
+ .describe('The slot held different, non-empty content before.'),
275
+ }))
276
+ .describe('Every SFX slot the score wrote, and where it plays.'),
277
+ slotRange: z
278
+ .string()
279
+ .describe('The slots used, compactly (e.g. "40-63").'),
280
+ cleared: z
281
+ .array(z.number())
282
+ .describe('Owned slots (--slots) the score does not use, cleared to empty.'),
283
+ warnings: z.array(z.string()).describe('Advisory warnings.'),
284
+ }),
285
+ examples: [
286
+ {
287
+ description: 'Two songs (title + in-game) from a file, owning slots 16-63',
288
+ args: {},
289
+ options: { file: 'score.json', slots: '16-63' },
290
+ },
291
+ {
292
+ description: 'One short looping song inline',
293
+ args: {
294
+ score: '{"speed":16,"channels":["!dampen @0 v[3 2 2 1/0] o2 l8 a d+ f e","!dampen @0 v[2 2 1] o1 l16 d a-"]}',
295
+ },
296
+ },
297
+ ],
298
+ run({ args, options, error, ok }) {
299
+ let text;
300
+ if (options.file !== undefined) {
301
+ if (args.score !== undefined) {
302
+ return error({
303
+ code: 'ambiguous-input',
304
+ message: 'pass EITHER the score argument OR --file, not both (they are two ways to give the same source).',
305
+ exitCode: 1,
306
+ });
307
+ }
308
+ const filePath = resolvePath(options.file);
309
+ if (!existsSync(filePath)) {
310
+ return error({
311
+ code: 'score-file-not-found',
312
+ message: `no score file at ${filePath}`,
313
+ exitCode: 1,
314
+ });
315
+ }
316
+ text = readFileSync(filePath, 'utf8');
317
+ }
318
+ else if (args.score !== undefined) {
319
+ text = args.score;
320
+ }
321
+ else {
322
+ return error({
323
+ code: 'no-score',
324
+ message: 'no score: pass it as the `score` argument (JSON) or via --file.',
325
+ exitCode: 1,
326
+ });
327
+ }
328
+ let range;
329
+ if (options.slots !== undefined) {
330
+ const list = parseSlotList(options.slots);
331
+ const ok = list !== undefined &&
332
+ list.length > 0 &&
333
+ list[list.length - 1] - list[0] + 1 === list.length;
334
+ if (!ok) {
335
+ return error({
336
+ code: 'audio-score-bad-slot-range',
337
+ message: `--slots "${options.slots}" is not one contiguous range within 0-${SFX_INDEX_MAX}, e.g. "16-63".`,
338
+ exitCode: 1,
339
+ });
340
+ }
341
+ range = { from: list[0], to: list[list.length - 1] };
342
+ }
343
+ const cartPath = resolvePath(options.cart);
344
+ const loaded = loadCart(cartPath);
345
+ if (!loaded.ok) {
346
+ return error({ code: loaded.code, message: loaded.message, exitCode: 1 });
347
+ }
348
+ // Plan FIRST (pure): a bad score never touches the cart.
349
+ let plan;
350
+ try {
351
+ let raw;
352
+ try {
353
+ raw = JSON.parse(text);
354
+ }
355
+ catch (e) {
356
+ throw new ScoreError('audio-score-parse-error', `score is not valid JSON: ${e instanceof Error ? e.message : String(e)}`);
357
+ }
358
+ plan = planScore(readScore(raw), {
359
+ sfxRows: readSfxRows(loaded.cart),
360
+ musicRefs: musicSfxRefs(loaded.cart.getSection('music')),
361
+ }, range !== undefined ? { slots: range } : {});
362
+ }
363
+ catch (e) {
364
+ if (e instanceof ScoreError || e instanceof AudioMmlError) {
365
+ return error({
366
+ code: e.code,
367
+ message: e.message,
368
+ exitCode: 1,
369
+ ...(e.code === 'audio-score-no-free-slots'
370
+ ? {
371
+ cta: {
372
+ description: 'Give the music a slot range it owns:',
373
+ commands: [
374
+ {
375
+ command: 'music from-score --file <score.json> --slots 16-63',
376
+ description: 'The score overwrites and clears that range (and nothing else).',
377
+ },
378
+ ],
379
+ },
380
+ }
381
+ : {}),
382
+ });
383
+ }
384
+ throw e;
385
+ }
386
+ for (const s of plan.slots)
387
+ mergeSfxRow(loaded.cart, s.slot, s.row);
388
+ for (const slot of plan.cleared)
389
+ clearSfxSlot(loaded.cart, slot);
390
+ setMusicSection(loaded.cart, plan.musicSection);
391
+ writeFileSync(cartPath, loaded.cart.serialize());
392
+ const lua = plan.songs
393
+ .map((s) => `${s.name}: music(${s.startPattern})`)
394
+ .join(', ');
395
+ return ok({
396
+ cart: cartPath,
397
+ songs: plan.songs.map((s) => ({
398
+ name: s.name,
399
+ startPattern: s.startPattern,
400
+ endPattern: s.endPattern,
401
+ patterns: s.patterns,
402
+ speed: s.speed,
403
+ patternRows: s.patternRows,
404
+ loop: s.loop,
405
+ ...(s.loopStartPattern !== undefined
406
+ ? { loopStartPattern: s.loopStartPattern }
407
+ : {}),
408
+ seconds: s.seconds,
409
+ })),
410
+ patterns: plan.patterns,
411
+ slots: plan.slots.map((s) => ({
412
+ slot: s.slot,
413
+ uses: s.uses,
414
+ overwrote: s.overwrote,
415
+ })),
416
+ slotRange: formatSlots(plan.slots.map((s) => s.slot)),
417
+ cleared: plan.cleared,
418
+ warnings: plan.warnings,
419
+ }, {
420
+ cta: {
421
+ description: `Written. Play from Lua with ${lua} (add a channel mask, e.g. music(n,0,7), to leave channel 3 for SFX). Then hear and measure it:`,
422
+ commands: [
423
+ {
424
+ command: `audio render --pattern ${plan.songs[0].startPattern} --seconds ${Math.ceil(2 * plan.songs[0].seconds + 2)} --analyze`,
425
+ description: 'Record the first song twice over (the loop length needs two passes) and get loudness/brightness/repetition numbers.',
426
+ },
427
+ ],
428
+ },
429
+ });
430
+ },
431
+ });
226
432
  return music;
227
433
  }
228
434
  /**
229
- * Registers the `music` command group (`music from-patterns`) on the root CLI.
435
+ * Registers the `music` command group (`music from-patterns`, `music
436
+ * from-score`) on the root CLI.
230
437
  *
231
438
  * `music` is a shrinko-FREE and PICO-8-FREE command group: it assembles a
232
439
  * structural pattern list into `__music__` and merges it through the cart model
@@ -1 +1 @@
1
- {"version":3,"file":"music.js","sourceRoot":"","sources":["../../src/commands/music.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"music.js","sourceRoot":"","sources":["../../src/commands/music.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sfx.d.ts","sourceRoot":"","sources":["../../src/commands/sfx.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,GAAG,EAAI,MAAM,OAAO,CAAC;AA6R7B;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,GAAG,IAAI,CAE9C"}
1
+ {"version":3,"file":"sfx.d.ts","sourceRoot":"","sources":["../../src/commands/sfx.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,GAAG,EAAI,MAAM,OAAO,CAAC;AAwY7B;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,GAAG,IAAI,CAE9C"}
@@ -1,7 +1,7 @@
1
1
  import { existsSync, readFileSync, writeFileSync } from 'node:fs';
2
2
  import { isAbsolute, resolve } from 'node:path';
3
3
  import { Cli, z } from 'incur';
4
- import { AudioMmlError, mergeSfxRow, mmlToSfxRow, PITCH_MAX, SFX_MAX_ROWS, SFX_SLOT_COUNT, } from '../engine/audio/index.js';
4
+ import { AudioMmlError, clearSfxSlot, formatSlots, isFreeSfxRow, mergeSfxRow, mmlToSfxRow, parseSlotList, PITCH_MAX, readSfxRows, SFX_MAX_ROWS, SFX_SLOT_COUNT, } from '../engine/audio/index.js';
5
5
  import { Cart, CartParseError } from '../engine/cart/index.js';
6
6
  /** Resolves a path argument to an absolute path (relative to cwd). */
7
7
  function resolvePath(p) {
@@ -43,7 +43,7 @@ function buildSfxGroup() {
43
43
  description: 'Compose SFX as text: transpile picopilot-MML into a cart __sfx__ slot. Durations are TRACKER ROWS at one SFX speed, NOT tempo/BPM (PICO-8 has no per-note duration).',
44
44
  });
45
45
  sfx.command('from-mml', {
46
- description: 'Transpile picopilot-MML text into one __sfx__ slot (0-63) and merge it into the cart (only that slot changes). picopilot-MML is TRACKER-ROW based: a length is a ROW COUNT (l4 = 4 rows), NOT a musical note value, and there is NO tempo/BPM (PICO-8 measures in ticks/row via `s<N>` speed). Notes carry per-note waveform (@0-7, @8-f = custom SFX-instrument), volume (v0-7), and effect (e0-7) that a score notation cannot express. SFX-level FILTER directives reach DESIGNED sounds (explosion/engine/pad): !dampen[2] (low-pass body), !reverb (echo tail), !noiz (@6 white noise), !buzz, !detune1/!detune2. Out-of-range pitch (below C0 / above D#5), >32 rows, and a bad filter level are refused loudly, never silently clamped.',
46
+ description: 'Transpile picopilot-MML text into one __sfx__ slot (0-63) and merge it into the cart (only that slot changes). picopilot-MML is TRACKER-ROW based: a length is a ROW COUNT (l4 = 4 rows), NOT a musical note value, and there is NO tempo/BPM (PICO-8 measures in ticks/row via `s<N>` speed). Notes carry per-note waveform (@0-7, @8-f = custom SFX-instrument), volume (v0-7), and effect (e0-7) that a score notation cannot express. A held note (c8) is ONE note: fade in/out and drop land once per held note, not on every row (ADR-0019); shape its volume with an envelope v[3 2 2 1/0] (one digit per row, last value held, after / = release) and delay vibrato with ~N (vibrato from row N). For melodies over 32 rows use `music from-score`. SFX-level FILTER directives reach DESIGNED sounds (explosion/engine/pad): !dampen[2] (low-pass body), !reverb (echo tail), !noiz (@6 white noise), !buzz, !detune1/!detune2. Out-of-range pitch (below C0 / above D#5), >32 rows, and a bad filter level are refused loudly, never silently clamped.',
47
47
  args: z.object({
48
48
  slot: z.coerce
49
49
  .number()
@@ -54,7 +54,7 @@ function buildSfxGroup() {
54
54
  mml: z
55
55
  .string()
56
56
  .optional()
57
- .describe('The picopilot-MML source (e.g. "s16 @1 v6 c d e f"). Omit and pass --file to read from a file instead. Modal state: @ waveform, v volume, e effect, o octave, l default length (all sticky). Durations are ROWS: c4 = 4 rows (held via tie rows). Loop with {..}; a lone { marks the pattern LEN. SFX filters (per-SFX, place anywhere): !dampen/!dampen2, !reverb, !noiz, !buzz, !detune1/!detune2 (e.g. "!dampen !reverb @6 v7 o3 e c o1 g" = an explosion).'),
57
+ .describe('The picopilot-MML source (e.g. "s16 @1 v6 c d e f"). Omit and pass --file to read from a file instead. Modal state: @ waveform, v volume or v[...] envelope, e effect, ~N delayed vibrato, o octave, l default length (all sticky). Durations are ROWS: c4 = one note held 4 rows. Loop with {..}; a lone { marks the pattern LEN. SFX filters (per-SFX, place anywhere): !dampen/!dampen2, !reverb, !noiz, !buzz, !detune1/!detune2 (e.g. "!dampen !reverb @6 v7 o3 e c o1 g" = an explosion).'),
58
58
  }),
59
59
  options: z.object({
60
60
  cart: z
@@ -107,6 +107,10 @@ function buildSfxGroup() {
107
107
  description: 'A DESIGNED explosion: DAMPEN body + REVERB tail on @6 noise',
108
108
  args: { slot: 3, mml: 's7 !dampen2 !reverb @6 v7 o3 e c o1 g c' },
109
109
  },
110
+ {
111
+ description: 'A soft lead note: held 8 rows with a decaying envelope and vibrato from row 4',
112
+ args: { slot: 6, mml: 's16 !dampen @0 ~4 v[3 3 2 2 2 1/1 0] o2 a8' },
113
+ },
110
114
  {
111
115
  description: 'Read a longer source from a file',
112
116
  args: { slot: 1 },
@@ -169,25 +173,35 @@ function buildSfxGroup() {
169
173
  }
170
174
  : e.code === 'audio-mml-sfx-overflow'
171
175
  ? {
172
- description: `One SFX holds at most ${SFX_MAX_ROWS} rows; split longer melodies:`,
176
+ description: `One SFX holds at most ${SFX_MAX_ROWS} rows; for longer melodies:`,
173
177
  commands: [
174
178
  {
175
- command: 'sfx from-mml <other-slot> "<rest>"',
176
- description: 'Author the remainder as another SFX, then arrange both with `music from-patterns`.',
179
+ command: 'music from-score --file score.json',
180
+ description: 'Write each voice at any length; picopilot splits it into SFX + patterns.',
177
181
  },
178
182
  ],
179
183
  }
180
- : e.code === 'audio-mml-filter-level-out-of-range'
184
+ : e.code === 'audio-mml-tie-state-change'
181
185
  ? {
182
- description: 'The SFX filters + their valid levels:',
186
+ description: 'A tie continues one held note; shape it instead:',
183
187
  commands: [
184
188
  {
185
- command: 'sfx from-mml <slot> "!dampen[2] !reverb !noiz !buzz !detune1/!detune2 ..."',
186
- description: '!dampen has 2 levels (!dampen/!dampen2); !reverb/!noiz/!buzz are on/off; !detune needs 1 or 2.',
189
+ command: 'sfx from-mml <slot> "v[3 2 2 1] c8"',
190
+ description: 'A volume envelope: one digit per row, last value held.',
187
191
  },
188
192
  ],
189
193
  }
190
- : undefined;
194
+ : e.code === 'audio-mml-filter-level-out-of-range'
195
+ ? {
196
+ description: 'The SFX filters + their valid levels:',
197
+ commands: [
198
+ {
199
+ command: 'sfx from-mml <slot> "!dampen[2] !reverb !noiz !buzz !detune1/!detune2 ..."',
200
+ description: '!dampen has 2 levels (!dampen/!dampen2); !reverb/!noiz/!buzz are on/off; !detune needs 1 or 2.',
201
+ },
202
+ ],
203
+ }
204
+ : undefined;
191
205
  return error({
192
206
  code: e.code,
193
207
  message: e.message,
@@ -236,6 +250,80 @@ function buildSfxGroup() {
236
250
  });
237
251
  },
238
252
  });
253
+ sfx.command('clear', {
254
+ description: 'Clear SFX slots back to EMPTY (no notes). Only the named slots change; every other slot and section stays byte-identical. Use it to free slots for `music from-score` or to remove a leftover song.',
255
+ args: z.object({
256
+ slots: z
257
+ .string()
258
+ .describe('The slots to clear: one slot ("5"), a range ("16-63"), or a list ("3,5,16-20").'),
259
+ }),
260
+ options: z.object({
261
+ cart: z
262
+ .string()
263
+ .default('main.p8')
264
+ .describe('The .p8 cart to edit. Defaults to main.p8 in the current folder.'),
265
+ }),
266
+ output: z.object({
267
+ cart: z
268
+ .string()
269
+ .describe('The absolute path of the cart that was written.'),
270
+ cleared: z
271
+ .array(z.number())
272
+ .describe('The slots that held notes and are now empty.'),
273
+ alreadyEmpty: z
274
+ .array(z.number())
275
+ .describe('The named slots that had no notes already (left byte-identical).'),
276
+ }),
277
+ examples: [
278
+ { description: 'Clear slot 11', args: { slots: '11' } },
279
+ {
280
+ description: 'Clear a whole music range of a cart',
281
+ args: { slots: '16-63' },
282
+ options: { cart: 'game.p8' },
283
+ },
284
+ ],
285
+ run({ args, options, error, ok }) {
286
+ const slots = parseSlotList(args.slots);
287
+ if (slots === undefined) {
288
+ return error({
289
+ code: 'bad-slot-list',
290
+ message: `"${args.slots}" is not a slot list within 0-${SFX_SLOT_COUNT - 1}: use "5", "16-63" or "3,5,16-20".`,
291
+ exitCode: 1,
292
+ });
293
+ }
294
+ const cartPath = resolvePath(options.cart);
295
+ const loaded = loadCart(cartPath);
296
+ if (!loaded.ok) {
297
+ return error({ code: loaded.code, message: loaded.message, exitCode: 1 });
298
+ }
299
+ const before = readSfxRows(loaded.cart);
300
+ const cleared = [];
301
+ const alreadyEmpty = [];
302
+ for (const slot of slots) {
303
+ // A note-less slot is already empty: leave its bytes (header) alone.
304
+ if (isFreeSfxRow(before[slot])) {
305
+ alreadyEmpty.push(slot);
306
+ continue;
307
+ }
308
+ cleared.push(slot);
309
+ clearSfxSlot(loaded.cart, slot);
310
+ }
311
+ writeFileSync(cartPath, loaded.cart.serialize());
312
+ return ok({ cart: cartPath, cleared, alreadyEmpty }, cleared.length > 0
313
+ ? {
314
+ cta: {
315
+ description: `Cleared SFX ${formatSlots(cleared)}. If __music__ still references them, those channels are now silent:`,
316
+ commands: [
317
+ {
318
+ command: 'verify',
319
+ description: 'Static gate: the cart still parses.',
320
+ },
321
+ ],
322
+ },
323
+ }
324
+ : undefined);
325
+ },
326
+ });
239
327
  return sfx;
240
328
  }
241
329
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"sfx.js","sourceRoot":"","sources":["../../src/commands/sfx.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sfx.js","sourceRoot":"","sources":["../../src/commands/sfx.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,164 @@
1
+ /**
2
+ * `engine/audio`: "ears" for a model that cannot hear. Measures a WAV (a
3
+ * `picopilot audio render` / `audio record` capture) and turns the numbers into
4
+ * plain-language warnings: too loud, shrill, monotonous, spiky, repetitive.
5
+ *
6
+ * Pure TypeScript (no Python, no PICO-8): a RIFF/WAVE PCM reader, a radix-2
7
+ * FFT, and frame statistics. The thresholds are CALIBRATED on the conquest
8
+ * dogfood (finding `pico8-audio-music-taste-and-analysis`): a soundtrack the
9
+ * user called shrill and grating, one called "far too violent", and the two
10
+ * accepted ones, all measured this way.
11
+ *
12
+ * Measures are over the recording minus its first `skipSeconds` (default 1 s,
13
+ * as in the calibration: the cart's own startup for `audio record`, a song's
14
+ * first notes for `audio render`; an SFX render skips nothing), in
15
+ * non-overlapping frames of {@link FRAME_SIZE} samples.
16
+ */
17
+ /** Samples per analysis frame (93 ms at PICO-8's 22050 Hz). */
18
+ export declare const FRAME_SIZE = 2048;
19
+ /** A frame quieter than this RMS (about -50 dBFS) counts as silence. */
20
+ export declare const SILENCE_RMS = 0.003;
21
+ /** The loudness-profile step, in seconds. */
22
+ export declare const PROFILE_STEP_SECONDS = 0.5;
23
+ /**
24
+ * The warning thresholds (documented in the picopilot-audio skill and the
25
+ * finding). Calibration, mean RMS / centroid / energy above 2 kHz / dynamic
26
+ * range / loop:
27
+ * - shrill, grating first track: 0.156 / 1286 Hz / 13.2 % / 1.9 dB / ~15 s;
28
+ * - "far too violent": 0.195 / 612 Hz / 3.1 %;
29
+ * - accepted title: 0.097 / 459 Hz / 0.2 % / 7 dB;
30
+ * - accepted in-game: 0.069 / 378 Hz / - / 8 dB / ~64 s.
31
+ */
32
+ export declare const THRESHOLDS: {
33
+ /** Mean frame RMS above this: too loud for music under SFX. */
34
+ readonly loudMeanRms: 0.12;
35
+ /** Mean frame RMS below this: (nearly) nothing was captured. */
36
+ readonly quietMeanRms: 0.01;
37
+ /** Median spectral centroid above this (Hz): shrill. */
38
+ readonly shrillCentroidHz: 900;
39
+ /** Median spectral centroid above this (Hz): on the bright side. */
40
+ readonly brightCentroidHz: 550;
41
+ /** Share of energy above 2 kHz above this (%): shrill. */
42
+ readonly shrillAbove2kHzPercent: 8;
43
+ /** Share of energy above 2 kHz above this (%): on the bright side. */
44
+ readonly brightAbove2kHzPercent: 2;
45
+ /** Dynamic range (p90 - p10 frame level) below this (dB): monotonous. */
46
+ readonly flatRangeDb: 4;
47
+ /** Loudest frame over the median frame above this ratio: spikes. */
48
+ readonly spikeRatio: 3;
49
+ /** 99.9th-percentile absolute sample above this: close to clipping. */
50
+ readonly clipSample: 0.9;
51
+ /** A detected loop shorter than this (s): repetitive. */
52
+ readonly shortLoopSeconds: 20;
53
+ /** Music louder than this relative to the reference SFX (dB): SFX get buried. */
54
+ readonly musicOverSfxDb: -3;
55
+ };
56
+ /** A decoded WAV: mono samples in [-1, 1]. */
57
+ export interface DecodedWav {
58
+ sampleRate: number;
59
+ channels: number;
60
+ samples: Float32Array;
61
+ }
62
+ /** A structured analysis failure. */
63
+ export declare class AudioAnalyzeError extends Error {
64
+ readonly code: 'audio-analyze-bad-wav' | 'audio-analyze-too-short';
65
+ constructor(code: AudioAnalyzeError['code'], message: string);
66
+ }
67
+ /** One plain-language finding about the recording. */
68
+ export interface AnalysisWarning {
69
+ code: 'loud' | 'near-silent' | 'shrill' | 'bright' | 'monotonous' | 'spikes' | 'near-clipping' | 'repetitive' | 'music-over-sfx';
70
+ message: string;
71
+ }
72
+ /** The analysis of one recording. */
73
+ export interface AudioAnalysis {
74
+ sampleRate: number;
75
+ /** Length of the whole file, in seconds. */
76
+ durationSeconds: number;
77
+ /** Seconds skipped at the start (PICO-8 startup). */
78
+ skippedSeconds: number;
79
+ /** Seconds actually analysed. */
80
+ analyzedSeconds: number;
81
+ loudness: {
82
+ /** Mean RMS of the 2048-sample frames (0..1). */
83
+ meanRms: number;
84
+ /** Median frame RMS. */
85
+ medianRms: number;
86
+ /** The loudest frame's RMS. */
87
+ peakFrameRms: number;
88
+ /** When the loudest frame starts, in seconds from the start of the file. */
89
+ peakFrameAtSeconds: number;
90
+ /** The 99.9th-percentile absolute sample (0..1). */
91
+ peakSample: number;
92
+ /** Share of frames that are silence (%). */
93
+ silentPercent: number;
94
+ };
95
+ brightness: {
96
+ /** Median energy-weighted spectral centroid of the non-silent frames (Hz). */
97
+ centroidHz: number;
98
+ /** Share of spectral energy above 2 kHz (%). */
99
+ above2kHzPercent: number;
100
+ };
101
+ /** p90 minus p10 of the non-silent frames' level (dB). */
102
+ dynamicRangeDb: number;
103
+ profile: {
104
+ stepSeconds: number;
105
+ /** RMS per step. */
106
+ rms: number[];
107
+ /** The same, as a one-line bar chart (relative to the loudest step). */
108
+ sparkline: string;
109
+ };
110
+ /** The repetition (loop) length, when one is detectable. */
111
+ loop: {
112
+ seconds: number;
113
+ confidence: number;
114
+ } | {
115
+ seconds: null;
116
+ reason: string;
117
+ };
118
+ /** Loudness against a reference SFX recording (`--against`). */
119
+ against?: {
120
+ /** The reference's mean RMS over its non-silent frames. */
121
+ referenceRms: number;
122
+ /** 20*log10(music meanRms / referenceRms): below 0 = the music is quieter. */
123
+ musicOverReferenceDb: number;
124
+ };
125
+ warnings: AnalysisWarning[];
126
+ }
127
+ /**
128
+ * Decodes a RIFF/WAVE file (PCM 8/16/24/32-bit integer or 32-bit float, any
129
+ * channel count; channels are averaged to mono).
130
+ *
131
+ * @throws {AudioAnalyzeError} `audio-analyze-bad-wav`.
132
+ */
133
+ export declare function decodeWav(bytes: Uint8Array): DecodedWav;
134
+ /** Encodes mono samples in [-1, 1] as a 16-bit PCM WAV (fixtures, tests). */
135
+ export declare function encodeWav16(samples: Float32Array, sampleRate: number): Uint8Array;
136
+ /** The p-th percentile (0..100) of a numeric array (linear interpolation). */
137
+ export declare function percentile(values: ArrayLike<number>, p: number): number;
138
+ /** A one-line bar chart of non-negative values (blank = silence). */
139
+ export declare function sparkline(values: readonly number[]): string;
140
+ /** The analysis options. */
141
+ export interface AnalyzeOptions {
142
+ /** Seconds to skip at the start (as the calibration did). Default 1. */
143
+ skipSeconds?: number;
144
+ /** A reference SFX recording to compare the music's loudness against. */
145
+ against?: DecodedWav;
146
+ /**
147
+ * What the recording is. `music` (default) applies every warning; `sfx` (a
148
+ * short one-shot with a silent tail) keeps only near-silent and
149
+ * near-clipping, since the music thresholds (loudness, dynamics, spikes,
150
+ * repetition) do not apply to a one-shot sound.
151
+ */
152
+ kind?: 'music' | 'sfx';
153
+ }
154
+ /**
155
+ * Analyses a decoded recording. Skips `skipSeconds` (default 1) unless the
156
+ * recording is too short for it (then nothing is skipped and the report says
157
+ * so via `skippedSeconds: 0`).
158
+ *
159
+ * @throws {AudioAnalyzeError} `audio-analyze-too-short` (under one frame).
160
+ */
161
+ export declare function analyzeAudio(wav: DecodedWav, options?: AnalyzeOptions): AudioAnalysis;
162
+ /** The plain-language warnings for an analysis (see {@link THRESHOLDS}). */
163
+ export declare function warningsFor(a: AudioAnalysis): AnalysisWarning[];
164
+ //# sourceMappingURL=analyze.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../../src/engine/audio/analyze.ts"],"names":[],"mappings":"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"}