Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Catalog · How the catalog works

Random project

sakuramml

MML Compiler

View on GitHub

Anyone may press Interesting, signed in or not. It helps others find this project.

Member rating

No ratings yet.

Sign in to rate this project.

README

SakuraMML

SakuraMML(テキスト音楽「サクラ」)は、MML(Music Macro Language)で書いたテキストを Standard MIDI File(SMF)へ変換するコンパイラです。

このリポジトリでは、従来の Pascal 版を互換性の基準として保守しながら、Rust 版への移植を進めています。 Rust 版はブラウザ向け WebAssembly(WASM)を主対象とし、同じコンパイラコアをコマンドライン版でも利用します。

Windows 向けの配布版は sakuramml.com からダウンロードできます。

現在の状況

  • src/rust/core/: 入出力に依存しない現行の Rust コンパイラコア
  • src/rust/cli/: Rust 製コマンドラインコンパイラ csakura
  • src/rust/wasm/: ブラウザ向け WASM バインディングとデモ
  • src/pascal/: 従来動作の基準となる Pascal/Delphi/FPC 版

Rust 版では、基本的な音符・トラック・MIDI 制御に加え、変数、式、制御構文、関数、マクロ、 ストトン表記、リズム、Include、SysEx、先行指定などを実装しています。 2026年9月9日時点では sample/ の21曲中10曲をコンパイルできますが、Pascal 版との完全互換にはまだ達していません。

未実装機能と移植状況は plan.md を参照してください。言語仕様と互換性については、 詳細仕様、互換性と実装状況、 コマンド索引 にまとめています。

必要なツール

一括ビルドには次のツールが必要です。

Rust CLI だけをビルドする場合、FPC と wasm-pack は不要です。

ビルド

リポジトリのルートで just を実行します。

コマンド 内容
just build Pascal CLI、Rust ワークスペース、ブラウザ向け WASM をすべてビルド
just build-rust Rust ワークスペースをビルド
just build-cli Rust CLI のみをビルド
just buld-wasm ブラウザ向け WASM パッケージをビルド
just build-npm npm公開用の sakuramml-v2 パッケージをビルド
just check-npm npm公開用パッケージをビルドし、動作と同梱内容を検査
just test-samples sample/*.mmlを両実装で変換し、MIDIのバイト差異率とイベント差異率を表示

生成物の主な出力先は次のとおりです。

  • Pascal CLI: src/pascal/csakura
  • Rust CLI: src/rust/target/debug/csakura
  • WASM パッケージ: src/rust/wasm/pkg/

Rust CLI の使い方

MMLファイルをMIDIファイルへ変換します。

bash
just build-cli
src/rust/target/debug/csakura sample/scale.mml scale.mid

短いMMLをコマンドラインから直接コンパイルすることもできます。

bash
src/rust/target/debug/csakura -e "Tempo=120 o5 l4 cdefgab>c" scale.mid

生成済みMIDIを比較しやすいイベント列へ変換するには--dump-midiを使います。

bash
src/rust/target/debug/csakura --dump-midi scale.mid scale.txt

引数を省略した使い方は --help で確認できます。

bash
src/rust/target/debug/csakura --help

ブラウザ版を試す

WASMパッケージをビルドして、デモをHTTPサーバーで配信します。

bash
just buld-wasm
cd src/rust/wasm
python3 -m http.server 8000

ブラウザで http://localhost:8000/demo/ を開くと、MMLのコンパイルとMIDIファイルの ダウンロードを試せます。

npmパッケージ

公開後は、Pascal版との互換性を重視したnpmの sakuramml-v2 パッケージを ブラウザアプリから利用できます。既存の sakuramml とは別パッケージです。

bash
npm install sakuramml-v2
js
import init, { compileMml } from "sakuramml-v2";

await init();
const { midi, errors, warnings } = compileMml("Tempo=120 o5 l4 cdefgab>c");

公開前には just check-npm を実行します。検査に成功したら npm whoami で sakuramml-v2 を公開するアカウントにログインしていることを確認し、生成された src/rust/wasm/pkg/ で npm publish を実行します。npm publish は自動では 実行されません。

MMLの例

mml
Tempo=120
TimeSignature=4,4
TrackName={"SakuraMML sample"}

TR=1 CH=1 @1
o5 l4 q80 v100
cdef gab>c

文字コード

  • Rust 版の入力は UTF-8 と CP932(Windows-31J)を自動判定します。
  • Rust 内部では UTF-8 を使用します。
  • MIDIのメタテキストは、従来版との互換性のため CP932 で出力します。
  • CP932で表現できない文字は代替文字へ置き換え、警告を返します。
  • Pascal 版のソースと従来資料には Shift_JIS/CP932 のファイルがあります。

開発とテスト

Rust の開発コマンドは src/rust/ で実行します。

bash
cd src/rust
cargo fmt --all -- --check
cargo test --workspace
cargo clippy --workspace --all-targets -- -D warnings
cargo build --target wasm32-unknown-unknown -p sakuramml-wasm

互換機能を追加するときは、Pascal 実装とコマンド資料を仕様の基準とし、生成されるMIDIバイト列を比較します。 詳しい開発方針は AGENTS.md を参照してください。

ディレクトリ構成

text
Include/      Includeで読み込むマクロ・定義ファイル
doc/          従来のコマンド資料とリファレンス
sample/       MMLサンプル
spec/         現行仕様、互換性表、コマンド索引
src/pascal/   Pascal版と旧README
src/rust/     Rust版のcore、CLI、WASM
tools/        開発支援ツール

旧バージョンのREADMEは src/pascal/README-v2.385.md に保存しています。