@maccesar/titools 5.2.5 → 5.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/CONTRIBUTING.md +1 -1
  2. package/README.md +58 -97
  3. package/agents/ti-pro.md +4 -2
  4. package/commands/ti-audit.md +7 -5
  5. package/docs/examples.md +24 -13
  6. package/docs/knowledge-index.md +2 -1
  7. package/lib/config.js +1 -0
  8. package/package.json +1 -1
  9. package/skills/alloy-guides/SKILL.md +18 -179
  10. package/skills/alloy-guides/references/CLI_TASKS.md +17 -216
  11. package/skills/alloy-guides/references/CONCEPTS.md +27 -162
  12. package/skills/alloy-guides/references/CONTROLLERS.md +38 -236
  13. package/skills/alloy-guides/references/MODELS.md +47 -723
  14. package/skills/alloy-guides/references/MODELS_ADVANCED.md +21 -482
  15. package/skills/alloy-guides/references/VIEWS_DYNAMIC.md +12 -222
  16. package/skills/alloy-guides/references/VIEWS_STYLES.md +39 -358
  17. package/skills/alloy-guides/references/VIEWS_XML.md +36 -552
  18. package/skills/alloy-guides/references/WIDGETS.md +49 -127
  19. package/skills/alloy-howtos/SKILL.md +14 -169
  20. package/skills/alloy-howtos/references/best_practices.md +9 -113
  21. package/skills/alloy-howtos/references/cli_reference.md +18 -223
  22. package/skills/alloy-howtos/references/config_files.md +50 -133
  23. package/skills/alloy-howtos/references/debugging_troubleshooting.md +19 -63
  24. package/skills/alloy-howtos/references/samples.md +21 -138
  25. package/skills/ti-api/SKILL.md +10 -2
  26. package/skills/ti-api/references/api-android.md +36 -2
  27. package/skills/ti-api/references/api-app-platform.md +39 -3
  28. package/skills/ti-api/references/api-core.md +50 -18
  29. package/skills/ti-api/references/api-data-network.md +49 -35
  30. package/skills/ti-api/references/api-media.md +45 -27
  31. package/skills/ti-api/references/api-services.md +39 -9
  32. package/skills/ti-api/references/api-ui-android.md +33 -13
  33. package/skills/ti-api/references/api-ui-extras.md +41 -15
  34. package/skills/ti-api/references/api-ui-ios-animator.md +42 -26
  35. package/skills/ti-api/references/api-ui-ios.md +74 -2
  36. package/skills/ti-api/references/api-ui-lists.md +32 -16
  37. package/skills/ti-api/references/api-ui-text-input.md +34 -17
  38. package/skills/ti-api/references/api-ui-views.md +27 -1
  39. package/skills/ti-api/references/api-ui-windows-navigation.md +32 -18
  40. package/skills/ti-api/references/api-xml-global.md +66 -16
  41. package/skills/ti-create-release/SKILL.md +98 -0
  42. package/skills/ti-create-release/references/module-discovery.md +69 -0
  43. package/skills/ti-expert/references/adaptive-layouts.md +1 -1
  44. package/skills/ti-guides/SKILL.md +37 -76
  45. package/skills/ti-guides/references/advanced-data-and-images.md +122 -126
  46. package/skills/ti-guides/references/android-manifest.md +24 -83
  47. package/skills/ti-guides/references/app-distribution.md +31 -377
  48. package/skills/ti-guides/references/application-frameworks.md +127 -335
  49. package/skills/ti-guides/references/cli-reference.md +184 -633
  50. package/skills/ti-guides/references/commonjs-advanced.md +81 -231
  51. package/skills/ti-guides/references/compatibility-matrix.md +36 -75
  52. package/skills/ti-guides/references/hello-world.md +95 -70
  53. package/skills/ti-guides/references/hyperloop-native-access.md +52 -448
  54. package/skills/ti-guides/references/resources.md +174 -142
  55. package/skills/ti-guides/references/sdk-release-notes.md +28 -71
  56. package/skills/ti-guides/references/tiapp-config.md +222 -598
  57. package/skills/ti-howtos/SKILL.md +23 -123
  58. package/skills/ti-howtos/references/cross-platform-development.md +119 -324
  59. package/skills/ti-howtos/references/debugging-profiling.md +77 -445
  60. package/skills/ti-howtos/references/extending-titanium.md +199 -673
  61. package/skills/ti-howtos/references/local-data-sources.md +87 -300
  62. package/skills/ti-howtos/references/location-and-maps.md +86 -213
  63. package/skills/ti-howtos/references/media-apis.md +103 -223
  64. package/skills/ti-howtos/references/notification-services.md +86 -506
  65. package/skills/ti-howtos/references/remote-data-sources.md +97 -316
  66. package/skills/ti-howtos/references/using-modules.md +77 -133
  67. package/skills/ti-synthengine/SKILL.md +62 -111
  68. package/skills/ti-synthengine/assets/example/README.md +50 -59
  69. package/skills/ti-synthengine/assets/example/app.js +67 -65
  70. package/skills/ti-synthengine/assets/example/lib/sequenceOwner.js +39 -40
  71. package/skills/ti-synthengine/assets/example/lib/soundPreset.js +34 -0
  72. package/skills/ti-synthengine/assets/index.d.ts +122 -2
  73. package/skills/ti-synthengine/references/advanced-examples.md +4 -4
  74. package/skills/ti-synthengine/references/api.md +40 -18
  75. package/skills/ti-synthengine/references/audio-engine.md +15 -57
  76. package/skills/ti-synthengine/references/examples.md +63 -6
  77. package/skills/ti-synthengine/references/guide.md +61 -57
  78. package/skills/ti-synthengine/references/instruments-and-effects.md +15 -15
  79. package/skills/ti-synthengine/references/native-variation.md +53 -14
  80. package/skills/ti-synthengine/references/recipes-interaction.md +25 -20
  81. package/skills/ti-synthengine/references/recipes.md +19 -16
  82. package/skills/ti-synthengine/references/recommendations.md +12 -12
  83. package/skills/ti-synthengine/references/sound-api.md +197 -0
  84. package/skills/ti-synthengine/references/sound-design.md +7 -7
  85. package/skills/ti-synthengine/references/source-notes.md +62 -172
  86. package/skills/ti-synthengine/references/troubleshooting.md +17 -19
  87. package/skills/ti-synthengine/references/upgrade-2.0.0.md +40 -0
  88. package/skills/ti-ui/SKILL.md +28 -143
  89. package/skills/ti-ui/references/icons-and-splash-screens.md +74 -403
  90. package/skills/ti-ui/references/layouts-and-positioning.md +175 -402
  91. package/skills/ti-ui/references/listviews-and-performance.md +100 -703
  92. package/skills/ti-ui/references/platform-conventions.md +180 -0
  93. package/skills/ti-ui/references/user-interface.md +43 -0
  94. package/skills/alloy-guides/references/VIEWS_WITHOUT_CONTROLLERS.md +0 -102
  95. package/skills/alloy-howtos/references/custom_tags.md +0 -148
  96. package/skills/ti-guides/references/coding-best-practices.md +0 -149
  97. package/skills/ti-guides/references/javascript-primer.md +0 -414
  98. package/skills/ti-guides/references/reserved-words.md +0 -36
  99. package/skills/ti-guides/references/style-and-conventions.md +0 -103
  100. package/skills/ti-howtos/references/android-platform-deep-dives.md +0 -624
  101. package/skills/ti-howtos/references/automation-fastlane-appium.md +0 -96
  102. package/skills/ti-howtos/references/buffer-codec-streams.md +0 -162
  103. package/skills/ti-howtos/references/google-maps-v2.md +0 -172
  104. package/skills/ti-howtos/references/ios-map-kit.md +0 -149
  105. package/skills/ti-howtos/references/ios-platform-deep-dives.md +0 -611
  106. package/skills/ti-howtos/references/tutorials.md +0 -565
  107. package/skills/ti-howtos/references/web-content-integration.md +0 -287
  108. package/skills/ti-howtos/references/webpack-build-pipeline.md +0 -124
  109. package/skills/ti-synthengine/references/android-sim80-correction-evidence.zip +0 -0
  110. package/skills/ti-synthengine/references/android-sim80-correction.json +0 -162
  111. package/skills/ti-synthengine/references/audio-pipeline-validation.md +0 -19
  112. package/skills/ti-synthengine/references/bypass-physical-recheck-evidence.zip +0 -0
  113. package/skills/ti-synthengine/references/frontier-android-evidence.zip +0 -0
  114. package/skills/ti-synthengine/references/frontier-ipad-evidence.zip +0 -0
  115. package/skills/ti-synthengine/references/frontier-physical-validation.json +0 -1918
  116. package/skills/ti-synthengine/references/native-tone-repetition-validation.md +0 -59
  117. package/skills/ti-synthengine/references/native-variation-proposal.md +0 -182
  118. package/skills/ti-synthengine/references/native-variation-validation.md +0 -63
  119. package/skills/ti-synthengine/references/performance-review-evidence.zip +0 -0
  120. package/skills/ti-synthengine/references/performance-review.json +0 -1146
  121. package/skills/ti-synthengine/references/physical-validation.json +0 -1457
  122. package/skills/ti-synthengine/references/source-snapshot.json +0 -542
  123. package/skills/ti-synthengine/references/stats-performance.json +0 -2992
  124. package/skills/ti-synthengine/references/stats-performance.md +0 -82
  125. package/skills/ti-synthengine/references/studio-validation.json +0 -6202
  126. package/skills/ti-synthengine/references/unified-bypass-performance.json +0 -22425
  127. package/skills/ti-synthengine/references/unified-validation.json +0 -314
  128. package/skills/ti-ui/references/accessibility-deep-dive.md +0 -288
  129. package/skills/ti-ui/references/animation-and-matrices.md +0 -569
  130. package/skills/ti-ui/references/application-structures.md +0 -626
  131. package/skills/ti-ui/references/custom-fonts-styling.md +0 -549
  132. package/skills/ti-ui/references/event-handling.md +0 -401
  133. package/skills/ti-ui/references/gestures.md +0 -448
  134. package/skills/ti-ui/references/orientation.md +0 -374
  135. package/skills/ti-ui/references/platform-ui-android.md +0 -727
  136. package/skills/ti-ui/references/platform-ui-ios.md +0 -576
  137. package/skills/ti-ui/references/scrolling-views.md +0 -288
  138. package/skills/ti-ui/references/tableviews.md +0 -542
@@ -1,181 +1,125 @@
1
1
  # Using modules
2
2
 
3
- Guide to obtaining, installing, and using Titanium modules to extend app functionality.
3
+ Based on the [current official guide](https://titaniumsdk.com/docs/build/modules.md). Examples target released SDK 13.4.1; verify the selected SDK before adopting version-specific behavior.
4
4
 
5
- ## Obtaining modules
5
+ Two different things get added to a Titanium project and both are called
6
+ dependencies.
6
7
 
7
- ### Sources of modules
8
+ A **native module** wraps platform code the core SDK does not expose: Bluetooth,
9
+ maps, barcodes. It ships as a built binary per platform.
8
10
 
9
- Official modules:
10
- - Enterprise Extensions
11
- - InAppBilling (Android)
12
- - StoreKit (iOS)
13
- - Barcode (iOS/Android)
14
- - Compression (iOS/Android)
15
- - OpenGL (iOS)
16
- - AirPrint (iOS)
11
+ An **npm package** is JavaScript. If it runs without Node's built-ins and
12
+ without a browser, it will probably run here.
17
13
 
18
- Open-source modules:
19
- - GitHub: tidev
20
- - https://github.com/tidev/ti.admob - AdMob ads
21
- - https://github.com/tidev/ti.map - Native maps
22
- - And more in the org
14
+ ## Native modules
23
15
 
24
- Community modules:
25
- - From Zero To App list: https://fromzerotoapp.com/modules/
26
- - Curated list of modules maintained by Michael Gangolf
16
+ The [modules directory](https://titaniumsdk.com/modules.md) lists what TiDev maintains. Installing one is
17
+ three steps: unpack it, declare it, require it.
27
18
 
28
- Marketplace: The original Appcelerator Marketplace is no longer available. Find community modules on GitHub and npm. A curated list is at https://fromzerotoapp.com/modules/.
19
+ > [!NOTE]
20
+ > There is no install command yet. `ti module` has one subcommand, `list`, so
21
+ > unpacking is done by hand. `ti module install` and `ti module search` are
22
+ > planned; until they ship, this is the path.
29
23
 
30
- ### Pre-installed modules
31
- Some modules ship with the SDK and do not need separate installation: `ti.map`, `ti.identity`, `ti.webdialog`, `ti.applesignin`.
24
+ Download the release archive for the module and extract it beside `tiapp.xml`, preserving its directory prefix. If it already contains `modules/`, do not create a second `modules/modules` level. The resulting layout is:
32
25
 
33
- ## Installing modules
34
-
35
- ### Single project installation
36
- 1. Copy the module ZIP to your app root folder.
37
- 2. Add the module to `tiapp.xml` (see configuration below).
38
- 3. Build the project. The ZIP is extracted automatically.
39
-
40
- ### Global installation (all projects)
41
- Modules install to platform-specific locations:
42
-
43
- | Operating system | Path |
44
- | ---------------- | ---------------------------------------- |
45
- | macOS | `~/Library/Application Support/Titanium` |
46
- | Windows | `%ProgramData%\Titanium\mobilesdk\win32` |
26
+ ```
27
+ modules/
28
+ android/ti.map/5.7.0/
29
+ iphone/ti.map/7.3.1/
30
+ ```
47
31
 
48
- Show hidden Library folder on macOS:
32
+ That is `modules/<platform>/<id>/<version>/`, and the platform directory is
33
+ `android`, `iphone` or `commonjs` - `iphone` covers iPad and macOS too.
49
34
 
50
- ```bash
51
- # Permanently show
52
- chflags nohidden ~/Library/
35
+ Check the CLI can see it:
53
36
 
54
- # Open once
55
- open ~/Library
37
+ ```sh
38
+ ti module list
56
39
  ```
57
40
 
58
- ## Configuring your app
41
+ It reports three scopes - project, configured paths, and global - so the output
42
+ also tells you which copy a build will pick up.
59
43
 
60
- ### Updating tiapp.xml
61
-
62
- Using Studio/IDE:
63
- 1. Open `tiapp.xml`.
64
- 2. Go to the Overview tab.
65
- 3. Click the plus button in Modules.
66
- 4. Select module and version.
67
- 5. Save.
68
-
69
- Manually (XML):
44
+ Then declare it in `tiapp.xml`, per platform:
70
45
 
71
46
  ```xml
72
47
  <modules>
73
- <module version="3.0.2" platform="ios">ti.map</module>
74
- <module version="5.0.0" platform="android">ti.admob</module>
48
+ <module platform="android">ti.map</module>
49
+ <module platform="iphone">ti.map</module>
75
50
  </modules>
76
51
  ```
77
52
 
78
- Attributes:
79
- - `version`: must match the module manifest
80
- - `platform`: "ios" or "android"
81
-
82
- ### Selecting module versions
83
- If multiple versions are installed, select specific versions per platform and build type (development/production).
84
-
85
- In Studio, double-click the module to open the Module Properties dialog.
53
+ Both steps are needed. A module on disk that `tiapp.xml` does not name is not
54
+ built in, and missing/incompatible modules can fail at build time or during `require`; inspect the actual diagnostic.
86
55
 
87
- ### Enable debugger (for native modules)
88
- Required for debugging native modules:
56
+ Then require it by id:
89
57
 
90
- ```xml
91
- <ti:app>
92
- <android xmlns:android="http://schemas.android.com/apk/res/android">
93
- <manifest>
94
- <application android:debuggable="true">
95
- </application>
96
- </manifest>
97
- </android>
98
- </ti:app>
58
+ ```js
59
+ const Map = require('ti.map');
99
60
  ```
100
61
 
101
- ## Using a module
102
-
103
- ### Loading the module (ES5)
62
+ Pin a version when more than one is unpacked and you care which one you get:
104
63
 
105
- ```javascript
106
- const Module = require('module.id');
107
- // Example: const Map = require('ti.map');
64
+ ```xml
65
+ <module platform="android" version="5.7.0">ti.map</module>
108
66
  ```
109
67
 
110
- ### Loading the module (ES6+)
68
+ Without a version the newest installed copy wins, which means a machine with
69
+ two versions in `modules/` and a colleague's machine with one can produce
70
+ different builds from the same commit.
111
71
 
112
- ```javascript
113
- import Module from 'module.id'
114
- // Example: import Map from 'ti.map'
115
- ```
72
+ > [!IMPORTANT]
73
+ > A module is native code, so it is built for specific platforms and against a
74
+ > range of SDK versions. A module that has not been rebuilt for a newer Titanium
75
+ > SDK may fail at build time with a linker error rather than anything that names
76
+ > the module. Check the module's own page for the versions it supports.
116
77
 
117
- Important: do not include the `.js` extension in the module ID.
78
+ ### Where modules live
118
79
 
119
- ### Using module functionality
120
- After requiring, use the module's API:
80
+ `modules/<platform>/<moduleid>/<version>/` in the project, which is committed
81
+ like any other source. Some teams keep them out of version control and install
82
+ in CI instead; either works, as long as the whole team does the same thing.
121
83
 
122
- ```javascript
123
- // ES6+ example with ti.admob
124
- const Admob = require('ti.admob');
84
+ Unpacking into the global directory instead makes the module available to every
85
+ project on that machine and to nobody else's, which makes a build depend on the
86
+ machine it runs on. Prefer the project-local copy. On macOS the global one is
87
+ `~/Library/Application Support/Titanium/modules`, and `ti module list` prints
88
+ the full path of everything it finds.
125
89
 
126
- const adview = Admob.createView({
127
- top: 0,
128
- testing: true,
129
- adBackgroundColor: 'black',
130
- primaryTextColor: 'blue',
131
- publisherId: 'YOUR_PUBLISHER_ID'
132
- });
90
+ ## npm packages
133
91
 
134
- win.add(adview);
135
- ```
136
-
137
- ### Module patterns
92
+ `package.json` in the project root, and `npm install` as normal:
138
93
 
139
- Singleton pattern:
140
- ```javascript
141
- const admob = require('ti.admob');
142
- admob.createView({ ... });
94
+ ```sh
95
+ npm install lodash
143
96
  ```
144
97
 
145
- Constructor pattern:
146
- ```javascript
147
- const Map = require('ti.map');
148
- const view = Map.createView({ ... });
98
+ ```js
99
+ const _ = require('lodash');
149
100
  ```
150
101
 
151
- Refer to module documentation for its specific API.
102
+ Titanium bundles what is in `node_modules` at build time. Production dependencies are copied from the installed tree. Development dependencies and packages marked `titanium.ignore` or `titanium.type: native-module` are excluded; optional and peer dependencies are included by default. Runtime compatibility still needs checking.
152
103
 
153
- ## Troubleshooting
104
+ **What will not work:** anything that needs Node's built-ins (`fs`, `net`,
105
+ `child_process`), anything that needs a DOM, and anything shipping native
106
+ bindings. A package that only touches `Ti.*` and plain JavaScript is fine.
107
+ Check before adopting a large dependency; the failure arrives at runtime as an
108
+ undefined require.
154
109
 
155
- ### "Requested module not found"
156
- Solutions:
157
- 1. Check module ID spelling in `require()`.
158
- 2. Verify the module is added to `tiapp.xml`.
159
- 3. Confirm the module is installed (global or local path).
160
- 4. Remove the `version` attribute to use the latest version.
110
+ Keep `node_modules` out of version control as you would anywhere else.
161
111
 
162
- ### Version conflicts
163
- If multiple versions exist, specify the exact version in `tiapp.xml`, or remove the version attribute to use the latest.
112
+ ## Which one do I need
164
113
 
165
- ### Platform-specific issues
166
- - iOS: the module must support the iOS SDK version you are using.
167
- - Android: the module manifest `platform` must match the target.
114
+ If it talks to hardware, the operating system, or a platform SDK, it is a
115
+ native module and somebody has to have written it. If it is an algorithm, a
116
+ parser, or a client for an HTTP API, it is probably an npm package.
168
117
 
169
- ### Clean build
170
- Sometimes needed after installing modules:
118
+ If neither exists, writing a native module is covered under Extending Titanium.
171
119
 
172
- ```bash
173
- # Clean and rebuild
174
- ti clean
175
- ```
120
+ ## Next
176
121
 
177
- ## Best practices
122
+ [Debugging and profiling](https://titaniumsdk.com/docs/build/debugging.md) covers finding out why the
123
+ thing you just added is not working.
178
124
 
179
- 1. Pin versions for production.
180
- 2. Check compatibility with your Titanium SDK version.
181
- 3. Test on devices. Some modules behave differently on simulator vs device.
125
+ Contract correction: [released module copier](https://github.com/tidev/titanium-sdk/blob/13_4_1_GA/cli/lib/module-copier.js).
@@ -1,140 +1,91 @@
1
1
  ---
2
2
  name: ti-synthengine
3
- description: "Use when a Titanium app declares ti.synthengine in tiapp.xml, imports require('ti.synthengine'), or needs generated tones, chords, repeatTone/updateTone/stopTone, native sequences, held noteOn/noteOff/updateNote, ADSR, sweeps, FM, resonant filters, noise, binaural spatialX/spatialY, shared tempo, selective music/effects/ui/ambience processing, effectSend, priorities, chorus/delay/reverb/saturation, LFOs, sequenceend events, gain staging, statistics with enableStats/disableStats, bounded native per-attack variation, seeds, TypeScript declarations or render-load diagnosis. Not for audio-file decoding, sample streaming or unrelated synthesizers."
3
+ description: "Use when a Titanium app declares ti.synthengine in tiapp.xml, imports require('ti.synthengine'), or needs TiSynth 2.0 createSound presets, play/noteOn controls, native repetitions or patterns, chords, ADSR, sweeps, FM, filters, noise, binaural spatialX/spatialY, attack variation, shared effects, gain staging or audio diagnostics. Also use for migrating direct playback calls to Sound objects, version metadata, processing units, TypeScript declarations and lifecycle cleanup. Not for audio-file decoding, sample streaming or unrelated synthesizers."
4
4
  ---
5
5
 
6
- # ti.synthengine — native sound synthesis for Titanium
7
-
8
- Act as an audio engineer and mobile sound designer. Translate the requested sound into acoustically reasoned JavaScript using the exact public contract.
9
-
10
- These references cover **published Android/iOS module 1.1.0 with public API
11
- 1.1.0**, retaining compatibility guidance for published 1.0.2 / API 1.0.0.
12
- Version 1.1.0 adds native finite-tone repetition, attack variation and the
13
- recommended held-note/statistics method names. Version 1.0.2 supports the older
14
- core methods and aliases but lacks repetition and rejects variation options.
15
- Download matching [Android](https://github.com/macCesar/TiSynthEngine/releases/tag/android-1.1.0)
16
- and [iOS](https://github.com/macCesar/TiSynthEngine/releases/tag/ios-1.1.0)
17
- packages from the public [repository](https://github.com/macCesar/TiSynthEngine).
18
- Read the [guide](references/guide.md) for both platform declarations, rebuilding
19
- and installation; check the actual methods and feature metadata your app needs.
20
- The reviewed source commit/state, reversible source/mirror hashes and release
21
- artifact checksums are recorded in [source-snapshot.json](references/source-snapshot.json)
22
- and [source notes](references/source-notes.md).
23
- The current [interactive example](assets/example/README.md) includes both helpers
24
- and native repetition controls. The bundled [TypeScript declarations](assets/index.d.ts)
25
- mirror the official module types; read them with the API rather than substituting
26
- type-checking for runtime acceptance. Earlier development packages reused API
27
- version strings, so version checks alone do not establish every capability.
6
+ # ti.synthengine: sound design for Titanium
7
+
8
+ Write JavaScript for the requested sound using TiSynth 2.0.0 on Android and iOS. Briefly explain the waveform, envelope, pitch and filter movement, and placement in the user's language. Prefer reusable Sound definitions and independent playback controls for new code. Existing direct methods remain supported. [source: references/sound-api.md] [source: references/upgrade-2.0.0.md]
28
9
 
29
10
  ## Required workflow
30
11
 
31
- Read the relevant references before writing or reviewing code. When updating the module or its documentation, compare with both native platforms and the shared DSP before synchronizing these mirrors; a snapshot is not an independent correctness oracle.
12
+ Before writing or reviewing code, read the reference for the task. Use the Sound contract for new code and the direct API for exact native limits. A property list or TypeScript `number` alone cannot establish which combinations are valid.
32
13
 
33
14
  | Task | Read first |
34
15
  | --- | --- |
35
- | Any public method, option, default, return value or limit | [API](references/api.md) |
36
- | Download public releases, install, initialize, own or clean up an engine | [Guide](references/guide.md) |
37
- | Design an effect, instrument, reward, alarm or game motor | [Sound design](references/sound-design.md), [recipes](references/recipes.md), [examples](references/examples.md) |
38
- | Complete effect playback, playable adaptations, importing layers and audition fidelity | [Instruments and effects](references/instruments-and-effects.md) |
39
- | Repeat an original finite tone, edit its next attacks or cancel while sounding attacks finish | [Repetition API](references/api.md#finite-tone-repetition), [instruments and effects](references/instruments-and-effects.md#repeated-firing-uses-the-native-clock) |
40
- | Repetition test coverage, transport memory and scoped host measurements | [Repetition verification](references/native-tone-repetition-validation.md) |
41
- | TypeScript signatures, option dictionaries and return types | [Official declarations](assets/index.d.ts), [API](references/api.md) |
42
- | Native per-attack variation, ranges, amount, seeds, chords, held starts and loop/revision behavior | [Variation](references/native-variation.md), [API](references/api.md) |
43
- | Variation memory/callback measurements, package scope and listening follow-up | [Variation verification](references/native-variation-validation.md) |
44
- | Historical variation design, feasibility and deferred API questions | [Historical proposal](references/native-variation-proposal.md); current behavior comes from the implemented guide |
45
- | Xylophone, memory pads, layered chords, FM instruments and interaction ownership | [Interaction recipes](references/recipes-interaction.md) |
46
- | Hold, edit, release or position a sustained voice | [API](references/api.md#noteonoptions), [advanced examples](references/advanced-examples.md#sustained-game-motor) |
47
- | Schedule simultaneous sequences, tempo, swing, edits and cancellation | [API transport](references/api.md#native-sequence-transport), [advanced examples](references/advanced-examples.md#native-sequence-with-chords-and-edits) |
48
- | Select categories, sends, shared effects and synchronized LFOs | [Processing API](references/api.md#setmasterprocessingoptions), [engine](references/audio-engine.md), [advanced examples](references/advanced-examples.md) |
49
- | Map headphone coordinates and stereo bypass | [Guide](references/guide.md#integrate-binaural-in-a-2d-app), [API](references/api.md) |
50
- | Interpret gain, clipping, statistics or render performance | [Recommendations](references/recommendations.md), [statistics](references/stats-performance.md), [engine](references/audio-engine.md) |
51
- | Diagnose rejection, silence, interruptions or glitches | [Troubleshooting](references/troubleshooting.md), [source notes](references/source-notes.md) |
52
- | Module 1.0.2 output, raw-profile migration, calibration, native CI and startup underrun limits | [Pipeline validation](references/audio-pipeline-validation.md), [engine](references/audio-engine.md), [source notes](references/source-notes.md) |
53
- | Accepted optimizations, rejected Apple runtime and physical performance limits | [Current performance review](references/performance-review.json), [engine](references/audio-engine.md), [source notes](references/source-notes.md) |
54
- | Android binaural performance correction and its listening/load limits | [Current Sim80 correction](references/android-sim80-correction.json), [source notes](references/source-notes.md), [unified host validation](references/unified-validation.json), [bypass comparison](references/unified-bypass-performance.json) |
55
- | Audit provenance and acceptance boundaries | [Snapshot](references/source-snapshot.json), [source notes](references/source-notes.md), [historical Studio report](references/studio-validation.json), [physical evidence](references/physical-validation.json), [Frontier measurements](references/frontier-physical-validation.json) |
56
-
57
- Cite factual guidance with `[source: references/<file>.md]`. If the relevant source cannot be read, prefix the claim with `FROM_MEMORY (unverified):`; do not invent Web Audio or other synthesizer option names.
58
-
59
- ## Response contract
60
-
61
- Explain the waveform, envelope, pitch/filter motion and stereo choice briefly in the user's language. Include checked initialization if no engine owner exists, followed by focused production code. Comments and controls should explain meaningful sound choices. Obtain constants from the runtime:
16
+ | Create reusable presets; play, hold, repeat, update or stop sounds | [Sound objects](references/sound-api.md) |
17
+ | Migrate existing calls, metadata or processing units | [Upgrade to 2.0](references/upgrade-2.0.0.md) |
18
+ | Install Android/iOS packages, initialize and own the engine | [Guide](references/guide.md) |
19
+ | Check exact fields, ranges, defaults and supported direct methods | [API](references/api.md) |
20
+ | Design a laser, instrument, reward, alarm or game motor | [Sound design](references/sound-design.md), [examples](references/examples.md) |
21
+ | Preserve a complete effect or adapt it into a playable instrument | [Instruments and effects](references/instruments-and-effects.md) |
22
+ | Retro cues, xylophone, memory pads, layered chords and interaction ownership | [Recipes](references/recipes.md), [interaction recipes](references/recipes-interaction.md) |
23
+ | Held movement, native scores, effects and modulation examples | [Advanced examples](references/advanced-examples.md) |
24
+ | Author bounded attack variation, amount, ranges and seeds | [Native variation](references/native-variation.md) |
25
+ | Choose voice capacity, headroom, spatial processing or diagnostics | [Recommendations](references/recommendations.md), [audio engine](references/audio-engine.md) |
26
+ | Diagnose rejection, silence, routes or platform differences | [Troubleshooting](references/troubleshooting.md), [source notes](references/source-notes.md) |
27
+ | Check TypeScript signatures and narrow playback returns | [Declarations](assets/index.d.ts), [Sound objects](references/sound-api.md) |
28
+ | Run the complete interactive example | [Example app](assets/example/README.md) |
29
+
30
+ Cite factual guidance with `[source: references/<file>.md]`. If the required reference cannot be read, mark the claim `FROM_MEMORY (unverified):` and do not invent option names.
31
+
32
+ ## First sound
33
+
34
+ Reuse the project's engine owner. If the project has none, start audio after the screen has settled and shut it down when its owner closes. Download matching [Android 2.0.0](https://github.com/macCesar/TiSynthEngine/releases/tag/android-2.0.0) and [iOS 2.0.0](https://github.com/macCesar/TiSynthEngine/releases/tag/ios-2.0.0) packages and follow the guide's installation/rebuild steps. The module requires Titanium SDK 13.2.0.GA+, Android compile API 35+, and iOS 15+. The Apple package includes Mac Catalyst. [source: references/guide.md]
62
35
 
63
36
  ```javascript
64
37
  const synth = require('ti.synthengine')
65
- const contract = synth.getDefaults()
66
- const WAVE = contract.waveTypes
67
- if (!synth.start({maxVoices: 32, maxSequences: 4,
68
- mixingProfile: 'conservative', audioSession: 'ambient'})) {
69
- throw new Error('Audio engine rejected startup')
38
+ const contract = synth.getContract()
39
+ if (!synth.start({ maxVoices: 16, maxSequences: 4,
40
+ mixingProfile: 'conservative', audioSession: 'ambient' })) {
41
+ throw new Error('Audio startup rejected')
70
42
  }
43
+ const bell = synth.createSound({
44
+ sound: { waveType: contract.waveTypes.SINE, volume: 0.25, attack: 5, release: 120 },
45
+ playback: { type: 'tone', notes: ['A4'], duration: 400 }
46
+ })
47
+ if (!bell.play()) throw new Error('Bell rejected')
48
+ bell.play({ notes: ['C5'], volume: 0.15 })
71
49
  ```
72
50
 
73
- Both 1.1.0 platforms announce `capabilities.variation === true` and `variationSchemaVersion === 1`; require both before sending `variation`, even for amount zero. Published 1.0.2 does not accept that key. Android also announces native-sequence/processing/modulation flags and `limits.stepDurationMs`; iOS implements those operations without those Android-only metadata entries. Both return the sequence-capacity, priority and send limits. [source: references/api.md] [source: references/native-variation.md]
74
-
75
- Use `updateNote` for held-note edits and `enableStats()` / `disableStats()` for diagnostics in new 1.1.0 code. `updateVoice` and `setStatsEnabled(Boolean)` remain deprecated equivalent aliases, without repeated warnings or a scheduled removal date. For 1.0.2 compatibility, detect and use its aliases; detect repetition and variation separately before enabling those features. [source: references/api.md]
76
-
77
- Choose the actual required sequence capacity, 1–4; the snippet's four slots suit games with simultaneous music, effects and cues. One engine and render callback share up to 32 voices. Start after screen layout settles; the owning service/window shuts down on teardown. On iOS, `ambient` respects silent mode and mixes with other apps; `playback` is the default and ignores silent mode. Profile, voice/sequence capacity and session require shutdown before changing them. [source: references/api.md]
78
-
79
- ## Scheduling contract
80
-
81
- - `playTone` plays one finite event and returns Boolean acceptance; it rejects `intervalMs`. `playChord` plays one simultaneous atomic chord. Use `repeatTone` for ongoing native repetition of the original finite-tone recipe, `playSequence` for ordered scores, and `noteOn`/`noteOff`/`updateNote` for interaction-owned held voices.
82
- - Independent gameplay calls and intentionally JavaScript-timed finite bursts remain supported. Keep their Boolean `playTone` returns and cancel app-owned timers on teardown. Native repetition and sequences own their ongoing sample-clock attacks; UI polling does not drive them.
83
- - `playSequence(options)` returns a positive identifier or `0`. `updateSequence({sequenceId,...changes})`, `stopSequence({sequenceId})` and `setTempo({bpm})` return Boolean acceptance. `getSequenceState({sequenceId})` returns applied revision/position or `null` for unknown/retired IDs. Acceptance can precede callback application.
84
- - Sequence IDs do not repeat over module lifetime, including shutdown/start. Keep the accepted ID and cancel only the owner's sequence. An accepted stop does not immediately free capacity: coalesce replacement requests and publish the latest complete score after its matching `sequenceend`. A delayed event for an old ID must not change the new owner.
85
- - `setTempo({bpm})` accepts 20–300, initially 120. It changes on the next block while conserving musical position. Synced delays/LFOs follow this tempo; free controls keep milliseconds/hertz.
86
- - `timeUnit` is fixed for a sequence: `beats` by default, or `ms`. `stepDuration` defaults to 0.25 beats or 100 ms. `loop` defaults to false; circular Studio patterns explicitly pass true.
87
- - Up to 512 steps each carry exactly one of MIDI `notes` (12–119), `frequencies`, or `rest:true`. Pitch arrays hold 1–32 values and permit duplicates for unison. Root shaping belongs in `voice`; per-step shaping belongs in `overrides`.
88
- - Step `duration` changes the interval until the next attack. `gate`, initially 0.8, places release within that effective interval. Explicit `length` replaces gate and may overlap later attacks. Intervals and lengths follow the sequence time unit; ADSR remains in milliseconds without a sequence interval budget. Sweeps reach their target at note length and hold it during release.
89
- - Swing −0.75…0.75 shifts `swing * min(A,B)` within a pair and preserves its total. Structural edits enter next step; swing next pair. Modes are normal/up/down/updown; rests participate only in normal mode.
90
- - `sequenceend` carries `{sequenceId,reason:'completed'|'stopped'}` outside audio render. It does not establish audible silence: voice release and effect tails may remain.
91
-
92
- Preserve migrated score timing deliberately: a former total envelope of 150 ms with 25 ms release becomes `length:125` in a millisecond sequence, with `release:25`. Keep onset intervals separate. [source: references/api.md]
93
-
94
- ## Native finite-tone repetition
95
-
96
- Require a present `contract.capabilities` map with `toneRepetition === true` and the presence of `repeatTone`, `updateTone` and `stopTone` before enabling native repetition. Published 1.0.2 lacks it. Keep an existing independent-event path or disable the unavailable control; converting a timed recipe to sequence length/sweeps changes its rendering interpretation. [source: references/api.md] [source: references/instruments-and-effects.md]
97
-
98
- `repeatTone({intervalMs,...recipe})` requires an integer interval of 1–60,000 ms and returns a positive `toneId` or numeric `0`. It preserves the finite-tone envelope, endpoint sweeps, gain, routes and optional variation. The first attack starts at the first render opportunity; later deadlines preserve fractional samples across blocks and ignore tempo changes. There are 32 repetition slots independent of the 1–4 sequence slots, sharing the configured pool of at most 32 voices. Reserve capacity for overlaps, prior attacks after edits and other owners; publication does not guarantee admission of every future attack.
99
-
100
- `updateTone({toneId,...changes})` requires a live ID and at least one change. It merges with the last accepted recipe and validates the complete result; `note` and `frequency` replace one another, while supplying both rejects the edit. Invalid edits retain the accepted recipe. Edits affect the next scheduled attack without moving its deadline; the new interval controls the following gap. Sounding attacks retain their original configuration. A supplied variation dictionary replaces the previous dictionary; `{amount:0}` disables future variation. The native stream/counter survives edits unless the seed identity changes. Dropped attacks consume no variation selection and produce no catch-up work.
101
-
102
- `stopTone({toneId})` returns Boolean acceptance and cancels future attacks at the next block, including before the first attack. Already admitted finite voices finish their original lifetimes. Stop remains publishable when the ordinary command queue is full. Unknown/retired IDs reject edits and stops; IDs never repeat during module lifetime, including shutdown/start. There is no `toneend` event. Retain each layer's ID and cancel it on release, cancellation, preset change, pause and owner close. Global `stopAll`, shutdown and destruction invalidate repetitions and pending edits. [source: references/api.md] [source: references/native-variation.md]
103
-
104
- ## Native attack variation
105
-
106
- Variation samples compatible bounded parameters once per admitted attack, preserving authored envelopes, cadence, routes and voice counts. Read all eight source-dependent bounds before constructing ranges. Amount interpolates linearly from the authored value; pitch uses cents. Keep application gain consistent in authored volume and volume-range endpoints.
107
-
108
- An explicit seed repeats standalone selections; native loops advance their stream across attacks. Chords sample independently by voice ordinal. Sustained voices retain their selection through release; `updateNote` rejects `variation`. Step dictionaries replace the whole inherited dictionary. Sequence revisions affect future attacks; root omission retains variation, and disabling inherited and explicit-step variation requires appropriate amount-zero replacements. Use the native sampler for this variation dictionary. Seeds reproduce parameters, not cross-platform noise PCM. [source: references/native-variation.md]
51
+ `getContract().version` and `getDefaults().version` report the installed module version. Use `getContract().waveTypes` for constants and check required capabilities. On iOS, `ambient` respects silent mode and mixes with other apps; the default `playback` session ignores silent mode. [source: references/sound-api.md] [source: references/api.md]
109
52
 
110
- ## Voices, routes and continuous controls
53
+ ## Definitions and executions
111
54
 
112
- `bus` selects `music`, `effects` (default), `ui` or `ambience`. `setMasterProcessing({applyTo:[...]})` selects processed categories, initially all four; an empty array selects none. An explicit `effectSend:0…1` overrides the category selection for that voice. There is one shared chorus/delay/reverb/saturation chain. Input gain and master volume remain global. Selected audio receives processing, rejoins dry audio, and passes one final stereo sample-peak protector. Effects and saturation start disabled. Disable closes input and retains bounded tails up to 30 seconds; panic invalidates histories. [source: references/api.md]
55
+ - Store synthesis and routing in `sound`; store pitch, type and timing in `playback`. Pitch uses `notes` or `frequencies` arrays. When supplied, tone/held/repetition pitch arrays contain exactly one pitch; chords accept 1 to 32. [source: references/sound-api.md]
56
+ - `createSound()` does not start a voice. `getPreset()` returns a detached copy. Use `Sound.set({ sound, playback })` to recursively merge objects, replace whole arrays and validate the complete change atomically for future executions. `null` removes an optional leaf when the result remains valid. Executions already playing keep their revisions. [source: references/sound-api.md]
57
+ - Pass flat temporary overrides to `play(changes)` and `noteOn(changes)`. These calls reject nested preset dictionaries. Switching between `notes` and `frequencies` replaces the previous pitch source. Supplying both throws. [source: references/sound-api.md]
58
+ - An explicit type on the call takes precedence over the preset's declared type. Otherwise, `steps` selects a pattern, multiple pitches select a chord, and one pitch selects a tone. Repetition and held playback need an explicit type, or `noteOn()` for held execution. A type change does not discard incompatible fields. [source: references/sound-api.md]
59
+ - Invalid Sound configurations throw descriptive errors. Operational rejection returns `false`. Do not silently clamp values or retry malformed recipes. Direct methods retain their own return contracts. [source: references/sound-api.md]
113
60
 
114
- Sustained IDs are positive app-owned integers. Release on key up, touch cancellation, pause and teardown. Handle rejected release by retrying twice at 16 ms, then shut down/report if it still fails. These retry timers are lifecycle/error recovery, not a musical clock. Ended/stolen IDs accept edits as no-ops. [source: references/api.md]
61
+ ## Playback and ownership
115
62
 
116
- Compatible `updateNote` fields include frequency, volume, vibrato, resonant filter targets, pulse width, FM, modulations, `noiseRate`, `lowPassHz`, stereo/spatial position and `effectSend`. Transitions take 10 ms and preserve phase, spatial history and the current envelope. `noiseRate:0` is white noise; `lowPassHz:0` bypasses its one-pole filter. Spatial updates require a voice started spatially; stereo `pan` applies to a stereo voice. Do not combine spatial coordinates with stereo pan fields. [source: references/api.md]
63
+ | Interpretation | Accepted result | Owner's responsibility |
64
+ | --- | --- | --- |
65
+ | `tone` / `chord` | `true` | Finite event finishes naturally; no per-event control |
66
+ | `held` / `noteOn()` | Note control | `update()` compatible live fields; `noteOff()` on release/cancel |
67
+ | `repeat` | Repetition control | `update()` future attacks; `stop()` future repetition |
68
+ | `pattern` | Pattern control | `update()`, `getState()`, `stop()`; own its `end` listener |
117
69
 
118
- `priority:0…3`, initially 0, controls eligible replacement under the shared voice pool. Higher priorities remain protected. Chords are admitted or discarded completely; there are no reserved per-category quotas. Gain is fixed per event, with initial chord compensation. Starting unrelated voices does not normalize earlier voices. [source: references/api.md]
70
+ Every execution can return `false`. Check the result type before calling control methods, and keep each control with the interaction that created it. Shutdown invalidates controls; reusable definitions survive shutdown/start. Use `stopAll()` for global panic. [source: references/sound-api.md]
119
71
 
120
- Module 1.0.2 retains zero samples at final output: stereo-linked peak protection acts immediately, recovers exponentially with a 100 ms time constant and uses ceilings of 0.85, or 0.70 for `speakerSafe`. These are sample ceilings, not speaker or inter-sample guarantees; overload changes waveform shape. Master volume uses an independent linear 10 ms ramp on both platforms. iOS now applies the documented `raw` gain, so review existing raw mixes when upgrading. Native Android and Apple callback checks run in CI; device latency, listening and extended maximum-load acceptance remain separate. [source: references/audio-pipeline-validation.md]
72
+ Release held notes when a touch is cancelled, the app pauses or the owner closes. If release is rejected, follow the guide's bounded retry policy. An accepted release retires the control. Compatible live edits preserve phase and envelope through native 10 ms transitions. Waveform, variation, routing category and attack/release cannot change through live note updates. [source: references/sound-api.md] [source: references/guide.md]
121
73
 
122
- `stopAll()` stops every native sequence and finite-tone repetition, cancels future attacks, fades voices and invalidates effect histories. Use `stopSequence({sequenceId})` for one owner’s sequence or `stopTone({toneId})` for its finite repetition. Android closes the engine on root activity destruction; explicit owner teardown remains required. Idle event polling stops when no control work remains and does not schedule musical attacks. [source: references/api.md] [source: references/guide.md] [source: references/audio-engine.md]
74
+ Repetitions use the original finite renderer. Their integer `interval` runs from 1 to 60,000 ms, independently of tempo. An update keeps the next deadline; its new interval controls the following gap. `stop()` lets already admitted attacks finish. Patterns use the native clock, with up to 512 steps and 1 to 4 configured slots. Coalesce replacement scores while capacity is occupied and wait for the owned control's `end` event. `{ reason: 'completed' | 'stopped' }` marks transport retirement; release and effect tails may remain audible. [source: references/sound-api.md]
123
75
 
124
- ## Sound and validation rules
76
+ ## Timing, processing and sound fidelity
125
77
 
126
- - Closed option dictionaries reject unknown keys, wrong types, non-finite/out-of-range values and fractional integer fields. Check acceptance at meaningful boundaries; never silently clamp native options.
127
- - A tone uses at most one of note/frequency; a chord uses exactly one notes/frequencies array. Tone/chord note names differ from sequence MIDI integers.
128
- - Timed tone/chord `duration` includes release: explicit attack must be shorter, release must fit after attack, and attack+decay must fit. `sustain < 1` requires decay. Held/sequence ADSR has its own documented rules.
129
- - FM requires sine; enabled filter fields require a filter type. `fmDepthEnd:0` is a real target, so omit it to disable a sweep. Plain tone FM ratio requires active depth; held/sequence FM-target modulation can start at zero depth.
130
- - WAVETABLE needs 2–64 samples in −1…1. `bitDepth` is 0 or integer 2–16. Pulse width shapes square voices. Read the exact discontinuous ranges and source rules in the API.
131
- - Up to two native sine/triangle LFOs target filterHz, pulseWidth or fmDepth. Free rates and tempo sync are distinct. Empty modulations disables them; omission on update preserves them.
132
- - Use noise for impacts/wind, square for retro rewards, triangle for bass/plucks, sine FM for bells/keys, and filtered saw/noise for moving textures. Keep gains modest enough for release overlap and coherent unison. Listen on the actual speaker/headphones before approving timbre.
78
+ - Finite `duration` includes release; ADSR always uses milliseconds. Pattern root/step `interval` controls attack spacing and `length` controls sounding length, in beats or milliseconds according to `timeUnit`. Preserve those distinctions when adapting recipes. [source: references/sound-api.md]
79
+ - `setVolume(number)` and `setTempo(number)` return Boolean acceptance. Tempo ranges from 20 to 300 BPM. `setProcessing()` uses milliseconds for both delay `time` and reverb `decay`; direct `setMasterProcessing()` retains seconds for reverb decay. Never copy its numeric decay unchanged into the new method. [source: references/upgrade-2.0.0.md]
80
+ - `sound.bus` selects `music`, `effects`, `ui` or `ambience`; processing `applyTo` selects categories, and explicit `effectSend` overrides that selection. There is one shared chain. Keep layer gains and grouped chord admission/compensation when translating effects. [source: references/sound-api.md] [source: references/instruments-and-effects.md]
81
+ - One engine shares up to 32 voices. Reserve overlap and release capacity; repeating attacks can be dropped under admission pressure. Higher priorities protect voices without per-category quotas. [source: references/api.md]
82
+ - Omit spatial coordinates for stereo; two zeros still enable binaural center. Spatial coordinates conflict with stereo pan fields. A held voice must start spatially to accept live position changes. Headphone localization varies by listener and spectrum. [source: references/guide.md]
83
+ - Native `sound.variation` samples bounded parameters once per admitted attack. Check capability/schema, source-dependent ranges and seed behavior; seeds reproduce parameter selection, not cross-platform noise PCM. Keep authored timing, envelopes and gains. [source: references/native-variation.md]
133
84
 
134
- Binaural coordinates span a headphone front plane. Omit both spatial keys to bypass; two zeros still enable binaural center. Map app percentages explicitly and preserve pitch/envelope recipes. Height perception depends on the listener and sound spectrum; output remains stereo without rear sources, room reflections or head tracking. [source: references/api.md]
85
+ ## Compatibility and diagnostics
135
86
 
136
- Timed zero attack/release and rejection diagnostics currently differ between native platforms. Submit exact integer repetition intervals: Apple currently tolerates and truncates extremely near-integer values that Android rejects; see the documented [native interval edge](references/source-notes.md#known-native-interval-edge). Check API acceptance directly; do not infer sample-identical envelopes or a complete rejection tally from validator parity. Read [source notes](references/source-notes.md) for independently rechecked findings. [source: references/api.md]
87
+ Use [the upgrade guide](references/upgrade-2.0.0.md) when retaining direct `playTone`, `playChord`, `repeatTone`, sequence or positive-ID held methods. Their identifiers, event names and partial-update behavior remain distinct from Sound controls. Older binaries require method/capability detection; 1.0.2 lacks repetition and variation. Never send unsupported closed-dictionary keys, including disabled variation. [source: references/api.md] [source: references/native-variation.md]
137
88
 
138
- Diagnostics are opt-in through `enableStats()` / `disableStats()`. Preserve unavailable/null readings; poll UI slowly and clean up its timer. Render load is callback work divided by deadline, not app CPU. Historical host reports, validator parity and hash equality do not establish current physical real-time or listening acceptance. Keep technical results and César's auditory acceptance separate. [source: references/audio-engine.md] [source: references/source-notes.md]
89
+ Use `enableStats()` / `disableStats()` for optional diagnostics. Poll slowly, clear the owner's timer and keep unavailable readings as `null`. Render load measures callback work relative to its deadline. It does not measure app CPU or establish listening acceptance. Check platform caveats before assuming identical envelopes or rejection counters. Listen on the target speaker/headphones before approving timbre. [source: references/audio-engine.md] [source: references/source-notes.md]
139
90
 
140
- Use `ti-game` for native movement/physics and `ti-game-assets` for related visual/audio asset production. Audio scheduling remains in TiSynthEngine; do not change gameplay or install on physical devices without the task's authorization.
91
+ Use `ti-game` for native gameplay and `ti-game-assets` for related visual/audio asset preparation.