최종 업데이트: 2026-02-07
레포: https://github.com/dtslib1979/parksy-audio (Private)
부모: dtslib-papyrus (Tier 2, inherit: strict)
AIVA 워크플로우용 통합 오디오 도구 (Capture/Trim/Convert/Batch)
Parksy Mini-DAW: One-Cycle Audio Production System
CUT → MIDI → RENDER 통합 파이프라인. 실시간 DAW 완전 배제.
| 항목 | 정의 | |
| 목적 | 기존 오디오에서 구간 컷 → MIDI 근사 변환 → 상용 음원 엔진으로 고음질 WAV 생산 | |
|---|---|---|
| 포지션 | 연출용 음원 생산 파이프라인 (작곡 툴 ❌, 실시간 DAW ❌) | |
| 핵심 철학 | 사이클은 하나. 한 번 돌리면 결과가 나온다 | |
| 품질 목표 | 전공자 5% 제외, 95% 통과 |
| 항목 | 값 | |
| 기본 브랜치 | main | |
|---|---|---|
| 생성일 | 2025-12-21 | |
| 공개 여부 | Private | |
| 감사 점수 | 72/100 (B+) | |
| 최신 커밋 | `a9fdb8e` (2026-02-07) |
[PWA (GitHub Pages)] ← Phase 2
|
| HTTP (Local / VPN)
v
[Local Agent (Python, PC)] ← Phase 1 (NOW)
|
|-- ffmpeg (Audio Cut)
|-- basic-pitch (WAV → MIDI)
|-- MIDI Clean / Merge ← Phase 2
|-- Render Engine ← 스텁 완료
| ├── Pianoteq (CLI) ← Phase 1: 피아노/재즈/보사
| ├── BBC SO Discover + REAPER (CLI) ← Phase 2~3: 오케스트라/스트링
| └── FluidSynth (dev/테스트)
v
[Output WAV 48kHz / 24bit]
|
v
[FFmpeg 그라데이션 MP4] ← Phase 2
|
v
[YouTube Upload] ← Phase 2
MIDI 출처가 달라도 파이프라인은 동일.
Track A (Extract): WAV → basic-pitch → MIDI (근사치 60~75점)
Track B (Curated): 구매/선별 퍼블릭도메인 MIDI (85~95점)
↓
clean_midi.py
↓
render (Kontakt / Pianoteq)
↓
WAV 48kHz / 24bit
| 엔진 | 용도 | CLI 렌더 | Phase | 비용 | ||||
| **Pianoteq** | 피아노/재즈/보사 | ✅ `--midi --wav` | 1 (지금) | 보유 중 | ||||
|---|---|---|---|---|---|---|---|---|
| **BBC SO Discover + REAPER** | 오케스트라/스트링/추모/다큐 | ✅ `reaper -renderproject` | 2~3 | 둘 다 무료 | ||||
| FluidSynth | 개발/테스트 전용 | ✅ `-F output.wav` | - | 무료 |
BBC SO Discover는 VST 플러그인이라 단독 CLI 렌더 불가.
REAPER가 VST 호스트 + CLI 배치 렌더 역할을 한다.
Pianoteq는 CLI 네이티브 지원이라 REAPER 없이 바로 동작.
| 장르 | 엔진 | 라이브러리 | ||
| 피아노 솔로 | Pianoteq | 내장 | ||
|---|---|---|---|---|
| 재즈/보사 | Pianoteq | 내장 | ||
| 오케스트라 | REAPER + BBC SO | Discover (무료) | ||
| 추모/다큐 BGM | REAPER + BBC SO | Discover (무료) | ||
| 뉴에이지/앰비언트 | REAPER + BBC SO | 스트링 패드 |
BBC SO Discover (무료, 지금)
↓ (MIDI/코드 변경 없이 교체)
BBC SO Core ($449)
↓
BBC SO Pro ($949)
지금 작업 = 미래 자산. 업그레이드 시 렌더만 다시 돌리면 끝.
parksy-audio/
├── .github/workflows/
│ ├── build-apk.yml # APK 빌드 자동화
│ ├── deploy-pages.yml # GitHub Pages 배포
│ └── update-manifest.yml # 에셋 매니페스트 자동 갱신
│
├── 00_TRUTH/
│ ├── _inherit.json # 상속 (parent: dtslib-papyrus)
│ └── index.md
│
├── local-agent/ # ★★★ Mini-DAW 핵심 (NEW)
│ ├── server.py # FastAPI 6 endpoints
│ ├── audio_cut.py # ffmpeg CUT (기존 cli.py에서 이관)
│ ├── extract_midi.py # basic-pitch WAV→MIDI (이관)
│ ├── render.py # Pianoteq/FluidSynth 오프라인 렌더 (NEW)
│ ├── config.py # 경로/설정 통합
│ ├── requirements.txt # fastapi, uvicorn, basic-pitch, mido
│ ├── README.md # PC 실행 가이드
│ └── .gitignore # sources/, outputs/, .venv/ 제외
│
├── app/ # Flutter 앱 (v1.0 레거시)
│ └── (Android/iOS/Web/Desktop)
│
├── assets/
│ └── manifest.json # OrbitPrompt 연동 에셋
│
├── docs/ # GitHub Pages
│ ├── index.html # 퍼블릭 랜딩
│ ├── office/index.html # Secret Office (PIN: 1126)
│ ├── releases/ # APK 배포
│ ├── DEV_STATUS.md # 이 문서
│ ├── AUDIT_REPORT.md
│ └── MANUAL.md
│
├── local-engine/ # v1.0 레거시 CLI (리팩 원본)
│ └── parksy_audio/cli.py # → local-agent/로 이관 완료
│
├── server/ # v1.0 레거시 Cloud Run API (리팩 원본)
│ └── app/main.py # → local-agent/server.py로 이관 완료
│
├── releases/ # 에셋 릴리스 (bgm/sfx — 비어있음)
├── scripts/update-manifest.js # 매니페스트 자동 갱신
├── test-samples/ # MIDI/MP3 테스트 샘플
├── CLAUDE.md
└── README.md
| Method | Path | 설명 | 상태 | |||
| GET | `/health` | 서버 생존 확인 | ✅ | |||
|---|---|---|---|---|---|---|
| GET | `/status` | ffmpeg/basic-pitch/pianoteq/fluidsynth 사용 가능 여부 | ✅ | |||
| GET | `/files?dir=` | 소스 폴더 오디오 파일 목록 | ✅ | |||
| POST | `/cut` | ffmpeg로 구간 잘라 WAV 생성 | ✅ | |||
| POST | `/extract-midi` | basic-pitch로 MIDI 변환 | ✅ | |||
| POST | `/render` | Pianoteq/FluidSynth 오프라인 렌더 → WAV | ✅ |
cd parksy-audio/local-agent
python -m venv .venv && .venv\Scripts\activate
pip install -r requirements.txt
uvicorn server:app --host 0.0.0.0 --port 8787 --reload
# 1. CUT
curl -X POST http://localhost:8787/cut \
-H "Content-Type: application/json" \
-d '{"input_path": "C:/Music/source.wav", "ss": "00:12:30", "to": "00:15:10"}'
# 2. MIDI 추출
curl -X POST http://localhost:8787/extract-midi \
-H "Content-Type: application/json" \
-d '{"clip_path": "outputs/clips/.wav"}'
# 3. RENDER (Cubase 안 켠다)
curl -X POST http://localhost:8787/render \
-H "Content-Type: application/json" \
-d '{"midi_path": "outputs/midi/.mid"}'
| 기존 위치 | 새 위치 | 내용 | ||
| `server/app/main.py` | `local-agent/server.py` | FastAPI 서버 (CORS, 라우팅) | ||
|---|---|---|---|---|
| `local-engine/cli.py` → `trim()`, `run_ffmpeg()` | `local-agent/audio_cut.py` | ffmpeg 컷/트림 | ||
| `local-engine/cli.py` → `convert()` + `server/main.py` | `local-agent/extract_midi.py` | basic-pitch 변환 | ||
| (신규) | `local-agent/render.py` | Pianoteq/FluidSynth 오프라인 렌더 | ||
| (신규) | `local-agent/config.py` | 경로/설정 통합 |
`local-engine/`과 `server/`는 아직 삭제하지 않음. PC 검증 후 정리 예정.
[Image: Film Mood Still]
🎼 Title: [곡명]
🎧 Use: Documentary / Memorial / Background Music
⏱ Length: 2-3 minutes
This music is rendered from public-domain material
and performed using professional virtual instruments.
Master recording by Parksy.
#backgroundmusic #classical #instrumental
| 해시 | 날짜 | 메시지 | ||
| `a9fdb8e` | 2026-02-07 | feat: render.py 스텁 + /render 엔드포인트 추가 | ||
|---|---|---|---|---|
| `d7496b1` | 2026-02-07 | feat: Mini-DAW Phase 1 — local-agent (CUT → MIDI pipeline) | ||
| `d81179a` | 2026-02-07 | docs: Add development status report | ||
| `1a2c8e3` | 2026-01-26 | feat: 00_TRUTH 폴더 추가 | ||
| `7ed5f95` | 2026-01-25 | chore: auto-update asset manifest | ||
| `aa3ab8f` | 2026-01-25 | feat: add manifest auto-update system | ||
| `13d6d87` | 2026-01-19 | feat: Complete production release with working MIDI API | ||
| `53e7777` | 2026-01-19 | feat: Add complete Flutter app with APK build |
| 항목 | 상태 | 비고 | ||
| FastAPI 서버 (server.py) | ✅ 코드 완료 | 6 endpoints | ||
|---|---|---|---|---|
| ffmpeg 컷 (audio_cut.py) | ✅ 코드 완료 | Termux 문법 검증 통과 | ||
| MIDI 추출 (extract_midi.py) | ✅ 코드 완료 | basic-pitch (PC에서 검증 필요) | ||
| 렌더 스텁 (render.py) | ✅ 코드 완료 | Pianoteq CLI + FluidSynth 폴백 | ||
| config.py | ✅ 코드 완료 | 경로/설정 통합 | ||
| **PC 실행 검증** | ⬜ 대기 | **다음 액션: 이것만 하면 Phase 1 끝** |
| 항목 | 상태 | 비고 | ||
| BBC SO Discover 설치 (무료) | ⬜ | Spitfire Audio App → 라이선스 활성화 | ||
|---|---|---|---|---|
| REAPER 설치 + CLI 렌더 세팅 | ⬜ | BBC SO를 VST로 로드, 배치 렌더 | ||
| render.py에 REAPER 엔진 추가 | ⬜ | `reaper -renderproject` 방식 | ||
| clean_midi.py (노이즈 제거/휴머나이징) | ⬜ | |||
| merge_midi.py (트랙 병합) | ⬜ | |||
| FFmpeg 그라데이션 MP4 자동 생성 | ⬜ | |||
| CUT PWA UI (파형 뷰어) | ⬜ | |||
| MIDI 최소 편집 PWA UI | ⬜ | |||
| YouTube 업로드 자동화 | ⬜ |
| 항목 | 상태 | 비고 | ||
| 장르별 REAPER 프로젝트 템플릿 | ⬜ | 클래식/추모/다큐/뉴에이지 | ||
|---|---|---|---|---|
| BBC SO Core/Pro 업그레이드 (유료) | ⬜ | 돈 생기면. MIDI/코드 변경 없이 교체 가능 | ||
| 배치 렌더링 (여러 MIDI 한 번에) | ⬜ |
| 영역 | 상태 | 비고 | ||
| Flutter 앱 (app/) | ✅ 완료 | APK v1.0.0 배포 완료 | ||
|---|---|---|---|---|
| GitHub Pages (docs/) | ✅ 완료 | 랜딩 + Secret Office | ||
| Cloud Run API (server/) | ✅ 완료 | → local-agent로 이관 완료 | ||
| Local Engine (local-engine/) | ✅ 완료 | → local-agent로 이관 완료 | ||
| CI/CD | ✅ 완료 | 3개 워크플로우 | ||
| 에셋 매니페스트 | ✅ 구조 완료 | 실제 에셋 0건 | ||
| 00_TRUTH 상속 | ✅ 완료 | dtslib-papyrus 연결 |
"지금 구조는 도구를 이긴 게 아니라, 도구를 무력화한 설계다."
PC에서 local-agent/ 풀사이클 검증:
1. uvicorn server:app --port 8787 → 서버 기동
2. GET /status → ffmpeg=true 확인
3. POST /cut → clip.wav 생성
4. POST /extract-midi → .mid 생성
5. POST /render → .wav 생성
이것만 통과하면 Phase 1 종료.