A workshop for original music原創音樂的工作室 · nothing here claims more than it measured這裡沒有任何一句話大於它量到的東西
A composition plan is the asset.
An audio file is one render of it.
composition plan 才是資產。
音檔只是它的一次 render。
Every music model says, in its own documentation, that the same input may not give the same output. So the artefact worth keeping is not the audio — it is the sectioned, styled, diffable text a person actually decides about. Two renders of one plan are two assets, not a contradiction. 每一個音樂模型都在自己的文件裡寫著:同樣的輸入不保證同樣的輸出。所以值得留下來的不是音檔,而是那份分段、帶風格、可以 diff、真的有人拿來爭論的文字。同一份 plan 產兩次就是兩個資產,不是矛盾。
One plan, three renders, one time axis一份計畫、三次 render、同一條時間軸
The plan asked for forty-five seconds in three sections. 這份 plan 要的是四十五秒、三個段落。
The amber band is what was asked for. Each band below it is what actually came back, drawn on the same scale. Hatching is a render running past the plan it came from. The marks are where the listening queue says to put your ear — click one. 琥珀色那條是要求的樣子。下面每一條是實際回來的東西,畫在同一個比例尺上。斜線是那次 render 超出了它自己的 plan。那些刻度是 listening queue 建議把耳朵放上去的位置 —— 點一下。
Loading the library…正在讀取 library…
Nothing on this page was typed by hand. Every duration, rate and rights answer is read out of the library record at build time, through an allowlist of fields that may be published. 這一頁沒有任何一個數字是手打的。每一個長度、費率、權利答案都是 build 的時候從 library 記錄讀出來的,而且要通過一份「可以公開的欄位」白名單。
Why the plan, and not the audio為什麼是 plan,不是音檔
Determinism is gone, and pretending otherwise would be the lie.決定性已經沒有了,假裝它還在才是謊。
01
The licence binds the input授權綁的是輸入
One provider's music terms prohibit whole classes of input — an artist's name, a song title, a label — whatever the output turns out to be. A licence check that runs at export time has already let the request happen.其中一家的音樂條款禁止整類的輸入 —— 藝人名、歌名、廠牌 —— 不管產出是什麼。一個在 export 時才跑的授權檢查,已經讓那個 request 發生過了。
02
The same input, twice同樣的輸入,兩次
One provider offers a seed and states in the same reference that exact reproducibility is not guaranteed. The other says results may vary between calls even with the same prompt. A repository cannot promise reproducible bytes on top of that.一家提供 seed,然後在同一份文件裡寫「不保證完全可重現」。另一家寫「即使同樣的 prompt,每次結果也可能不同」。在這之上,沒有任何 repo 能承諾可重現的 bytes。
03
The best surface has no API最好的那個表面沒有 API
The cheapest, most capable surface here is reachable only through a product UI. So generating by hand and importing with provenance has to be a first-class path, not a fallback — and what was actually pasted has to be written down before it is pasted.這裡最便宜、能力最強的那個表面只能透過產品 UI 操作。所以「手動產生、帶著來源匯入」必須是一等公民而不是退路 —— 而且「實際貼了什麼」必須在貼之前就寫下來。
Two providers, one plan, measured兩家供應商、同一份 plan、實測
One holds the length exactly and grants you nothing. The other grants you commercial use and cannot be told how long to play.一家長度分毫不差,但什麼權利都沒給你。另一家給了商業使用權,卻沒辦法叫它做多長。
The scriptable one能被程式驅動的那個
Its own music terms never grant ownership of the output, so every piece from it enters the library with commercial use recorded as unknown and waits for a person.它自己的音樂條款從來沒有授予產出的所有權,所以每一首從它來的東西進 library 時,商業使用都記成 unknown,然後等人來判斷。
The one with no API沒有 API 的那個
Its download carries signed Content Credentials declaring the file was model-made, plus an audio watermark that survives re-encoding. The label is strippable; the watermark is not.它的下載檔帶著簽章過的 Content Credentials,宣告這是模型做的,另外還有一個 re-encode 也洗不掉的音訊浮水印。標籤可以被剝掉,浮水印不行。
The asymmetry is the useful part, and it is the reason the plan — not the audio, and not the provider — is the thing this workshop keeps. 這個不對稱才是有用的部分,也正是為什麼這個工作室留下來的是 plan —— 不是音檔,也不是供應商。
What may not be sent什麼不能送出去
Two licences, and they forbid different kinds of thing.兩份授權,禁止的是不同種類的東西。
One enumerates references — a rule about the shape of the request. The other enumerates content — a rule about what you are trying to make. A single flat word list would have flattened that difference and lost the reason each rule exists, so every rule carries the clause it enforces, the page that clause is on, and the date that page was read. 一份列的是指涉 —— 關於 request 長什麼樣的規則。另一份列的是內容 —— 關於你想做出什麼的規則。一份扁平的關鍵字清單會把這個差異抹平,也會弄丟每條規則存在的理由。所以每一條規則都帶著它執行的條款、條款在哪一頁、還有那一頁是哪天讀的。
midnight-drive: refusing to print a prompt. terms [binding] global.styles: asks the model to imitate an identifiable person ('voice of') g.misrepresentation.impersonation policies.google.com (2026-09-11) Prohibited Use Policy: "Impersonating an individual (living or dead) without explicit disclosure, in order to deceive." terms [proxy ] global.styles: names a reference artist, songwriter, song, album, label or publisher ('in the style of') el.input.reference elevenlabs.io/music-terms (2026-09-11) "Customer is expressly prohibited from submitting any of the following as part of the Input: any artist's … real name or stage name …" 1 of these is the policy that governs this paste. 1 is the other provider's terms, applied here as a proxy: they do not bind this paste, and this repository refuses on them anyway rather than argue a licence. The fix is a different plan. Never a looser lint.
Refusing on a proxy is a choice, not a reading用代理規則拒絕是一個選擇,不是一種解讀
Every rule runs against every plan, whichever provider it is bound for. That is stricter than either licence alone. What changes with the destination is the claim, not the outcome — and saying which of the two it is refusing under is the difference between a check and a claim.不管要送去哪一家,每一條規則都對每一份 plan 跑。這比任何單一份授權都嚴格。隨目的地改變的是宣稱,不是結果 —— 而說清楚它是根據哪一份在拒絕,就是「檢查」和「宣稱」的差別。
Some duties no lint can check有些義務 lint 永遠檢查不到
"Do not claim generated content was created solely by a human" binds the moment a track is published, which is not a moment any check over a text file will ever see. Those clauses travel as obligations instead — on the record, and written into every export manifest, once at the top and again per entry.「不得宣稱生成內容是人類獨力創作」綁的是發佈那一刻,而那一刻是任何對文字檔的檢查都看不到的。所以那些條款改以義務的形式流動 —— 附在記錄上,也寫進每一份 export manifest,頂層一次、每一筆再一次。
What the first real spending found第一次真的花錢找到了什麼
Three confident wrong answers, none of which reading could have caught.三個自信的錯答案,沒有一個是用讀的能抓到的。
Each produced a plausible result rather than an error, which is the failure this workshop's whole style exists to catch — and it still took real requests to catch them. 每一個都給出了合理的結果而不是錯誤,而那正是這整套風格存在要抓的失敗模式 —— 結果還是得送出真的 request 才抓到。
The guard watched the wrong meter守衛盯錯了計量表
The subscription's own usage counter moved by zero across a music generation and only caught up minutes later. Long enough that a two-take run re-reading it between takes got a number predating its own first take. A ceiling checked against stale data is not a ceiling.訂閱本身的用量計數器在一次音樂生成之後動了 0,幾分鐘後才補上。久到一個兩 take 的 run 在中間重讀時,拿到的是早於自己第一個 take 的數字。用過期資料檢查的上限不是上限。
The request id was never recordedrequest id 一直沒被記下來
The adapter looked for the three header names its sibling project uses. This API sends a fourth. The first real generation wrote null and would have gone on doing it silently. Found by reading the headers of a deliberately failing free request.adapter 找的是姊妹專案用的那三個 header 名稱。這個 API 送的是第四個。第一次真的生成寫下了 null,而且會一直安靜地這樣下去。是靠讀一個故意失敗的免費 request 的 header 才發現的。
A provenance field invented itself一個來源欄位自己編了答案
A check for Content Credentials searched the bytes for a four-character marker and reported a signed manifest in a file that had never been signed — those characters occur by chance deep inside ordinary compressed audio. It is structural now, with a test that feeds it exactly that false positive.一個檢查 Content Credentials 的函式掃 bytes 找四個字元,然後在一個從未簽章的檔案裡回報了簽章 —— 那四個字元在普通壓縮音訊深處會剛好出現。現在改成結構化解析,並且有一個 test 專門餵它那個假陽性。
A rule whose origin is lost gets deleted by the next person who finds it annoying. So every rule quotes its clause — and quoting the prohibited-industry clause in full, to record it properly, is what revealed the list had been wrong: it counted one sector twice and had never encoded two others at all.一條失去出處的規則,會被下一個覺得它很煩的人刪掉。所以每條規則都引用它的條款 —— 而為了正確記錄而把禁止產業那條完整引用出來,正好揭露了清單一直是錯的:它把一個產業算成兩個,另外兩個從來沒有編碼進去。
lint.pyone test per named sector, since自此每個列名產業一個 test
The part no code here can finish這裡的程式碼永遠做不完的那部分
Nothing in this workshop has ears.這個工作室裡沒有東西有耳朵。
A probe can say a file is forty-five seconds long. Nothing can say whether the second section actually lifted. So the queue chooses rather than lists, cues at the plan's own section boundaries, and tells the listener which transition they are checking — and the verdict field stays empty until a person, named, fills it in. 探測工具可以說一個檔案是四十五秒長。但沒有任何東西能說第二段到底有沒有真的揚起來。所以 queue 是用選的而不是用列的,切在 plan 自己的段落接縫上,並告訴聽的人他們正在檢查哪一個轉折 —— 而那個 verdict 欄位會一直空著,直到一個有名字的人把它填上。