tutticode 0.2.1 → 0.3.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/README.md +14 -5
- package/README.zh-CN.md +13 -3
- package/dist/skills/tutticode/SKILL.md +13 -13
- package/dist/skills/tutticode/references/agent-loop.md +17 -4
- package/dist/skills/tutticode/references/automation.md +168 -0
- package/dist/skills/tutticode/references/devices/compressor.md +2 -0
- package/dist/skills/tutticode/references/devices/filter.md +2 -0
- package/dist/skills/tutticode/references/devices/gate.md +2 -0
- package/dist/skills/tutticode/references/devices/glue.md +2 -0
- package/dist/skills/tutticode/references/devices/multibanddynamics.md +2 -0
- package/dist/skills/tutticode/references/devices.md +2 -2
- package/dist/skills/tutticode/references/effect-controls.md +8 -0
- package/dist/skills/tutticode/references/first-sounds.md +2 -0
- package/dist/skills/tutticode/references/for-agents.md +28 -2
- package/dist/skills/tutticode/references/functions.md +67 -5
- package/dist/skills/tutticode/references/harmony-and-scales.md +3 -0
- package/dist/skills/tutticode/references/language-reference.md +362 -0
- package/dist/skills/tutticode/references/melodies-with-do-re-mi.md +41 -5
- package/dist/skills/tutticode/references/mixing-groups.md +7 -4
- package/dist/skills/tutticode/references/mixing.md +48 -6
- package/dist/skills/tutticode/references/muse.md +7 -0
- package/dist/skills/tutticode/references/sounds.md +26 -0
- package/dist/skills/tutticode/references/tuttidaw-extensions.md +13 -6
- package/dist/skills/tutticode-sound-for-media/SKILL.md +13 -3
- package/dist/skills/tutticode-sound-for-media/references/music-recipes.md +30 -6
- package/dist/tutticode.cjs +8 -8
- package/package.json +1 -1
|
@@ -11,8 +11,8 @@ 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`).
|
|
15
|
-
the local tools
|
|
14
|
+
a `listenUrl`). Without sign-in,
|
|
15
|
+
the local tools render at most 60 s and tag renders over
|
|
16
16
|
30 s with a spoken "register at TuttiDAW": for a longer delivery, when a
|
|
17
17
|
render hits a limit (`limit` error, `watermark`), suggest
|
|
18
18
|
`tutticode login` (free) to the user (the `tutticode` skill says how an
|
|
@@ -45,7 +45,7 @@ agent gets the approval). Never change the program to remove the tag.
|
|
|
45
45
|
Recipe index:
|
|
46
46
|
|
|
47
47
|
- Sound effects (`references/sfx-recipes.md`): `riser`, `impact`, `whoosh`, `ui-click`, `ui-confirm`, `ui-error`, `notification`, `transition`, `ambience-bed`
|
|
48
|
-
- Music beds (`references/music-recipes.md`): `lofi-bed`, `upbeat-pop-bed`, `cinematic-tension`, `ambient-bed`, `chiptune-loop`
|
|
48
|
+
- Music beds (`references/music-recipes.md`): `lofi-bed`, `upbeat-pop-bed`, `cinematic-tension`, `ambient-bed`, `chiptune-loop`, `kick-ducked-bed`
|
|
49
49
|
|
|
50
50
|
## Loudness and length
|
|
51
51
|
|
|
@@ -91,6 +91,16 @@ Recipe index:
|
|
|
91
91
|
- a render with a `watermark` (the anonymous voice tag) without telling
|
|
92
92
|
the user it is there and that `tutticode login` removes it.
|
|
93
93
|
|
|
94
|
+
## Mixing a bed
|
|
95
|
+
|
|
96
|
+
With several voices, mix like a studio: one `bus("verb")` (and a
|
|
97
|
+
`bus("echo")`) that the voices `.send("verb", dB)` to, so they share one
|
|
98
|
+
room, instead of a `.room()` per voice; `.mix({vol: -6})` (dB) to balance
|
|
99
|
+
the voices; `master.fx("Limiter", ...)` last, so the loudness target fits
|
|
100
|
+
under the ceiling; `group("drums")` + `.group("drums")` for one drum fader.
|
|
101
|
+
Single-voice effects keep `.room` / `.delay`. Details: the `tutticode`
|
|
102
|
+
skill's `references/mixing.md`.
|
|
103
|
+
|
|
94
104
|
## Sound effects
|
|
95
105
|
|
|
96
106
|
Synth voices work everywhere. Noise is `s("white")`, `s("pink")` or
|
|
@@ -46,14 +46,16 @@ Trailers, reveals, suspense, game menus: a low drone, slow minor strings and a t
|
|
|
46
46
|
|
|
47
47
|
```js
|
|
48
48
|
setcpm(15) // 60 BPM
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
49
|
+
bus("verb").fx("Reverb", {dryWetBalance: 1, decayTime: "4s"}) // one room for every voice
|
|
50
|
+
master.fx("Limiter", {gainDb: 3, ceiling: -3})
|
|
51
|
+
drone: note("c2").s("sawtooth").lpf(300).attack(1).release(1).mix({vol: -6}).send("verb", -18)
|
|
52
|
+
strings: chord("<Cm Ab>").voicing().s("supersaw").attack(2).release(2).lpf(1200).mix({vol: -10}).send("verb", -4)
|
|
53
|
+
pulse: note("c6*8").s("sine").decay(0.1).sustain(0).mix({vol: -8}).send("verb", -14)
|
|
52
54
|
```
|
|
53
55
|
|
|
54
56
|
Render: `tutticode render cinematic-tension.tc -o cinematic-tension.wav --loops 3 --tail 3 --fade-out 4 --lufs -18`, or `code_render` with `{"loops":3,"tail":3,"fadeOut":4,"lufs":-18}`.
|
|
55
57
|
|
|
56
|
-
Vary: Rising tension: double the pulse (c6*16) for the last loop, or render the riser over the end.
|
|
58
|
+
Vary: Rising tension: double the pulse (c6*16) for the last loop, or render the riser over the end. Bigger space: raise the sends, not the voices.
|
|
57
59
|
|
|
58
60
|
## Ambient bed (`ambient-bed`)
|
|
59
61
|
|
|
@@ -61,8 +63,11 @@ Meditation, wellness, slow product shots: a wide pad and sparse echoing bells at
|
|
|
61
63
|
|
|
62
64
|
```js
|
|
63
65
|
setcpm(12) // 48 BPM
|
|
64
|
-
|
|
65
|
-
|
|
66
|
+
bus("verb").fx("Reverb", {dryWetBalance: 1, decayTime: "6s"})
|
|
67
|
+
bus("echo").fx("Delay", {feedback: 0.4}).mix({vol: -6})
|
|
68
|
+
master.fx("Limiter", {gainDb: 3, ceiling: -3})
|
|
69
|
+
pad: chord("<Dm F>").voicing().s("supersaw").attack(2).release(3).lpf(1000).mix({vol: -10}).send("verb", -3)
|
|
70
|
+
bells: n("0 2 4 7 4 2").scale("D5:minor").s("sine").decay(0.8).sustain(0).mix({vol: -8}).send("echo", -6).send("verb", -12)
|
|
66
71
|
```
|
|
67
72
|
|
|
68
73
|
Render: `tutticode render ambient-bed.tc -o ambient-bed.wav --loops 3 --tail 4 --fade-in 3 --fade-out 5 --lufs -20`, or `code_render` with `{"loops":3,"tail":4,"fadeIn":3,"fadeOut":5,"lufs":-20}`.
|
|
@@ -84,3 +89,22 @@ master.fx("Limiter", {gainDb: 3, ceiling: -3})
|
|
|
84
89
|
Render: `tutticode render chiptune-loop.tc -o chiptune-loop.wav --loops 2 --tail 0 --lufs -19`, or `code_render` with `{"loops":2,"tail":0,"lufs":-19}`.
|
|
85
90
|
|
|
86
91
|
Vary: A game loop file has no fades and `tail: 0`: exactly N loops, so it repeats in time. A boss level: setcpm(45) and a minor scale.
|
|
92
|
+
|
|
93
|
+
## Kick-ducked bed (`kick-ducked-bed`)
|
|
94
|
+
|
|
95
|
+
Fitness, sport, fashion and dance promos: a 120 BPM house pulse whose pad and bass duck under every kick (sidechain), so the kick punches through.
|
|
96
|
+
|
|
97
|
+
```js
|
|
98
|
+
setcpm(30) // 120 BPM
|
|
99
|
+
kick: s("bd*4").bank("tr909").gain(0.8)
|
|
100
|
+
hats: s("~ hh ~ hh, hh*8").bank("tr909").gain(0.3)
|
|
101
|
+
pad: chord("<Am F C G>").voicing().s("supersaw").release(0.3).lpf(2500).gain(0.3)
|
|
102
|
+
.fx("Compressor", {threshold: -30, ratio: 8, attack: 1, release: 120, sidechain: "kick", sidechainFilter: "150Hz"})
|
|
103
|
+
bass: note("<a1 f1 c2 g1>").ply(8).s("sawtooth").lpf(500).gain(0.5)
|
|
104
|
+
.fx("Compressor", {threshold: -30, ratio: 6, attack: 1, release: 100, sidechain: "kick"})
|
|
105
|
+
master.fx("Limiter", {gainDb: 3, ceiling: -3})
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Render: `tutticode render kick-ducked-bed.tc -o kick-ducked-bed.wav --loops 4 --fade-out 2 --lufs -16`, or `code_render` with `{"loops":4,"fadeOut":2,"lufs":-16}`.
|
|
109
|
+
|
|
110
|
+
Vary: More or less pump: release (shorter = tighter) and ratio. Duck the whole bed at once: put pad and bass in group("bed") and key one Compressor on the group. Under speech: drop the hats and render at -20 LUFS.
|
package/dist/tutticode.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
/* tutticode v0.
|
|
2
|
+
/* tutticode v0.3.0 | https://tuttidaw.com */
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
5
5
|
var __defProp = Object.defineProperty;
|
|
@@ -4598,13 +4598,14 @@ function tutticodeTermsUrl(origin) {
|
|
|
4598
4598
|
}
|
|
4599
4599
|
var TUTTICODE_LOGIN_HINT_COMMAND = "tutticode login --device --no-wait";
|
|
4600
4600
|
var DEFAULT_TUTTICODE_LIMITS = {
|
|
4601
|
-
enforce:
|
|
4601
|
+
enforce: true,
|
|
4602
4602
|
anonMaxSeconds: 60,
|
|
4603
4603
|
anonWatermarkAfterSeconds: 30,
|
|
4604
4604
|
watermarkGapSeconds: 3,
|
|
4605
4605
|
signedInMaxSeconds: 300,
|
|
4606
4606
|
signedInDailyRenders: 1e3,
|
|
4607
|
-
|
|
4607
|
+
// 0.2.0's sign-in is broken on Windows
|
|
4608
|
+
minCliVersion: "0.2.1"
|
|
4608
4609
|
};
|
|
4609
4610
|
var VERSION = /^(\d{1,6})\.(\d{1,6})\.(\d{1,6})(?:-[0-9A-Za-z.-]{1,32})?$/;
|
|
4610
4611
|
function isCliVersion(v) {
|
|
@@ -4902,7 +4903,7 @@ var import_node_path2 = require("node:path");
|
|
|
4902
4903
|
var import_node_fs = require("node:fs");
|
|
4903
4904
|
var import_node_os = require("node:os");
|
|
4904
4905
|
var import_node_path = require("node:path");
|
|
4905
|
-
var VERSION2 = true ? "0.
|
|
4906
|
+
var VERSION2 = true ? "0.3.0" : readPackageVersion();
|
|
4906
4907
|
function envBrowserArgs() {
|
|
4907
4908
|
const args = process.env.TUTTICODE_BROWSER_ARGS?.split(" ").filter(Boolean);
|
|
4908
4909
|
return args?.length ? args : void 0;
|
|
@@ -6223,9 +6224,8 @@ Usage:
|
|
|
6223
6224
|
tutticode setup optional browser policy + skills
|
|
6224
6225
|
tutticode skills install install the agent skills
|
|
6225
6226
|
|
|
6226
|
-
|
|
6227
|
-
|
|
6228
|
-
at TuttiDAW" tag. TUTTICODE_TOKEN (an access token from the
|
|
6227
|
+
Renders without sign-in are limited to 60 s, and renders over 30 s carry a
|
|
6228
|
+
spoken "register at TuttiDAW" tag. TUTTICODE_TOKEN (an access token from the
|
|
6229
6229
|
account page) signs in CI.
|
|
6230
6230
|
|
|
6231
6231
|
Exit codes: 0 ok, 1 errors in the code, 2 bridge/browser problem, 3 usage,
|
|
@@ -8957,7 +8957,7 @@ var CODE_OPEN_TOOL = "code_open";
|
|
|
8957
8957
|
var CODE_REFERENCE_TOOL = "code_reference";
|
|
8958
8958
|
var CODE_ACCOUNT_TOOL = "code_account";
|
|
8959
8959
|
var BACKEND_NOTE = "Runs locally: tutticode renders in your own browser with the tuttidaw.com/code engine (free).";
|
|
8960
|
-
var LIMITS_NOTE = `
|
|
8960
|
+
var LIMITS_NOTE = `Renders without sign-in are limited to ${DEFAULT_TUTTICODE_LIMITS.anonMaxSeconds} s (error code "limit") and renders over ${DEFAULT_TUTTICODE_LIMITS.anonWatermarkAfterSeconds} s carry a spoken "register at TuttiDAW" tag, reported as \`watermark\`: it is not part of the program and is in the stats; never change the code to remove it, tell the user once that \`tutticode login\` (free) removes it.`;
|
|
8961
8961
|
var codeProperty2 = codeCheckTool.inputSchema.properties.code;
|
|
8962
8962
|
var renderProperties2 = {
|
|
8963
8963
|
code: codeProperty2,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tutticode",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Turn TuttiCode (tuttidaw.com/code pattern code) into audio files from any agent: a CLI and an MCP server that render in your own browser with the TuttiDAW engine.",
|
|
6
6
|
"license": "MIT",
|