API リファレンス
C++ ランタイム(namespace ToneBeyond /
#include <tonebeyond/tonebeyond.h>)、モバイル用ファサード、
各ファイル形式の仕様。「RTセーフ」= ゲーム中いつ呼んでもよい
(ヒープ確保・ロック・ファイル I/O なし)。「ロード時」= ロード画面等で呼ぶ(確保あり)。
EngineConfig — 初期化パラメータ
Engine::Initialize() に渡す構造体。省略時は既定値。
| フィールド | 既定 | 意味 |
|---|---|---|
maxVoices | 32 | 同時発音数の上限(固定プール)。満杯時は優先度の低い順に奪う(下記) |
maxSounds | 256 | 登録できるサウンド総数(全バンク合算) |
commandQueueCapacity | 256 | ゲーム→オーディオスレッドのコマンド容量(2の累乗に切上げ) |
sampleRate | 48000 | ミックスレート。バンクのレートと一致必須 |
maxParameters | 32 | RTPC パラメータ数の上限 |
maxRtpcBindings | 64 | RTPC バインディング数の上限 |
rtpcSmoothingMs | 50 | パラメータ値の平滑時間(ジッパーノイズ防止) |
maxBuses | 8 | カテゴリ音量バス数("BGM"、"SFX" など) |
maxDuckRules | 8 | バンク定義のダッキングルール数 |
maxStateGroups | 16 | ステート/スイッチグループ数 |
maxBanks | 8 | 同時ロードできるバンク数 |
maxStreams | 4 | 同時ストリーミング再生数(BGM 用) |
streamBufferFrames | 32768 | ストリーム1本あたりのリングバッファ(≈0.68秒、2の累乗) |
spatialMinDistance | 1.0 | 3D: この距離まで減衰なし |
spatialMaxDistance | 50.0 | 3D: この距離で無音(線形減衰) |
ライフサイクル
| 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() | ロード時 | 全バンク解放 |
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 |
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 / range | name,desc | RTPC パラメータの意味づけ |
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.sh | iOS / macOS 用 XCFramework 生成 |
tools/make_app_bundle.sh / make_dmg.sh | エディタの .app / 配布 DMG |