ABC記譜法

新年なのでピアノでも弾きたいが、指が動かない。昔 MML という言語で音楽を作ったことを思い出して、似たものがないか探したところ、ABC を見つけた。ABC記譜法の詳細は abcnotation.com というサイトが詳しい。VS CodeにはABC入力・プレビュー拡張機能がいくつかあるようだ。

例えば次のようなテキストファイルを作り、star.abc というファイル名で保存しておくとする。

X:1
T:Twinkle Twinkle Little Star
M:4/4
L:1/4
K:C
C C G G | A A G2 | F F E E | D D C2 |

これをMIDIや楽譜に変換する方法はいろいろあるようだ。昔からあるのは abc2midi というツールである。Macなら brew install abcmidi で abc2abc、abc2midi、abcmatch、mftext、midi2abc、midicopy、midistats、yaps というコマンドが入る。さきほどの例では、

abc2midi star.abc

と打ち込むと、star1.mid ができる。ファイル名に付いた番号 1 は、X:1 に因むもので、一つのファイルに複数の曲を入れた場合にこの参照番号で区別される。できたMIDIファイルは、MacならGarageBandで開ける。より軽いツールとしては VLC media player がある。楽譜を生成するには yaps star.abc と打ち込めば star.ps というPostScriptファイルができるので ps2pdf などでPDFに変換する。

別の方法として、LilyPond の abc2ly を使ってLilyPondに変換する方法がある(ただし abc2ly に書かれているように、abc2ly は現在サポートされておらず、将来は削除されるかもしれない)。LilyPondについては別稿で紹介する。これで

abc2ly star.abc

と打ち込めば star.ly ができ、さらに

lilypond star.ly

と打ち込めば star.midi と楽譜 star.pdf ができる。

LilyPondを経由する方法では、Unicodeや日本語も使えるが、微妙に仕上がりが異なる。例えば八分音符が連続するとABC記法では音符間にスペースを入れないと連桁(れんこう、beam、♪♪→🎵)になるが、LilyPondでは連桁がデフォルトで、\autoBeamOff\autoBeamOn で自動連桁を制御する。

ABC記法では、ドレミファソ…は C D E F G A B c d e f g a b c' d' ... で示す。A が中央のラ(≒440Hz)である。さらに高い音は c'' など、さらに低い音は C, C,, などと表す。以下のようにヘッダ部分に L:1/4 と書けば四分音符が基本となり、2分音符は C2、全音符は C4、八分音符は C/2、などと書ける。/2/ と略記できる。L:1/8 と書けば八分音符が基本となり、4分音符は C2、二分音符は C4 である。臨時記号は ^C が♯C、_C が♭C、=C が♮Cである。^^C とすれば♯♯Cになる。休符は z である。例えば4小節にわたる休符は Z4 と書ける。スラーは括弧、タイは - で表す。

以下は歌詞(w:)を含む例である。% から行末まではコメントである。

X:1% reference number
T:Symphony No. 9 (Bass Chorus)% Title
C:Ludwig van Beethoven% Composer
K:D bass% key (D-major, bass clef)
M:4/4% meter
L:1/4% unit note length
Q:2/4=80% tempo
E, E, F, D, | E, (F,/G,/) F, D, | E, (F,/G,/) F, E, |
w:Dei-ne Zau-ber | bin-den* wie-der, | Was die* Mo-de |
D, E, A,, F,- | F, F, G, A, | A, G, (F, G,/) E,/ |
w:streng ge-teilt; Al-*le Men-schen | Wer-den Br\"u-*der, |
D, D, E, F, | E, > D, D,2 ||
w:Wo dein sanf-ter | Fl\"u-gel weilt. ||

これをyapsでPostScriptに変換し、ps2pdfでPDFに変換し、pdfcropでクロップし、MacのプレビューでPNGに変換すると、次のようになる:

Beethoven Symphony No. 9 (Bass Chorus)

Fl\"ugel の部分 E, > D,E,3/ D,/ の略記で、E, D, の前の音符を長くするという意味で不等号を使う。

LilyPondに変換する場合は、歌詞のプレースホルダ * をすべて外して、ウムラウト \"u をUnicode文字 ü にする。

Br\"uder の部分(G,/) E,/)はスペースを入れているので連桁にならないはずだがLilyPondを経由すると繋がってしまうので、気になるなら *.ly ファイルを手で修正して fis4 ( g8 -) e8\autoBeamOff fis4 ( g8 -) e8 \autoBeamOn にすればいいのだろう。

LilyPondのデフォルトでは1行目がインデントされるので、*.ly ファイルの適当な場所に \paper { indent = 0\cm } を入れるか、または abc2ly で生成されたファイルの最後の方に \layout { } という空のレイアウト指定があるのでこれを \layout { indent = 0\cm } にすると、左端が揃う。ページ下部に "Lily was here 2.24.4 -- automatically converted from ABC" のようなフッタが出るが、これは tagline = "..." の行を編集すれば変えたり消したりできる。結果は(SVG出力で)次のようになる:

Beethoven Symphony No. 9 (Bass Chorus)