@maccesar/titools 5.2.3 → 5.2.5

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 (26) hide show
  1. package/README.md +96 -87
  2. package/docs/examples.md +10 -3
  3. package/package.json +2 -2
  4. package/skills/ti-synthengine/SKILL.md +50 -18
  5. package/skills/ti-synthengine/assets/example/README.md +19 -6
  6. package/skills/ti-synthengine/assets/example/app.js +69 -12
  7. package/skills/ti-synthengine/assets/index.d.ts +106 -0
  8. package/skills/ti-synthengine/references/advanced-examples.md +34 -9
  9. package/skills/ti-synthengine/references/api.md +327 -246
  10. package/skills/ti-synthengine/references/audio-engine.md +28 -14
  11. package/skills/ti-synthengine/references/audio-pipeline-validation.md +1 -1
  12. package/skills/ti-synthengine/references/examples.md +5 -5
  13. package/skills/ti-synthengine/references/guide.md +40 -21
  14. package/skills/ti-synthengine/references/instruments-and-effects.md +164 -0
  15. package/skills/ti-synthengine/references/native-tone-repetition-validation.md +59 -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 +285 -0
  19. package/skills/ti-synthengine/references/recipes-interaction.md +3 -1
  20. package/skills/ti-synthengine/references/recipes.md +3 -2
  21. package/skills/ti-synthengine/references/recommendations.md +5 -5
  22. package/skills/ti-synthengine/references/sound-design.md +18 -16
  23. package/skills/ti-synthengine/references/source-notes.md +54 -37
  24. package/skills/ti-synthengine/references/source-snapshot.json +188 -144
  25. package/skills/ti-synthengine/references/stats-performance.md +1 -1
  26. package/skills/ti-synthengine/references/troubleshooting.md +43 -35
@@ -1,83 +1,50 @@
1
1
  {
2
2
  "module": "ti.synthengine",
3
- "version": "1.0.2",
3
+ "version": "1.1.0",
4
4
  "repository": "https://github.com/macCesar/TiSynthEngine",
5
- "commit": "4a45f21230ffc5a8838fbd5fc108dd3ab470362a",
6
- "reviewed_on": "2026-10-29",
5
+ "commit": "ec04f4e634075c41b55f66279eabcd78b9652d58",
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": "0eae9bb5d07500fd33a9b767bd0036a491a2947954cd5c3b7fa51035ba375857",
12
- "mirrored_sha256": "051a499208a68078f2cfb6e7293f8abfac539c6b0156d9d1291beedc0d341ae6",
11
+ "source_sha256": "b58d60cf38a96157e523722d1f9cb9508f785cc2de9c2c1ff306e328c77df9dc",
12
+ "mirrored_sha256": "b19142e8356eb80f62202bdf3bdd9c2fa0301ae205761e89f0f9dab981c26fb2",
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.stepDurationMs`. The reviewed iOS result omits those two metadata entries while implementing the corresponding methods and millisecond sequences. Both platforms report `limits.maxSequences`, `limits.priority` and `limits.effectSend`. 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": "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.",
29
- "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."
30
- },
31
- {
32
- "original_markdown": "| `rejectedRequestCount` | Rejected Boolean API requests, counted once per call. |",
33
- "mirrored_markdown": "| `rejectedRequestCount` | Counted API rejections, including sequence-publication rejection; not a complete rejected-call tally on every native path. |"
34
- },
35
- {
36
- "original_markdown": "| `rejectedRequestsByReason` | `{ validation, engineStopped, queueFull }`; sum equals rejection total. |",
37
- "mirrored_markdown": "| `rejectedRequestsByReason` | `{ validation, engineStopped, queueFull }`; sum equals the recorded rejection total. |"
38
- },
39
- {
40
- "original_markdown": "`renderLoad`, `peakRenderLoad`, `outputPeakDbFS`, `outputRmsDbFS`, `preLimiterPeakDb`, `maxLimiterReductionDb` and `limiterReductionDb` are `null` until enabled and measured, and after shutdown.",
41
- "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."
42
- },
43
- {
44
- "original_markdown": "With a full pool, release voices are replaced first, then the oldest attack.",
45
- "mirrored_markdown": "Within priority-eligible candidates in a full pool, release voices are replaced first, then the oldest attack."
46
- }
47
- ]
14
+ "link_fixes": []
48
15
  },
49
16
  {
50
17
  "source": "documentation/audio-engine.md",
51
18
  "destination": "references/audio-engine.md",
52
- "source_sha256": "17fb01f7e32a91cc44a3b5c0f30efcd7b5c3d9ec6c49369f7c789e1f22a8b442",
53
- "mirrored_sha256": "30f14c5cc7b296e708bdb06b84e6d32475abbf7827af587466b9fdaf86bc8547",
19
+ "source_sha256": "3e7728703a9f82631f5c4ba2641b1a9735c0d3988ef9001b8e4a4f5e47d1818d",
20
+ "mirrored_sha256": "a43c94c7f72913438d529a1cbd8a13dcb6df0da317ee548b5064fdf587f7f5ab",
54
21
  "links": [],
55
22
  "link_fixes": [
56
23
  {
57
- "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.",
58
- "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."
59
- },
60
- {
61
- "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.",
62
- "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 [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.",
25
+ "mirrored_markdown": "The [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."
63
26
  },
64
27
  {
65
- "original_markdown": "No physical-device ten-minute maximum-load acceptance is claimed by these API changes.",
66
- "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": "The [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.",
29
+ "mirrored_markdown": "The [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."
67
30
  },
68
31
  {
69
- "original_markdown": "`tools/build_ios_render_host.py` compiles the actual Objective-C render-block body and voice/transport helpers on macOS. It replaces hardware/session/Titanium startup and fixes only the noise-seed/disabled-diagnostic clock. Output and semantic state are compared against a separately archived reference from the same platform. This is an Apple renderer test; it does not execute AVAudioEngine or establish iPad scheduling, route recovery, footprint or listening acceptance.",
70
- "mirrored_markdown": "`tools/build_ios_render_host.py` compiles the actual Objective-C render-block body and voice/transport helpers on macOS. It replaces hardware/session/Titanium startup and fixes only the noise-seed/disabled-diagnostic clock. Output and semantic state are compared against a separately archived reference from the same platform. This is an Apple renderer test; it does not execute AVAudioEngine or establish iPad scheduling, route recovery, footprint or listening acceptance.\n\nThe commands below reproduce the historical pre-pipeline performance review. Use its archived candidate source when requiring exact PCM/state equality with `7ab3110`; the current 1.0.2 renderer intentionally removes the old final-output delay and changes overload behavior, so it cannot satisfy that earlier exact-output comparison. For the later correction, use the [audio pipeline validation](audio-pipeline-validation.md) protocol: align only the former output delay, compare no-overload PCM within the declared tolerance, and retain overload differences separately. The module's `tools/compare_output_pcm.py` checks the corresponding matched Android/Apple capture sets; host comparisons do not establish physical output latency."
32
+ "original_markdown": "Public API 1.1.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. Version 1.1.0 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 version 1.1.0.",
33
+ "mirrored_markdown": "Public API 1.1.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. Version 1.1.0 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 version 1.1.0."
71
34
  }
72
35
  ]
73
36
  },
74
37
  {
75
38
  "source": "documentation/examples.md",
76
39
  "destination": "references/examples.md",
77
- "source_sha256": "48104b9d413050d439ee605c92a2456a50b42c4c80e2d7c2c05706eecc7db215",
78
- "mirrored_sha256": "cda3b082a746230ed7f48b5a9ccef62c24f2b9a5ecf2fe848ac97000dad3eb6f",
40
+ "source_sha256": "1b3be798d8f606381696d9e00cda330c11475402397e4760dcbc3041a39ef404",
41
+ "mirrored_sha256": "51d74ad017afe090cb0ef0596251026554fcdca5d75c7e844d4e18ece5c68d2e",
79
42
  "links": [],
80
43
  "link_fixes": [
44
+ {
45
+ "original_markdown": "Every snippet on this page uses the TiSynthEngine 1.1.0 contract. Unless a snippet includes startup code, it assumes the engine is already running.",
46
+ "mirrored_markdown": "Every snippet on this page uses the TiSynthEngine 1.1.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."
47
+ },
81
48
  {
82
49
  "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
50
  "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."
@@ -87,20 +54,12 @@
87
54
  "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
55
  },
89
56
  {
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"
57
+ "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 the statistics methods `getStats`, `enableStats`, `disableStats` and `resetStats`. For a service-level statistics recipe, see [read engine statistics](guide.md#read-engine-statistics).",
58
+ "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 the statistics methods `getStats`, `enableStats`, `disableStats` and `resetStats`. For a service-level statistics recipe, see [read engine statistics](guide.md#read-engine-statistics)."
100
59
  },
101
60
  {
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 })`."
61
+ "original_markdown": "\n\n## Sustained game motor\n",
62
+ "mirrored_markdown": "\n\nContinue with [advanced examples](advanced-examples.md).\n## Sustained game motor\n"
104
63
  }
105
64
  ],
106
65
  "source_parts": [
@@ -111,8 +70,8 @@
111
70
  {
112
71
  "source": "documentation/examples.md",
113
72
  "destination": "references/advanced-examples.md",
114
- "source_sha256": "48104b9d413050d439ee605c92a2456a50b42c4c80e2d7c2c05706eecc7db215",
115
- "mirrored_sha256": "f515e00d2dfa7cb984158f03f435b5b370cdcddf6f32305172e9a38843c300c2",
73
+ "source_sha256": "1b3be798d8f606381696d9e00cda330c11475402397e4760dcbc3041a39ef404",
74
+ "mirrored_sha256": "e41a547bfb6d23b8e3460092e64eb8292587e8d15863ba1abe30daf7bbc8f163",
116
75
  "links": [],
117
76
  "link_fixes": [],
118
77
  "source_parts": [
@@ -123,8 +82,8 @@
123
82
  {
124
83
  "source": "documentation/guide.md",
125
84
  "destination": "references/guide.md",
126
- "source_sha256": "6241f84ba84e20c0516bf01bc0850f9625d2b41f0bef39289c056e687b21ee37",
127
- "mirrored_sha256": "be2c4e48d4be645fc716fcb610aead2c2849f04fdaa6763ac073266673309aa6",
85
+ "source_sha256": "0edc2fb8bccb4412d80e00d63a5a631b455d0ede6178c16642e63e37ce3dd77e",
86
+ "mirrored_sha256": "ccc8e263b9c7a09811bb116aad758bd6e847b2f6a567c35129bd86466e5b7aa2",
128
87
  "links": [],
129
88
  "link_fixes": [
130
89
  {
@@ -144,24 +103,16 @@
144
103
  "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
104
  },
146
105
  {
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": "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.",
152
- "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."
153
- },
154
- {
155
- "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.",
156
- "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."
106
+ "original_markdown": "The diagnostics include `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.",
107
+ "mirrored_markdown": "The diagnostics include `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."
157
108
  }
158
109
  ]
159
110
  },
160
111
  {
161
112
  "source": "documentation/recommendations.md",
162
113
  "destination": "references/recommendations.md",
163
- "source_sha256": "de212dae8b2b362c241cc2b63c7e11cad9db1ff758fd52ffba4fd26ac66bf794",
164
- "mirrored_sha256": "58d9dd491ac63ad60fb48551fa7c558682fd4f5cd4403cf03d72c4ef7ebf794c",
114
+ "source_sha256": "f72c3df9c36df0cbdb843bbe2c6799ae537324ece499fe6d1a2de80e43df5261",
115
+ "mirrored_sha256": "56f6783408dee02778b5ff1aa20751254740286c3dbafb46654def0ed5182f94",
165
116
  "links": [],
166
117
  "link_fixes": [
167
118
  {
@@ -169,25 +120,25 @@
169
120
  "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)."
170
121
  },
171
122
  {
172
- "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.",
173
- "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."
174
- },
175
- {
176
- "original_markdown": "- Timed tones, chords and pattern steps last at most 60 seconds. Sustained `noteOn` voices last until release, replacement or shutdown.",
177
- "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."
123
+ "original_markdown": "Measure 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",
124
+ "mirrored_markdown": "Measure 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"
178
125
  }
179
126
  ]
180
127
  },
181
128
  {
182
129
  "source": "documentation/sound-design.md",
183
130
  "destination": "references/sound-design.md",
184
- "source_sha256": "d7dbf023a72b2baaf726c20f6e240795f25095e63124264d8a13d9202b42e1d0",
185
- "mirrored_sha256": "96514d9bbbbb3e3cf9d8940edab961c6c6a0268979dc16204528fde28d7db9dd",
131
+ "source_sha256": "ac3f4552065051bc5291d8838945ed256ad3b0da7857e1f1cb5f54f5962ebfae",
132
+ "mirrored_sha256": "7daf9a50dbac8eabcdb5c69079d78c0747aefa7602f24c1c66c1536faa6edbdc",
186
133
  "links": [],
187
134
  "link_fixes": [
188
135
  {
189
- "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.",
190
- "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."
136
+ "original_markdown": "# Sound design with TiSynthEngine",
137
+ "mirrored_markdown": "# Sound design with TiSynthEngine\n\nAdditional [curated recipes](recipes.md) provide application sound and interaction variants."
138
+ },
139
+ {
140
+ "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 `updateNote` 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.",
141
+ "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 `updateNote` 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."
191
142
  },
192
143
  {
193
144
  "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.",
@@ -196,18 +147,14 @@
196
147
  {
197
148
  "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.",
198
149
  "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."
199
- },
200
- {
201
- "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.",
202
- "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."
203
150
  }
204
151
  ]
205
152
  },
206
153
  {
207
154
  "source": "documentation/troubleshooting.md",
208
155
  "destination": "references/troubleshooting.md",
209
- "source_sha256": "e2156e5dea77bda95d9f9305bf2c8c359d54d5832f56062cf2d2ebe6c2b583b9",
210
- "mirrored_sha256": "183a99e6b37427bd7c85e234706daf38c9feacfe4e796a6aba0ffbf9b54d9144",
156
+ "source_sha256": "37fd3173ccfce393ab354713df66fbcc99c7281131ea45de1b3aae1e2d6f2160",
157
+ "mirrored_sha256": "e38bec8838cfda912fd16610d92c13e9395e65d5794ac02a58bff39a7b79c5aa",
211
158
  "links": [],
212
159
  "link_fixes": [
213
160
  {
@@ -217,43 +164,52 @@
217
164
  {
218
165
  "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).",
219
166
  "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)."
167
+ }
168
+ ]
169
+ },
170
+ {
171
+ "source": "documentation/stats-performance.md",
172
+ "destination": "references/stats-performance.md",
173
+ "source_sha256": "085142b6ade7b4f7b5965f6a638f967fdceba5ab1f26fb85e8cb496d5b886b6a",
174
+ "mirrored_sha256": "037c3b8a99c5eea1cc133e4b0418268617d904d6fd5848da0a95a0d52f442340",
175
+ "links": [],
176
+ "link_fixes": [
177
+ {
178
+ "original_markdown": "[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.",
179
+ "mirrored_markdown": "[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."
180
+ },
181
+ {
182
+ "original_markdown": "[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.",
183
+ "mirrored_markdown": "[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."
220
184
  },
221
185
  {
222
- "original_markdown": "| `conflicting_pitch_fields` | Send only one of `note`, `frequency` or `rest: true`.",
223
- "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`."
186
+ "original_markdown": "A 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.",
187
+ "mirrored_markdown": "A 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."
224
188
  },
225
189
  {
226
- "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`.",
227
- "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."
190
+ "original_markdown": "[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/`.",
191
+ "mirrored_markdown": "[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/`."
228
192
  },
229
193
  {
230
- "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.",
231
- "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."
194
+ "original_markdown": "[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.",
195
+ "mirrored_markdown": "[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."
232
196
  },
233
197
  {
234
- "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```",
235
- "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."
198
+ "original_markdown": "The [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.",
199
+ "mirrored_markdown": "The [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."
236
200
  },
237
201
  {
238
- "original_markdown": "Use whole milliseconds and integer waveform values where required.",
239
- "mirrored_markdown": "Use integer milliseconds for timed tone/chord envelope fields and integer waveform values; native sequence intervals and lengths may be fractional."
202
+ "original_markdown": "This 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.",
203
+ "mirrored_markdown": "This 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."
240
204
  },
241
205
  {
242
- "original_markdown": "Confirm both entries in `tiapp.xml` pin 1.0.0. Then remove the application's build output and rebuild so Titanium does not reuse an archive from an earlier build. The module directories should be:\n\n```text\nmodules/android/ti.synthengine/1.0.0/\nmodules/iphone/ti.synthengine/1.0.0/\n```",
243
- "mirrored_markdown": "`apiVersion` describes the unchanged 1.0.0 API contract; it is not the module package version. Confirm both entries in `tiapp.xml` pin module version 1.0.2. Then remove the application's build output and rebuild so Titanium does not reuse an archive from an earlier build. The module directories should be:\n\n```text\nmodules/android/ti.synthengine/1.0.2/\nmodules/iphone/ti.synthengine/1.0.2/\n```"
206
+ "original_markdown": "[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",
207
+ "mirrored_markdown": "[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"
244
208
  }
245
209
  ]
246
210
  },
247
211
  {
248
- "source": "documentation/stats-performance.md",
249
- "destination": "references/stats-performance.md",
250
- "source_sha256": "3d6d35b9e0e49a778777d406418eaba04ebd57da871a322da28fae0190c5cb17",
251
- "mirrored_sha256": "4dbd8a85cbce7c08369c4c9b5d4d2c0cf6a8e0dd0fa508b9c6aaf95774f7be12",
252
- "links": [],
253
- "link_fixes": []
254
- },
255
- {
256
- "source": "documentation/stats-performance.json",
212
+ "source": "docs/validation/stats-performance.json",
257
213
  "destination": "references/stats-performance.json",
258
214
  "source_sha256": "bd0cf07295d0d8f1120e66f527e9ca6d9a014efdc43dff5675716e8e26abe5b3",
259
215
  "mirrored_sha256": "bd0cf07295d0d8f1120e66f527e9ca6d9a014efdc43dff5675716e8e26abe5b3",
@@ -261,7 +217,7 @@
261
217
  "link_fixes": []
262
218
  },
263
219
  {
264
- "source": "documentation/studio-validation.json",
220
+ "source": "docs/validation/studio-validation.json",
265
221
  "destination": "references/studio-validation.json",
266
222
  "source_sha256": "b6abcf9229b8bb812cb4da467e3c495ab66c41041fb7562ca3c371d79671509b",
267
223
  "mirrored_sha256": "b6abcf9229b8bb812cb4da467e3c495ab66c41041fb7562ca3c371d79671509b",
@@ -269,7 +225,7 @@
269
225
  "link_fixes": []
270
226
  },
271
227
  {
272
- "source": "documentation/unified-bypass-performance.json",
228
+ "source": "docs/validation/unified-bypass-performance.json",
273
229
  "destination": "references/unified-bypass-performance.json",
274
230
  "source_sha256": "12622f00804bd866be90ac40579b868e8f6fcbd35635bf8000febb21adef2563",
275
231
  "mirrored_sha256": "12622f00804bd866be90ac40579b868e8f6fcbd35635bf8000febb21adef2563",
@@ -277,7 +233,7 @@
277
233
  "link_fixes": []
278
234
  },
279
235
  {
280
- "source": "documentation/unified-validation.json",
236
+ "source": "docs/validation/unified-validation.json",
281
237
  "destination": "references/unified-validation.json",
282
238
  "source_sha256": "4754da69159f4ab35544d0f0a8ef6e5568dda9e74162b1c2dad2bb807d905fd8",
283
239
  "mirrored_sha256": "4754da69159f4ab35544d0f0a8ef6e5568dda9e74162b1c2dad2bb807d905fd8",
@@ -285,7 +241,7 @@
285
241
  "link_fixes": []
286
242
  },
287
243
  {
288
- "source": "documentation/physical-validation.json",
244
+ "source": "docs/validation/physical-validation.json",
289
245
  "destination": "references/physical-validation.json",
290
246
  "links": [],
291
247
  "link_fixes": [],
@@ -293,7 +249,7 @@
293
249
  "mirrored_sha256": "73233c11a1d2aa06654a06486ef52a08d961473d83b0c5b2a44e19a6eac28c0b"
294
250
  },
295
251
  {
296
- "source": "documentation/frontier-physical-validation.json",
252
+ "source": "docs/validation/frontier-physical-validation.json",
297
253
  "destination": "references/frontier-physical-validation.json",
298
254
  "links": [],
299
255
  "link_fixes": [],
@@ -307,12 +263,12 @@
307
263
  "links": [],
308
264
  "link_fixes": [
309
265
  {
310
- "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.2 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.",
311
- "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.2 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."
266
+ "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 requires module version 1.1.0 and public API 1.1.0 for native finite-tone repetition, attack variation and the recommended note/statistics methods. 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.",
267
+ "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 requires module version 1.1.0 and public API 1.1.0 for native finite-tone repetition, attack variation and the recommended note/statistics methods. 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."
312
268
  },
313
269
  {
314
- "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).",
315
- "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)."
270
+ "original_markdown": "4. 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).",
271
+ "mirrored_markdown": "4. 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)."
316
272
  },
317
273
  {
318
274
  "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.",
@@ -325,10 +281,18 @@
325
281
  {
326
282
  "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.",
327
283
  "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."
284
+ },
285
+ {
286
+ "original_markdown": "The 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.",
287
+ "mirrored_markdown": "The 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."
288
+ },
289
+ {
290
+ "original_markdown": "`playTone` remains a standalone Boolean operation and rejects `intervalMs`; `repeatTone` always returns a numeric ID or 0 and requires the interval. Independent JavaScript calls remain supported, including finite bursts scheduled by an application's own event clock. See [the full contract and standalone burst example](../documentation/api.md#finite-tone-repetition).\n",
291
+ "mirrored_markdown": "`playTone` remains a standalone Boolean operation and rejects `intervalMs`; `repeatTone` always returns a numeric ID or 0 and requires the interval. Independent JavaScript calls remain supported, including finite bursts scheduled by an application's own event clock. See [the full contract and standalone burst example](../../references/api.md#finite-tone-repetition).\n"
328
292
  }
329
293
  ],
330
- "source_sha256": "80f2a69a634453e974281cbdac17e97fbc713a228e79379e8cea592c366bb9be",
331
- "mirrored_sha256": "f036b0ca42b118a9c807324464b1dceda76eb94cab60450f7d3b3822e7f8cfdc"
294
+ "source_sha256": "e191a701a3a913c85b15503fd256e0aec085eb731a587b1bf4faa43865c81982",
295
+ "mirrored_sha256": "88d93d5ffbf8bb4c7bdb6d72f4ee5fe96332704987127ff66d99beeed9677d9a"
332
296
  },
333
297
  {
334
298
  "source": "example/app.js",
@@ -336,8 +300,8 @@
336
300
  "kind": "example-asset",
337
301
  "links": [],
338
302
  "link_fixes": [],
339
- "source_sha256": "1d121412dd2146d75d6b8c1665a28411b9e9c13e626f00284c88f3ba555f3b7e",
340
- "mirrored_sha256": "1d121412dd2146d75d6b8c1665a28411b9e9c13e626f00284c88f3ba555f3b7e"
303
+ "source_sha256": "f8e2ed90f072f516bb4ca796fb6dd8443600585526455e416fface49535ccb40",
304
+ "mirrored_sha256": "f8e2ed90f072f516bb4ca796fb6dd8443600585526455e416fface49535ccb40"
341
305
  },
342
306
  {
343
307
  "source": "example/lib/sequenceScore.js",
@@ -358,7 +322,7 @@
358
322
  "mirrored_sha256": "2c7a639aa9e7347872240556734165a749e4abb44f19cb14546d9ae822e1c5b3"
359
323
  },
360
324
  {
361
- "source": "documentation/bypass-physical-recheck-evidence.zip",
325
+ "source": "docs/validation/bypass-physical-recheck-evidence.zip",
362
326
  "destination": "references/bypass-physical-recheck-evidence.zip",
363
327
  "kind": "evidence-archive",
364
328
  "links": [],
@@ -367,7 +331,7 @@
367
331
  "mirrored_sha256": "910eb9eafebd7d46797192053ec7f4f9f3fc88c6bfd1b83b07acefd1e51603a2"
368
332
  },
369
333
  {
370
- "source": "documentation/frontier-android-evidence.zip",
334
+ "source": "docs/validation/frontier-android-evidence.zip",
371
335
  "destination": "references/frontier-android-evidence.zip",
372
336
  "kind": "evidence-archive",
373
337
  "links": [],
@@ -376,7 +340,7 @@
376
340
  "mirrored_sha256": "217a06978982d601ad10796865b22dbac69f202e4bf91ae07ba268734d4fef08"
377
341
  },
378
342
  {
379
- "source": "documentation/frontier-ipad-evidence.zip",
343
+ "source": "docs/validation/frontier-ipad-evidence.zip",
380
344
  "destination": "references/frontier-ipad-evidence.zip",
381
345
  "kind": "evidence-archive",
382
346
  "links": [],
@@ -385,7 +349,7 @@
385
349
  "mirrored_sha256": "56369b202d279efbf4f9a720a0a99dba2f398410cb8e042ef1200a3a63be245b"
386
350
  },
387
351
  {
388
- "source": "documentation/android-sim80-correction.json",
352
+ "source": "docs/validation/android-sim80-correction.json",
389
353
  "destination": "references/android-sim80-correction.json",
390
354
  "links": [],
391
355
  "link_fixes": [],
@@ -393,7 +357,7 @@
393
357
  "mirrored_sha256": "675c2201b9e0bfad7c8bf6255f8a9440eb45ef0a915c24eee9e47db12745a1c0"
394
358
  },
395
359
  {
396
- "source": "documentation/android-sim80-correction-evidence.zip",
360
+ "source": "docs/validation/android-sim80-correction-evidence.zip",
397
361
  "destination": "references/android-sim80-correction-evidence.zip",
398
362
  "links": [],
399
363
  "link_fixes": [],
@@ -402,7 +366,7 @@
402
366
  "kind": "evidence-archive"
403
367
  },
404
368
  {
405
- "source": "documentation/performance-review.json",
369
+ "source": "docs/validation/performance-review.json",
406
370
  "destination": "references/performance-review.json",
407
371
  "links": [],
408
372
  "link_fixes": [],
@@ -410,7 +374,7 @@
410
374
  "mirrored_sha256": "e822b3361bb5cdb31e635863d84b179ef41edfe6a1214ae99ca3a9d327d21d3a"
411
375
  },
412
376
  {
413
- "source": "documentation/performance-review-evidence.zip",
377
+ "source": "docs/validation/performance-review-evidence.zip",
414
378
  "destination": "references/performance-review-evidence.zip",
415
379
  "links": [],
416
380
  "link_fixes": [],
@@ -422,15 +386,69 @@
422
386
  "source": "documentation/audio-pipeline-validation.md",
423
387
  "destination": "references/audio-pipeline-validation.md",
424
388
  "source_sha256": "7359d85de63e9fe94f85477e03a22fc1531c8acaabe30333e7ff2515cc5ec3e9",
425
- "mirrored_sha256": "f2a90a8423a3761664ca2957f3ce3ccb2792e1b090c2b7a011709689b12a588d",
389
+ "mirrored_sha256": "71f668b1467fa8afc92cddd627f688247ef6f48f2bf8a0ebdc2a2b05427e3521",
426
390
  "links": [],
427
391
  "link_fixes": []
392
+ },
393
+ {
394
+ "source": "documentation/instruments-and-effects.md",
395
+ "destination": "references/instruments-and-effects.md",
396
+ "links": [],
397
+ "link_fixes": [],
398
+ "source_sha256": "6c9b96c406c54426a1d37a85b42909a50621cc647d08d37fa89c19283b3acfa0",
399
+ "mirrored_sha256": "ced9d66af8528bf8a88463f953ff3892ef4234be5551cade9a210a91fd53e746"
400
+ },
401
+ {
402
+ "source": "documentation/native-variation.md",
403
+ "destination": "references/native-variation.md",
404
+ "links": [],
405
+ "link_fixes": [
406
+ {
407
+ "original_markdown": "Both 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.",
408
+ "mirrored_markdown": "Both renderers use [`shared/synth_variation.h`](https://github.com/macCesar/TiSynthEngine/blob/7cd035409453b01df2736aef56f2316d94ca019c/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."
409
+ }
410
+ ],
411
+ "source_sha256": "650d2c675dc4b4e09a85521812b7fedd3b02cb993a451378a8082e2b7782303a",
412
+ "mirrored_sha256": "a34c4100b5f28888252855ce0e68494097cbca4df76ee9298cfcd05efa14e839"
413
+ },
414
+ {
415
+ "source": "documentation/native-variation-proposal.md",
416
+ "destination": "references/native-variation-proposal.md",
417
+ "links": [],
418
+ "link_fixes": [],
419
+ "source_sha256": "17b74434b0e03e5353b71c693d4ec722dede92fee8aed142003e67f60e158e27",
420
+ "mirrored_sha256": "bcb2ab5cdc13d0c5c47a9b8d81a1c1eaae3af5a1c85a3f8cf85ca3ae2b300b1d"
421
+ },
422
+ {
423
+ "source": "documentation/native-variation-validation.md",
424
+ "destination": "references/native-variation-validation.md",
425
+ "links": [],
426
+ "link_fixes": [],
427
+ "source_sha256": "df18826824984cb440d7412b547663ba6b8a7152bc347508114d7af982c90e68",
428
+ "mirrored_sha256": "bab57291d98d537a42adf4992121dce1887bcb1b4affecf94c4174168a5629dc"
429
+ },
430
+ {
431
+ "source": "documentation/native-tone-repetition-validation.md",
432
+ "destination": "references/native-tone-repetition-validation.md",
433
+ "links": [],
434
+ "link_fixes": [],
435
+ "source_sha256": "b29758b5ec3b50650c4e30e8c408cb9bc680cad3fc158e543c3f6eec00c268a1",
436
+ "mirrored_sha256": "186b3baaff1c7bbbf8977f0ad5e00b632f63155ea29c2903554c8ac1738259dd"
437
+ },
438
+ {
439
+ "source": "index.d.ts",
440
+ "destination": "assets/index.d.ts",
441
+ "links": [],
442
+ "link_fixes": [],
443
+ "kind": "declaration-asset",
444
+ "source_sha256": "0b1dd381258bd4891090c2e2b56bbeb66f0be66daa1c9fbab6145a9dc09a0620",
445
+ "mirrored_sha256": "0b1dd381258bd4891090c2e2b56bbeb66f0be66daa1c9fbab6145a9dc09a0620"
428
446
  }
429
447
  ],
430
448
  "excluded_documents": [
431
449
  {
432
450
  "source": "documentation/index.md",
433
- "source_sha256": "9c9cab76618b15e77b8de43dd7bd33cd35be0fe50ad4fb28d5e1a71fe0708fa2",
451
+ "source_sha256": "23b00db329fb53cd445e71a2e746ab8dbfdfe8d5c827c60929ff06af3b3757c3",
434
452
  "reason": "Upstream documentation index; SKILL.md is the distributed navigation entry point."
435
453
  },
436
454
  {
@@ -439,10 +457,10 @@
439
457
  "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."
440
458
  }
441
459
  ],
442
- "source_state": "working-tree",
443
- "reviewed_worktree_sha256": "0226827bb8c35cf62435f0d7b64d2a3f02427417c9084f2bddfdadb0a90b68d3",
444
- "api_version": "1.0.0",
445
- "public_packages": [
460
+ "source_state": "committed",
461
+ "api_version": "1.1.0",
462
+ "published_version": "1.1.0",
463
+ "historical_public_packages": [
446
464
  {
447
465
  "platform": "android",
448
466
  "version": "1.0.2",
@@ -494,5 +512,31 @@
494
512
  "ios/README.html": "b3ed190cbb3ca9022943f2f71d5e927fde7f8d8a75c2a23ab3aa51324a07a5dc"
495
513
  }
496
514
  }
515
+ ],
516
+ "public_packages": [
517
+ {
518
+ "platform": "android",
519
+ "version": "1.1.0",
520
+ "release_url": "https://github.com/macCesar/TiSynthEngine/releases/tag/android-1.1.0",
521
+ "download_url": "https://github.com/macCesar/TiSynthEngine/releases/download/android-1.1.0/ti.synthengine-android-1.1.0.zip",
522
+ "filename": "ti.synthengine-android-1.1.0.zip",
523
+ "sha256": "69dea7daaa8b5dd77f7a3d4d6e6ad801e2a0bd48f9e2c79b9caf584dd56e36eb",
524
+ "downloaded_on_utc": "2026-11-02",
525
+ "crc_verified": true,
526
+ "release_target_commit": "7cd035409453b01df2736aef56f2316d94ca019c",
527
+ "types_match_source": true
528
+ },
529
+ {
530
+ "platform": "iphone",
531
+ "version": "1.1.0",
532
+ "release_url": "https://github.com/macCesar/TiSynthEngine/releases/tag/ios-1.1.0",
533
+ "download_url": "https://github.com/macCesar/TiSynthEngine/releases/download/ios-1.1.0/ti.synthengine-iphone-1.1.0.zip",
534
+ "filename": "ti.synthengine-iphone-1.1.0.zip",
535
+ "sha256": "c426fed49d78926f8dd4e176addaebf0cb0fe4592c5eb48c842aef833ad798b4",
536
+ "downloaded_on_utc": "2026-11-02",
537
+ "crc_verified": true,
538
+ "release_target_commit": "7cd035409453b01df2736aef56f2316d94ca019c",
539
+ "types_match_source": true
540
+ }
497
541
  ]
498
542
  }