- 小さなモバイル画面でA4 PDFを拡大しながら演奏する音楽家のために、Web上で流動的かつレスポンシブな楽譜レンダリングが必要
Scribeプロトタイプ
- 以前、JSONからSVGを出力するScribeという音楽レンダラーをプロトタイプとして制作した
- 当初の目標はレスポンシブな音楽レンダラーを作ることだったが、複雑なマルチパスレイアウトエンジンを書く必要があり、進展が難しかった
- その後、CSS Gridをプロジェクトに導入し、Scribeで扱っていたレイアウト問題の解決策になり得ると感じた
.staveクラス
五線譜上に音高を配置
.barクラスと拍
拍に記号を配置
- 今度はdata-beat属性を使って要素に拍を割り当て、CSSルールを使って拍をグリッド列にマッピングする
- CSSマップは1/24拍ごとに1つの規則で構成される
- 属性の
^=開始セレクターを使うと、規則に誤差許容性を持たせられる
- .staveクラスと組み合わせることで、data-beatを1〜5の間の拍に、data-pitchを音名に設定し、拍と音高ごとに記号を配置できる
流動的でレスポンシブな楽譜
- こうした複数の小節をflexboxコンテナに入れると、レスポンシブな楽譜を表示できる
- まだ欠けている部分は多いが、出発点としては良い基盤だ
- すでにオンライン音楽レンダラーよりはるかに優雅に改行される
音符間のスペース
- より近い時間に発生する音符の符頭は、やや近く描画される
- これは小さなcolumn-gapによって生まれる微妙で意図的な効果で、記号要素がスロットに入るための一種の時間的な「エーテル」として機能する
- 列自体は符頭がなければ幅0だが、拍的に離れたイベントの間にはより多くの列間隔(1拍あたり24個)があるため、距離が広がる
- 記号のマージンを調整して一定の間隔を制御できる
音部記号と拍子記号
- 垂直方向と水平方向の間隔に別クラスを使った理由は、他方に触れずに片方だけ差し替えられるからだ
- 同じメロディをヘ音記号で表示したい場合は、.staveクラスを、同じdata-pitch属性をヘ音譜表の行にマッピングするbass-staveクラスに置き換えればよい
- CSSで
data-duration="5"を.barの120グリッドテンプレート列にマッピングすれば、同じ五線譜に5/4拍子記号を与えられる
コードと歌詞
- CSS Gridを使えば、楽譜グリッド内で他の記号も整列できる
- コードや歌詞、ダイナミクスなどを時間指定されたイベントに合わせて整列・拡張できる
符尾
- 符尾、コード、一部の長い休符は、data-duration属性を
grid-column-endのspan値にマッピングすることで列にまたがらせる
スケーリング
- システム全体はem単位でサイズ指定されているため、
font-sizeを変更するだけで拡大縮小できる
FlexとGridの限界
- 完璧なシステムではない。限界点:
- CSSは改行時に新しい音部記号や調号を自動配置できない
- 新しい行の新しい音符に連桁をつなげることができない
- 傾いた符尾はGridが配置した後でないと正確な位置が分からず、整列が難しい
- 完全に仕上げるには多少の後処理JavaScriptが必要だが、CSSがレイアウト作業の大半を処理するため、JavaScript側で行うレイアウト作業は大幅に減る
カスタム要素
- この新しいCSSシステムを中心にインタープリタを書き、要素にラップした
- まだ本番向けではないが、レスポンシブなリードシートをレンダリングし、ドラム譜を記譜できるため、興味深く有用だ
- コンテンツのデータ、src属性で取得したファイル、要素の
.data属性に設定したJSオブジェクトから楽譜をレンダリングする
- 現在の開発ビルドはWebページに取り込んで試すことができる
今後の計画
- Scribe 0.3の改善点に加え、長期的に調査したい機能:
- SMuFLフォント対応 - 楽譜記号に使われるフォントを変更
- ネストされたシーケンス対応 - マルチパート曲を有効化
- 分割譜表レンダリング - 1つの譜表に複数パートを配置
- マルチ譜表レンダリング - 複数の整列した譜表に複数パートを配置
GN⁺の意見
- Web上で楽譜を流動的かつレスポンシブにレンダリングすることは、音楽家と音楽愛好家の双方にとって非常に有用そうだ。小さな画面でPDF楽譜を拡大縮小しながら見る不便さを解消してくれるだろう
- CSSのGridとFlexレイアウトを活用したアプローチが興味深い。複雑なレイアウトエンジンがなくても、CSSだけでかなり多くの部分を解決できることを示す良い例だ
- ただし楽譜の特性上、CSSだけでは限界がある部分もある。改行時に自動で音部記号や調号を配置したり、連桁を自動接続したりするような、音楽的文脈の理解が必要な部分ではJavaScriptの助けが必要になるだろう
- リードシートのレンダリングやドラム譜対応など、すでにかなり多くの部分を実装しているというので、近いうちに十分実用的な水準まで改善されるかもしれない。オープンソース化されて開発が継続すれば、MuseScoreのような既存の楽譜エディタの良い代替になる可能性もある
- 今後計画しているSMuFLフォント対応、マルチパートおよびマルチ譜表レンダリング対応などの機能が実装されれば、楽譜表現の完成度は大きく高まりそうだ。期待できるプロジェクトだ
2件のコメント
そうされる理由があるはずですよね
Hacker Newsの意見
SoundsliceというWebベースの楽譜レンダリングサービスを10年以上開発しており、2014年に初の「レスポンシブ」なWeb楽譜レンダリングを実装したSoundsliceのレスポンシブ楽譜の例: https://www.soundslice.com/slices/zzNlc/[...]) 構文が印象的だった。例:.stave > [data-pitch^="A"][data-pitch$="5"] { grid-row-start: A5; }Soundslice、Sibelius Cloud Publishingなど、ブラウザでスケーラブルな楽譜を実現する別のツールがあるLilypondはこうした複雑な表現で柔軟性が実証されている<scribe-music>カスタム要素にも期待しているVexFlowを Web Components でラップしたプロジェクトを進めていたが、保守されなくなった: https://github.com/PolymerLabs/vexflow-elements/blob/web-components/demo/index.htmlLilypond(lilypond.org) の代替が出てきたのはよいが、記譜法は非常に複雑なので、簡潔さの利点は長続きしなさそうだAsciidoc愛好家なら、LilypondをAsciidocツールチェーンに統合しやすい。DocBook PDF パイプラインで使っており、出力はかなり良好だ。TeXに似ているImpro-Visor(https://github.com/Impro-Visor/Impro-Visor) のぎこちない楽譜機能をこれで置き換えられるか気になる