跳轉至

語法規格

TMD(Timebase Mark Down)是為音樂創作者、編曲人與 AI 協同設計的純文字記譜語言。它捨棄傳統排版與繪譜格式(如 MusicXML、LilyPond、ABC)的繁重標籤與大量休止符,以首調唱名(簡譜)、模組化歌曲段落與直覺的播放流程指令為核心。

最小檔案結構

每個 TMD 樂譜檔案都必須以 ::SCORE:: 標頭起始:

::SCORE::
** 歌曲名稱 **
!= 120
?= C
<4/4>

intro:Piano@|0|{
    <4*>
    1 2 3 4
}

-> intro ->#

必要與基礎要素說明

  1. 檔案起始標頭:::SCORE::(必須置於最前端)。
  2. 標題(Title):** 歌曲名稱 **(使用雙星號包覆)。
  3. 速度(Tempo):!= 120(以 BPM 為單位,支援整數或小數如 != 120.5)。
  4. 基準音高(升降 Key):?= C(設定簡譜「1」(Do)的實際音高,如 ?= C、?= D、?= A'、?= E,)。
  5. 拍號(Time Signature):<4/4>(每小節拍數 / 拍子基準音符,如 <3/4>、<6/8>)。
  6. 樂器段落區塊(Paragraph / Entry):段落名稱:樂器名稱@|起始小節|{ ... }。
  7. 播放順序(Playback Flow):-> intro ->#(以 -> 開頭,段落間以 -> 串接,-># 表示結束)。

樂譜基本資料與註解

註解(Comments)

TMD 支援多行區塊註解:

/* 這是註解內容,解析器與輸出模組會完全忽略此區塊 */

製作人資訊與 Metadata

可使用簡記前綴 ~ 或鍵值對 =~:KEY= 記錄音樂創作元數據:

~ "lyrics: 阿怪"
~ "composer: 阿怪"
~ "arranger: Martin Tang"
=~:__ALBUM__= "1998年5月"

數字「1」到底有多高?與歌曲的調性(?= 與 key=)

如果沒有學過樂理,可能聽過「這首歌是 C 調」、「這首歌是 G 調」,或唱 KTV 時說「太高了,幫我降兩 Key」。在 TMD 中,設定方式很直覺:

告訴電腦「1」(Do)聽起來是哪個音(?=)

簡譜用數字 1 2 3 4 5 6 7 代表「Do Re Mi Fa Sol La Ti」。

只寫 1 時,電腦不知道實際音高,因此需要 ?= 設定基準:

  • ?= C:表示這裡的 1 就是鋼琴中央的 C 音(最標準的 C 大調)。
  • ?= D:把整首歌往上提兩個半音,這時候唱出 1,發出的其實是 D 音。
  • ?= E,:逗號 , 代表降記號(♭)。這代表 1 對齊 E♭(降 E)。
  • ?= A':單引號 ' 代表升記號(♯)。這代表 1 對齊 A♯(升 A)。

?= 的意義

?= 就像在 KTV 遙控器上按「升 Key / 降 Key」。改變字母後,整首歌的數字 1 2 3 會整體升高或降低,完全不需重寫音符!

告訴樂譜軟體這首歌是什麼調(key=)

多數情況下,寫 ?= C 或 ?= G 就足以讓 TMD 正確播放。那為什麼還會看到 key=?

  • ?= 是給「電腦發聲」聽的:決定數字 1 在物理上有多高。
  • key= 是給「印樂譜/排版」看的:例如五線譜開頭要印幾個升降記號(# 或 ♭),或是用來標記這首歌是大調(聽起來明亮)還是小調(聽起來憂傷、暗淡)。

舉個常見的例子:

?= D
key= Bm

這代表:

  1. 旋律的基準音 1 對齊 D 音(?= D)。
  2. 但這首曲子實際上是「B 小調」(key= Bm,聽起來很哀傷憂鬱),五線譜印出來時會自動帶上兩個升記號(F#、C#)。

Note

新手建議:剛開始寫歌、不確定調性時,寫 ?= C 或 ?= G 即可,先不用寫 key=!

樂曲結構與軌道(段落定義)

TMD 採用模組化分段(Section-Based Chunking),格式如下:

段落名稱:樂器名稱@|起始小節|{
    <細分單位*>
    音樂單位...
}
  • 段落名稱(Section Name):邏輯段落名稱(例如 intro、verse、chorus、A、B、bridge、ending)。
  • 樂器名稱(Instrument Name):軌道名稱(例如 Piano、Guitar、Bass、Drums、Vocal、Strings)。常見名稱會自動對應至 General MIDI 標準樂器音色(例如 Piano 對應平台鋼琴,Drums 對應第 10 軌打擊樂組)。
  • 起始小節(Offset):樂器進入段落時的小節偏移:
    • @|0| 或 @0:段落一開始就進場。
    • @|+4|:段落開始 4 個小節後才進場。
    • @|-1|:弱起小節(Pick-up),提前 1 小節進入。
  • 固定音高屬性([pitchMode=fixed]): 若樂器接上 [pitchMode=fixed],代表該軌道使用絕對固定音高,在整首樂曲轉調(如播放流程中的 -> {?+3})時,完全不受移調影響。這常用於定音鼓(Timpani)、固定音效或打擊樂器:
intro:Timpani[pitchMode=fixed]@|0|{
    <4*>
    1__ - 5__ -
}

同一段落名稱可同時宣告多個樂器軌道,它們會在播放該段落時同時演奏:

intro:CHORD@|0|{
    <2*>
    [1] - [4] -
}

intro:Piano@|0|{
    <4*>
    1 2 3 4
}

!!! 抽象主題原型(Prototype) 若省略樂器名稱(如 Theme { <4*> 1 2 3 4 }),該段落會作為抽象音樂素材原型,供播放流程中的 S-Expression 巨集(如 canon、loop、layer)引用,不會直接輸出為實體軌道。

節奏網格與細分單位

段落內使用 <n*> 定義節奏的基礎細分長度:

  • <1*>:全音符
  • <2*>:二分音符
  • <4*>:四分音符(最常見)
  • <8*>:八分音符
  • <16*>:十六分音符

小節線 | 僅供視覺排版,解析器計算節奏時會忽略:

<4*>
| 1 2 3 4 | 5 - 5 - |

音樂單位與記譜

首調唱名與音級

以 1 至 7 代表調性唱名(Do, Re, Mi, Fa, Sol, La, Ti)。

升降記號(Accidentals)

  • '(單引號):升記號(♯)
  • ,(逗號):降記號(♭)

例如:1'(升 Do)、7,(降 Ti)。

八度標記(Octaves)

  • ^:升高一個八度(多個符號可累加,如 1^^)
  • _:降低一個八度(多個符號可累加,如 1__)

語法順序規則

必須先寫升降記號,再寫八度記號!

  • 正確:1'^(升 Do 高八度)、7,_(降 Ti 低八度)
  • 錯誤:1^'、7_,(解析器無法識別)

休止符與延音線

  • 0:休止符(長度為 1 個基礎單位)。
  • -:延音線(Tie)或時值延長線,將前一個音符、和弦或休止符延長 1 個基礎單位。
    • 在 <4*> 網格中:1 - 為二分音符(2 拍),1 - - - 為全音符(4 拍)。

和弦標記

和弦以方括號 [...] 包裹: * 唱名級數和弦:[1]、[6m]、[4]、[5]、[2m7]、[6_m] * 字母絕對和弦:[C]、[Cmaj7]、[Am]、[Dm7-5]、[G7#9]、[Csus4]

和弦亦可搭配延音線維持時值:[Cmaj7] - - -。

複音與雙音(Multi-Notes / Dyads)

使用 + 在同一拍位疊加多個音符(如小提琴雙音、鋼琴雙聲部合音):

1+3        /* 拍位上同時彈奏 1 與 3 */
1+5--      /* 同時彈奏 1 與 5,並以延音線延長時值 */
1^+3       /* 支援不同八度組合 */

連音群組(Tuplets)

連音使用 (音符...)%(時值) 表示: * (1 2 3)%(--):三連音(在 2 個基礎拍的時間內均分演奏 3 個音)。 * (7, 1)%(--):二連音。

打擊樂與鼓組(Channel 10 Drums)

樂器名稱為 Drums、Percussion 或 Groove 的段落,會自動導向 MIDI 第 10 軌標準鼓組:

  • B / D:大鼓(Bass Drum / Kick)
  • S:小鼓(Snare)
  • X:閉合腳踏鈸(Closed Hi-Hat)
  • O:開合腳踏鈸(Open Hi-Hat)
  • T:中低音通通鼓(Tom)
  • C:碎音鈸(Crash Cymbal)
  • 小寫字母(b, s, x 等)代表輕擊/幽靈音(Ghost note)。

定音鼓(Timpani)與一般鼓組的差別

一般爵士鼓組是「無固定音高」的打擊樂器,但定音鼓是有固定音高(旋律性)的樂器(General MIDI Program 47)。

  • 定音鼓負責低頻打擊聲部,記譜常用低八度音符如 1__ 或 5__。
  • 在管弦樂配置中,定音鼓通常調校在特定的基音,若不希望隨著歌曲進行轉調(如 -> {?+3})改變音高,建議在軌道宣告時加上 [pitchMode=fixed]:
chorus:Timpani[pitchMode=fixed]@|0|{
    <4*>
    1__ 0 5__ 0 | 1__ - - - |
}

中途改變音調、速度與強弱記號

可在小節或音符之間插入大括號 {...} 改變音樂狀態:

  • 速度調整:
    • {!= 140}:絕對速度切換為 140 BPM。
    • {!+ 10} / {! -5}:相對速度微調。
  • 轉調與首調中心:
    • {?= D}:絕對首調基準切換為 D。
    • {?+ 2} / {?- 2}:相對移調半音數(+2 代表升大二度)。
  • 強弱力度記號(Dynamics):
    • 支援 {pp}、{p}、{mp}、{mf}、{f}、{ff} 等,控制後續音符的播放 Velocity 力度與樂譜強弱標記。
  • 拍號變更:
    • {<3/4>}:在小節邊界改變拍號。

樂曲行進(Playback Flow)與 S-Expression 巨集

播放順序定義歌曲的演奏流向與轉調:

-> intro -> verse -> chorus -> {?+2} -> chorus -> ending ->#

支援的行進指令

  1. 段落引用:-> 段落名稱
  2. 移調指令:-> {?+1}(升半音)、-> {?-2}(降全音)、-> {?= G}(移至 G 調)
  3. S-Expression 巨集(適合卡農、複調、聲部堆疊與對位法編排):
  4. (canon 主題名稱 (樂器1 樂器2 ...) 小節間隔):自動以卡農錯位進場。
  5. (loop 主題名稱 樂器 重複次數):固定低音或副旋律循環。
  6. (layer 表達式1 表達式2 ...):多聲部平行重疊播放。
  7. (seq 表達式1 表達式2 ...):循序播放。
  8. (vary 主題名稱 變形參數...):旋律動機逆行、倒影或移調。
  9. 結束標記:->#(必備的終止符)。