scorethai script

備考

この方式は止めました。以降は rst版 で。

タイ式楽譜のhtmlファイルを生成するpythonスクリプト。

1   ファイル

scorethai.py
スクリプト本体。
tagdata.py, scorethai_yaml.py
スクリプトの一部、ライブラリ。
page-sample.yaml
実行シーケンスのサンプル。
format.yaml
フォーマット指定のサンプル。
song-sample.yaml, song-khaen.yaml
楽譜データのサンプル。
scorethai-simple.css, scorethai-khaendiao.css
スタイルシートのサンプル。
sample1.html, sample2.html
出力されるhtmlファイルのサンプル。
scorethai.zip
上記全ファイルのアーカイヴ。

2   サンプルの実行

上記のファイルがあるディレクトリで:

> python scorethai.py page-sample.yaml

と実行するとsample1.htmlとsample2.htmlが生成される。

sample1.html
ポンランのスタンダード曲を2曲。最も単純な譜面で、典型的な一行8小節のもの。
sample2.html
ケーンの独奏を採譜したものを1曲。いくつか細かい記号を使ったもの。

3   入力ファイルの書式

入力ファイルは全てYAML形式なので以下の点に注意。

3.1   実行シーケンスの書式

実行する命令は順番に意味があるので、シーケンスで記述する。 このスクリプトでは単純に、トップのシーケンスは全て実行シーケンスと見なし、その要素のマッピングキーを命令と見なす。

page-sample.yaml サンプル:

# 基本フォーマットをロード。
- load: format.yaml

# 楽譜ファイルをロード。このファイルにはポンラン楽団のスタンダード曲の譜面が2曲入っている。
- load: song-sample.yaml

# ページ用データをセットして。
- data:
    title: sample 1, simple score thai
    css: scorethai-simple.css
    output: sample1.html
# ページ出力。ここでは1ページ目に2曲出力。
- page:
  - LaiPongLang
  - LaiToeiKhong

# 次の楽譜ファイルをロード。後は同様。
- load: song-khaen.yaml
- data:
    title: sample 2, Khaen solo
    css: scorethai-khaendiao.css
    output: sample2.html
- page: MaengPhuTomDok-20060704

3.1.1   load命令

- load: ファイル名
- load: [ファイル名,... ]
- load:
  - ファイル名
  - ...

ファイル名で示されるファイルを読み込む。ファイル名のシーケンスならそれらを順番に読む。 インクルードのようなもの。

3.1.2   data命令

- data: { 変数名: 値,... }
- data:
    変数名: 値
    ...

後のpage命令でページ出力をするときに使うパラメータ変数の設定。 書式指定次第でどのような変数も使用可能。 以下のtitleとcssは、サンプルの書式format.yaml(後述)内で %(title)s や %(css)s として参照している。 変数名は書式に追加すれば増やせるが、dataでセットしてないとエラーで止まる。

title
ページのタイトルとして使われる。
css
スタイルシートのフィアル名。
output
出力ファイル名。

これは書式指定ではなくスクリプト自身が使用する。 この変数はページの出力が終わったらクリアされる。

3.1.3   page命令

- page: 楽譜ID
- page: [ 楽譜ID,... ]
- page:
  - 楽譜ID
  ...

指定した楽譜IDの楽譜を上記outputで指定したファイルに出力する。 楽譜IDが複数ならシーケンスで指定する。楽譜IDは!song(後述)の記述のid:で指定したもの。

3.2   フォーマット指定の書式

出力データをタグ付けする為のタグの定義。

format: { 変数名: [ 開始タグ, 終了タグ ],... }

定義必須の変数名は以下のもの。

page
1ページ出力時に囲むタグ
table
1曲出力時に囲むタグ
line
一行出力時に囲むタグ
cell
一小節出力時に囲むタグ
text
テキスト行を囲むタグ
mark
記号を囲むタグ

例えばformat.yamlサンプルの最初:

format:
  page:
  - |
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    [省略...]
    <title>%(title)s</title>
    <link rel="stylesheet" type="text/css" href="%(css)s" />
    </head>
    <body lang="ja" xml:lang="ja" dir="ltr">
  - |
    </body>
    </html>

ページ出力時にこの二つのデータで囲まれる。 ここで %(title)s は実行シーケンスのdata命令でセットされた titleの値に、 %(css)s はcssの値にに、それぞれ置き換えられる。

3.3   楽譜データの書式

楽譜データは!song型のマルチドキュメントで指定。 !song型はスクリプト内でYAMLオブジェクトクラスとして定義してある。

--- !song
id: 楽譜ID
title: 楽譜のタイトル
columns: 小節の一行内の列数
body: [ 楽譜の本体,... ]
id
楽譜ID。page命令で出力する楽譜の指定に使う。
title
楽譜のタイトル。フォーマット指定の%(song)sのところに入る。
columns
小節の一行内の列数。この列数で改行される。
body
楽譜の本体(後述)。

song-sample.yaml サンプルの一曲目。出力結果は sample1.html:

--- !song
id: LaiPongLang
title: ลายโปงลาง
columns: 8
body:
- |
  [- - - ม, - ซ - ล, - ซ - ล, - - - ล, - - - ร, - ด - ล, - ซ - ล, - - - ล,
  - - - ด, - ร - ม, - ร - ม, - - - ม, - - - ล, - ซ - ม, - ร - ม, - - - ม,
  - - - ม, - ซ - ล, - ซ - ล, - - - ล, - - - ร, - ด - ล, - ซ - ล, - - - ล,
  - - - ซ, - ม - ล, - ซ - ม, - - - ม, - - - ด, - ร - ซ, - ร - ม, - - - ม,
  - - - ซ, - ม - ล, - ซ - ม, - - - ม,  - - - ด, - ร - ซ, - ร - ม, - - - ม,
  - ม - ร, - ด - ล, - ซ - ล, - - - ล, - ม - ร, - ด - ล, - ซ - ล**, - - - -],
- text: ending
- |
  ** ม ม ซ ร, ด ล ซ ล, - - - -

3.3.1   楽譜の本体(body)

body: [ 小節,... ]
  • 楽譜の本体は小節の並びをシーケンス内に記述する。
  • 小節はカンマ "," で区切る。
  • columnsで指定された列数を満たすと改行される。
  • また、スラッシュ"/"で強制改行となる。
  • 一拍ごとにスペースで区切る。
  • { text: 文字列 } の要素があるとテキスト行となり、それだけで一行となる。
  • *に続く非スペースの文字列はマークの扱いになる。上の例(**)では最初の*が捨てられて一つだけになる。

3.3.2   もう少し複雑な楽譜

2ページ目の楽譜データはケーンの独奏を採譜したもので細かい指定が増えている。 通常のタイ式楽譜とは違い、一行12小節で、小節の一拍目を一桁目に書いている。

song-khaen.yamlの一部。出力結果は sample2.html:

--- !song
id: MaengPhuTomDok-20060704
title: แมงภู่ตอมดอก
columns: 12
body:
- text: 20060704 at มหาสารคาม
- text: key Dm (ล=D, ด=F) / drone ซ=C
- text: intro
- |
  *ซ-,s<รล่~ -,- ม,ร>s - /
  ล ด,ร ด,ล ด,ร ล,e<ด ล,ด ล>e,e<ร ด,ร ด>e,ล ซ,- -,/
  ซ -,ล~ -,- ด, s<รล่~ >s-, - -/
- text: inter
- |
  (ด) ล, ด ร, ด ล, ด ร, /
  e<|ล ด, ล ด>e, ล ร, ด ร, e<|ล ด, ล ด>e, ล ร, ด ร./
  ล~ -,ล ร,ด ล,ด ร, ล ด,ร ด,ล ร,ด ร,/
  e<|ด ล,ด ร,|ด ล,ด ร.>e,e<ด ล, ด ล>e, e<|ด ล, ด ร.>e,s<มซ่ ร /
  ซ่ -, ซ่ ล่, ซ่ ม, ซ่ ล่, e<|ด่ ล่, ร่ ล่, |ด่ ล่, ร่ ล่.>e,/
  ด่ ล่, ซ่ ม, ล่ ม, ซ่ ร, ม ร>s, ด ล, ด ร, ด ล,/
  ด ร, ล ด, - -, ล ร, ด ร, ล ด, - -, ล ร, /
  ด ร, ล ด, ร ด, ล ร, ด ร, ล ด, ล~ -, ร -, ล ด, /
- text: theme
- |
  ร -, ร ด, ล ซ, ล ด, ร -, ม ร, ด ร, ล ด, /
  ร -, ด ล, ด ร, ล ด, ร ซ, ม ร, ด ร, ล ด, /
  ร -, - -, ด ร, ล ด, ร -, - -, ด ร, ล ด, /
  ร ซ, ม ร, ด ร, ล ด, ล~ -, ล ร, ด ล, ด ร, /
  ล -, ร ด, ล ร, ด ร, ล~ -, ล ร, ด ล, ด ร, /
- text: inter
[略...]

3.3.3   音符の属性

音符の属性は楽譜本体の任意の範囲の音符を囲んで属性付けするもの。

x< で属性xをオン、>x で属性xをオフ。xは任意の一文字。

このサンプルではformat.yamlに以下の属性を定義してある。

# 音符の属性とそれに対応するタグを定義
#  { 属性文字 : [ 開始タグ, 終了タグ ] }
s: [ '<span class="s">', '</span>' ] # シングルノートを表す属性
e: [ '<span class="e">', '</span>' ] # 強調
u: [ '<span class="u">', '</span>' ] # アンダーライン

# 記号用のタグ。*に続く文字列。
mark: [ '<span class="mark">', '</span>' ]

例:上記楽譜本体の一行目:

*ซ-,s<รล่~ -,- ม,ร>s - /
  • このサンプルでは s< と >s で囲まれた範囲の音符(属性s)は単音(シングルノート)の意味で、 スタイルシートの記述によって小さい文字で表示している。
  • 属性eは強調表示になり、繰り返し部分を見やすくする為に使っている。
  • 属性uはこのサンプルでは使っていない。普段はある特定の和音でリズムを入れる意味で使っている。

これらの属性の範囲が複数小節にまたがった場合、小節の境目で終了タグが出力されるが、 次の小節で再び継続するように開始タグが挿入される。 念のためにスクリプトは属性のオン・オフが対応しない場合は警告を表示する。 未定義の属性の指定があるとエラーとなる。

上記の例の *ซ- は * に続く部分が記号の指定。 このサンプルでは「ここから先、ドローンとしてซの音を出しっぱなし」という意味で使っていて、 スタイルシートで上付きの極小サイズの表示になる。

3.4   書式のまとめ

太字 はリテラル。inputは入力データブロックの意味。

[] はシーケンス、 {} はマッピングのこと。

input ::= song_def | format_def | [ cmd, ... ]
cmd ::= cmd_load | cmd_data | cmd_page

song_def ::=
  --- !song
  id: song_id
  title: string
  columns: positive_number
  body: [ string | text_def,... ]

format_def ::=
  format: { format_key : [ open_tag, close_tag ] }

cmd_load ::=
  load: filename | [ filename,... ]

cmd_data ::=
  data: { data_key : data_value }

cmd_page ::=
  page: song_id | [ song_id,... ]

text_def ::=
  text: string

song_id, format_key, open_tag, close_tag, filename, data_key, data_value ::= string