# Dansori EQ

> **말로 빚는 소리.** 자연어 AI로 이어폰/헤드폰 EQ를 만들어 **Equalizer APO**에 적용하는 Windows 앱.
> 코드 식별자: **DansoriEQ** · 표시명: **Dansori EQ** · 경로: `C:\Users\ekeer\DansoriEQ`

---

## ⚡ 핸드오프 요약 (반드시 먼저 읽기)
이 프로젝트는 **설계 + 대량의 선(先)생성 코드**가 이미 존재한다. **"아직 코드 없음"이 아니다.**
이전(토의) 세션에서 핵심 사용자 여정과 부가기능 대부분을 **코드 레벨로 배선**해 두었고, 다만
**아직 한 번도 컴파일/실행되지 않았다.** 다음 단계는 **빌드 + 실환경 연동**이다.

- 앱은 APO/AI키 없이도 **미리보기 모드**로 파이프라인이 도는 구조다(생성 config를 파일로 기록).
- 남은 일은 대부분 **실제 빌드/실행 환경**이 있어야 진행된다(아래 "다음 세션 첫 작업").

## 먼저 읽을 순서
1. `README.md` — 개요·기능·빌드·구조
2. `docs/PREBUILT.md` — **선생성 파일 목록 + 교체/연결 지점**(가장 중요)
3. `docs/DEV_PLAN.md` — 마일스톤 M0~M15, 체크박스(`[x]`선구현 / `[ ]`남음)
4. `docs/SCENARIO.md` — 요구사항 + **핵심 사용자 여정**(§4.5)
5. `docs/ARCHITECTURE.md` — 스택·데이터흐름·DB/AI/APO/공유(.tweq) 스키마
6. `docs/TYPOGRAPHY.md` — 폰트 규칙(최소 12·최대 24, 가독성 우선)

## 다음 세션 첫 작업 (순서)
1. **솔루션·빌드·테스트**
   ```
   dotnet new sln -n DansoriEQ
   dotnet sln add src/DansoriEQ.Core/DansoriEQ.Core.csproj
   dotnet sln add src/DansoriEQ.App/DansoriEQ.App.csproj
   dotnet sln add tests/DansoriEQ.Core.Tests/DansoriEQ.Core.Tests.csproj
   dotnet restore ; dotnet build ; dotnet test
   ```
2. **컴파일 오류 수정** — 선생성 코드는 미검증. 특히 WPF 시그니처(`EqGraphControl`,
   Win32 P/Invoke), XAML, 패키지(WPF-UI/LiveCharts2는 아직 미추가) 확인.
3. **실환경 연동**
   - **APO**: 실제 config 쓰기 + 최초 1회 승격(Include+ACL). 지금은 미리보기(`NullApoWriter`).
   - **AI**: 실제 키로 프롬프트 루프 검증. provider/model은 `AppSettings`(AI 관리 화면)에서 선택됨.
   - **DB**: `DesignProfileDbService`(스텁) → `SqliteProfileDbService`로 교체 + 사이드바 바인딩.
4. **마감(M5/M6)**: WPF-UI(Fluent/Mica) 테마 + 테마전환, MVVM 바인딩, 헤더 버튼 정리, 패키징/아이콘.

## 핵심 교체/연결 지점 (dev)
- **DB**: `SqliteProfileDbService`(App/Profiles) — `Search()`=사이드바, `LoadEq(id)`=프로파일 base EQ,
  `UpdateAsync`=AutoEq zip 다운로드(무겁다 → curated 서브셋 권장).
- **AI**: `AiProviderFactory.Create(store)` 가 provider 생성. 프롬프트창(`MainWindow.SendPromptAsync`)은 이미 연결.
- **APO**: `ApoWriterFactory` 가 설치 감지 → 실제/미리보기 자동 선택.
- **크로스피드**: `ApoRenderer` 상단 메모대로 **저역통과+딜레이** 정식 구현 필요(현재 플레이스홀더).
- **DefaultDeviceSwitcher**: IPolicyConfig(**undocumented COM**) vtable 검증 필요.

## 절대 제약 (유지)
- 아름다운 모던 **Fluent GUI**(단순/텍스트 UI ✗, 웹앱 ✗) · **EQ 그래프** 포함
- **저권한**: 최초 1회만 승격, 이후 무승격
- 프로파일 목록 **IEM/헤드폰 분리** · 라이선스 배포불가 소스는 **배포 빌드 제외**(UI엔 병합 표시)
- **AutoEQ 베이스 + 귀로 AI 미세조정**(측정 마이크 없음) · **DAC/앰프는 EQ 대상 아님**
- **API 키는 런타임에 사용자 제공**(DPAPI 암호화 저장) · 초보자 친화 최우선

## 선구현 범위 (코드 레벨 완료, 미컴파일)
- **Core**: EQ 수학(RBJ)·모델·`ApoRenderer`(+이펙트)·`PreampCalculator`·프리셋(`.tweq`)·
  AI(`IAiEqProvider`·4개 provider·`EqDelta(+Effects)`·파서·프롬프트/스키마)·스위칭 규칙/평가·AutoEqParser
- **App 창**: MainWindow(그래프·**AI 프롬프트 실배선**·Undo/Reset·바이패스+프리셋전환 핫키·볼륨패널·가변40밴드)
  + Settings/DbManager/Effects/PresetLibrary/Command/ApoSetup/**AiManager**/**SwitchRules**/PresetInfo/도움말드로어
- **App 서비스**: Apo(추상화+미리보기+installer/setup), Ai(4 provider+factory+**계정모델조회**+**Ollama설치/모델pull**),
  Audio(NAudio 볼륨/**출력장치전환**·Windows볼륨 양방향 동기화), Switching(**앱+장치 감지→프리셋 자동전환**, 런타임 리로드),
  Profiles(**SQLite 실저장소**+AutoEq import + 디자인 스텁), Security(DPAPI), Input(전역 핫키)
- **테스트**: Filter 수학 / AutoEqParser / PresetSerializer / ApoRenderer 이펙트
- **AI 제어**: EQ + **이펙트(크로스피드/밸런스/베이스)를 자연어 한 문장으로** 동시 제어

## 범위 결정 사항
- **스피커 확장 제외**(측정 기반이 정석인데 그 트랙은 안 함).
- **로컬 AI = Ollama만**(무인 자동설치 확실). LM Studio/GPT4All 등은 `LocalRuntime.cs` 메모의 "추후 테스트 후보".
- 서라운드/리버브는 향후(M13). `.tweq` 확장자 유지.

## 컨텍스트 (왜 이 앱인가)
사용자는 하이엔드 오디오 보유자(iFi Pro iDSD/iCAN Signature, SMSL DO400 등). Luxsin X8의 "AI EQ"에
관심 → X8은 DAC/앰프가 기존 플래그십과 중복이라 비효율 → **X8의 AI EQ 경험만 소프트웨어로 재현**.
하드웨어 PEQ 역분석(FiiO K13)은 리스크로 폐기 → **Equalizer APO + AI(클라우드/로컬)** 조합으로 확정.

## ⚠️ 이 시점에서 남은 것은 대부분 실환경 의존
빌드·컴파일 검증 · APO 실적용 · AI 키/네트워크 · NAudio/Win32/winget/Ollama · SQLite/AutoEq 다운로드 ·
MVVM 바인딩 · Fluent 테마. **여기서부터는 개발 세션(실행 환경 필요)에서 진행한다.**
