Strudel Console
Terminal-native music composition tool + MCP server powered by Strudel live-coding engine
Ask AI about Strudel Console
Powered by Claude ยท Grounded in docs
I know everything about Strudel Console. Ask me about installation, configuration, usage, or troubleshooting.
0/500
Reviews
Documentation
Strudel Console
English | ํ๊ตญ์ด
Strudel ๊ธฐ๋ฐ TUI ์์ ์๊ณก ๋๊ตฌ + MCP ์๋ฒ. ํฐ๋ฏธ๋์์ ๋ผ์ด๋ธ ์ฝ๋ฉํ๊ฑฐ๋, Claude Code ๊ฐ์ AI ์์ด์ ํธ๋ฅผ ํตํด ์์ ์ ๋ง๋ค ์ ์์ต๋๋ค.

์ค์น ๋ฐ ์คํ
npm install
npm run build
TUI ๋ชจ๋ (๊ธฐ๋ณธ)
npm start
# ๋๋
npm run tui
MCP ์๋ฒ ๋ชจ๋
npm run mcp
Claude Code์ settings.json์ ๋ฑ๋ก:
{
"mcpServers": {
"strudel-console": {
"command": "node",
"args": ["--experimental-specifier-resolution=node", "/path/to/strudel-console/dist/mcp/server.js"]
}
}
}
MCP ์๋ฒ ์คํ
Transport: stdio | Protocol: MCP | Version: 0.1.0
๋๊ตฌ (Tools)
Playback
| ๋๊ตฌ | ์ค๋ช | ํ๋ผ๋ฏธํฐ |
|---|---|---|
evaluate | Strudel ํจํด ์ฝ๋๋ฅผ ํ๊ฐํ๊ณ ์ฆ์ ์ฌ์ ์์ | code (string, ํ์) |
start | ํ์ฌ ํจํด ์ฌ์ ์์/์ฌ๊ฐ | โ |
stop | ์ฌ์ ์ค์ง | โ |
toggle | ์ฌ์/์ค์ง ํ ๊ธ | โ |
set_bpm | BPM ์ค์ (๊ธฐ๋ณธ 120) | bpm (number, ์์) |
get_state | ํ์ฌ ์ํ ์กฐํ (์ฌ์ ์ฌ๋ถ, ์ฝ๋, ์๋ฌ ๋ฑ) | โ |
Samples
| ๋๊ตฌ | ์ค๋ช | ํ๋ผ๋ฏธํฐ |
|---|---|---|
load_samples | ์ํ/๋ฑ ํฌ ๋ก๋ | source (string) โ github:user/repo, ๋ก์ปฌ ๊ฒฝ๋ก, ๋๋ URL |
Patterns
| ๋๊ตฌ | ์ค๋ช | ํ๋ผ๋ฏธํฐ |
|---|---|---|
save_pattern | ํจํด์ ~/.strudel-console/patterns/์ ์ ์ฅ | name (string), code (string), bpm (number, ์ ํ) |
load_pattern | ์ ์ฅ๋ ํจํด ๋ถ๋ฌ์ค๊ธฐ | name (string) |
list_patterns | ์ ์ฅ๋ ํจํด ๋ชฉ๋ก ์กฐํ | โ |
Multi-Track
| ๋๊ตฌ | ์ค๋ช | ํ๋ผ๋ฏธํฐ |
|---|---|---|
add_track | ์ ํธ๋ ์ถ๊ฐ. ๋ชจ๋ ํ์ฑ ํธ๋์ stack()์ผ๋ก ๋์ ์ฌ์ | name (string, ์ ํ), code (string, ์ ํ) |
evaluate_track | ํธ๋์ ํจํด ์ฝ๋๋ฅผ ์ ๋ฐ์ดํธํ๊ณ ์ฌ์ปดํ์ผ | code (string), track_index (int, 1-based, ์ ํ โ ์๋ต ์ ํ์ฑ ํธ๋) |
remove_track | ํธ๋ ์ญ์ | track_index (int, 1-based) |
mute_track | ํธ๋ ๋ฎคํธ ํ ๊ธ | track_index (int, 1-based) |
solo_track | ํธ๋ ์๋ก ํ ๊ธ. ์๋ก ํธ๋์ด ์์ผ๋ฉด ์๋ก๋ง ์ฌ์ | track_index (int, 1-based) |
set_track_gain | ํธ๋ ๋ณผ๋ฅจ ์ค์ | track_index (int, 1-based), gain (number, 0.0โ1.0) |
list_tracks | ์ ์ฒด ํธ๋ ๋ชฉ๋ก + ์ํ (์ด๋ฆ, ๋ฎคํธ, ์๋ก, ๊ฒ์ธ, ์ฝ๋) | โ |
Mixer
| ๋๊ตฌ | ์ค๋ช | ํ๋ผ๋ฏธํฐ |
|---|---|---|
set_master_gain | ๋ง์คํฐ ์ถ๋ ฅ ๋ณผ๋ฅจ ์ค์ (์ ํธ๋ ์ ์ฉ) | gain (number, 0.0โ1.0) |
list_effect_presets | ์ดํํธ ํ๋ฆฌ์ ๋ชฉ๋ก ์กฐํ | โ |
์ฌ์ฉ ๊ฐ๋ฅํ ์ดํํธ ํ๋ฆฌ์ :
| ํ๋ฆฌ์ | ์ดํํธ ์ฒด์ธ |
|---|---|
clean | (์์) |
lofi | .lpf(800).gain(0.8) |
ambient | .room(0.6).delay(0.4).gain(0.7) |
dark | .lpf(400).room(0.3).gain(0.9) |
bright | .hpf(300).lpf(8000).gain(0.9) |
tape | .lpf(3000).room(0.2).delay(0.15).gain(0.85) |
Render
| ๋๊ตฌ | ์ค๋ช | ํ๋ผ๋ฏธํฐ |
|---|---|---|
render_to_file | ํจํด์ WAV ํ์ผ๋ก ๋ ๋๋ง (OfflineAudioContext) | code (string, ์ ํ), cycles (int, 1โ64, ๊ธฐ๋ณธ 8), bpm (number, ์ ํ), filename (string, ์ ํ) |
์ถ๋ ฅ ๊ฒฝ๋ก: ~/.strudel-console/renders/
AI Composition
| ๋๊ตฌ | ์ค๋ช | ํ๋ผ๋ฏธํฐ |
|---|---|---|
analyze_pattern | ํจํด์ ์์ ์ ์์ฑ ๋ถ์ (ํค, ์ค์ผ์ผ, ์์ญ, ๋ฐ๋) | code (string), cycles (int, 1โ16, ๊ธฐ๋ณธ 4) |
load_genre_preset | ์ฅ๋ฅด ํ๋ฆฌ์ ๋ก๋ โ ํธ๋ + BPM ์๋ ์ค์ ํ ์ฌ์ ์์ | genre (string) |
list_genre_presets | ์ฅ๋ฅด ํ๋ฆฌ์ ๋ชฉ๋ก + ์ค๋ช ์กฐํ | โ |
์ฌ์ฉ ๊ฐ๋ฅํ ์ฅ๋ฅด ํ๋ฆฌ์ :
| ์ฅ๋ฅด | BPM | ํธ๋ ์ | ์ค๋ช |
|---|---|---|---|
lofi | 75 | 4 | Chill lo-fi beats with jazzy chords |
techno | 130 | 4 | Driving four-on-the-floor with acid bassline |
ambient | 60 | 3 | Slow evolving pads with reverb |
house | 124 | 5 | Classic house groove with organ stabs |
dnb | 174 | 3 | Fast breakbeat with rolling bass |
jazz | 110 | 3 | Swing feel with ii-V-I progression |
๋ฆฌ์์ค (Resources)
| URI | ์ค๋ช |
|---|---|
strudel-console://guide | Strudel ํจํด ์์ฑ ๊ฐ์ด๋ (๋ฏธ๋ ๋ ธํ ์ด์ , ์ดํํธ, ๋ฉํฐํธ๋ ์ํฌํ๋ก์ฐ) |
strudel-console://music-theory | ์์ ์ด๋ก ๋ ํผ๋ฐ์ค (์ค์ผ์ผ, ์ฝ๋ ์งํ, ๋ฆฌ๋ฌ ํจํด, ์ธํฐ๋ฒ) |
์ํฌํ๋ก์ฐ ์์
1. ๋จ์ผ ํจํด ์ฌ์
evaluate({ code: 'note("c4 e4 g4 b4").sound("sine")' })
set_bpm({ bpm: 90 })
stop()
2. ๋ฉํฐํธ๋ ์๊ณก
add_track({ name: "drums", code: 's("bd sd hh sd")' })
add_track({ name: "bass", code: 'note("c2 e2 g2 e2").sound("sawtooth").lpf(400)' })
evaluate_track({ code: 's("bd sd [~ bd] sd")', track_index: 1 })
mute_track({ track_index: 2 }) // ๋ฒ ์ด์ค ๋ฎคํธ
set_track_gain({ track_index: 1, gain: 0.8 })
3. ์ฅ๋ฅด ํ๋ฆฌ์ โ ์ปค์คํ
load_genre_preset({ genre: "lofi" }) // 4ํธ๋ + 75 BPM ์ธํ
list_tracks() // ํ์ฌ ํธ๋ ํ์ธ
evaluate_track({ code: 's("bd ~ [bd sd] ~")', track_index: 1 }) // ๋๋ผ ์์
set_master_gain({ gain: 0.7 })
4. ๋ถ์ โ ๋ ๋๋ง
analyze_pattern({ code: 'note("c4 e4 g4 b4").sound("sine")', cycles: 4 })
render_to_file({ code: 'note("c4 e4 g4 b4").sound("sine")', cycles: 16, bpm: 90, filename: "melody" })
์๋ฌ ์ฒ๋ฆฌ
๋ชจ๋ ๋๊ตฌ๋ ์คํจ ์ isError: true์ ํจ๊ป ์๋ฌ ๋ฉ์์ง๋ฅผ ๋ฐํํฉ๋๋ค.
| ์ํฉ | ์๋ฌ ์์ |
|---|---|
| ์๋ชป๋ Strudel ๊ตฌ๋ฌธ | Error: unexpected token ... |
| ์กด์ฌํ์ง ์๋ ํธ๋ ์ธ๋ฑ์ค | Error: track 5 does not exist |
| ์กด์ฌํ์ง ์๋ ์ฅ๋ฅด | Unknown genre. Available: lofi, techno, ambient, house, dnb, jazz |
| ๋ ๋๋งํ ํจํด ์์ | Error: no pattern to render. Provide code or set up tracks. |
| ์กด์ฌํ์ง ์๋ ํจํด ์ด๋ฆ | Error: pattern not found: ... |
๊ธฐ์ ์คํ
- ์์ง: @strudel/* v1.1.0 + node-web-audio-api (IRCAM Rust ๋ฐ์ธ๋ฉ)
- MCP: @modelcontextprotocol/sdk (stdio transport)
- TUI: Ink 5.x + React 18
- ์ธ์ด: TypeScript (ESM)
๋ผ์ด์ ์ค
์ด ํ๋ก์ ํธ๋ GNU Affero General Public License v3.0 or later ํ์ ๋ฐฐํฌ๋ฉ๋๋ค.
Strudel (AGPL-3.0-or-later) ๊ธฐ๋ฐ ํ์ ์ ์๋ฌผ์ ๋๋ค.
