API リファレンス

C++ ランタイム(namespace ToneBeyond / #include <tonebeyond/tonebeyond.h>)、モバイル用ファサード、 各ファイル形式の仕様。「RTセーフ」= ゲーム中いつ呼んでもよい (ヒープ確保・ロック・ファイル I/O なし)。「ロード時」= ロード画面等で呼ぶ(確保あり)。

EngineConfig — 初期化パラメータ

Engine::Initialize() に渡す構造体。省略時は既定値。

フィールド既定意味
maxVoices32同時発音数の上限(固定プール)。満杯時は優先度の低い順に奪う(下記)
maxSounds256登録できるサウンド総数(全バンク合算)
commandQueueCapacity256ゲーム→オーディオスレッドのコマンド容量(2の累乗に切上げ)
sampleRate48000ミックスレート。バンクのレートと一致必須
maxParameters32RTPC パラメータ数の上限
maxRtpcBindings64RTPC バインディング数の上限
rtpcSmoothingMs50パラメータ値の平滑時間(ジッパーノイズ防止)
maxBuses8カテゴリ音量バス数("BGM"、"SFX" など)
maxDuckRules8バンク定義のダッキングルール数
maxStateGroups16ステート/スイッチグループ数
maxBanks8同時ロードできるバンク数
maxStreams4同時ストリーミング再生数(BGM 用)
streamBufferFrames32768ストリーム1本あたりのリングバッファ(≈0.68秒、2の累乗)
spatialMinDistance1.03D: この距離まで減衰なし
spatialMaxDistance50.03D: この距離で無音(線形減衰)

ライフサイクル

API区分説明
bool Initialize(config = {})ロード時全プール確保 + オーディオデバイス開始。アプリ起動時に1回
void Shutdown()ロード時停止と全解放
void Update()RTセーフ毎フレーム呼ぶ(将来のコールバック用に予約。現在は何もしない)

サウンドとバンク

API区分説明
bool RegisterSound(name, wavPath, looping=false)ロード時WAV/FLAC/MP3/OGG を1音直接登録(バンクを使わない簡易ルート)
BankId LoadBank(tbbPath)ロード時.tbb をロード。RTPC カーブも自動登録。0 = 失敗。最大 maxBanks 同時
void UnloadBank(bank)ロード時そのバンクの音だけ停止して解放(他バンクは継続)。カーブも回収
void UnloadAllBanks()ロード時全バンク解放
ストリーミング指定のイベントは PCM を RAM に載せず、専用 I/O スレッドが ディスクから供給します。QOA 圧縮との併用可。フォーマット詳細は docs/tbb_format.md(v1〜v8 後方互換)。

再生 — イベント / 3D / ボイスハンドル

イベント名はコンパイル時に FNV-1a 32bit へハッシュされます(HashEvent("name"))。 文字列のオーバーロードはどれもリテラルを渡せばゼロコストです。

API区分説明
bool PostEvent(name | id)RTセーフ再生開始(fire & forget)
bool StopEvent(name | id, fadeMs = 0)RTセーフそのイベントの全ボイスを停止。fadeMs を指定するとクリックなしでフェードアウト
void StopAll(fadeMs = 0)RTセーフ全ボイス停止(フェード指定可)
bool PostEvent3D(name | id, Vec3 pos)RTセーフ位置つきワンショット。リスナーは毎ブロック追従、ソース位置は発音時固定
void SetListener(pos, forward={0,0,-1}, up={0,1,0})RTセーフリスナー姿勢。毎フレーム呼んでよい
VoiceHandle PostEventHandle(name | id)
VoiceHandle PostEvent3DHandle(name | id, pos)
RTセーフこのボイス専用のハンドルを返す(0 = 失敗)
void StopVoice(handle, fadeMs = 0)RTセーフそのボイスだけ停止(同イベントの他ボイスは無傷。フェード指定可)
bool SetVoicePosition(handle, pos)RTセーフ移動エミッタ。毎フレーム呼ぶとパンと減衰が追従
bool IsVoiceActive(handle)RTセーフまだ鳴っているか

RTPC — 動的パラメータ

カーブは折れ線(最大8点、x昇順、範囲外は端の値でクランプ)。 ターゲットは RtpcTarget::Volume(ゲイン倍率)か RtpcTarget::Pitch(再生速度倍率。ストリーミングボイスには効きません)。 値は rtpcSmoothingMs の指数平滑で補間されます。

API区分説明
bool SetParameter(name | id, float v)RTセーフ値を更新。未知のパラメータは固定プールに自動登録
float GetParameter(id)RTセーフ現在のターゲット値
bool AddRtpcBinding(event, param, target, points, n)ロード時コードからカーブ登録。通常は不要(エディタで描いたカーブが LoadBank で自動登録される)
// 例: 危険度 0→1 で BGM 緊迫ステムが立ち上がる(カーブはエディタ製)
ToneBeyond::Engine::SetParameter("Danger", dangerLevel);  // 毎フレームOK

バス — カテゴリ音量とマスター

イベントはエディタ(プロパティの「バス」欄)か bank.json の "bus" キーで カテゴリバス("BGM"、"SFX" など)に割り当てられます。バス音量とマスター音量は RTPC と同じ平滑化がかかるため、設定画面のスライダーに直結してもクリックノイズが出ません。

API区分説明
bool SetBusVolume(name | id, float v)RTセーフバス音量(リニア倍率)。未知のバスは固定プールに自動登録(最大 maxBuses、既定8)
float GetBusVolume(id)RTセーフ現在のターゲット値
void SetMasterVolume(float v) / float GetMasterVolume()RTセーフ最終ミックス全体の音量
// 例: 設定画面の音量スライダー
ToneBeyond::Engine::SetBusVolume("BGM", bgmSlider);   // BGM だけ下げる
ToneBeyond::Engine::SetMasterVolume(masterSlider);     // 全体
ToneBeyond::Engine::StopEvent("BGM_Main", 400.0f);     // 400ms かけてフェード停止

ダッキング(自動音量回避) — bank.json のトップレベル "duck" で 「ソースバスの再生中はターゲットバスを下げる」ルールをバンクに焼けます(エディタの 「ダッキング」ボタンで編集)。ゲーム側のコードは不要 — 例えばボイスを Voice バスに割り当てておけば、再生のたびに BGM が自動で沈み、止まると戻ります (attack/release ms 指定、ランタイムはサンプル精度のリニアランプ)。

ループポイント(イントロ→ループ本体) — 各イベントの "loopStartMs"(エディタではループ有効時の「ループ開始 ms」欄)で、ループが 先頭ではなくその位置へ巻き戻ります。イントロは一度だけ再生され、以後は本体が シームレスに回り続けます。メモリ/ストリーミング PCM/ストリーミング QOA すべて対応。

バイノーラル 3D — ヘッドホン向け立体音響

3D ボイス(PostEvent3D)の描画を、通常のステレオパンから 構造 HRTF モデル(両耳時間差 + 頭部遮蔽ローパス + 耳介の仰角ノッチ)に 切り替えられます。ヘッドホンで上下・前後の方向感が出ます。既定は OFF (従来のパンのまま)。係数はブロック単位で計算され、コールバックは アロケーションフリーのままです。現状はメモリ再生の 3D ボイスのみ (ストリーミングは従来パン)。

API区分説明
void SetBinaural(bool) / bool GetBinaural()RTセーフ実行時トグル(設定画面の「ヘッドホンモード」に直結可)。EngineConfig::binaural で初期値

優先度と仮想化 — 発音数が足りないとき

各イベントの優先度(0〜100、既定50。エディタの「優先度」欄 / bank.json の "priority")で、ボイスプールが満杯のときの振る舞いが決まります: 新しい音は「仮想化済み → 低優先 → 最古」の順に既存ボイスを奪い、 自分より高優先のボイスは決して奪いません。BGM を 90、足音を 20 のようにしておけば、 弾幕の密度がどれだけ上がっても音楽は途切れません。

仮想化 — 聞こえないボイス(ミュートされたバス・フルダッキング・距離減衰)は ミックス処理をスキップしつつ再生位置だけ進み続けるので、再び聞こえるようになった 瞬間も完全に同期しています(CPU 節約 + 奪われ候補の筆頭になる)。 DebugVirtualVoiceCount() で確認できます。

ステート — 曲面切替(ミュージックスイッチ)

同じステートグループに属する複数のイベント(それぞれ別のステート値)は、 ビルド時に1つのスイッチコンテナになります。ゲームはグループ名を1回 postEvent し、 あとは SetState で値を切り替えるだけ — 再生中のボイスが stateFadeMs(既定500ms)でクロスフェードします。ループポイントと併用すれば 「通常ループ ⇄ ボスループ」のシームレス切替になります。

API区分説明
bool SetState(group | id, value | id)RTセーフグループの現在値を変更。鳴っていればクロスフェード、次の PostEvent にも反映
StateId GetState(id)RTセーフ現在のターゲット値
ToneBeyond::Engine::PostEvent("Music_Stage01");         // 既定値(最初に並べた曲)で開始
ToneBeyond::Engine::SetState("Music_Stage01", "Boss");  // ボス曲へクロスフェード
ToneBeyond::Engine::StopEvent("Music_Stage01", 800.0f); // グループ名で停止も可

Live Profiler と診断

API区分説明
bool StartProfiler(host, port)ロード時UDP 送信スレッド開始(約10Hz)。host は IPv4 数値表記。エディタは :9990 で待受
void StopProfiler()ロード時送信停止
uint32 ActiveVoiceCount()RTセーフ現在の発音数
uint32 DroppedCommandCount()RTセーフあふれて捨てたコマンド累計(0 が正常)
uint64 DebugAllocationCount()RTセーフエンジン内ヒープ確保の累計。再生中に増えないことの検証用
float DebugMasterPeak() / DebugChannelPeaks(l, r)RTセーフ直近ブロックのピーク(リニア)
uint32 DebugStreamUnderrunCount()RTセーフストリーミングの供給切れ回数(0 が正常)

TBAudio — Swift / Kotlin ファサード

組み込みキットが生成するモバイル向け API。C++ API の主要部を1対1で包みます。

Swift (iOS)Kotlin (Android)対応する C++
TBAudio.start()TBAudio.start()Initialize()
loadBankNamed("name")loadBankFromAssets(ctx, "name")LoadBank()(バンドル / assets 解決込み)
postEvent(TBEvent_x)postEvent(TBEvent_x)PostEvent()
postEvent(_, x:y:z:)postEvent3D(_, x, y, z)PostEvent3D()
stopEvent / stopAll同名StopEvent / StopAll
setParameter("Danger", value:)setParameter("Danger", v)SetParameter()
setListenerX(_:y:z:)setListener(x, y, z)SetListener()
setState("Music_Stage01", value: "Boss")setState("Music_Stage01", "Boss")SetState()
setBusVolume("BGM", value:)setBusVolume("BGM", v)SetBusVolume()
setMasterVolume(_:)setMasterVolume(v)SetMasterVolume()
stopEvent(_, fadeMs:)stopEventFaded(_, fadeMs)StopEvent(id, fadeMs)
unloadBank(id) / stop()同名UnloadBank / Shutdown
ボイスハンドルやプロファイラ開始など、ここに無い API が必要なときは ファサードに1メソッド足すだけです(実装は C++ 1行)。

bank.json — バンク定義

エディタの「bank.json を書き出し」が生成(手書きも可)。bankc の入力。

{
  "sampleRate": 48000,
  "events": [
    { "name": "sword_swing",          // 英数字と _ のみ(= イベント名)
      "file": "sword_swing.wav",      // JSON からの相対 or 絶対パス
      "looping": false,
      "streaming": false,              // true: ディスクから直接再生(BGM)
      "compress": false,               // true: QOA 圧縮(約1/10)
      "gainDb": 0.0,                   // 既定ゲイン
      "chain": [                       // 非破壊編集(焼き込み)
        { "type": "trim", "inMs": 0, "outMs": 500 },
        { "type": "gain", "db": -3 },
        { "type": "fadein", "ms": 10 },
        { "type": "fadeout", "ms": 120 },
        { "type": "reverse" } ],
      "files": ["hit1.wav", "hit2.wav"],  // 2..8個でバリエーション化("file" の代わり)
      "variation": "random",           // random(既定・直前回避)| roundrobin
      "bus": "SFX",                    // カテゴリ音量バス(省略可)
      "loopStartMs": 1000,             // ループ開始位置(イントロ→本体、省略可)
      "stateGroup": "Music_Stage01",   // ステートグループ(省略可)
      "stateValue": "Boss",            // グループ内の値(stateGroup とペア)
      "stateFadeMs": 800,              // 切替クロスフェード(省略時 500)
      "priority": 90,                  // ボイス優先度 0-100(省略時 50)
      "rtpc": [                        // RTPC カーブ(焼き込み)
        { "param": "Danger", "target": "volume",   // volume | pitch
          "points": [[0, 0], [1, 1]] } ] }          // [値, 倍率] 最大8点
  ],
  "duck": [                            // ダッキングルール(省略可・バンク全体)
    { "source": "Voice", "target": "BGM", "db": -6, "attackMs": 100, "releaseMs": 400 } ]
}

tb_sound_requests.json — サウンド発注書

ゲームリポジトリ直下に置く制作依頼シート。postEvent 追加と同じコミットで更新します。

キー必須意味
requests[].nameイベント名(英数字と _)
requests[].descどんな音か(日本語可)
requests[].length希望尺(例 "0.3秒前後")
requests[].loop / 3d / stream再生特性のヒント
requests[].note補足(連打耐性・参考曲など)
params[].name / desc / rangename,descRTPC パラメータの意味づけ

CLI ツール

コマンド用途
bankc bank.json out.tbbバンクのビルド(CI / Run Script Phase 向け)
tb_player <wav|tbb>最小再生デモ(p/s/q 対話)。--autotest でゼロアロケ検証、--rtpctest --rtpcbanktest --streamtest --spatialtest --binauraltest --handletest --qoatest --vartest --busfadetest --ducktest --looppointtest --statetest --stealtest --binauraltest の自動テスト群、--profile でプロファイラ送信
tb_editor --scan-project <dir>発注書 × バンクのヘッドレス突合(制作 TODO を出力)
tools/build_xcframework.shiOS / macOS 用 XCFramework 生成
tools/make_app_bundle.sh / make_dmg.shエディタの .app / 配布 DMG