tutticode 0.1.1 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +76 -8
- package/README.zh-CN.md +63 -6
- package/dist/skills/tutticode/SKILL.md +17 -9
- package/dist/skills/tutticode/references/agent-loop.md +28 -1
- package/dist/skills/tutticode/references/devices/sampler.md +1 -1
- package/dist/skills/tutticode/references/devices.md +1 -1
- package/dist/skills/tutticode/references/for-agents.md +6 -3
- package/dist/skills/tutticode/references/functions.md +11 -1
- package/dist/skills/tutticode/references/mixing-groups.md +73 -0
- package/dist/skills/tutticode-sound-for-media/SKILL.md +9 -2
- package/dist/tutticode.cjs +3072 -353
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -9,8 +9,15 @@ Claude Desktop and friends.
|
|
|
9
9
|
|
|
10
10
|
Rendering happens **in your own browser**, on the same engine as
|
|
11
11
|
tuttidaw.com/code, so a file sounds exactly like the editor. Nothing is
|
|
12
|
-
rendered on a server
|
|
13
|
-
|
|
12
|
+
rendered on a server and it costs nothing. Every result carries an `editUrl`
|
|
13
|
+
that opens the program in TuttiDAW to keep editing.
|
|
14
|
+
|
|
15
|
+
Once TuttiDAW switches its limits on (they are being rolled out; until then
|
|
16
|
+
no render is cut or tagged), renders without an account are limited to 60 s,
|
|
17
|
+
and renders over 30 s carry a spoken "register at TuttiDAW" tag. A free
|
|
18
|
+
account lifts both:
|
|
19
|
+
`tutticode login` (renders up to 5 minutes, no tag). See
|
|
20
|
+
[Sign-in and limits](#sign-in-and-limits).
|
|
14
21
|
|
|
15
22
|
## Install
|
|
16
23
|
|
|
@@ -72,8 +79,13 @@ peak, the gain applied, per-voice levels, the bar and beat grid (seconds, for
|
|
|
72
79
|
syncing cuts), the check report, the analysis, the `editUrl` and the written
|
|
73
80
|
files. Audio is never printed.
|
|
74
81
|
|
|
82
|
+
`--no-brand-tag` (or `TUTTICODE_BRAND_TAG=0`) leaves the "Made with
|
|
83
|
+
TuttiCode" metadata out of the files; signed-in renders only.
|
|
84
|
+
|
|
75
85
|
Exit codes: `0` ok, `1` errors in the code (or a loudness target that would
|
|
76
|
-
clip), `2` bridge or browser problem, `3` usage
|
|
86
|
+
clip), `2` bridge or browser problem, `3` usage, `4` not signed in
|
|
87
|
+
(`whoami`), `5` over a limit without sign-in, `6` this tutticode is too old
|
|
88
|
+
(`npm i -g tutticode@latest`).
|
|
77
89
|
|
|
78
90
|
### MCP tools
|
|
79
91
|
|
|
@@ -87,8 +99,58 @@ skill teaches both:
|
|
|
87
99
|
| `code_compare` | compare a render with goals (or a Muse style), or two renders |
|
|
88
100
|
| `code_open` | open a program in a visible TuttiCode tab (`tutticode mcp --headless`: no window, returns the link) |
|
|
89
101
|
| `code_reference` | search the TuttiCode reference shipped in the package |
|
|
102
|
+
| `code_account` | signed in or not, the length limits and today's usage |
|
|
90
103
|
|
|
91
104
|
The reference documents are also MCP resources (`tutticode://skills/...`).
|
|
105
|
+
`tutticode mcp` uses the same sign-in as the CLI (`tutticode login`, or
|
|
106
|
+
`TUTTICODE_TOKEN` in its environment); it never starts a sign-in itself.
|
|
107
|
+
|
|
108
|
+
## Sign-in and limits
|
|
109
|
+
|
|
110
|
+
The limits below apply once TuttiDAW switches them on (they are being rolled
|
|
111
|
+
out; until then every render runs in full and untagged). The sign-in works
|
|
112
|
+
today.
|
|
113
|
+
|
|
114
|
+
| | Without sign-in | Free account |
|
|
115
|
+
| --- | --- | --- |
|
|
116
|
+
| Longest render | 60 s (longer: error `limit`, exit 5) | 5 minutes |
|
|
117
|
+
| Voice tag "register at TuttiDAW" | mixed in throughout renders over 30 s | never |
|
|
118
|
+
| Formats, stems | all | all |
|
|
119
|
+
|
|
120
|
+
```sh
|
|
121
|
+
tutticode login # opens your browser; approve, come back
|
|
122
|
+
tutticode login --device # no browser here (SSH, a server): approve a code on any device
|
|
123
|
+
tutticode whoami # who renders, the limits, today's usage
|
|
124
|
+
tutticode logout # sign this computer out
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
**For agents.** On a `limit` error, tell the user its message in one
|
|
128
|
+
sentence and carry on within the limit. `tutticode login --device --no-wait
|
|
129
|
+
--json` prints `{verificationUri, verificationUriComplete, userCode,
|
|
130
|
+
expiresIn}` and returns at once: give the user the link, keep working, and
|
|
131
|
+
tutticode finishes the sign-in in the background once they approve. `login`
|
|
132
|
+
without `--no-wait` needs a terminal (exit 3 otherwise).
|
|
133
|
+
|
|
134
|
+
**The voice tag.** An anonymous render over 30 s has the tag mixed in from
|
|
135
|
+
the start, every few seconds, in the mix and in every stem, before any
|
|
136
|
+
measurement: the loudness, bands, voice levels and `code_compare` include
|
|
137
|
+
it. The report says so (`watermark: {reason, at, removeWith}`) and the CLI
|
|
138
|
+
prints one line. The tag is not part of your program: do not change the code
|
|
139
|
+
to remove it. `tutticode login` (free) does.
|
|
140
|
+
|
|
141
|
+
**What the sign-in can do.** It can only render with TuttiCode: it cannot
|
|
142
|
+
open your projects, account or billing. It lasts a year; the access token is
|
|
143
|
+
refreshed on its own. Revoke a device, or create an access token for CI, on
|
|
144
|
+
the account page (tuttidaw.com/studio/account).
|
|
145
|
+
|
|
146
|
+
**CI.** Set `TUTTICODE_TOKEN` to an access token from the account page; it
|
|
147
|
+
wins over a stored sign-in and is never refreshed.
|
|
148
|
+
|
|
149
|
+
**Where it is stored.** `~/.tutticode/credentials`, one entry per site,
|
|
150
|
+
readable only by you (mode 0600; on Windows an ACL with only your user).
|
|
151
|
+
`tutticode doctor` checks it and `tutticode doctor --fix` repairs it.
|
|
152
|
+
`~/.tutticode/install-id` is a random id the page counts anonymous installs
|
|
153
|
+
by; it is not tied to you.
|
|
92
154
|
|
|
93
155
|
## How it works
|
|
94
156
|
|
|
@@ -129,8 +191,11 @@ written inside the stems folder, and never through a symbolic link.
|
|
|
129
191
|
|
|
130
192
|
## Commands
|
|
131
193
|
|
|
132
|
-
- `tutticode doctor` - Node, the browser, the page, the connection
|
|
133
|
-
engine version
|
|
194
|
+
- `tutticode doctor [--fix]` - Node, the browser, the page, the connection,
|
|
195
|
+
the engine version, who renders and whether the credentials file is
|
|
196
|
+
private (`--fix` makes it private again).
|
|
197
|
+
- `tutticode login [--device [--no-wait] [--json]]`, `tutticode logout`,
|
|
198
|
+
`tutticode whoami [--json]` - see [Sign-in and limits](#sign-in-and-limits).
|
|
134
199
|
- `tutticode setup` - explains, asks, and then sets the browser policy
|
|
135
200
|
`LocalNetworkAccessAllowedForUrls = ["https://tuttidaw.com"]` for your
|
|
136
201
|
user (Windows: HKCU registry; macOS: `defaults`; Linux: a managed policy
|
|
@@ -145,13 +210,16 @@ Bridge flags for every command: `--show` / `--headless`,
|
|
|
145
210
|
`--browser chrome|edge|<path>`, `--origin <url>` (staging / local dev),
|
|
146
211
|
`--dev-origin <url>`, `--locale <locale>`, `--no-daemon`, `--verbose`.
|
|
147
212
|
Environment: `TUTTICODE_BROWSER` (browser path), `TUTTICODE_HOME` (state
|
|
148
|
-
folder), `TUTTICODE_BROWSER_ARGS` (extra browser flags)
|
|
213
|
+
folder), `TUTTICODE_BROWSER_ARGS` (extra browser flags), `TUTTICODE_TOKEN`
|
|
214
|
+
(an access token, for CI), `TUTTICODE_BRAND_TAG=0` (no metadata tag).
|
|
149
215
|
|
|
150
216
|
## Privacy
|
|
151
217
|
|
|
152
218
|
tutticode sends no telemetry. Your program goes only to the TuttiCode page
|
|
153
|
-
in your own browser.
|
|
154
|
-
|
|
219
|
+
in your own browser. The page records each render's length, format and
|
|
220
|
+
outcome (with your account when signed in, else as anonymous counts), never
|
|
221
|
+
the program, file names or audio. Logs stay in `~/.tutticode/logs` and
|
|
222
|
+
never contain your program, audio or tokens.
|
|
155
223
|
|
|
156
224
|
## Browsers
|
|
157
225
|
|
package/README.zh-CN.md
CHANGED
|
@@ -7,8 +7,12 @@ Strudel 的超集)变成音频文件,任何 agent 或脚本都能用。它是一
|
|
|
7
7
|
MCP server,适用于 Claude Code、Copilot CLI、Codex、Cursor、Claude Desktop 等。
|
|
8
8
|
|
|
9
9
|
渲染**在你自己的浏览器里**进行,用的就是 tuttidaw.com/code 的同一个引擎,所以
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
文件和编辑器里听到的一模一样。不经过服务器渲染,也不收费。每个结果都带一个
|
|
11
|
+
`editUrl`,可以在 TuttiDAW 里打开这段程序继续编辑。
|
|
12
|
+
|
|
13
|
+
TuttiDAW 启用限制后(正在逐步上线;在此之前渲染既不截断也不加标签),不登录时每次渲染最长 60 秒,超过 30 秒的渲染会混入一段语音标签
|
|
14
|
+
"register at TuttiDAW"。用免费账号登录(`tutticode login`)就没有这些限制:
|
|
15
|
+
每次最长 5 分钟,没有语音标签。见[登录与限制](#登录与限制)。
|
|
12
16
|
|
|
13
17
|
## 安装
|
|
14
18
|
|
|
@@ -63,8 +67,12 @@ cat song.tc | tutticode check - # 从 stdin 读程序
|
|
|
63
67
|
声部的电平、小节和拍的时间点(秒,用来对齐剪辑点)、检查报告、分析结果、
|
|
64
68
|
`editUrl` 和写出的文件路径。永远不会把音频打印到终端。
|
|
65
69
|
|
|
70
|
+
`--no-brand-tag`(或 `TUTTICODE_BRAND_TAG=0`)不在文件里写 "Made with
|
|
71
|
+
TuttiCode" 元数据;仅登录后有效。
|
|
72
|
+
|
|
66
73
|
退出码: `0` 成功, `1` 代码有错(或响度目标会削波), `2` bridge / 浏览器问题,
|
|
67
|
-
`3`
|
|
74
|
+
`3` 用法错误, `4` 未登录(`whoami`), `5` 超出未登录时的限制, `6` tutticode
|
|
75
|
+
版本太旧(`npm i -g tutticode@latest`)。
|
|
68
76
|
|
|
69
77
|
### MCP 工具
|
|
70
78
|
|
|
@@ -77,8 +85,51 @@ cat song.tc | tutticode check - # 从 stdin 读程序
|
|
|
77
85
|
| `code_compare` | 把一次渲染和目标(或 Muse 风格)比较,或比较两次渲染 |
|
|
78
86
|
| `code_open` | 在可见的 TuttiCode 标签页里打开程序(`tutticode mcp --headless` 时不开窗口,只返回链接) |
|
|
79
87
|
| `code_reference` | 搜索包里自带的 TuttiCode 参考文档 |
|
|
88
|
+
| `code_account` | 是否已登录、时长限制和今天的用量 |
|
|
80
89
|
|
|
81
90
|
参考文档同时作为 MCP resources 提供(`tutticode://skills/...`)。
|
|
91
|
+
`tutticode mcp` 和 CLI 用同一个登录(`tutticode login`,或它环境里的
|
|
92
|
+
`TUTTICODE_TOKEN`);它自己从不发起登录。
|
|
93
|
+
|
|
94
|
+
## 登录与限制
|
|
95
|
+
|
|
96
|
+
下面的限制在 TuttiDAW 启用后生效(正在逐步上线;在此之前每次渲染都完整、不加标签)。
|
|
97
|
+
登录现在就能用。
|
|
98
|
+
|
|
99
|
+
| | 不登录 | 免费账号 |
|
|
100
|
+
| --- | --- | --- |
|
|
101
|
+
| 每次渲染最长 | 60 秒(更长:错误 `limit`,退出码 5) | 5 分钟 |
|
|
102
|
+
| 语音标签 "register at TuttiDAW" | 超过 30 秒的渲染全程混入 | 没有 |
|
|
103
|
+
| 格式、分轨 | 全部 | 全部 |
|
|
104
|
+
|
|
105
|
+
```sh
|
|
106
|
+
tutticode login # 打开浏览器,确认后回到终端
|
|
107
|
+
tutticode login --device # 这台机器没有浏览器(SSH、服务器):在任意设备上确认一个码
|
|
108
|
+
tutticode whoami # 谁在渲染、限制、今天的用量
|
|
109
|
+
tutticode logout # 让这台电脑退出登录
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
**给 agent。** 遇到 `limit` 错误时,用一句话把错误信息转告用户,然后在限制内继续。
|
|
113
|
+
`tutticode login --device --no-wait --json` 会输出 `{verificationUri,
|
|
114
|
+
verificationUriComplete, userCode, expiresIn}` 并立即返回:把链接交给用户,继续
|
|
115
|
+
工作;用户确认后,tutticode 会在后台完成登录。不带 `--no-wait` 的 `login` 需要
|
|
116
|
+
终端(否则退出码 3)。
|
|
117
|
+
|
|
118
|
+
**语音标签。** 不登录、超过 30 秒的渲染,从开头起每隔几秒混入一次标签,混音和
|
|
119
|
+
每个分轨都有,而且在所有测量之前混入:响度、频段、声部电平和 `code_compare` 都包含
|
|
120
|
+
它。报告会注明(`watermark: {reason, at, removeWith}`),CLI 也会打印一行说明。
|
|
121
|
+
标签不是你程序的一部分:不要为了去掉它而修改代码。`tutticode login`(免费)即可去掉。
|
|
122
|
+
|
|
123
|
+
**登录能做什么。** 它只能用 TuttiCode 渲染:打不开你的项目、账号或账单。有效期一年;
|
|
124
|
+
access token 会自动刷新。在账号页面(tuttidaw.com/studio/account)可以撤销某台设备,
|
|
125
|
+
或为 CI 创建 access token。
|
|
126
|
+
|
|
127
|
+
**CI。** 把 `TUTTICODE_TOKEN` 设为账号页面创建的 access token;它优先于已保存的
|
|
128
|
+
登录,而且不会被刷新。
|
|
129
|
+
|
|
130
|
+
**保存在哪里。** `~/.tutticode/credentials`,每个站点一条,只有你能读(权限 0600;
|
|
131
|
+
Windows 上 ACL 只含你的用户)。`tutticode doctor` 会检查,`tutticode doctor --fix`
|
|
132
|
+
会修复。`~/.tutticode/install-id` 是一个随机 id,页面用它统计匿名安装数,和你本人无关。
|
|
82
133
|
|
|
83
134
|
## 工作原理
|
|
84
135
|
|
|
@@ -110,7 +161,10 @@ token 通信,网页无法访问。无头浏览器通过私有管道(`--remote-de
|
|
|
110
161
|
|
|
111
162
|
## 命令
|
|
112
163
|
|
|
113
|
-
- `tutticode doctor` —— 检查 Node
|
|
164
|
+
- `tutticode doctor [--fix]` —— 检查 Node、浏览器、页面、连接、引擎版本、谁在渲染,
|
|
165
|
+
以及登录凭据文件是否只有你能读(`--fix` 修复)。
|
|
166
|
+
- `tutticode login [--device [--no-wait] [--json]]`、`tutticode logout`、
|
|
167
|
+
`tutticode whoami [--json]` —— 见[登录与限制](#登录与限制)。
|
|
114
168
|
- `tutticode setup` —— 先说明、再询问,同意后为当前用户设置浏览器策略
|
|
115
169
|
`LocalNetworkAccessAllowedForUrls = ["https://tuttidaw.com"]`
|
|
116
170
|
(Windows:HKCU 注册表;macOS:`defaults`;Linux:托管策略文件,需要 sudo),
|
|
@@ -124,12 +178,15 @@ token 通信,网页无法访问。无头浏览器通过私有管道(`--remote-de
|
|
|
124
178
|
`--browser chrome|edge|<路径>`、`--origin <url>`(预发 / 本地开发)、
|
|
125
179
|
`--dev-origin <url>`、`--locale <语言>`、`--no-daemon`、`--verbose`。
|
|
126
180
|
环境变量:`TUTTICODE_BROWSER`(浏览器路径)、`TUTTICODE_HOME`(状态目录)、
|
|
127
|
-
`TUTTICODE_BROWSER_ARGS`(额外的浏览器参数)
|
|
181
|
+
`TUTTICODE_BROWSER_ARGS`(额外的浏览器参数)、`TUTTICODE_TOKEN`(access token,
|
|
182
|
+
用于 CI)、`TUTTICODE_BRAND_TAG=0`(不写元数据标签)。
|
|
128
183
|
|
|
129
184
|
## 隐私
|
|
130
185
|
|
|
131
186
|
tutticode 不发送任何遥测数据。你的程序只会交给你自己浏览器里的 TuttiCode 页面。
|
|
132
|
-
|
|
187
|
+
页面会记录每次渲染的时长、格式和结果(登录时记在你的账号下,否则只是匿名计数),
|
|
188
|
+
从不记录程序、文件名或音频。日志保存在 `~/.tutticode/logs`,不包含程序内容、音频
|
|
189
|
+
或 token。
|
|
133
190
|
|
|
134
191
|
## 浏览器
|
|
135
192
|
|
|
@@ -40,7 +40,9 @@ _lead: n("0 2 4 7").scale("C:minor") // a leading _ mutes a voice
|
|
|
40
40
|
- TuttiDAW only: `.inst("Device:Preset", {key: value})` instrument,
|
|
41
41
|
`.midifx(...)` before it, `.fx(...)` after it, in call order. Params use the
|
|
42
42
|
device's keys and units (`"4s"`, `"-6dB"`, `"1/16"`); constants only for now.
|
|
43
|
-
`
|
|
43
|
+
Mixing: `bus("verb").fx("Reverb")` + `.send("verb", -12)`, `.mix({vol, pan,
|
|
44
|
+
mute})`, `master.fx("Limiter")`, `group("drums")` + `.group("drums")`.
|
|
45
|
+
`toggle(1)` is an inline switch; `note("do re mi")` = `note("c d e")`.
|
|
44
46
|
|
|
45
47
|
## Top mistakes
|
|
46
48
|
|
|
@@ -68,13 +70,13 @@ _lead: n("0 2 4 7").scale("C:minor") // a leading _ mutes a voice
|
|
|
68
70
|
|
|
69
71
|
## Tools: two backends, one API
|
|
70
72
|
|
|
71
|
-
The same tools
|
|
72
|
-
Use whichever this agent has; prefer the local one.
|
|
73
|
+
The same tools and report shapes run on two backends; prefer the local one.
|
|
73
74
|
|
|
74
|
-
- **Local `tutticode`** (default; free
|
|
75
|
+
- **Local `tutticode`** (default; free): the `tutticode` CLI
|
|
75
76
|
and MCP server (`npm i -g tutticode`, `tutticode mcp`) render in the
|
|
76
77
|
user's own browser with the tuttidaw.com/code engine and write files to
|
|
77
|
-
disk, up to 300 s
|
|
78
|
+
disk, up to 300 s (60 s without sign-in once the limits are on, below). Its tool descriptions
|
|
79
|
+
say "Runs locally". Without MCP,
|
|
78
80
|
call the CLI: `tutticode check prog.tc`, `tutticode render prog.tc -o
|
|
79
81
|
out.wav --seconds 12 --lufs -16 --json`, `tutticode open prog.tc`.
|
|
80
82
|
Program code goes only to the user's browser, never to TuttiDAW's servers.
|
|
@@ -91,6 +93,13 @@ Use whichever this agent has; prefer the local one.
|
|
|
91
93
|
| `code_compare` | a render against goals (or a Muse `style`), or two renders (A/B) |
|
|
92
94
|
| `code_open` | (local) open the program in a visible TuttiCode tab for the user |
|
|
93
95
|
| `code_reference` | (local) search these references |
|
|
96
|
+
| `code_account` | (local) signed in or not, the length limits, today's usage |
|
|
97
|
+
|
|
98
|
+
**Without sign-in**, once the limits are on (until then nothing is cut or
|
|
99
|
+
tagged), local renders stop at 60 s (error `limit`) and over 30 s carry a
|
|
100
|
+
spoken "register at TuttiDAW" tag (`watermark`; never edit code to remove it).
|
|
101
|
+
Tell the user once; `tutticode login` (free) lifts both. Agents: run
|
|
102
|
+
`tutticode login --device --no-wait --json` and give the user its link.
|
|
94
103
|
|
|
95
104
|
## Workflow: write -> check -> render -> revise
|
|
96
105
|
|
|
@@ -106,9 +115,7 @@ Use whichever this agent has; prefer the local one.
|
|
|
106
115
|
4. **Hand over** the `editUrl` (local) or `listenUrl` (web) with the
|
|
107
116
|
files: it opens the program in TuttiCode, where **Open in TuttiDAW**
|
|
108
117
|
saves it as a project with one track per voice. Without tools, link
|
|
109
|
-
`https://tuttidaw.com/code
|
|
110
|
-
in base64, URI-encoded (`encodeURIComponent(btoa(utf8))`, as strudel.cc's
|
|
111
|
-
long links).
|
|
118
|
+
`https://tuttidaw.com/code#` + `encodeURIComponent(btoa(utf8 code))`.
|
|
112
119
|
|
|
113
120
|
Pattern Clips in an open TuttiDAW project are edited with the web MCP's
|
|
114
121
|
`read_pattern` / `write_pattern` (notes only; devices apply on /code and in
|
|
@@ -131,11 +138,12 @@ Read only what the task needs:
|
|
|
131
138
|
- `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.
|
|
132
139
|
- `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.
|
|
133
140
|
- `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.
|
|
141
|
+
- `references/mixing-groups.md`: Mixing: groups. Put voices in a group with its own effects, fader and sends - a drum bus inside the program, the same group track Open in TuttiDAW makes.
|
|
134
142
|
- `references/javascript.md`: JavaScript in code. Variables, functions, loops and register - and the sandbox, determinism and limits that keep shared code safe.
|
|
135
143
|
- `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.
|
|
136
144
|
- `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.
|
|
137
145
|
- `references/functions.md`: every function, method and signal, with signature, description and example (generated from the engine).
|
|
138
146
|
- `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).
|
|
139
147
|
|
|
140
|
-
Language: PATTERN LANGUAGE 1.
|
|
148
|
+
Language: PATTERN LANGUAGE 1.3.0, engine 17.
|
|
141
149
|
Human guide: https://tuttidaw.com/code/learn; agents: https://tuttidaw.com/code/learn/for-agents
|
|
@@ -86,7 +86,34 @@ or mute (`_`) the voices you are not listening to.
|
|
|
86
86
|
took off in `limitDb`. Under 0.4 s there is no integrated loudness and
|
|
87
87
|
`lufs` is ignored.
|
|
88
88
|
- Exit codes (CLI): 0 ok, 1 errors in the code or `clip`, 2 bridge or
|
|
89
|
-
browser problem (run `tutticode doctor`), 3 usage
|
|
89
|
+
browser problem (run `tutticode doctor`), 3 usage, 4 not signed in
|
|
90
|
+
(`whoami`), 5 `limit`, 6 `upgrade`.
|
|
91
|
+
|
|
92
|
+
## Sign-in, limits and the voice tag (*local*)
|
|
93
|
+
|
|
94
|
+
- **Limits.** Once TuttiDAW switches them on (they are being rolled out;
|
|
95
|
+
until then no render is cut or tagged), a render without sign-in is at
|
|
96
|
+
most 60 s, and a render over 30 s carries a spoken "register at
|
|
97
|
+
TuttiDAW" tag throughout. A free account (`tutticode login`) lifts both. `code_account` (or `tutticode
|
|
98
|
+
whoami --json`) says which applies (`limits.maxSeconds`,
|
|
99
|
+
`limits.watermarkAfterSeconds`, null = never tagged): plan within it,
|
|
100
|
+
for example keep an anonymous draft at 30 s or less.
|
|
101
|
+
- **`limit` error** (CLI exit 5), with `limit: {name, value,
|
|
102
|
+
signedInValue}`: tell the user its message in one sentence and carry on
|
|
103
|
+
within the limit. To get the user's approval without a terminal, run
|
|
104
|
+
`tutticode login --device --no-wait --json`, give the user its
|
|
105
|
+
`verificationUriComplete` link (or `verificationUri` and `userCode`),
|
|
106
|
+
and keep working: the sign-in finishes in the background and later
|
|
107
|
+
renders use it. Never wait on it.
|
|
108
|
+
- **`watermark`** in a report (`{reason, at: [start of each tag, s],
|
|
109
|
+
removeWith}`, and one CLI line on stderr): the tag is in the file and in
|
|
110
|
+
every stat (loudness, bands, voice levels, compare). It is not part of
|
|
111
|
+
the program: do not change the code to remove it or to fix the stats it
|
|
112
|
+
moves. Tell the user once that `tutticode login` (free) removes it.
|
|
113
|
+
- **`upgrade`** (exit 6): the user runs `npm i -g tutticode@latest`.
|
|
114
|
+
- The sign-in can only render with TuttiCode (no projects, account or
|
|
115
|
+
billing). Never print or ask for tokens; CI sets `TUTTICODE_TOKEN` (an
|
|
116
|
+
access token from the account page).
|
|
90
117
|
|
|
91
118
|
## Targets
|
|
92
119
|
|
|
@@ -225,4 +225,4 @@ Accepted names: `sampler`, `drumsampler`.
|
|
|
225
225
|
|
|
226
226
|
## Factory presets
|
|
227
227
|
|
|
228
|
-
808 BNYX Stopper · 808 Selector Rack · Ac Flugelhorn · Ac Strings Orch · Ac Strings Pizz Basic · Ac Strings Pizz Oct · Ac Strings Pizz Stage · Acid Meltdown Bass · Ambient Encounters Bass · Ambient Feeling · Ambient Swells · Ambiente Pad · Analog Stab Lead · Analogue Bass · Arp 5th Lead · Arp Poly Lead · B Bass · B Seven Bass · Big Modules Bass · Biig Saw Pad · Bit Growl Bass · Byte Sized Bass · Celeste · Ceramic Bowl · Ceramic Tiles · Childhood Home Piano · Chill Outzone · Chimes Finger Down · Choir Pad Avalon · Chord Floot Aboot Pad · Chord Soft Keys · Classical Keys · Clay Flute · Click And Finer Cuts · Click Noise · Cnarz FX · Dark Corner Pad · Dark One · Dark Thought Lead · Daysleeper Swells Pad · DnB Tools 1 Lead · DnB Tools 2 Lead · DnB Tools 3 Lead · Downstairs Pad · Drift Pad · Duetta Pad · E-Piano Cheap · Electric Bass Raw · Electric Bass Soft · Electroflow Keys · Fat Heavy Drone Pad · Fine Pulse Bass · Frozen Rings Pad · Galactica Pad · Git Proc Loop · Glide Square Bass · Glidesynth Lead 1 · Glidesynth Lead 2 · Good Old Vintage Phat 1 Lead · Good Old Vintage Phat 2 Lead · Good Old Vintage Phat Bass · Grand Piano · Grand Piano Single Sample · House Stab · Inclement Drone Pad · Independence Day · Indian Flute · Infected Bass · JX Chorus Bass · Jarble Ambience · Jarble Ambience Pad · Jarble Disto Bass · Klickering Lead Modern · LoFi Voodoo · LoFi Warp Drone · Lovely Keys · MPE Alder Waldgeist · MPE Bower Close · MPE Depth Pressure Pad · MPE Dream Grain Drone · MPE Dulcimatica · MPE FM Arp · MPE Inside Angel · MPE Pearlescent Tides Pad · MPE Sci-Fi Flicks · Machine Punk Bass · Mamas Bass · Marimba Concert · Marimba Maple · Megaphatness Pad · Metallic Love Keys · Metallo Shake · Mini 1 OSC Bass · Mini 1 OSC Reso Bass · Mini 2 OSC LFO Bass · Mini 2 OSC Solo Bass · Mini 3 OSC Bass · Mini 3 OSC Xectro Bass · Mini Wobble Bass · Mod Bass · Modular Organ Pad · Music Box · Muugy Bass · No 3O3 FM 1 Lead · No 3O3 FM 2 Lead · Nostalgic VHS Bells · PPP Pad · Panorama Pad · Phantasm Pad · Piano Bass · Pitched Ambience · Pitched Ambiente · Pixelated Bass · Plock Blip · Psycho Tables Pad · Pulse Bass · Reso Clicks · Revenge of Q Pad · Reverberant Keys · Rhyt Mo · Rhythmic Sine Saw Square · Ring Modular Lead · Sandblaster Lead · Saw Filtered Bass · Saw Percussion · Seashore Pad · Seashore Pad (Evolving) · Seashore Pad (Synth Pad) · Simple One Pad · Slow Drown Pad · Smooth Synth Keys · Soft Industry · Soover Lead · Space FlicFlac · Stab Dense · Stab Ibiza · Stab Proga · Stadium Pluck · Steel Pan · Strange Beats 1 · Strange Beats 2 · Strange Space Beats · Sub 808 Bass · Sunken Bells · Super Soover Lead · Supershort Blip · Supersine · Sweeper Saege Pad · Sweeper Saege Pad (Pad) · Sweeper Saege Pad (Synth Pad) · Tempo Steppe Keys · Textural Machine · The Greatest Pad · Thicket Wail Pad · Upright Bass · Vacuum Flute · Vibraphone · Vinyl Siren · Warm Bubbly Pad · Wonk Bass · Zirp Sync Noiseloop
|
|
228
|
+
808 BNYX Stopper · 808 Selector Rack · Ac Flugelhorn · Ac Strings Orch · Ac Strings Pizz Basic · Ac Strings Pizz Oct · Ac Strings Pizz Stage · Acid Meltdown Bass · Ambient Encounters Bass · Ambient Feeling · Ambient Swells · Ambiente Pad · Analog Stab Lead · Analogue Bass · Arp 5th Lead · Arp Poly Lead · B Bass · B Seven Bass · Big Modules Bass · Biig Saw Pad · Bit Growl Bass · Byte Sized Bass · Celeste · Ceramic Bowl · Ceramic Tiles · Childhood Home Piano · Chill Outzone · Chimes Finger Down · Choir Pad Avalon · Chord Floot Aboot Pad · Chord Soft Keys · Classical Keys · Clay Flute · Click And Finer Cuts · Click Noise · Cnarz FX · Dark Corner Pad · Dark One · Dark Thought Lead · Daysleeper Swells Pad · DnB Tools 1 Lead · DnB Tools 2 Lead · DnB Tools 3 Lead · Downstairs Pad · Drift Pad · Duetta Pad · E-Piano Cheap · Electric Bass Raw · Electric Bass Soft · Electroflow Keys · Fat Heavy Drone Pad · Fine Pulse Bass · Frozen Rings Pad · Galactica Pad · Git Proc Loop · Glide Square Bass · Glidesynth Lead 1 · Glidesynth Lead 2 · Good Old Vintage Phat 1 Lead · Good Old Vintage Phat 2 Lead · Good Old Vintage Phat Bass · Grand Piano · Grand Piano Single Sample · House Stab · Inclement Drone Pad · Independence Day · Indian Flute · Infected Bass · JX Chorus Bass · Jarble Ambience · Jarble Ambience Pad · Jarble Disto Bass · Klickering Lead Modern · LoFi Voodoo · LoFi Warp Drone · Lovely Keys · MPE Alder Waldgeist · MPE Bower Close · MPE Depth Pressure Pad · MPE Dream Grain Drone · MPE Dulcimatica · MPE FM Arp · MPE Inside Angel · MPE Pearlescent Tides Pad · MPE Sci-Fi Flicks · Machine Punk Bass · Mamas Bass · Marimba Concert · Marimba Maple · Megaphatness Pad · Metallic Love Keys · Metallo Shake · Mini 1 OSC Bass · Mini 1 OSC Reso Bass · Mini 2 OSC LFO Bass · Mini 2 OSC Solo Bass · Mini 3 OSC Bass · Mini 3 OSC Xectro Bass · Mini Wobble Bass · Mod Bass · Modular Organ Pad · Music Box · Muugy Bass · No 3O3 FM 1 Lead · No 3O3 FM 2 Lead · Nostalgic VHS Bells · PPP Pad · Panorama Pad · Phantasm Pad · Piano Bass · Pitched Ambience · Pitched Ambiente · Pixelated Bass · Plock Blip · Psycho Tables Pad · Pulse Bass · Reso Clicks · Revenge of Q Pad · Reverberant Keys · Rhyt Mo · Rhythmic Sine Saw Square · Ring Modular Lead · Sandblaster Lead · Saw Filtered Bass · Saw Percussion · Seashore Pad · Seashore Pad (Evolving) · Seashore Pad (Synth Pad) · Simple One Pad · Slow Drown Pad · Smooth Synth Keys · Soft Industry · Soover Lead · Space FlicFlac · Stab Dense · Stab Ibiza · Stab Proga · Stadium Pluck · Steel Pan · Strange Beats 1 · Strange Beats 2 · Strange Space Beats · Sub 808 Bass · Sunken Bells · Super Soover Lead · Supershort Blip · Supersine · Sweeper Saege Pad · Sweeper Saege Pad (Pad) · Sweeper Saege Pad (Synth Pad) · Tempo Steppe Keys · Textural Machine · The Greatest Pad · Thicket Wail Pad · Upright Bass · Vacuum Flute · Vibraphone · Vinyl Siren · Vocal Chop Ah · Vocal Chop Hey · Vocal Chop Oh · Warm Bubbly Pad · Wonk Bass · Zirp Sync Noiseloop
|
|
@@ -29,7 +29,7 @@ ranges and units.
|
|
|
29
29
|
| [Impulse](devices/impulse.md) | available | 13 | 139 |
|
|
30
30
|
| [Meld](devices/meld.md) | available | 84 | 221 |
|
|
31
31
|
| [Operator](devices/operator.md) | tested end to end | 331 | 145 |
|
|
32
|
-
| [Sampler](devices/sampler.md) | tested end to end |
|
|
32
|
+
| [Sampler](devices/sampler.md) | tested end to end | 164 | 210 |
|
|
33
33
|
| [Simpler](devices/simpler.md) | tested end to end | 38 | 212 |
|
|
34
34
|
| [SixOp](devices/sixop.md) | available | 0 | 172 |
|
|
35
35
|
| [Synth](devices/synth.md) | available | 12 | 10 |
|
|
@@ -40,9 +40,12 @@ audio), `code_render` (render and measure) and `code_compare` (compare with
|
|
|
40
40
|
a target or an earlier render). Only where the audio is made differs:
|
|
41
41
|
|
|
42
42
|
- **tutticode on your computer** (the default): renders in your own browser
|
|
43
|
-
and writes the files to your disk. Free,
|
|
44
|
-
|
|
45
|
-
|
|
43
|
+
and writes the files to your disk. Free, up to 5 minutes of audio per
|
|
44
|
+
render with a free account (`tutticode login`); without sign-in, once the
|
|
45
|
+
limits are switched on (being rolled out), up to 60 seconds, and renders
|
|
46
|
+
over 30 seconds carry a spoken "register at TuttiDAW" tag. It also offers `code_open` (open a program here for you to hear),
|
|
47
|
+
`code_reference` (search the language reference) and `code_account`
|
|
48
|
+
(signed in or not, and the limits).
|
|
46
49
|
- **TuttiDAW's web MCP** (`https://tuttidaw.com/api/mcp`) and the HTTP API
|
|
47
50
|
(`/api/code/check`, `/api/code/render`, `/api/code/compare`): for agents
|
|
48
51
|
that cannot run programs on your computer. Renders on our servers, needs
|
|
@@ -64,6 +64,16 @@ Sets chord symbols; also available as .chord(symbols) or .chord().
|
|
|
64
64
|
chord("<Bbm9 Fm9>/4").dict("ireal").voicing()
|
|
65
65
|
```
|
|
66
66
|
|
|
67
|
+
### `group(name)` *(TuttiDAW only)*
|
|
68
|
+
|
|
69
|
+
TuttiDAW extension, not in Strudel: declares a group, a group track inside the program; give it .fx(...), .mix(...) and .send(bus, dB), and put voices in it with .group(name).
|
|
70
|
+
|
|
71
|
+
```js
|
|
72
|
+
group("drums").fx("Drum Buss").mix({vol: -3})
|
|
73
|
+
kick: s("bd*4").group("drums")
|
|
74
|
+
snare: s("~ sd").group("drums")
|
|
75
|
+
```
|
|
76
|
+
|
|
67
77
|
### `hush()`
|
|
68
78
|
|
|
69
79
|
Silence.
|
|
@@ -1049,7 +1059,7 @@ note("[c3,e3,g3]").midifx("Arpeggiator", {style: "UpDown", rate: "1/16"})
|
|
|
1049
1059
|
|
|
1050
1060
|
### `.mix(mixer)` *(TuttiDAW only)*
|
|
1051
1061
|
|
|
1052
|
-
TuttiDAW extension, not in Strudel: the voice's mixer: vol in dB (-70..6), pan -1..1, mute true / false; a bus's and the master's too.
|
|
1062
|
+
TuttiDAW extension, not in Strudel: the voice's mixer: vol in dB (-70..6), pan -1..1, mute true / false; a bus's, a group's and the master's too.
|
|
1053
1063
|
|
|
1054
1064
|
```js
|
|
1055
1065
|
note("c3 e3").mix({vol: -6, pan: -0.3})
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Mixing: groups
|
|
2
|
+
|
|
3
|
+
Put voices in a group with its own effects, fader and sends - a drum bus inside the program, the same group track Open in TuttiDAW makes.
|
|
4
|
+
|
|
5
|
+
A **group** gathers voices so you can treat them as one: a compressor on all
|
|
6
|
+
the drums, one fader for the whole kit, one send to the reverb. "Open in
|
|
7
|
+
TuttiDAW" makes it a group track inside the program's group, with those
|
|
8
|
+
voices in it.
|
|
9
|
+
|
|
10
|
+
| Code | What it is | In the studio |
|
|
11
|
+
|---|---|---|
|
|
12
|
+
| `group(name)` | a group of voices | a group track inside the program's group |
|
|
13
|
+
| `.group(name)` | puts a voice in a group | the voice's track becomes a child of that group |
|
|
14
|
+
|
|
15
|
+
Like `bus` and `.send`, these are TuttiDAW-only: a program that uses them
|
|
16
|
+
does not play on strudel.cc.
|
|
17
|
+
|
|
18
|
+
## A drum group
|
|
19
|
+
|
|
20
|
+
Declare the group on its own line, give it effects with `.fx` and a fader
|
|
21
|
+
with `.mix`, and put voices in it with `.group(name)`:
|
|
22
|
+
|
|
23
|
+
```js
|
|
24
|
+
group("drums").fx("Drum Buss").mix({vol: -3})
|
|
25
|
+
|
|
26
|
+
kick: s("bd*4").bank("tr909").group("drums")
|
|
27
|
+
snare: s("~ sd").bank("tr909").group("drums")
|
|
28
|
+
hats: s("hh*8").bank("tr909").group("drums").mix({vol: -8})
|
|
29
|
+
bass: note("<c2 g1 a1 f1>").ply(4).s("sawtooth").lpf(600)
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
The kick, snare and hats play through the Drum Buss, then through the
|
|
33
|
+
group's fader: `-3` lowers all three by 3 dB. Each voice keeps its own
|
|
34
|
+
`.mix` too - the hats are 8 dB down inside the group.
|
|
35
|
+
|
|
36
|
+
## Sends from a group
|
|
37
|
+
|
|
38
|
+
A group sends to a bus like a voice does, with a level in dB. The whole
|
|
39
|
+
group goes to the bus at that level - here the drums share one room while
|
|
40
|
+
the bass stays dry:
|
|
41
|
+
|
|
42
|
+
```js
|
|
43
|
+
bus("room").fx("Reverb", {dryWetBalance: 1, decayTime: "1.5s"})
|
|
44
|
+
group("drums").send("room", -14)
|
|
45
|
+
|
|
46
|
+
kick: s("bd*4").group("drums")
|
|
47
|
+
snare: s("~ sd").group("drums")
|
|
48
|
+
bass: note("c2 ~ c2 g1").s("sawtooth").lpf(500)
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Buses belong to the program: a group can send to any bus the program
|
|
52
|
+
declares, and its voices can still send on their own too.
|
|
53
|
+
|
|
54
|
+
A group's fader, pan and send levels are numbers (a group track has no clip
|
|
55
|
+
to move them). A group cannot be put inside another group.
|
|
56
|
+
|
|
57
|
+
## A voice without a group
|
|
58
|
+
|
|
59
|
+
`.group("drums")` with no `group("drums")` in the program is a warning: the
|
|
60
|
+
editor offers to add the declaration, and until then the voice plays in the
|
|
61
|
+
program's group like any other.
|
|
62
|
+
|
|
63
|
+
## In the studio
|
|
64
|
+
|
|
65
|
+
The group track sits inside the program's group, with its voices as its
|
|
66
|
+
children. Its effects, fader and sends belong to the code, like a bus's:
|
|
67
|
+
change one by hand and the group is detached from the code (Re-attach
|
|
68
|
+
brings it back). Move a voice out of its group by hand and that voice is
|
|
69
|
+
detached. Remove `.group("drums")` from a voice and its track moves back
|
|
70
|
+
to the program's group; remove `group("drums")` itself and the group track
|
|
71
|
+
stays, marked "not in code", while its voices move back.
|
|
72
|
+
|
|
73
|
+
Source: https://tuttidaw.com/code/learn/mixing-groups
|
|
@@ -11,7 +11,12 @@ the `tutticode` skill (install both: `tutticode skills install`); the tools
|
|
|
11
11
|
are `code_check`, `code_render`, `code_compare` from the local `tutticode`
|
|
12
12
|
MCP server or CLI (default: free, renders in the user's browser, writes
|
|
13
13
|
files) or TuttiDAW's web MCP (server renders, Muse points, 60 s, no files:
|
|
14
|
-
a `listenUrl`).
|
|
14
|
+
a `listenUrl`). Once TuttiDAW switches its limits on (being rolled out),
|
|
15
|
+
the local tools without sign-in render at most 60 s and tag renders over
|
|
16
|
+
30 s with a spoken "register at TuttiDAW": for a longer delivery, when a
|
|
17
|
+
render hits a limit (`limit` error, `watermark`), suggest
|
|
18
|
+
`tutticode login` (free) to the user (the `tutticode` skill says how an
|
|
19
|
+
agent gets the approval). Never change the program to remove the tag.
|
|
15
20
|
|
|
16
21
|
## Workflow
|
|
17
22
|
|
|
@@ -82,7 +87,9 @@ Recipe index:
|
|
|
82
87
|
- a length other than the one asked for (check `window.seconds`, plus the
|
|
83
88
|
tail);
|
|
84
89
|
- without the `editUrl` (or `listenUrl`): always give it to the user, it
|
|
85
|
-
opens the program in TuttiCode to keep editing
|
|
90
|
+
opens the program in TuttiCode to keep editing;
|
|
91
|
+
- a render with a `watermark` (the anonymous voice tag) without telling
|
|
92
|
+
the user it is there and that `tutticode login` removes it.
|
|
86
93
|
|
|
87
94
|
## Sound effects
|
|
88
95
|
|