2015年10月29日木曜日

楽譜のメタ情報

MuseScore、MusicXML でのメタ情報について

まず前置きとして、ここでのメタ情報は、作詞・作曲者、作譜に用いたソフトウェア等の情報を指します。

MusicXML 3.0 の規格では、主にidentification要素として定義されています。

MuseScore では、メニューの[ファイル][情報...]で確認・編集できます。
メタ情報は、[スタイル][一般][ヘッダ、フッダ] から、タグ名を指定して譜表に反映させる事が可能です。
MuseScoreの情報は、ハンドブックに詳細解説在り。(日本語)ハンドブック/スコア情報

そして、今回の本題、
MusicXMLとMuseScore双方に、独自のメタ情報を扱う仕組みはあるのですが、
MuseScore では、独自に定義した情報の import/export へは対応していません。[2015/10/29現在]

Patch

そこで、インポートに対応する Patcheを書いてみました。(文字のエスケープは考慮してません)

// https://github.com/musescore/MuseScore/blob/master/mscore/importmxmlpass1.cpp

else if (ee.tagName() == "miscellaneous") {
    for (QDomElement eee = ee.firstChildElement();
            !eee.isNull(); eee = ee.nextSiblingElement()) {
        if (eee.tagName() === "miscellaneous-field")
            score->setMetaTag(eee.attribute(QString("name")), eee.text());
    }
}

実装の自己分析

  • 名前空間がない為、タグ名の衝突を避ける手段が必要。
  • 接頭子を付けるなどして、運用で注意すればいいが、汎用的な機能の実装としては問題あり。
    メタ情報のキーの一覧を所得するとき、独自のものかどうかを区別できない。
  • 率直な解決策としては、別の格納場所を用意すればいいだけかもしれないけど、
    MuseScoreで対応している他のフォーマットのimport/exportとも折り合いを付ける必要がある。
    データ構造をMusicXMLのみに特化というわけにはいかないので、作業コストが高くなりそう。
  • 基本機能として実装してしまうと、多くの利用者に影響が在り、
    場合によっては、利用者の意図しない仕様変更になってしまう懸念があります。

機能としては数行で対応できる事なのに、未実装なのを見ると、仕様が固まってないのかなという感じ。
開発メーリングリスト等は読んでないので、実際のところどうなのかはわかりません。個人的な雑感です。
何れは、対応されるはずですが、今回はこのアプローチは見送ります。

MuseScore Plugin

次に、プラグインで扱う方法を模索。

機能的には同じ事をするのだけど、プラグインとして実装した場合は、
プラグイン利用者のみが注意すればいい為、影響は軽微。勝手に独自拡張出来るのが利点です。

プラグインからメタ情報を設定する方法。(code snippet)

  // メタ情報を設定
  curScore.setMetaTag("tagName", "text");

  // メタ情報を所得
  var text = curScore.metaTag("tagName");

今回はここまで。後は、残りの作業を書き留めておく。

TODO

  • プラグインからMusicXMLを読み込む。MuseScore::readScore(fileName)
  • プラグインからXMLを読書。DOMパーサが提供されていたはず。
  • メタ情報のキーの一覧の所得方法

0 件のコメント:

コメントを投稿