@maccesar/titools 5.2.2 → 5.2.4

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 (25) hide show
  1. package/README.md +87 -83
  2. package/docs/examples.md +3 -1
  3. package/package.json +1 -1
  4. package/skills/ti-game/SKILL.md +2 -0
  5. package/skills/ti-game/references/source-notes.md +20 -4
  6. package/skills/ti-synthengine/SKILL.md +26 -7
  7. package/skills/ti-synthengine/assets/example/README.md +14 -7
  8. package/skills/ti-synthengine/assets/example/app.js +20 -0
  9. package/skills/ti-synthengine/references/advanced-examples.md +27 -2
  10. package/skills/ti-synthengine/references/api.md +238 -227
  11. package/skills/ti-synthengine/references/audio-engine.md +44 -20
  12. package/skills/ti-synthengine/references/audio-pipeline-validation.md +19 -0
  13. package/skills/ti-synthengine/references/examples.md +1 -1
  14. package/skills/ti-synthengine/references/guide.md +30 -13
  15. package/skills/ti-synthengine/references/instruments-and-effects.md +157 -0
  16. package/skills/ti-synthengine/references/native-variation-proposal.md +182 -0
  17. package/skills/ti-synthengine/references/native-variation-validation.md +63 -0
  18. package/skills/ti-synthengine/references/native-variation.md +283 -0
  19. package/skills/ti-synthengine/references/recipes.md +1 -2
  20. package/skills/ti-synthengine/references/recommendations.md +3 -3
  21. package/skills/ti-synthengine/references/sound-design.md +16 -14
  22. package/skills/ti-synthengine/references/source-notes.md +75 -37
  23. package/skills/ti-synthengine/references/source-snapshot.json +203 -192
  24. package/skills/ti-synthengine/references/stats-performance.md +1 -1
  25. package/skills/ti-synthengine/references/troubleshooting.md +36 -28
@@ -1,106 +1,57 @@
1
1
  {
2
2
  "module": "ti.synthengine",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "repository": "https://github.com/macCesar/TiSynthEngine",
5
- "commit": "e7cbbe8a6f9ab38088fd8029c7b43cef6501101f",
6
- "reviewed_on": "2026-10-24",
5
+ "commit": "b07c97c762be5905f132cecf33e9d60ea0c21316",
6
+ "reviewed_on": "2026-11-02",
7
7
  "files": [
8
8
  {
9
9
  "source": "documentation/api.md",
10
10
  "destination": "references/api.md",
11
- "source_sha256": "698d272a85e71692eb5de30586556e53ba19aea88de3b0e583c2d720b150f24b",
12
- "mirrored_sha256": "f4d43d6e947ccfa5cd04f2f76b4b19a00372f9ce1045c155f8265867839bae34",
11
+ "source_sha256": "fed350aedb50da41b303e8bb8129c6381285e1aa708c6a0a70d3a9b5f2994e44",
12
+ "mirrored_sha256": "3c72e8bd89c178e158ea0977f0d259f91f19854d2239173f2b6ea33b44be12ba",
13
13
  "links": [],
14
- "link_fixes": [
15
- {
16
- "original_markdown": "`setStatsEnabled` also returns Boolean acceptance. `stopAll`, `resetStats` and `shutdown` do not return a value. `getDefaults` returns the contract object described below. `getStats` returns a new statistics snapshot.",
17
- "mirrored_markdown": "`setStatsEnabled` also returns Boolean acceptance. `stopAll`, `resetStats` and `shutdown` do not return a value. `getDefaults` returns the contract object described below. `getStats` returns a new statistics snapshot. `getSequenceState` returns the applied sequence state or `null`."
18
- },
19
- {
20
- "original_markdown": "Android additionally reports `capabilities` flags for native sequences, master processing and modulations, plus `limits.stepDurationMs`. The current iOS result omits those keys while implementing the corresponding methods and millisecond sequences. Detect a required method with `typeof synth.playSequence === 'function'` (and the other methods your feature needs); a missing capability flag is not proof that a method is unavailable. Both platforms report the `limits` object shown here.",
21
- "mirrored_markdown": "Android additionally reports `capabilities: { nativeSequence: true, masterProcessing: true, modulations: true }` and `limits.maxSequences`, `limits.priority`, `limits.effectSend` and `limits.stepDurationMs`. The reviewed iOS result omits those metadata keys while implementing the corresponding methods and option ranges. Detect the required methods instead of requiring an Android-only flag. `limits.stepDuration` is in beats on both platforms; for millisecond sequences the accepted range is `4000 / sampleRate` through 60,000."
22
- },
23
- {
24
- "original_markdown": "| `stepDuration` | 0.000001 | 60,000 | sequence units |",
25
- "mirrored_markdown": "| `stepDuration` | `20 / sampleRate` | 300 | beats; returned by both platforms |\n| `stepDurationMs` | `4000 / sampleRate` | 60,000 | ms; returned by Android only, accepted in ms sequences on both |"
26
- },
27
- {
28
- "original_markdown": "| `spatialX`, `spatialY` | Fixed binaural position in \u22121\u20261; omitted for stereo. |",
29
- "mirrored_markdown": "| `spatialX`, `spatialY` | Initial binaural position in \u22121\u20261; omitted for stereo. Compatible held-position updates are live. |"
30
- },
31
- {
32
- "original_markdown": "Omitted attack/release values are shortened to fit an event smaller than the default envelope. Explicit values must satisfy the documented envelope rules. `getDefaults()` reports the baseline defaults, not these per-event adjustments.",
33
- "mirrored_markdown": "Omitted attack/release values are shortened to fit an event smaller than the default envelope. Explicit values must satisfy the documented envelope rules. `getDefaults()` reports the baseline defaults, not these per-event adjustments.\n\nAt this source pin, the iOS timed tone/chord command builder converts accepted\nzero attack/release values to at least one sample. Android retains zero samples.\nThis differs from the shared validator accepting zero; do not promise identical\nzero-edge rendering. Held notes have the separately documented 3 ms minimum."
34
- },
35
- {
36
- "original_markdown": "| `rejectedRequestCount` | Rejected Boolean API requests, counted once per call. |",
37
- "mirrored_markdown": "| `rejectedRequestCount` | Counted API rejections, including sequence-publication rejection; not a complete rejected-call tally on every native path. |"
38
- },
39
- {
40
- "original_markdown": "| `rejectedRequestsByReason` | `{ validation, engineStopped, queueFull }`; sum equals rejection total. |",
41
- "mirrored_markdown": "| `rejectedRequestsByReason` | `{ validation, engineStopped, queueFull }`; sum equals the recorded rejection total. |"
42
- },
43
- {
44
- "original_markdown": "`renderLoad`, `peakRenderLoad`, `outputPeakDbFS`, `outputRmsDbFS`, `preLimiterPeakDb`, `maxLimiterReductionDb` and `limiterReductionDb` are `null` until enabled and measured, and after shutdown.",
45
- "mirrored_markdown": "At this source pin, iOS early rejections in tempo/sequence operations and a\nstopped `setMasterProcessing` call can bypass rejection counters. Incompatible\nheld spatial-mode or modulation updates also have uncounted iOS returns.\nAndroid counts more of these cases, but an unknown/retired `stopSequence` return\ncan also be uncounted. The reason sum equals the recorded total, not every\nrejected request. These counters are diagnostics; the API return is authoritative.\n\n`renderLoad`, `peakRenderLoad`, `outputPeakDbFS`, `outputRmsDbFS`, `preLimiterPeakDb`, `maxLimiterReductionDb` and `limiterReductionDb` are `null` until enabled and measured, and after shutdown."
46
- },
47
- {
48
- "original_markdown": "With a full pool, release voices are replaced first, then the oldest attack.",
49
- "mirrored_markdown": "Within priority-eligible candidates in a full pool, release voices are replaced first, then the oldest attack."
50
- }
51
- ]
14
+ "link_fixes": []
52
15
  },
53
16
  {
54
17
  "source": "documentation/audio-engine.md",
55
18
  "destination": "references/audio-engine.md",
56
- "source_sha256": "2299982e6949f6f2efe7ddad6cc4d28ea1b54e0f31fff36617e0528c5823ac4d",
57
- "mirrored_sha256": "1927993a7b8ebd5abc735d2cf124f45b96ae461e4fc3f9342ae5e62137d491fe",
19
+ "source_sha256": "a3231af42efb2e3bf0ec457083f4c1128728f09c4b2f52d1cbf1df1e76b04886",
20
+ "mirrored_sha256": "852b28698d04391026920b03e95a023fb67d826f403fc136af983a40ca3f73a9",
58
21
  "links": [],
59
22
  "link_fixes": [
60
23
  {
61
- "original_markdown": "Each voice has a smoothstep attack, an optional smoothstep decay to `sustain`, a hold at that level and a smoothstep release. `duration` includes the whole envelope. Defaults are adjusted to fit a short event, while an explicit envelope that cannot fit is rejected by the contract.",
62
- "mirrored_markdown": "Each voice has a smoothstep attack, an optional smoothstep decay to `sustain`, a hold at that level and a smoothstep release. For timed tones and chords, `duration` includes the whole envelope: defaults are adjusted to fit a short event, while an explicit envelope that cannot fit is rejected. Held voices release on `noteOff`; sequence notes release at their gate/length deadline. Held/sequence ADSR has no timed-event duration budget, and their release may continue beyond the sequence interval."
63
- },
64
- {
65
- "original_markdown": "With `filterHzEnd` the cutoff follows `from * (to / from) ^ t`, where `t` runs from 0 to 1 across the event, and coefficients are recomputed every eighth sample. Without a sweep they are computed once, when the note starts.",
66
- "mirrored_markdown": "For timed tones and chords, `filterHzEnd` follows `from * (to / from) ^ t`, where `t` runs from 0 to 1 across the event, and coefficients are recomputed every eighth sample. Native sequence cutoff sweeps instead use note length and then hold their target through release. The current Android renderer refreshes them every sixteenth sample, also forcing the target at the release deadline; the Apple renderer refreshes them every eighth sample. These renderer paths do not establish sample-identical platform output. Held live cutoff/Q and modulation updates have their own ramp/control paths. Without a sweep or live modulation, coefficients are computed once at note start."
24
+ "original_markdown": "The measurements in this section predate native variation and describe the archived revisions in the cited reports. They do not measure the local 1.1.0 candidate. Its separate [variation verification](native-variation-validation.md) records compatibility, storage and callback checks.\n\nThe [performance review](../docs/validation/performance-review.json) separates measured host improvements, exact compatibility checks and pending device acceptance. Its [raw evidence](../docs/validation/performance-review-evidence.zip) retains rejected prototypes and the investigation of idle/stereo regressions. The Apple FIR, stable-control cache and exact idle-effects bypass were evaluated as one atomic candidate and then rejected after physical 32-stereo timing regressed. All three production changes were removed together; the full-score publication and control-memory fixes remain.\n\nMatched 48 kHz/1024-frame iPad full-load runs completed 600 audio seconds without callback deadline misses, with p95 load upper bounds 0.427 for the reference and 0.383 for the rejected initial candidate. The original Apple callback was restored because 32-stereo bypass p95 regressed reproducibly, including continuous-voice windows. Android Sim20/Sim80 frame presentation remains near 60 FPS, while occasional Sim80 output underruns persist in both versions. Compact 48 kHz iPad memory growth is about 18.2 MiB in both versions; no material RAM saving or physical 192 kHz acceptance is claimed. These results and qualified listening observations are recorded separately in the review.\n",
25
+ "mirrored_markdown": "The measurements in this section predate native variation and describe the archived revisions in the cited reports. They do not measure the local 1.1.0 candidate. Its separate [variation verification](native-variation-validation.md) records compatibility, storage and callback checks.\n\nThe [performance review](performance-review.json) separates measured host improvements, exact compatibility checks and pending device acceptance. Its [raw evidence](performance-review-evidence.zip) retains rejected prototypes and the investigation of idle/stereo regressions. The Apple FIR, stable-control cache and exact idle-effects bypass were evaluated as one atomic candidate and then rejected after physical 32-stereo timing regressed. All three production changes were removed together; the full-score publication and control-memory fixes remain.\n\nMatched 48 kHz/1024-frame iPad full-load runs completed 600 audio seconds without callback deadline misses, with p95 load upper bounds 0.427 for the reference and 0.383 for the rejected initial candidate. The original Apple callback was restored because 32-stereo bypass p95 regressed reproducibly, including continuous-voice windows. Android Sim20/Sim80 frame presentation remains near 60 FPS, while occasional Sim80 output underruns persist in both versions. Compact 48 kHz iPad memory growth is about 18.2 MiB in both versions; no material RAM saving or physical 192 kHz acceptance is claimed. These results and qualified listening observations are recorded separately in the review.\n"
67
26
  },
68
27
  {
69
- "original_markdown": "No physical-device ten-minute maximum-load acceptance is claimed by these API changes.",
70
- "mirrored_markdown": "These API changes do not establish complete multiplatform ten-minute maximum-load acceptance; the measured iPad result and Android limits are recorded separately in [physical validation](physical-validation.json) and [the performance summary](stats-performance.md)."
28
+ "original_markdown": "Device feedback superseded that headroom target for Studio's initial Cristal preset: its fixed gain is restored to 1 because the calibrated setting made a fresh Android installation barely audible. This adds 10.83 dB without saturation or voice-count normalization. Three coherent factory notes remain below the limiter ceiling at maximum master; eight independent coherent notes can require limiting. The calibration recommendations remain recorded separately from this active preset exception.\n\nThe [Studio technical validation report](../docs/validation/studio-validation.json) records the calibration and corrected full-chain host benchmark, including failed deadline acceptance and pending device checks. Its host performance result must not be presented as hardware realtime acceptance.\n\n## Unified transport acceptance boundaries\n\nPublic API 1.0.0 uses one renderer, at most 32 voices and capacity for 1-4 sequences. `bus` categories and per-voice sends share one effects chain. These API changes do not establish complete multiplatform ten-minute maximum-load acceptance; the measured iPad result and Android limits are recorded separately in [physical validation](../docs/validation/physical-validation.json) and [the performance summary](stats-performance.md). Host timing, bypass comparisons, memory accounting, actual Android/iOS builds and the remaining device/listening checks are separate evidence. The cited Studio and unified-transport benchmarks are historical observations. In the pre-variation layout, effects buffers at 192 kHz used approximately 13.1 MiB and four maximum-size triple-bank transports used 8,627,712 bytes (8.23 MiB), excluding renderer voices and queues. The local 1.1.0 candidate grows those four transports to 9,537,152 bytes (9.10 MiB) on the measured 64-bit macOS layout, an increase of 909,440 bytes; see [variation storage measurements](native-variation-validation.md#storage-and-callback-work). These structure sizes are not a new whole-process or physical-device measurement. Total accounting must also include renderer voices/tails, command queues, effects, bridge/canonical options and recovery peaks. The 32 MiB additional-memory target remains a target, not a certified bound for the candidate.\n",
29
+ "mirrored_markdown": "Device feedback superseded that headroom target for Studio's initial Cristal preset: its fixed gain is restored to 1 because the calibrated setting made a fresh Android installation barely audible. This adds 10.83 dB without saturation or voice-count normalization. Three coherent factory notes remain below the limiter ceiling at maximum master; eight independent coherent notes can require limiting. The calibration recommendations remain recorded separately from this active preset exception.\n\nThe [Studio technical validation report](studio-validation.json) records the calibration and corrected full-chain host benchmark, including failed deadline acceptance and pending device checks. Its host performance result must not be presented as hardware realtime acceptance.\n\n## Unified transport acceptance boundaries\n\nPublic API 1.0.0 uses one renderer, at most 32 voices and capacity for 1-4 sequences. `bus` categories and per-voice sends share one effects chain. These API changes do not establish complete multiplatform ten-minute maximum-load acceptance; the measured iPad result and Android limits are recorded separately in [physical validation](physical-validation.json) and [the performance summary](stats-performance.md). Host timing, bypass comparisons, memory accounting, actual Android/iOS builds and the remaining device/listening checks are separate evidence. The cited Studio and unified-transport benchmarks are historical observations. In the pre-variation layout, effects buffers at 192 kHz used approximately 13.1 MiB and four maximum-size triple-bank transports used 8,627,712 bytes (8.23 MiB), excluding renderer voices and queues. The local 1.1.0 candidate grows those four transports to 9,537,152 bytes (9.10 MiB) on the measured 64-bit macOS layout, an increase of 909,440 bytes; see [variation storage measurements](native-variation-validation.md#storage-and-callback-work). These structure sizes are not a new whole-process or physical-device measurement. Total accounting must also include renderer voices/tails, command queues, effects, bridge/canonical options and recovery peaks. The 32 MiB additional-memory target remains a target, not a certified bound for the candidate.\n"
71
30
  }
72
31
  ]
73
32
  },
74
33
  {
75
34
  "source": "documentation/examples.md",
76
35
  "destination": "references/examples.md",
77
- "source_sha256": "48104b9d413050d439ee605c92a2456a50b42c4c80e2d7c2c05706eecc7db215",
78
- "mirrored_sha256": "100e1576be75f98201fea8ff0ba599a9582a98c8a3a1469aa2b206eeacfeafde",
36
+ "source_sha256": "637806516d2804c43427d187a37786cfcf2f0d28758762f01a570ba15194bae3",
37
+ "mirrored_sha256": "9e685f584bc377635404f251040192836ea8c51aa382f6486e27c81379af33e1",
79
38
  "links": [],
80
39
  "link_fixes": [
81
40
  {
82
- "original_markdown": "For interactive instruments and native processing, begin with [held motors](#sustained-game-motor), [native sequences](#native-sequence-with-chords-and-edits), [master processing](#chorus-delay-reverb-and-creative-saturation) or [two LFOs](#two-voice-lfos). Use matching official packages and check method availability before enabling a feature.",
83
- "mirrored_markdown": "For interactive instruments and native processing, begin with [held motors](advanced-examples.md#sustained-game-motor), [native sequences](advanced-examples.md#native-sequence-with-chords-and-edits), [master processing](advanced-examples.md#chorus-delay-reverb-and-creative-saturation) or [two LFOs](advanced-examples.md#two-voice-lfos). Use matching official packages and check method availability before enabling a feature."
41
+ "original_markdown": "Every snippet on this page uses the TiSynthEngine 1.0.0 contract. Unless a snippet includes startup code, it assumes the engine is already running.\n\nFor interactive instruments and native processing, begin with [held motors](#sustained-game-motor), [native sequences](#native-sequence-with-chords-and-edits), [master processing](#chorus-delay-reverb-and-creative-saturation) or [two LFOs](#two-voice-lfos). Use matching official packages and check method availability before enabling a feature.\n\n```javascript\n",
42
+ "mirrored_markdown": "Every snippet on this page uses the TiSynthEngine 1.0.0 contract. Unless a snippet includes startup code, it assumes the engine is already running.\n\nAdditional [curated recipes](recipes.md) provide application sound and interaction variants.\n\nFor interactive instruments and native processing, begin with [held motors](advanced-examples.md#sustained-game-motor), [native sequences](advanced-examples.md#native-sequence-with-chords-and-edits), [master processing](advanced-examples.md#chorus-delay-reverb-and-creative-saturation) or [two LFOs](advanced-examples.md#two-voice-lfos). Use matching official packages and check method availability before enabling a feature.\n\n```javascript\n"
84
43
  },
85
44
  {
86
- "original_markdown": "The startup example uses `ambient` for game/UI feedback. On iOS it respects silent mode and mixes with other apps. The module default is `playback`; Android validates either value without changing its output. Shut down before changing the policy. Use the [interactive session controls](../example/README.md#audio-session) to compare them.",
87
- "mirrored_markdown": "The startup example uses `ambient` for game/UI feedback. On iOS it respects silent mode and mixes with other apps. The module default is `playback`; Android validates either value without changing its output. Shut down before changing the policy. Use the [interactive session controls](../assets/example/README.md#audio-session) to compare them."
45
+ "original_markdown": "```\n\nThe startup example uses `ambient` for game/UI feedback. On iOS it respects silent mode and mixes with other apps. The module default is `playback`; Android validates either value without changing its output. Shut down before changing the policy. Use the [interactive session controls](../example/README.md#audio-session) to compare them.\n\n## Built-in waveforms\n",
46
+ "mirrored_markdown": "```\n\nThe startup example uses `ambient` for game/UI feedback. On iOS it respects silent mode and mixes with other apps. The module default is `playback`; Android validates either value without changing its output. Shut down before changing the policy. Use the [interactive session controls](../assets/example/README.md#audio-session) to compare them.\n\n## Built-in waveforms\n"
88
47
  },
89
48
  {
90
- "original_markdown": "Follow the [interactive demo setup and test checklist](../example/README.md) to run [`example/app.js`](../example/app.js). It includes headphone positioning, session selection, pattern completion/replacement and all three statistics methods. For a service-level statistics recipe, see [read engine statistics](guide.md#read-engine-statistics).",
91
- "mirrored_markdown": "Follow the [interactive demo setup and test checklist](../assets/example/README.md) to run [`example/app.js`](../assets/example/app.js). It includes headphone positioning, session selection, pattern completion/replacement and all three statistics methods. For a service-level statistics recipe, see [read engine statistics](guide.md#read-engine-statistics)."
49
+ "original_markdown": "`stopAll()` stops all native sequences, fades current voices and invalidates effect histories. `shutdown()` also releases the native stream. To stop only one sequence owner, use `stopSequence({ sequenceId })`.\n\nFollow the [interactive demo setup and test checklist](../example/README.md) to run [`example/app.js`](../example/app.js). It includes headphone positioning, session selection, pattern completion/replacement and all three statistics methods. For a service-level statistics recipe, see [read engine statistics](guide.md#read-engine-statistics).\n\n## Positioned headphone effect\n",
50
+ "mirrored_markdown": "`stopAll()` stops all native sequences, fades current voices and invalidates effect histories. `shutdown()` also releases the native stream. To stop only one sequence owner, use `stopSequence({ sequenceId })`.\n\nFollow the [interactive demo setup and test checklist](../assets/example/README.md) to run [`example/app.js`](../assets/example/app.js). It includes headphone positioning, session selection, pattern completion/replacement and all three statistics methods. For a service-level statistics recipe, see [read engine statistics](guide.md#read-engine-statistics).\n\n## Positioned headphone effect\n"
92
51
  },
93
52
  {
94
- "original_markdown": "# Examples\n\nEvery snippet on this page uses the TiSynthEngine 1.0.0 contract. Unless a snippet includes startup code, it assumes the engine is already running.",
95
- "mirrored_markdown": "# Examples\n\nEvery snippet on this page uses the TiSynthEngine 1.0.0 contract. Unless a snippet includes startup code, it assumes the engine is already running.\n\nAdditional [curated recipes](recipes.md) provide application sound and interaction variants."
96
- },
97
- {
98
- "original_markdown": "",
99
- "mirrored_markdown": "Continue with [advanced examples](advanced-examples.md).\n"
100
- },
101
- {
102
- "original_markdown": "`stopAll()` fades current voices but leaves pending pattern scheduling alone. `shutdown()` cancels the scheduler and releases the native stream.",
103
- "mirrored_markdown": "`stopAll()` stops all native sequences, fades current voices and invalidates effect histories. `shutdown()` also releases the native stream. To stop only one sequence owner, use `stopSequence({ sequenceId })`."
53
+ "original_markdown": "For app switches, amplitude sliders, all nine screen positions and routing multiple effects through one service, use the [binaural integration guide](guide.md#integrate-binaural-in-a-2d-app). Omitting both coordinates disables binaural for that event; setting both to zero keeps it enabled at the front center.\n\n## Sustained game motor\n\n",
54
+ "mirrored_markdown": "For app switches, amplitude sliders, all nine screen positions and routing multiple effects through one service, use the [binaural integration guide](guide.md#integrate-binaural-in-a-2d-app). Omitting both coordinates disables binaural for that event; setting both to zero keeps it enabled at the front center.\n\nContinue with [advanced examples](advanced-examples.md).\n## Sustained game motor\n\n"
104
55
  }
105
56
  ],
106
57
  "source_parts": [
@@ -111,8 +62,8 @@
111
62
  {
112
63
  "source": "documentation/examples.md",
113
64
  "destination": "references/advanced-examples.md",
114
- "source_sha256": "48104b9d413050d439ee605c92a2456a50b42c4c80e2d7c2c05706eecc7db215",
115
- "mirrored_sha256": "3852693b9faa70d615d9cf0bd4720055532d850f55e1e7b9c6a1a31115dc0639",
65
+ "source_sha256": "637806516d2804c43427d187a37786cfcf2f0d28758762f01a570ba15194bae3",
66
+ "mirrored_sha256": "db14ddae0e47683ada34668a3df1f6ab2d3119b0e84e03a056e38c50087bad4c",
116
67
  "links": [],
117
68
  "link_fixes": [],
118
69
  "source_parts": [
@@ -123,149 +74,110 @@
123
74
  {
124
75
  "source": "documentation/guide.md",
125
76
  "destination": "references/guide.md",
126
- "source_sha256": "dd03392e1d5f89e520f4be70dab2fbad8e86776bf3a60d6af93f0dc0695c8c69",
127
- "mirrored_sha256": "dd6a9ac277f22f965db20dbbd47c82a676600ceedc174cbe0c7dc4a6a0ca3152",
77
+ "source_sha256": "4da2d85f329a49a8b81a9c671c75051b41788371b2c00990fbd499176623894d",
78
+ "mirrored_sha256": "9d04b250c3bc481a42c7469eae24007cd2af2d349bd301aff1ddbdec226601e6",
128
79
  "links": [],
129
80
  "link_fixes": [
130
81
  {
131
- "original_markdown": "Release on touch end and cancellation as well as ordinary key up. Retry a rejected release twice at 16 ms outside the audio callback, then shut down and report failure if publication remains blocked. Cancel retries during teardown. The [held motor example](examples.md#sustained-game-motor) implements this ownership policy. For pause/owner close, invalidate app scheduling and shut down; require a new start before future notes.",
132
- "mirrored_markdown": "Release on touch end and cancellation as well as ordinary key up. Retry a rejected release twice at 16 ms outside the audio callback, then shut down and report failure if publication remains blocked. Cancel retries during teardown. The [held motor example](advanced-examples.md#sustained-game-motor) implements this ownership policy. For pause/owner close, invalidate app scheduling and shut down; require a new start before future notes."
133
- },
134
- {
135
- "original_markdown": "`setMasterProcessing` merges partial updates, validates the entire result and returns publication acceptance. Continuous controls ramp over 10 ms. Disabling an effect closes input gradually and keeps its tail, bounded to 30 seconds with a final fade, then restores exact bypass. It does not undo a non-unity input gain. `stopAll` invalidates histories and stops the native sequence; `shutdown` stops the stream and frees its buffers. See the [processing example](examples.md#chorus-delay-reverb-and-creative-saturation) and [field ranges](api.md#setmasterprocessingoptions).",
136
- "mirrored_markdown": "`setMasterProcessing` merges partial updates, validates the entire result and returns publication acceptance. Continuous controls ramp over 10 ms. Disabling an effect closes input gradually and keeps its tail, bounded to 30 seconds with a final fade, then restores exact bypass. It does not undo a non-unity input gain. `stopAll` invalidates histories and stops the native sequence; `shutdown` stops the stream and frees its buffers. See the [processing example](advanced-examples.md#chorus-delay-reverb-and-creative-saturation) and [field ranges](api.md#setmasterprocessingoptions)."
137
- },
138
- {
139
- "original_markdown": "Delay and LFO sync follow global `setTempo` (initially 120); free settings retain milliseconds or hertz. The two extra voice LFOs target filter cutoff, square PWM or sine FM, with sine/triangle waves. They are independent of `lfoFreq`/`lfoDepth` pitch vibrato. See [two LFOs](examples.md#two-voice-lfos).",
140
- "mirrored_markdown": "Delay and LFO sync follow global `setTempo` (initially 120); free settings retain milliseconds or hertz. The two extra voice LFOs target filter cutoff, square PWM or sine FM, with sine/triangle waves. They are independent of `lfoFreq`/`lfoDepth` pitch vibrato. See [two LFOs](advanced-examples.md#two-voice-lfos)."
141
- },
142
- {
143
- "original_markdown": "See the [complete field contract](api.md#getstats), [measurement limits](stats-performance.md) and [interactive statistics controls](../example/README.md#statistics).",
144
- "mirrored_markdown": "See the [complete field contract](api.md#getstats), [measurement limits](stats-performance.md) and [interactive statistics controls](../assets/example/README.md#statistics)."
145
- },
146
- {
147
- "original_markdown": "The current diagnostics add `preLimiterPeakDb` (maximum signal before final limiting, in dBFS) and `maxLimiterReductionDb` (greatest limiter attenuation in dB) accumulated since reset. Unlike the approximately 200 ms window reduction field, brief peaks remain visible between UI polls. Enable measurements, reset before the scenario and keep `null`/absent fields distinct from measured zero. The [measurement example](examples.md#measure-peaks-and-limiter-reduction) shows opt-in polling and cleanup.",
148
- "mirrored_markdown": "The current diagnostics add `preLimiterPeakDb` (maximum signal before final limiting, in dBFS) and `maxLimiterReductionDb` (greatest limiter attenuation in dB) accumulated since reset. Unlike the approximately 200 ms window reduction field, brief peaks remain visible between UI polls. Enable measurements, reset before the scenario and keep `null`/absent fields distinct from measured zero. The [measurement example](advanced-examples.md#measure-peaks-and-limiter-reduction) shows opt-in polling and cleanup."
149
- },
150
- {
151
- "original_markdown": "`updateVoice` changes compatible pitch, volume, cutoff/Q, vibrato, PWM/FM and LFO targets with 10 ms ramps, without restarting oscillator/envelope phase. Source, table, filter type, noise clock, one-pole cutoff, ADSR and spatial position are fixed at attack. See [complete fields](api.md#updatevoiceoptions). A note that has ended or been stolen accepts updates as a no-op; there is no note-finished event or reserved slot. A `true` return means accepted publication, not proof that the sound is still active.",
152
- "mirrored_markdown": "`updateVoice` changes compatible pitch, volume, cutoff/Q, vibrato, PWM/FM, LFO targets, noise clock, one-pole cutoff, effect send and stereo/spatial position with 10 ms ramps, without restarting oscillator/envelope phase or clearing spatial history. Source, table, filter type and ADSR are fixed at attack. Spatial edits require a voice started spatially; stereo pan edits require a stereo voice. See [complete fields](api.md#updatevoiceoptions). A note that has ended or been stolen accepts updates as a no-op; there is no note-finished event or reserved slot. A `true` return means accepted publication, not proof that the sound is still active."
82
+ "original_markdown": "`updateVoice` changes compatible pitch, volume, cutoff/Q, vibrato, PWM/FM, LFO targets, noise clock, one-pole cutoff, effect send and stereo/spatial position with 10 ms ramps, without restarting oscillator/envelope phase. Source, table, filter type, quantization, ADSR and stereo-versus-spatial mode are fixed at attack. See [complete fields](api.md#updatevoiceoptions). A note that has ended or been stolen accepts updates as a no-op; there is no note-finished event or reserved slot. A `true` return means accepted publication, not proof that the sound is still active.\n\nRelease on touch end and cancellation as well as ordinary key up. Retry a rejected release twice at 16 ms outside the audio callback, then shut down and report failure if publication remains blocked. Cancel retries during teardown. The [held motor example](examples.md#sustained-game-motor) implements this ownership policy. For pause/owner close, invalidate app scheduling and shut down; require a new start before future notes.\n\n## Choose the musical transport\n",
83
+ "mirrored_markdown": "`updateVoice` changes compatible pitch, volume, cutoff/Q, vibrato, PWM/FM, LFO targets, noise clock, one-pole cutoff, effect send and stereo/spatial position with 10 ms ramps, without restarting oscillator/envelope phase. Source, table, filter type, quantization, ADSR and stereo-versus-spatial mode are fixed at attack. See [complete fields](api.md#updatevoiceoptions). A note that has ended or been stolen accepts updates as a no-op; there is no note-finished event or reserved slot. A `true` return means accepted publication, not proof that the sound is still active.\n\nRelease on touch end and cancellation as well as ordinary key up. Retry a rejected release twice at 16 ms outside the audio callback, then shut down and report failure if publication remains blocked. Cancel retries during teardown. The [held motor example](advanced-examples.md#sustained-game-motor) implements this ownership policy. For pause/owner close, invalidate app scheduling and shut down; require a new start before future notes.\n\n## Choose the musical transport\n"
153
84
  },
154
85
  {
155
- "original_markdown": "Calls that create or change sound return `true` when accepted and `false` when rejected. During development, handle that result and inspect logcat or the Xcode console for the structured validation warning.",
156
- "mirrored_markdown": "Timed and held sound calls and accepted edits return `true` when accepted and `false` when rejected. `playSequence` instead returns a positive sequence ID or `0`; state queries return their documented state or `null`, and lifecycle/cleanup methods follow their own return contracts. During development, handle the relevant result and inspect logcat or the Xcode console for the structured validation warning."
86
+ "original_markdown": "Chorus adds stereo movement, delay adds free or synchronized echoes, and reverb adds a damped tail. Saturation is optional creative drive. Select processed categories with `applyTo: ['music', 'ambience']`; a voice's explicit `effectSend` overrides that selection. One chain processes the selected share and one final limiter protects the recombined output.\n\n`setMasterProcessing` merges partial updates, validates the entire result and returns publication acceptance. Continuous controls ramp over 10 ms. Disabling an effect closes input gradually and keeps its tail, bounded to 30 seconds with a final fade, then restores exact bypass. It does not undo a non-unity input gain. `stopAll` invalidates histories and stops every native sequence; `shutdown` stops the stream and frees its buffers. See the [processing example](examples.md#chorus-delay-reverb-and-creative-saturation) and [field ranges](api.md#setmasterprocessingoptions).\n\nDelay and LFO sync follow global `setTempo` (initially 120); free settings retain milliseconds or hertz. The two extra voice LFOs target filter cutoff, square PWM or sine FM, with sine/triangle waves. They are independent of `lfoFreq`/`lfoDepth` pitch vibrato. See [two LFOs](examples.md#two-voice-lfos).\n\n## Play the first sound\n",
87
+ "mirrored_markdown": "Chorus adds stereo movement, delay adds free or synchronized echoes, and reverb adds a damped tail. Saturation is optional creative drive. Select processed categories with `applyTo: ['music', 'ambience']`; a voice's explicit `effectSend` overrides that selection. One chain processes the selected share and one final limiter protects the recombined output.\n\n`setMasterProcessing` merges partial updates, validates the entire result and returns publication acceptance. Continuous controls ramp over 10 ms. Disabling an effect closes input gradually and keeps its tail, bounded to 30 seconds with a final fade, then restores exact bypass. It does not undo a non-unity input gain. `stopAll` invalidates histories and stops every native sequence; `shutdown` stops the stream and frees its buffers. See the [processing example](advanced-examples.md#chorus-delay-reverb-and-creative-saturation) and [field ranges](api.md#setmasterprocessingoptions).\n\nDelay and LFO sync follow global `setTempo` (initially 120); free settings retain milliseconds or hertz. The two extra voice LFOs target filter cutoff, square PWM or sine FM, with sine/triangle waves. They are independent of `lfoFreq`/`lfoDepth` pitch vibrato. See [two LFOs](advanced-examples.md#two-voice-lfos).\n\n## Play the first sound\n"
157
88
  },
158
89
  {
159
- "original_markdown": "Master volume is ramped to avoid a step in the output. `stopAll()` fades active voices, but it does not cancel future steps in the current pattern. Start a new pattern or call `shutdown()` when future scheduling must stop as well.",
160
- "mirrored_markdown": "Master volume is ramped to avoid a step in the output. `stopAll()` stops all native sequences, fades active voices and invalidates effect histories while leaving the engine available. Use `stopSequence({ sequenceId })` to stop only one owner and preserve unrelated sounds. `shutdown()` also stops the stream and releases its resources."
90
+ "original_markdown": "Integrate `stopDiagnostics()` into the existing owner's hide/background/close handlers, before shutdown. Resume polling only while the diagnostic view is active; do not add a second engine owner. Timing and output meters stay `null` until enabled and measured. Basic counters remain available when diagnostics are off. Android backend underrun/buffer/latency fields are best-effort and independent of that switch; iOS returns `null` for those backend fields. A zero underrun count does not prove clean sound.\n\nSee the [complete field contract](api.md#getstats), [measurement limits](stats-performance.md) and [interactive statistics controls](../example/README.md#statistics).\n\n## Next steps\n",
91
+ "mirrored_markdown": "Integrate `stopDiagnostics()` into the existing owner's hide/background/close handlers, before shutdown. Resume polling only while the diagnostic view is active; do not add a second engine owner. Timing and output meters stay `null` until enabled and measured. Basic counters remain available when diagnostics are off. Android backend underrun/buffer/latency fields are best-effort and independent of that switch; iOS returns `null` for those backend fields. A zero underrun count does not prove clean sound.\n\nSee the [complete field contract](api.md#getstats), [measurement limits](stats-performance.md) and [interactive statistics controls](../assets/example/README.md#statistics).\n\n## Next steps\n"
161
92
  },
162
93
  {
163
- "original_markdown": "Supply the current position whenever an effect fires. A projectile launch cue can use the launch position; an impact uses the collision position. Repeated short motor events can use successive positions. A single active tone cannot move after submission because positions remain fixed, including on an identified sustained voice. Stereo `panEnd` movement cannot be combined with binaural; do not continually retrigger long sounds every frame to imitate movement.",
164
- "mirrored_markdown": "Supply the current position whenever an effect fires. A projectile launch cue can use the launch position; an impact uses the collision position. Timed event positions remain fixed after submission. An identified sustained voice started spatially can instead change `spatialX`/`spatialY` through `updateVoice`, with 10 ms ramps and retained spatial history. A stereo voice cannot become spatial through an update. Stereo `panEnd` movement cannot be combined with binaural; do not continually retrigger long sounds every frame to imitate movement."
94
+ "original_markdown": "## Diagnose mix headroom\n\nThe current diagnostics add `preLimiterPeakDb` (maximum signal before final limiting, in dBFS) and `maxLimiterReductionDb` (greatest limiter attenuation in dB) accumulated since reset. Unlike the approximately 200 ms window reduction field, brief peaks remain visible between UI polls. Enable measurements, reset before the scenario and keep `null`/absent fields distinct from measured zero. The [measurement example](examples.md#measure-peaks-and-limiter-reduction) shows opt-in polling and cleanup.\n\nFixed event/input gain does not normalize continuously by active voice count. Coherent overlapping notes, effects feedback or resonance can still exceed the ceiling; the limiter then acts on the whole stereo sum. Saturation is a separate creative processor, disabled initially. Physical loudness and small-speaker bass response are not measured by these digital meters.\n",
95
+ "mirrored_markdown": "## Diagnose mix headroom\n\nThe current diagnostics add `preLimiterPeakDb` (maximum signal before final limiting, in dBFS) and `maxLimiterReductionDb` (greatest limiter attenuation in dB) accumulated since reset. Unlike the approximately 200 ms window reduction field, brief peaks remain visible between UI polls. Enable measurements, reset before the scenario and keep `null`/absent fields distinct from measured zero. The [measurement example](advanced-examples.md#measure-peaks-and-limiter-reduction) shows opt-in polling and cleanup.\n\nFixed event/input gain does not normalize continuously by active voice count. Coherent overlapping notes, effects feedback or resonance can still exceed the ceiling; the limiter then acts on the whole stereo sum. Saturation is a separate creative processor, disabled initially. Physical loudness and small-speaker bass response are not measured by these digital meters.\n"
165
96
  }
166
97
  ]
167
98
  },
168
99
  {
169
100
  "source": "documentation/recommendations.md",
170
101
  "destination": "references/recommendations.md",
171
- "source_sha256": "206593e03b860b2d1c39316bf286cd276307bdb0120be050c262b21749bcccd8",
172
- "mirrored_sha256": "d574b349ab54e4e176f24075e1a04b826784c1908ab69db6d7b8725b5ceae431",
102
+ "source_sha256": "d3d508efe07fce012baceb44285aa9ab4b850cc5c53a5d14c9b8d193e38ca8fb",
103
+ "mirrored_sha256": "57ed87dd7136f778f6ea48f0e5789cfcd81a5fd401edd67b73a91d9505972c65",
173
104
  "links": [],
174
105
  "link_fixes": [
175
106
  {
176
- "original_markdown": "Fixed input/event gain does not decrease when unrelated voices start. If level dips, inspect `maxLimiterReductionDb` and `preLimiterPeakDb`, then consider same-pitch phase cancellation or the device's speaker protection. Eight coherent independent voices can still exceed the limiter threshold; module capacity is not a clean-mix loudness guarantee. See [measurement example](examples.md#measure-peaks-and-limiter-reduction).",
177
- "mirrored_markdown": "Fixed input/event gain does not decrease when unrelated voices start. If level dips, inspect `maxLimiterReductionDb` and `preLimiterPeakDb`, then consider same-pitch phase cancellation or the device's speaker protection. Eight coherent independent voices can still exceed the limiter threshold; module capacity is not a clean-mix loudness guarantee. See [measurement example](advanced-examples.md#measure-peaks-and-limiter-reduction)."
178
- },
179
- {
180
- "original_markdown": "Count release tails along with buttons pressed at the same instant. Timed-only events steal the slot with the least time remaining; sustained/transport voices prefer a releasing slot, then the oldest attack.",
181
- "mirrored_markdown": "Count release tails along with buttons pressed at the same instant. Replacement first selects the lowest eligible priority; higher-priority voices are protected. Among that priority, timed-only events steal the slot with the least time remaining; sustained/transport voices prefer a releasing slot, then the oldest attack."
182
- },
183
- {
184
- "original_markdown": "- Timed tones, chords and pattern steps last at most 60 seconds. Sustained `noteOn` voices last until release, replacement or shutdown.",
185
- "mirrored_markdown": "- Timed tones and chords last at most 60 seconds including release. Sequence intervals and explicit note lengths use the sequence unit, at most 300 beats or 60,000 ms; sequence ADSR remains in milliseconds and release may extend beyond the interval. Sustained `noteOn` voices last until release, replacement or shutdown."
186
- },
187
- {
188
- "original_markdown": "Keep chorus/delay/reverb mixes modest when dialogue or short game feedback must remain distinct. They process the whole mix, so enabling reverb for a victory chord also affects simultaneous shots and collisions. Use an isolated presentation context, or close effect input before returning to gameplay.",
189
- "mirrored_markdown": "Keep chorus/delay/reverb mixes modest when dialogue or short game feedback must remain distinct. One shared chain processes selected categories, not necessarily the whole mix. Select `applyTo` categories and each event's `bus`; an explicit `effectSend` overrides category selection. For example, select `music` for a victory sequence and leave `effects` dry, or set an individual shot's send to 0. Input/master gains and the final limiter remain global."
107
+ "original_markdown": "Keep chorus/delay/reverb mixes modest when dialogue or short game feedback must remain distinct. By default they process all four categories, so enabling reverb for a victory chord also affects simultaneous shots and collisions. Select categories with `applyTo` and assign each voice a `bus`, or use explicit `effectSend` values to choose the processed share. All selected voices share one effects chain. Disabling effects lets tails drain for at most 30 seconds; use panic when immediate history invalidation is required. Start with saturation disabled and compare creative drive at matched levels. Do not use saturation as an automatic substitute for the final limiter.\n\nFixed input/event gain does not decrease when unrelated voices start. If level dips, inspect `maxLimiterReductionDb` and `preLimiterPeakDb`, then consider same-pitch phase cancellation or the device's speaker protection. Eight coherent independent voices can still exceed the limiter threshold; module capacity is not a clean-mix loudness guarantee. See [measurement example](examples.md#measure-peaks-and-limiter-reduction).\n\nMeasure the complete workload on each target device, including held voices, binaural, LFOs, all enabled effects and tails. The [historical statistics benchmark](stats-performance.md) predates these features; the [current technical report](../docs/validation/studio-validation.json) includes an unmet full-chain host deadline criterion. Neither is a guarantee of game-frame rate, physical audio deadlines, heat or battery life.\n",
108
+ "mirrored_markdown": "Keep chorus/delay/reverb mixes modest when dialogue or short game feedback must remain distinct. By default they process all four categories, so enabling reverb for a victory chord also affects simultaneous shots and collisions. Select categories with `applyTo` and assign each voice a `bus`, or use explicit `effectSend` values to choose the processed share. All selected voices share one effects chain. Disabling effects lets tails drain for at most 30 seconds; use panic when immediate history invalidation is required. Start with saturation disabled and compare creative drive at matched levels. Do not use saturation as an automatic substitute for the final limiter.\n\nFixed input/event gain does not decrease when unrelated voices start. If level dips, inspect `maxLimiterReductionDb` and `preLimiterPeakDb`, then consider same-pitch phase cancellation or the device's speaker protection. Eight coherent independent voices can still exceed the limiter threshold; module capacity is not a clean-mix loudness guarantee. See [measurement example](advanced-examples.md#measure-peaks-and-limiter-reduction).\n\nMeasure the complete workload on each target device, including held voices, binaural, LFOs, all enabled effects and tails. The [historical statistics benchmark](stats-performance.md) predates these features; the [current technical report](studio-validation.json) includes an unmet full-chain host deadline criterion. Neither is a guarantee of game-frame rate, physical audio deadlines, heat or battery life.\n"
190
109
  }
191
110
  ]
192
111
  },
193
112
  {
194
113
  "source": "documentation/sound-design.md",
195
114
  "destination": "references/sound-design.md",
196
- "source_sha256": "dd543e07c825aaf67a0a5f85619088a8d02721a9d33dbf4579edf760dad3e262",
197
- "mirrored_sha256": "f2e2207eeaae5e8061b37dfb5fac98ef9b9c050845b23a547b468ceba718e740",
115
+ "source_sha256": "3ad60c006e6ba296110b73362ebba74a30fd5e722fae6c5066cec815e500262a",
116
+ "mirrored_sha256": "6f7a3ae7144cf1423e167a0fc88f9c8bb0ba58f9bce781acc25cd70ab07dd412",
198
117
  "links": [],
199
118
  "link_fixes": [
200
119
  {
201
- "original_markdown": "Choose a held voice when the ending follows a player action instead of a fixed duration: motor, charge beam, pad or the last chord of a ceremony. `noteOn` starts a positive app-owned ID; `noteOff` begins release from the current level, and compatible `updateVoice` edits ramp over 10 ms. Distinct IDs remain independent events with fixed gain. Reserve enough capacity for their releases and unrelated effects, and release on cancellation as well as ordinary key up. See the [held motor recipe](examples.md#sustained-game-motor) for retry/cleanup handling.",
202
- "mirrored_markdown": "Choose a held voice when the ending follows a player action instead of a fixed duration: motor, charge beam, pad or the last chord of a ceremony. `noteOn` starts a positive app-owned ID; `noteOff` begins release from the current level, and compatible `updateVoice` edits ramp over 10 ms. Distinct IDs remain independent events with fixed gain. Reserve enough capacity for their releases and unrelated effects, and release on cancellation as well as ordinary key up. See the [held motor recipe](advanced-examples.md#sustained-game-motor) for retry/cleanup handling."
203
- },
204
- {
205
- "original_markdown": "The two additional voice LFOs move filter cutoff, square PWM or sine FM index using sine/triangle shapes. Cutoff movement creates slow breathing or rhythmic filtering; PWM adds changing harmonic color; a small FM-index modulation varies brightness. Free rates reach 20 Hz, and synced rates follow native transport tempo. These slots are separate from pitch vibrato. Avoid deep/high-rate modulation with strong resonance or high-frequency FM; safe parameter clamping does not guarantee a pleasant or alias-free sound. The [two-LFO example](examples.md#two-voice-lfos) shows a filtered PWM pad.",
206
- "mirrored_markdown": "The two additional voice LFOs move filter cutoff, square PWM or sine FM index using sine/triangle shapes. Cutoff movement creates slow breathing or rhythmic filtering; PWM adds changing harmonic color; a small FM-index modulation varies brightness. Free rates reach 20 Hz, and synced rates follow native transport tempo. These slots are separate from pitch vibrato. Avoid deep/high-rate modulation with strong resonance or high-frequency FM; safe parameter clamping does not guarantee a pleasant or alias-free sound. The [two-LFO example](advanced-examples.md#two-voice-lfos) shows a filtered PWM pad."
120
+ "original_markdown": "\nTiSynthEngine generates sound with oscillators, without recorded samples. Pitch, waveform, envelope, movement and level define each sound, from interface feedback and musical cues to alarms, retro effects and simple percussion.\n\nFor the distinction between a playable timbre and a complete effect recipe, start with [instruments, sound effects and complete sequences](instruments-and-effects.md). It covers held keys, independent shots, native sequences, layered effects, demonstrations and shared output headroom.\n",
121
+ "mirrored_markdown": "\nTiSynthEngine generates sound with oscillators, without recorded samples. Pitch, waveform, envelope, movement and level define each sound, from interface feedback and musical cues to alarms, retro effects and simple percussion.\n\nAdditional [curated recipes](recipes.md) provide application sound and interaction variants.\n\nFor the distinction between a playable timbre and a complete effect recipe, start with [instruments, sound effects and complete sequences](instruments-and-effects.md). It covers held keys, independent shots, native sequences, layered effects, demonstrations and shared output headroom.\n"
207
122
  },
208
123
  {
209
- "original_markdown": "All processors are off initially, with input gain 1. Enable one shared chain through `setMasterProcessing`; select `applyTo` categories such as `music` and `ambience` to keep explosions dry. Per-voice `effectSend` overrides that category selection. [Configuration](examples.md#chorus-delay-reverb-and-creative-saturation) and [exact ranges](api.md#setmasterprocessingoptions) explain chorus, delay, reverb and optional saturation.",
210
- "mirrored_markdown": "All processors are off initially, with input gain 1. Enable one shared chain through `setMasterProcessing`; select `applyTo` categories such as `music` and `ambience` to keep explosions dry. Per-voice `effectSend` overrides that category selection. [Configuration](advanced-examples.md#chorus-delay-reverb-and-creative-saturation) and [exact ranges](api.md#setmasterprocessingoptions) explain chorus, delay, reverb and optional saturation."
124
+ "original_markdown": "## Holding a sound and adding movement\n\nChoose a held voice when the ending follows a player action instead of a fixed duration: motor, charge beam, pad or the last chord of a ceremony. `noteOn` starts a positive app-owned ID; `noteOff` begins release from the current level, and compatible `updateVoice` edits ramp over 10 ms. Distinct IDs remain independent events with fixed gain. Reserve enough capacity for their releases and unrelated effects, and release on cancellation as well as ordinary key up. See the [held motor recipe](examples.md#sustained-game-motor) for retry/cleanup handling.\n\nA fanfare can use beat or millisecond sequences with native chords, rests, gate, independent length, swing and pitch-ordered arpeggios. A long release can ring over later steps. Use held voices when release follows presentation or interaction. See [transport usage](guide.md#choose-the-musical-transport).\n\nThe two additional voice LFOs move filter cutoff, square PWM or sine FM index using sine/triangle shapes. Cutoff movement creates slow breathing or rhythmic filtering; PWM adds changing harmonic color; a small FM-index modulation varies brightness. Free rates reach 20 Hz, and synced rates follow native transport tempo. These slots are separate from pitch vibrato. Avoid deep/high-rate modulation with strong resonance or high-frequency FM; safe parameter clamping does not guarantee a pleasant or alias-free sound. The [two-LFO example](examples.md#two-voice-lfos) shows a filtered PWM pad.\n\n## Native space and creative drive\n",
125
+ "mirrored_markdown": "## Holding a sound and adding movement\n\nChoose a held voice when the ending follows a player action instead of a fixed duration: motor, charge beam, pad or the last chord of a ceremony. `noteOn` starts a positive app-owned ID; `noteOff` begins release from the current level, and compatible `updateVoice` edits ramp over 10 ms. Distinct IDs remain independent events with fixed gain. Reserve enough capacity for their releases and unrelated effects, and release on cancellation as well as ordinary key up. See the [held motor recipe](advanced-examples.md#sustained-game-motor) for retry/cleanup handling.\n\nA fanfare can use beat or millisecond sequences with native chords, rests, gate, independent length, swing and pitch-ordered arpeggios. A long release can ring over later steps. Use held voices when release follows presentation or interaction. See [transport usage](guide.md#choose-the-musical-transport).\n\nThe two additional voice LFOs move filter cutoff, square PWM or sine FM index using sine/triangle shapes. Cutoff movement creates slow breathing or rhythmic filtering; PWM adds changing harmonic color; a small FM-index modulation varies brightness. Free rates reach 20 Hz, and synced rates follow native transport tempo. These slots are separate from pitch vibrato. Avoid deep/high-rate modulation with strong resonance or high-frequency FM; safe parameter clamping does not guarantee a pleasant or alias-free sound. The [two-LFO example](advanced-examples.md#two-voice-lfos) shows a filtered PWM pad.\n\n## Native space and creative drive\n"
211
126
  },
212
127
  {
213
- "original_markdown": "# Sound design with TiSynthEngine\n\nTiSynthEngine generates sound with oscillators, without recorded samples. Pitch, waveform, envelope, movement and level define each sound, from interface feedback and musical cues to alarms, retro effects and simple percussion.",
214
- "mirrored_markdown": "# Sound design with TiSynthEngine\n\nTiSynthEngine generates sound with oscillators, without recorded samples. Pitch, waveform, envelope, movement and level define each sound, from interface feedback and musical cues to alarms, retro effects and simple percussion.\n\nAdditional [curated recipes](recipes.md) provide application sound and interaction variants."
128
+ "original_markdown": "| Optional saturation | Soft waveshaping adds harmonics and changes attack/timbre. | Drive 1.2 to 1.6 with a small blend; compare at matched levels. |\n\nAll processors are off initially, with input gain 1. Enable one shared chain through `setMasterProcessing`; select `applyTo` categories such as `music` and `ambience` to keep explosions dry. Per-voice `effectSend` overrides that category selection. [Configuration](examples.md#chorus-delay-reverb-and-creative-saturation) and [exact ranges](api.md#setmasterprocessingoptions) explain chorus, delay, reverb and optional saturation.\n\nDisabling an effect closes its input gradually and drains the tail before exact bypass; it does not immediately erase its history. Panic invalidates histories. Saturation is a creative choice rather than automatic gain protection; the final limiter stays in place. Match dry/wet comparison levels and watch accumulated limiter reduction so a louder version does not win an A/B comparison merely by level. None of these effects makes a small speaker reproduce missing bass.\n",
129
+ "mirrored_markdown": "| Optional saturation | Soft waveshaping adds harmonics and changes attack/timbre. | Drive 1.2 to 1.6 with a small blend; compare at matched levels. |\n\nAll processors are off initially, with input gain 1. Enable one shared chain through `setMasterProcessing`; select `applyTo` categories such as `music` and `ambience` to keep explosions dry. Per-voice `effectSend` overrides that category selection. [Configuration](advanced-examples.md#chorus-delay-reverb-and-creative-saturation) and [exact ranges](api.md#setmasterprocessingoptions) explain chorus, delay, reverb and optional saturation.\n\nDisabling an effect closes its input gradually and drains the tail before exact bypass; it does not immediately erase its history. Panic invalidates histories. Saturation is a creative choice rather than automatic gain protection; the final limiter stays in place. Match dry/wet comparison levels and watch accumulated limiter reduction so a louder version does not win an A/B comparison merely by level. None of these effects makes a small speaker reproduce missing bass.\n"
215
130
  }
216
131
  ]
217
132
  },
218
133
  {
219
134
  "source": "documentation/troubleshooting.md",
220
135
  "destination": "references/troubleshooting.md",
221
- "source_sha256": "939960cde5860569699916208c0d3b352e60ba2a7603b5046dcefa9970294b70",
222
- "mirrored_sha256": "70ee69508273b3c89d52a8c8feb6c58400433a5a50e298e38da5076ded19a8a8",
136
+ "source_sha256": "bf70a08eee09033b5aaa8cf18b9ef97392f4e6ee318c595ef433a31e6baa33b8",
137
+ "mirrored_sha256": "8692e8ee5e889edbd045a7408976e53cd7b8596c6f0f6af8db5aded0fbf30019",
223
138
  "links": [],
224
139
  "link_fixes": [
225
140
  {
226
- "original_markdown": "Check Boolean returns. A full public queue can reject `noteOff`; retry twice at 16 ms outside render, then shut down/report if still rejected. Cancel those retries on owner teardown. The [held motor example](examples.md#sustained-game-motor) implements this policy. Touch cancellation, pause and close need cleanup as well as normal key up.",
227
- "mirrored_markdown": "Check Boolean returns. A full public queue can reject `noteOff`; retry twice at 16 ms outside render, then shut down/report if still rejected. Cancel those retries on owner teardown. The [held motor example](advanced-examples.md#sustained-game-motor) implements this policy. Touch cancellation, pause and close need cleanup as well as normal key up."
141
+ "original_markdown": "Use the original positive `voiceId`, not the pitch or an ID that has already been reused. `noteOn` does not accept `duration` or temporal `*End` fields. `updateVoice` cannot change source, filter type, table, quantization, ADSR or stereo-versus-spatial mode; restart with a new ID when those attack-time settings must change. Noise clock, one-pole cutoff, effect send and compatible stereo/spatial position support live edits. Changed continuous parameters ramp for 10 ms.\n\nCheck Boolean returns. A full public queue can reject `noteOff`; retry twice at 16 ms outside render, then shut down/report if still rejected. Cancel those retries on owner teardown. The [held motor example](examples.md#sustained-game-motor) implements this policy. Touch cancellation, pause and close need cleanup as well as normal key up.\n\nAn ended or stolen ID accepts updates as a no-op, so acceptance does not prove audible continuity. Held voices share capacity with timed sounds and transport voices. Check replacement counts under dense collision load, leave headroom in the pool and use an app-owned renewal policy if needed. Increasing capacity above 32 or enabling reverb does not reserve a voice.\n",
142
+ "mirrored_markdown": "Use the original positive `voiceId`, not the pitch or an ID that has already been reused. `noteOn` does not accept `duration` or temporal `*End` fields. `updateVoice` cannot change source, filter type, table, quantization, ADSR or stereo-versus-spatial mode; restart with a new ID when those attack-time settings must change. Noise clock, one-pole cutoff, effect send and compatible stereo/spatial position support live edits. Changed continuous parameters ramp for 10 ms.\n\nCheck Boolean returns. A full public queue can reject `noteOff`; retry twice at 16 ms outside render, then shut down/report if still rejected. Cancel those retries on owner teardown. The [held motor example](advanced-examples.md#sustained-game-motor) implements this policy. Touch cancellation, pause and close need cleanup as well as normal key up.\n\nAn ended or stolen ID accepts updates as a no-op, so acceptance does not prove audible continuity. Held voices share capacity with timed sounds and transport voices. Check replacement counts under dense collision load, leave headroom in the pool and use an app-owned renewal policy if needed. Increasing capacity above 32 or enabling reverb does not reserve a voice.\n"
228
143
  },
229
144
  {
230
- "original_markdown": "Enable diagnostics, reset deliberately, then inspect `preLimiterPeakDb` and `maxLimiterReductionDb`. They retain the native pre-limiter peak and greatest attenuation since reset, including brief interventions between UI polls. `limiterReductionDb` is a window measurement and can return to zero sooner. Older packages may omit the accumulated fields; disabled/unmeasured diagnostics return `null`. See [measurement example](examples.md#measure-peaks-and-limiter-reduction).",
231
- "mirrored_markdown": "Enable diagnostics, reset deliberately, then inspect `preLimiterPeakDb` and `maxLimiterReductionDb`. They retain the native pre-limiter peak and greatest attenuation since reset, including brief interventions between UI polls. `limiterReductionDb` is a window measurement and can return to zero sooner. Older packages may omit the accumulated fields; disabled/unmeasured diagnostics return `null`. See [measurement example](advanced-examples.md#measure-peaks-and-limiter-reduction)."
232
- },
233
- {
234
- "original_markdown": "| `conflicting_pitch_fields` | Send only one of `note`, `frequency` or `rest: true`.",
235
- "mirrored_markdown": "| `conflicting_pitch_fields` | Timed/held calls use mutually exclusive `note`/`frequency`; each sequence step uses exactly one `notes` array, `frequencies` array or `rest: true`."
236
- },
145
+ "original_markdown": "## A brief level dip is gone before the meter refreshes\n\nEnable diagnostics, reset deliberately, then inspect `preLimiterPeakDb` and `maxLimiterReductionDb`. They retain the native pre-limiter peak and greatest attenuation since reset, including brief interventions between UI polls. `limiterReductionDb` is a window measurement and can return to zero sooner. Older packages may omit the accumulated fields; disabled/unmeasured diagnostics return `null`. See [measurement example](examples.md#measure-peaks-and-limiter-reduction).\n\nIf accumulated attenuation remains near zero, investigate phase cancellation between repeated same-pitch oscillators, changing filters or the device speaker/protection path. Compatible released public held-note repetitions preserve predecessor phase; simultaneous unisons, timed calls and transport notes retain their existing phase behavior. Extra effects and resonance can consume headroom even when source gain is fixed. Compare matched levels through headphones and the physical speaker before changing the mix globally.\n",
146
+ "mirrored_markdown": "## A brief level dip is gone before the meter refreshes\n\nEnable diagnostics, reset deliberately, then inspect `preLimiterPeakDb` and `maxLimiterReductionDb`. They retain the native pre-limiter peak and greatest attenuation since reset, including brief interventions between UI polls. `limiterReductionDb` is a window measurement and can return to zero sooner. Older packages may omit the accumulated fields; disabled/unmeasured diagnostics return `null`. See [measurement example](advanced-examples.md#measure-peaks-and-limiter-reduction).\n\nIf accumulated attenuation remains near zero, investigate phase cancellation between repeated same-pitch oscillators, changing filters or the device speaker/protection path. Compatible released public held-note repetitions preserve predecessor phase; simultaneous unisons, timed calls and transport notes retain their existing phase behavior. Extra effects and resonance can consume headroom even when source gain is fixed. Compare matched levels through headphones and the physical speaker before changing the mix globally.\n"
147
+ }
148
+ ]
149
+ },
150
+ {
151
+ "source": "documentation/stats-performance.md",
152
+ "destination": "references/stats-performance.md",
153
+ "source_sha256": "085142b6ade7b4f7b5965f6a638f967fdceba5ab1f26fb85e8cb496d5b886b6a",
154
+ "mirrored_sha256": "57ac764035c5dda971c1eb88971de91be780efece0973c4311d868bdb803a57d",
155
+ "links": [],
156
+ "link_fixes": [
237
157
  {
238
- "original_markdown": "The envelope and filter rules apply to the final values of each sounding event. In a pattern that means the step over the pattern root, so a `sustain` on the root is fine when each step supplies a `decay`, and a root `filterHz` is rejected when no step has a `filterType`.",
239
- "mirrored_markdown": "The envelope and filter rules apply to the final values of each sounding event. In a native sequence, each step's `overrides` merges over root `voice`: root `voice.sustain` is valid when every sounding step supplies compatible decay, and `voice.filterHz` needs a non-none filter type after merging. Timed tones/chords enforce their total-duration envelope budget; held and sequence ADSR has no sequence-interval budget."
158
+ "original_markdown": "The unified transport, selective processing and continuous voice controls are implemented in 1.0.0. The following evidence was collected during pre-release development. Both native modules were rebuilt with Titanium SDK 13.4.1.GA. Fresh Android libraries for four ABIs and the three Apple XCFramework libraries were compared with the packaged binaries. The eight consumer applications and the module example use the final API; consumer application builds and physical playback are checked separately below.\n\n[Unified validation evidence](../docs/validation/unified-validation.json) records native binary hashes, contract and regression results, the five-rate ten-minute simulated transport clock test, consumer checks and remaining acceptance work. Nine reference renders and thirty rate/wave cases match the archived renderer sample for sample with the new functions inactive. The effects history optimization also preserves its five-rate render hashes.\n\n[Unified bypass measurements](../docs/validation/unified-bypass-performance.json) retain the complete matched trials against `937e774`, with four sequence slots preallocated in the current engine. Initial stereo regressions prompted changes to inactive voice scans, send ramps, constant controls and compiler inlining. These are measurements of the Android callback on macOS, not iOS callback or physical output results.\n\nThe original short-process one-voice stereo trial exceeded the total-time screen (+12.01%); a twenty-pair repeat also exceeded it (+7.64%), with two distinct latency groups. A diagnostic then ran one hundred benchmark calls in each process, discarded its first ten calls, and compared ten alternating baseline/current process pairs. Its median change was -0.17% total and -0.01% p95. The other three matched configurations stay within the screening thresholds. All original and diagnostic trials remain in the report. This supports an influence from process startup/core residency; it neither identifies a specific CPU core nor establishes a precise device overhead bound.\n\nA later source-frozen recheck includes the physical-phase constant-control and exact Android FIR optimizations. Three configurations remain within the screening limits. One-voice stereo still exceeds the total-time screen after the same warmed ten-pair protocol (+3.49% total, +1.73% p95). A focused layout comparison restored the previous voice offsets but improved total time by less than 0.5%, so that candidate was rejected. This latest-source host screen remains open. The [complete recheck and layout trials](../docs/validation/bypass-physical-recheck-evidence.zip) and summary in the JSON report preserve this result separately from the earlier source.\n\nThe maximum-load host run covers thirty simulated seconds at 48 kHz with 256-frame blocks, 32 voices, four sequences, binaural output, two LFOs per voice and all effects. Render p95 was 32.13% of the block deadline; one block exceeded its deadline. This run does not satisfy the ten-minute, zero-miss physical acceptance criterion. Counted native buffers at 192 kHz occupy 24,649,584 bytes (23.51 MiB); this native accounting excludes managed allocations, drivers and complete recovery/process peaks. Physical measurements are reported separately below.\n",
159
+ "mirrored_markdown": "The unified transport, selective processing and continuous voice controls are implemented in 1.0.0. The following evidence was collected during pre-release development. Both native modules were rebuilt with Titanium SDK 13.4.1.GA. Fresh Android libraries for four ABIs and the three Apple XCFramework libraries were compared with the packaged binaries. The eight consumer applications and the module example use the final API; consumer application builds and physical playback are checked separately below.\n\n[Unified validation evidence](unified-validation.json) records native binary hashes, contract and regression results, the five-rate ten-minute simulated transport clock test, consumer checks and remaining acceptance work. Nine reference renders and thirty rate/wave cases match the archived renderer sample for sample with the new functions inactive. The effects history optimization also preserves its five-rate render hashes.\n\n[Unified bypass measurements](unified-bypass-performance.json) retain the complete matched trials against `937e774`, with four sequence slots preallocated in the current engine. Initial stereo regressions prompted changes to inactive voice scans, send ramps, constant controls and compiler inlining. These are measurements of the Android callback on macOS, not iOS callback or physical output results.\n\nThe original short-process one-voice stereo trial exceeded the total-time screen (+12.01%); a twenty-pair repeat also exceeded it (+7.64%), with two distinct latency groups. A diagnostic then ran one hundred benchmark calls in each process, discarded its first ten calls, and compared ten alternating baseline/current process pairs. Its median change was -0.17% total and -0.01% p95. The other three matched configurations stay within the screening thresholds. All original and diagnostic trials remain in the report. This supports an influence from process startup/core residency; it neither identifies a specific CPU core nor establishes a precise device overhead bound.\n\nA later source-frozen recheck includes the physical-phase constant-control and exact Android FIR optimizations. Three configurations remain within the screening limits. One-voice stereo still exceeds the total-time screen after the same warmed ten-pair protocol (+3.49% total, +1.73% p95). A focused layout comparison restored the previous voice offsets but improved total time by less than 0.5%, so that candidate was rejected. This latest-source host screen remains open. The [complete recheck and layout trials](bypass-physical-recheck-evidence.zip) and summary in the JSON report preserve this result separately from the earlier source.\n\nThe maximum-load host run covers thirty simulated seconds at 48 kHz with 256-frame blocks, 32 voices, four sequences, binaural output, two LFOs per voice and all effects. Render p95 was 32.13% of the block deadline; one block exceeded its deadline. This run does not satisfy the ten-minute, zero-miss physical acceptance criterion. Counted native buffers at 192 kHz occupy 24,649,584 bytes (23.51 MiB); this native accounting excludes managed allocations, drivers and complete recovery/process peaks. Physical measurements are reported separately below.\n"
240
160
  },
241
161
  {
242
- "original_markdown": "- Positions are fixed for active voices. Later calls can use updated coordinates, but there is no method to move a voice already playing.",
243
- "mirrored_markdown": "- Timed tones/chords and each sequence attack keep their specified position. A spatial held voice can move through `updateVoice({ voiceId, spatialX, spatialY })`; omitted coordinates retain their previous value, and the FIR ramps over 10 ms without clearing history. A stereo voice cannot be converted to spatial by an update."
162
+ "original_markdown": "## Physical validation in progress\n\n[Physical validation evidence](../docs/validation/physical-validation.json) records the device protocol, measurements and remaining acceptance work. The isolated diagnostic uses separate app identifiers and preserves the applications' saved data. Its callback histogram and memory queries exist only in temporary instrumented module copies; they are excluded from production packages. Reproduction tools are in `tools/device-validation/`.\n\nThe ninth-generation iPad rendered 600.027 seconds at its actual 44.1 kHz rate, with 1,024-frame callbacks, 32 binaural voices, four sequences, two LFOs per voice and all shared effects. Across 25,841 measured callbacks, p95 occupied [38.8%, 38.9%) of the deadline, the maximum was 55.45%, and no measured callback exceeded its deadline. iOS hardware underruns remain unavailable; this result does not claim a hardware-underrun count of zero.\n",
163
+ "mirrored_markdown": "## Physical validation in progress\n\n[Physical validation evidence](physical-validation.json) records the device protocol, measurements and remaining acceptance work. The isolated diagnostic uses separate app identifiers and preserves the applications' saved data. Its callback histogram and memory queries exist only in temporary instrumented module copies; they are excluded from production packages. Reproduction tools are in `tools/device-validation/`.\n\nThe ninth-generation iPad rendered 600.027 seconds at its actual 44.1 kHz rate, with 1,024-frame callbacks, 32 binaural voices, four sequences, two LFOs per voice and all shared effects. Across 25,841 measured callbacks, p95 occupied [38.8%, 38.9%) of the deadline, the maximum was 55.45%, and no measured callback exceeded its deadline. iOS hardware underruns remain unavailable; this result does not claim a hardware-underrun count of zero.\n"
244
164
  },
245
165
  {
246
- "original_markdown": "Use the original positive `voiceId`, not the pitch or an ID that has already been reused. `noteOn` does not accept `duration` or temporal `*End` fields. `updateVoice` cannot change source, filter type, table, noise clock, ADSR or spatial position; restart with a new ID when those attack-time settings must change. Compatible continuous edits ramp for 10 ms.",
247
- "mirrored_markdown": "Use the original positive `voiceId`, not the pitch or an ID that has already been reused. `noteOn` does not accept `duration` or temporal `*End` fields. Source, filter type, table, quantization and ADSR require a new attack. Compatible `updateVoice` controls include live noise clock, one-pole cutoff, spatial position for a spatial voice, stereo pan for a stereo voice, modulation and explicit effect send, in addition to pitch/volume/filter/vibrato/FM/pulse targets. Changed continuous controls ramp for 10 ms while retaining phase, envelope and spatial history; `noiseRate: 0` means white noise and `lowPassHz: 0` bypasses that filter."
166
+ "original_markdown": "Memory pressure publishes four 512-step, 32-note scores and repeated complete edits, then exercises recovery. On iPad, a conservative charged-footprint/native-buffer projection at 192 kHz is 33,405,808 bytes, while resident high-water growth is 43,401,216 bytes. These are distinct metrics, and the projection is an estimate from actual 44.1 kHz operation. Android's first whole-process pressure measurement exceeds 32 MiB at its actual 48 kHz rate; the producer-memory correction reduces the observed peak by about 9 to 11 MiB, but the whole-process bound remains unestablished. Neither result certifies whole-process RSS below 32 MiB at physical 192 kHz.\n\n[Frontier physical measurements](../docs/validation/frontier-physical-validation.json) cover Arcade and simulations starting with 20 or 80 large asteroids on both devices. The [iPad raw reports](../docs/validation/frontier-ipad-evidence.zip) retain actual Metal presentation timestamps; the [Android raw reports](../docs/validation/frontier-android-evidence.zip) retain SurfaceFlinger presentations aligned with native realtime/monotonic clocks. Arcade and simulation20 satisfy the predefined equivalent-load coverage and presentation/FPS limits. Strict simulation80 matching reaches 47.5% coverage on iPad and 45% on Android against the required 50%, so those comparisons remain inconclusive. Exploratory matching remains separate from the primary result; no causal audio-driven FPS improvement is claimed.\n\nAndroid's two simulation80 Audio-on phases reached 32 spatial voices, callback maxima 3.07/3.19 times their deadline and 67/88 backend xruns. A matched simulation20 renderer elapsed-work diagnostic also exceeded its investigation screen: p95-of-window-p95 increased 6.91%. Source and packaged-class inspection show a wall elapsed counter covering updates, Java/GL calls and descheduling, excluding the explicit FPS sleep and direct EGL swap. Available data cannot isolate CPU contention, governor or indirect driver/GPU effects. Stable presentation timing does not approve this separate renderer-work increase.\n",
167
+ "mirrored_markdown": "Memory pressure publishes four 512-step, 32-note scores and repeated complete edits, then exercises recovery. On iPad, a conservative charged-footprint/native-buffer projection at 192 kHz is 33,405,808 bytes, while resident high-water growth is 43,401,216 bytes. These are distinct metrics, and the projection is an estimate from actual 44.1 kHz operation. Android's first whole-process pressure measurement exceeds 32 MiB at its actual 48 kHz rate; the producer-memory correction reduces the observed peak by about 9 to 11 MiB, but the whole-process bound remains unestablished. Neither result certifies whole-process RSS below 32 MiB at physical 192 kHz.\n\n[Frontier physical measurements](frontier-physical-validation.json) cover Arcade and simulations starting with 20 or 80 large asteroids on both devices. The [iPad raw reports](frontier-ipad-evidence.zip) retain actual Metal presentation timestamps; the [Android raw reports](frontier-android-evidence.zip) retain SurfaceFlinger presentations aligned with native realtime/monotonic clocks. Arcade and simulation20 satisfy the predefined equivalent-load coverage and presentation/FPS limits. Strict simulation80 matching reaches 47.5% coverage on iPad and 45% on Android against the required 50%, so those comparisons remain inconclusive. Exploratory matching remains separate from the primary result; no causal audio-driven FPS improvement is claimed.\n\nAndroid's two simulation80 Audio-on phases reached 32 spatial voices, callback maxima 3.07/3.19 times their deadline and 67/88 backend xruns. A matched simulation20 renderer elapsed-work diagnostic also exceeded its investigation screen: p95-of-window-p95 increased 6.91%. Source and packaged-class inspection show a wall elapsed counter covering updates, Java/GL calls and descheduling, excluding the explicit FPS sleep and direct EGL swap. Available data cannot isolate CPU contention, governor or indirect driver/GPU effects. Stable presentation timing does not approve this separate renderer-work increase.\n"
248
168
  },
249
169
  {
250
- "original_markdown": "Look for a structured warning in logcat or the Xcode console:\n\n```text\nevent=validation_warning method=playSequence key=steps reason=not_object action=rejected value=C4\n```",
251
- "mirrored_markdown": "For methods that emit structured validation warnings, inspect logcat or the Xcode console:\n\n```text\nevent=validation_warning method=playTone key=duraton reason=unsupported_option action=rejected value=200\n```\n\nAlways check the return value: `playSequence` rejects with 0, while Boolean methods reject with `false`. Some sequence/control rejection paths do not emit a structured warning; absence of a new log entry does not establish acceptance."
170
+ "original_markdown": "An exact-output attack-preparation candidate remains outside production. Its physical comparison changed route and volume between baseline and candidate and included overlapping user/automation actions; it cannot establish a causal improvement. The candidate still reported output xruns. A subsequent actual-Sim80 callback profile attributed about 65% of audio-thread CPU samples to the binaural FIR and only 0.45% of measured callback CPU time to new attacks. Blocks without new attacks also exceeded their deadlines.\n\nThe [Android Sim80 correction](../docs/validation/android-sim80-correction.json) reuses FIR coefficients across eight consecutive samples of a voice while preserving partial-sum rounding, sequence boundaries, mix order, ramps and tails. Stereo output and other Android ABIs retain their previous render path. In the short headphone diagnostic at 48 kHz/256 frames, with the same 512-frame output buffer and volume120/160, the corrected candidate reached 32 voices/25 tails and reported zero output xruns. CPU p95 occupied [96.5%,97.0%) of the deadline; 80 CPU-timed and 104 wall-timed callbacks still exceeded one block deadline. Output buffering absorbed those overruns in this run. Cesar then accepted live manual Sim80 with headphones as clean, without perceptible distortion. This is acceptance of that short scene, not the ten-minute maximum-load render criterion. The [raw correction reports](../docs/validation/android-sim80-correction-evidence.zip) retain the original, intermediate and corrected captures separately. Private PCM/profiling interfaces remain excluded from production packages. Full multiplatform acceptance remains open.\n\n## Historical statistics-only comparison\n\nThis is a historical statistics-only comparison, before sustained voices, native sequence transport, master effects and the two additional voice LFOs. It is not a performance measurement of those features. See [current technical validation](../docs/validation/studio-validation.json) for newer evidence and its device/deadline limits.\n\nBeta 1.0.0. Synthetic Android native render on Apple M1. Apple clang version 21.0.0 (clang-2100.3.34.2). Baseline commit `95901c98af5353b86d9dc7c60b29ab9186b038cd`. Both renderers use identical `-O3` flags.\n",
171
+ "mirrored_markdown": "An exact-output attack-preparation candidate remains outside production. Its physical comparison changed route and volume between baseline and candidate and included overlapping user/automation actions; it cannot establish a causal improvement. The candidate still reported output xruns. A subsequent actual-Sim80 callback profile attributed about 65% of audio-thread CPU samples to the binaural FIR and only 0.45% of measured callback CPU time to new attacks. Blocks without new attacks also exceeded their deadlines.\n\nThe [Android Sim80 correction](android-sim80-correction.json) reuses FIR coefficients across eight consecutive samples of a voice while preserving partial-sum rounding, sequence boundaries, mix order, ramps and tails. Stereo output and other Android ABIs retain their previous render path. In the short headphone diagnostic at 48 kHz/256 frames, with the same 512-frame output buffer and volume120/160, the corrected candidate reached 32 voices/25 tails and reported zero output xruns. CPU p95 occupied [96.5%,97.0%) of the deadline; 80 CPU-timed and 104 wall-timed callbacks still exceeded one block deadline. Output buffering absorbed those overruns in this run. Cesar then accepted live manual Sim80 with headphones as clean, without perceptible distortion. This is acceptance of that short scene, not the ten-minute maximum-load render criterion. The [raw correction reports](android-sim80-correction-evidence.zip) retain the original, intermediate and corrected captures separately. Private PCM/profiling interfaces remain excluded from production packages. Full multiplatform acceptance remains open.\n\n## Historical statistics-only comparison\n\nThis is a historical statistics-only comparison, before sustained voices, native sequence transport, master effects and the two additional voice LFOs. It is not a performance measurement of those features. See [current technical validation](studio-validation.json) for newer evidence and its device/deadline limits.\n\nBeta 1.0.0. Synthetic Android native render on Apple M1. Apple clang version 21.0.0 (clang-2100.3.34.2). Baseline commit `95901c98af5353b86d9dc7c60b29ab9186b038cd`. Both renderers use identical `-O3` flags.\n"
252
172
  },
253
173
  {
254
- "original_markdown": "Use whole milliseconds and integer waveform values where required.",
255
- "mirrored_markdown": "Use integer milliseconds for timed tone/chord envelope fields and integer waveform values; native sequence intervals and lengths may be fractional."
174
+ "original_markdown": "The patterns case replays timed native note publications; it does not run the Java or dispatch scheduler. The drain case repeatedly renders 1 ms voices plus the complete binaural FIR history. Shutdown/rejection/queue concurrency belongs to regression testing, not these timings.\n\n[Raw trials and investigation](../docs/validation/stats-performance.json). Reproduce with `tests/stats_benchmark_host.cpp` and `tools/benchmark_stats.py`; see [engine test instructions](audio-engine.md#engine-statistics).\n",
175
+ "mirrored_markdown": "The patterns case replays timed native note publications; it does not run the Java or dispatch scheduler. The drain case repeatedly renders 1 ms voices plus the complete binaural FIR history. Shutdown/rejection/queue concurrency belongs to regression testing, not these timings.\n\n[Raw trials and investigation](stats-performance.json). Reproduce with `tests/stats_benchmark_host.cpp` and `tools/benchmark_stats.py`; see [engine test instructions](audio-engine.md#engine-statistics).\n"
256
176
  }
257
177
  ]
258
178
  },
259
179
  {
260
- "source": "documentation/stats-performance.md",
261
- "destination": "references/stats-performance.md",
262
- "source_sha256": "3d6d35b9e0e49a778777d406418eaba04ebd57da871a322da28fae0190c5cb17",
263
- "mirrored_sha256": "576910d2ee7e3026b083136713e8ceba0b4cbb774958bd65f3751612d9360467",
264
- "links": [],
265
- "link_fixes": []
266
- },
267
- {
268
- "source": "documentation/stats-performance.json",
180
+ "source": "docs/validation/stats-performance.json",
269
181
  "destination": "references/stats-performance.json",
270
182
  "source_sha256": "bd0cf07295d0d8f1120e66f527e9ca6d9a014efdc43dff5675716e8e26abe5b3",
271
183
  "mirrored_sha256": "bd0cf07295d0d8f1120e66f527e9ca6d9a014efdc43dff5675716e8e26abe5b3",
@@ -273,7 +185,7 @@
273
185
  "link_fixes": []
274
186
  },
275
187
  {
276
- "source": "documentation/studio-validation.json",
188
+ "source": "docs/validation/studio-validation.json",
277
189
  "destination": "references/studio-validation.json",
278
190
  "source_sha256": "b6abcf9229b8bb812cb4da467e3c495ab66c41041fb7562ca3c371d79671509b",
279
191
  "mirrored_sha256": "b6abcf9229b8bb812cb4da467e3c495ab66c41041fb7562ca3c371d79671509b",
@@ -281,7 +193,7 @@
281
193
  "link_fixes": []
282
194
  },
283
195
  {
284
- "source": "documentation/unified-bypass-performance.json",
196
+ "source": "docs/validation/unified-bypass-performance.json",
285
197
  "destination": "references/unified-bypass-performance.json",
286
198
  "source_sha256": "12622f00804bd866be90ac40579b868e8f6fcbd35635bf8000febb21adef2563",
287
199
  "mirrored_sha256": "12622f00804bd866be90ac40579b868e8f6fcbd35635bf8000febb21adef2563",
@@ -289,7 +201,7 @@
289
201
  "link_fixes": []
290
202
  },
291
203
  {
292
- "source": "documentation/unified-validation.json",
204
+ "source": "docs/validation/unified-validation.json",
293
205
  "destination": "references/unified-validation.json",
294
206
  "source_sha256": "4754da69159f4ab35544d0f0a8ef6e5568dda9e74162b1c2dad2bb807d905fd8",
295
207
  "mirrored_sha256": "4754da69159f4ab35544d0f0a8ef6e5568dda9e74162b1c2dad2bb807d905fd8",
@@ -297,7 +209,7 @@
297
209
  "link_fixes": []
298
210
  },
299
211
  {
300
- "source": "documentation/physical-validation.json",
212
+ "source": "docs/validation/physical-validation.json",
301
213
  "destination": "references/physical-validation.json",
302
214
  "links": [],
303
215
  "link_fixes": [],
@@ -305,7 +217,7 @@
305
217
  "mirrored_sha256": "73233c11a1d2aa06654a06486ef52a08d961473d83b0c5b2a44e19a6eac28c0b"
306
218
  },
307
219
  {
308
- "source": "documentation/frontier-physical-validation.json",
220
+ "source": "docs/validation/frontier-physical-validation.json",
309
221
  "destination": "references/frontier-physical-validation.json",
310
222
  "links": [],
311
223
  "link_fixes": [],
@@ -319,32 +231,32 @@
319
231
  "links": [],
320
232
  "link_fixes": [
321
233
  {
322
- "original_markdown": "The Classic Titanium app in [app.js](app.js) demonstrates the timed sounds, native sequences and statistics with the `sequenceend` event on Android and iOS. It uses the current 1.0.0 module packages, including binaural and statistics support. Held voices, master processing and voice LFOs have copyable examples in the [advanced documentation](../documentation/examples.md#sustained-game-motor); this reference app does not expose those newer controls. The default engine configuration is 16 voices, `conservative` mixing and the `playback` session; master volume starts at 100% and optional diagnostics start off.",
323
- "mirrored_markdown": "The Classic Titanium app in [app.js](app.js) demonstrates the timed sounds, native sequences and statistics with the `sequenceend` event on Android and iOS. It uses the current 1.0.0 module packages, including binaural and statistics support. Held voices, master processing and voice LFOs have copyable examples in the [advanced documentation](../../references/advanced-examples.md#sustained-game-motor); this reference app does not expose those newer controls. The default engine configuration is 16 voices, `conservative` mixing and the `playback` session; master volume starts at 100% and optional diagnostics start off."
234
+ "original_markdown": "# Interactive example\n\nThe Classic Titanium app in [app.js](app.js) demonstrates the timed sounds, native sequences and statistics with the `sequenceend` event on Android and iOS. It runs with the published 1.0.2 module packages, including binaural and statistics support, or the unpublished local 1.1.0 candidates for native attack variation. Held voices, master processing and voice LFOs have copyable examples in the [advanced documentation](../documentation/examples.md#sustained-game-motor); this reference app does not expose those newer controls. The default engine configuration is 16 voices, `conservative` mixing and the `playback` session; master volume starts at 100% and optional diagnostics start off.\n\n## Run it\n",
235
+ "mirrored_markdown": "# Interactive example\n\nThe Classic Titanium app in [app.js](app.js) demonstrates the timed sounds, native sequences and statistics with the `sequenceend` event on Android and iOS. It runs with the published 1.0.2 module packages, including binaural and statistics support, or the unpublished local 1.1.0 candidates for native attack variation. Held voices, master processing and voice LFOs have copyable examples in the [advanced documentation](../../references/advanced-examples.md#sustained-game-motor); this reference app does not expose those newer controls. The default engine configuration is 16 voices, `conservative` mixing and the `playback` session; master volume starts at 100% and optional diagnostics start off.\n\n## Run it\n"
324
236
  },
325
237
  {
326
- "original_markdown": "5. Build and run the test app with the Titanium CLI or your existing Titanium launch configuration. Use Titanium SDK 13.2.0.GA or newer, Android compile API 35 or newer, and iOS 15 or newer. See the [module installation guide](../documentation/guide.md#install-the-module).",
327
- "mirrored_markdown": "5. Build and run the test app with the Titanium CLI or your existing Titanium launch configuration. Use Titanium SDK 13.2.0.GA or newer, Android compile API 35 or newer, and iOS 15 or newer. See the [module installation guide](../../references/guide.md#install-the-module)."
238
+ "original_markdown": "\n4. Copy the entire `example/` folder into the test app's `Resources/`, including [app.js](app.js), [sequenceScore.js](lib/sequenceScore.js) and [sequenceOwner.js](lib/sequenceOwner.js). It needs no images or audio files.\n5. Build and run the test app with the Titanium CLI or your existing Titanium launch configuration. Use Titanium SDK 13.2.0.GA or newer, Android compile API 35 or newer, and iOS 15 or newer. See the [module installation guide](../documentation/guide.md#install-the-module).\n\nThe example checks the installed API version, spatial limits and all three statistics methods before constructing the screen. If it requests current packages, replace the native module, then rebuild and reinstall the app; copying module files alone does not update an app already on a device.\n",
239
+ "mirrored_markdown": "\n4. Copy the entire `example/` folder into the test app's `Resources/`, including [app.js](app.js), [sequenceScore.js](lib/sequenceScore.js) and [sequenceOwner.js](lib/sequenceOwner.js). It needs no images or audio files.\n5. Build and run the test app with the Titanium CLI or your existing Titanium launch configuration. Use Titanium SDK 13.2.0.GA or newer, Android compile API 35 or newer, and iOS 15 or newer. See the [module installation guide](../../references/guide.md#install-the-module).\n\nThe example checks the installed API version, spatial limits and all three statistics methods before constructing the screen. If it requests current packages, replace the native module, then rebuild and reinstall the app; copying module files alone does not update an app already on a device.\n"
328
240
  },
329
241
  {
330
- "original_markdown": "SPATIAL CHORD places the whole chord above/right. SPATIAL PATTERN places three broadband hits above/left, below/center and above/right using per-step coordinates. Neither sends stereo pan fields while binaural is active. The output remains two channels on a front plane, without rear positioning, distance attenuation or head tracking. See the [app integration guide](../documentation/guide.md#integrate-binaural-in-a-2d-app) for source mapping and amplitude sliders.",
331
- "mirrored_markdown": "SPATIAL CHORD places the whole chord above/right. SPATIAL PATTERN places three broadband hits above/left, below/center and above/right using per-step coordinates. Neither sends stereo pan fields while binaural is active. The output remains two channels on a front plane, without rear positioning, distance attenuation or head tracking. See the [app integration guide](../../references/guide.md#integrate-binaural-in-a-2d-app) for source mapping and amplitude sliders."
242
+ "original_markdown": "Select STEREO MODE and repeat points with the same horizontal position. Their height no longer affects placement because both spatial keys are omitted. BINAURAL MODE restores per-event coordinates. These two modes affect this section only; the ordinary stereo demos remain unchanged. An active voice keeps its original position.\n\nSPATIAL CHORD places the whole chord above/right. SPATIAL PATTERN places three broadband hits above/left, below/center and above/right using per-step coordinates. Neither sends stereo pan fields while binaural is active. The output remains two channels on a front plane, without rear positioning, distance attenuation or head tracking. See the [app integration guide](../documentation/guide.md#integrate-binaural-in-a-2d-app) for source mapping and amplitude sliders.\n\n## Audio session\n",
243
+ "mirrored_markdown": "Select STEREO MODE and repeat points with the same horizontal position. Their height no longer affects placement because both spatial keys are omitted. BINAURAL MODE restores per-event coordinates. These two modes affect this section only; the ordinary stereo demos remain unchanged. An active voice keeps its original position.\n\nSPATIAL CHORD places the whole chord above/right. SPATIAL PATTERN places three broadband hits above/left, below/center and above/right using per-step coordinates. Neither sends stereo pan fields while binaural is active. The output remains two channels on a front plane, without rear positioning, distance attenuation or head tracking. See the [app integration guide](../../references/guide.md#integrate-binaural-in-a-2d-app) for source mapping and amplitude sliders.\n\n## Audio session\n"
332
244
  },
333
245
  {
334
- "original_markdown": "Completion marks the final scheduled step; releases and shared effect tails can remain audible. See the [event contract](../documentation/api.md#sequenceend-event).",
335
- "mirrored_markdown": "Completion marks the final scheduled step; releases and shared effect tails can remain audible. See the [event contract](../../references/api.md#sequenceend-event)."
246
+ "original_markdown": "All successive attacks run on the native sample clock. The example compiles its note-name scores to millisecond sequences with explicit `duration` and `length`, preserving the original interval and release onset. Each sequence has one of `frequencies`, MIDI `notes`, or `rest: true` per step, with sound shaping in `voice`/`overrides`. Copy the entire `example/` folder, including `lib/sequenceScore.js` and `lib/sequenceOwner.js`, into a Classic app's Resources folder.\n\nCompletion marks the final scheduled step; releases and shared effect tails can remain audible. See the [event contract](../documentation/api.md#sequenceend-event).\n\n## Statistics\n",
247
+ "mirrored_markdown": "All successive attacks run on the native sample clock. The example compiles its note-name scores to millisecond sequences with explicit `duration` and `length`, preserving the original interval and release onset. Each sequence has one of `frequencies`, MIDI `notes`, or `rest: true` per step, with sound shaping in `voice`/`overrides`. Copy the entire `example/` folder, including `lib/sequenceScore.js` and `lib/sequenceOwner.js`, into a Classic app's Resources folder.\n\nCompletion marks the final scheduled step; releases and shared effect tails can remain audible. See the [event contract](../../references/api.md#sequenceend-event).\n\n## Statistics\n"
336
248
  },
337
249
  {
338
- "original_markdown": "The panel shows active/peak/spatial/tail voices, pending commands, replacements, request/publication rejections, priority drops, callback load, stereo output peak and backend underruns. It displays `n/a` for unmeasured or unavailable values, keeping them distinct from zero. Signal windows need about 200 ms of output after enabling. Native snapshots also include RMS, limiter reduction, sample rate, buffer and latency fields; consult the [complete field reference](../documentation/api.md#getstats) when integrating a full diagnostic view.",
339
- "mirrored_markdown": "The panel shows active/peak/spatial/tail voices, pending commands, replacements, request/publication rejections, priority drops, callback load, stereo output peak and backend underruns. It displays `n/a` for unmeasured or unavailable values, keeping them distinct from zero. Signal windows need about 200 ms of output after enabling. Native snapshots also include RMS, limiter reduction, sample rate, buffer and latency fields; consult the [complete field reference](../../references/api.md#getstats) when integrating a full diagnostic view."
250
+ "original_markdown": "- RESET STATS clears accumulated statistics without stopping voices, cancelling queued work or changing the diagnostic switch. The next callback applies render-owned resets.\n\nThe panel shows active/peak/spatial/tail voices, pending commands, replacements, request/publication rejections, priority drops, callback load, stereo output peak and backend underruns. It displays `n/a` for unmeasured or unavailable values, keeping them distinct from zero. Signal windows need about 200 ms of output after enabling. Native snapshots also include RMS, limiter reduction, sample rate, buffer and latency fields; consult the [complete field reference](../documentation/api.md#getstats) when integrating a full diagnostic view.\n\nRender load divides callback elapsed time by the audio budget for that block; it does not measure total app CPU. The panel multiplies the native fraction by 100, so a reading of 1.20% means that fraction of the block budget, not 120%.\n",
251
+ "mirrored_markdown": "- RESET STATS clears accumulated statistics without stopping voices, cancelling queued work or changing the diagnostic switch. The next callback applies render-owned resets.\n\nThe panel shows active/peak/spatial/tail voices, pending commands, replacements, request/publication rejections, priority drops, callback load, stereo output peak and backend underruns. It displays `n/a` for unmeasured or unavailable values, keeping them distinct from zero. Signal windows need about 200 ms of output after enabling. Native snapshots also include RMS, limiter reduction, sample rate, buffer and latency fields; consult the [complete field reference](../../references/api.md#getstats) when integrating a full diagnostic view.\n\nRender load divides callback elapsed time by the audio budget for that block; it does not measure total app CPU. The panel multiplies the native fraction by 100, so a reading of 1.20% means that fraction of the block budget, not 120%.\n"
340
252
  },
341
253
  {
342
- "original_markdown": "2. Build the current module source, or use the matching packages supplied with the public release when available. Development archives are `android/dist/ti.synthengine-android-1.0.0.zip` and `ios/dist/ti.synthengine-iphone-1.0.0.zip`. The existing private release is a separate snapshot and may lack current features.",
343
- "mirrored_markdown": "2. Download matching official [Android 1.0.0](https://github.com/macCesar/TiSynthEngine/releases/tag/android-1.0.0) and [iOS 1.0.0](https://github.com/macCesar/TiSynthEngine/releases/tag/ios-1.0.0) packages, or build the matching module source. Source builds produce `android/dist/ti.synthengine-android-1.0.0.zip` and `ios/dist/ti.synthengine-iphone-1.0.0.zip`."
254
+ "original_markdown": "## Native attack variation\n\nThe **ATTACK VARIATION** button submits the same metal-strike recipe on each press. With `capabilities.variation === true` and `variationSchemaVersion === 1`, the renderer chooses pitch, FM depth and level once per admitted attack. Older packages receive the original recipe without the dictionary. This button uses independent timed events; the [variation guide](../documentation/native-variation.md) separately demonstrates sustained ownership and native sequence retriggers. Physical listening acceptance remains separate from host correctness checks.\n",
255
+ "mirrored_markdown": "## Native attack variation\n\nThe **ATTACK VARIATION** button submits the same metal-strike recipe on each press. With `capabilities.variation === true` and `variationSchemaVersion === 1`, the renderer chooses pitch, FM depth and level once per admitted attack. Older packages receive the original recipe without the dictionary. This button uses independent timed events; the [variation guide](../../references/native-variation.md) separately demonstrates sustained ownership and native sequence retriggers. Physical listening acceptance remains separate from host correctness checks.\n"
344
256
  }
345
257
  ],
346
- "source_sha256": "c3c5041be11c3addfab7fb1248c0aaba81b311c1720c2861e47974412d743bcf",
347
- "mirrored_sha256": "e7c522bc9a9ca52d4d103125226491c04d4a6bfab8433192a5a0dbfaef94428e"
258
+ "source_sha256": "7906f208b287d31ac400f407f4f3509b7a12041274a4629ab287eea235954518",
259
+ "mirrored_sha256": "3574027f9785936c120b502d4d9de0bea2d50bfc05e0f71624a2f8d8283e4e2e"
348
260
  },
349
261
  {
350
262
  "source": "example/app.js",
@@ -352,8 +264,8 @@
352
264
  "kind": "example-asset",
353
265
  "links": [],
354
266
  "link_fixes": [],
355
- "source_sha256": "1d121412dd2146d75d6b8c1665a28411b9e9c13e626f00284c88f3ba555f3b7e",
356
- "mirrored_sha256": "1d121412dd2146d75d6b8c1665a28411b9e9c13e626f00284c88f3ba555f3b7e"
267
+ "source_sha256": "d43fb4db53a5b792e33e45ff1425b0a9b389b2042b3bbab9ce034a11740a403e",
268
+ "mirrored_sha256": "d43fb4db53a5b792e33e45ff1425b0a9b389b2042b3bbab9ce034a11740a403e"
357
269
  },
358
270
  {
359
271
  "source": "example/lib/sequenceScore.js",
@@ -374,7 +286,7 @@
374
286
  "mirrored_sha256": "2c7a639aa9e7347872240556734165a749e4abb44f19cb14546d9ae822e1c5b3"
375
287
  },
376
288
  {
377
- "source": "documentation/bypass-physical-recheck-evidence.zip",
289
+ "source": "docs/validation/bypass-physical-recheck-evidence.zip",
378
290
  "destination": "references/bypass-physical-recheck-evidence.zip",
379
291
  "kind": "evidence-archive",
380
292
  "links": [],
@@ -383,7 +295,7 @@
383
295
  "mirrored_sha256": "910eb9eafebd7d46797192053ec7f4f9f3fc88c6bfd1b83b07acefd1e51603a2"
384
296
  },
385
297
  {
386
- "source": "documentation/frontier-android-evidence.zip",
298
+ "source": "docs/validation/frontier-android-evidence.zip",
387
299
  "destination": "references/frontier-android-evidence.zip",
388
300
  "kind": "evidence-archive",
389
301
  "links": [],
@@ -392,7 +304,7 @@
392
304
  "mirrored_sha256": "217a06978982d601ad10796865b22dbac69f202e4bf91ae07ba268734d4fef08"
393
305
  },
394
306
  {
395
- "source": "documentation/frontier-ipad-evidence.zip",
307
+ "source": "docs/validation/frontier-ipad-evidence.zip",
396
308
  "destination": "references/frontier-ipad-evidence.zip",
397
309
  "kind": "evidence-archive",
398
310
  "links": [],
@@ -401,7 +313,7 @@
401
313
  "mirrored_sha256": "56369b202d279efbf4f9a720a0a99dba2f398410cb8e042ef1200a3a63be245b"
402
314
  },
403
315
  {
404
- "source": "documentation/android-sim80-correction.json",
316
+ "source": "docs/validation/android-sim80-correction.json",
405
317
  "destination": "references/android-sim80-correction.json",
406
318
  "links": [],
407
319
  "link_fixes": [],
@@ -409,7 +321,7 @@
409
321
  "mirrored_sha256": "675c2201b9e0bfad7c8bf6255f8a9440eb45ef0a915c24eee9e47db12745a1c0"
410
322
  },
411
323
  {
412
- "source": "documentation/android-sim80-correction-evidence.zip",
324
+ "source": "docs/validation/android-sim80-correction-evidence.zip",
413
325
  "destination": "references/android-sim80-correction-evidence.zip",
414
326
  "links": [],
415
327
  "link_fixes": [],
@@ -418,7 +330,7 @@
418
330
  "kind": "evidence-archive"
419
331
  },
420
332
  {
421
- "source": "documentation/performance-review.json",
333
+ "source": "docs/validation/performance-review.json",
422
334
  "destination": "references/performance-review.json",
423
335
  "links": [],
424
336
  "link_fixes": [],
@@ -426,27 +338,126 @@
426
338
  "mirrored_sha256": "e822b3361bb5cdb31e635863d84b179ef41edfe6a1214ae99ca3a9d327d21d3a"
427
339
  },
428
340
  {
429
- "source": "documentation/performance-review-evidence.zip",
341
+ "source": "docs/validation/performance-review-evidence.zip",
430
342
  "destination": "references/performance-review-evidence.zip",
431
343
  "links": [],
432
344
  "link_fixes": [],
433
345
  "kind": "evidence-archive",
434
346
  "source_sha256": "0539e799d66ed26ef5d64f727dd30bec55692bfd691584e25753999c545b8cf6",
435
347
  "mirrored_sha256": "0539e799d66ed26ef5d64f727dd30bec55692bfd691584e25753999c545b8cf6"
348
+ },
349
+ {
350
+ "source": "documentation/audio-pipeline-validation.md",
351
+ "destination": "references/audio-pipeline-validation.md",
352
+ "source_sha256": "7359d85de63e9fe94f85477e03a22fc1531c8acaabe30333e7ff2515cc5ec3e9",
353
+ "mirrored_sha256": "1d29582c8a794c2af127fa41758017b2ee4b34383dda01713abea48649d6d83f",
354
+ "links": [],
355
+ "link_fixes": []
356
+ },
357
+ {
358
+ "source": "documentation/instruments-and-effects.md",
359
+ "destination": "references/instruments-and-effects.md",
360
+ "links": [],
361
+ "link_fixes": [],
362
+ "source_sha256": "bcd7c2191bfae2b07688c9dbe19d813fe4eb8fcc45ab38d49b29dff7bdc2981c",
363
+ "mirrored_sha256": "19ec0a2dfc97a7b42e67a57517140608973cef58ab9671b02b5e38f962bd8e45"
364
+ },
365
+ {
366
+ "source": "documentation/native-variation.md",
367
+ "destination": "references/native-variation.md",
368
+ "links": [],
369
+ "link_fixes": [
370
+ {
371
+ "original_markdown": "## Implementation and verification\n\nBoth renderers use [`shared/synth_variation.h`](../shared/synth_variation.h): stable schema slots, integer-defined SplitMix64 finalization and exact uint32-to-uniform conversion. Parsing prepares a fixed 144-byte configuration outside the audio callback. The callback performs bounded arithmetic without allocation, locks, JavaScript calls or entropy services.\n\nFocused checks cover known vectors, both native validators, attack admission, chord ordinals, sustained stability, loops, revisions, rejection and old-renderer compatibility with controlled noise initialization. [Technical verification](native-variation-validation.md) records the measured memory/callback cost and its limits. Host results do not certify physical latency or listening quality on every device.\n",
372
+ "mirrored_markdown": "## Implementation and verification\n\nBoth renderers use [`shared/synth_variation.h`](https://github.com/macCesar/TiSynthEngine/blob/433d7884800f70fb4803dbfe2e0e869cd5411889/shared/synth_variation.h): stable schema slots, integer-defined SplitMix64 finalization and exact uint32-to-uniform conversion. Parsing prepares a fixed 144-byte configuration outside the audio callback. The callback performs bounded arithmetic without allocation, locks, JavaScript calls or entropy services.\n\nFocused checks cover known vectors, both native validators, attack admission, chord ordinals, sustained stability, loops, revisions, rejection and old-renderer compatibility with controlled noise initialization. [Technical verification](native-variation-validation.md) records the measured memory/callback cost and its limits. Host results do not certify physical latency or listening quality on every device.\n"
373
+ }
374
+ ],
375
+ "source_sha256": "30bbf837a163372aa0d369c6c8e267dc8fc2d3349e8ae30c51d13d20c88cb7eb",
376
+ "mirrored_sha256": "a0a2d1878154f907df75de77c0fcf4cee45620a4b1cb3ce6d634e28d95643909"
377
+ },
378
+ {
379
+ "source": "documentation/native-variation-proposal.md",
380
+ "destination": "references/native-variation-proposal.md",
381
+ "links": [],
382
+ "link_fixes": [],
383
+ "source_sha256": "17b74434b0e03e5353b71c693d4ec722dede92fee8aed142003e67f60e158e27",
384
+ "mirrored_sha256": "94e7a31eda206cbf3a64a148ffcd9c209d1c02d633e8915f03d3ecf849fd76a0"
385
+ },
386
+ {
387
+ "source": "documentation/native-variation-validation.md",
388
+ "destination": "references/native-variation-validation.md",
389
+ "links": [],
390
+ "link_fixes": [],
391
+ "source_sha256": "df18826824984cb440d7412b547663ba6b8a7152bc347508114d7af982c90e68",
392
+ "mirrored_sha256": "005f86d02e18a404188158a5f012641c696afae311f8e264df01a1153235f36a"
436
393
  }
437
394
  ],
438
395
  "excluded_documents": [
439
396
  {
440
397
  "source": "documentation/index.md",
441
- "source_sha256": "7bdbf702ce26903d7a68e267d3451ec0bb728c822ad576393727daf4be9e039f",
398
+ "source_sha256": "6642a630d88afde29c99f82203004323b1bc017e7e47cdda8b6a3ebeb5bf9ede",
442
399
  "reason": "Upstream documentation index; SKILL.md is the distributed navigation entry point."
443
400
  },
444
401
  {
445
402
  "source": "documentation/third-party-notices.md",
446
- "source_sha256": "1ff6f3082dec146feb00d790a2abc6f1f97e2f455b2a31c0152a6faae578ddb9",
403
+ "source_sha256": "ed444257505f503d0ba3076bb14e6af251305b84b8d2832f433fd6db06ccff37",
447
404
  "reason": "Dependency and KEMAR notices remain with the official module and its binary packages; this skill redistributes documentation, not the native code or HRTF data. Re-review attribution when the source notice changes."
448
405
  }
449
406
  ],
450
407
  "source_state": "committed",
451
- "reviewed_worktree_sha256": "e4f60d0aa6d7f3d3b6a6494b1c861b99f649c6f9ec51abaf201b20f297327c95"
408
+ "api_version": "1.0.0",
409
+ "public_packages": [
410
+ {
411
+ "platform": "android",
412
+ "version": "1.0.2",
413
+ "release_url": "https://github.com/macCesar/TiSynthEngine/releases/tag/android-1.0.2",
414
+ "download_url": "https://github.com/macCesar/TiSynthEngine/releases/download/android-1.0.2/ti.synthengine-android-1.0.2.zip",
415
+ "asset_id": 690484566,
416
+ "filename": "ti.synthengine-android-1.0.2.zip",
417
+ "sha256": "8698104f188782a77699fbd6308a779ca0b190833ceebf398557b628af1b8bbe",
418
+ "downloaded_on_utc": "2026-10-30",
419
+ "crc_verified": true,
420
+ "native_unchanged_from_original_1_0_2": true,
421
+ "native_sha256": {
422
+ "modules/android/ti.synthengine/1.0.2/m2repository/ti/synthengine/1.0.2/synthengine-1.0.2.aar!jni/arm64-v8a/liboboe.so": "3f026ef84e9ca978723af18bd2b3bba2518579c1a8783358a0cb0c6d8373ad02",
423
+ "modules/android/ti.synthengine/1.0.2/m2repository/ti/synthengine/1.0.2/synthengine-1.0.2.aar!jni/arm64-v8a/libti.synthengine.so": "0c8f265ca8766df105105c709b45327214d2d71078bfad3410a753901dc63e1f",
424
+ "modules/android/ti.synthengine/1.0.2/m2repository/ti/synthengine/1.0.2/synthengine-1.0.2.aar!jni/armeabi-v7a/liboboe.so": "87f30f27fbe6a25fa58f33c0194b61a793922f2aaaa7dec654553b91cc1eedcd",
425
+ "modules/android/ti.synthengine/1.0.2/m2repository/ti/synthengine/1.0.2/synthengine-1.0.2.aar!jni/armeabi-v7a/libti.synthengine.so": "44290bab45d92c7fd04f660462c41c5ee4cb336380fc328f0d7fbb6bf3d5aa22",
426
+ "modules/android/ti.synthengine/1.0.2/m2repository/ti/synthengine/1.0.2/synthengine-1.0.2.aar!jni/x86/liboboe.so": "8c71a055a21e7a343e559d86ffed24132bd5b12a9fb2d2e510b884137980058b",
427
+ "modules/android/ti.synthengine/1.0.2/m2repository/ti/synthengine/1.0.2/synthengine-1.0.2.aar!jni/x86/libti.synthengine.so": "63b18692617296e2f39ce0c776a3c4e0599fee0329cf2793ea0c3f36de3056f3",
428
+ "modules/android/ti.synthengine/1.0.2/m2repository/ti/synthengine/1.0.2/synthengine-1.0.2.aar!jni/x86_64/liboboe.so": "590508f0697893c62def4e5223379e225dd8866c7569c56f51ecc949eab9dd06",
429
+ "modules/android/ti.synthengine/1.0.2/m2repository/ti/synthengine/1.0.2/synthengine-1.0.2.aar!jni/x86_64/libti.synthengine.so": "9f297fa73883bfdb69c0231cbc370053e1c6d9ea9daf86c4ef765da08d9e0151"
430
+ },
431
+ "corrected_html_sha256": {
432
+ "documentation/guide.html": "08a1e29461f802ff9104d7a1bd9120ce8302ce7d4ef47b5c0205a34d9e56fa7b",
433
+ "example/README.html": "32ab1906ea7de38bb3ad9eb756c75ea33c664963ac6fc5ec9fcbf22585a96ff5",
434
+ "android/README.html": "a67b18c9a2ee62ca771aae21e6f0650825ad1d0e724cf3f9a59cec09aa3d9ba6",
435
+ "ios/README.html": "b3ed190cbb3ca9022943f2f71d5e927fde7f8d8a75c2a23ab3aa51324a07a5dc"
436
+ }
437
+ },
438
+ {
439
+ "platform": "iphone",
440
+ "version": "1.0.2",
441
+ "release_url": "https://github.com/macCesar/TiSynthEngine/releases/tag/ios-1.0.2",
442
+ "download_url": "https://github.com/macCesar/TiSynthEngine/releases/download/ios-1.0.2/ti.synthengine-iphone-1.0.2.zip",
443
+ "asset_id": 690484747,
444
+ "filename": "ti.synthengine-iphone-1.0.2.zip",
445
+ "sha256": "779e77d018d5b3f686d69cb1b4b0162281803ea12691487df565c1fd15175c58",
446
+ "downloaded_on_utc": "2026-10-30",
447
+ "crc_verified": true,
448
+ "native_unchanged_from_original_1_0_2": true,
449
+ "native_sha256": {
450
+ "modules/iphone/ti.synthengine/1.0.2/ti.synthengine.xcframework/ios-arm64/libti.synthengine.a": "d1629580f952189e67976d57364370c712a63932ef04ddd0e7a8587d29e9fd15",
451
+ "modules/iphone/ti.synthengine/1.0.2/ti.synthengine.xcframework/ios-arm64_x86_64-maccatalyst/libti.synthengine.a": "1d1523a71159d85e5c1db95ced29f94c7d11b323cf0bf062a50d850954e77b56",
452
+ "modules/iphone/ti.synthengine/1.0.2/ti.synthengine.xcframework/ios-arm64_x86_64-simulator/libti.synthengine.a": "8ae3e920fd0be1e34fc444adc04e51537b225270df2cb4c48115695661ded4e1"
453
+ },
454
+ "corrected_html_sha256": {
455
+ "documentation/guide.html": "08a1e29461f802ff9104d7a1bd9120ce8302ce7d4ef47b5c0205a34d9e56fa7b",
456
+ "example/README.html": "32ab1906ea7de38bb3ad9eb756c75ea33c664963ac6fc5ec9fcbf22585a96ff5",
457
+ "android/README.html": "a67b18c9a2ee62ca771aae21e6f0650825ad1d0e724cf3f9a59cec09aa3d9ba6",
458
+ "ios/README.html": "b3ed190cbb3ca9022943f2f71d5e927fde7f8d8a75c2a23ab3aa51324a07a5dc"
459
+ }
460
+ }
461
+ ],
462
+ "published_version": "1.0.2"
452
463
  }