利用 AI 生成表情控制器 (MIDI CC) 自動化曲線
1-2 手繪曲線的三大痛點
既然 CC 這麼重要,為什麼不是每個人都把曲線畫好?因為手動繪製的成本實在高得不成比例。
第一是時間成本。一段八小節的弦樂長音,如果要在每個音符上做出「進、漸強、峰值、自然衰減」的完整包絡,光是滑鼠來回拉動就要十分鐘以上。而一首完整編曲裡可能有二十軌這樣的樂器,加起來就是好幾個工作天。
第二是音樂性難以量化。人腦很難憑空想像「第 3.7 拍時 CC11 應該是 68」。你畫出來的曲線往往過於對稱、過於規律,變成一種「數學上的漸強」,而不是「音樂上的漸強」。真正的演奏者在漸強時,前半段通常比較慢、後半段加速,而且在到達峰值前會有極細微的預先收力——這些細節用滑鼠幾乎不可能畫出來。
第三是無法與音訊內容呼應。如果你的編曲是跟著真人演唱或真實樂器錄音走的,那麼 CC 曲線理應跟隨那些錄音的動態起伏。但手繪曲線和音訊波形之間沒有任何連動,只能靠耳朵反覆比對、反覆微調。
1-3 AI 介入的價值邊界:它能做什麼、不能做什麼
在談 AI 之前,先說清楚它的能力邊界,可以避免你對它抱持錯誤期待。
AI 擅長的事:從音訊中萃取動態輪廓並轉譯成 CC 數值、在給定的樂句結構上生成具有自然起伏的包絡、批次處理數十軌的自動化、以及根據文字描述生成可編輯的控制點草稿。
AI 不擅長的事:判斷「這一句該不該漸強」這種音樂決策、理解你的音源庫裡 CC11 到底映射到哪個參數、以及在沒有乾淨分軌的情況下準確分離出單一樂器的動態。說到底,AI 是幫你把「體力活」做掉,但「審美決定」還是得由你來下。
二、AI 生成 CC 曲線的四種技術路線
目前市面上與「AI 生成 MIDI CC」相關的做法,大致可以歸納成四條技術路線。它們的成熟度、實作難度與適用場景都不一樣,你可以依照自己的需求挑選,也可以混搭使用。
2-1 路線一:音訊特徵回歸(Audio-to-CC)
這是最實用、也最容易落地的一條路。核心概念是:真實錄音裡本來就藏著表情,我們只要把它「讀出來」再「翻譯」成 CC 就好。
具體做法是對乾淨的分軌音訊做特徵萃取,再把特徵映射到對應的 CC:
基頻軌跡的週期性起伏 → 可推估顫音深度,映射到 CC1。
這條路線的優點是「忠實」——因為它的資料來源就是真實演奏,生成出來的曲線天生具有人味。缺點是它對分軌品質非常敏感:如果音軌裡混了其他樂器、或是有大量殘響,萃出來的輪廓就會失真。實務上建議盡量取得乾淨的單一樂器錄音,或至少用頻帶濾波粗略隔離目標樂器的頻段。
2-2 路線二:序列生成模型(LSTM / Transformer / Diffusion)
第二條路是直接用生成式模型「無中生有」一條曲線。做法是把 CC 曲線視為時間序列,用模型學習大量真實 MIDI 檔案中的表情模式,再根據條件生成新的曲線。
常見的模型架構有三類:
這條路線最大的瓶頸不在模型,而在資料標註。高品質的、帶有完整 CC 標註的 MIDI 資料集並不多,而且每個音源庫對 CC 的用法都不一樣——同一個 CC11 曲線,在 A 音源聽起來是自然的漸強,在 B 音源可能因為映射方式不同而變得誇張。因此這條路線目前更適合做「風格遷移」或「草稿生成」,而不是直接產出成品。
2-3 路線三:規則引擎 + 機率擾動(Humanize 的自動化升級)
嚴格說起來,這條路線不完全是 AI,但它常常是整個流程中最被低估的一環。它的做法是:先用數學函式定義出一個「理想的」包絡形狀(例如弦樂長音的標準 ADSR 變體),再用機率分布對這個形狀進行擾動,讓它不那麼完美。
常見的擾動方式包括:對每個控制點加入 ±1~3 的隨機偏移、對時間軸加入微小的前後位移、讓漸強曲線的斜率在不同樂句間略有差異、以及刻意在某些位置製造「呼吸停頓」。這些手法看似簡單,卻是讓 AI 生成結果不至於「機械化」的關鍵後處理步驟。
實務上,我通常會把它接在路線一或路線二之後當作收尾:先用音訊回歸或模型生成主體曲線,再用規則引擎做人性化擾動。這個組合的成品品質,往往比單獨使用任何一條路線都好。
2-4 路線四:LLM 作為「曲線編曲師」
第四條路是近兩年才出現的玩法:把大型語言模型當成一位懂音樂的助理,請它直接輸出 CC 曲線的控制點。
具體做法是給 LLM 一段結構化的提示,例如「這是一段 8 小節的弦樂長音,調性 D 大調,速度 72 BPM,請生成 CC11 的控制點,需要呈現從壓抑到釋放的情緒曲線」,並要求它以 JSON 格式輸出「時間(以拍為單位)—數值(0~127)」的陣列。
這條路線的優勢在於它理解「音樂意圖」的層級遠高於純數值模型,可以聽懂「壓抑」「釋放」「猶豫」這類抽象描述。缺點也同樣明顯:LLM 缺少節拍精度的概念,輸出的控制點往往過於稀疏(可能每小節只有兩三個點),需要再用插值與平滑補足;而且它對具體音源的反應無法預測,你還是得在 DAW 裡試聽調整。因此建議把它當作「段落規劃工具」,用來決定大方向的起伏,而不是逐幀的細節生成。
三、實戰工具鏈:從 DAW 到 Python,再回到 DAW
理解了原理之後,接下來是最實際的部分:怎麼把這套流程接進你現有的工作流。以下示範的路線是以「音訊特徵回歸」為主體,因為它的成功率最高、也最容易看到成果。
3-1 匯出:如何乾淨地取得 MIDI 與對齊音訊
第一步是從 DAW 匯出兩個東西:一個是原始 MIDI 檔(包含正確的速度與拍號資訊),另一個是對應的乾淨分軌音訊。
匯出時有幾個關鍵細節:
如果你的 DAW 支援「凍結(Freeze)」或「軌道匯出(Stem Export)」,直接用那個功能最省事。Reaper 的「Render tracks to mono/stereo stem tracks」、Logic 的「Export All Tracks as Audio Files」、Ableton 的「Export Selected Tracks」都可以達到相同目的。
3-2 處理:Python 完整實作範例
接下來是核心處理階段。以下程式碼示範如何從音訊萃取動態輪廓,轉換成 CC11 曲線,再寫回 MIDI 檔案。你需要安裝的套件是 librosa、pretty_midi、numpy 與 scipy。
import numpy as np
import librosa
import pretty_midi
from scipy.signal import savgol_filter
1. 讀取乾淨的分軌音訊(務必關閉殘響)
y, sr = librosa.load("strings_stem.wav", sr=22050, mono=True)
2. 取出短時能量(RMS),作為「音量表情」的代理訊號
hop_length = 256
rms = librosa.feature.rms(y=y, frame_length=2048, hop_length=hop_length)[0]
times = librosa.frames_to_time(
np.arange(len(rms)), sr=sr, hop_length=hop_length
3. 對數壓縮後正規化到 0~127
ref=np.max 讓最大值對齊 0 dB,再做 40 dB 的動態範圍壓縮
db = librosa.amplitude_to_db(rms, ref=np.max)
norm = np.clip((db + 40.0) / 40.0, 0.0, 1.0)
cc_value = norm * 127.0
4. 平滑處理,消除階梯感
window_length 必須是奇數,數值越大越平滑
cc_smooth = savgol_filter(cc_value, window_length=21, polyorder=3)
5. 避免極端值,保留安全邊界
cc_final = np.clip(np.round(cc_smooth), 2, 125).astype(int)
6. 寫回 MIDI 檔案
pm = pretty_midi.PrettyMIDI("strings_raw.mid")
cc_events = [
pretty_midi.ControlChange(number=11, value=int(v), time=float(t))
for t, v in zip(times, cc_final)
注意:不同版本的 pretty_midi 對屬性名稱略有差異
若 control_changes 不存在,可改用 pm.instruments[0].control_changes
pm.instruments[0].control_changes = cc_events
pm.write("strings_with_cc11.mid")
print("完成,共寫入", len(cc_events), "個 CC 事件")
如果你想做的是高解析度 CC,可以把數值拆成 MSB 與 LSB 兩組訊息:MSB 寫入 CC11,LSB 寫入 CC43,其中 LSB 的值等於 (原始值 * 128) % 128。並非所有音源都支援高解析度 CC,使用前請先查閱音源的說明文件。
若你希望加入人性化擾動,可以在第 5 步之後插入一小段:
# 加入 ±2 的隨機擾動,並使用固定亂數種子確保可重現
rng = np.random.default_rng(42)
jitter = rng.integers(-2, 3, size=cc_smooth.shape)
cc_final = np.clip(np.round(cc_smooth + jitter), 2, 125).astype(int)
這個小小的擾動,往往是區分「聽起來像 AI」與「聽起來像人」的關鍵。因為真人演奏永遠不會在每個時間點都精準落在數學曲線上。
3-3 匯入:各大 DAW 的還原方式
處理完成的 MIDI 檔要怎麼回到 DAW 裡?不同 DAW 的處理邏輯差異不小,以下分別說明。
Ableton Live:直接把處理好的 MIDI 檔拖進新的 MIDI 軌,Ableton 會自動讀取其中的 CC 資料。接著在 Clip View 下方的 Envelope 面板中,把顯示模式切換到「MIDI Ctrl」,選擇 CC11,就能看到完整的自動化曲線。若要把曲線複製到原本的軌道上,可以善用複製貼上,或直接把整個 Clip 換掉。
Logic Pro:透過「檔案 → 匯入 → MIDI 檔案」載入,並在對話框中勾選「使用 MIDI 檔案 tempo」以確保速度一致。匯入後在 Piano Roll 底部的自動化面板選擇 CC11 即可。Logic 的好處是它可以直接把 MIDI CC 轉換成軌道自動化(Track Automation),方便後續做更精細的編輯。
Cubase:匯入後在 Key Editor 下方的控制器通道中選擇「Expression」。要注意 Cubase 對「MIDI 自動化」與「軌道自動化」有嚴格區分,如果你用的是 VST 音源的內部參數,可能需要額外做一次對應設定。
Reaper:對這類工作流最友善的 DAW。直接把 MIDI 檔拖進來,在 MIDI Editor 中切換到 CC 通道就能看到曲線,甚至可以透過 ReaScript 做批次處理。
重要提醒:無論用哪一套 DAW,匯入後第一件事就是確認音源庫的 CC 映射。例如 Kontakt 上的某些管弦音源,預設的 CC11 可能對應到「音量」而非「表情」,這時候曲線聽起來就會完全不同。務必先看音源說明文件,確認每個 CC 編號對應的參數名稱。
四、提示詞與參數工程:如何讓 AI 產出「有呼吸感」的曲線
工具鏈打通之後,真正的勝負就在參數與提示詞的設計上。同樣的模型、同樣的音訊,不同的參數設定可以讓成品品質差距極大。
4-1 用自然語言描述演奏意圖的模板
如果你使用的是路線四(LLM 生成控制點),提示詞的品質直接決定輸出品質。以下提供一個可以直接套用的模板結構:
「這是一段長度 8 小節的弦樂群奏長音,速度 72 BPM,4/4 拍,調性為 d 小調。請生成 CC11 的表情控制點,以 1/8 音符為單位。
情緒走向:第 1~2 小節保持壓抑(數值 35 左右,起伏極小);第 3 小節開始緩慢爬升,但中段有一次短暫的回落;第 5~6 小節加速漸強到峰值 105;第 7 小節達到峰值後輕微回落至 90;第 8 小節自然衰減至 25 後收尾。
避免對稱的數學曲線,請模擬真人弓壓的細微不規則。以 JSON 格式輸出,欄位為 beat 與 value。」
這種描述方式的關鍵在於三件事:給定明確的時間與數值範圍、描述情緒而非只描述形狀、明確要求不規則性。只說「做一個漸強」得到的結果通常非常機械;說「壓抑到釋放,中段有一次猶豫」得到的結果就會自然許多。
另外,建議永遠要求模型輸出結構化格式(JSON 或 CSV),而不是自由文字。這樣你才能用程式自動解析並轉換成 MIDI 事件。
4-2 控制點密度、平滑度、過衝與延遲補償
無論你用哪條路線,以下四個參數幾乎決定了成品的最終質感:
控制點密度:太低會出現明顯的折線感,太高則會讓曲線過於敏感、難以編輯。實務上,每 1/32 音符一個控制點(在 120 BPM 下約每 62 毫秒)是兼顧平滑與可編輯性的甜蜜點。若你的音源支援高解析度 CC,可以降到每 1/16 音符一個點,因為 14 位元的解析度足以補足時間上的稀疏。
平滑度:使用 Savitzky-Golay 濾波時,window_length 是最重要的參數。太小(例如 5)幾乎沒有作用,太大(例如 101)會把樂句的起音與收尾全部抹平。建議從 15~25 之間開始嘗試,並依照樂句長度動態調整——長音用大窗口,短音用小窗口。
過衝修正(Overshoot):平滑濾波有時會在曲線的轉折處產生數值超出原始範圍的「過衝」,導致 CC 值短暫衝到 127 或掉到 0。務必在最後一步用 np.clip 夾住範圍,並保留 2~3 的安全邊界,因為某些音源在 CC 值為 0 或 127 時會出現異常行為。
延遲補償:音源庫本身通常有幾毫秒到數十毫秒的延遲,尤其是管弦音源的起音取樣。如果你發現生成的曲線總是「慢半拍」,可以在寫回 MIDI 時把所有時間點統一提前 10~30 毫秒,或是在 DAW 中對整個 MIDI 軌做負延遲補償。這個細節對弦樂與管樂的真實感影響極大。
4-3 避免常見的「AI 味」:抖動、階梯感與過度擬合
「AI 味」是一個很具體的東西,通常由以下三種問題組成:
第一,過度平滑。AI 生成的曲線往往比真人演奏平滑太多。真人演奏時,弓壓、氣息、手指力度都在持續微調,曲線上會有大量肉眼幾乎看不見的細微波動。解決辦法就是前面提到的隨機擾動,或是在平滑處理時刻意使用較小的窗口。
第二,階梯感。7 位元的 MIDI CC 只有 128 階,在慢速長漸強中容易被聽出來。解決辦法有三:使用高解析度 CC、在 DAW 中對 CC 曲線套用輕微的低通濾波、或是在音源端把 CC 轉譯成更細緻的內部參數。
第三,過度擬合(Overfitting)。這是指 AI 生成的曲線與參考音訊「太像了」,連錄音時的雜訊起伏都一併複製。這種情況在路線一中特別常見。解法是在特徵萃取階段先做一次低通濾波,把高頻的雜訊抖動濾掉,只保留樂句層級的動態輪廓。
五、三個實作案例拆解
理論講完了,來看看實際應用。以下三個案例涵蓋管弦與合成器兩大領域,都是編曲時最常遇到的情境。
5-1 案例一:弦樂群奏長音——CC1 與 CC11 的雙軌策略
弦樂群奏是最考驗 CC 功力的場景。一段八小節的長音,如果只用 Note Velocity 控制,聽起來會非常死板。正確的做法是同時操作 CC1 與 CC11。
CC11 負責音量表情。依照樂句的情緒走向,生成一條從 40 起步、緩升至 100、再自然衰減至 30 的曲線。注意起音處不要從 0 開始,因為真實弦樂在起弓時就已經有基礎音量。
CC1 負責顫音深度。這條線通常比 CC11 更晚啟動。在樂句的前 1/3,CC1 應該維持在 10 以下(幾乎沒有顫音),中段緩慢爬升到 45 左右,接近樂句尾端時達到 60~70 的高點。這種「先平穩、後歌唱」的處理方式,是模擬真人演奏最有效的手法之一。
兩條曲線的時間軸不需要完全對齊。刻意讓 CC1 的爬升比 CC11 晚個半拍到一拍,反而更能營造出「呼吸感」,因為真實樂手在音量上升之後才會自然加強顫音。
5-2 案例二:管樂漸強與弱音收尾——CC11 與 CC7 的分工
管樂的動態處理有一個容易被忽略的陷阱:很多人習慣用 CC7 做漸強,結果發現整體的殘響比例也跟著變了,聽起來忽遠忽近。
正確的分工是:CC11 負責樂句內的表情起伏,CC7 負責段落之間的整體平衡。例如,一段 16 小節的旋律,其中第 9~12 小節是整體的高潮段落,那麼就在第 9 小節前把 CC7 從 100 提到 112,讓整個段落相對於前後更突出;至於段落內部的漸強,則全部交給 CC11 處理。
另外,管樂的收尾特別講究。真實的長笛或單簧管在收尾時,音量和音色亮度的下降速度並不一致——通常是先失去高頻,再慢慢失去整體音量。因此除了 CC11 之外,可以同步生成一條 CC74(亮度)曲線,讓它在 CC11 開始下降之前就先衰減。這個技巧能大幅提升收尾的自然度。
5-3 案例三:Synth Pad 濾波掃頻——CC74 與 CC71 的連動
合成器的掃頻效果,本質上就是 CC74(濾波器截止頻率)與 CC71(共鳴量)的連動。這裡的 AI 應用方式和管弦樂不同——我們通常不是從音訊回歸,而是用 LLM 或序列模型生成「形狀草稿」。
一個實用的做法是:先用 LLM 生成 CC74 的粗略輪廓(例如「在 16 小節內做兩次不對稱的開合,第一次開合較快,第二次較慢」),再用程式做插值與平滑。接著,用一個簡單的數學關係自動生成 CC71:當 CC74 位於中低頻段(40~80)時,CC71 拉到 70~90 以強化共鳴;當 CC74 超過 100 時,CC71 迅速降回 20 以下,避免高頻共振刺耳。
# CC71 由 CC74 自動連動生成
cc74 = np.array([...]) # 截止頻率曲線
cc71 = np.where(
cc74 < 80, 85, # 低頻段:高共鳴
np.where(cc74 < 100, 55, 20) # 中頻段:中低共鳴;高頻段:低共鳴
要注意的是,快速變化的 CC 值容易產生「拉鍊雜音(Zipper Noise)」。撰寫程式時務必確認輸出的 CC 事件時間間隔夠密(建議至少每 10 毫秒一個點),或在音源端開啟參數平滑(Parameter Smoothing)功能。
六、常見問題與避坑指南
Q1:生成的曲線聽起來很生硬,該從哪裡調整?
先檢查三個地方:控制點密度是否足夠、平滑濾波的窗口是否過小、以及是否有加入人性化擾動。八成的情況是控制點太稀疏造成的折線感。
Q2:為什麼我把 CC11 曲線匯入後,音源完全沒反應?
最常見的原因是該音源庫的 CC11 沒有被映射到任何參數。請打開音源的設定介面,確認「Expression」或「Dynamics」對應的 MIDI CC 編號。有些音源用的是 CC11,有些用 CC2,有些甚至需要自行設定。
Q3:我沒有乾淨的分軌音訊,還能用音訊回歸嗎?
可以先對混音做頻帶濾波,粗略隔離目標樂器的頻段(例如弦樂群奏通常集中在 200 Hz~4 kHz)。雖然精確度會下降,但對於取得「大致正確的動態輪廓」來說已經夠用。或者改用路線三(規則引擎)從零開始生成。
Q4:AI 生成的曲線可以直接用嗎?
建議永遠把它當作「80 分的草稿」。花五分鐘微調關鍵的幾個轉折點,成品品質往往能再提升一個檔次。完全不做調整就交件,通常會在某些細節上露餡。
Q5:這個流程會不會讓我的作品聽起來很「模板化」?
關鍵在於你是否每次都使用相同的參數。建議針對不同的樂器、不同的樂句長度、不同的情緒段落,調整平滑窗口、擾動幅度與控制點密度。把 AI 當成工具而非罐頭,成品就不會撞衫。
七、結語:AI 是筆刷,不是畫家
回到最開始的問題:為什麼有些虛擬樂器聽起來像真人,有些聽起來像玩具?答案很少是「音源庫不夠貴」,而更常是「表情曲線沒有做好」。
AI 在這件事上的價值,不是取代你的音樂判斷,而是把你從重複的滑鼠勞動中解放出來。它讓你有能力在一首曲子裡,為二十軌樂器都畫上細緻的表情曲線——這在過去是不可思議的工作量。但最終決定「這一句該不該漸強」「這個顫音該從哪裡開始」的,仍然是你對音樂的理解。
建議你從今天開始,挑一首正在製作的曲子,選一軌弦樂或管樂,按照本文的流程走一遍。從匯出分軌、跑 Python 腳本、匯入 DAW、微調參數,到最後 A/B 比對生成前後的差異。你會發現,同一組音源、同一段旋律,加上一條對的表情曲線之後,整個質感是會跳級的。
如果你在實作過程中遇到任何問題,或是想分享自己調出的參數組合,歡迎在底下留言交流。也歡迎把你的成品片段貼出來,讓大家一起聽聽 AI 曲線能玩到什麼程度。
祝各位編曲順利,讓你的虛擬樂器真正學會呼吸。
```