2022.03.01

abc… 文字列から音楽を自動生成!

本投稿記事は,FU_box(福岡大学公認クラウドストレージ)に格納した「動画,画像,ファイル」をブログ内に呼び込む形(=レンダリング)で構成しています。

これらのコンテンツはブラウザで「ページを再読み込み(リロード)」することではじめて閲覧可能となります。

本投稿記事の中にある全てのコンテンツを御覧くださる際は,お手数ですが,お使いのブラウザで「ページを再読み込み」なさってください。

Mac の Safari ブラウザでは,これらのコンテンツを(現時点では)閲覧できないようです。


目次

なぞなぞ: c e g b c d c って何の曲?

c e g b c d c」はある有名なピアノ・ソナタ(第1楽章)の冒頭に現れる第1主題を記したつもりですが,何の曲かお分かりでしょうか?

ヒント: 幹音名

次の表は「英語,ドイツ語,イタリア語,日本語」における「幹音」(♭ や ♯ のような変化記号のついていない音)をまとめたものです(なお,ドイツ語音名の「B」は「シのフラット」を表し,「シ」に相当する幹音は「Hハー)」であることに注意!)。

英語 C D E F G A B C
ドイツ語 C D E F G A H C
イタリア語 Do Re Mi Fa Sol La Si Do
日本語

なぞなぞの答

c e g b c d c」が英語による幹音名表記であったとすれば,これは「ド ミ ソ シ ド レ ド」を表していたことになります(注: 日本語で音をメロディとして口ずさむ時はイタリア語音名の「ド レ ミ」を使い,日本語音名で歌う人はいません。逆に「調性」を表現するときは「ハ」長調のように日本語音名を使い,これを「ド」長調と表現する人はいません)。

「ド ミ ソ シ ド レ ド」は,「W. A. モーツァルト」作曲の「ピアノ・ソナタ第16番(旧版の『モーツァルト全集』では15番!)」(KV 545; Köchelverzeichnis ケッヒェル番号 545 番)第1楽章冒頭に登場する音列です。

表現の幅を広げるには

でも,私は本来「ドーミソ シードレド」と表現したかったのです。つまり,モーツァルト作曲のチャーミングな第1主題をもっとちゃんと歌いたかったのです!

こうしたことを反映させたいのであれば,先ほどの「c e g b c d c」という記法では「限界がある」ことが分かります。では,次の記法ではどうでしょうか?

c2+ e4 g | b4d- c1 d c4 r4 |
c8 g+ e g c- g+ e g | d g f g c- g+ e g |

「a b c d e f g(ラ シ ド レ ミ ファ ソ)」アルファベット文字以外に,「2, 4, 8」といった数字や「+, , |」といった記号が新たに加わりました。なにやら謎めいていますが,「2 は2分音符,4 は4分音符,8 は8分音符」(さらに 0 は全音符,1 は16分音符,3 は32分音符,6 は64分音符)という「音の長さ」を,「r は休符(Rest)」を,「+ はオクターブ上,- はオクターブ下,| は小節線」をそれぞれ表していると見るならどうでしょう? この際,音楽(を表現した文字列)は「左から右へ」流れ,音の高さの基準は「中央ハ(一点ハ)」(=いわゆるピアノの真ん中のド),「後」の音は「前」の音(環境)からの「相対的」位置を示している,という「ルール(=構文規則)」だけを前提としましょう。

すると上の文字列は

ドー | シー (4分休符) |
| ファ |

と歌えるようになります。今回は,欲張って「伴奏部」もつけました。

つまり,上段に「ト音記号」下段に(通常)「ヘ音記号」が付いたピアノ楽譜(=大譜表)をイメージし,上段・下段の文字列(=音符)が対応している(=上段が終わってから下段へと音が進行するのではなく,上段・下段の音が同期して鳴る)ことを「スペース」も使いながら視覚的にも表現してみました。すると,先の「c2+ e4 g b4d- c1 d c4 r4 …」といった文字列は

  • 上段では
    • c2+ は「ドの2分音符で,(出発点となる)真ん中のドよりオクターブ上」,
    • e4 は前音から「相対的に直近のミ」(つまり3度上のミ)で,前音は(音の長さが)2分音符でこのまま数字を省略すると2分音符のままと解釈されるので「4 を追記し4分音符であること」を明示,
    • e4 の後の g は(e4 の影響を受け,4 という明示がなくとも)「(e4 直近=3度上の)ソの4分音符」,
    • b4d- に含まれる「d(Dotted)」は(語頭でないため「レ」ではないことに注意!)「付点音符」を表し「b4d は付点4分音符」となり,さらに「-」が付加されているので(前音直近=3度上のシではなく)「6度下のシ(=前音直近のシのオクターブ下)」,
    • c1 と d は「ド レ の16分音符」,それぞれ「b4d- の 1度,2度上」,
    • c4 は前音直近(=dの1度下)の「ドの4分音符」,
    • r4 は「4分休符」(前音が4分音符なので,r4 の 4 はなくても良いが,「4分休符」であることがすぐ分かるように,あえて付けてみた),
  • 下段では
    • c8 は(出発点となる)真ん中の「ドの8分音符」,
    • g+ は(前音直近4度下のソのオクターブ上=)「5度上のソの8分音符」,
    • e はその「直近3度下のミの8分音符」,
    • g はその「直近3度上のソの8分音符」,
    • c- はその(直近4度上のドのオクターブ下=)「5度下のドの8分音符」,
    • g+ e g は上の繰り返し,
    • d は前音 g の「直近4度下のレの8分音符」,
    • 以下,同様・・・

といった具合に「音の絶対的な高さと長さとを一意(=ユニーク)に解釈できる」ようになります。曖昧な箇所がなく一意に解釈できるのであれば,これは「コンピュータによる自動処理に委ねることができる」ことを意味します。

ソースコードから「楽譜」と「MIDI」を自動生成する方法

実は,上に記した c2+ e4 g b4d- c1 d c4 r4 … といった記法は,TeX 関連プログラムの「構文規則(syntax)」に則った記法となっています。

具体的には TeX(=組版に特化したプログラミング言語,ソフトウェア)で楽譜を作成するための拡張マクロパッケージである MusiXTeX に処理を渡す「前処理プログラムpreprocessor)」である PMX のさらなる前処理プログラム M-Tx の構文規則に則り書いています。

なお,これらは全て「フリー無償自由)」かつ「オープンソース」のプログラムで,OS の別なく(= Windows, Mac, Linux, 等々のいずれでも OK)誰でも自由に使えます。

MusiXTeX では,音符・休符に留まらず曲想奏法に至る表現も全て可能となっているため,構文規則がかなり複雑です。そのため,楽譜作成のためのソースコードの記述を幾分なりとも簡便にするために PMX や M-Tx が開発された,という経緯があります。

M-Tx では「歌曲」も取り扱えます(=音楽テキスト)との「同期処理」をしてくれます)。なお,多段譜表の楽譜を作成する場合,PMX では「低音部から高音部」の順に「上から下」へとソースコードを記述しますので,やや直感に抗うユーザインタフェースになっていると言えるかも知れません(音楽を「作曲」する場合は,逆に,低音部から高音部へと音楽を積み上げて行く方が理にかなっているのかも知れません)。一方,M-Tx では「詩=テキスト」を取り扱うこともあるためでしょうか,「高音部から低音部へ,この順で,上から下へ」とソースコードを書いていく分かりやすい仕様となっています。

M-Tx や PMX のソースコードからは,TeX で組版された美しい「楽譜」(PDF形式)と「MIDIMusical Instrument Digital Interface)」ファイルを自動生成させることができます。MIDI ファイルはコンピュータで自動演奏させることも可能です。

M-Tx や PMX の構文規則に則ったソースコードから成るファイル(=単なるテキストファイルです)からは,以下の工程を経て「楽譜」(PDF形式)や「MIDI」ファイルが自動生成されます。ファイル名は任意ですが,拡張子は mtx(M-Tx の場合),pmx(PMX の場合)とします(以下の例では file.mtx もしくは file.pmx をファイル名としています)。

  1. prepmx file(M-Tx ファイルを前処理して PMX ファイルを生成)
  2. pmxab file(PMX ファイルを前処理して MusiXTeX ファイルを生成; この段階で同時に MIDI ファイルも生成される)
  3. etex file(MusiXTeX ファイルを処理して「第1段階組版楽譜」を生成する; この段階では「各音符間の適切な間隔」が楽譜に反映されていない)
  4. musixflx file(「各音符間の適切な間隔」をプログラムが自動計算し,結果を「補助ファイル」に書き出す)
  5. etex file(補助ファイルから「各音符間の適切な間隔」を読み取り「第2段階(=最終)組版楽譜」を完成させ,これを「中間ファイル」へ書き出す)
  6. dvips file(中間ファイルを PostScript ファイルへ変換する)
  7. ps2pdf file.ps(PostScript ファイルを楽譜の最終出力である PDF へ変換する)

「音楽自動生成プログラム」実行の際の録画

最後に

  1. M-Tx ソースコード(k545_1_1-12.mtx): W. A. モーツァルトピアノ・ソナタ第16番KV 545),ハ長調第1楽章 1–12 小節
  2. PMX ソースコード(k551_1_1-23.pmx): W. A. モーツァルト交響曲第41番KV 551),ハ長調,『ジュピター』,第1楽章 1–23 小節
  3. PMX ソースコード(invention_01.pmx): J. S. バッハインヴェンション第1番BWV 772),ハ長調

から「楽譜と MIDI ファイルを生成させ,楽譜(PDF)を開き,MIDI を自動演奏させる」プログラム(簡単なシェルスクリプトです)を走らせた様を録画した動画を掲げます。動画の再生時間は 4 分 31 秒です。

これらのソースコードの中では,オリジナル楽譜における音楽表記を忠実に再現するため,先に記した c2+ e4 g b4d- c1 d c4 r4 … といった記法「以外」のマークアップも全て施してあります。

プログラムでは,ターミナル上でソースコードの一部をそれぞれ表示させ,それらが「単なるテキストファイル」であることを確認していただいた後,ちょっと時間を置いて楽譜(PDF)を開き,MIDI を演奏させます。

おまけ」として,動画の最後に W. A. モーツァルト「ピアノ・ソナタ第16番(KV 545),ハ長調,第1楽章 1–12 小節」の「楽譜表示と自動演奏をウェブ上で実現」する例も収めてあります。説明は省きますが,JavaScript(の abcjs ライブラリ)というプログラミング言語のソースコードを HTML に組み込めば,こうしたことを実現できます。

もちろん,JavaScript における音楽の記法は TeX 関連プログラムのそれとは異なっていますので,興味のある方は

ページを御覧ください。そして,ウェブブラウザ等を使って,このページの「ソースコード」を御覧くだされば,JavaScript の楽譜表示ライブラリ abcjs を使った楽譜の表記法を御確認いただけます。ソースコードの 26–42 行目です。

なお,J. S. バッハ「インヴェンション第1番(BWV 772),ハ長調」と W. A. モーツァルト「交響曲第41番(KV 551),ハ長調,『ジュピター』,第1楽章 1–23 小節」の MIDI 音源は,「福岡大学人文科学研究科独語学独文学専攻」の「オープンキャンパス用紹介動画」の中でも使っています。宜しければ「独語学独文学専攻紹介動画」も御覧ください。

ソースファイルなど(自由にダウンロード可)

以下のクラウドストレージ(=ファイル置場)に,今回のブログ記事で御紹介したソースコードをはじめ,生成された楽譜 PDF や MIDI 音源の全てが置いてあります。

(コピーや再加工,再配布も含め)自由に御利用ください。以下のファイル群が格納されています。

  1. 20220228_make-music.mp4(動画)
  2. invention_01.mid
  3. invention_01.pdf
  4. invention_01.pmx
  5. k545_1_1-12.mid
  6. k545_1_1-12.mtx
  7. k545_1_1-12.pdf
  8. k551_1_1-23.mid
  9. k551_1_1-23.pdf
  10. k551_1_1-23.pmx
  11. make_music.sh