開発ノート
描画エンジンを自作した話とその代償
譜面を描くエンジンを自作したことで、アプリは軽くなり、記譜を自分たちで直せるようになりました。その代わり、古いGuitar Pro形式は開けなくなりました。
2026年9月19日
唯一の真実と境界
Tonographは、編集モデルを唯一の真実とし、目にしている紙面も、聞こえている音も、誰かに渡すファイルも、すべてそこから導くという考え方で作られています。下流にあるものをその場で書き換えることはなく、必要になるたびにモデルから作り直します。
この設計には境界があります。片側にモデルと編集コマンドがあり、もう片側にそれを記譜に変えるエンジンがあります。当初はオープンソースのエンジンを使っていました。これは意図した構成で、モデルに手を入れずにエンジンを差し替えられるよう境界を設けていました。
結局、差し替えました。
差し替えた理由
きっかけは2つの要求でした。
1つ目は、読み込みと書き出しの往復です。.gpファイルを開いて2小節だけ直して書き戻したとき、触っていない部分は1バイトも変わらず、触った部分は意図したとおりでなければなりません。ベンドは曲線のまま、装飾音は旗のまま、ワーミーもセーハも運指もすべて保つ必要があります。これを正しく実現するには読み込みと書き出しの両方を自分で実装する必要があり、誰かのファイルを上書きする前に「この形式では保存できないもの」を具体的に示せなければなりません。
2つ目は紙面です。エディタは記譜の上に、カーソル、選択範囲、辻褄の合わない小節の印、入力途中の数字を描き足します。そのためには31小節目が画面のどこにあるかを知り、そこへ正確に描く必要があります。そのたびに、組版を握っている側へ問い合わせることになります。
そこで、組版、描画、.gpの読み込みと書き出し、再生のイベント列、PDF、AI連携が返す記譜画像まで、すべて自分で書きました。数か月かかりました。
得られたもの
数字で示せる成果は、アプリが軽くなったことです。描画側のコードはおよそ3分の1減り、13MBの依存ライブラリが、それに付随していたものごとバンドルから消えました。
より大きな成果は、説明すると地味ですが、日々使っていると実にありがたいものです。記譜が間違って表示されたとき、自分で直せるようになりました。回避策を考えたり修正を待ったりするのではなく、組版のコードを開いて規則を直せます。1年ほど「既知の制限」として並んでいた細かな見苦しい項目の一覧が、コミットの一覧に変わりました。
失ったもの
ここは正直に書いておきます。
Guitar Proはファイル形式を2度変えています。現行の.gpはバージョン7と8が保存する形式で、Tonographが実装したのはこの形式です。古い形式(.gp3・.gp4・.gp5・.gpx)はまったく別のバイナリ表現で、Tonographでは開けません。
.gp5のファイルを多く持っている人にとって、これは実際の損失です。インストールしてから気づいてもらうより、ここではっきり書いておきます。変換そのものは難しくなく、Guitar Pro 8で開いて保存し直すだけです。それでも手間は1つ増えますし、Guitar Proが手元に必要です。手順は別のページにまとめてあります。
(2026年9月29日追記)Tonograph 1.1.0でGuitar Pro 6の.gpxを開けるようになりました。.gpxは.gpと同じ種類の譜面データを別の入れ物に収めた形式だったので、同じ読み込み処理で扱えます。.gp3・.gp4・.gp5は引き続き変換が必要です。
5つの形式をそこそこに扱うより、1つの形式を正確に扱うことを選びました。これは得るものだけの選択ではなく、はっきりとしたトレードオフです。そして、その代償を払うのはいちばん古いファイルを持っている人たちです。