@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.
- package/CONTRIBUTING.md +1 -1
- package/README.md +58 -97
- package/agents/ti-pro.md +4 -2
- package/commands/ti-audit.md +7 -5
- package/docs/examples.md +24 -13
- package/docs/knowledge-index.md +2 -1
- package/lib/config.js +1 -0
- package/package.json +1 -1
- package/skills/alloy-guides/SKILL.md +18 -179
- package/skills/alloy-guides/references/CLI_TASKS.md +17 -216
- package/skills/alloy-guides/references/CONCEPTS.md +27 -162
- package/skills/alloy-guides/references/CONTROLLERS.md +38 -236
- package/skills/alloy-guides/references/MODELS.md +47 -723
- package/skills/alloy-guides/references/MODELS_ADVANCED.md +21 -482
- package/skills/alloy-guides/references/VIEWS_DYNAMIC.md +12 -222
- package/skills/alloy-guides/references/VIEWS_STYLES.md +39 -358
- package/skills/alloy-guides/references/VIEWS_XML.md +36 -552
- package/skills/alloy-guides/references/WIDGETS.md +49 -127
- package/skills/alloy-howtos/SKILL.md +14 -169
- package/skills/alloy-howtos/references/best_practices.md +9 -113
- package/skills/alloy-howtos/references/cli_reference.md +18 -223
- package/skills/alloy-howtos/references/config_files.md +50 -133
- package/skills/alloy-howtos/references/debugging_troubleshooting.md +19 -63
- package/skills/alloy-howtos/references/samples.md +21 -138
- package/skills/ti-api/SKILL.md +10 -2
- package/skills/ti-api/references/api-android.md +36 -2
- package/skills/ti-api/references/api-app-platform.md +39 -3
- package/skills/ti-api/references/api-core.md +50 -18
- package/skills/ti-api/references/api-data-network.md +49 -35
- package/skills/ti-api/references/api-media.md +45 -27
- package/skills/ti-api/references/api-services.md +39 -9
- package/skills/ti-api/references/api-ui-android.md +33 -13
- package/skills/ti-api/references/api-ui-extras.md +41 -15
- package/skills/ti-api/references/api-ui-ios-animator.md +42 -26
- package/skills/ti-api/references/api-ui-ios.md +74 -2
- package/skills/ti-api/references/api-ui-lists.md +32 -16
- package/skills/ti-api/references/api-ui-text-input.md +34 -17
- package/skills/ti-api/references/api-ui-views.md +27 -1
- package/skills/ti-api/references/api-ui-windows-navigation.md +32 -18
- package/skills/ti-api/references/api-xml-global.md +66 -16
- package/skills/ti-create-release/SKILL.md +98 -0
- package/skills/ti-create-release/references/module-discovery.md +69 -0
- package/skills/ti-expert/references/adaptive-layouts.md +1 -1
- package/skills/ti-guides/SKILL.md +37 -76
- package/skills/ti-guides/references/advanced-data-and-images.md +122 -126
- package/skills/ti-guides/references/android-manifest.md +24 -83
- package/skills/ti-guides/references/app-distribution.md +31 -377
- package/skills/ti-guides/references/application-frameworks.md +127 -335
- package/skills/ti-guides/references/cli-reference.md +184 -633
- package/skills/ti-guides/references/commonjs-advanced.md +81 -231
- package/skills/ti-guides/references/compatibility-matrix.md +36 -75
- package/skills/ti-guides/references/hello-world.md +95 -70
- package/skills/ti-guides/references/hyperloop-native-access.md +52 -448
- package/skills/ti-guides/references/resources.md +174 -142
- package/skills/ti-guides/references/sdk-release-notes.md +28 -71
- package/skills/ti-guides/references/tiapp-config.md +222 -598
- package/skills/ti-howtos/SKILL.md +23 -123
- package/skills/ti-howtos/references/cross-platform-development.md +119 -324
- package/skills/ti-howtos/references/debugging-profiling.md +77 -445
- package/skills/ti-howtos/references/extending-titanium.md +199 -673
- package/skills/ti-howtos/references/local-data-sources.md +87 -300
- package/skills/ti-howtos/references/location-and-maps.md +86 -213
- package/skills/ti-howtos/references/media-apis.md +103 -223
- package/skills/ti-howtos/references/notification-services.md +86 -506
- package/skills/ti-howtos/references/remote-data-sources.md +97 -316
- package/skills/ti-howtos/references/using-modules.md +77 -133
- package/skills/ti-synthengine/SKILL.md +62 -111
- package/skills/ti-synthengine/assets/example/README.md +50 -59
- package/skills/ti-synthengine/assets/example/app.js +67 -65
- package/skills/ti-synthengine/assets/example/lib/sequenceOwner.js +39 -40
- package/skills/ti-synthengine/assets/example/lib/soundPreset.js +34 -0
- package/skills/ti-synthengine/assets/index.d.ts +122 -2
- package/skills/ti-synthengine/references/advanced-examples.md +4 -4
- package/skills/ti-synthengine/references/api.md +40 -18
- package/skills/ti-synthengine/references/audio-engine.md +15 -57
- package/skills/ti-synthengine/references/examples.md +63 -6
- package/skills/ti-synthengine/references/guide.md +61 -57
- package/skills/ti-synthengine/references/instruments-and-effects.md +15 -15
- package/skills/ti-synthengine/references/native-variation.md +53 -14
- package/skills/ti-synthengine/references/recipes-interaction.md +25 -20
- package/skills/ti-synthengine/references/recipes.md +19 -16
- package/skills/ti-synthengine/references/recommendations.md +12 -12
- package/skills/ti-synthengine/references/sound-api.md +197 -0
- package/skills/ti-synthengine/references/sound-design.md +7 -7
- package/skills/ti-synthengine/references/source-notes.md +62 -172
- package/skills/ti-synthengine/references/troubleshooting.md +17 -19
- package/skills/ti-synthengine/references/upgrade-2.0.0.md +40 -0
- package/skills/ti-ui/SKILL.md +28 -143
- package/skills/ti-ui/references/icons-and-splash-screens.md +74 -403
- package/skills/ti-ui/references/layouts-and-positioning.md +175 -402
- package/skills/ti-ui/references/listviews-and-performance.md +100 -703
- package/skills/ti-ui/references/platform-conventions.md +180 -0
- package/skills/ti-ui/references/user-interface.md +43 -0
- package/skills/alloy-guides/references/VIEWS_WITHOUT_CONTROLLERS.md +0 -102
- package/skills/alloy-howtos/references/custom_tags.md +0 -148
- package/skills/ti-guides/references/coding-best-practices.md +0 -149
- package/skills/ti-guides/references/javascript-primer.md +0 -414
- package/skills/ti-guides/references/reserved-words.md +0 -36
- package/skills/ti-guides/references/style-and-conventions.md +0 -103
- package/skills/ti-howtos/references/android-platform-deep-dives.md +0 -624
- package/skills/ti-howtos/references/automation-fastlane-appium.md +0 -96
- package/skills/ti-howtos/references/buffer-codec-streams.md +0 -162
- package/skills/ti-howtos/references/google-maps-v2.md +0 -172
- package/skills/ti-howtos/references/ios-map-kit.md +0 -149
- package/skills/ti-howtos/references/ios-platform-deep-dives.md +0 -611
- package/skills/ti-howtos/references/tutorials.md +0 -565
- package/skills/ti-howtos/references/web-content-integration.md +0 -287
- package/skills/ti-howtos/references/webpack-build-pipeline.md +0 -124
- package/skills/ti-synthengine/references/android-sim80-correction-evidence.zip +0 -0
- package/skills/ti-synthengine/references/android-sim80-correction.json +0 -162
- package/skills/ti-synthengine/references/audio-pipeline-validation.md +0 -19
- package/skills/ti-synthengine/references/bypass-physical-recheck-evidence.zip +0 -0
- package/skills/ti-synthengine/references/frontier-android-evidence.zip +0 -0
- package/skills/ti-synthengine/references/frontier-ipad-evidence.zip +0 -0
- package/skills/ti-synthengine/references/frontier-physical-validation.json +0 -1918
- package/skills/ti-synthengine/references/native-tone-repetition-validation.md +0 -59
- package/skills/ti-synthengine/references/native-variation-proposal.md +0 -182
- package/skills/ti-synthengine/references/native-variation-validation.md +0 -63
- package/skills/ti-synthengine/references/performance-review-evidence.zip +0 -0
- package/skills/ti-synthengine/references/performance-review.json +0 -1146
- package/skills/ti-synthengine/references/physical-validation.json +0 -1457
- package/skills/ti-synthengine/references/source-snapshot.json +0 -542
- package/skills/ti-synthengine/references/stats-performance.json +0 -2992
- package/skills/ti-synthengine/references/stats-performance.md +0 -82
- package/skills/ti-synthengine/references/studio-validation.json +0 -6202
- package/skills/ti-synthengine/references/unified-bypass-performance.json +0 -22425
- package/skills/ti-synthengine/references/unified-validation.json +0 -314
- package/skills/ti-ui/references/accessibility-deep-dive.md +0 -288
- package/skills/ti-ui/references/animation-and-matrices.md +0 -569
- package/skills/ti-ui/references/application-structures.md +0 -626
- package/skills/ti-ui/references/custom-fonts-styling.md +0 -549
- package/skills/ti-ui/references/event-handling.md +0 -401
- package/skills/ti-ui/references/gestures.md +0 -448
- package/skills/ti-ui/references/orientation.md +0 -374
- package/skills/ti-ui/references/platform-ui-android.md +0 -727
- package/skills/ti-ui/references/platform-ui-ios.md +0 -576
- package/skills/ti-ui/references/scrolling-views.md +0 -288
- package/skills/ti-ui/references/tableviews.md +0 -542
|
@@ -1,181 +1,125 @@
|
|
|
1
1
|
# Using modules
|
|
2
2
|
|
|
3
|
-
|
|
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
|
-
|
|
5
|
+
Two different things get added to a Titanium project and both are called
|
|
6
|
+
dependencies.
|
|
6
7
|
|
|
7
|
-
|
|
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
|
-
|
|
10
|
-
|
|
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
|
-
|
|
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
|
-
|
|
25
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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
|
-
|
|
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
|
-
|
|
51
|
-
# Permanently show
|
|
52
|
-
chflags nohidden ~/Library/
|
|
35
|
+
Check the CLI can see it:
|
|
53
36
|
|
|
54
|
-
|
|
55
|
-
|
|
37
|
+
```sh
|
|
38
|
+
ti module list
|
|
56
39
|
```
|
|
57
40
|
|
|
58
|
-
|
|
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
|
-
|
|
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
|
|
74
|
-
<module
|
|
48
|
+
<module platform="android">ti.map</module>
|
|
49
|
+
<module platform="iphone">ti.map</module>
|
|
75
50
|
</modules>
|
|
76
51
|
```
|
|
77
52
|
|
|
78
|
-
|
|
79
|
-
|
|
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
|
-
|
|
88
|
-
Required for debugging native modules:
|
|
56
|
+
Then require it by id:
|
|
89
57
|
|
|
90
|
-
```
|
|
91
|
-
|
|
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
|
-
|
|
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
|
-
```
|
|
106
|
-
|
|
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
|
-
|
|
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
|
-
|
|
113
|
-
|
|
114
|
-
|
|
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
|
-
|
|
78
|
+
### Where modules live
|
|
118
79
|
|
|
119
|
-
|
|
120
|
-
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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
|
-
|
|
127
|
-
top: 0,
|
|
128
|
-
testing: true,
|
|
129
|
-
adBackgroundColor: 'black',
|
|
130
|
-
primaryTextColor: 'blue',
|
|
131
|
-
publisherId: 'YOUR_PUBLISHER_ID'
|
|
132
|
-
});
|
|
90
|
+
## npm packages
|
|
133
91
|
|
|
134
|
-
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
### Module patterns
|
|
92
|
+
`package.json` in the project root, and `npm install` as normal:
|
|
138
93
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
const admob = require('ti.admob');
|
|
142
|
-
admob.createView({ ... });
|
|
94
|
+
```sh
|
|
95
|
+
npm install lodash
|
|
143
96
|
```
|
|
144
97
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
const Map = require('ti.map');
|
|
148
|
-
const view = Map.createView({ ... });
|
|
98
|
+
```js
|
|
99
|
+
const _ = require('lodash');
|
|
149
100
|
```
|
|
150
101
|
|
|
151
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
166
|
-
|
|
167
|
-
|
|
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
|
-
|
|
170
|
-
Sometimes needed after installing modules:
|
|
118
|
+
If neither exists, writing a native module is covered under Extending Titanium.
|
|
171
119
|
|
|
172
|
-
|
|
173
|
-
# Clean and rebuild
|
|
174
|
-
ti clean
|
|
175
|
-
```
|
|
120
|
+
## Next
|
|
176
121
|
|
|
177
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
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
|
-
|
|
|
36
|
-
|
|
|
37
|
-
|
|
|
38
|
-
|
|
|
39
|
-
|
|
|
40
|
-
|
|
|
41
|
-
|
|
|
42
|
-
|
|
|
43
|
-
|
|
|
44
|
-
|
|
|
45
|
-
|
|
|
46
|
-
|
|
|
47
|
-
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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.
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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
|
-
|
|
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
|
-
##
|
|
53
|
+
## Definitions and executions
|
|
111
54
|
|
|
112
|
-
|
|
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
|
-
|
|
61
|
+
## Playback and ownership
|
|
115
62
|
|
|
116
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
`
|
|
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
|
-
##
|
|
76
|
+
## Timing, processing and sound fidelity
|
|
125
77
|
|
|
126
|
-
-
|
|
127
|
-
-
|
|
128
|
-
-
|
|
129
|
-
-
|
|
130
|
-
-
|
|
131
|
-
-
|
|
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
|
-
|
|
85
|
+
## Compatibility and diagnostics
|
|
135
86
|
|
|
136
|
-
|
|
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
|
-
|
|
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
|
|
91
|
+
Use `ti-game` for native gameplay and `ti-game-assets` for related visual/audio asset preparation.
|