tutticode 0.0.0-stage → 0.1.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/LICENSE +56 -0
- package/README.md +159 -2
- package/README.zh-CN.md +138 -0
- package/dist/skills/tutticode/SKILL.md +140 -0
- package/dist/skills/tutticode/references/agent-loop.md +103 -0
- package/dist/skills/tutticode/references/devices/aligndelay.md +28 -0
- package/dist/skills/tutticode/references/devices/amp.md +25 -0
- package/dist/skills/tutticode/references/devices/analog.md +180 -0
- package/dist/skills/tutticode/references/devices/arpeggiator.md +37 -0
- package/dist/skills/tutticode/references/devices/autopan.md +37 -0
- package/dist/skills/tutticode/references/devices/autoshift.md +66 -0
- package/dist/skills/tutticode/references/devices/beatrepeat.md +35 -0
- package/dist/skills/tutticode/references/devices/cabinet.md +19 -0
- package/dist/skills/tutticode/references/devices/channeleq.md +23 -0
- package/dist/skills/tutticode/references/devices/chorus.md +31 -0
- package/dist/skills/tutticode/references/devices/collision.md +129 -0
- package/dist/skills/tutticode/references/devices/compressor.md +40 -0
- package/dist/skills/tutticode/references/devices/corpus.md +51 -0
- package/dist/skills/tutticode/references/devices/delay.md +37 -0
- package/dist/skills/tutticode/references/devices/denoise.md +19 -0
- package/dist/skills/tutticode/references/devices/drift.md +82 -0
- package/dist/skills/tutticode/references/devices/drumbuss.md +29 -0
- package/dist/skills/tutticode/references/devices/drumrack.md +225 -0
- package/dist/skills/tutticode/references/devices/dsclang.md +26 -0
- package/dist/skills/tutticode/references/devices/dsclap.md +25 -0
- package/dist/skills/tutticode/references/devices/dscymbal.md +22 -0
- package/dist/skills/tutticode/references/devices/dsfm.md +25 -0
- package/dist/skills/tutticode/references/devices/dshh.md +23 -0
- package/dist/skills/tutticode/references/devices/dskick.md +25 -0
- package/dist/skills/tutticode/references/devices/dssnare.md +23 -0
- package/dist/skills/tutticode/references/devices/dstom.md +24 -0
- package/dist/skills/tutticode/references/devices/dynamic-tube.md +26 -0
- package/dist/skills/tutticode/references/devices/echo.md +56 -0
- package/dist/skills/tutticode/references/devices/electric.md +50 -0
- package/dist/skills/tutticode/references/devices/ensemble.md +129 -0
- package/dist/skills/tutticode/references/devices/eqeight.md +69 -0
- package/dist/skills/tutticode/references/devices/eqthree.md +27 -0
- package/dist/skills/tutticode/references/devices/erosion.md +22 -0
- package/dist/skills/tutticode/references/devices/filter.md +55 -0
- package/dist/skills/tutticode/references/devices/filterdelay.md +37 -0
- package/dist/skills/tutticode/references/devices/gate.md +36 -0
- package/dist/skills/tutticode/references/devices/glue.md +36 -0
- package/dist/skills/tutticode/references/devices/graindelay.md +26 -0
- package/dist/skills/tutticode/references/devices/hybrid-reverb.md +22 -0
- package/dist/skills/tutticode/references/devices/impulse.md +157 -0
- package/dist/skills/tutticode/references/devices/leveler.md +23 -0
- package/dist/skills/tutticode/references/devices/limiter.md +26 -0
- package/dist/skills/tutticode/references/devices/meld.md +239 -0
- package/dist/skills/tutticode/references/devices/midichord.md +46 -0
- package/dist/skills/tutticode/references/devices/midifmarp.md +26 -0
- package/dist/skills/tutticode/references/devices/midinoteecho.md +30 -0
- package/dist/skills/tutticode/references/devices/midinotelength.md +27 -0
- package/dist/skills/tutticode/references/devices/midipitch.md +26 -0
- package/dist/skills/tutticode/references/devices/midirandom.md +24 -0
- package/dist/skills/tutticode/references/devices/midiscale.md +25 -0
- package/dist/skills/tutticode/references/devices/midivelocity.md +27 -0
- package/dist/skills/tutticode/references/devices/multibanddynamics.md +62 -0
- package/dist/skills/tutticode/references/devices/operator.md +163 -0
- package/dist/skills/tutticode/references/devices/overdrive.md +24 -0
- package/dist/skills/tutticode/references/devices/pedal.md +26 -0
- package/dist/skills/tutticode/references/devices/phaserflanger.md +42 -0
- package/dist/skills/tutticode/references/devices/pitchshifter.md +56 -0
- package/dist/skills/tutticode/references/devices/redux.md +27 -0
- package/dist/skills/tutticode/references/devices/resonator.md +49 -0
- package/dist/skills/tutticode/references/devices/reverb.md +43 -0
- package/dist/skills/tutticode/references/devices/roar.md +70 -0
- package/dist/skills/tutticode/references/devices/sampler.md +228 -0
- package/dist/skills/tutticode/references/devices/saturator.md +24 -0
- package/dist/skills/tutticode/references/devices/simpler.md +230 -0
- package/dist/skills/tutticode/references/devices/sixop.md +190 -0
- package/dist/skills/tutticode/references/devices/spectralresonator.md +42 -0
- package/dist/skills/tutticode/references/devices/spectraltime.md +45 -0
- package/dist/skills/tutticode/references/devices/synth.md +28 -0
- package/dist/skills/tutticode/references/devices/tension.md +117 -0
- package/dist/skills/tutticode/references/devices/utility.md +29 -0
- package/dist/skills/tutticode/references/devices/vinyl.md +31 -0
- package/dist/skills/tutticode/references/devices/vocoder.md +41 -0
- package/dist/skills/tutticode/references/devices/wavetable.md +128 -0
- package/dist/skills/tutticode/references/devices.md +114 -0
- package/dist/skills/tutticode/references/effect-controls.md +145 -0
- package/dist/skills/tutticode/references/first-sounds.md +89 -0
- package/dist/skills/tutticode/references/for-agents.md +119 -0
- package/dist/skills/tutticode/references/functions.md +1848 -0
- package/dist/skills/tutticode/references/getting-started.md +79 -0
- package/dist/skills/tutticode/references/harmony-and-scales.md +105 -0
- package/dist/skills/tutticode/references/javascript.md +90 -0
- package/dist/skills/tutticode/references/mini-notation.md +120 -0
- package/dist/skills/tutticode/references/mixing.md +101 -0
- package/dist/skills/tutticode/references/muse.md +67 -0
- package/dist/skills/tutticode/references/sample-operations.md +102 -0
- package/dist/skills/tutticode/references/sounds.md +109 -0
- package/dist/skills/tutticode/references/time-and-structure.md +161 -0
- package/dist/skills/tutticode/references/tuttidaw-extensions.md +131 -0
- package/dist/skills/tutticode-sound-for-media/SKILL.md +97 -0
- package/dist/skills/tutticode-sound-for-media/references/music-recipes.md +86 -0
- package/dist/skills/tutticode-sound-for-media/references/sfx-recipes.md +129 -0
- package/dist/tutticode.cjs +18694 -0
- package/package.json +39 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 TuttiDAW
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
22
|
+
|
|
23
|
+
-------------------------------------------------------------------------------
|
|
24
|
+
Notices
|
|
25
|
+
|
|
26
|
+
- This package is a local client. Sound is rendered by the TuttiCode engine on
|
|
27
|
+
https://tuttidaw.com, loaded in your own browser; its use is governed by the
|
|
28
|
+
TuttiDAW terms of use (https://tuttidaw.com/page/terms-of-use). You own the audio you render.
|
|
29
|
+
- The skills and references in dist/skills are TuttiDAW documentation,
|
|
30
|
+
included for use with your AI agents.
|
|
31
|
+
- TuttiCode is a superset of the Strudel pattern language; this package
|
|
32
|
+
contains no Strudel code.
|
|
33
|
+
|
|
34
|
+
Third-party software bundled in dist/tutticode.cjs:
|
|
35
|
+
|
|
36
|
+
ws (https://github.com/websockets/ws), MIT License
|
|
37
|
+
Copyright (c) 2011 Einar Otto Stangvik <einaros@gmail.com>
|
|
38
|
+
Copyright (c) 2013 Arnout Kazemier and contributors
|
|
39
|
+
Copyright (c) 2016 Luigi Pinca and contributors
|
|
40
|
+
|
|
41
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
42
|
+
this software and associated documentation files (the "Software"), to deal in
|
|
43
|
+
the Software without restriction, including without limitation the rights to
|
|
44
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
45
|
+
the Software, and to permit persons to whom the Software is furnished to do so,
|
|
46
|
+
subject to the following conditions:
|
|
47
|
+
|
|
48
|
+
The above copyright notice and this permission notice shall be included in all
|
|
49
|
+
copies or substantial portions of the Software.
|
|
50
|
+
|
|
51
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
52
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
53
|
+
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
54
|
+
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
55
|
+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
56
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,160 @@
|
|
|
1
|
-
#
|
|
1
|
+
# tutticode
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[中文说明](README.zh-CN.md)
|
|
4
|
+
|
|
5
|
+
Turn **TuttiCode** - the [tuttidaw.com/code](https://tuttidaw.com/code)
|
|
6
|
+
pattern language, a superset of Strudel - into audio files from any agent or
|
|
7
|
+
script. A CLI and an MCP server for Claude Code, Copilot CLI, Codex, Cursor,
|
|
8
|
+
Claude Desktop and friends.
|
|
9
|
+
|
|
10
|
+
Rendering happens **in your own browser**, on the same engine as
|
|
11
|
+
tuttidaw.com/code, so a file sounds exactly like the editor. Nothing is
|
|
12
|
+
rendered on a server, there is no account, and it costs nothing. Every result
|
|
13
|
+
carries an `editUrl` that opens the program in TuttiDAW to keep editing.
|
|
14
|
+
|
|
15
|
+
## Install
|
|
16
|
+
|
|
17
|
+
```sh
|
|
18
|
+
npm i -g tutticode # or: npx tutticode ...
|
|
19
|
+
tutticode skills install # skills for Claude Code / Copilot / Codex
|
|
20
|
+
claude mcp add tutticode -- tutticode mcp # MCP clients
|
|
21
|
+
tutticode doctor # check that everything is in place
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Needs Node 20+ and Google Chrome or Microsoft Edge (Chromium works too).
|
|
25
|
+
|
|
26
|
+
Guide: [TuttiCode for agents](https://tuttidaw.com/code/learn/for-agents)
|
|
27
|
+
(install, the two backends, privacy, the browser permission,
|
|
28
|
+
troubleshooting).
|
|
29
|
+
|
|
30
|
+
## Skills
|
|
31
|
+
|
|
32
|
+
`tutticode skills install` installs two skills (also readable online):
|
|
33
|
+
|
|
34
|
+
- [`tutticode`](https://tuttidaw.com/skills/tutticode/SKILL.md) - the
|
|
35
|
+
language: syntax, top mistakes, the `code_check` / `code_render` /
|
|
36
|
+
`code_compare` loop on both backends (this package, or TuttiDAW's web
|
|
37
|
+
MCP), and references for every function, sound and device.
|
|
38
|
+
- [`tutticode-sound-for-media`](https://tuttidaw.com/skills/tutticode-sound-for-media/SKILL.md)
|
|
39
|
+
- music beds, loops, stems and sound effects for videos, apps and games:
|
|
40
|
+
brief -> recipe -> check -> render at an exact length and a platform
|
|
41
|
+
loudness (-14 LUFS web/social, -16 podcasts, -23 broadcast) -> read the
|
|
42
|
+
stats -> revise, with tested recipes (riser, impact, whoosh, UI click /
|
|
43
|
+
confirm / error, notification, transition, ambience bed, music beds).
|
|
44
|
+
|
|
45
|
+
Claude Code, Copilot CLI and Codex read them from `~/.claude/skills`,
|
|
46
|
+
`~/.copilot/skills` and `~/.codex/skills`; `--dir <path>` installs them
|
|
47
|
+
anywhere else (for example a project's `.claude/skills`).
|
|
48
|
+
|
|
49
|
+
## Use
|
|
50
|
+
|
|
51
|
+
```sh
|
|
52
|
+
tutticode check song.tc # diagnostics, no audio
|
|
53
|
+
tutticode render song.tc -o bed.wav --seconds 12 --fade-out 1.5 --lufs -16 --json
|
|
54
|
+
tutticode render song.tc -o loop.flac --loops 4 --stems stems/
|
|
55
|
+
tutticode open song.tc # open it in TuttiCode for a human
|
|
56
|
+
cat song.tc | tutticode check - # read the program from stdin
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
`render` flags: `--seconds|--bars|--loops N`, `--bpm N`,
|
|
60
|
+
`--format wav|flac|mp3` (default from the `-o` extension),
|
|
61
|
+
`--sample-rate 44100|48000`, `--bit-depth 16|24`, `--stems <dir>`,
|
|
62
|
+
`--fade-in s`, `--fade-out s`, `--tail s`, `--lufs N`, `--true-peak N`,
|
|
63
|
+
`--json`, `--timeout s`. `--lufs` applies one static gain; when the true-peak
|
|
64
|
+
ceiling cannot be met the render fails with `clip` instead of being limited.
|
|
65
|
+
|
|
66
|
+
`--json` prints the render report: length, bars, tempo, loudness and true
|
|
67
|
+
peak, the gain applied, per-voice levels, the bar and beat grid (seconds, for
|
|
68
|
+
syncing cuts), the check report, the analysis, the `editUrl` and the written
|
|
69
|
+
files. Audio is never printed.
|
|
70
|
+
|
|
71
|
+
Exit codes: `0` ok, `1` errors in the code (or a loudness target that would
|
|
72
|
+
clip), `2` bridge or browser problem, `3` usage.
|
|
73
|
+
|
|
74
|
+
### MCP tools
|
|
75
|
+
|
|
76
|
+
`tutticode mcp` serves the same tools as TuttiDAW's web agent loop, so one
|
|
77
|
+
skill teaches both:
|
|
78
|
+
|
|
79
|
+
| tool | what it does |
|
|
80
|
+
| --- | --- |
|
|
81
|
+
| `code_check` | compile and plan, no audio: diagnostics, voices, mix warnings |
|
|
82
|
+
| `code_render` | render to a file (`out`), returns paths + statistics + `editUrl` |
|
|
83
|
+
| `code_compare` | compare a render with goals (or a Muse style), or two renders |
|
|
84
|
+
| `code_open` | open a program in a visible TuttiCode tab (`tutticode mcp --headless`: no window, returns the link) |
|
|
85
|
+
| `code_reference` | search the TuttiCode reference shipped in the package |
|
|
86
|
+
|
|
87
|
+
The reference documents are also MCP resources (`tutticode://skills/...`).
|
|
88
|
+
|
|
89
|
+
## How it works
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
agent --CLI/MCP--> tutticode (Node) --WebSocket 127.0.0.1--> tuttidaw.com/code/bridge (your browser)
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
1. The first call starts a local server on `127.0.0.1` with a random port
|
|
96
|
+
and a fresh 128-bit token, and opens
|
|
97
|
+
`https://tuttidaw.com/<locale>/code/bridge#p=<port>&t=<token>`. The port and
|
|
98
|
+
token sit in the URL fragment, which browsers never send to the server.
|
|
99
|
+
2. The page connects back, renders with the TuttiCode engine and streams the
|
|
100
|
+
audio to tutticode, which writes your files.
|
|
101
|
+
3. The bridge stays warm for 10 minutes, so later calls skip the startup.
|
|
102
|
+
|
|
103
|
+
By default (MCP and non-interactive calls) tutticode starts a **headless**
|
|
104
|
+
Chrome or Edge from your install with its own profile in
|
|
105
|
+
`~/.tutticode/browser-profile` and grants that profile the Local Network
|
|
106
|
+
Access permission for tuttidaw.com. That profile is yours (you installed
|
|
107
|
+
tutticode), so tutticode also gives the bridge page's one-time consent
|
|
108
|
+
("Allow this agent to render sound with TuttiCode") in it, for tuttidaw.com
|
|
109
|
+
only. `--show` uses a visible tab in your default browser instead (the
|
|
110
|
+
default when you type a command in a terminal); there tutticode grants
|
|
111
|
+
nothing: the first time, the page asks for your consent and the browser asks
|
|
112
|
+
whether tuttidaw.com may access devices on your local network - allow both,
|
|
113
|
+
or run `tutticode setup` for the second.
|
|
114
|
+
|
|
115
|
+
Security: the server listens on 127.0.0.1 only, accepts one page at a time,
|
|
116
|
+
only from `https://tuttidaw.com` (or an origin you pass with `--origin` /
|
|
117
|
+
`--dev-origin`), only with the session token, and checks the Host header.
|
|
118
|
+
The CLI talks to its background bridge over a second token in
|
|
119
|
+
`~/.tutticode`, which web pages cannot reach. The headless browser is driven
|
|
120
|
+
over a private pipe (`--remote-debugging-pipe`), never a DevTools TCP port
|
|
121
|
+
other programs could connect to. Everything the page sends back is checked
|
|
122
|
+
before it touches your disk: the format, the numbers and the stem names are
|
|
123
|
+
validated, stem files are named from a safe character set and only ever
|
|
124
|
+
written inside the stems folder, and never through a symbolic link.
|
|
125
|
+
|
|
126
|
+
## Commands
|
|
127
|
+
|
|
128
|
+
- `tutticode doctor` - Node, the browser, the page, the connection and the
|
|
129
|
+
engine version.
|
|
130
|
+
- `tutticode setup` - explains, asks, and then sets the browser policy
|
|
131
|
+
`LocalNetworkAccessAllowedForUrls = ["https://tuttidaw.com"]` for your
|
|
132
|
+
user (Windows: HKCU registry; macOS: `defaults`; Linux: a managed policy
|
|
133
|
+
file, needs sudo) so `--show` needs no click. `tutticode setup --undo`
|
|
134
|
+
removes exactly that entry. Also installs the skills (`--no-skills` to
|
|
135
|
+
skip).
|
|
136
|
+
- `tutticode skills install [--claude] [--copilot] [--codex] [--dir <path>]`
|
|
137
|
+
- copies both skills (`tutticode`, `tutticode-sound-for-media`) into `~/.claude/skills`, `~/.copilot/skills`,
|
|
138
|
+
`~/.codex/skills` (default: every agent folder that exists).
|
|
139
|
+
|
|
140
|
+
Bridge flags for every command: `--show` / `--headless`,
|
|
141
|
+
`--browser chrome|edge|<path>`, `--origin <url>` (staging / local dev),
|
|
142
|
+
`--dev-origin <url>`, `--locale <locale>`, `--no-daemon`, `--verbose`.
|
|
143
|
+
Environment: `TUTTICODE_BROWSER` (browser path), `TUTTICODE_HOME` (state
|
|
144
|
+
folder), `TUTTICODE_BROWSER_ARGS` (extra browser flags).
|
|
145
|
+
|
|
146
|
+
## Privacy
|
|
147
|
+
|
|
148
|
+
tutticode sends no telemetry. Your program goes only to the TuttiCode page
|
|
149
|
+
in your own browser. Logs stay in `~/.tutticode/logs` and never contain your
|
|
150
|
+
program or audio.
|
|
151
|
+
|
|
152
|
+
## Browsers
|
|
153
|
+
|
|
154
|
+
Chrome and Edge (desktop) are supported. Firefox and Safari may work with
|
|
155
|
+
`--show` but are not tested.
|
|
156
|
+
|
|
157
|
+
## License
|
|
158
|
+
|
|
159
|
+
MIT for this package; see [LICENSE](LICENSE). Rendering uses the TuttiCode
|
|
160
|
+
engine on tuttidaw.com under the TuttiDAW terms of use.
|
package/README.zh-CN.md
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# tutticode
|
|
2
|
+
|
|
3
|
+
[English](README.md)
|
|
4
|
+
|
|
5
|
+
把 **TuttiCode**([tuttidaw.com/code](https://tuttidaw.com/code) 的 pattern 语言,
|
|
6
|
+
Strudel 的超集)变成音频文件,任何 agent 或脚本都能用。它是一个 CLI,也是一个
|
|
7
|
+
MCP server,适用于 Claude Code、Copilot CLI、Codex、Cursor、Claude Desktop 等。
|
|
8
|
+
|
|
9
|
+
渲染**在你自己的浏览器里**进行,用的就是 tuttidaw.com/code 的同一个引擎,所以
|
|
10
|
+
文件和编辑器里听到的一模一样。不经过服务器渲染,不需要账号,也不收费。每个结果
|
|
11
|
+
都带一个 `editUrl`,可以在 TuttiDAW 里打开这段程序继续编辑。
|
|
12
|
+
|
|
13
|
+
## 安装
|
|
14
|
+
|
|
15
|
+
```sh
|
|
16
|
+
npm i -g tutticode # 或者: npx tutticode ...
|
|
17
|
+
tutticode skills install # 给 Claude Code / Copilot / Codex 装 skill
|
|
18
|
+
claude mcp add tutticode -- tutticode mcp # MCP 客户端
|
|
19
|
+
tutticode doctor # 检查环境是否就绪
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
需要 Node 20+,以及 Google Chrome 或 Microsoft Edge(Chromium 也可以)。
|
|
23
|
+
|
|
24
|
+
使用指南:[给 agent 用的 TuttiCode](https://tuttidaw.com/zh-CN/code/learn/for-agents)
|
|
25
|
+
(安装、两个后端、隐私、浏览器权限、常见问题)。
|
|
26
|
+
|
|
27
|
+
## Skill
|
|
28
|
+
|
|
29
|
+
`tutticode skills install` 会安装两个 skill(也可以在线阅读):
|
|
30
|
+
|
|
31
|
+
- [`tutticode`](https://tuttidaw.com/skills/tutticode/SKILL.md) —— 语言本身:
|
|
32
|
+
语法、常见错误、在两个后端(本包,或 TuttiDAW 网页版 MCP)上的
|
|
33
|
+
`code_check` / `code_render` / `code_compare` 循环,以及每个函数、音色和设备的参考。
|
|
34
|
+
- [`tutticode-sound-for-media`](https://tuttidaw.com/skills/tutticode-sound-for-media/SKILL.md)
|
|
35
|
+
—— 为视频、应用和游戏做配乐、循环、分轨和音效:需求 -> 配方 -> 检查 -> 按精确时长和
|
|
36
|
+
平台响度渲染(网页/社交 -14 LUFS、播客 -16、广播 -23)-> 读数据 -> 修改;配方都经过测试
|
|
37
|
+
(riser、impact、whoosh、UI 点击/确认/错误、通知、转场、环境音床、配乐)。
|
|
38
|
+
|
|
39
|
+
Claude Code、Copilot CLI 和 Codex 分别从 `~/.claude/skills`、`~/.copilot/skills`、
|
|
40
|
+
`~/.codex/skills` 读取;`--dir <路径>` 可以装到其他任何地方(比如项目里的 `.claude/skills`)。
|
|
41
|
+
|
|
42
|
+
## 用法
|
|
43
|
+
|
|
44
|
+
```sh
|
|
45
|
+
tutticode check song.tc # 只检查,不出声音
|
|
46
|
+
tutticode render song.tc -o bed.wav --seconds 12 --fade-out 1.5 --lufs -16 --json
|
|
47
|
+
tutticode render song.tc -o loop.flac --loops 4 --stems stems/
|
|
48
|
+
tutticode open song.tc # 在 TuttiCode 里打开给人看
|
|
49
|
+
cat song.tc | tutticode check - # 从 stdin 读程序
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
`render` 参数: `--seconds|--bars|--loops N`、`--bpm N`、
|
|
53
|
+
`--format wav|flac|mp3`(默认按 `-o` 的扩展名)、`--sample-rate 44100|48000`、
|
|
54
|
+
`--bit-depth 16|24`、`--stems <目录>`、`--fade-in 秒`、`--fade-out 秒`、
|
|
55
|
+
`--tail 秒`、`--lufs N`、`--true-peak N`、`--json`、`--timeout 秒`。
|
|
56
|
+
`--lufs` 只做一次静态增益;如果达不到 true peak 上限,会以 `clip` 失败,而不是
|
|
57
|
+
偷偷加限制器。
|
|
58
|
+
|
|
59
|
+
`--json` 输出渲染报告:时长、小节数、速度、响度和 true peak、施加的增益、每个
|
|
60
|
+
声部的电平、小节和拍的时间点(秒,用来对齐剪辑点)、检查报告、分析结果、
|
|
61
|
+
`editUrl` 和写出的文件路径。永远不会把音频打印到终端。
|
|
62
|
+
|
|
63
|
+
退出码: `0` 成功, `1` 代码有错(或响度目标会削波), `2` bridge / 浏览器问题,
|
|
64
|
+
`3` 用法错误。
|
|
65
|
+
|
|
66
|
+
### MCP 工具
|
|
67
|
+
|
|
68
|
+
`tutticode mcp` 提供和 TuttiDAW 网页版 agent loop 相同的工具,一份 skill 两边通用:
|
|
69
|
+
|
|
70
|
+
| 工具 | 作用 |
|
|
71
|
+
| --- | --- |
|
|
72
|
+
| `code_check` | 编译并规划,不出声音:诊断、声部、混音提醒 |
|
|
73
|
+
| `code_render` | 渲染到文件(`out`),返回路径 + 统计 + `editUrl` |
|
|
74
|
+
| `code_compare` | 把一次渲染和目标(或 Muse 风格)比较,或比较两次渲染 |
|
|
75
|
+
| `code_open` | 在可见的 TuttiCode 标签页里打开程序(`tutticode mcp --headless` 时不开窗口,只返回链接) |
|
|
76
|
+
| `code_reference` | 搜索包里自带的 TuttiCode 参考文档 |
|
|
77
|
+
|
|
78
|
+
参考文档同时作为 MCP resources 提供(`tutticode://skills/...`)。
|
|
79
|
+
|
|
80
|
+
## 工作原理
|
|
81
|
+
|
|
82
|
+
```
|
|
83
|
+
agent --CLI/MCP--> tutticode (Node) --WebSocket 127.0.0.1--> tuttidaw.com/code/bridge (你的浏览器)
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
1. 第一次调用时,在 `127.0.0.1` 的随机端口上启动本地服务,生成新的 128 位
|
|
87
|
+
token,然后打开 `https://tuttidaw.com/<locale>/code/bridge#p=<端口>&t=<token>`。
|
|
88
|
+
端口和 token 放在 URL 的 fragment(`#` 后面),浏览器不会把它发给服务器。
|
|
89
|
+
2. 页面连回本地服务,用 TuttiCode 引擎渲染,把音频传回 tutticode,由它写文件。
|
|
90
|
+
3. bridge 会保持 10 分钟,后续调用不用重新启动。
|
|
91
|
+
|
|
92
|
+
默认情况下(MCP 和非交互调用),tutticode 会用你已安装的 Chrome 或 Edge 启动一个
|
|
93
|
+
**无头(headless)**浏览器,使用独立的配置目录 `~/.tutticode/browser-profile`,并
|
|
94
|
+
给这个配置授予 tuttidaw.com 的"本地网络访问"权限。这个配置是你自己的(tutticode 是
|
|
95
|
+
你装的),所以 tutticode 也会在其中代你给出 bridge 页面的一次性同意("允许这个 agent
|
|
96
|
+
用 TuttiCode 渲染声音"),只对 tuttidaw.com 生效。`--show` 改为在默认浏览器里打开
|
|
97
|
+
可见标签页(在终端里手动敲命令时默认如此),这时 tutticode 不代授任何东西:第一次
|
|
98
|
+
页面会请你同意,浏览器也会询问是否允许 tuttidaw.com 访问本地网络上的设备 —— 两者都
|
|
99
|
+
选允许,后者也可以运行 `tutticode setup` 免去。
|
|
100
|
+
|
|
101
|
+
安全:服务只监听 127.0.0.1,同一时间只接受一个页面,只接受来自
|
|
102
|
+
`https://tuttidaw.com`(或你用 `--origin` / `--dev-origin` 指定的来源)且带有本次
|
|
103
|
+
token 的连接,并检查 Host 头。CLI 和后台 bridge 之间用 `~/.tutticode` 里的另一个
|
|
104
|
+
token 通信,网页无法访问。无头浏览器通过私有管道(`--remote-debugging-pipe`)控制,
|
|
105
|
+
从不开放其他程序能连上的 DevTools TCP 端口。页面传回的一切在写盘前都要校验:格式、
|
|
106
|
+
数值和分轨名都会检查,分轨文件名只用安全字符,只写进分轨文件夹,也绝不经由符号链接写入。
|
|
107
|
+
|
|
108
|
+
## 命令
|
|
109
|
+
|
|
110
|
+
- `tutticode doctor` —— 检查 Node、浏览器、页面、连接和引擎版本。
|
|
111
|
+
- `tutticode setup` —— 先说明、再询问,同意后为当前用户设置浏览器策略
|
|
112
|
+
`LocalNetworkAccessAllowedForUrls = ["https://tuttidaw.com"]`
|
|
113
|
+
(Windows:HKCU 注册表;macOS:`defaults`;Linux:托管策略文件,需要 sudo),
|
|
114
|
+
这样 `--show` 不再需要点击确认。`tutticode setup --undo` 只删除这一条。
|
|
115
|
+
同时安装 skill(`--no-skills` 跳过)。
|
|
116
|
+
- `tutticode skills install [--claude] [--copilot] [--codex] [--dir <路径>]`
|
|
117
|
+
—— 把两个 skill(`tutticode`、`tutticode-sound-for-media`)复制到 `~/.claude/skills`、`~/.copilot/skills`、
|
|
118
|
+
`~/.codex/skills`(默认:所有已存在的 agent 目录)。
|
|
119
|
+
|
|
120
|
+
所有命令通用的 bridge 参数:`--show` / `--headless`、
|
|
121
|
+
`--browser chrome|edge|<路径>`、`--origin <url>`(预发 / 本地开发)、
|
|
122
|
+
`--dev-origin <url>`、`--locale <语言>`、`--no-daemon`、`--verbose`。
|
|
123
|
+
环境变量:`TUTTICODE_BROWSER`(浏览器路径)、`TUTTICODE_HOME`(状态目录)、
|
|
124
|
+
`TUTTICODE_BROWSER_ARGS`(额外的浏览器参数)。
|
|
125
|
+
|
|
126
|
+
## 隐私
|
|
127
|
+
|
|
128
|
+
tutticode 不发送任何遥测数据。你的程序只会交给你自己浏览器里的 TuttiCode 页面。
|
|
129
|
+
日志保存在 `~/.tutticode/logs`,不包含程序内容和音频。
|
|
130
|
+
|
|
131
|
+
## 浏览器
|
|
132
|
+
|
|
133
|
+
支持桌面版 Chrome 和 Edge。Firefox 和 Safari 用 `--show` 可能可以用,但未测试。
|
|
134
|
+
|
|
135
|
+
## 许可
|
|
136
|
+
|
|
137
|
+
本包采用 MIT 许可,见 [LICENSE](LICENSE)。渲染使用 tuttidaw.com 上的 TuttiCode
|
|
138
|
+
引擎,遵循 TuttiDAW 使用条款。
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tutticode
|
|
3
|
+
description: Write, fix, check and render TuttiCode (TuttiDAW Code): Strudel-compatible live-coding pattern programs (mini-notation, note/s/n, scales, chords, effects, samples) that play on TuttiDAW instruments and effects, plus TuttiCode-only .inst/.fx/.midifx devices. Covers the code_check / code_render / code_compare tools of the local tutticode CLI/MCP and the TuttiDAW web MCP. Use when asked for Strudel, TuttiCode or TuttiDAW code, a beat/melody/loop as code, a tuttidaw.com/code link, a Pattern Clip, rendering code to audio, or when a pattern program errors.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# TuttiCode
|
|
7
|
+
|
|
8
|
+
TuttiCode (TuttiDAW Code) is a pattern language for music: a superset of
|
|
9
|
+
Strudel (strudel.cc) that plays on TuttiDAW's instruments and effects. A
|
|
10
|
+
program is JavaScript built from pattern functions; double-quoted strings are
|
|
11
|
+
mini-notation. It loops: one cycle = one bar.
|
|
12
|
+
|
|
13
|
+
## Core syntax
|
|
14
|
+
|
|
15
|
+
```js
|
|
16
|
+
setcpm(30) // cycles (bars) per minute: 30 = 120 BPM in 4/4
|
|
17
|
+
drums: s("bd [~ bd] sd ~, hh*8").bank("tr909") // a labelled voice = one track
|
|
18
|
+
bass: note("c2 [~ c2] eb2 g1").s("sawtooth").lpf(800)
|
|
19
|
+
chords: chord("<Cm7 Ab^7 Fm7 G7>").voicing().inst("Electric").fx("Reverb:Large Hall")
|
|
20
|
+
_lead: n("0 2 4 7").scale("C:minor") // a leading _ mutes a voice
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
- Mini-notation: `a b c` steps share a cycle; `~` rest; `[a b]` one step;
|
|
24
|
+
`<a b>` one per cycle; `a,b` together; `*n` `/n` faster/slower; `@n`
|
|
25
|
+
longer; `!n` repeat; `x(3,8)` Euclidean; `?` maybe; `a|b` random choice;
|
|
26
|
+
`{a b c, d e}` polymeter; `bd:3` variant.
|
|
27
|
+
- Pitches: `note("c4")` = MIDI 60; no octave = octave 3. `n("0 2 4").scale("C:minor")`
|
|
28
|
+
plays scale degrees (root in octave 3). `chord("Am7").voicing()` voices
|
|
29
|
+
chord symbols.
|
|
30
|
+
- Time: `.fast` `.slow` `.early` `.late` `.rev` `.ply` `.iter` `.every(n, f)`
|
|
31
|
+
`.lastOf(n, f)` `.off(t, f)` `.superimpose(f)` `.struct("x ~ x")`
|
|
32
|
+
`.mask("1 0")` `.swingBy(1/3, 4)`; combine with `stack` `cat` `seq`
|
|
33
|
+
`arrange([4, a], [2, b])`. `f` is an arrow function: `x => x.fast(2)`.
|
|
34
|
+
- Sound: `s("bd sd hh cp oh")` drums (`.bank("tr808")`), waveforms
|
|
35
|
+
`sine triangle square sawtooth supersaw`, `piano`, `gm_*` names.
|
|
36
|
+
- Controls: `.gain` `.velocity` `.pan` `.lpf` `.hpf` `.lpq` `.room` `.size`
|
|
37
|
+
`.delay` `.delaytime` `.delayfeedback` `.shape` `.crush` `.attack`
|
|
38
|
+
`.decay` `.sustain` `.release`; signals `sine saw tri perlin rand` with
|
|
39
|
+
`.range(a, b)` `.slow(n)` `.segment(n)`.
|
|
40
|
+
- TuttiDAW only: `.inst("Device:Preset", {key: value})` instrument,
|
|
41
|
+
`.midifx(...)` before it, `.fx(...)` after it, in call order. Params use the
|
|
42
|
+
device's keys and units (`"4s"`, `"-6dB"`, `"1/16"`); constants only for now.
|
|
43
|
+
`toggle(1)` is an inline switch. These disable the strudel.cc link.
|
|
44
|
+
|
|
45
|
+
## Top mistakes
|
|
46
|
+
|
|
47
|
+
1. **Octaves**: code `c4` is MIDI 60, but TuttiDAW's piano roll (like
|
|
48
|
+
Ableton Live) labels MIDI 60 as C3. Write code names; a request for "C3"
|
|
49
|
+
from a Live user may mean MIDI 60.
|
|
50
|
+
2. **Arithmetic on controls**: `note("c e").add(12)` does nothing (warning);
|
|
51
|
+
write `note("c e").add(note(12))` or `n("0 2".add(7))`.
|
|
52
|
+
3. **Multi-word scales** need colons inside quotes: `"C:harmonic:minor"`,
|
|
53
|
+
`"A:minor:pentatonic"`. `"C:harmonic minor"` is two steps.
|
|
54
|
+
4. **Device calls inside callbacks** fail: `every(2, x => x.fx(...))` is an
|
|
55
|
+
error; a voice has one chain. Put `.inst/.fx/.midifx` on the voice.
|
|
56
|
+
5. **Patterned device params** (`{cutoff: "<300 900>"}`) are not applied
|
|
57
|
+
yet; use Strudel controls (`.lpf("<300 900>")`) for movement.
|
|
58
|
+
6. **One `.inst` per voice**; a second is an error. Use another voice.
|
|
59
|
+
7. **Single vs double quotes**: double quotes are mini-notation; single
|
|
60
|
+
quotes are plain strings (`register('name', ...)`, `.scale('C minor')`).
|
|
61
|
+
8. **No browser APIs**: no `fetch`, `import`, timers or DOM; code runs in a
|
|
62
|
+
deterministic sandbox (seeded `Math.random`, fixed `Date`).
|
|
63
|
+
9. **Unknown sound names** fall back with a warning; check
|
|
64
|
+
`references/sounds.md` and `references/devices.md`. Noise is
|
|
65
|
+
`s("white")`, `s("pink")` or `s("brown")` (hard to soft).
|
|
66
|
+
10. **Voice labels** become track names: label every voice
|
|
67
|
+
(`kick:`, `bass:`) instead of `$:` when the program goes to the studio.
|
|
68
|
+
|
|
69
|
+
## Tools: two backends, one API
|
|
70
|
+
|
|
71
|
+
The same tools, with the same names and report shapes, run on two backends.
|
|
72
|
+
Use whichever this agent has; prefer the local one.
|
|
73
|
+
|
|
74
|
+
- **Local `tutticode`** (default; free, no account): the `tutticode` CLI
|
|
75
|
+
and MCP server (`npm i -g tutticode`, `tutticode mcp`) render in the
|
|
76
|
+
user's own browser with the tuttidaw.com/code engine and write files to
|
|
77
|
+
disk, up to 300 s. Its tool descriptions say "Runs locally". Without MCP,
|
|
78
|
+
call the CLI: `tutticode check prog.tc`, `tutticode render prog.tc -o
|
|
79
|
+
out.wav --seconds 12 --lufs -16 --json`, `tutticode open prog.tc`.
|
|
80
|
+
Program code goes only to the user's browser, never to TuttiDAW's servers.
|
|
81
|
+
- **Web**: TuttiDAW's MCP server (`https://tuttidaw.com/api/mcp`, OAuth) or
|
|
82
|
+
HTTP (`POST https://tuttidaw.com/api/code/check|render|compare`). Renders
|
|
83
|
+
on TuttiDAW's servers (signed in, costs Muse points, 16 bars / 60 s) and
|
|
84
|
+
returns a `listenUrl` instead of files. Only this backend compares with a
|
|
85
|
+
reference recording.
|
|
86
|
+
|
|
87
|
+
| tool | what it does |
|
|
88
|
+
| --- | --- |
|
|
89
|
+
| `code_check` | compile and plan, no audio: diagnostics, voices, mix warnings. Free, deterministic |
|
|
90
|
+
| `code_render` | render and measure: loudness, true peak, bands, groove, per-voice levels |
|
|
91
|
+
| `code_compare` | a render against goals (or a Muse `style`), or two renders (A/B) |
|
|
92
|
+
| `code_open` | (local) open the program in a visible TuttiCode tab for the user |
|
|
93
|
+
| `code_reference` | (local) search these references |
|
|
94
|
+
|
|
95
|
+
## Workflow: write -> check -> render -> revise
|
|
96
|
+
|
|
97
|
+
1. **Write** the smallest program that does the job; label each voice.
|
|
98
|
+
2. **`code_check`** after every edit; fix every `error` diagnostic (line,
|
|
99
|
+
column and a `fix` hint), then the mix `warnings`. Never render to find
|
|
100
|
+
syntax errors. Without tools, compare every name with
|
|
101
|
+
`references/functions.md` and `references/devices.md`.
|
|
102
|
+
3. **`code_render`** once the check is clean, then read the numbers
|
|
103
|
+
(`references/agent-loop.md`): loudness, clipping, silent bars, which
|
|
104
|
+
voice dominates. Change one thing at a time; `code_compare` tells you
|
|
105
|
+
whether it moved what you meant.
|
|
106
|
+
4. **Hand over** the `editUrl` (local) or `listenUrl` (web) with the
|
|
107
|
+
files: it opens the program in TuttiCode, where **Open in TuttiDAW**
|
|
108
|
+
saves it as a project with one track per voice. Without tools, link
|
|
109
|
+
`https://tuttidaw.com/code#<payload>`, the payload being the UTF-8 code
|
|
110
|
+
in base64, URI-encoded (`encodeURIComponent(btoa(utf8))`, as strudel.cc's
|
|
111
|
+
long links).
|
|
112
|
+
|
|
113
|
+
Pattern Clips in an open TuttiDAW project are edited with the web MCP's
|
|
114
|
+
`read_pattern` / `write_pattern` (notes only; devices apply on /code and in
|
|
115
|
+
group programs). Sound for videos, apps and games: the
|
|
116
|
+
`tutticode-sound-for-media` skill.
|
|
117
|
+
|
|
118
|
+
## References
|
|
119
|
+
|
|
120
|
+
Read only what the task needs:
|
|
121
|
+
|
|
122
|
+
- `references/agent-loop.md`: reading the code_check / code_render / code_compare reports, loudness targets, lengths and the `clip` error, on both backends.
|
|
123
|
+
- `references/getting-started.md`: Getting started. What TuttiCode is, how a program loops, and how to play your first line.
|
|
124
|
+
- `references/first-sounds.md`: First sounds. Drums with s(), pitches with note(), and the difference between them.
|
|
125
|
+
- `references/mini-notation.md`: Mini-notation. The rhythm language inside the quotes - sequences, rests, groups, alternation, polymeter, Euclidean rhythms and chance.
|
|
126
|
+
- `references/time-and-structure.md`: Time and structure. Functions that speed up, shift, reverse, repeat and combine patterns, and arrange them into sections.
|
|
127
|
+
- `references/harmony-and-scales.md`: Harmony and scales. Note names and octaves, scale degrees, transposition, chord symbols, voicings and arpeggios.
|
|
128
|
+
- `references/sounds.md`: Sounds. Drum kits and banks, synth waveforms, General MIDI instrument names, Ensemble sounds and your own samples.
|
|
129
|
+
- `references/effect-controls.md`: Effect controls. Filters, reverb, delay, distortion, panning, envelopes and synth controls - and moving them with signals.
|
|
130
|
+
- `references/sample-operations.md`: Sample operations. Play part of a sample, change its speed, cut it into slices, fit it to the tempo and choke it.
|
|
131
|
+
- `references/tuttidaw-extensions.md`: TuttiDAW extensions. Load any TuttiDAW instrument, MIDI effect or audio effect with presets and parameters; voices, groups and Open in TuttiDAW.
|
|
132
|
+
- `references/mixing.md`: Mixing: buses and master. Shared reverbs and delays on buses, sends from the voices, each voice's fader and pan, and the program's master chain - the same tracks Open in TuttiDAW makes.
|
|
133
|
+
- `references/javascript.md`: JavaScript in code. Variables, functions, loops and register - and the sandbox, determinism and limits that keep shared code safe.
|
|
134
|
+
- `references/muse.md`: Muse on /TuttiCode. Ask TuttiDAW's AI assistant to write, explain, fix or restyle your program, from text, a Strudel tune, a screenshot or a reference track.
|
|
135
|
+
- `references/for-agents.md`: TuttiCode for agents. Let Claude Code, Copilot, Codex or any MCP client write TuttiCode and render it to audio files in your own browser, with the tutticode CLI, MCP server and skills.
|
|
136
|
+
- `references/functions.md`: every function, method and signal, with signature, description and example (generated from the engine).
|
|
137
|
+
- `references/devices.md`: every instrument and effect for `.inst/.fx/.midifx`, with `references/devices/<id>.md` per device: param keys, ranges, units, presets (generated from the device catalogue).
|
|
138
|
+
|
|
139
|
+
Language: PATTERN LANGUAGE 1.2.0, engine 15.
|
|
140
|
+
Human guide: https://tuttidaw.com/code/learn; agents: https://tuttidaw.com/code/learn/for-agents
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# The agent loop: check, render, compare, revise
|
|
2
|
+
|
|
3
|
+
You cannot hear. `code_check`, `code_render` and `code_compare` give you
|
|
4
|
+
what a producer hears, as numbers. Both backends (local `tutticode`, web
|
|
5
|
+
MCP / `/api/code`) take the same requests and return the same fields;
|
|
6
|
+
differences are marked *local* or *web*.
|
|
7
|
+
|
|
8
|
+
## When to call which
|
|
9
|
+
|
|
10
|
+
| Situation | Call |
|
|
11
|
+
| --- | --- |
|
|
12
|
+
| After every edit | `code_check`. Fix every `error` before anything else |
|
|
13
|
+
| The check is clean and you need to know how it sounds | `code_render` (one loop is enough while sketching) |
|
|
14
|
+
| You have a target ("streaming loudness", "like house") | `code_compare` with `goals` or `goals.style` |
|
|
15
|
+
| You changed one thing: did it help? | `code_compare` with `renderId` (new) and `againstRenderId` (old) |
|
|
16
|
+
| *web*: `status: "queued"` / `"rendering"` | `code_render { renderId }` to wait |
|
|
17
|
+
|
|
18
|
+
## Reading `code_check`
|
|
19
|
+
|
|
20
|
+
- `diagnostics[]`: `severity`, `code`, `line`/`col` (1-based), `snippet`, a
|
|
21
|
+
`fix` hint. `error` blocks rendering; `warning` means something was
|
|
22
|
+
ignored or approximated; `info` is context.
|
|
23
|
+
- `tempo.bpm` (`setcpm(n)` = n x 4 BPM in 4/4); `loop.bars` / `loop.seconds`:
|
|
24
|
+
the program loop, what one loop of a render plays.
|
|
25
|
+
- `voices[]`: per labelled voice: notes per bar, polyphony, pitch range
|
|
26
|
+
(MIDI, `c4` = 60), instrument and effects, gain, pan.
|
|
27
|
+
- `warnings[]`, read off the notes:
|
|
28
|
+
|
|
29
|
+
| Code | Means | Usual fix |
|
|
30
|
+
| --- | --- | --- |
|
|
31
|
+
| `mix/pitch-clash` | Two voices a semitone apart | Put both on the same chord or scale there |
|
|
32
|
+
| `mix/register-overlap` | Two pitched voices share a range | Move one an octave, or thin one |
|
|
33
|
+
| `mix/low-end-crowded` | Two voices below `c3` together | Keep one bass part |
|
|
34
|
+
| `density/very-dense` | Over 32 notes per bar in a voice | Fewer steps or `.slow()` |
|
|
35
|
+
| `density/silent-voice` | An unmuted voice plays nothing | Check the mini-notation and masks |
|
|
36
|
+
| `level/hot-voice` | A voice's gain above 1.2 | Turn it to 1 or less; lower the others |
|
|
37
|
+
| `level/clip-risk` | Voices hitting together sum above 3 | Lower the busiest voices to 0.5-0.8 |
|
|
38
|
+
|
|
39
|
+
## Reading `code_render`
|
|
40
|
+
|
|
41
|
+
*local* returns `files` (`audio`, `stems`: paths written on disk),
|
|
42
|
+
`editUrl`, `window` (`bars`, `seconds`, `bpm`), `loudness` (`lufs`,
|
|
43
|
+
`truePeak` of the delivered file, `gainDb` applied for a `lufs` target),
|
|
44
|
+
`voices[]` (each voice's solo `lufs` and `truePeak`), `barTimes` /
|
|
45
|
+
`beatTimes` (seconds of each bar and beat: sync video cuts to them),
|
|
46
|
+
`check` and `analysis`. *web* returns `analysis`, a `listenUrl` (24 h) and
|
|
47
|
+
signed audio links.
|
|
48
|
+
*web* renders at most 16 bars and 60 s, and at most 320 track-seconds
|
|
49
|
+
(the tracks it plays x seconds; `check` reports them as
|
|
50
|
+
`stats.renderTracks`: one per audible voice, one per waveform of a
|
|
51
|
+
multi-waveform voice, four per Ensemble Set): a larger render is refused with
|
|
52
|
+
`CODE_RENDER_TOO_LARGE`, which says how many bars fit. Render fewer bars,
|
|
53
|
+
or mute (`_`) the voices you are not listening to.
|
|
54
|
+
|
|
55
|
+
`analysis` (both):
|
|
56
|
+
|
|
57
|
+
| Field | How to read it |
|
|
58
|
+
| --- | --- |
|
|
59
|
+
| `loudness.integratedLufs` | Overall loudness; halving every gain is about -6 LU |
|
|
60
|
+
| `loudness.truePeakDbtp`, `clipping` | Keep the peak at -1 dBTP or below; `clipping` must be false |
|
|
61
|
+
| `loudness.crestDb` | Peak minus RMS: under ~8 dB sounds squashed, over ~18 dB is peaky (a loudness target may not fit) |
|
|
62
|
+
| `bands.low/mid/high` | Energy below 250 Hz / 250 Hz-4 kHz / above 4 kHz; high under 0.03 sounds dull |
|
|
63
|
+
| `stereo.width`, `correlation` | Width 0.2-0.6 is typical; correlation below 0 is phase trouble |
|
|
64
|
+
| `groove.swing`, `timingErrorMs` | 0.5 straight, 0.67 triplet swing; code is sample-accurate |
|
|
65
|
+
| `silence`, `barLufs` | Leading/trailing silence, silent bars: a silent bar you did not plan is a bug |
|
|
66
|
+
| `voices[]` | Each voice's `lufs` (null = silent: a dead voice) and `share` of the mix |
|
|
67
|
+
|
|
68
|
+
## Loudness and length (*local* `code_render` / `tutticode render`)
|
|
69
|
+
|
|
70
|
+
- Length: `seconds` (exact, cut with a 10 ms fade), `bars`, or `loops`
|
|
71
|
+
(whole loops ring out past their end). `tail` adds seconds after the
|
|
72
|
+
length for reverbs and delays and makes the file exactly length + tail;
|
|
73
|
+
`fadeIn` / `fadeOut` are linear, in seconds.
|
|
74
|
+
- `lufs` applies one static gain to that integrated loudness, the same on
|
|
75
|
+
the stems. When the true peak would pass `truePeak` (default -1 dBTP)
|
|
76
|
+
the render fails with code `clip` instead of limiting: ask for a lower
|
|
77
|
+
`lufs`, or make the program less peaky (lower its loudest voice). Under
|
|
78
|
+
0.4 s there is no integrated loudness and `lufs` is ignored.
|
|
79
|
+
- Exit codes (CLI): 0 ok, 1 errors in the code or `clip`, 2 bridge or
|
|
80
|
+
browser problem (run `tutticode doctor`), 3 usage.
|
|
81
|
+
|
|
82
|
+
## Targets
|
|
83
|
+
|
|
84
|
+
| Goal | lufs |
|
|
85
|
+
| --- | --- |
|
|
86
|
+
| Sketch for the user | -16..-12, true peak -1 dBTP or below |
|
|
87
|
+
| Web, social, streaming | -14 |
|
|
88
|
+
| Podcasts, video beds under speech | -16 (beds under a voice -20..-24) |
|
|
89
|
+
| Broadcast (EBU R128) | -23 |
|
|
90
|
+
| A style's finished master | `goals.style` (house -9..-7, lofi-hip-hop -14..-11, ambient -20..-14) |
|
|
91
|
+
|
|
92
|
+
`goals.style` takes a Muse style id (`house`, `techno`, `trap`,
|
|
93
|
+
`modern-pop`, `lofi-hip-hop`, `ambient`, `cinematic`, `synthwave`,
|
|
94
|
+
`jazz-swing` and others); a render without a master chain sits a few LU
|
|
95
|
+
under a style's mastered loudness, so match its spectrum first.
|
|
96
|
+
|
|
97
|
+
## Comparing
|
|
98
|
+
|
|
99
|
+
`code_compare` returns `deltas[]` (`metric`, `current`, `target`,
|
|
100
|
+
`verdict`: `ok` / `low` / `high`) and `suggestions[]`, most important
|
|
101
|
+
first, written as edits to the code. *local* compares renders of the same
|
|
102
|
+
session and goals; reference recordings (`referenceUrl`,
|
|
103
|
+
`referenceAudio`) need the *web* backend.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Align Delay
|
|
2
|
+
|
|
3
|
+
An audio effect (`.fx`), available.
|
|
4
|
+
|
|
5
|
+
```js
|
|
6
|
+
note("c3 e3 g3 b3").fx("Align Delay:A/V Sync 40ms")
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
Accepted names: `aligndelay`.
|
|
10
|
+
|
|
11
|
+
## Parameters
|
|
12
|
+
|
|
13
|
+
| Key | Live label | Values |
|
|
14
|
+
|---|---|---|
|
|
15
|
+
| `delayMsL` | Left ms | 0 .. 100 ms |
|
|
16
|
+
| `delayMsR` | Right ms | 0 .. 100 ms |
|
|
17
|
+
| `samplesL` | Left samples | 0 .. 200 smp |
|
|
18
|
+
| `samplesR` | Right samples | 0 .. 200 smp |
|
|
19
|
+
| `metersL` | Left meter | 0 .. 100 m |
|
|
20
|
+
| `metersR` | Right meter | 0 .. 100 m |
|
|
21
|
+
| `feetL` | Left Feet | 0 .. 328.08 ft |
|
|
22
|
+
| `feetR` | Right Feet | 0 .. 328.08 ft |
|
|
23
|
+
| `celsius` | Celsius | -20 .. 60 °C |
|
|
24
|
+
| `fahrenheit` | Fahrenheit | -4 .. 140 °F |
|
|
25
|
+
|
|
26
|
+
## Factory presets
|
|
27
|
+
|
|
28
|
+
A/V Sync 40ms · Distance Trim · Haas Widener · Sample Compensate
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Amp
|
|
2
|
+
|
|
3
|
+
An audio effect (`.fx`), available.
|
|
4
|
+
|
|
5
|
+
```js
|
|
6
|
+
note("c3 e3 g3 b3").fx("Amp:Bass Roundup")
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
Accepted names: `amp`.
|
|
10
|
+
|
|
11
|
+
## Parameters
|
|
12
|
+
|
|
13
|
+
| Key | Live label | Values |
|
|
14
|
+
|---|---|---|
|
|
15
|
+
| `drive` | Gain | 0 .. 10 |
|
|
16
|
+
| `bass` | Bass | 0 .. 10 |
|
|
17
|
+
| `middle` | Middle | 0 .. 10 |
|
|
18
|
+
| `treble` | Treble | 0 .. 10 |
|
|
19
|
+
| `presence` | Presence | 0 .. 10 |
|
|
20
|
+
| `volume` | Volume | 0 .. 10 |
|
|
21
|
+
| `dryWetBalance` | Dry/Wet | 0 .. 1 % |
|
|
22
|
+
|
|
23
|
+
## Factory presets
|
|
24
|
+
|
|
25
|
+
Bass Roundup · Blues Drive · Boost and Crunch · Clean · Discrete · Heavy · Key Crunch · Marsh Mellows · Metalic · Rhythm Funk · Rock all 10 · Screamer
|