# 從「它能唱」到「我希望 IA 在這一句唱出什麼?」 ## 把 VOCALOID MCP 從工程閉環推向創作意圖、樂理、可復盤決策與冷啟動作曲 - **階段日期:** 2026-07-18 ~ 2026-07-19 - **前篇:** [From a Blank Timeline to a Finished VOCALOID Song](from-blank-timeline-to-finished-vocaloid-song.md) - **主要聲庫:** IA、IA_ROCKS - **本階段增量:** 31 個本地 commits、125 個變更檔案、4 份完整 creative-record packages - **最終自動驗證:** 102 tests discovered,100 passed,2 intentional skips,0 failed - **最終人耳結論:** 工程流程成立;最新高 BPM 測試中 IA 被伴奏遮住,Rock 感仍然不足 - **English edition:** [From “Can It Sing?” to “What Should IA Sing in This Line?”](from-can-it-sing-to-what-should-ia-sing.en.md) --- ## 摘要 第一階段已經回答了一個很難的問題: > Agent 能不能從空白 timeline 開始,建立原生 VSQX,讓真正的 VOCALOID3 Editor 用指定聲庫唱出來,再完成伴奏、分軌、混音、mastering、QC 與 delivery? 答案是可以。 但當這條工程管線真的閉環後,下一個問題突然變得更難,也更有意思: > 不再問「它能不能唱」,而開始問——「我希望 IA 在這一句裡,究竟唱出什麼?」 第二階段就是沿著這句話展開的。 我們加入了 composition intent、phrase direction、deterministic music-theory analyzer、bounded repair proposals、fingerprint-bound exceptions、20–30 秒 audition ladder、creative decision journal、native tuning materialization、phrase-grammar DSL、voicebank identity probe、固定 intent-file prompt,以及真正的 fresh-agent cold-start 作曲測試。 我們也刻意沒有做一件看似誘人的事:把本地數百首 IA 曲目變成「下一個音該寫什麼」的 retrieval system。曲庫最後被限制在離線、人工審核、不可反向重建的 DSL 詞彙來源;production agent 看不到曲名、旋律、nearest neighbor、逐曲 feature 或 continuation hint。 最終,fresh agent 可以從單獨的 intent file 出發,完成: ```text 意圖 → 樂理/form/harmony → melody → Japanese note allocation → IA delivery → arrangement → original Editor render → mix / master / QC → creative record ``` 然而,最後一次 190 BPM IA_ROCKS 實驗也給了最重要的反證:所有 readiness gate 都通過,VSQX 有 287 顆音、42 個 native controls,WAV 沒 clipping、loudness 正常、hash 全部 current,但人耳仍然聽到兩個根本問題: 1. IA 被配樂蓋住了; 2. 音樂仍然偏平,沒有真正做出 Rock 的感覺。 所以這一階段最誠實的結論是: > Agent 可以成為相當不錯的 composer assistant、production engineer 和實驗夥伴;但「神曲」目前仍然沒有被工程化解決。 這不是失敗。恰恰相反,這代表系統終於有能力把「工程成功」與「音樂成功」分開說清楚。 --- ## 1. 第一階段留下了什麼 前篇完成的是一條非常具體的 native production pipeline: ```text empty manifest → canonical score state → VSQ3 / VSQ4 compiler → XSD + Yamaha native loader validation → original VOCALOID3 Editor render → isolated vocal/instrument stems → deterministic mix graph → loudness / peak / clipping analysis → mastered WAV + matching VSQX ``` 它已經解決: - 32-bit Windows legacy application 與 WSL/Node.js 之間的邊界; - VSQX 原生 note、lyric、phoneme、note style、vibrato、master control curves; - VOCALOID3 Editor 的 UI export automation; - 指定聲庫、fail-closed singer substitution; - multi-track song manifest、stable IDs、revision、three hashes; - accompaniment、vocal/instrument stems、effects、automation、mix、master; - artifact provenance、history、dry-run 與 delivery currentness。 換句話說,系統已經「會做歌」。 但是它不知道一首歌為什麼要這樣做。 如果沒有新的創作層,一個 agent 很容易得到以下局面: - melody 符合音域; - chord 沒有 schema error; - 日文 phoneme 合法; - WAV 非靜音; - LUFS、true peak、stereo balance 都漂亮; - 但每一句都像是在完成 checklist。 工程閉環越可靠,這個問題反而越明顯。 ## 2. 重新定義第二階段:意圖先於音符 第二階段的優先順序被寫成一個 lexicographic contract: 1. 保留使用者的 brief、歌詞含義與 song/section/phrase intent; 2. 讓 melody、harmony、rhythm、note allocation、IA delivery、arrangement 可追溯地服務 intent; 3. 維持 form、timeline、harmony、singability、voice leading 與 arrangement 的內部一致; 4. 必要時選擇 phrase-grammar vocabulary,讓句法角色與變化可明示; 5. 保存 authorship、artifact provenance 與不確定性。 這個順序很重要。 如果「樂理規則」排在 intent 前面,agent 會傾向把所有有張力的地方修平。 如果「IA style」排在 intent 前面,曲庫或 DSL 會逐漸變成模板。 如果「音訊 metrics」排在 listening 前面,系統會把 -16 LUFS 誤當成好聽。 因此,核心資料流變成: ```text user brief │ ▼ song intent │ ├── section transition │ └── 1–3 anchor phrase directions │ ▼ realization hypothesis │ ▼ theory / grammar / composition │ ▼ bounded audio audition │ ▼ keep / reject / revise by listening ``` ## 3. Composition intent 不是一個 emotion tag 新的 `vocaloid-composition-intent/v1` 分三層: | 層級 | 保存什麼 | 不保存什麼 | | --- | --- | --- | | Song | premise、point of view、central tension、start state、destination | 「悲傷=minor」之類 recipe | | Section | dramatic function、state before/transition/after | 自動 chord 或 melody | | Phrase direction | utterance purpose、semantic focus、delivery arc、listening question | per-note prose | Phrase direction 可以在任何 note、lyric unit、tuning gesture 或 arrangement track 之前建立。 這讓真正合理的順序成為可能: ```text 先寫:「這句話要讓什麼變得可聽見?」 再寫:「用什麼 melody / duration / harmony / delivery 實現?」 最後才把 stable IDs 綁回 intent。 ``` 這和「先生成一段旋律,再補一段理由」是兩件完全不同的事。 ### 3.1 Intent hash 為什麼不等於 composition hash Intent 進入 `content_hash`,但不進入 `composition_hash` 或 `mix_hash`。 原因是兩個問題必須分開: 1. 這個 WAV 是否仍然對應現在的 score? 2. 這個 WAV 是否仍然回答現在的藝術問題? 只改 intent,不應強迫重建 byte-identical audio;但先前的 intent-fidelity listening review 必須 stale。這正是 `intent_hash` 的用途。 ### 3.2 程式只能量測 realization,不能判定情感成功 Structured targets 只描述可以量測的東西,例如: - melody contour/range; - onset 或 note-duration trajectory; - harmonic tension direction; - DYN arch/valley; - arrangement density; - semantic focus 的 duration 與 beat placement。 它們不能把 prose emotion 轉成假科學。 「空、遠、透明」不是固定的音程表;「握緊劍柄」也不是固定的 DYN=94。 ## 4. Deterministic 樂理:guardrail,不是作曲家替身 `core/v1` symbolic analyzer 建立一次 read-only index,再分 domain 分析: - form; - timeline/meter/tempo; - key/harmony; - melody; - rhythm; - vocal/note allocation; - voice leading; - arrangement; - performance suitability。 它可以精確定位: - timeline contradiction; - chord coverage gap; - unresolved sustained non-chord tone; - unbalanced leap; - missing breath window; - mora/consonant timing budget; - unsuitable melisma phoneme; - compound-meter pattern conflict; - vocal minor-second collision; - voice crossing; - slash-bass conflict; - register crowding; - duplicated accompaniment role; - density/energy mismatch。 但它沒有「好聽」這個 rule code。 ### 4.1 三種 severity 必須誠實 | Severity | 意義 | 行為 | | --- | --- | --- | | `error` | symbolic state 自相矛盾、不可解讀 | 阻止 score/build;不可 exception | | `warning` | 具體 musical/performance risk | 可以 audition;release policy 可要求處理 | | `info` | composition/style observation | 不阻止 build/delivery | 所有 rule code、version、domain、allowed severity 與 structural status 都由單一 registry 擁有。Analyzer 不能臨時發明一個 code,也不能把 style preference 偽裝成 structural error。 ### 4.2 20,000-event 壓力測試不是炫技 長曲中最危險的 failure mode,不一定是錯判,而是 analyzer 對每顆 note 做平方級掃描,讓 agent 在 preflight 卡死。 因此 interval queries、register occupancy 和 cross-track sweeps 都有 bounded index。20,000-event fixture 必須在開發主機兩秒內完成,而且不能 mutation input manifest。 ### 4.3 Dry-run 必須走同一條真實路徑 Theory repair 不能用一套簡化預測,最後 build 再用另一套規則。 `vocaloid_edit_song` 的 dry-run 會: 1. 執行真正的 mutation path; 2. 產生 predicted manifest; 3. 比較 before/after theory issues; 4. 比較 metrics 與 intent evidence; 5. 報告 listening review 是否 stale; 6. 不寫 canonical file。 這樣 bounded proposal 才只是 hypothesis,而不是偷偷改歌。 ## 5. Repair proposal 與 exception 都不能越權 Theory proposal 最多提供 A/B/C 三個 bounded alternatives,並綁定: - current manifest revision; - composition hash; - source issue code; - exact issue fingerprint; - affected stable IDs; - predicted delta; - 原本 phrase listening question。 Agent 必須把 proposal 放進真正的 dry-run,再 inspect introduced/resolved issues,最後 audition 才能寫入。 Exception 也不是「忽略 warning」按鈕。它必須綁 exact object set 與 target fingerprint;只要 note、chord、section 或 rule evidence 改變,舊 exception 就 stale,並產生 structural error。 這個設計保留了兩件看似矛盾的事: - 不讓 agent 為了過測試而亂修音樂; - 不讓 agent 用自由文字永久壓掉真正的風險。 ## 6. 20–30 秒 anchor audition:先把一句做成立 一首三分鐘的歌,如果每次都 full render 才聽,feedback loop 太慢,而且很難知道是哪一層造成問題。 第二階段把第一個 creative closure 固定成一段 20–30 秒 anchor: 1. IA lead solo; 2. lead + harmony; 3. bass + drums + one harmonic instrument; 4. optional full layers; 5. timbre/mix refinement; 6. one-variable loudness-matched A/B。 每一層回答同一個 listening question。 例如: > 「握緊劍柄」是否只在一瞬間暴露了兩人的警覺,而沒有變成戲劇化決鬥? 如果 lead solo 就沒有這種感覺,加更多 string、reverb 或 limiter 不會救它。 如果 lead solo 正確、full mix 才出問題,root cause 才應該往 arrangement/mix 找。 ## 7. Creative journal:保存可復盤決策,不保存假裝精確的心靈讀取 Canonical manifest 保存「現在的歌是什麼」。Creative journal 保存「為什麼選這個版本,以及下一步該聽什麼」。 每份 delivered composition 必須覆蓋: ```text intent → form / meter-tempo / harmony / melody → Japanese note allocation → IA delivery → arrangement ``` 每個 bounded decision 記錄: - objective; - selected decision; - concise rationale; - alternatives 與 disposition; - expected audible effect; - actual result(如果已知); - affected stable IDs/artifacts/hash dependencies; - evidence; - next listening step。 Journal 是 append-only SHA-256 chain。後續 mutation 不刪除舊決策,而是根據 bound objects、artifacts 和 hashes 把它解析成 current、stale 或 superseded。 它刻意不保存 raw hidden chain-of-thought。公開 repository 需要的是可審計理由與證據,不是把 model 的內部 token stream 冒充創作檔案。 本階段四份 package 共保存 71 段 hash-chained decisions: | 作品 | Revision | Decisions | Voice | 狀態 | | --- | ---: | ---: | --- | --- | | `朝がほどく前に` | 41 | 11 | IA_ROCKS | 28 秒 intent-first demo | | `遠い灯、青い夜` | 52 | 13 | IA_ROCKS | 2:10 cold-start song | | `風は名を呼ばない` | 88 | 23 | original IA | 3:10 fresh-agent song | | `雨と蝉のあいだ` | 78 | 24 | IA_ROCKS | 64 秒、190 BPM stability test | 完整 package 位於 [`artifacts/creative-records/`](../artifacts/creative-records/README.md)。 ## 8. 「宣告 tuning」不等於 VSQX 裡真的有 tuning 一次非常有價值的檢查發現:manifest 中寫了 dynamics arc、opening arc、focus vibrato 與 final pitch fall,但發布的 VSQX 裡一度沒有對應 `mCtrl`、PIT/PBS 或 non-zero vibrato。 這暴露出四個不同 evidence level: ```text declared ≠ materialized ≠ rendered ≠ heard ``` - `declared`:gesture 存在於 canonical manifest; - `materialized`:compiler 真正產生 native note style/control points; - `rendered`:original Editor 產生 non-silent digest-bound stem; - `heard`:人或 agent 明確針對一個問題做 listening judgement。 於是 `apply_tuning` compiler 變成 build 前的必要 materialization step。只宣告 gesture 而沒有 compile,preflight 會用 `TUNING_GESTURE_NOT_MATERIALIZED` 阻止 build。 這個問題的趣味之處在於:即使當時沒有花俏曲線,歌曲仍然已經比以前成立。它主要依靠: - 歌詞; - melodic contour; - mora duration; - selective harmony; - silence; - restrained arrangement。 也就是 composition 本身,而不是 automation 裝飾。 ## 9. 本地 IA 曲庫:從「profile engine」退回「離線詞彙來源」 最初的計畫非常雄心勃勃:清點本地 IA 曲庫、去重、分 work/version、做 audio features、rhythm/harmony/form estimate、vocal performance estimate、aggregate profile、novelty audit。 本地只讀清點確實發現數百個音訊檔;計畫中的基線記錄了 424 個 FLAC,以及 archive、off-vocal、remix、duet、重複 encode 等 dataset 污染問題。 但很快就出現更根本的問題: > 我們是在幫 agent 增加作曲選擇,還是在讓它靠近 reference reconstruction? 如果 production agent 可以查: - 某首曲目的 melody contour; - nearest neighbor; - 下一顆音; - producer-specific range; - per-track feature; - reference chord timeline; - long F0 sequence; 那麼再漂亮的「aggregate」名稱,也可能逐漸變成 copy surface。 最後的決定是把 production aggregate comparison 整體退休。 ### 9.1 新的防火牆 Production agent 看不到: - corpus path; - source title/producer/work ID; - per-track features; - nearest example; - reference melody/chord/lyric; - continuation table; - post-composition percentile fit。 本地曲庫唯一保留的用途是:離線觀察到 DSL 缺少某種廣泛有用的 phrase choice 後,由 maintainer 抽象成 general musical vocabulary,再經 human review 和 versioning。 Production 最後只看到: ```text role / entry / contour / rhythm / motion / cadence / development / allocation / articulation / space ``` 而且看不到是哪首歌啟發了這個詞彙。 ## 10. Phrase grammar DSL:風格選項,不是模板旋律 `vocaloid-phrase-grammar/v1` 放在 intent 與 concrete notes 中間: ```text phrase purpose → grammar blueprint → agent-authored notes / rests / allocation → IA delivery → listening ``` 它提供的 dimensions 包括: - role:statement、answer、contrast、lift、release、hook; - entry:downbeat、pickup、delayed、offbeat; - contour:arch、valley、terraces、late peak、asymmetric wave; - rhythm:long/short contrast、syncopated ties、sparse breath、compound lilt; - motion:stepwise、repeated tone、leap recovery、chord outline、modal pivot; - cadence:closed、open、suspended、deceptive、plagal、breath cut; - development:repeat、fragment、augmentation、displacement、inversion; - allocation:syllabic、focus melisma、held vowel、consonant pickup; - articulation:legato、connected accent、detached、delayed vibrato; - space:semantic breath、caesura、tail rest、interruption。 Bundle 例如 `ia.transparent-longline`、`ia.rocks-forward`、`night.sparse-distance` 只是 unordered option pool。 每個 bundle 都必須宣告: ```text melody_material = absent ``` DSL 裡沒有: - pitch sequence; - scale-degree sequence; - onset/duration sequence; - compile-to-melody function; - continuation table。 Agent 仍必須根據當前 intent、lyrics prosody、harmony 與 form 寫出最後的音。 ## 11. 一張截圖讓問題變得不可迴避 `遠い灯、青い夜` 的 VSQX 打開後,旋律視覺上呈現非常明顯的: ```text 上揚 → 下降 → 上揚 → 下降 → 再來一次 ``` ![早期 cold-start melody 中過度集中的 rise/fall contour](../docs/assets/formulaic-rise-fall-contour.png) 量測也支持這個直覺: - 20 個 lead phrases 全部從同一 beat 位置進入; - 97.9% 可比較 motion 是 1–3 semitone step; - core theory 已經報告 77.9% repeated interval trigrams; - 13/20 phrases 把最高音放在 late third; - 最大 normalized contour cluster 是 9/20。 我們沒有讓 analyzer 自動 randomize notes。 相反地,它只回報: - `PHRASE_ENTRY_HOMOGENEITY`; - `PHRASE_MOTION_OVERCONCENTRATED`; - `PHRASE_PEAK_POSITION_CONCENTRATED`。 然後要求 agent 保持 phrase intent,提出 bounded alternative,再 audition。 這是 DSL 真正的定位:讓 agent 看見自己反覆使用了同一種句法,而不是提供另一套模板取代它。 ## 12. Mastering A/B:不要讓 louder 冒充 better 同一首 `遠い灯、青い夜` 的另一個人耳反饋是 IA 有尖銳、分離、近似雜音的 texture。 乾 lead、lead+harmony anchor 都乾淨,因此最初「IA_ROCKS 本身有問題」的假設被否證。 Layer ablation 得到: | Layer | LUFS | LRA | True peak | | --- | ---: | ---: | ---: | | processed vocal only | -33.4 | 7.2 | -17.6 dBFS | | minimal band | -33.4 | 7.2 | -17.6 dBFS | | full premaster | -33.4 | 7.2 | -17.6 dBFS | | final delivery | -15.5 | 5.8 | -1.5 dBFS | Spectral band ratios 幾乎不變,但 final delivery 約大了 18 dB,LRA 也被壓低。 因此我們做 equal-loudness A/B,而不是直接改 IA、EQ、note gate 或 arrangement。 人耳結果是:mastering B 的確稍微多一點那種 texture,但只有直接對比時明顯,整體仍可接受。於是決策是 keep current delivery,不做 global overfit。 框架只新增透明度 metrics: - requested loudness gain; - peak-safe gain; - reaching target 所需 peak reduction; - source/output LRA delta; - transparency-review recommendation。 這是一次很典型的「局部問題不能拆東牆補西牆」修法。 ## 13. Voicebank investigation:看得到檔案,不等於 Editor 真的能唱 本機 VVD scanner 一度列出 IA 與 IA_ROCKS,但 Editor 只顯示 IA_ROCKS。 調查區分了三層: 1. VVD/DDI/DDB file discovery; 2. 32-bit VOICE3 registration marker presence; 3. original Editor 的實際 isolated render。 IA 最初的 activation-time marker 是全零;後來 legitimate registration state 改變,IA 出現在 Editor。Repository 沒有複製 token、呼叫 activation crack 或繞過 license。 更有趣的是:舊 readiness cache 曾把 IA 與 IA_ROCKS 都標成 verified,但兩個 probe WAV 的 SHA-256 完全相同。 Non-silent 只證明「有東西唱了」,不證明「是你要求的 singer」。 新的 identity guard 因此會拒絕同一 host 上不同 component 的 exact digest collision。最終兩個 voicebank 分別通過 original Editor probe,且 digest 不同。 ## 14. Fresh-agent test 之一:`風は名を呼ばない` 為了測框架是否真的可轉移,我們啟動全新的 `gpt-5.6-sol`、`xhigh` session,只給它這個意圖: > 兩個俠客,分隔數十年,再次重逢,在懸崖峭壁上擦肩而過。沒有寒暄,沒有停留。各自握緊腰間的劍,相忘於江湖。 它不得讀本地 IA 曲庫、舊歌 manifest/artifact、先前 cold-start output 或既有 compose scripts。 它最後完成 `風は名を呼ばない`: - original IA; - 3:09.943; - 68 measures; - 12 tempo events; - 一次 2/4 subtraction; - 36 vocal phrases; - 433 vocal events; - 5 arrangement tracks; - 23 hash-chained decisions。 最重要的創作選擇是:IA 不是任何一名俠客,而是沒有名字的山風。最大 melodic departure 留給「柄を握り」,兩人擦肩後少掉一個預期 half-bar。 這證明新的 agent 能掌握: ```text intent → theory → note allocation → IA delivery → arrangement ``` 但它也寫出約 164 KiB 的 bespoke runner,並暴露: - MCP client timeout 短於 Editor render; - dead Editor lease; - Save As filename automation 間歇失敗; - journal retry 不夠 idempotent; - phrase-entry analyzer 忽略 leading rests; - endpoint-only intent trend 無法描述 local crest; - warning volume 太大; - report/publish rerun 不夠順; - raw stems gain 差距很大。 這些不是 paper design,而是三分鐘真歌把 framework 撞出來的缺陷。 ## 15. 把一次成功變成下一個 session 可以重現的流程 接著我們把 song-specific orchestration 抽成: - 固定 agent prompt:[`prompts/vocaloid-composition-agent.md`](../prompts/vocaloid-composition-agent.md); - strict intent schema:`vocaloid-composition-brief/v1`; - 每首歌一份 `intents/*.intent.json`; - MCP prompt:`vocaloid_compose_from_intent`; - CLI renderer:`npm run compose:prompt`; - shared production client:`scripts/lib/production-mcp.mjs`。 Intent file 明確保存: - scene/emotional color/dramatic motion/perspective; - one listener question; - target duration range; - BPM min/max/preferred; - exact voice component ID; - genre/style tags; - arrangement hints; - must-avoid constraints; - corpus/prior artifact/reference boundaries; - fresh-session 與 issue-recording requirements。 固定 prompt 不再把曲意混進 workflow。換一首歌只換 intent file,agent 仍使用同一組安全、evidence 與 audition contract。 ## 16. Fresh-agent test 之二:190 BPM 的 `雨と蝉のあいだ` 最後的 transfer test 使用: ```json { "intent": "夏夜,雨,蟬鳴", "voice": "IA_ROCKS", "genre": "rock", "tempo_bpm": { "min": 180, "max": 200, "preferred": 190 }, "target_duration_seconds": { "min": 50, "max": 70 } } ``` 新的 `gpt-5.6-sol`/`xhigh` session 只拿到 fixed prompt 和 validated intent。它完成: - title:`雨と蝉のあいだ`; - 190 BPM; - 48 bars; - 64.399683 seconds; - D Dorian/minor field; - IA_ROCKS lead 241 notes; - IA_ROCKS harmony 46 notes; - 5 accompaniment roles; - 24 creative decisions; - schema-valid VSQ3; - 18 DYN、15 BRI、4 PIT、2 PBS、3 CLE; - 3 顆 non-zero native vibrato notes; - -16.3 LUFS、-1.2 dBTP、zero clipped samples。 ![48-bar arrangement map and the split between engineering and listening](../docs/assets/ame-semi-no-aida-arrangement-map.svg) ### 16.1 高 BPM 沒有把 pipeline 撞壞 Intent schema 驗證 preferred BPM 必須落在 min/max 內。Agent 選了 190,並透過 density change 與 half-time perception 避免全曲變成連續 subdivision flood。 Editor export、stem alignment、mix、master、creative package 與 final current-artifact preflight 都完成。 從 stability 角度,測試成功。 ### 16.2 新 session 仍然會猜錯 response shape Run code 兩次在 canonical mutation 已成功後拋 exception: - 猜測 `preview.diff.totalChanges`; - 猜測 `predicted_revision`。 修法不是把這兩個 field 寫進 prompt,而是讓 shared client 統一 normalize: ```text before preview applied summary { sourceRevision, predictedRevision, appliedRevision, totalChanges, compositionHash, mixHash, contentHash } ``` 它同時拒絕 dry-run/apply revision drift、change-count drift 與缺失的 integer fields。 ### 16.3 D Dorian 被錯當 major leading tone Theory analyzer 一度把 D Dorian 的 C natural 全部當成「導音未解決」,產生 17 個 false warnings。 Root cause 是程式無條件把 scale degree 7 命名為 leading tone。 修法是先檢查它是否真的位於 tonic 下方一個 semitone。Dorian、Mixolydian、Aeolian 的 whole-tone subtonic 不應承擔 major-key leading-tone resolution duty。 修正後,未改動歌曲的 17 個 false warnings 全部消失。 ### 16.4 Whole-track mean 會把 sparse harmony 上下關係顛倒 Lead verse 的低音會拉低全曲 mean;harmony 只在 chorus 出現。用 whole-track mean 判斷 upper/lower voice,會把 simultaneous relationship 顛倒並製造 46 個 crossing warnings。 修法改成 overlap-duration-weighted mean,只用真正同時發聲的 material 推斷聲部角色。 Regression fixture 也被迫修正:舊測試原來靠非重疊音符製造「假 crossing」,新 fixture 必須真的在同一時刻 crossing。 ### 16.5 F0 tracker 抓到第二泛音 五個 MIDI-67 windows 被報成約 +1,166 ~ +1,197 cents。Native VSQX note number 正確,within-event 和 neighbor evidence 也指向 392 Hz;tracker 卻抓到約 768–783 Hz。 我們沒有把所有接近 octave 的結果強制折回 expected note。那樣會掩蓋真正錯八度的 render。 這個 limitation 被保留為 open:未來需要同時評估 subharmonic spectral support、periodic confidence 與 temporal continuity。 ## 17. 真實 WAV 能畫出很多東西,但畫不出「Rock 成不成立」 最終 WAV 的 stereo waveform: ![雨と蝉のあいだ stereo waveform](../docs/assets/ame-semi-no-aida-waveform.png) Log-frequency spectrogram: ![雨と蝉のあいだ spectrogram](../docs/assets/ame-semi-no-aida-spectrogram.jpg) 這些圖可以幫我們看: - section density; - channel activity; - transient repetition; - broad spectral occupation; - mastering 後的 overall envelope。 它們不能直接回答: - IA 是否站在 mix 前面; - guitar 是否真的有 physical attack; - drum groove 是否有推進感; - chorus 是否爆開; - 這首歌是否「像 Rock」; - listener 是否被一句話擊中。 Spectrogram 不是 genre oracle,LUFS 也不是 emotion meter。 ## 18. 最後的人耳 feedback:最重要的兩個紅字 在所有 technical gates 通過後,使用者對 `雨と蝉のあいだ` 的最終回饋是: 1. IA 的聲音被配樂蓋完了; 2. 整體還是比較平淡,沒有做出 Rock 的感覺。 這次依照要求不再修改歌曲。 這個結果值得被完整保留,因為它揭示了目前最重要的 gap。 ### 18.1 「IA 被蓋住」不是 mastering pass 就能避免 Final WAV 可以同時滿足: - integrated loudness target; - true-peak ceiling; - zero clipped samples; - stereo balance; - current artifact hashes; 但 vocal masking 仍可能存在。 現有 mix diagnostics 更擅長抓 absolute loudness、peak、broad balance 和 structural overlap;它還不擅長保證 vocal presence、consonant intelligibility、midrange ownership 和 section-by-section foreground hierarchy。 更好的下一步不是自動把 vocal 加 6 dB,而是: - section-aware vocal-to-band loudness ratio; - consonant-band masking observation; - vocal-present/vocal-muted delta; - arrangement slot declaration; - anchor listening 中明確問「IA 是否仍在前景?」; - 人耳選擇 gain/EQ/arrangement subtraction,而非 metrics 自動 mutation。 ### 18.2 「190 BPM + guitar + drums」不等於 Rock 目前 DSL 可以讓 agent 選 `ia.rocks-forward`、syncopation、power-chord register、drum drive、half-time perception。 但真正的 Rock 感往往來自更細的 interaction: - kick/bass/guitar attack 的 microtiming; - drum fill 與 section handoff; - guitar articulation、mute、strum direction、amp behavior; - bass 對 groove 的推拉,而非只跟 root/fifth; - vocal phrase 對 backbeat 的抵抗; - verse 與 chorus 的 physical contrast; - performance imperfection; - sound design 與 musician-like phrasing。 本專案使用的 GM SoundFont 是 deterministic draft backend。它可以驗證 arrangement event、routing 和 mix pipeline,卻不是一支有手感的 Rock band。 這是一個 renderer 與 composition 共同的限制,不能只靠 prompt 補上。 ## 19. 這一階段真正證明了什麼 ### 19.1 已證明 - Intent 可以成為 canonical state,而不是一次性 prompt; - Fresh agent 能遵循 intent-first workflow; - 樂理檢查可以 deterministic、bounded、non-mutating; - Theory proposal 可以保持 phrase question,而不篡改創作目的; - Warning、exception、listening gate 可以分離; - Japanese note allocation 可以被完整記錄; - Tuning intent 可以被 compiler materialize 為 native VSQX controls; - Creative decisions 可以形成 hash chain 並跨 revision 解析 freshness; - Phrase grammar 可以增加 vocabulary 而不提供模板音符; - Local IA corpus 可以被隔離在 production runtime 之外; - IA 與 IA_ROCKS 可以用 real Editor + distinct digest 驗證 identity; - Fresh session 可以生成完整 original song、VSQX、WAV、stems、A/B 與 record; - BPM range 180–200 的 strict intent 可以穩定完成 190 BPM delivery; - 真實歌曲能有效暴露 API、analyzer、retry 和 UI automation 缺陷。 ### 19.2 未證明 - Agent 能穩定寫出好旋律; - Phrase grammar 能保證不平淡; - Theory clean 代表 emotional success; - Native controls 多代表更自然; - LUFS/LRA/spectral metrics 能判定 mix 好聽; - IA-style vocabulary 能產生「IA 神曲」; - GM accompaniment 可以提供可信的 Rock performance; - Fresh agent 在不同 intent 上都能保持同樣品質; - 一首通過所有 gate 的作品值得 release。 ## 20. 為什麼「神曲沒有被工程化」是一個健康的結論 如果這個專案最後聲稱: ```text intent schema + theory rules + phrase DSL + metrics = good song ``` 那它反而失敗了。 因為它會把 taste、surprise、timing、performance、文化語境和 listener response 壓縮成一組可以刷分的 feature。 目前更合理的分工是: | Agent 擅長 | Framework 擅長 | 人仍然不可替代 | | --- | --- | --- | | 提出多個 realization | 保存 state 與 provenance | 聽出「就是不對」 | | 快速改 form/melody/allocation | 防止 corruption/stale artifact | 判斷情感與風格是否成立 | | 生成 arrangement hypotheses | 建立 bounded A/B | 選擇值得留下的版本 | | 記錄理由與 alternatives | 量測、驗證、重跑 | 決定何時停止 | | 從真實 failure 學習 workflow | 把 failure 變 regression | 對作品負責 | 因此,Agent 已經很適合成為: - composer assistant; - production engineer; - experiment operator; - obsessive documentation partner; - 一個不怕做第十七次 A/B 的隊友。 但它還不是「按一下就出神曲」的機器。 ## 21. Repository 最後保存什麼 公開 repository 不會追蹤巨大的本地音訊工作區。 | 路徑 | Git policy | 原因 | | --- | --- | --- | | `artifacts/songs/` | local-only | final WAV 大、可能涉及發布/授權選擇 | | `artifacts/evals/` | local-only | stems、A/B、debug exports、agent traces | | `build/` | local-only | canonical working state、cache、temporary renders | | `artifacts/creative-records/` | tracked | manifest snapshot、journal、report、digest index | | `artifacts/vsqxs/` | tracked | native project evidence,不內嵌 voicebank 或 final WAV | | `notes/` | tracked | contracts、failure logs、evaluation evidence | | `blogs/` | tracked | 可閱讀的工程與創作回顧 | VSQX 會保存 backing path reference,但不內嵌 WAV。Creative-record index 會保存 final deliverable digest,但不複製大型媒體。 這讓 repository 保留可審計的創作與工程證據,同時不把 2.6 GB local experiments 變成 Git history。 --- ## 結論 第一階段把「從空白 timeline 到 native rendered song」做成了一條可靠工程管線。 第二階段則把問題往前推了一步: ```text 不是只問:它能不能唱? 而是先問:我希望 IA 在這一句裡唱出什麼? ``` 我們建立了 intent、theory、phrase grammar、note allocation、delivery、audition、journal 和 fresh-session transfer。Agent 已經能把模糊的場景寫成一份可檢查、可修改、可渲染、可復盤的完整作品。 然後人耳仍然可以在最後說: ```text IA 被蓋住了。 Rock 感沒有出來。 ``` 而系統不會拿 100 個 passed tests 反駁你。 這或許才是第二階段最重要的成果:我們不只讓 agent 會做歌,也讓整個系統開始有能力誠實面對「歌做完了,但還沒有成為好歌」這件事。 > 這次已經證明:Agent 可以成為相當不錯的 composer assistant、production engineer 和實驗夥伴;但「神曲」目前仍然沒有被工程化解決。