View on GitHub

mmlabc-to-smf-rust

mmlabc-to-smf-rust

mmlabc-to-smf-rust

Japanese English

Music Macro Language (MML) から Standard MIDI File (SMF) への変換ライブラリ

概要

このライブラリは、Music Macro Language(MML)形式の文字列を、Standard MIDI Fileに変換します。Rustで書かれています。

用途

ライブラリとして cat-play-mml から利用しています

状況

頻繁に破壊的変更をしています

READMEがメンテ不足です。実際はもっと多数のMMLコマンドが実装済みです。あとでREADMEをメンテ予定です

実装されたMMLを知りたい場合、まず tree-sitter-mml/grammer.js をお読みください(ただし今後、破壊的変更されます)

実装済み機能 ✅

動作確認

# 基本音階変換
cargo run -- "cdefgab"

# 多チャンネル
cargo run -- "c;e;g"

# カスタム出力ファイル
cargo run -- "cde" -o my_song.mid

今後の見通し

短期目標 🚧

長期目標 🎯

参考資料

特徴

必要要件

インストール

開発版(現在の状態)

git clone https://github.com/cat2151/mmlabc-to-smf-rust
cd mmlabc-to-smf-rust
cargo build --release

直接実行(Cargo経由)

cargo run -- "cdefgab"

使い方

基本的な使い方

# 基本音階の変換(デフォルトでcat-play-mmlで自動再生されます)
cargo run -- "cdefgab"

# 多チャンネル(同時発音)
cargo run -- "c;e;g"  # Cメジャーコード

# カスタム出力ファイル
cargo run -- "cde" -o my_song.mid

# 自動再生を無効化
cargo run -- "cde" --no-play

自動再生機能

デフォルトでは、MIDIファイル生成後に自動的に cat-play-mml コマンドで再生されます。 これによりMML開発時に即座に音を確認できます。

カスタムプレイヤーの設定

ツールを実行するディレクトリに mmlabc-to-smf-rust.toml ファイルを作成することで、カスタムMIDIプレイヤーを設定できます。

設定ファイルの例:

# mmlabc-to-smf-rust.toml
external_smf_player = "timidity"

設定可能な一般的なMIDIプレイヤー:

設定ファイルが存在しない場合、デフォルトで cat-play-mml が使用されます。

サンプル設定ファイルは mmlabc-to-smf-rust.toml.example を参照してください。

出力ファイル

実行すると以下のファイルが生成されます:

対応MML記法

現在対応している記法:

例:

cdefgab     → ドレミファソラシの連続再生
c;e;g       → C・E・G音の同時再生(Cメジャーコード)

開発

ビルド

cargo build        # デバッグビルド
cargo build --release  # リリースビルド

テスト

cargo test         # 全テスト実行(35個のテストケース)

フォーマット・Lint

cargo clippy       # コード品質チェック
cargo fmt --check  # フォーマットチェック
cargo fmt          # フォーマット適用

tree-sitter パーサーファイル

tree-sitter パーサーファイル(tree-sitter-mml/src/ 配下)は、crates.io での信頼性のある配布のため、tree-sitter のベストプラクティスに従い git で追跡されています

開発ワークフロー:

生成ファイルをコミットする理由 これは tree-sitter エコシステムのベストプラクティスに従っています:

文法の更新: tree-sitter-mml/grammar.js を変更する場合:

  1. cargo build を実行 - ビルドスクリプトが変更を検出し、パーサーファイルを再生成します
  2. grammar.js と再生成されたC言語ファイルの両方を一緒にコミットします
  3. これにより、文法とパーサーが同期した状態を保ちます

パーサーファイルを手動で再生成する場合:

cd tree-sitter-mml
npm install  # tree-sitter-cli がまだインストールされていない場合
npx tree-sitter generate

プロジェクト構造

src/
├── main.rs              # CLI エントリーポイント
├── lib.rs               # ライブラリルート
├── pass1_parser.rs      # パス1: トークン解析
├── pass2_ast.rs         # パス2: AST変換
├── pass3_events.rs      # パス3: MIDIイベント生成
├── pass4_midi.rs        # パス4: MIDI ファイル作成
├── tree_sitter_mml.rs   # tree-sitter MML統合
└── types.rs             # 共通型定義

tests/
├── integration_test.rs  # 統合テスト
├── test_channel.rs      # チャンネル機能テスト
├── test_pass1.rs        # パス1テスト
├── test_pass2.rs        # パス2テスト
├── test_pass3.rs        # パス3テスト
└── test_pass4.rs        # パス4テスト

ライセンス

MIT License - 詳細は LICENSE ファイルを参照してください。

参考