79 lines
7.8 KiB
Markdown
79 lines
7.8 KiB
Markdown
# ZHILA
|
||
|
||
DAW, в котором звук лежит рельефом. Две комнаты: **nave** — собор, где камни укладываются и играются, и **quarry** — карьер под ним, где материал берут и режут. Сэмплирование здесь не «библиотека сэмплов», а карьер и кладка: у каждой вещи есть место, шрам, погода и клеймо.
|
||
|
||
Демка играет и слушается агентом: 32-тактовый луп из настоящих срезов, живой транспорт на аудиочасах, правка камней, undo, сохранение, импорт/запись, рендер в WAV.
|
||
|
||
## Запуск
|
||
|
||
```bash
|
||
./start.sh
|
||
```
|
||
|
||
Открыть **http://127.0.0.1:4173**. Скрипт берёт ключ из `DEEPSEEK_API_KEY` или из уже сохранённого ключа harness (`~/.dsh/.credentials.yaml`); ключ остаётся на сервере и в браузер не попадает. Порт можно поменять: `PORT=5000 ./start.sh`.
|
||
|
||
Без сервера `index.html` тоже открывается, но хор работает в локальном режиме (по правилам), без модели.
|
||
|
||
## Агент
|
||
|
||
Встроенный агент — это не чат сбоку, а тот же набор команд, что у руки. Модель (`deepseek-chat`) получает 14 инструментов и действует ими в живом проекте:
|
||
|
||
`get_state`, `list_cores`, `extract_core`, `fracture_core`, `strike_face`, `place_stone`, `move_stone`, `delete_stone`, `set_weather`, `set_rings`, `set_tempo`, `transport`, `open_core`, `set_macros`.
|
||
|
||
- Консоль `choir` показывает настоящий трейс: инструмент, аргументы, результат, время. Ответ — одна короткая реплика на языке пользователя.
|
||
- Агент видит состояние (камни, керны, погоду, позицию), проверяет, где уже занято, и не кладёт камень поверх того же диапазона без просьбы.
|
||
- `api live` в шапке — модель на связи; `api local` — сервера нет, работает локальный дирижёр по правилам (тоже через инструменты).
|
||
- Ключ и модель живут только на сервере; сервер слушает 127.0.0.1 и принимает CORS только с localhost.
|
||
|
||
Примеры: «сделай темнее и добавь редкий шум на восемь тактов, потом включи», «возьми керн из лестничной клетки и нарежь его заново», «убери один камень из голоса, стало тесно», «покажи мне керн, из которого сделан бас».
|
||
|
||
MCP для внешних агентов ещё не поднят: те же 14 команд — это и есть будущая поверхность. Локальный API уже отделён от UI, поэтому сервер MCP — следующий шаг.
|
||
|
||
## nave
|
||
|
||
- `space` — пуск/пауза.
|
||
- Камни: тащи вверх-вниз — время с привязкой к четверти такта; клик — выбрать; `Backspace` — закопать; `⌘/Ctrl+D` — дублировать; `⌘/Ctrl+Z` / `⇧⌘Z` — undo/redo.
|
||
- `crystal` — живая партитура событий вокруг playhead (только просмотр).
|
||
- `cilia` — уровни жил; красные точки — живой сигнал. `warmth / dust / threshold` правят мастер.
|
||
- `render` — офлайн-рендер 32 тактов в `zhila-descent-04.wav` (~62 c, 48 кГц, стерео).
|
||
- Поле «say what you want to hear» зовёт агента. Ползунки `shape` — предпочтения для следующего слоя; агент видит их в состоянии.
|
||
|
||
## quarry
|
||
|
||
- `core tray` — выбранный керн: настоящая волна, слои, шов, трещины. Линза читает глубину.
|
||
- `fracture` реально перерезает керн: 16 граней получают новые границы, и камни из этого керна начинают звучать иначе.
|
||
- `the face` — 16 граней. Удар звучит; `place` кладёт одиночный камень, `loop` — повторяющийся каждые 2 такта.
|
||
- `weather` — `age / pressure / air` меняют климат всего микса, `heat` расстраивает голоса, `ghost` добавляет хвост источника. `grow ring` усиливает эрозию петель.
|
||
- `extract`: `core` — новый процедурный керн, `file` — импорт, `room` — запись комнаты (`rec` тоже).
|
||
- `ledger` — кто, откуда и с каким клеймом взял.
|
||
|
||
## Что работает по-настоящему
|
||
|
||
- **Звук.** Web Audio: срезы кернов как сэмплы, 16 граней, кольца с эрозией, климат, лимитер, панорама, анализ мастера.
|
||
- **Транспорт.** Аудиочасы — мастер, lookahead-планировщик, луп, play/pause/stop/seek, темп на лету.
|
||
- **Правка.** Выбор, перенос, удаление, дублирование, undo/redo, автосейв.
|
||
- **Материал.** Процедурные керны, импорт, запись; поиск швов по огибающей; повторный `fracture`.
|
||
- **Агент.** Реальная модель, 14 инструментов, трейс, проверка состояния, локальный фолбэк.
|
||
- **Экспорт.** Офлайн-рендер в WAV с погодой, макросами и мастером.
|
||
|
||
## Что всё ещё макет
|
||
|
||
- Внешний MCP-сервер не поднят; `mcp`-чип — заявка на следующий шаг.
|
||
- Клеймо и опись — журнал, не права и не согласие. Модель `draft → seal` описана, не реализована.
|
||
- `crystal` не редактирует ноты; нет MIDI, редактора маппинга граней, trim/loop-точек, сендов/групп, дублей записи.
|
||
- Импортированные и записанные керны живут только в памяти; после перезагрузки их камни молчат. Пять жил и панорама фиксированы.
|
||
|
||
## Файлы
|
||
|
||
- `index.html`, `style.css` — разметка и стиль
|
||
- `engine.js` — аудиоядро: керны, срезы, голоса, климат, транспорт, рендер
|
||
- `app.js` — nave: партитура, правка, история, анализ, кристалл, командный слой
|
||
- `quarry.js` — карьер: лоток, грани, погода, кольца, опись
|
||
- `agent.js` — хор в браузере: трейс, инструменты, локальный дирижёр
|
||
- `server.js`, `agent-tools.js`, `start.sh` — локальный сервер и модель
|
||
- `terrain.js` — рельеф и город
|
||
- `preview.png`, `preview-playing.png`, `preview-agent.png`, `preview-quarry.png`, `preview-mobile.png`, `preview-quarry-mobile.png` — скриншоты
|
||
- `preview.mp3` — 62 секунды базового рендера
|
||
|
||
Сброс проекта: очистить site data (localStorage `zhila.project.v3`).
|