Changelog / 03

Spatial Audio System 更新履歴

公開された 7 版すべて。日付・配布先・内包 Manta は、公開されたリリースと jar の実測です。

変更

  • Manta 2.5.0 に対応(内包 Manta を 2.5.0 に更新、要求範囲 [2.5.0,3)。2.2.0 = Manta 自前のテキスト描画: 画面の実ピクセルサイズで raster し整数ピクセルに配置。2.5.0 でツールチップ・HUD・wiki の文字も同じ描画になりました)。 他の BelugaLab mod(TSU 1.1.0 / ASC 1.2.0)も同時に更新してください。Manta 1.x を内包するビルドは [1.1.74,2) を要求し、両方の必須範囲を 1 つの Manta で満たすことはできません。 Manta 2.1 から、Windows では UI の文字が OS のフォント(游ゴシック / Microsoft YaHei / Segoe UI など、再配布はしません)で描かれ、拡大縮小してもつぶれません。/manta font off で従来のフォントに戻せます。

追加

  • サウンドハンディ(新アイテム): 自分の再生装置のリモコンです。装置を右クリックで対象に、それ以外を右クリックでハンディ画面(右下の小さなパネル: 装置の一覧と、行をクリックで開く装置ページ)。 Shift + ホイールで対象を順に切替、中ボタンで対象を再生 / 停止、Shift + R でその場から対象の範囲指定ボードを表示・編集、Shift + H で対象の枠をブロック越しに表示。 左下のミニ HUD が対象の名前・入っている記録媒体(形式ごとの色のアイコンとファイル名)・状態・範囲・ハイライトの ON/OFF を出し、対象を切り替えると行がスライドします。 ハンディからのテスト再生は自分にだけ、今いる場所で鳴ります。装置の再生・停止や範囲の編集は、ハンディの持ち主の装置だけが対象です。
  • 装置の名前: 再生装置の画面またはハンディから名前を付けられます。装置に保存され、ハンディの一覧とミニ HUD に出ます。
  • wiki: サウンドハンディのページを追加(英 / 日、全 6 ページ)。
  • 途中参加でも、どの音も「途中から」聞こえるようになりました 1 回再生の音も、サーバー参加・別ディメンションからの移動・範囲内への進入のいずれでも配信されます。 開始からの経過時間(自分のダウンロードにかかった時間も含む)ぶん進んだ位置から鳴ります。 最初から聞いている人は自分の初回ダウンロードのぶん遅れているため、途中参加者のほうがその分だけ先行することがあります。 音が終わったあとに範囲内へ来た人には何も鳴らず、その音は片付けられます。
  • 通常再生の ∞ ボタン(再生・停止の右)。単体スロットの媒体を止めるまで繰り返します。 再生中に切り替えると、いま鳴っている音にその場で効きます: OFF は各プレイヤーが今のパスを最後まで聞いて止まり、ON は endless として鳴り直します。
  • スケジュールの ON/OFF トグルはスケジュール画面のボタン行に移りました(本画面のトグルは廃止)。
  • 範囲ボードスロット・減衰・範囲表示・スケジュールボタンを 1 行に整理。
  • レッドストーン出力: 装置画面の赤いレッドストーンボタンから、再生に連動したレッドストーン出力を最大 16 本のルールで設定できます。 「再生中」は再生している間だけ出力(ランプ点灯)、「開始時 / 停止時 / 終了時」は事象からの遅延後にパルスを出します。 強度(1〜15)・遅延(0.5 秒刻み、最大 30 秒)・パルス長(0.1 秒刻み、最大 5 秒)はすべてホイールで設定。複数のルールが重なるときは最も強い値を、隣接するダスト・ランプ・リピーターへ弱い信号として全面に出力します(固体ブロックは通しません)。 各ルールの「対象」で、スケジュールの特定のエントリ(#1〜#16)だけに反応させることもできます(「全体」は単体再生を含め何が再生されても反応)。
  • スケジュールは 16 エントリまで(旧 6)。スケジュール画面・レッドストーン画面とも 6 行ずつ表示し、ホイールとスクロールバーで送ります。 各行の × は停止ボタンになり、エントリの削除は記録媒体スロット右のゴミ箱に移りました(媒体は手元に戻ります)。
  • スケジュールを ON にしたとき、通常スロットに残っていた記録媒体はプレイヤーのインベントリへ戻ります(入らなければ足元に落ちます)。 既定はルール無し・出力 OFF なので既存の装置は変わりません。装置自身の出力が隣のダストを通じて入力に戻っても、再生が再始動しないようにしています。
  • 再生範囲プリセット: 範囲指定ボードを入れないときの再生範囲を、装置画面の「再生範囲」行にホバーしてホイールで 1〜64 ブロックに設定できます。 新しく置いた装置は 64 ブロック(ジュークボックスと同じ)から始まります。既存の装置は保存されている値のままです。 ボードを入れている間はボードの範囲が使われ、この行は「範囲指定ボードで設定中」と表示します。変更は次の再生から効きます。 なお、角だけ設定した範囲指定ボード(面ごとの減衰距離は未編集)は、これまで装置側の範囲を 6 面の減衰距離に流用していましたが、ボード既定の 8 ブロックを使うようになりました。

修正

  • 単体スロットの ∞ 再生が 10 分で止まっていた問題(安全網タイムアウトに到達していた)。
  • 空スロットへのレッドストーンパルスが、走行中のスケジュールの ∞ エントリを黙って解除していた問題。
  • ∞ 再生中に媒体を抜いても鳴り続けていた問題。
  • 範囲ボードのツールチップとアップロード失敗メッセージが英語固定だった問題。
  • 途中参加者が、開始からいる人より 7 秒ほど遅れて聞こえていた問題(実機 2026-09-02)。 到着時刻を、参加直後のロード中に止まっているメインスレッドではなくパケットの受信時に取るようにし、 追いつくために捨てる区間をデコードしている時間も捨てる区間に含めるようにしました。

内部

  • ネットワーク版 1.5(client_play_audio に開始オフセットと同期フラグ、client_set_loop / catchup_report 追加)。旧 client は接続時に拒否されます。
  • サーバーログ SAS-CatchUp に、各クライアントが実際に適用した開始位置が記録されます(最初の可聴バイトを書く時点の最終値。可聴に達する前に止まった場合は回線を閉じる時点で 1 回。SAS-Delivery の sweep 行には tick 由来の offset と壁時計の wallMs を並記)。

重要な変更

  • 全画面を Manta UI へ移行 再生装置・記憶装置の画面を Manta UI ランタイム上の BelugaExperience デザインワークフローで再構築。旧 GUI テクスチャは撤去しました。
  • Manta を jar に内包 (jar-in-jar) Manta 1.1.12 を同梱し、必須依存として宣言。ユーザーが Manta を別途インストールする必要はありません。

追加

  • ♪ スケジュール (プレイリスト) 再生装置から複数の記録媒体を順番に再生できるエディタ。最大 6 エントリ、各エントリの再生回数は 1〜10 回。インベントリから行のスロットへドラッグ、または Shift クリックで最初の空き行へ割り当て。▲ / ▼ で並べ替え、行の ▶ で試聴、✕ で削除 (媒体は返却)。▶ Play All で通し再生し、再生中の行は枠線で示されて進行に合わせて移動します。再生回数はホバーしてホイールで変更します。
  • ゲーム内 wiki 各画面の 📖 ボタンでその画面の解説ページを開きます。ヒント ON のときは要素にホバーして F1 を押すと、その機能のページへ直接飛べます。英語 / 日本語の 5 ページを収録。
  • ヒント表示 各画面右上のトグル。ON にすると、ホバーした要素の説明が画面左下に表示されます。
  • ジャケット (カバーアート) 表示 音声ファイルに埋め込まれたアートワークを記憶装置・再生装置の画面に表示します。JPEG のジャケットも Manta の画像デコーダ経由で表示されます。
  • アクセスモード (公開 / 非公開) デバイスを最初に開いたプレイヤーが所有者になります。顔アイコンで公開 (緑) / 非公開 (赤) を切り替え、非公開の間は所有者以外は開けません。
  • 範囲指定ボードの HUD 手に持つと画面下部に HUD が出ます。Alt + ホイールでモード切替、Ctrl または Shift + ホイールで現在モードの値を調整 (通常範囲指定モード以外)。ホイールには 180ms のクールダウンがあり、一度のフリックで連続変化しません。
  • 書き込みエラーの通知 記憶装置での書き込み失敗が画面上に表示されるようになりました。

Bug Fixes

  • 1.0.3 以前のワールド資産が認識されない問題を修正 1.0.4 の改名では namespace だけが変わったため、チャンク内のブロック・インベントリ内のアイテム・ブロックエンティティ・メニュー・音声 ID を保持するデータコンポーネントが、いずれも存在しない Mod を指したままになっていました。旧 ID (stationsoundsystem) から現行 ID へのレジストリエイリアスを追加し、AudioStorage は旧ディレクトリ (<world>/stationsoundsystem_audio/) もフォールバックとして参照します。1.0.3 以前のワールドの記録媒体・再生装置・範囲指定ボードがそのまま使えます (1.0.4 の「新規ワールドへ移行が必要」という注意は解消されました)。

改善

  • 再生セッションのレジストリとスケジューラを追加し、再生の開始 / 停止 / 完了通知を一元化。
  • 再生のタイムアウト処理を追加。
  • プレイリスト操作パケットの入力検証を強化。
  • 音声ストレージ・ネットワーク・音声処理まわりを全体的に堅牢化。
  • 操作系グリフを Manta のアイコンへ置き換え。
  • ユニットテストを追加 (52 件)。

この版で mod ID が stationsoundsystem(Station Sound System)から spatialaudiosystem(Spatial Audio System)へ変わりました。

重要な変更 (Mod のリネーム / ID 変更)

  • Mod 名を「Station Sound System」から「Spatial Audio System」に変更 鉄道駅専用ではなく汎用的な空間音響再生 Mod として位置づけを明確化。
    • Mod ID: stationsoundsystem → spatialaudiosystem
    • 表示名: Station Sound System → Spatial Audio System
    • Java パッケージ root: com.example.stationsoundsystem → com.spatialaudiosystem
    • メインクラス: StationSoundSystem → SpatialAudioSystem
    • リソース ID (assets/、data/)・GitHub リポジトリ名も同名に変更
    • 既存ワールドから 1.0.3 以前の記録媒体・再生装置・範囲指定ボードを引き継ぐと認識されないので、新規ワールドへ移行するか、各アイテム / ブロックを置き直す必要があります

公開 API の追加 (他 Mod 連携用)

  • 新パッケージ belugalab.sas.api を追加。バージョン間で安定した API 表面として維持されます (内部パッケージ com.spatialaudiosystem.* はリパッケージされるため、addon mod は必ずこちらを参照してください)。
  • belugalab.sas.api.SasApi — facade クラス
    • isInstalled — SAS が読み込まれているか
    • isRecordingMedium, isRangeBoard — アイテム種別判定
    • hasAudio, getAudioFileName, getAudioFormat, getAudioId — 記録媒体メタデータ
    • hasRange, getRangePos1, getRangePos2, getAttenuationRanges — 範囲指定ボードのメタデータ
    • loadAudio, loadAudioFromMedium — サーバー側の音声バイナリ読み込み
    • playAudio — サーバー側からブロードキャスト再生
    • stopAudio — 指定位置の再生停止
  • belugalab.sas.api.PlaybackEndedEvent (NeoForge event)
    • 再生完了時に発火。連鎖再生 / シーケンシャル再生を実装する mod が polling 不要で連結できる
    • PlaybackControlPayload の停止通知ハンドラからも発火するため、PlaybackDeviceBlockEntity を介さない playAudio 呼び出し (= addon mod 側で動的に再生する場合) もカバー

Bug Fixes

  • ワールドを抜けた後にタイトル画面で音声が鳴り続ける問題を修正 新規 ClientLifecycleHandler で ClientPlayerNetworkEvent.LoggingOut と LevelEvent.Unload を購読し、AudioManager.stopAll() を呼ぶように変更。送受信中の ClientAudioChunkPayload チャンクセッションも一括クリアするため、再ログイン後に旧セッションの残骸が混ざる問題も併せて解消。

重要な変更

  • 音声データのチャンク分割送信を実装 アップロード(Client→Server)・再生配信(Server→Client)の両方で音声データを500KB単位に分割して送信するよう変更。 NeoForgeのパケットサイズ上限(約1MB)を超える音声ファイルでもサーバーからキックされなくなった。 最大ファイルサイズを10MBに拡大。

改善

  • チャンク転送セッションのタイムアウト追加 アップロード・ダウンロードの未完了セッションは30秒で自動破棄。切断時のメモリリークを防止。
  • ClientNotifyPayload をoptional化 サーバーとクライアントのModバージョンが異なる場合でも接続拒否されなくなった。
  • lite inventory構築を自動化 getUpdateTag() のコンポーネントコピーを手動リストから copy() + remove(AUDIO_DATA) に変更。 新コンポーネント追加時の漏れを防止。
  • 範囲指定ボードの通知メッセージをHUDに移動 座標設定・クリア時のメッセージがアクションバーではなくアイテム名の下に表示されるよう変更。 パネルとの重なりを解消。

Bug Fixes

  • 大容量音声ファイルの書き込みでキックされる問題を修正 単一パケットのサイズ上限を超える音声ファイルを送信しようとするとサーバーからキックされていた問題を修正。
  • 大容量音声ファイルの再生で全プレイヤーがキックされる問題を修正 サーバーから全クライアントへの再生配信でも同様のパケットサイズ超過が発生していた問題を修正。

重要な変更

  • 音声データの保存方式をファイルベースに変更 音声データをItemStackのDataComponentから分離し、ワールドデータとしてサーバー側のファイルに保存するよう変更。 <world>/stationsoundsystem_audio/<uuid>.audio に個別ファイルとして保存。 ItemStackにはUUID参照(AUDIO_ID)のみ保持し、ネットワーク同期やクリエイティブモードによるデータ破損を根本的に解決。 旧バージョンの記録媒体は初回再生時に自動でマイグレーションされる。

改善

  • Modアイコンを追加 Mod一覧に再生装置のアイコンが表示されるようになった。
  • 範囲指定ボードのパネル文字を日本語化 モード名を「通常範囲指定」「減衰率設定」「下向き設定」に変更。方向名・説明文も日本語化。 長いモード名がパネルからはみ出さないようスケーリング処理を追加。
  • 範囲指定ボードの遠距離選択を追加 手の届かない位置のブロックも64ブロック先まで右クリックで選択可能に。
  • 範囲指定ボードの追従アニメーションを追加 Pos1のみ設定時、Pos2が視線先になめらかに追従するプレビュー表示を追加。 両ポイント未設定時も視線先に1ブロックのプレビューボックスを表示。

Bug Fixes

  • バージョンアップ時に音声データが破損する問題を根本修正 音声データをファイルベースストレージに移行し、ItemStackのネットワーク同期を経由しなくなったため、 クリエイティブモードやコンテナ操作による破損が発生しなくなった。
  • ワールド参加時に範囲外で音が鳴る問題を修正 レンダースレッドからフレームごとにゲイン更新を行うよう改善。

Bug Fixes

  • 減衰モードが機能しない不具合を修正 バックグラウンドの音声スレッドから ClientLevel のプレイヤーリストに非スレッドセーフなアクセスを行っていたため、ConcurrentModificationException が内部でサイレントキャッチされ、ゲインが常に 1.0(最大音量)のままになっていた問題を修正。 プレイヤー座標をメインスレッドからフレームごとにキャッシュし、音声スレッドはそのキャッシュを参照するよう変更。
  • 減衰ゲインの更新タイミングを改善(オレンジ枠から出た瞬間に一瞬フルボリュームになる問題を修正) 以前は音声スレッドが約 260ms ごとにゲインを更新していたため、プレイヤーが範囲外に出た直後も一瞬フルボリュームで聞こえていた。 レンダースレッド(約 60fps)でゲイン更新を行うよう変更し、応答速度を大幅に改善。
  • 他のプレイヤーが再生した音声で減衰モードが機能しない問題を修正 上記のゲイン更新タイミング改善により、自分以外のプレイヤーが書き込んだ記録媒体を再生した場合でも、正しく減衰が適用されるようになった。
  • レッドストーン入力で音声が再生されない不具合を修正 マルチプレイヤー対応のリファクタリング時に startPlayback() のパケット送信処理が欠落していた問題を修正。レッドストーンの立ち上がりエッジで全クライアントに再生パケットを送信するよう復元。
  • 記録媒体の音声データが破損する問題を修正 クリエイティブモードのアイテムスロット同期パケットがクライアント側の仮データ(プレースホルダー)でサーバー側の実データを上書きしてしまう問題を修正。 再生時に不正なデータを検出した場合は再生をスキップするバリデーションを追加。
  • ブロック破壊時に他クライアントの音声が停止しない問題を修正 再生装置が破壊された際、ClientStopAudioPayload を全プレイヤーに送信するよう修正。

NeoForge 1.21.1 向けの初回リリース。この時点の名前は Station Sound System、mod ID は stationsoundsystem です (改称は 1.0.4)。

追加内容

  • 再生装置 (ブロック) — 記録媒体の音声を再生します。
  • 録音装置 (ブロック) — PC の音声ファイルを記録媒体に書き込みます。
  • 記録媒体 (アイテム) — MP3 / OGG / WAV に対応。
  • 範囲指定ボード (アイテム) — 音声の聞こえる 3D 範囲と減衰を設定します。
  • レッドストーン入力による自動再生。
  • マルチプレイ対応。

出典: GitHub Release v1.0.0 (原文が日本語。CHANGELOG.md は 1.0.1 から) + 出荷 jar の neoforge.mods.toml (この版の mod ID と表示名、改称は 1.0.4)