← 回到轉換器
# MID → FEM 轉換規格(逆向分析結果)
對象:SEGA TOYS Grand Pianist(2007)專用 `.fem` 檔。
依據:9 組可靠 mid/fem 配對(lemontree、dona、nevada、sonic、nemo、whisper、laputa、JustDance、numb)逆向驗證;其中 7 組達 (onset, pitch) 100% 逐音吻合。
sonic 組(fem 對 mid 有 0.03% 線性伸縮)與 numb 組(fem 整體恆早 4 tick)判定為來源版本差異,titanic 組同樣因來源版本不同排除——三者的 fem 內容本身仍符合本規格。
2026-07 修正:tick 換算為**無條件捨去**(floor)而非四捨五入;開頭裁剪為**依拍號裁掉完整的開頭空小節**而非強制第一音 onset=0。改用此二規則後,先前歸因於「±1 tick 對位誤差」的力度差異與大部分「未破解削減」隨之消失。
## 1. 容器格式
`.fem` 實體是標準 MIDI 檔(SMF),規格固定:
| 欄位 | 值 |
|---|---|
| Format | 0(單軌) |
| PPQ(division) | 48 |
| Tempo | 500000 µs/拍(=120 BPM),固定一個,無 tempo map |
| 音軌 | 1 條,所有事件在 channel 0 |
## 2. 時間軸轉換
1. 來源 tick 依比例換算:`fem_tick = floor(src_tick × 48 / src_PPQ)`(**無條件捨去**;用四捨五入會產生 ±1 tick 錯位,7 組檔案改用 floor 後 100% 吻合)。
2. 開頭裁剪:**依來源拍號裁掉完整的開頭空小節**(無拍號時預設 4/4)。弱起(anacrusis)會保留——例如 whisper(4/4)第一音在第 7.5 拍,fem 裁 1 小節後仍保留 168 tick 的弱起位移;dona(6/8)裁 1440 tick;lemontree(4/4)裁 768 tick。
3. 來源的 tempo map、拍號、速度變化全部捨棄——播放節奏完全由「tick × 固定 120 BPM」決定。
來源若有漸快/漸慢,轉換後一律消失。
## 3. 音符規則
- **時值:全部固定 32 tick**(在 48 PPQ / 120 BPM 下 ≈ 167 ms)。來源音符長短完全不保留,推測對應電磁閥擊弦的固定觸發脈衝。
- **Note-off:固定 `0x80`、力度 64**(不用 note-on vel 0)。
- **力度:保留來源 note-on 力度**;同一 onset 同音高有多個來源音符時,取最大力度(floor 換算修正後 7 組檔案逐音吻合;dona 有 1 個孤例——同 (onset,pitch) 的兩個力度不同的音被原工具同時保留,1/13000 音,視為原工具異常)。
- **同 onset 同音高去重**:重複音符只留一個。
- **Channel 9(鼓)整軌丟棄**;其餘 channel 全部併入 channel 0。
- 音域:觀察到的輸出都在鋼琴 88 鍵(21–108)內;越界如何處理無樣本可驗證。
## 4. 其他事件
全部刪除:Program Change、CC(含踏板 CC64、音量 CC7/CC11)、Pitch Bend、Aftertouch、SysEx、歌詞/文字 meta。輸出檔只剩 `0x90` / `0x80` / tempo meta / EOT。
## 5. 音符削減(仍未破解)
原工具的輸出音符數比「依上述規則轉換」少 **5–19%**(lemontree 2121 vs 2527、dona 2203 vs 2662、nemo 2229 vs 2467、whisper 1214 vs 1332、numb 1081 vs 1167)——它真的會刪音,且不是 rounding 錯位。
已用決定性模型逐一排除:複音上限(這些檔案同時發聲數從未超過 20,cap 完全沒觸發)、onset 速率限制、同鍵重觸發冷卻、八度/音程過濾、力度優先——都無法重現被丟音符的選擇。
結論:這是原轉換工具的自動編曲啟發式(可能含演奏性/機構負載評估),**需要原工具(GP_CHG 或官方軟體)才能確認**。被丟的多為密集段落的內聲部。
## 6. 轉換流程總結
```
來源 mid(任意 format / PPQ / tempo)
→ 合併所有軌,丟 ch9
→ tick × 48/PPQ 無條件捨去(floor)
→ 依拍號裁掉完整的開頭空小節(保留弱起;無拍號視為 4/4)
→ 同 onset 同音高去重(取最大力度)
→ 音符削減(啟發式,未破解,5–19%)
→ 時值一律改 32 tick,note-off 0x80 vel 64
→ 寫出 Format 0 / PPQ 48 / tempo 500000 單軌檔
```
> 本規格已實作於線上轉換器的「標準模式」(`web/js/convert_std.js`),對 7 組可靠配對達 100% 逐音吻合(削減啟發式除外——我們保留那些音,故輸出音數略多於原廠 fem)。