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.
Files changed (98) hide show
  1. package/LICENSE +56 -0
  2. package/README.md +159 -2
  3. package/README.zh-CN.md +138 -0
  4. package/dist/skills/tutticode/SKILL.md +140 -0
  5. package/dist/skills/tutticode/references/agent-loop.md +103 -0
  6. package/dist/skills/tutticode/references/devices/aligndelay.md +28 -0
  7. package/dist/skills/tutticode/references/devices/amp.md +25 -0
  8. package/dist/skills/tutticode/references/devices/analog.md +180 -0
  9. package/dist/skills/tutticode/references/devices/arpeggiator.md +37 -0
  10. package/dist/skills/tutticode/references/devices/autopan.md +37 -0
  11. package/dist/skills/tutticode/references/devices/autoshift.md +66 -0
  12. package/dist/skills/tutticode/references/devices/beatrepeat.md +35 -0
  13. package/dist/skills/tutticode/references/devices/cabinet.md +19 -0
  14. package/dist/skills/tutticode/references/devices/channeleq.md +23 -0
  15. package/dist/skills/tutticode/references/devices/chorus.md +31 -0
  16. package/dist/skills/tutticode/references/devices/collision.md +129 -0
  17. package/dist/skills/tutticode/references/devices/compressor.md +40 -0
  18. package/dist/skills/tutticode/references/devices/corpus.md +51 -0
  19. package/dist/skills/tutticode/references/devices/delay.md +37 -0
  20. package/dist/skills/tutticode/references/devices/denoise.md +19 -0
  21. package/dist/skills/tutticode/references/devices/drift.md +82 -0
  22. package/dist/skills/tutticode/references/devices/drumbuss.md +29 -0
  23. package/dist/skills/tutticode/references/devices/drumrack.md +225 -0
  24. package/dist/skills/tutticode/references/devices/dsclang.md +26 -0
  25. package/dist/skills/tutticode/references/devices/dsclap.md +25 -0
  26. package/dist/skills/tutticode/references/devices/dscymbal.md +22 -0
  27. package/dist/skills/tutticode/references/devices/dsfm.md +25 -0
  28. package/dist/skills/tutticode/references/devices/dshh.md +23 -0
  29. package/dist/skills/tutticode/references/devices/dskick.md +25 -0
  30. package/dist/skills/tutticode/references/devices/dssnare.md +23 -0
  31. package/dist/skills/tutticode/references/devices/dstom.md +24 -0
  32. package/dist/skills/tutticode/references/devices/dynamic-tube.md +26 -0
  33. package/dist/skills/tutticode/references/devices/echo.md +56 -0
  34. package/dist/skills/tutticode/references/devices/electric.md +50 -0
  35. package/dist/skills/tutticode/references/devices/ensemble.md +129 -0
  36. package/dist/skills/tutticode/references/devices/eqeight.md +69 -0
  37. package/dist/skills/tutticode/references/devices/eqthree.md +27 -0
  38. package/dist/skills/tutticode/references/devices/erosion.md +22 -0
  39. package/dist/skills/tutticode/references/devices/filter.md +55 -0
  40. package/dist/skills/tutticode/references/devices/filterdelay.md +37 -0
  41. package/dist/skills/tutticode/references/devices/gate.md +36 -0
  42. package/dist/skills/tutticode/references/devices/glue.md +36 -0
  43. package/dist/skills/tutticode/references/devices/graindelay.md +26 -0
  44. package/dist/skills/tutticode/references/devices/hybrid-reverb.md +22 -0
  45. package/dist/skills/tutticode/references/devices/impulse.md +157 -0
  46. package/dist/skills/tutticode/references/devices/leveler.md +23 -0
  47. package/dist/skills/tutticode/references/devices/limiter.md +26 -0
  48. package/dist/skills/tutticode/references/devices/meld.md +239 -0
  49. package/dist/skills/tutticode/references/devices/midichord.md +46 -0
  50. package/dist/skills/tutticode/references/devices/midifmarp.md +26 -0
  51. package/dist/skills/tutticode/references/devices/midinoteecho.md +30 -0
  52. package/dist/skills/tutticode/references/devices/midinotelength.md +27 -0
  53. package/dist/skills/tutticode/references/devices/midipitch.md +26 -0
  54. package/dist/skills/tutticode/references/devices/midirandom.md +24 -0
  55. package/dist/skills/tutticode/references/devices/midiscale.md +25 -0
  56. package/dist/skills/tutticode/references/devices/midivelocity.md +27 -0
  57. package/dist/skills/tutticode/references/devices/multibanddynamics.md +62 -0
  58. package/dist/skills/tutticode/references/devices/operator.md +163 -0
  59. package/dist/skills/tutticode/references/devices/overdrive.md +24 -0
  60. package/dist/skills/tutticode/references/devices/pedal.md +26 -0
  61. package/dist/skills/tutticode/references/devices/phaserflanger.md +42 -0
  62. package/dist/skills/tutticode/references/devices/pitchshifter.md +56 -0
  63. package/dist/skills/tutticode/references/devices/redux.md +27 -0
  64. package/dist/skills/tutticode/references/devices/resonator.md +49 -0
  65. package/dist/skills/tutticode/references/devices/reverb.md +43 -0
  66. package/dist/skills/tutticode/references/devices/roar.md +70 -0
  67. package/dist/skills/tutticode/references/devices/sampler.md +228 -0
  68. package/dist/skills/tutticode/references/devices/saturator.md +24 -0
  69. package/dist/skills/tutticode/references/devices/simpler.md +230 -0
  70. package/dist/skills/tutticode/references/devices/sixop.md +190 -0
  71. package/dist/skills/tutticode/references/devices/spectralresonator.md +42 -0
  72. package/dist/skills/tutticode/references/devices/spectraltime.md +45 -0
  73. package/dist/skills/tutticode/references/devices/synth.md +28 -0
  74. package/dist/skills/tutticode/references/devices/tension.md +117 -0
  75. package/dist/skills/tutticode/references/devices/utility.md +29 -0
  76. package/dist/skills/tutticode/references/devices/vinyl.md +31 -0
  77. package/dist/skills/tutticode/references/devices/vocoder.md +41 -0
  78. package/dist/skills/tutticode/references/devices/wavetable.md +128 -0
  79. package/dist/skills/tutticode/references/devices.md +114 -0
  80. package/dist/skills/tutticode/references/effect-controls.md +145 -0
  81. package/dist/skills/tutticode/references/first-sounds.md +89 -0
  82. package/dist/skills/tutticode/references/for-agents.md +119 -0
  83. package/dist/skills/tutticode/references/functions.md +1848 -0
  84. package/dist/skills/tutticode/references/getting-started.md +79 -0
  85. package/dist/skills/tutticode/references/harmony-and-scales.md +105 -0
  86. package/dist/skills/tutticode/references/javascript.md +90 -0
  87. package/dist/skills/tutticode/references/mini-notation.md +120 -0
  88. package/dist/skills/tutticode/references/mixing.md +101 -0
  89. package/dist/skills/tutticode/references/muse.md +67 -0
  90. package/dist/skills/tutticode/references/sample-operations.md +102 -0
  91. package/dist/skills/tutticode/references/sounds.md +109 -0
  92. package/dist/skills/tutticode/references/time-and-structure.md +161 -0
  93. package/dist/skills/tutticode/references/tuttidaw-extensions.md +131 -0
  94. package/dist/skills/tutticode-sound-for-media/SKILL.md +97 -0
  95. package/dist/skills/tutticode-sound-for-media/references/music-recipes.md +86 -0
  96. package/dist/skills/tutticode-sound-for-media/references/sfx-recipes.md +129 -0
  97. package/dist/tutticode.cjs +18694 -0
  98. package/package.json +39 -4
@@ -0,0 +1,145 @@
1
+ # Effect controls
2
+
3
+ Filters, reverb, delay, distortion, panning, envelopes and synth controls - and moving them with signals.
4
+
5
+ Controls are methods that shape the sound of every event: `.lpf(800)`,
6
+ `.room(0.4)`. In TuttiDAW each control is played by a real device on the
7
+ voice's track - a filter control adds an Auto Filter, `room` a Reverb - so
8
+ what you hear is what you get when you open the program in the studio.
9
+
10
+ ## Filters
11
+
12
+ `.lpf(hz)` is a low-pass filter (it removes highs), `.hpf(hz)` a high-pass
13
+ (it removes lows), `.bpf(hz)` a band-pass. `.lpq(...)` / `.hpq(...)` add
14
+ resonance.
15
+
16
+ ```js
17
+ note("c2*8").s("sawtooth").lpf("<300 600 1200 2400>").lpq(6)
18
+ ```
19
+
20
+ ```js
21
+ s("hh*16").hpf(6000).gain(0.6)
22
+ ```
23
+
24
+ `.vowel("a e i o u")` is a formant filter that makes a sound talk.
25
+
26
+ ```js
27
+ note("c2*4").s("sawtooth").vowel("<a e i o>")
28
+ ```
29
+
30
+ ## Space: room and delay
31
+
32
+ `.room(amount)` sends the voice into a reverb; `.size(...)` makes the room
33
+ bigger. `.delay(amount)` adds an echo, with `.delaytime(cycles)` and
34
+ `.delayfeedback(0..1)`.
35
+
36
+ ```js
37
+ s("~ cp ~ cp").room(0.6).size(4)
38
+ ```
39
+
40
+ ```js
41
+ note("<c4 eb4> ~ ~ ~").s("triangle").delay(0.5).delaytime(3/16).delayfeedback(0.55)
42
+ ```
43
+
44
+ ## Drive and lo-fi
45
+
46
+ `.shape(0..1)` and `.distort(...)` add drive; `.crush(bits)` reduces the bit
47
+ depth (lower is crunchier) and `.coarse(n)` the sample rate.
48
+
49
+ ```js
50
+ s("bd*4, ~ sd").shape(0.5)
51
+ ```
52
+
53
+ ```js
54
+ note("c3 eb3 g3 bb3").s("square").crush(5)
55
+ ```
56
+
57
+ ## Level and stereo
58
+
59
+ `.gain(...)` is the level into the effects, `.postgain(...)` after them.
60
+ `.pan(0..1)` places the voice from left (0) to right (1).
61
+
62
+ ```js
63
+ s("hh*8").pan("0 1 0.25 0.75").gain(0.7)
64
+ ```
65
+
66
+ ## Modulation effects
67
+
68
+ `.phaser(rate)` and `.chorus(amount)` add movement; `.compressor(...)`
69
+ evens out the level.
70
+
71
+ ```js
72
+ note("[c3,g3,bb3]*2").s("sawtooth").phaser(1).lpf(1800)
73
+ ```
74
+
75
+ ## Envelopes
76
+
77
+ `.attack`, `.decay`, `.sustain` and `.release` shape each note's volume, in
78
+ seconds (sustain is a level, 0 to 1). A slow attack and long release make a
79
+ pad; a short decay with no sustain makes a pluck.
80
+
81
+ ```js
82
+ note("<[c3,eb3,g3] [bb2,d3,f3]>").s("sawtooth").attack(0.4).release(1).lpf(1500)
83
+ ```
84
+
85
+ ```js
86
+ note("c4 g4 eb4 g4").s("square").decay(0.12).sustain(0)
87
+ ```
88
+
89
+ ## Synth controls
90
+
91
+ These play on the TuttiDAW synth that stands in for the waveform:
92
+
93
+ - `.lpenv(depth)` with `.lpattack` / `.lpdecay` / `.lpsustain` / `.lprelease`:
94
+ an envelope on the filter cutoff;
95
+ - `.fm(index)` with `.fmh(ratio)` and `.fmdecay(...)`: FM brightness (the
96
+ voice moves onto Operator);
97
+ - `.penv(semitones)` with `.pdecay(...)`: a pitch sweep, good for kicks and
98
+ zaps;
99
+ - `.vib(rate)` with `.vibmod(semitones)`: vibrato;
100
+ - `.detune(...)` and `.unison(voices)` on `supersaw`.
101
+
102
+ ```js
103
+ note("c2 ~ c2 [~ c3]").s("sawtooth").lpf(250).lpenv(4).lpdecay(0.15).lpsustain(0)
104
+ ```
105
+
106
+ ```js
107
+ note("c3 e3 g3 c4").s("sine").fm(3).fmh(2).fmdecay(0.3)
108
+ ```
109
+
110
+ ```js
111
+ note("c2*4").s("sine").penv(24).pdecay(0.08)
112
+ ```
113
+
114
+ Each of these is an approximation of Strudel's synth on a TuttiDAW
115
+ instrument; the diagnostics list say which device plays it.
116
+
117
+ ## Moving values: signals
118
+
119
+ A **signal** is a value that moves continuously through the cycle. `sine`,
120
+ `cosine`, `saw`, `tri` and `square` go from 0 to 1; `perlin` and `rand`
121
+ move smoothly or randomly. `.range(min, max)` scales a signal, `.slow(n)`
122
+ stretches it over `n` cycles.
123
+
124
+ ```js
125
+ note("c2*16").s("sawtooth").lpf(sine.range(300, 3000).slow(4))
126
+ ```
127
+
128
+ ```js
129
+ s("hh*16").gain(perlin.range(0.3, 0.9))
130
+ ```
131
+
132
+ `.segment(n)` samples a signal `n` times per cycle, which turns it into
133
+ notes:
134
+
135
+ ```js
136
+ n(saw.range(0, 8).segment(8)).scale("C:minor")
137
+ ```
138
+
139
+ ## In the studio: automation
140
+
141
+ When you **Open in TuttiDAW**, a control that changes over time - a pattern
142
+ like `"<300 600>"` or a signal - becomes a clip envelope on the device
143
+ parameter, so you can see and edit the movement like any other automation.
144
+
145
+ Source: https://tuttidaw.com/code/learn/effect-controls
@@ -0,0 +1,89 @@
1
+ # First sounds
2
+
3
+ Drums with s(), pitches with note(), and the difference between them.
4
+
5
+ There are two ways to make a voice sound: name a **sound** with `s(...)`, or
6
+ play **pitches** with `note(...)`.
7
+
8
+ ## Drums with s()
9
+
10
+ `s` (or its long name `sound`) picks sounds by name. Short names stand for
11
+ the parts of a drum kit:
12
+
13
+ | Name | Sound | Name | Sound |
14
+ |---|---|---|---|
15
+ | `bd` | bass drum | `oh` | open hi-hat |
16
+ | `sd` | snare | `cr` | crash |
17
+ | `rim` | rimshot | `rd` | ride |
18
+ | `cp` | clap | `ht` `mt` `lt` | high, mid, low tom |
19
+ | `hh` | closed hi-hat | `sh` `cb` | shaker, cowbell |
20
+
21
+ ```js
22
+ s("bd hh sd hh")
23
+ ```
24
+
25
+ A comma inside the quotes plays two rows at the same time:
26
+
27
+ ```js
28
+ s("bd ~ sd ~, hh hh hh hh hh hh hh hh")
29
+ ```
30
+
31
+ `~` is a rest: the step is there, but nothing plays.
32
+
33
+ ## Choosing a drum machine
34
+
35
+ `.bank(...)` picks the drum machine the names play on. TuttiDAW maps the
36
+ classic machines to its factory kits: `tr808`, `tr909`, `tr707`, `tr606`,
37
+ `tr505`, `linn`, `dmx` and `cr78` (Strudel's long names such as
38
+ `RolandTR909` work too).
39
+
40
+ ```js
41
+ s("bd*2 [~ bd] sd ~, hh*8").bank("tr909")
42
+ ```
43
+
44
+ ## Pitches with note()
45
+
46
+ `note` plays pitches. Write note names (`c`, `d`, `eb`, `f#`) with an octave
47
+ number, or MIDI numbers.
48
+
49
+ ```js
50
+ note("c3 eb3 g3 bb3")
51
+ ```
52
+
53
+ ```js
54
+ note("48 51 55 58")
55
+ ```
56
+
57
+ Both lines play the same four notes. In code, `c4` is MIDI 60 (middle C).
58
+ TuttiDAW's piano roll, like Ableton Live, labels MIDI 60 as **C3**, so a
59
+ note written `c4` in code shows as C3 in the clip.
60
+
61
+ ## Giving notes a sound
62
+
63
+ A `note` voice without a sound plays a simple synth. Add `.s(...)` to pick
64
+ another one: the basic waveforms `sine`, `triangle`, `square`, `sawtooth`, or
65
+ an instrument name such as `piano`.
66
+
67
+ ```js
68
+ note("c3 e3 g3 b3").s("sawtooth")
69
+ ```
70
+
71
+ ```js
72
+ note("c4 e4 g4 c5").s("piano")
73
+ ```
74
+
75
+ The [Sounds](sounds.md) chapter lists the instruments you can name, and
76
+ [TuttiDAW extensions](tuttidaw-extensions.md) shows how to load any TuttiDAW
77
+ instrument with its presets.
78
+
79
+ ## Volume and velocity
80
+
81
+ `.gain(...)` sets the loudness of a voice. `.velocity(...)` (0 to 1) sets how
82
+ hard each note is played, as a MIDI velocity: it is kept when you freeze code
83
+ to MIDI.
84
+
85
+ ```js
86
+ s("hh*8").gain(0.5).velocity("1 0.6 0.8 0.6")
87
+ ```
88
+
89
+ Source: https://tuttidaw.com/code/learn/first-sounds
@@ -0,0 +1,119 @@
1
+ # TuttiCode for agents
2
+
3
+ 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.
4
+
5
+ AI agents can write TuttiCode as well as you can, but they cannot hear it.
6
+ **tutticode** gives them ears and a mixing desk: a command-line tool and an
7
+ MCP server that check a program, render it to WAV, FLAC or MP3 with the
8
+ same engine as this page, and measure the result (loudness, peaks, balance,
9
+ groove) so the agent can fix what it cannot hear. Two skills teach agents
10
+ the language and how to make sound for videos, apps and games.
11
+
12
+ ## Install
13
+
14
+ You need Node 20 or newer and Google Chrome or Microsoft Edge.
15
+
16
+ ```sh
17
+ npm i -g tutticode
18
+ tutticode skills install
19
+ tutticode doctor
20
+ ```
21
+
22
+ `skills install` copies the two skills, `tutticode` (the language) and
23
+ `tutticode-sound-for-media` (music beds, loops and sound effects at the
24
+ right length and loudness), into the skill folders of Claude Code
25
+ (`~/.claude/skills`), Copilot CLI (`~/.copilot/skills`) and Codex
26
+ (`~/.codex/skills`): every one that exists on your computer, or the ones
27
+ you name with `--claude`, `--copilot`, `--codex`, or any folder with
28
+ `--dir <path>`.
29
+
30
+ For MCP clients, add the server, for example in Claude Code:
31
+
32
+ ```sh
33
+ claude mcp add tutticode -- tutticode mcp
34
+ ```
35
+
36
+ ## Two backends, one API
37
+
38
+ The tools have the same names everywhere: `code_check` (compile, no
39
+ audio), `code_render` (render and measure) and `code_compare` (compare with
40
+ a target or an earlier render). Only where the audio is made differs:
41
+
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).
46
+ - **TuttiDAW's web MCP** (`https://tuttidaw.com/api/mcp`) and the HTTP API
47
+ (`/api/code/check`, `/api/code/render`, `/api/code/compare`): for agents
48
+ that cannot run programs on your computer. Renders on our servers, needs
49
+ you to be signed in, costs Muse points, at most 60 seconds, and returns a
50
+ link to listen to instead of files.
51
+
52
+ ## Example: a riser for a video
53
+
54
+ 1. Ask your agent: "Make a 4 second riser for the start of my video,
55
+ normalised for YouTube, and save it as riser.wav."
56
+ 2. The agent picks the riser recipe from the media skill, writes the
57
+ program and runs `code_check` until it has no errors:
58
+
59
+ ```js
60
+ setcpm(15) // one bar = 4 s
61
+ cymbal: note("c4").s("gm_reverse_cymbal").gain(0.9)
62
+ sweep: note("c3").s("sawtooth").penv(24).pattack(4).attack(3.5).release(0.1).lpf(2000).gain(0.4)
63
+ ```
64
+
65
+ 3. It renders the file and reads the numbers before it hands it over:
66
+
67
+ ```sh
68
+ tutticode render riser.tc -o riser.wav --seconds 4 --lufs -18 --json
69
+ ```
70
+
71
+ You get `riser.wav`, its loudness and true peak, and an `editUrl` that
72
+ opens the program here, so you can listen, change it and render it again
73
+ yourself. Press play above to hear what the agent made.
74
+
75
+ ## Privacy
76
+
77
+ tutticode renders on your computer: the program goes from the agent to the
78
+ TuttiCode page in your own browser and nowhere else. The bridge sends no
79
+ program code and no audio to our servers, and tutticode sends no telemetry.
80
+ Its logs stay in `~/.tutticode/logs` and never contain your programs or
81
+ audio. The page itself loads from tuttidaw.com like any web page, with its
82
+ instruments and samples. The web MCP is different: there the program is
83
+ sent to TuttiDAW to be rendered.
84
+
85
+ ## The browser permission
86
+
87
+ The TuttiCode page talks to tutticode over your own computer
88
+ (`127.0.0.1`), which Chrome and Edge treat as your local network:
89
+
90
+ - By default tutticode starts a hidden browser with its own profile and
91
+ allows this for tuttidaw.com only; you see nothing.
92
+ - With `--show` (the default when you type a command yourself) it uses a
93
+ tab in your normal browser. The first time, the page asks whether this
94
+ agent may render sound with TuttiCode, and the browser asks whether
95
+ tuttidaw.com may access devices on your local network: allow both.
96
+ - `tutticode setup` (optional) explains, asks, and then sets one browser
97
+ policy for your user so that the second question does not come back:
98
+ local network access for `https://tuttidaw.com` only.
99
+ `tutticode setup --undo` removes exactly that entry.
100
+
101
+ ## Troubleshooting
102
+
103
+ Run `tutticode doctor` first: it checks Node, the browser, the page, the
104
+ connection and the engine version, and says what to fix.
105
+
106
+ - **No browser found**: install Chrome or Edge, or point tutticode at one
107
+ with `--browser <path>` or the `TUTTICODE_BROWSER` variable.
108
+ - **The page never connects** (exit code 2): allow the local network
109
+ question in the browser (or run `tutticode setup`), and check that no
110
+ extension or company policy blocks tuttidaw.com.
111
+ - **Errors in the code** (exit code 1): the report lists each one with its
112
+ line, column and a fix; the agent should run `code_check` until it is
113
+ clean.
114
+ - **`clip`**: the loudness asked for would push the peaks past -1 dBTP.
115
+ Ask for a lower `--lufs`, or turn down the loudest voice.
116
+ - **A render that runs too long**: give it more time with `--timeout`, or
117
+ render fewer loops.
118
+
119
+ Source: https://tuttidaw.com/code/learn/for-agents