Reference: SEA_MCP_WHITEPAPER_v0.3.md (120점 백서)
Goal: 19일 안에 백서를 실코드로 떨어트려 박씨 폰에 첫 BBC SO + DiffSinger 트랙 수신
Owner: Park Tae-jung (dtslib1979)
작성일: 2026-05-07
Status: 즉시 실행 가능 (parksy-audio 자산 100% 재활용)
**백서 v0.3 (120점)을 19일 안에 실코드로 떨어트려서 박씨 폰에 첫 트랙 알림 받기.**
신규 코드 작성 최소화 — parksy-audio가 이미 가진 자산(MCP 13툴 + local-agent 8개 + DiffSinger v1 + SoVITS v2ProPlus + 1561쌍 voice_filter)을 wrap해서 Φ 합성사상으로 오케스트레이션만 하면 끝.
이미 박씨 손에 있는 자산. 신규 개발 0줄.
| 자산 | 위치 | sea_mcp 활용 | ||
| parksy_voice (MCP 13툴) | `parksy-audio/mcp_voice/` | editable import | ||
|---|---|---|---|---|
| singing_engines.registry (DiffSinger v1) | `mcp_voice/parksy_voice/singing_engines/` | Φ₅ V_vox 백엔드 | ||
| contracts.py (SingSpec 등 8 클래스) | `mcp_voice/parksy_voice/contracts.py` | Φ₅ 계약 | ||
| qc.py (measure_wav) | `mcp_voice/parksy_voice/qc.py` | Φ₄ 1차 검증 | ||
| score_engine.py (100점) | `local-agent/score_engine.py` | Φ₄ QC 게이트 (tool #13) | ||
| optimizer.py (Phase 8) | `local-agent/optimizer.py` | Φ₄ 마스터링 백엔드 | ||
| humanize_preset.py (±5ms) | `local-agent/humanize_preset.py` | Φ₃ 후처리 (A/B grade) | ||
| piano_expression.py (7-Stage) | `local-agent/piano_expression.py` | Φ₃ 후처리 (C/D grade) | ||
| midi_quality_gate.py (A~F) | `local-agent/midi_quality_gate.py` | MIDI 게이트 | ||
| make_visual_video.py (1280×720) | `local-agent/make_visual_video.py` | Π 영상 (tool #14) | ||
| voice_filter.md (1561쌍) | `parksy-audio/voice_filter.md` | TTS 라우팅 | ||
| parksy_ko_v1.onnx (334MB) | `PARKSY_DS/export/` | DiffSinger 모델 | ||
| voice_models (SoVITS 70+) | `/mnt/e/parksy-data/voice_models/` (symlink) | 가창 fallback | ||
| nsf_hifigan_44.1k | `checkpoints/` (symlink) | DiffSinger vocoder | ||
| BBC SO + VSCO-2-CE + Pianoteq 9 + Ample Guitar + MT Power Drum | REAPER VSTi | render_audio 라우트 | ||
| Galaxy Tab S9 5G (EWI USB + 마이크) | 박씨 보유 | merge_terminal 입력 | ||
| Tailscale 폐쇄망 | 가동 중 | FastMCP SSE :8011 | ||
| dtslib GitHub 28레포 | gh:dtslib1979 | 아카이브 | ||
| Telegram Bot (Parksy Air) | 8621929617:... | publish_telegram |
신규 작성 = 6 파일, ~540줄 (백서 §13.3)
소요: 박씨 30분 + Claude 자동 1시간
# Claude 자동
mkdir -p ~/sea_mcp/{src/{tools,lookup,integrations},tests,scripts,templates/tracks}
cd ~/sea_mcp
git init -b main
gh repo create dtslib1979/sea_mcp --private --source=. --remote=origin
# parksy-audio mcp_voice editable
cd ~/parksy-audio/mcp_voice
pip install -e . # parksy_voice 모듈 import 가능
# sea_mcp editable
cd ~/sea_mcp
pip install -e .[test]
TG_BOT_TOKEN=8621929617:AAH-XpVJ4PKVJV8m9-qB2aLupMHO0nYfZLQ
TG_CHAT_ID=6858098283
REAPER_EXE=/mnt/c/Program Files/REAPER/reaper.exe
SEA_RPP_DIR=/home/dtsli/parksy-audio/templates
SEA_REPO=/home/dtsli/dtslib/sea_archive
PARKSY_AUDIO_ROOT=/home/dtsli/parksy-audio
PARKSY_DIFFSINGER_ONNX=/home/dtsli/parksy-audio/PARKSY_DS/export/parksy_ko_v1.onnx
SEA_SCORE_THRESHOLD=70
"sea": {
"command": "python",
"args": ["-m", "src.server"],
"cwd": "/home/dtsli/sea_mcp",
"env": { "...": "위 .env 값들" }
}
목적: v0.2 다이어그램의 거짓말 4건을 실코드로 봉합.
작업:
1. src/tools/adapter.py 작성 (백서 §6.1, ~80줄)
2. W 11×8 행렬 도메인 지식 기반 고정값 박기
3. softplus_clip + neutral fallback
테스트:
게이트: 3/3 통과
작업:
1. src/lookup/tree_lookup.py 작성 (백서 §8.1, 29 트리 풀 테이블)
2. src/tools/feature.py patch — _apply_tree_weights() + _auto_select_trees() 추가
3. dim 매핑 dict (f2→key, f10→centroid 등)
테스트:
게이트: 3/3 통과 + 29 트리 카운트 일치
작업:
1. src/tools/motif.py 작성 (백서 §8.3, MOTIF_LIB 6종)
2. src/tools/trance.py 작성 (백서 §8.2, TRANCE_COEF 5지역)
3. src/tools/midi.py patch — MidiInput.motif, trance_core_freq, apply_humanize 인자 추가
4. _pitch() motif intervals 우선 적용
5. _build_events() trance LFO 베이스 오스티나토
6. parksy-audio import: midi_quality_gate.classify_midi, humanize_preset.apply, piano_expression.inject_7stage
테스트:
게이트: 7/7 통과
작업:
1. v0.1 5개 + v0.2 8개 + Sprint 1 신규 14개 합쳐 pytest 일괄 실행
2. 누락된 v0.1 모듈 (emotion/narrative) 그대로 복사
3. src/server.py 11 tool 등록 (v0.2 수준까지)
테스트:
게이트: 27/27 통과 + Claude Desktop에서 sea_mcp 11툴 보임
목적: 신규 음향 엔진 0줄. 전부 wrap.
작업:
# src/integrations/parksy_audio.py
import sys
from pathlib import Path
PARKSY_AUDIO_ROOT = Path(os.environ.get("PARKSY_AUDIO_ROOT", "/home/dtsli/parksy-audio"))
def setup_paths():
paths = [PARKSY_AUDIO_ROOT / "mcp_voice", PARKSY_AUDIO_ROOT / "local-agent"]
for p in paths:
if str(p) not in sys.path:
sys.path.insert(0, str(p))
setup_paths()
# 안전 import (실패해도 sea_mcp는 기동)
try:
from parksy_voice.singing_engines.registry import get_engine, list_engines, has_engine
from parksy_voice.contracts import SingSpec, VoiceQC
from parksy_voice.qc import measure_wav
HAS_PARKSY_VOICE = True
except Exception as ex:
HAS_PARKSY_VOICE = False
PARKSY_VOICE_ERR = str(ex)
try:
from score_engine import score_file
from optimizer import run_v4 as optimizer_v4
from humanize_preset import apply as humanize_apply
from piano_expression import inject_7stage
from midi_quality_gate import classify_midi
from make_visual_video import render as visual_render_fn
HAS_LOCAL_AGENT = True
except Exception as ex:
HAS_LOCAL_AGENT = False
LOCAL_AGENT_ERR = str(ex)
게이트: python -c "from src.integrations.parksy_audio import HAS_PARKSY_VOICE, HAS_LOCAL_AGENT; assert HAS_PARKSY_VOICE and HAS_LOCAL_AGENT"
작업: 백서 §6.2 그대로 박기 (~60줄)
검증:
1. parksy-audio에 있는 기존 wav 1개 (예: parksy-audio/local-agent/outputs/wav/__test.wav) 골라서 score 실행
2. dict 반환 확인: {LUFS, LRA, TP, total, s_*}
테스트: test_score_gate_real_wav — total > 0
게이트: 실 wav 1개 스코어링 성공
작업: 백서 §6.3 그대로 박기 (~50줄)
검증:
1. parksy-audio 기존 wav로 1280×720 mp4 생성
2. ffprobe로 해상도 확인
테스트: test_visual_real_wav — mp4 파일 size > 100KB
게이트: 실 wav → mp4 변환 성공
작업:
1. src/tools/perform.py patch (백서 §6.4)
2. enable_diffsinger_preview=True 분기에서 singing_engines.get_engine("diffsinger_onnx") 호출
3. SingSpec 생성 → render → wav 반환
검증:
테스트: test_perform_with_preview (DiffSinger 모델 있을 때만)
게이트: 박씨 폰에서 preview wav 들으면 "아아" 들림
작업:
1. src/tools/audio.py patch (백서 §6.8)
2. post_process use_optimizer_v4=True 분기에서 optimizer.run_v4() 호출
3. fallback to sox
검증:
1. 기존 wav 1개에 broadcast preset 적용
2. score_gate 결과 비교 (전 vs 후)
테스트: test_post_process_optimizer_v4 — total 점수 상승
게이트: optimizer_v4 적용 후 LUFS -16 ± 1 dB 안착
목적: BBC SO 무음 회피 + RPP safe replace + RTrackTemplate 6종 정비.
작업:
1. scripts/reaper_play_record.ps1 작성 (백서 §6.10)
2. WM_COMMAND 1013/40042/1016 시퀀스
3. /c/Temp/Media/ 감시 + 파일 성장 멈춤 감지
검증 (박씨 직접 + Claude 모니터링):
1. 박씨 PC에서 mahler_bbcso_fixed.rpp 자동 로드
2. action 1013 자동 발사
3. 30~60초 후 stop
4. /c/Temp/Media/01-BBC...wav 생성 확인 (RMS > 0)
박씨 직접 단계: Day 10 첫 1시간 (REAPER GUI 보면서 자동화 검증)
게이트: BBC SO 1트랙 자동 렌더 + RMS > 0.01
작업:
1. ~/parksy-audio/templates/ 안에 5개 RPP 정비:
- vsco_orchestra.rpp (VSCO-2-CE 풀 오케)
- vsco_solo.rpp (단일 악기)
- ample_guitar.rpp (Ample Guitar)
- pianoteq.rpp (Pianoteq 9)
- mt_power_drum.rpp (드럼)
- default.rpp (Keyzone Piano fallback, 기존 펜딩)
2. 각 RPP 안에 Track 1 REC 1 0 5 0 0 0 0 0 (recmode=5 output) 명시
3. _safe_replace_midi_source + _safe_replace_record_path 검증
검증: 각 템플릿에 _instantiate_rpp() 적용 후 CLI -renderproject → wav 생성
게이트: 5개 RPP 전부 CLI 렌더 + RMS > 0.001
작업 (박씨 직접 REAPER에서):
1. VSCO Violin Section, VSCO Cello Solo, VSCO Flute Solo, Ample Guitar, Pianoteq, MT Drum 트랙 6개를 박씨가 REAPER에서 우클릭 → "Save tracks as track template"
2. parksy-audio/templates/tracks/*.RTrackTemplate 저장
박씨 직접 단계: Day 14 30분 (REAPER 클릭만)
게이트: 6개 .RTrackTemplate 파일 존재
작업:
1. Claude가 sea_mcp 통해 다음 입력 자동 생성:
- region_vec=[0.1, 0.9, 0.2, 0, 0] (아랍)
- text="수피 회전 같은 영적 트랙"
- project="bbcso"
2. 풀 파이프라인 실행 (Φ₅ 제외, Φ₁부터)
3. reaper_play_record.ps1 자동 호출
4. score_gate ≥ 70 통과
5. visual_render → mp4
6. publish_telegram → 박씨 폰
박씨 게이트: 폰에 BBC SO 첫 트랙 도착 + 영상 + 캡션 확인
작업:
1. region_vec=[0, 0, 0, 0.7, 0.3] (삼바+탱고)
2. project="vsco_orch"
3. CLI 렌더 라우트
4. 풀 파이프라인 → 폰
박씨 게이트: VSCO 첫 트랙 도착
목적: 박씨 신체 입력 (가창+EWI+오른손) → 폰 알림 풀 사이클.
작업:
1. tests/test_e2e_full.py 작성:
- 시뮬 입력으로 14 tool 전부 순차 호출
- test_e2e_full_pipeline — fusion → emotion → ... → publish 전 단계까지
2. publish는 dry-run 플래그 (실 전송 X)
게이트: 14 tool 호출 0 에러 (실 전송 제외)
작업 (박씨 직접):
1. Galaxy Tab S9 5G에서 SSH로 sea_mcp 호출
2. EWI MIDI USB 연결 (Tab 또는 PC)
3. 마이크 (USB) 연결
4. 키보드 (USB) 연결
5. merge_terminal 호출 (vox + EWI + rh 입력)
6. 풀 파이프라인 → 폰 알림
박씨 직접 단계: Day 18 1시간 (장비 연결 + 1분 가창 + 결과 대기)
게이트: 박씨 신체 입력으로 만든 첫 트랙 폰 수신
작업:
1. 박씨가 인정하는 "Parksy 시그니처 트랙" 1곡 만들기
2. score_gate ≥ 80 (만점 게이트)
3. dtslib/sea_archive에 git tag v0.3.0
4. gh release create v0.3.0 + 백서 + .md 첨부
게이트: 박씨 OK + GitHub Release 발행
| 위험 | 확률 | 영향 | 대응 | |||
| BBC SO Play+Record 자동화 PowerShell 좌표 실패 | 중 | 높 | 백서 §5 라우트 분기로 fallback (VSCO 우선 검증) | |||
|---|---|---|---|---|---|---|
| DiffSinger v1 출력 무성/잡음 | 중 | 중 | 백서 §13.5 알려진 한계, SoVITS v2ProPlus로 fallback | |||
| score_gate 70점 못 넘음 | 중 | 중 | 호출자 max 3회 재시도 + 임계값 60 임시 하향 | |||
| Galaxy Tab EWI USB 인식 실패 | 낮 | 높 | Day 18 박씨 직접 장비 검증 → 안 되면 Day 19 폰 마이크 + PC 키보드만 | |||
| .RTrackTemplate 동적 추가 시 GUID 충돌 | 낮 | 중 | Sprint 3 Day 14 박씨 직접 저장 + sea_mcp는 path 참조만 | |||
| parksy-audio 의존성 깨짐 | 낮 | 높 | `setup_paths()` + `HAS_*` 플래그로 graceful degrade | |||
| Vast.ai 비용 폭주 | 0 | — | v0.3 CPU only, GPU 0건 |
| 항목 | 비용 | 비고 | ||
| Vast.ai GPU | **$0** | v0.3 전부 CPU | ||
|---|---|---|---|---|
| Telegram | $0 | Bot API 무료 | ||
| GitHub | $0 | private repo 무료 한도 | ||
| Claude API 토큰 | (정기구독 내) | Sonnet 4.6 양산 + Opus 4.7 메타 | ||
| 박씨 시간 | 19일 × 1~3시간 = ~38시간 | 직접 단계 (Day 0/10/14/15/16/18/19) |
총 외부 과금: $0
| # | 항목 | 기준 | ||
| 1 | 단위 테스트 | 27/27 통과 | ||
|---|---|---|---|---|
| 2 | E2E 시뮬 | 14 tool 전부 0 에러 | ||
| 3 | BBC SO 트랙 | 폰 수신 (audio + video + caption) | ||
| 4 | VSCO 트랙 | 폰 수신 | ||
| 5 | DiffSinger preview | 폰 수신 + 박씨 청취 OK | ||
| 6 | 박씨 신체 입력 | EWI+가창+오른손 → 폰 수신 | ||
| 7 | Parksy Signature | score_gate ≥ 80 + 박씨 OK | ||
| 8 | GitHub Release | v0.3.0 태그 + 백서 첨부 |
8/8 통과 = 만점 (120점)
| Day | 날짜 | Sprint | 작업 | 박씨 직접? | ||||
| 0 | 2026-05-07 (수) | 부트스트랩 | 레포 + editable + .env + Claude Desktop | 30분 | ||||
|---|---|---|---|---|---|---|---|---|
| 1 | 05-08 (목) | S1 | adapter.py | — | ||||
| 2 | 05-09 (금) | S1 | tree_lookup + feature patch | — | ||||
| 3 | 05-10 (토) | S1 | motif + trance + midi patch | — | ||||
| 4 | 05-11 (일) | S1 | 14/14 통과 + 11 tool 등록 | — | ||||
| 5 | 05-12 (월) | S2 | integrations/parksy_audio.py | — | ||||
| 6 | 05-13 (화) | S2 | score_gate.py | — | ||||
| 7 | 05-14 (수) | S2 | visual.py | — | ||||
| 8 | 05-15 (목) | S2 | perform.py DiffSinger preview | 청취 5분 | ||||
| 9 | 05-16 (금) | S2 | audio.py optimizer_v4 | — | ||||
| 10 | 05-17 (토) | S3 | reaper_play_record.ps1 (1/2) | 1시간 (PC 앞) | ||||
| 11 | 05-18 (일) | S3 | reaper_play_record.ps1 (2/2) | — | ||||
| 12 | 05-19 (월) | S3 | RPP 5종 정비 (1/2) | — | ||||
| 13 | 05-20 (화) | S3 | RPP 5종 정비 (2/2) | — | ||||
| 14 | 05-21 (수) | S3 | RTrackTemplate 6종 저장 | 30분 (REAPER GUI) | ||||
| 15 | 05-22 (목) | S3 | BBC SO 1트랙 실 렌더 | 30분 | ||||
| 16 | 05-23 (금) | S3 | VSCO 1트랙 실 렌더 | — | ||||
| 17 | 05-24 (토) | S4 | E2E 통합 테스트 | — | ||||
| 18 | 05-25 (일) | S4 | Galaxy Tab 입력 → 첫 실수신 | 1시간 | ||||
| 19 | 05-26 (월) | S4 | Parksy Signature + v0.3.0 Release | 1시간 (가창 녹음) |
박씨 직접 시간 합산: 약 5.5시간 (19일 중 7일만, 평균 47분)
Claude 자동 처리: 나머지 12일 × 평균 4시간 = ~48시간 (백그라운드)
| 트리거 메시지 | Claude 동작 | |
| "Day 0 시작" 또는 "sea 부트스트랩" | 레포 생성 + editable install + .env 작성 + Claude Desktop 등록 | |
|---|---|---|
| "Sprint 1 시작" | Day 1 adapter.py 작성 → Day 4 14/14 통과까지 자동 | |
| "Sprint 2 시작" | Day 5~9 자동 | |
| "Sprint 3 시작" | reaper_play_record.ps1 + RPP 정비 (박씨 PC 앞 단계만 멈춤) | |
| "BBC SO 렌더 검증" | Day 15 실 렌더 → 폰 알림 | |
| "현재 상태" | Sprint별 진행률 + 미완료 게이트 + 다음 액션 | |
| "재시도 Day N" | 특정 Day만 재실행 |
| Sprint | 신규 파일 | 패치 파일 | 테스트 | 외부 검증 | ||||
| S0 (부트) | `.env`, `pyproject.toml`, `README.md` | — | — | Claude Desktop | ||||
|---|---|---|---|---|---|---|---|---|
| S1 | `adapter.py`, `motif.py`, `trance.py`, `tree_lookup.py` | `feature.py`, `midi.py`, `server.py` | 14 | pytest | ||||
| S2 | `integrations/parksy_audio.py`, `score_gate.py`, `visual.py` | `perform.py`, `audio.py` | 4 | parksy-audio 백엔드 | ||||
| S3 | `reaper_play_record.ps1`, RPP 5종, RTrackTemplate 6종 | `audio.py` 라우트 | 4 | 박씨 PC + 폰 | ||||
| S4 | `test_e2e_full.py`, GitHub Release | — | 5 | 박씨 신체 입력 |
합계: 신규 14 파일 + 패치 6 파일 + 테스트 27 + 통합 검증 + 박씨 OK 게이트
박씨가 들고 있는 자산만으로 만들 수 있는 첫 시그니처 트랙 시나리오:
타이틀: "Parksy Orchestra v0.3 — Suficircle"
장르: Trance (수피 회전)
박씨 입력:
vox: "아아—" 4초 (DiffSinger v1)
ewi: 호흡 페달 [0.3 → 0.9 → 0.6]
rh: Cm7 → G7 → Cm7 (3코드)
환경:
region: arab=0.9 (수피)
TPO: illum=0.3 social=0.2
파이프라인:
Φ₅ → fusion[11]
A → emotion=anticipation+trust
Φ₁ → latent[13]
trance=0.84 freq=7.4Hz skin=oud
Φ₂ → bpm=78 key=2 mode=minor
motif=bruckner_organ intervals=[0,7,12,7,0,-5,0]
Φ₃ → midi (note=20, humanized B grade)
Φ₄ → BBC SO Play+Record → optimizer_v4 → LUFS -16
score=83/100 ✅
Π → 1280×720 mp4 + audio
→ 박씨 폰 ✅
이 트랙이 박씨 폰에 도착 + 박씨 OK = v0.3.0 Release.
문서 끝
dtslib | parksy.kr | eae.kr | dtslib.com
사업자등록번호: 475-01-03493
SEA-MCP v0.3 Development Plan v1.0 — Parksy Mainframe Edition