@maccesar/titools 5.1.1 → 5.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/CONTRIBUTING.md +69 -0
  2. package/README.md +112 -72
  3. package/agents/ti-pro.md +5 -1
  4. package/commands/ti-audit.md +5 -1
  5. package/docs/examples.md +91 -0
  6. package/docs/knowledge-index.md +57 -0
  7. package/lib/config.js +2 -0
  8. package/lib/downloader.js +1 -1
  9. package/package.json +4 -2
  10. package/skills/purgetss/references/multi-density-images.md +1 -1
  11. package/skills/ti-admob-unified/SKILL.md +58 -0
  12. package/skills/ti-admob-unified/agents/openai.yaml +4 -0
  13. package/skills/ti-admob-unified/assets/example/app.js +1207 -0
  14. package/skills/ti-admob-unified/assets/example/lib/ads.js +646 -0
  15. package/skills/ti-admob-unified/assets/example/library-usage.js +136 -0
  16. package/skills/ti-admob-unified/references/api-reference.md +615 -0
  17. package/skills/ti-admob-unified/references/banners.md +435 -0
  18. package/skills/ti-admob-unified/references/contributing.md +233 -0
  19. package/skills/ti-admob-unified/references/dependencies.md +91 -0
  20. package/skills/ti-admob-unified/references/fullscreen.md +238 -0
  21. package/skills/ti-admob-unified/references/game-monetization.md +148 -0
  22. package/skills/ti-admob-unified/references/getting-started.md +319 -0
  23. package/skills/ti-admob-unified/references/index.md +33 -0
  24. package/skills/ti-admob-unified/references/integration.md +87 -0
  25. package/skills/ti-admob-unified/references/library.md +220 -0
  26. package/skills/ti-admob-unified/references/mediation-parity.md +17 -0
  27. package/skills/ti-admob-unified/references/mediation.md +145 -0
  28. package/skills/ti-admob-unified/references/migration.md +259 -0
  29. package/skills/ti-admob-unified/references/module-changelog.md +84 -0
  30. package/skills/ti-admob-unified/references/module-license.txt +21 -0
  31. package/skills/ti-admob-unified/references/privacy.md +281 -0
  32. package/skills/ti-admob-unified/references/production.md +67 -0
  33. package/skills/ti-admob-unified/references/rewarded-interstitial.md +101 -0
  34. package/skills/ti-admob-unified/references/roadmap.md +143 -0
  35. package/skills/ti-admob-unified/references/source-notes.md +80 -0
  36. package/skills/ti-admob-unified/references/source-snapshot.json +644 -0
  37. package/skills/ti-admob-unified/references/third-party-notices.md +22 -0
  38. package/skills/ti-game/SKILL.md +31 -5
  39. package/skills/ti-game/references/api.md +36 -24
  40. package/skills/ti-game/references/debugging-performance.md +22 -7
  41. package/skills/ti-game/references/examples.md +113 -20
  42. package/skills/ti-game/references/input.md +101 -0
  43. package/skills/ti-game/references/patterns.md +56 -10
  44. package/skills/ti-game/references/physics.md +530 -0
  45. package/skills/ti-game/references/project-setup.md +131 -47
  46. package/skills/ti-game/references/recipes-action.md +149 -18
  47. package/skills/ti-game/references/recipes-adventure-effects.md +47 -4
  48. package/skills/ti-game/references/roadmap.md +11 -4
  49. package/skills/ti-game/references/source-notes.md +81 -0
  50. package/skills/ti-game/references/tilemaps.md +13 -4
  51. package/skills/ti-game-assets/SKILL.md +53 -0
  52. package/skills/ti-game-assets/agents/openai.yaml +4 -0
  53. package/skills/ti-game-assets/references/alpha.md +26 -0
  54. package/skills/ti-game-assets/references/art-direction.md +37 -0
  55. package/skills/ti-game-assets/references/integration.md +49 -0
  56. package/skills/ti-game-assets/references/manifest.example.json +429 -0
  57. package/skills/ti-game-assets/references/manifest.md +39 -0
  58. package/skills/ti-game-assets/references/offline-audio.md +33 -0
  59. package/skills/ti-game-assets/references/prompts.md +33 -0
  60. package/skills/ti-game-assets/references/repeating-textures.md +17 -0
  61. package/skills/ti-game-assets/references/responsible-ads.md +31 -0
  62. package/skills/ti-game-assets/references/sound-assets.md +42 -0
  63. package/skills/ti-game-assets/references/vector-sources.md +21 -0
  64. package/skills/ti-game-assets/scripts/alpha_tools.py +160 -0
  65. package/skills/ti-game-assets/scripts/requirements.txt +1 -0
  66. package/skills/ti-game-assets/scripts/validate_manifest.py +267 -0
  67. package/skills/ti-synthengine/SKILL.md +77 -67
  68. package/skills/ti-synthengine/assets/example/README.md +84 -0
  69. package/skills/ti-synthengine/assets/example/app.js +1178 -0
  70. package/skills/ti-synthengine/assets/example/lib/sequenceOwner.js +83 -0
  71. package/skills/ti-synthengine/assets/example/lib/sequenceScore.js +25 -0
  72. package/skills/ti-synthengine/references/advanced-examples.md +174 -0
  73. package/skills/ti-synthengine/references/android-sim80-correction-evidence.zip +0 -0
  74. package/skills/ti-synthengine/references/android-sim80-correction.json +162 -0
  75. package/skills/ti-synthengine/references/api.md +573 -153
  76. package/skills/ti-synthengine/references/audio-engine.md +272 -124
  77. package/skills/ti-synthengine/references/bypass-physical-recheck-evidence.zip +0 -0
  78. package/skills/ti-synthengine/references/examples.md +355 -106
  79. package/skills/ti-synthengine/references/frontier-android-evidence.zip +0 -0
  80. package/skills/ti-synthengine/references/frontier-ipad-evidence.zip +0 -0
  81. package/skills/ti-synthengine/references/frontier-physical-validation.json +1918 -0
  82. package/skills/ti-synthengine/references/guide.md +426 -75
  83. package/skills/ti-synthengine/references/performance-review-evidence.zip +0 -0
  84. package/skills/ti-synthengine/references/performance-review.json +1146 -0
  85. package/skills/ti-synthengine/references/physical-validation.json +1457 -0
  86. package/skills/ti-synthengine/references/recipes-interaction.md +549 -0
  87. package/skills/ti-synthengine/references/recipes.md +434 -420
  88. package/skills/ti-synthengine/references/recommendations.md +72 -85
  89. package/skills/ti-synthengine/references/sound-design.md +375 -155
  90. package/skills/ti-synthengine/references/source-notes.md +109 -0
  91. package/skills/ti-synthengine/references/source-snapshot.json +452 -0
  92. package/skills/ti-synthengine/references/stats-performance.json +2992 -0
  93. package/skills/ti-synthengine/references/stats-performance.md +82 -0
  94. package/skills/ti-synthengine/references/studio-validation.json +6202 -0
  95. package/skills/ti-synthengine/references/troubleshooting.md +123 -78
  96. package/skills/ti-synthengine/references/unified-bypass-performance.json +22425 -0
  97. package/skills/ti-synthengine/references/unified-validation.json +314 -0
  98. package/AGENTS-VERCEL-RESEARCH.md +0 -175
@@ -0,0 +1,109 @@
1
+ # Maintaining the synthesis snapshot
2
+
3
+ These references mirror the **public TiSynthEngine 1.0.0 release** at
4
+ `e7cbbe8a6f9ab38088fd8029c7b43cef6501101f`, recorded in
5
+ [source-snapshot.json](source-snapshot.json). The clean local checkout and remote
6
+ main matched that commit on 2026-10-24. The repository is public; the Android
7
+ and iOS releases are published, neither draft nor prerelease. Module availability
8
+ is independent of publishing a new TiTools version.
9
+
10
+ ## Public downloads and artifact provenance
11
+
12
+ | Platform | Published release | Package SHA-256 |
13
+ | --- | --- | --- |
14
+ | Android | [android-1.0.0](https://github.com/macCesar/TiSynthEngine/releases/tag/android-1.0.0) | `cf3510f290eca6dd00e8e0742a7db4f09dd2b8c4ef9270ed1f34d30eb32389cf` |
15
+ | iOS / Mac Catalyst | [ios-1.0.0](https://github.com/macCesar/TiSynthEngine/releases/tag/ios-1.0.0) | `bc2e3f88c2945df721dd2196dfbb852c64aa98954b04460adf56ca41c75e6e91` |
16
+
17
+ Both platform tags and `v1.0.0` point at the reviewed commit; only the two
18
+ platform tags have GitHub release pages. Downloaded ZIPs were independently
19
+ hashed and inspected: module ID `ti.synthengine`, version `1.0.0`, minimum
20
+ Titanium `13.2.0.GA`; Android includes four ABIs and the Apple manifest enables
21
+ Mac Catalyst. See the [guide](guide.md) for Android API35 and iOS15 requirements,
22
+ app-root ZIP installation and both `tiapp.xml` declarations. These checks do not
23
+ constitute a fresh device installation or audio acceptance run.
24
+
25
+ ## Sources and permitted transformations
26
+
27
+ Eight official Markdown documents are mirrored into nine parts, including the
28
+ ordered examples/advanced-examples split. The current snapshot inventories all
29
+ complete JSON reports, bundled example assets and linked raw-evidence archives.
30
+ The new [performance review](performance-review.json) and its raw archive are
31
+ preserved alongside historical reports; none is replaced by a favorable summary.
32
+ Read snapshot records for exact counts and hashes. Example JavaScript and raw
33
+ reports/archives remain byte-identical to source.
34
+
35
+ Each Markdown part and the example README have a local-commit provenance header and recorded navigation transformations. Native-backed corrections to stale official prose are also declared as reversible `link_fixes`; the source hash still identifies the original official text, not the corrected mirror. Reversible `link_fixes` rebase links into the split advanced examples, preserve [curated recipes](recipes.md), and resolve current example links to bundled assets. The example README points back to this skill's current API and guides. All three example JavaScript files remain byte-identical to source; none requires a historical GitHub snapshot.
36
+
37
+ The fidelity regression strips provenance/navigation, concatenates example parts, reverses declared transformations and compares the complete source hash. Raw records must remain byte-identical. Update transformations intentionally; never change hashes merely to hide unexplained source drift.
38
+
39
+ ## Protected curated content
40
+
41
+ [Retro recipes](recipes.md) and [interaction/instrument recipes](recipes-interaction.md) are TiTools contributions. Preserve their acoustic intent, lifecycle ownership and entry links when upstream docs change. Their native sequence examples keep the original millisecond onsets and total envelopes through separate `duration` and `length`; no JavaScript timer schedules notes. The repeated chord is now one centered native chord sequence; the separate one-off layered chord retains its per-voice stereo pans.
42
+
43
+ Focused executable recipe tests inspect submitted intervals, envelope lengths, pitch and cancellation IDs. They do not render audio or measure native callback timing.
44
+
45
+ ## Current contract and acceptance boundaries
46
+
47
+ `start` configures one engine, up to 32 shared voices and one to four preallocated sequence slots. `playSequence` is the only successive-sound scheduler and returns a positive ID or zero. Sequence edits, state queries and cancellation name that ID. Global `setTempo` governs beat timing and synchronized modulation; millisecond sequences retain fixed times. Finite playback is the default, and circular patterns explicitly opt into looping.
48
+
49
+ Selective `music`, `effects`, `ui` and `ambience` categories feed one shared effect chain; an explicit per-voice send overrides category selection. Live spatial position, noise clock, low-pass cutoff and compatible continuous voice controls ramp over 10 ms while preserving history. Priorities protect higher-priority voices without reserved quotas. See the [API](api.md) for exact limits, source compatibility, return values and event delivery.
50
+
51
+ The [performance review](performance-review.json) documents the accepted
52
+ control-thread changes: partial sequence-bank preparation and removal of idle
53
+ allocations/orphan held-position metadata. The Apple rendering bundle was
54
+ rejected after a physical stereo regression, and production returned to the
55
+ stable callback. Earlier candidate timings and fidelity checks remain evidence
56
+ of that rejected candidate, not a promised Apple render speedup. Current matched
57
+ Apple bypass measurements and actual hardware/rate/block-size scope are in the
58
+ report; global performance acceptance remains open.
59
+
60
+ Historical statistics, Studio/unified transport, physical/Frontier measurements
61
+ and Android FIR8 correction reports keep their original artifact and acceptance
62
+ boundaries. The short Android Sim80 headphone result had zero backend xruns and
63
+ accepted listening; it does not close the distinct ten-minute maximum-load,
64
+ bypass, memory and strict Frontier presentation criteria. Current evidence and
65
+ rejected candidates must not be combined into a general pass. This skill update
66
+ did not rerun devices, install binaries or alter native source.
67
+
68
+ The October 23 native findings were independently rechecked against the
69
+ published source on October 24. These current differences remain explicit;
70
+ hash fidelity alone cannot establish them:
71
+
72
+ - iOS timed tone/chord command construction still rounds accepted zero attack
73
+ and release to at least one sample; Android preserves zero. Validator
74
+ acceptance does not establish identical sample envelopes.
75
+ - iOS early tempo/sequence/processing rejections and incompatible held spatial/
76
+ modulation edits can bypass rejection counters. Android also leaves some
77
+ unknown/retired sequence-stop returns uncounted. The recorded reason sum is
78
+ consistent with recorded totals, not a complete API-call rejection tally.
79
+ - Sequence cutoff coefficients currently refresh every 16 samples on Android
80
+ and every 8 samples on Apple; both use note length but do not promise identical
81
+ sample output. See [engine details](audio-engine.md).
82
+ - Android `getDefaults()` includes capabilities and additional limit metadata
83
+ that the current iOS dictionary omits. Both expose the corresponding APIs;
84
+ detect methods rather than requiring Android-only metadata flags. Sequence
85
+ intervals use different beat and millisecond ranges; see [API](api.md).
86
+ - Remaining stale official claims are corrected only where verified against
87
+ current native behavior, with exact reversible transformations. Corrections
88
+ already adopted upstream are removed from the transformation list.
89
+
90
+
91
+ These findings are skill corrections and module implementation findings, not
92
+ native fixes. No module code, public range or hardware acceptance was changed.
93
+ A validator corpus establishes accepted/rejected dictionaries, not sample-identical
94
+ rendering on a physical device. Consumer scenarios and exact native locators
95
+ are recorded in the maintainer's October 23 audit evidence.
96
+
97
+ ## Upstream documents outside the mirror set
98
+
99
+ The official index is replaced by this skill's task routing. Dependency/license notices remain in the official module and binary packages. Both are recorded with hashes and reasons in `excluded_documents`, so changed or newly added documents still require review.
100
+
101
+ ## Verification after a reviewed update
102
+
103
+ Run the focused mirror/link and recipe tests, then:
104
+
105
+ ```sh
106
+ node scripts/verify-module-snapshot.mjs --source /path/to/TiSynthEngine --skill ti-synthengine
107
+ ```
108
+
109
+ The verifier checks source/mirror hashes, exclusions, new documents, base HEAD and the exact tracked/untracked worktree fingerprint. Refresh that fingerprint only after the source changes are finished. No npm version, publication or native-device acceptance follows from this procedure.
@@ -0,0 +1,452 @@
1
+ {
2
+ "module": "ti.synthengine",
3
+ "version": "1.0.0",
4
+ "repository": "https://github.com/macCesar/TiSynthEngine",
5
+ "commit": "e7cbbe8a6f9ab38088fd8029c7b43cef6501101f",
6
+ "reviewed_on": "2026-10-24",
7
+ "files": [
8
+ {
9
+ "source": "documentation/api.md",
10
+ "destination": "references/api.md",
11
+ "source_sha256": "698d272a85e71692eb5de30586556e53ba19aea88de3b0e583c2d720b150f24b",
12
+ "mirrored_sha256": "f4d43d6e947ccfa5cd04f2f76b4b19a00372f9ce1045c155f8265867839bae34",
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
+ ]
52
+ },
53
+ {
54
+ "source": "documentation/audio-engine.md",
55
+ "destination": "references/audio-engine.md",
56
+ "source_sha256": "2299982e6949f6f2efe7ddad6cc4d28ea1b54e0f31fff36617e0528c5823ac4d",
57
+ "mirrored_sha256": "1927993a7b8ebd5abc735d2cf124f45b96ae461e4fc3f9342ae5e62137d491fe",
58
+ "links": [],
59
+ "link_fixes": [
60
+ {
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."
67
+ },
68
+ {
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)."
71
+ }
72
+ ]
73
+ },
74
+ {
75
+ "source": "documentation/examples.md",
76
+ "destination": "references/examples.md",
77
+ "source_sha256": "48104b9d413050d439ee605c92a2456a50b42c4c80e2d7c2c05706eecc7db215",
78
+ "mirrored_sha256": "100e1576be75f98201fea8ff0ba599a9582a98c8a3a1469aa2b206eeacfeafde",
79
+ "links": [],
80
+ "link_fixes": [
81
+ {
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."
84
+ },
85
+ {
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."
88
+ },
89
+ {
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)."
92
+ },
93
+ {
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 })`."
104
+ }
105
+ ],
106
+ "source_parts": [
107
+ "references/examples.md",
108
+ "references/advanced-examples.md"
109
+ ]
110
+ },
111
+ {
112
+ "source": "documentation/examples.md",
113
+ "destination": "references/advanced-examples.md",
114
+ "source_sha256": "48104b9d413050d439ee605c92a2456a50b42c4c80e2d7c2c05706eecc7db215",
115
+ "mirrored_sha256": "3852693b9faa70d615d9cf0bd4720055532d850f55e1e7b9c6a1a31115dc0639",
116
+ "links": [],
117
+ "link_fixes": [],
118
+ "source_parts": [
119
+ "references/examples.md",
120
+ "references/advanced-examples.md"
121
+ ]
122
+ },
123
+ {
124
+ "source": "documentation/guide.md",
125
+ "destination": "references/guide.md",
126
+ "source_sha256": "dd03392e1d5f89e520f4be70dab2fbad8e86776bf3a60d6af93f0dc0695c8c69",
127
+ "mirrored_sha256": "dd6a9ac277f22f965db20dbbd47c82a676600ceedc174cbe0c7dc4a6a0ca3152",
128
+ "links": [],
129
+ "link_fixes": [
130
+ {
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."
153
+ },
154
+ {
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."
157
+ },
158
+ {
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."
161
+ },
162
+ {
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."
165
+ }
166
+ ]
167
+ },
168
+ {
169
+ "source": "documentation/recommendations.md",
170
+ "destination": "references/recommendations.md",
171
+ "source_sha256": "206593e03b860b2d1c39316bf286cd276307bdb0120be050c262b21749bcccd8",
172
+ "mirrored_sha256": "d574b349ab54e4e176f24075e1a04b826784c1908ab69db6d7b8725b5ceae431",
173
+ "links": [],
174
+ "link_fixes": [
175
+ {
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."
190
+ }
191
+ ]
192
+ },
193
+ {
194
+ "source": "documentation/sound-design.md",
195
+ "destination": "references/sound-design.md",
196
+ "source_sha256": "dd543e07c825aaf67a0a5f85619088a8d02721a9d33dbf4579edf760dad3e262",
197
+ "mirrored_sha256": "f2e2207eeaae5e8061b37dfb5fac98ef9b9c050845b23a547b468ceba718e740",
198
+ "links": [],
199
+ "link_fixes": [
200
+ {
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."
207
+ },
208
+ {
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."
211
+ },
212
+ {
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."
215
+ }
216
+ ]
217
+ },
218
+ {
219
+ "source": "documentation/troubleshooting.md",
220
+ "destination": "references/troubleshooting.md",
221
+ "source_sha256": "939960cde5860569699916208c0d3b352e60ba2a7603b5046dcefa9970294b70",
222
+ "mirrored_sha256": "70ee69508273b3c89d52a8c8feb6c58400433a5a50e298e38da5076ded19a8a8",
223
+ "links": [],
224
+ "link_fixes": [
225
+ {
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."
228
+ },
229
+ {
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
+ },
237
+ {
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."
240
+ },
241
+ {
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."
244
+ },
245
+ {
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."
248
+ },
249
+ {
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."
252
+ },
253
+ {
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."
256
+ }
257
+ ]
258
+ },
259
+ {
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",
269
+ "destination": "references/stats-performance.json",
270
+ "source_sha256": "bd0cf07295d0d8f1120e66f527e9ca6d9a014efdc43dff5675716e8e26abe5b3",
271
+ "mirrored_sha256": "bd0cf07295d0d8f1120e66f527e9ca6d9a014efdc43dff5675716e8e26abe5b3",
272
+ "links": [],
273
+ "link_fixes": []
274
+ },
275
+ {
276
+ "source": "documentation/studio-validation.json",
277
+ "destination": "references/studio-validation.json",
278
+ "source_sha256": "b6abcf9229b8bb812cb4da467e3c495ab66c41041fb7562ca3c371d79671509b",
279
+ "mirrored_sha256": "b6abcf9229b8bb812cb4da467e3c495ab66c41041fb7562ca3c371d79671509b",
280
+ "links": [],
281
+ "link_fixes": []
282
+ },
283
+ {
284
+ "source": "documentation/unified-bypass-performance.json",
285
+ "destination": "references/unified-bypass-performance.json",
286
+ "source_sha256": "12622f00804bd866be90ac40579b868e8f6fcbd35635bf8000febb21adef2563",
287
+ "mirrored_sha256": "12622f00804bd866be90ac40579b868e8f6fcbd35635bf8000febb21adef2563",
288
+ "links": [],
289
+ "link_fixes": []
290
+ },
291
+ {
292
+ "source": "documentation/unified-validation.json",
293
+ "destination": "references/unified-validation.json",
294
+ "source_sha256": "4754da69159f4ab35544d0f0a8ef6e5568dda9e74162b1c2dad2bb807d905fd8",
295
+ "mirrored_sha256": "4754da69159f4ab35544d0f0a8ef6e5568dda9e74162b1c2dad2bb807d905fd8",
296
+ "links": [],
297
+ "link_fixes": []
298
+ },
299
+ {
300
+ "source": "documentation/physical-validation.json",
301
+ "destination": "references/physical-validation.json",
302
+ "links": [],
303
+ "link_fixes": [],
304
+ "source_sha256": "73233c11a1d2aa06654a06486ef52a08d961473d83b0c5b2a44e19a6eac28c0b",
305
+ "mirrored_sha256": "73233c11a1d2aa06654a06486ef52a08d961473d83b0c5b2a44e19a6eac28c0b"
306
+ },
307
+ {
308
+ "source": "documentation/frontier-physical-validation.json",
309
+ "destination": "references/frontier-physical-validation.json",
310
+ "links": [],
311
+ "link_fixes": [],
312
+ "source_sha256": "e64c6b853c6a648bb6ce74ca13f27db30c93f5e1a2b89a495d439dedf8bc1d9d",
313
+ "mirrored_sha256": "e64c6b853c6a648bb6ce74ca13f27db30c93f5e1a2b89a495d439dedf8bc1d9d"
314
+ },
315
+ {
316
+ "source": "example/README.md",
317
+ "destination": "assets/example/README.md",
318
+ "kind": "example-asset",
319
+ "links": [],
320
+ "link_fixes": [
321
+ {
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."
324
+ },
325
+ {
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)."
328
+ },
329
+ {
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."
332
+ },
333
+ {
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)."
336
+ },
337
+ {
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."
340
+ },
341
+ {
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`."
344
+ }
345
+ ],
346
+ "source_sha256": "c3c5041be11c3addfab7fb1248c0aaba81b311c1720c2861e47974412d743bcf",
347
+ "mirrored_sha256": "e7c522bc9a9ca52d4d103125226491c04d4a6bfab8433192a5a0dbfaef94428e"
348
+ },
349
+ {
350
+ "source": "example/app.js",
351
+ "destination": "assets/example/app.js",
352
+ "kind": "example-asset",
353
+ "links": [],
354
+ "link_fixes": [],
355
+ "source_sha256": "1d121412dd2146d75d6b8c1665a28411b9e9c13e626f00284c88f3ba555f3b7e",
356
+ "mirrored_sha256": "1d121412dd2146d75d6b8c1665a28411b9e9c13e626f00284c88f3ba555f3b7e"
357
+ },
358
+ {
359
+ "source": "example/lib/sequenceScore.js",
360
+ "destination": "assets/example/lib/sequenceScore.js",
361
+ "kind": "example-asset",
362
+ "links": [],
363
+ "link_fixes": [],
364
+ "source_sha256": "636c20d4ba81affc087b96cc70443798e7a473a47d6dda6820c60362fe81d60f",
365
+ "mirrored_sha256": "636c20d4ba81affc087b96cc70443798e7a473a47d6dda6820c60362fe81d60f"
366
+ },
367
+ {
368
+ "source": "example/lib/sequenceOwner.js",
369
+ "destination": "assets/example/lib/sequenceOwner.js",
370
+ "kind": "example-asset",
371
+ "links": [],
372
+ "link_fixes": [],
373
+ "source_sha256": "2c7a639aa9e7347872240556734165a749e4abb44f19cb14546d9ae822e1c5b3",
374
+ "mirrored_sha256": "2c7a639aa9e7347872240556734165a749e4abb44f19cb14546d9ae822e1c5b3"
375
+ },
376
+ {
377
+ "source": "documentation/bypass-physical-recheck-evidence.zip",
378
+ "destination": "references/bypass-physical-recheck-evidence.zip",
379
+ "kind": "evidence-archive",
380
+ "links": [],
381
+ "link_fixes": [],
382
+ "source_sha256": "910eb9eafebd7d46797192053ec7f4f9f3fc88c6bfd1b83b07acefd1e51603a2",
383
+ "mirrored_sha256": "910eb9eafebd7d46797192053ec7f4f9f3fc88c6bfd1b83b07acefd1e51603a2"
384
+ },
385
+ {
386
+ "source": "documentation/frontier-android-evidence.zip",
387
+ "destination": "references/frontier-android-evidence.zip",
388
+ "kind": "evidence-archive",
389
+ "links": [],
390
+ "link_fixes": [],
391
+ "source_sha256": "217a06978982d601ad10796865b22dbac69f202e4bf91ae07ba268734d4fef08",
392
+ "mirrored_sha256": "217a06978982d601ad10796865b22dbac69f202e4bf91ae07ba268734d4fef08"
393
+ },
394
+ {
395
+ "source": "documentation/frontier-ipad-evidence.zip",
396
+ "destination": "references/frontier-ipad-evidence.zip",
397
+ "kind": "evidence-archive",
398
+ "links": [],
399
+ "link_fixes": [],
400
+ "source_sha256": "56369b202d279efbf4f9a720a0a99dba2f398410cb8e042ef1200a3a63be245b",
401
+ "mirrored_sha256": "56369b202d279efbf4f9a720a0a99dba2f398410cb8e042ef1200a3a63be245b"
402
+ },
403
+ {
404
+ "source": "documentation/android-sim80-correction.json",
405
+ "destination": "references/android-sim80-correction.json",
406
+ "links": [],
407
+ "link_fixes": [],
408
+ "source_sha256": "675c2201b9e0bfad7c8bf6255f8a9440eb45ef0a915c24eee9e47db12745a1c0",
409
+ "mirrored_sha256": "675c2201b9e0bfad7c8bf6255f8a9440eb45ef0a915c24eee9e47db12745a1c0"
410
+ },
411
+ {
412
+ "source": "documentation/android-sim80-correction-evidence.zip",
413
+ "destination": "references/android-sim80-correction-evidence.zip",
414
+ "links": [],
415
+ "link_fixes": [],
416
+ "source_sha256": "faff448de458ef0cb5299e234177f17a914f7801c27581ab969a9010a68c3c5f",
417
+ "mirrored_sha256": "faff448de458ef0cb5299e234177f17a914f7801c27581ab969a9010a68c3c5f",
418
+ "kind": "evidence-archive"
419
+ },
420
+ {
421
+ "source": "documentation/performance-review.json",
422
+ "destination": "references/performance-review.json",
423
+ "links": [],
424
+ "link_fixes": [],
425
+ "source_sha256": "e822b3361bb5cdb31e635863d84b179ef41edfe6a1214ae99ca3a9d327d21d3a",
426
+ "mirrored_sha256": "e822b3361bb5cdb31e635863d84b179ef41edfe6a1214ae99ca3a9d327d21d3a"
427
+ },
428
+ {
429
+ "source": "documentation/performance-review-evidence.zip",
430
+ "destination": "references/performance-review-evidence.zip",
431
+ "links": [],
432
+ "link_fixes": [],
433
+ "kind": "evidence-archive",
434
+ "source_sha256": "0539e799d66ed26ef5d64f727dd30bec55692bfd691584e25753999c545b8cf6",
435
+ "mirrored_sha256": "0539e799d66ed26ef5d64f727dd30bec55692bfd691584e25753999c545b8cf6"
436
+ }
437
+ ],
438
+ "excluded_documents": [
439
+ {
440
+ "source": "documentation/index.md",
441
+ "source_sha256": "7bdbf702ce26903d7a68e267d3451ec0bb728c822ad576393727daf4be9e039f",
442
+ "reason": "Upstream documentation index; SKILL.md is the distributed navigation entry point."
443
+ },
444
+ {
445
+ "source": "documentation/third-party-notices.md",
446
+ "source_sha256": "1ff6f3082dec146feb00d790a2abc6f1f97e2f455b2a31c0152a6faae578ddb9",
447
+ "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
+ }
449
+ ],
450
+ "source_state": "committed",
451
+ "reviewed_worktree_sha256": "e4f60d0aa6d7f3d3b6a6494b1c861b99f649c6f9ec51abaf201b20f297327c95"
452
+ }