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 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, there is no account, and it costs nothing. Every result
13
- carries an `editUrl` that opens the program in TuttiDAW to keep editing.
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 and the
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. Logs stay in `~/.tutticode/logs` and never contain your
154
- program or audio.
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
- 都带一个 `editUrl`,可以在 TuttiDAW 里打开这段程序继续编辑。
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
- 日志保存在 `~/.tutticode/logs`,不包含程序内容和音频。
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
- `toggle(1)` is an inline switch. These disable the strudel.cc link.
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, with the same names and report shapes, run on two backends.
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, no account): the `tutticode` CLI
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. Its tool descriptions say "Runs locally". Without MCP,
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#<payload>`, the payload being the UTF-8 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.2.0, engine 16.
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 | 161 | 210 |
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, no account, up to 5 minutes of
44
- audio per render. It also offers `code_open` (open a program here for you to hear)
45
- and `code_reference` (search the language reference).
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