コンテンツにスキップ

音声ファイルフォーマット

Family mruby が対応する音声ファイル形式と、その作成・変換方法を説明します。

形式 用途 API
FMSQ 短い BGM / SE のシーケンスデータ。スロットにロードして再生 FmrbAudio#load_fmsq, play_slot
NSF ファミコン音楽(NES Sound Format) FmrbAudio#play(path, track:)

FMSQ

FMSQ (Family mruby Sequence) は NES APU 互換 の音楽データを記述する独自フォーマットです。短い効果音や BGM ループに向いています。

ファイル構造

12 バイトのヘッダ + 可変長コマンド列。すべて little-endian。

+------+----------------+
| 0..3 | "FMSQ"         |  magic
| 4    | version (=1)   |
| 5    | flags (=0)     |  reserved
| 6..7 | frame_count    |  total frames
| 8..9 | data_size      |  command bytes
| 10..11 | loop_offset  |  0 = no loop
+------+----------------+
| 12.. | command stream |
+------+----------------+

コマンドエンコーディング

コマンド 形式 意味
WAIT 0xxxxxxx 1〜128 フレーム待機 ((N & 0x7F) + 1)
NOTE_ON 10cc0000 チャンネル cc のノート開始
NOTE_OFF 10cc0001 チャンネル cc のノート停止
PARAM 10cc0010 チャンネルパラメータ更新(後続マスクとデータ)
REG_WRITE 110aaaaa DATA APU レジスタ $4000 + a に直接書き込み
DPCM_PLAY 0xE0 RATE_FLAGS ADDR LENGTH DPCM 再生
DPCM_STOP 0xE1 DPCM 停止
DPCM_RAW 0xE2 VALUE 7bit DAC 直接書き込み
END 0xFE データ終了
LOOP 0xFF OFFSET_LO OFFSET_HI 指定オフセットへループ

チャンネル ID

ID チャンネル
0 Pulse 1 (矩形波)
1 Pulse 2 (矩形波)
2 Triangle (三角波)
3 Noise (ノイズ)

作成方法

fmruby-graphics-audio/tools/ 以下に Ruby のジェネレータがあります(PC で実行)。

fmruby-graphics-audio/tools/gen_test_fmsq.rb     # スケールパターン
fmruby-graphics-audio/tools/gen_intro_fmsq.rb    # ジングル

これらを参考に音階・コードを記述すると .fmsq バイナリが生成できます。

再生

スロット(番号 ID)にロードしてから再生します。

data = File.open("/sfx.fmsq", "r") { |f| f.read }
@audio.load_fmsq(0, data)   # スロット 0 に登録
@audio.play_slot(0)         # 再生

詳細は FmrbAudio を参照。

NSF (NES Sound Format)

NES Sound Format は実機ファミコン音楽を再生する標準フォーマットです。Family mruby は NSF ファイルの再生に対応しています。

入手方法

  • アーカイブサイト(NSFArchive 等)から入手
  • 自分で作る場合は FamiTracker などの DAW から NSF エクスポート

再生

@audio.play("/usr/share/music/dq.nsf", track: 1)

track: は曲番号(1 始まり)。NSF には複数曲が含まれるため、ファイル名で曲を選んだ後、track 指定で個別曲を選べます。

制限

  • バンク切替を多用する大型 NSF は読込に時間がかかる場合があります
  • NSFe 拡張は未対応の機能あり

サンプル

flash/app/tool/nsf_player.app.rb に NSF 再生 GUI のサンプルがあります(曲送り・トラック選択・一時停止 / 再開 を実装)。

WAV / MP3

未対応 です。FMSQ または NSF に変換してください。

直接合成 (note_on / note_off)

ファイルを使わずに、FmrbAudio#note_on で APU を直接駆動できます。リズムやセリフの効果音、ボタンクリック音などに向きます。

@audio.note_on(0, 440, 10, 2, 0)   # 矩形波 1ch で A4
sleep_ms(200)
@audio.note_off(0)

詳細は FmrbAudio ▸ note_on / note_off を参照。

関連

  • FmrbAudio
  • ピアノアプリ: flash/app/game/piano.app.rb
  • 効果音 + BGM 例: flash/app/game/flappy.rb
  • NSF プレイヤー: flash/app/tool/nsf_player.app.rb