先說結論
MIDI 檔案記錄的是一次演奏:按了哪個鍵、什麼時候按、按多重、按多久。它的音符沒有升降記號、聲部、書面休止符或符槓,檔案裡也常常沒有調號,所以 MuseScore 只能去猜,而音符偏離節拍網格時,它猜得最離譜。在 12 段吉他轉譜上,我們最早的轉換器一個調號也沒寫,還藏起了所有休止符;同樣的音符先對齊到十六分音符網格、使用固定速度、在每條音軌寫入調號,再交給 MuseScore Studio 4.7.5 的匯入器,12 份裡有 10 份調號正確,所有休止符也都顯示了出來。MuseScore Studio 4 沒有 MIDI 匯入面板,所以這些修正不是寫進 MIDI 檔案,就是寫進命令列用的選項檔。
MIDI 檔案沒有存哪些資訊?
讀譜需要的大部分資訊,它都沒有存。一個 MIDI 音符就是 0 到 127 之間的一個鍵號加一個力度值,在音符開始時送出一次,結束時再送出一次(MIDI 協會)。63 號音既是 D♯ 也是 E♭,該寫哪個取決於調性,而音符本身並不說明。標準 MIDI 檔案可以用 meta 事件加入速度、拍號和調號,但聲部、休止符、符槓和連音都沒有標準的存放位置。休止符只是一段空白,音長也只是 tick 數,而不是書面時值。
音訊轉 MIDI 工具還會帶來第二個問題:它們的時間來自錄音,音符很少正好落在拍點上。ScoreStarling 使用的 Spotify Basic Pitch 會依你給定的速度,把所有音符寫進同一個 Electric Piano 1(電鋼琴 1)聲部,而且不寫調號(note_creation.py)。要把它變成樂譜,就得為每個音符選定音名寫法、書面時值、聲部和譜表。每個轉換器都得做這些選擇,差別只在於做得好不好。
簡單的轉換器把 12 段吉他轉譜弄成什麼樣子
我們最早的記譜步驟,是一個以 music21 函式庫自行編寫的轉換器。我們把公開資料集 GuitarSet 中 12 段錄音經 Basic Pitch 轉出的 MIDI 交給它,同時提供每段錄音的速度,再由 Verovio 原樣排版它寫出的內容。逐一檢查這 12 份樂譜,我們發現:
- 所有樂譜都看不到休止符:music21 的 MusicXML 匯出器預設用隱藏的休止符填補空白(m21ToXml.py)。
- 所有樂譜都沒有調號。E 大調的曲子一個升記號都沒有;一段 C 大調伴奏的 431 個書面音符裡,有 153 個帶著多餘的還原記號(對應 421 個 MIDI 音符,有些被拆開後用連結線相連)。
- 音名寫法只看音符編號。MIDI 63 號音一律寫成 E♭,連在本該寫 D♯ 的 E 大調裡也一樣;在一首 G♭ 大調的曲子裡,49 個調內音中有 30 個寫錯了。
- 一行譜表上最多五個聲部。音符的起點和終點各自對齊到最近的十六分音符,於是下一個音彈出時仍在振動的那根弦,就逼出了另一個聲部,還配上了相應的附點和連結線。
- 吉他被寫成了鋼琴:12 份樂譜中有 10 份用鋼琴大譜表,另外 2 份用低音譜號,沒有一份用吉他譜號,因為 Basic Pitch 把所有音符都標成了 Electric Piano(電鋼琴)。
2026年10月7日,我們用同一批存下來的 MIDI 檔案重新執行了這個轉換器,得到的數字完全一樣。
問題不在音樂字型。Verovio 和它的 Leipzig 字型只是照著 MusicXML 畫;錯的是 MusicXML 本身。
前後比較:改用 MuseScore Studio 的匯入器
我們先看了開源的替代方案:partitura 能處理調性、音名寫法和聲部,但沒有量化器,也不寫休止符;我們找到的其他研究工具,不是只支援鋼琴,就是沒有標明授權、僅限非商業用途,或者尚未釋出。於是我們把這項工作交給了 MuseScore Studio 4.7.5 的 MIDI 匯入器,以獨立程式的方式執行。同樣的 12 段錄音、同樣的 Basic Pitch 音符、同樣的給定速度,依下文的方法前處理,2026年10月2日在一台 Mac 上測得:
| 指標 | music21 轉換器 | MuseScore 匯入器 |
|---|---|---|
| 調號與標註一致 | 0/12 | 10/12 |
| 調內音寫法與調性不符 | 2,703 個中 322 個 | 3,213 個中 0 個 |
| 每個書面音符的變音記號數 | 0.53 | 0.06 |
| 可見的休止符 | 1,626 個中 0 個 | 全部 988 個 |
| 單行譜表最多聲部數 | 5 | 2 |
| 所有 MIDI 音符都有寫出 | 12/12 | 12/12 |
| 4/4 拍、使用給定速度 | 12/12 | 12/12 |
兩邊的書面音符總數不同,是因為 MuseScore 用連結線跨拍、跨小節線連接音符的方式不一樣。兩個錯的調都和標註差一個五度:G♭ 大調的曲子寫成了 D♭ 大調,E 大調的寫成了 B 大調。檔案裡沒有我們推估的調時,MuseScore 自己猜的調只對了 5 份(2026年10月7日重測);正是把推估結果寫進檔案,才把它提高到 10 份。匯入器處理每段錄音花了 1.2–4.3 秒,平均 2.3 秒。
MuseScore 為什麼會重新猜速度、拍號和調?
因為在它看來,沒量化的 MIDI 就像一段現場演奏。匯入器會檢查落在拍點附近的音符,如果其中正好從拍點開始的不到 60%,它就把檔案當作真人演奏(importmidi_quant.cpp)。接著它會執行自己的節拍追蹤,選定拍號,再拉伸音符的時間去貼合它找到的拍子。MuseScore 的舊版手冊說,這種模式是拿準確性換可讀性,對沒有對齊的檔案預設開啟。
調性另有一條規則。只要有任何一條非鼓音軌缺少調號,或者檔案被判定為演奏,匯入器就會根據音符推估調性(importmidi_key.cpp)。所以只在速度音軌裡寫調號是不夠的,每條有音符的音軌都要有。直接匯入 Basic Pitch 的原始 MIDI 時,我們看到拍號、速度和調全都被重新猜了一遍,就算已經把「真人演奏」選項設為 false 也一樣。
匯入前該怎麼處理 MIDI?
能在 MIDI 檔案裡決定的記譜細節,就在 MuseScore 看到它之前決定好。我們對每份轉譜都會這樣做:
- 使用一個固定的速度。ScoreStarling 會用你設定的 BPM,或從錄音中偵測到的速度;在 DAW(編曲軟體)裡,可以跟著節拍器錄音,或者把專案速度調到與這段錄音一致。
- 把每個音符的起點和終點都移到網格上,網格精度就是你想讀到的最短時值。本文 10月2日的測試用的是 4/4 拍下的十六分音符。所有音符都在網格上時,MuseScore 會把檔案當作寫好的樂譜來讀,而不是當作演奏。
- 把速度和拍號放在第一條音軌裡,每條有音符的音軌都寫上調號。我們用 music21 的 Krumhansl–Schmuckler 調性辨識演算法,根據音符推估調性;如果你知道真正的調,就直接用它。
- 幫每條音軌設定真實的樂器。MuseScore 會根據 General MIDI 音色來選擇譜表和譜號:仍標為 Electric Piano 的吉他會被放到鋼琴大譜表上,而設為尼龍弦吉他音色時,則會用下方帶 8 的高音譜號。
- 注意同音反覆。如果同一個音在一個網格單位內彈了兩下,對齊後兩次起音會合併成一次;我們會把第二次往後挪一個三十二分音符。
MuseScore 匯入該用哪些設定?
MuseScore Studio 4 沒有可以設定這些選項的匯入面板。它的手冊說 MIDI 匯入面板「目前尚未實作」,要求恢復它的 GitHub issue(#11918,2022年6月提出)在我們 2026年10月3日查看時仍未關閉。在軟體裡,唯一和量化有關的設定是匯入 MIDI 檔案時的最短音符時值,位於「偏好設定 → 匯入」(Preferences → Import)。
匯入器仍會從命令列裡用 -M 傳入的檔案讀取主要選項,手冊的命令列頁面附有一個範例。下面是 10月2日測試用的檔案;現在 ScoreStarling 會把旋律寫在一個聲部裡(VoiceCount 設為 0),並在第一小節是弱起小節時開啟 RecognizePickupBar:
<?xml version="1.0" encoding="UTF-8"?>
<MidiOptions>
<QuantValue>2</QuantValue>
<VoiceCount>1</VoiceCount>
<Duplets>false</Duplets>
<Triplets>false</Triplets>
<Quadruplets>false</Quadruplets>
<Quintuplets>false</Quintuplets>
<Septuplets>false</Septuplets>
<Nonuplets>false</Nonuplets>
<HumanPerformance>false</HumanPerformance>
<MeasureCount2xLess>false</MeasureCount2xLess>
<SplitStaff>false</SplitStaff>
<ClefChanges>false</ClefChanges>
<SimplifyDurations>true</SimplifyDurations>
<ShowStaccato>false</ShowStaccato>
<DottedNotes>true</DottedNotes>
<RecognizePickupBar>false</RecognizePickupBar>
<Swing>0</Swing>
</MidiOptions>
接著進行轉換,輸出檔使用 MusicXML 副檔名:
mscore -M midi-import.xml -o score.musicxml performance.mid
程式的名稱和位置依系統而異,Windows 上手冊用的是 MuseScore4.exe。主要選項的作用如下:
| 選項 | 設定值 | 作用 |
|---|---|---|
| QuantValue | 2 | 最短書面時值:十六分音符(1 為八分音符,3 為三十二分音符) |
| VoiceCount | 1 | 每行譜表最多兩個聲部;聲部數等於設定值加一 |
| Triplets 及其他連音選項 | false | 不辨識連音,因為我們的網格裡沒有連音 |
| HumanPerformance | false | 不把檔案當作現場演奏;只有音符都在網格上時,這項設定才成立 |
| SplitStaff | false,鋼琴為 true | 把鋼琴聲部依左右手分到兩行譜表;對其他樂器,MuseScore 則會拆成獨立的聲部 |
| SimplifyDurations | true | 更少的休止符,更簡單的時值 |
| ClefChanges | false | 譜表中途不插入小號的變換譜號 |
| RecognizePickupBar | false | 第一小節視為完整小節 |
| Swing | 0 | 不偵測搖擺節奏 |
如果你的音樂裡有三連音,就不要對齊到直拍網格,並保持 Triplets 開啟;MuseScore 辨識三連音的效果如何,我們還沒測過。在 MuseScore 3 裡,這些設定都放在一個匯入面板中,欄位名稱有 Max. voices、Search tuplets 和 Is human performance 等。
譜面更整齊,代價是什麼?
會損失一些準確性,主要在音符時值上。以下是我們測得或已知的取捨:
- MuseScore 把 26% 的音符寫得比量化後的演奏更長,最多長出三個十六分音符,從來沒有寫短過;同時發聲但長短不同的音符,也可能被寫成同一個時值。在 ScoreStarling 裡,播放和 MIDI 匯出保留演奏的實際時間,不過旋律線會先清理一遍:同時彈下的幾個音只留最強的那個,微弱的回音會去掉,延續的音在下一個音開始時結束。
- 調性是根據音符推估的,12 份裡錯了 2 份,每次都差一個五度。帶七個升記號或降記號的調,會寫成對應的、只有五個升降記號的等音調。
- 10月2日這次吉他測試用的是直拍的十六分音符網格,表示不了三連音和搖擺節奏。ScoreStarling 轉譜單一樂器或人聲時依然如此,拍號從 4/4 開始;鋼琴獨奏則會跟隨演奏的小節劃分,可以選用 4/4、3/4、6/8 或 12/8。如果你自己準備檔案,請寫入真實的拍號。
- MuseScore 會依自己的規則把鋼琴和弦分給左右手,即使是兩個音靠得很近的和弦,也可能被分到不同的譜表上。
其中一部分可以在匯入後整理。工具 → 重組節奏(Tools → Regroup rhythms)會改寫選取的段落,讓音符按拍子分組,節奏本身不變。工具 → 用升記號/降記號重新拼寫音高(Tools → Respell pitches with sharps / with flats)可以修改音名寫法,不過手冊說它是針對同一音高的音符設計的。調號錯了,在匯入前改 MIDI 檔案,比匯入後一個一個改音符快得多。
MuseScore 能把 MP3 轉成樂譜嗎?
MuseScore Studio 不行:它能開啟 MusicXML、MIDI 這類樂譜格式,但打不開音訊。Muse Group 於 2026年8月17日在 MuseScore 網頁平台上推出了 Audio-to-Score 測試版:支援鋼琴獨奏和木吉他,MP3 檔案最大 30 MB(約三分鐘),免費,結果以 MSCZ 檔案回傳,可在 MuseScore Studio 開啟。我們還沒有測試過。
另一條路就是本文介紹的做法:先用音訊轉 MIDI 模型,再調整它的時間,最後交給 MuseScore 的匯入器。ScoreStarling 轉單一樂器或人聲時就是這樣,用的是 Basic Pitch;鋼琴獨奏則用一個鋼琴模型,它轉出的音符同時提供節拍和小節線;頁面由 Verovio 繪製。現在,單音旋律會寫在一行譜表的一個聲部裡,彈和弦的聲部會把和弦保留在同一行譜表上,「樂譜設定 → 版面」也可以改變單聲部錄音的記譜方式。上面的測量結果來自 10月2日。10月4日,在旋律改為一次一個音、寫在一行譜表上之後,我們重測了一遍:調號同樣 12 份對了 10 份,3,158 個調內音裡寫法與調性不符的為 0,357 個休止符全部顯示。
你也可以在 ScoreStarling 裡選擇或拖入 MIDI 檔案,直接得到可編輯的樂譜;鼓軌會被略過,整份樂譜只用一個拍號。錄音只轉前五分鐘,上傳檔案最大 100 MiB。PDF 免費,MusicXML 需要先解鎖樂譜(一次 15 點);其餘細節請見技術規格(2026年10月7日核對)。工作區可以免費開始使用;標明日期的吉他和樂團測量結果,收錄在《AI 扒譜到底有多準?我們實測了一下》一文中。
參考資料
- Summary of MIDI 1.0 Messages——MIDI Association
- Meta Message Types——mido 說明文件
- basic_pitch/note_creation.py——Spotify Basic Pitch,GitHub
- music21/musicxml/m21ToXml.py——music21,GitHub
- GuitarSet 1.1.0——Xi 等,Zenodo(CC BY 4.0)
- MIDI import——MuseScore 4 手冊
- Restore MIDI import panel, issue #11918——MuseScore,GitHub
- importmidi_quant.cpp 和 importmidi_key.cpp——MuseScore 原始碼,GitHub
- MIDI import——早期 MuseScore 手冊(匯入面板)
- Command line usage 及其中的MIDI 匯入選項範例檔——MuseScore Studio 手冊
- Preferences、File export、Regroup rhythms 和 Respell pitches——MuseScore Studio 手冊
- Hear It, Play It: MuseScore Introduces New Smart Audio Recognition Features——Muse Group,2026年8月17日
常見問題
怎麼把 MIDI 轉成 MusicXML?
在 MuseScore Studio 裡開啟 MIDI 檔案,選擇「檔案 → 匯出」(File → Export),格式選 MusicXML,預設會匯出壓縮的 .mxl。也可以在終端機執行 mscore -o score.musicxml file.mid,效果相同;加上 -M 還能指定一個選項檔,設定量化和聲部。記得先把 MIDI 處理好,否則 MusicXML 裡也會一樣亂。
為什麼 MIDI 匯入後滿是連結線和附點音符?
因為真人演奏的音符很少剛好在拍點上結束。對齊到很細的網格後,它們會跨過拍子和小節線,只能用連結線連起來;互相重疊的音符還會跑到額外的聲部裡。把量化精度設為你想讀到的最短時值,把匯入器限制為最多兩個聲部,並讓它簡化時值;這樣 MuseScore 會把部分音符寫得稍長一點,讓譜面更整齊。
為什麼我以為是 E♭,MuseScore 卻寫成了 D♯?
MIDI 只記錄 63 號音,不記錄它該寫成哪個音名,所以 MuseScore 會依調號決定寫法;某條音軌沒有調號時,它就自己推估調性。匯入前,先在每條音軌裡寫好正確的調號。匯入後,可以用「工具 → 用升記號/降記號重新拼寫音高」(Tools → Respell pitches with sharps / with flats)修改選取的同音高音符。
MuseScore Studio 4 還能用 MuseScore 3 的 MIDI 匯入面板嗎?
截至 2026年10月3日還不行:這個面板沒有移植過來,要求恢復它的 GitHub issue #11918 也還沒關閉。MuseScore Studio 4 保留了一項針對匯入 MIDI 的「最短音符」偏好設定,它的命令列也接受用 -M 傳入選項檔,能涵蓋原本面板的主要設定。
ScoreStarling 的轉譜結果能在 MuseScore 裡開啟嗎?
可以。匯出 MusicXML(.musicxml 或 .mxl),調號、音名寫法、休止符和聲部都會保留;如果只需要音符,匯出 MIDI 也行。兩者都要先解鎖樂譜,只需花一次 15 點。ScoreStarling 可以免費開始使用;每份轉譜結果都只是初稿,需要你用耳朵核對。