公開メソッド仕様
go-fmml をアプリケーションから利用する際に呼び出す公開関数・メソッドの一覧です。
通常のBGM再生用途では「①ファイル入力 → ②fmcore.NewEngineでエンジンを生成 →
③再生制御」の3系統だけで完結します。④FM/PCM音源コア 低レベルAPI は、MMLを使わず単音
を直接鳴らしたい場合や、独自のシーケンサを組みたい場合のためのAPIです。
① ファイル入力 package fileio
fileio.LoadFMVoiceFile(path string) error
FM音色指定した絶対パスのFM音色パラメータYAMLファイルを読み込み・解析し、メモリに登録します。軽微な
解析エラーはログに警告出力した上で処理を継続し、致命的なエラー(YAML自体が不正等)の場合のみ
errorを返します。
fileio.LoadFMVoiceFileFS(fsys embed.FS, path string) error
FM音色 / embedLoadFMVoiceFileのembed.FS版。go:embedでゲーム本体に埋め
込んだFM音色ファイルを読み込みます。
fileio.LoadPCMVoiceFile(path string) error
PCM音色指定した絶対パスのPCM音色パラメータYAMLファイルを読み込み、参照されている全てのWAVファイルも
併せて読み込んでメモリに登録します。各voiceSettingのfileNameがファイル
名のみ(パス無し)の場合はYAMLファイルと同一フォルダを探索します。WAV読み込みに失敗した場合も
errorを返します。
fileio.LoadPCMVoiceFileFS(fsys embed.FS, path string) error
PCM音色 / embedLoadPCMVoiceFileのembed.FS版。fileNameのパス解決は
fsysのルートを基準に行います。
fileio.LoadMMLFile(path string) error
MML指定した絶対パスの.mmlシーケンスファイルを読み込み・解析し、
[global]のsequenceIDをキーとしてメモリに登録します。
fileio.LoadMMLFileFS(fsys embed.FS, path string) error
MML / embedLoadMMLFileのembed.FS版。
fileio.SetMMLTextData(data string) error
MML / 文字列MMLファイルと同じ書式のテキストを、ファイルではなくGoの文字列(バッククォート複数行リテラル
等)として直接渡して読み込みます(Phase 7)。以降の処理はLoadMMLFileと同一です。
fileio.SetFMVoiceData(data string) error
FM音色 / 文字列FM音色パラメータYAMLと同じ書式のテキストを文字列として直接渡して読み込みます(Phase 7)。
fileio.SetPCMVoiceData(data string) error
PCM音色 / 文字列PCM音色パラメータYAMLと同じ書式のテキストを文字列として直接渡して読み込みます(Phase 7)。 参照WAVファイルの相対パスはプロセスのカレントディレクトリを基準に解決されます。
LoadPCMVoiceFile / LoadPCMVoiceFileFS /
SetPCMVoiceData はいずれも、解決済みファイルパスが既にメモリ上にキャッシュ済みの場合は
再デコードせずキャッシュを再利用します。
② メモリ管理 package memory
memory.ClearVoices()
FM音色登録済みの全FM音色をメモリから削除します。
memory.ClearPCMVoices()
PCM音色登録済みの全PCM音色をメモリから削除します(波形キャッシュ自体は消えません)。
memory.ClearPCMWaveCache()
PCM波形 / Phase 7デコード済みWAV波形のキャッシュを全て削除し、メモリを解放します。音色定義(ClearPCMVoices
が扱う対象)とは別物です。
memory.ClearSequences()
シーケンス読み込み済みの全シーケンスデータ(MML解析結果)をメモリから削除します。
③ 再生制御 package player
player.Play(engine Engine, sequenceID string, onComplete func()) error
再生読み込み済みのシーケンスを非同期で再生開始します(呼び出し元はブロックされません)。既に何か
再生中であれば先に停止します。ループしない曲が最後まで再生し終えたタイミングでonComplete
が(非nilなら)バックグラウンドgoroutineから1回だけ呼ばれます。[global]に
startOffsetが設定されている場合は、その位置から再生を開始します。
player.SkipPlay(engine Engine, sequenceID string, seekSeconds float64, onComplete func()) error
再生Playと同様ですが、曲の先頭ではなくseekSeconds秒の位置から再生を開始
します。ノートの途中に位置する場合はそのノートの先頭まで巻き戻ります。
player.FadeInPlay(engine Engine, sequenceID string, fadeSeconds float64, onComplete func()) error
再生 / フェード音量0から開始し、fadeSeconds秒かけて[global]のvolumeまで滑らかに
フェードインしながら再生します。
player.FadeOutPlay(engine Engine, sequenceID string, fadeSeconds float64, onComplete func()) error
再生 / フェード曲の終わりのfadeSeconds秒前からフェードアウトを開始し、曲の終端でちょうど音量0に
なるように再生します。loop: trueの曲では自動フェードアウトは行われません
(Playと同じ動作)。
player.FadeInOutPlay(engine Engine, sequenceID string, fadeSeconds float64, onComplete func()) error
再生 / フェードFadeInPlayとFadeOutPlayを組み合わせた再生です。
player.FadeOut(fadeSeconds float64) error
フェード現在再生中のシーケンスを、任意のタイミングからfadeSeconds秒かけてフェードアウトし、
音量0に達した時点で再生を停止します。loop: trueの曲にも適用されます(自動フェードとは
異なり明示的にいつでも呼び出せます)。
player.SetMasterVolume(engine Engine, volume float64)
音量[global]のvolumeと同じ0-127スケールの実値でマスターボリュームを上書きします。曲の
再生中に呼んだ場合は約0.3秒かけて滑らかに変化し、再生中でなければ即座に反映されます。
player.SetMasterVolumePercent(engine Engine, percent float64)
音量直近に読み込んだシーケンスの[global]volume値を100%として、パーセント指定でマスタ
ーボリュームを設定します(50なら半分の音量)。再生中の滑らかな変化挙動はSetMasterVolume
と同じです。
player.Pause() error
再生制御再生中のシーケンスをその場で一時停止します(短いフェードアウトで途切れを防止)。何も再生して いない場合はエラーを返します。
player.Resume() error
再生制御Pauseで一時停止したシーケンスの再生を再開します。ノートの途中で一時停止していた
場合はそのノートの先頭まで巻き戻して再開します。
player.Stop() error
再生制御再生中(または一時停止中)のシーケンスを完全に停止します。
player.IsPlaying() bool
状態取得現在アクティブに再生中かどうかを返します(一時停止中や未再生時はfalse)。
player.Rewind() error
再生制御再生位置を曲の先頭(tick 0)に巻き戻します。再生中であれば即座に先頭から再生し直し、一時停止中
であれば次のResume時に先頭から再生されます。
④ FM/PCM音源コア 低レベルAPI package fmcore
MMLを介さず、音色登録から発音までを直接コードで制御したい
場合に使用します。fmcore.EngineがFM・PCM両方の音源コアを内包しています。
fmcore.NewEngine(sampleRate int) (*Engine, error)
初期化音声出力デバイスを開き(内部でoto/v3のコンテキストを初期化)、指定サンプルレート
でエンジンを生成します。
fmcore.NewEngineWithoutOutput(sampleRate int) *Engine
初期化音声デバイスを開かずにエンジンを生成します。*Engine自体がio.Readerを
実装しているため、アプリ側が既に持っているoto.Contextにプレイヤーとして登録できます。
(*Engine) RegisterVoice(id VoiceID, voice Voice)
音色登録FM音色パラメータ(オペレータ、エンベロープ、アルゴリズム)をIDを付けてメモリに登録します。
(*Engine) SetPart(id PartID, voice VoiceID, volume, pan float64) error
パート設定指定した発音パートに、鳴らす音色ID・音量・パン定位を設定します。
(*Engine) NoteOnRow(partID PartID, noteNumber uint8, durationMs int, velocity uint8) (NoteID, error)
発音ノート番号・発音長(ms)・ベロシティを数値で直接指定して発音します。発音IDを即座に返し、実際の 発音処理は非同期に継続します。
(*Engine) NoteOn(partID PartID, noteName string, noteType string, sustain int, velocity uint8) (NoteID, error)
発音"C#5"のようなノート名、"NOTE4"のような音符種別、サスティン(%)、
ベロシティを指定して発音する抽象化版です。内部でノート番号・発音長msに変換されます。
(*Engine) RegisterPCMVoice(id pcmcore.VoiceID, voice pcmcore.Voice)
PCM音色登録PCM音色(oneShot/long)を登録します。
(*Engine) SetPCMPart(id pcmcore.PartID, voice pcmcore.VoiceID, volume, pan float64) error
PCMパート設定PCM発音パート('A'〜'P')に音色・音量・パンを設定します。
(*Engine) SetMasterVolume(volume float64) / SetMasterVolumeSmooth(target, rampSeconds float64)
音量エンジン全体のマスターボリューム(0.0-1.0)を即時または滑らかに設定します。player
パッケージの音量APIはこれらのラッパーです。
(*Engine) SetReverb(enabled bool, kind string, timeSeconds, level float64) / SetPartReverbSend(id PartID, send float64)
リバーブマスターリバーブの有効化・種類("simple"=Schroeder型 / "normal"=FDN型)
・リバーブタイム・レベルを設定し、パート単位のセンドレベルを設定します。
(*Engine) Close() error
終了処理音声出力デバイスを閉じます(NewEngineで開いた場合)。
上記はアプリケーションから直接呼ぶことを想定した主要メソッドの抜粋です。
Schedule*系メソッド(ScheduleNoteOn等、サンプル単位で発音タイミングを予約
する低レベルAPI)は主にplayerパッケージの内部実装が使用するものですが、独自シーケンサ
を組む場合にも利用できます。詳細はソースコードのコメントを参照してください。