# 機能設計書 131-VSTエフェクトDLL群

## 概要

本ドキュメントは、K-Shoot MANIA のプレイ画面および譜面エディタにおいて使用される7種類のVSTエフェクトDLL（bitc.dll / flan.dll / phas.dll / pitc.dll / regawo.dll / sich.dll / tstp.dll）の設計仕様を記述する。これらのDLLはBASS Audio LibraryのVSTプラグインブリッジ（bass_vst.dll）を介してオーディオストリームに接続され、リアルタイムにオーディオエフェクトを適用する。

### 本機能の処理概要

**業務上の目的・背景**：音楽ゲームであるK-Shoot MANIAでは、ゲームプレイ中にFXボタンやレーザー操作と連動してオーディオにリアルタイムエフェクトを適用する仕組みが不可欠である。KSH譜面フォーマットではRetrigger、Gate、Flanger、PitchShift、BitCrusher、Phaser、Wobble、TapeStop、Echo、SideChain Compressorの10種類のエフェクトタイプが定義されており、これらを物理的に実現するために7種類のVST DLLプラグインが使用される。各DLLは単一または複数のエフェクトタイプを担い、BASS_VST_ChannelSetDSPでオーディオチャンネルに挿入された後、BASS_VST_SetParamによりパラメータがリアルタイムに制御される。

**機能の利用シーン**：プレイ画面においてFXロングノートの開始/終了時にエフェクトがON/OFFされる場面、レーザー操作でフィルターエフェクトパラメータが連続変化する場面、およびユーザー定義エフェクト（#define構文）による独自パラメータのエフェクト適用場面で利用される。また、譜面エディタのプレビュー再生時にも同様にVSTエフェクトが適用される。

**主要な処理内容**：
1. bass_vst.dll を経由した各VSTエフェクトDLLのオーディオチャンネルへの挿入（BASS_VST_ChannelSetDSP）
2. エフェクトパラメータの初期設定（BASS_VST_SetParam / BASS_VST_SetParam_R）
3. BPM変化に連動したテンポ同期パラメータの更新（Retrigger/Gate/Echo等の周期パラメータ）
4. FXノートイベントに応じたエフェクトのByPass切替（パラメータ29番によるバイパス制御）
5. レーザー位置に連動したフィルターエフェクトパラメータの連続変調
6. ユーザー定義エフェクト（#define）によるカスタムDLLパラメータの適用
7. SwitchAudio用チャンネルへのエフェクト同期適用

**関連システム・外部連携**：BASS Audio Library（bass.dll）のオーディオエンジン基盤の上で動作し、bass_vst.dllがVSTプラグインのホスティングを担う。各VSTエフェクトDLLはlib/ディレクトリに配置され、実行時にdir_default変数で示されるアプリケーションルートからの相対パスで読み込まれる。

**権限による制御**：権限による制御は存在しない。譜面データ内のエフェクト指定と、オプション設定画面のエフェクトレート設定に基づいて自動的に適用される。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 5 | ゲームプレイ画面 | 主画面 | FXロングノート/レーザー操作に連動してVSTエフェクトDLL群をリアルタイム適用 |

## 機能種別

データ連携 / リアルタイム信号処理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| mid.0 | int | Yes | メインオーディオストリームのチャンネルハンドル | BASS_StreamCreateFileで生成された有効なハンドル |
| mid_sw.* | int | No | SwitchAudioストリームのチャンネルハンドル（0〜30） | KSHLib_SwitchAudioOpenで生成された有効なハンドル |
| dir_default | string | Yes | アプリケーションルートディレクトリパス | DLLが存在するlib/サブディレクトリを含むパス |
| feffect | int | Yes | FXエフェクト有効フラグ（0:無効, 1:有効） | 0 or 1 |
| fl_* フラグ群 | int | Yes | 各エフェクトタイプの使用フラグ（fl_Retr, fl_Gate, fl_Flan, fl_Pitc, fl_BitC, fl_Phas, fl_TStp, fl_Echo, fl_SiCh） | 0 or 1 |
| bpmfx | int | Yes | 現在のBPM値（10倍値） | 正の整数 |
| feffectnow.* | int | Yes | 現在有効なエフェクト種別（L/R独立） | FX_RE8〜FX_SICH(1〜19) or 100+ユーザー定義ID |
| feffectparam.* | int | Yes | エフェクトパラメータ値 | エフェクト種別に依存 |
| pdstat | double | Yes | レーザーフィルター位置（0.0〜1.0） | 0.0 <= pdstat <= 1.0 |
| userfx_params | double[N][10] | No | ユーザー定義エフェクトのパラメータ配列 | #define構文で定義された値 |

### 入力データソース

- 譜面ファイル（.ksh）のFXロングノートデータ（play_chart_load.hspで解析）
- 譜面ファイル（.ksh）の#define fx / #define filter構文（カスタムエフェクト定義）
- プレイ中のBPM変化データ（bpml配列）
- レーザーノートの位置データ（analogpos, analognow配列）
- オーディオストリームのチャンネルハンドル（play_audio.hspで生成）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| hFX_Retr | int | Retriggerエフェクトハンドル（regawo.dll） |
| hFX_Gate | int | Gate/Wobbleエフェクトハンドル（regawo.dll） |
| hFX_Echo | int[2] | Echoエフェクトハンドル（L/R独立, regawo.dll） |
| hFX_Flan | int | Flangerエフェクトハンドル（flan.dll） |
| hFX_Pitc | int | PitchShiftエフェクトハンドル（pitc.dll） |
| hFX_BitC | int | BitCrusherエフェクトハンドル（bitc.dll） |
| hFX_Phas | int | Phaserエフェクトハンドル（phas.dll） |
| hFX_TStp | int[2] | TapeStopエフェクトハンドル（L/R独立, tstp.dll） |
| hFX_SiCh | int | SideChainエフェクトハンドル（sich.dll） |
| hBitCFX | int | フィルター用BitCrusherエフェクトハンドル（bitc.dll） |
| hBitCFX_sw | int[N] | SwitchAudio用BitCrusherエフェクトハンドル（bitc.dll） |
| hFX_User | int[N] | ユーザー定義エフェクトハンドル配列 |

### 出力先

オーディオストリームのDSPチェーン（BASS Audio Libraryのチャンネル内でリアルタイム処理）

## 処理フロー

### 処理シーケンス

```
1. VSTエフェクトDLL初期化（applyVSTEffects）
   └─ fl_*フラグが1のエフェクトについて BASS_VST_ChannelSetDSP でDLLをロード
      ├─ Echo: regawo.dll x2（L/R独立）, priority=26
      ├─ Retrigger: regawo.dll, priority=25
      ├─ PitchShift: pitc.dll, priority=20
      ├─ BitCrusher: bitc.dll, priority=19
      ├─ TapeStop: tstp.dll x2, priority=19/18
      ├─ Gate/Wobble: regawo.dll, priority=17
      ├─ Phaser: phas.dll, priority=16
      ├─ Flanger: flan.dll, priority=15
      └─ SideChain: sich.dll, priority=14
2. 各エフェクトの初期パラメータ設定
   └─ BASS_VST_SetParam_R でデフォルトパラメータを設定
3. ユーザー定義エフェクトの適用
   └─ hFX_User配列にカスタムDLLをロードしパラメータ設定
4. SwitchAudio用エフェクト初期化
   └─ mid_sw各チャンネルにBitCrusherとPeakingFilterを設定
5. 毎フレームのエフェクト更新処理（processAudioEffects）
   ├─ BPM変化検出時のテンポ同期パラメータ更新
   ├─ Retrigger/Gate/Wobble/Echoの拍トリガー更新
   ├─ FXノートイベントによるByPass ON/OFF切替
   ├─ レーザー位置によるフィルターパラメータ連続変調
   └─ SwitchAudioチャンネルへのパラメータ同期
```

### フローチャート

```mermaid
flowchart TD
    A[プレイ開始] --> B[譜面ロード: fl_*フラグ設定]
    B --> C{feffect == 1?}
    C -->|No| Z[エフェクトなし]
    C -->|Yes| D[applyVSTEffects: DLLロード]
    D --> E[各エフェクト初期パラメータ設定]
    E --> F[ユーザー定義エフェクトロード]
    F --> G[SwitchAudio用エフェクト初期化]
    G --> H[ゲームループ開始]
    H --> I[processAudioEffects]
    I --> J{BPM変化あり?}
    J -->|Yes| K[テンポ同期パラメータ更新]
    J -->|No| L{FXノートイベント?}
    K --> L
    L -->|Yes| M[ByPass切替 + パラメータ変更]
    L -->|No| N{レーザー操作中?}
    M --> N
    N -->|Yes| O[フィルターパラメータ変調]
    N -->|No| P[SwitchAudio同期]
    O --> P
    P --> H
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-131-01 | エフェクト優先度 | 各VSTエフェクトはpriority値に基づくDSPチェーン内の処理順序で適用される。低い値ほど後段（出力側）に配置される | 全エフェクト |
| BR-131-02 | ByPass制御 | パラメータ番号29をfloat値1.0fでByPass、0.0fでエフェクト有効化 | Retrigger, Echo, Phaser, Flanger, PitchShift, SideChain |
| BR-131-03 | テンポ同期 | BPM変化時に周期パラメータを `60.0f*4.0f*1000.0f/bpmfx/10.0f/divisor` の計算式で更新 | Retrigger, Gate, Wobble, Echo |
| BR-131-04 | DLLパス解決 | DLLファイルは `dir_default+"\\lib\\"` + DLL名 のパスから読み込む | 全DLL |
| BR-131-05 | リトライ制御 | BASS_VST_SetParam_Rは最大5回のリトライを行い、エラーコード0（成功）で打ち切る | 全BASS_VST_SetParam呼び出し |
| BR-131-06 | regawo.dll多重用途 | regawo.dllはRetrigger/Gate/Wobble/Echoの4種類のエフェクトで共用される | regawo.dll使用時 |
| BR-131-07 | L/R独立インスタンス | Echo、TapeStopは左右のFXレーンごとに独立したDLLインスタンスを持つ | Echo, TapeStop |
| BR-131-08 | ユーザー定義エフェクト | #define構文で定義されたカスタムエフェクトは対応するDLLをfxdef_dllname配列から取得して動的にロードする | ユーザー定義エフェクト使用時 |

### 計算ロジック

**テンポ同期周期の計算**：
```
period_ms = 60.0 * 4.0 * 1000.0 / bpmfx / 10.0 / divisor
```
- bpmfx: 現在のBPM（10倍整数値）
- divisor: 音符分割数（例: Retrigger 8分 = 8, Gate 4分 = 4）
- 結果は0.0〜1.0にクランプされてVSTパラメータとして設定

**PitchShiftのピッチ計算**：
```
vst_param = pitch / 48.0 / 2.0 + 0.50
```
- pitch: 半音数（-48〜+48の範囲）
- 0.5 が基準ピッチ（変更なし）に対応

**BitCrusherのリダクション計算**：
```
vst_param = reduction / 128.0
```
- reduction: サンプルリダクション値（0〜128）

## データベース操作仕様

### 操作別データベース影響一覧

該当なし。本機能はリアルタイムオーディオ信号処理であり、データベースへのアクセスは発生しない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| BASS_ERROR | VST設定エラー | BASS_VST_SetParamの実行に失敗した場合 | BASS_VST_SetParam_Rにより最大5回リトライを実行 |
| -1 | DLLロード失敗 | BASS_VST_ChannelSetDSPでDLLのロードに失敗した場合 | ハンドルが-1の場合、BASS_VST_SetParam_Rは処理をスキップ |
| dialog表示 | SwitchAudio超過 | SwitchAudioのファイル数が31を超えた場合 | "Error: Too many Switch Audio Effects"ダイアログを表示 |
| dialog表示 | 不明エフェクト | #define構文で未定義のエフェクトタイプが指定された場合 | "Error: Unknown effect type"ダイアログを表示 |
| dialog表示 | 不明パラメータ | #define構文で未定義のパラメータ名が指定された場合 | "Warning: Unknown paramater"ダイアログを表示 |

### リトライ仕様

BASS_VST_SetParam_R関数（src/bass_vst.as 12-23行目）において、VSTパラメータ設定に失敗した場合は最大5回のリトライを行う。vst_aハンドルが-1の場合はリトライせずスキップする。

## トランザクション仕様

該当なし。リアルタイムオーディオ処理のため、トランザクション管理は存在しない。

## パフォーマンス要件

- VSTエフェクトDLLはDSPチェーンに挿入されるため、オーディオバッファ更新周期（updateperiod設定値、デフォルト5ms）内で全エフェクト処理が完了する必要がある
- processAudioEffectsは `ts_bass > max(updateperiod/5, 1)` の条件で実行頻度を制限し、過剰なCPU負荷を防止
- SwitchAudioチャンネルにはパフォーマンス上の理由からユーザー定義エフェクトは適用されない（コード内コメントによる）
- priority値によるDSPチェーン順序制御により、エフェクト間の処理順序を最適化

## セキュリティ考慮事項

- VSTエフェクトDLLはlib/ディレクトリから固定パスで読み込まれるため、外部からの任意DLL注入リスクは低い
- DLLパスはdir_default変数に基づいて構築され、ユーザー入力によるパス操作は発生しない
- ユーザー定義エフェクト（#define構文）は既知のエフェクトタイプとDLL名（fxdef_dllname配列）にのみマッピングされるため、任意のDLLロードはできない

## 備考

- 7種類のVSTエフェクトDLLと10種類のエフェクトタイプの対応関係は以下の通り:
  - regawo.dll: Retrigger, Gate, Wobble, Echo の4種類
  - flan.dll: Flanger の1種類
  - pitc.dll: PitchShift の1種類
  - bitc.dll: BitCrusher の1種類（フィルター用途にも使用）
  - phas.dll: Phaser の1種類
  - tstp.dll: TapeStop の1種類
  - sich.dll: SideChain Compressor の1種類
- SwitchAudioタイプ（FXDEF_FXTYPE_AUDI）はDLLを使用せずKSHLib経由のオーディオファイル切替で実現される
- 譜面エディタ（kshooteditor.hsp）でも同一のVSTエフェクトDLL群がプレビュー再生時に使用される

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

エフェクト定義テーブル（fxdef_*配列群）がVSTエフェクトDLLの制御の基盤となる。まずこのデータ構造を理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | fxdef.hsp | `src/audio/fxdef.hsp` | エフェクトタイプ定数（FX_RE8〜FX_SICH）、DLLとエフェクトタイプのマッピング、パラメータ定義テーブル |

**読解のコツ**: fxdef.hspは多次元配列でエフェクト定義を管理している。`fxdef_name.パラメータ番号.エフェクトタイプ番号`の形式で、エフェクトタイプ番号0〜10に対応するパラメータ名・型・デフォルト値・VSTパラメータ番号・最大値を定義する。
- **1-4行目**: FX_RE8〜FX_SICH定数：エフェクト種別の識別用定数（1〜19）
- **24-34行目**: FXDEF_*パラメータ型定数：VSTパラメータの型分類（INT, RATE, SAMPLE, LENGTH等）
- **36-48行目**: FXDEF_FXTYPE_*定数：エフェクトDLL種別定数（0〜10）
- **64-74行目**: fxdef_*配列宣言：パラメータ数、名前、型、デフォルト値、VSTパラメータ番号、DLL名、priority、リンクパラメータ
- **76-86行目**: Retrigger定義 - regawo.dll, priority=25, パラメータ5個
- **88-98行目**: Gate定義 - regawo.dll, priority=17, パラメータ3個
- **100-110行目**: Flanger定義 - flan.dll, priority=15, パラメータ7個
- **112-122行目**: PitchShift定義 - pitc.dll, priority=20, パラメータ4個
- **124-134行目**: Phaser定義 - phas.dll, priority=16, パラメータ9個
- **136-146行目**: BitCrusher定義 - bitc.dll, priority=20, パラメータ2個
- **148-158行目**: Wobble定義 - regawo.dll, priority=17, パラメータ5個
- **160-170行目**: TapeStop定義 - tstp.dll, priority=18, パラメータ3個
- **172-182行目**: Echo定義 - regawo.dll, priority=26, パラメータ6個
- **184-194行目**: SideChain定義 - sich.dll, priority=14, パラメータ6個

#### Step 2: VSTブリッジインターフェースを理解する

BASS_VSTラッパーがDLLとの通信層を担う。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | bass_vst.as | `src/bass_vst.as` | bass_vst.dllの関数宣言とリトライ付きパラメータ設定ラッパー |

**主要処理フロー**:
- **4行目**: `#uselib "bass_vst.dll"` - VSTブリッジDLLの宣言
- **5行目**: `BASS_VST_ChannelSetDSP` - VSTプラグインをチャンネルに挿入する関数（引数: チャンネルハンドル, DLLパス, reserved, priority）
- **6行目**: `BASS_VST_SetParam` - VSTパラメータを設定する基本関数（引数: VSTハンドル, パラメータ番号, 値）
- **7行目**: `BASS_VST_GetParam` - VSTパラメータを取得する関数
- **12-23行目**: `BASS_VST_SetParam_R` - リトライ付きパラメータ設定関数。ハンドルが-1でないことを確認し、最大5回のリトライでBASS_VST_SetParamを実行

#### Step 3: エフェクト初期化処理を理解する

VSTエフェクトのDSPチェーンへの挿入と初期パラメータ設定。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | play_audio_effects.hsp | `src/scene/play/play_audio_effects.hsp` | applyVSTEffects関数によるDLLロードと初期化 |

**主要処理フロー**:
- **215行目**: `#deffunc applyVSTEffects` - VST初期化エントリーポイント
- **217行目**: `if(feffect=1)` - FXエフェクト有効時のみ処理
- **222-226行目**: Echo初期化（regawo.dll x2、L/R独立）
- **228-233行目**: Retrigger初期化（regawo.dll、ByPass=1.0f）
- **234-240行目**: PitchShift初期化（pitc.dll、ピッチ0, チャンクサイズ700/44100）
- **241-244行目**: BitCrusher初期化（bitc.dll、reduction=0）
- **247-250行目**: TapeStop初期化（tstp.dll x2）
- **251-261行目**: Gate/Wobble初期化（regawo.dll、各種周波数パラメータ）
- **262-273行目**: Phaser初期化（phas.dll、9パラメータ設定）
- **274-283行目**: Flanger初期化（flan.dll、7パラメータ設定）
- **284-289行目**: SideChain初期化（sich.dll、holdTime/attackTime/releaseTime設定）
- **291-312行目**: ユーザー定義エフェクトの動的ロードとパラメータ設定

#### Step 4: リアルタイムエフェクト更新処理を理解する

毎フレームのエフェクトパラメータ更新ロジック。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | play_audio_effects.hsp | `src/scene/play/play_audio_effects.hsp` | processAudioEffects関数によるリアルタイム更新 |

**主要処理フロー**:
- **316行目**: `#deffunc processAudioEffects` - 毎フレーム更新エントリーポイント
- **401-437行目**: BPM変化検出時のテンポ同期パラメータ一括更新
- **443-478行目**: Retrigger/Gate/Wobble/Echoの拍トリガー更新（UNIT_MEASURE分解能での拍位置計算）
- **483-496行目**: FXノートイベントの検索と現在有効エフェクトの決定
- **498-505行目**: ByPass制御（有効エフェクトのByPass=0、非有効エフェクトのByPass=1）
- **590-774行目**: エフェクト切替処理（前回と現在のエフェクト比較によるON/OFF遷移）
- **786-900行目**: レーザーフィルターエフェクトのパラメータ連続変調

#### Step 5: カスタムエフェクト定義解析を理解する

譜面ファイルの#define構文によるカスタムエフェクト定義の解析。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 5-1 | play_audio_effects.hsp | `src/scene/play/play_audio_effects.hsp` | initCustomAudioEffects関数によるカスタムエフェクト解析 |

**主要処理フロー**:
- **1行目**: `#deffunc initCustomAudioEffects` - カスタムエフェクト解析エントリーポイント
- **6-77行目**: FXエフェクト定義（#define fx）の解析ループ
- **78-176行目**: フィルターエフェクト定義（#define filter）の解析ループ
- **25-74行目**: fxdef_name配列との照合によるエフェクトタイプ識別
- **36-69行目**: パラメータ値の解析（">"区切りによるOFF/ON値、";"区切りによる複数パラメータ）
- **180-213行目**: SwitchAudioファイルの読み込みとリンク

### プログラム呼び出し階層図

```
play_init (プレイ初期化)
    |
    +-- loadKSHChartFile (譜面ロード)
    |       +-- fl_*フラグ設定 (各エフェクト使用有無判定)
    |       +-- #define fx/filter 解析 -> fxdefbuf_fx/fxdefbuf_filter
    |
    +-- initCustomAudioEffects
    |       +-- ユーザー定義FXエフェクト解析 -> userfx_* 配列
    |       +-- ユーザー定義フィルター解析 -> userfilter_* 配列
    |       +-- loadAudioFilesForSwitchAudio
    |               +-- KSHLib_SwitchAudioOpen -> mid_sw 配列
    |               +-- BASS_ChannelSetLink (メインストリームとリンク)
    |               +-- BASS_VST_ChannelSetDSP (bitc.dll for SwitchAudio)
    |
    +-- applyVSTEffects
    |       +-- BASS_VST_ChannelSetDSP (regawo.dll) -> hFX_Echo, hFX_Retr, hFX_Gate
    |       +-- BASS_VST_ChannelSetDSP (pitc.dll)   -> hFX_Pitc
    |       +-- BASS_VST_ChannelSetDSP (bitc.dll)   -> hFX_BitC
    |       +-- BASS_VST_ChannelSetDSP (tstp.dll)   -> hFX_TStp
    |       +-- BASS_VST_ChannelSetDSP (phas.dll)   -> hFX_Phas
    |       +-- BASS_VST_ChannelSetDSP (flan.dll)   -> hFX_Flan
    |       +-- BASS_VST_ChannelSetDSP (sich.dll)   -> hFX_SiCh
    |       +-- BASS_VST_ChannelSetDSP (fxdef_dllname) -> hFX_User
    |       +-- BASS_VST_SetParam_R (初期パラメータ群)
    |
    +-- play_update (毎フレーム更新ループ)
            +-- processAudioEffects
                    +-- BPM変化検出 -> テンポ同期パラメータ更新
                    +-- 拍トリガー計算 -> Retrigger/Gate/Echo更新
                    +-- FXノートイベント検索 -> ByPass切替
                    +-- レーザー位置計算 -> フィルターパラメータ変調
                    +-- SwitchAudio同期
```

### データフロー図

```
[入力]                          [処理]                               [出力]

譜面データ (.ksh)
  |
  +-- fl_*フラグ ───────> loadKSHChartFile ──────────> エフェクト使用有無
  +-- #define構文 ──────> initCustomAudioEffects ───> userfx_*/userfilter_*
                                |
VSTエフェクトDLL (lib/)         v
  +-- regawo.dll ──────> BASS_VST_ChannelSetDSP ──> hFX_Retr/Gate/Echo
  +-- flan.dll ────────> BASS_VST_ChannelSetDSP ──> hFX_Flan
  +-- pitc.dll ────────> BASS_VST_ChannelSetDSP ──> hFX_Pitc
  +-- bitc.dll ────────> BASS_VST_ChannelSetDSP ──> hFX_BitC/hBitCFX
  +-- phas.dll ────────> BASS_VST_ChannelSetDSP ──> hFX_Phas
  +-- tstp.dll ────────> BASS_VST_ChannelSetDSP ──> hFX_TStp
  +-- sich.dll ────────> BASS_VST_ChannelSetDSP ──> hFX_SiCh
                                |
                                v
BPM変化 (bpml配列) ──────> processAudioEffects ────> VSTパラメータ更新
FXノートイベント ─────────>                           (BASS_VST_SetParam_R)
レーザー位置 ────────────>                               |
                                                        v
                                                [オーディオ出力]
                                                リアルタイム処理済み
                                                オーディオストリーム
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| fxdef.hsp | `src/audio/fxdef.hsp` | ソース | エフェクト定義テーブル（DLL名、パラメータ、priority等の定義） |
| bass_vst.as | `src/bass_vst.as` | ソース | BASS VST DLL関数宣言とリトライ付きパラメータ設定ラッパー |
| play_audio_effects.hsp | `src/scene/play/play_audio_effects.hsp` | ソース | VSTエフェクトの初期化・リアルタイム更新処理の主要実装 |
| play_chart_load.hsp | `src/scene/play/play_chart_load.hsp` | ソース | 譜面ロード時のfl_*フラグ設定とユーザー定義エフェクト定義解析 |
| play_audio.hsp | `src/scene/play/play_audio.hsp` | ソース | オーディオストリーム生成（VSTエフェクトの適用先チャンネル） |
| kshooteditor.hsp | `kshooteditor.hsp` | ソース | 譜面エディタでのVSTエフェクトDLL使用（プレビュー再生） |
| bitc.dll | `lib/bitc.dll` | DLL | BitCrusherエフェクトVSTプラグイン |
| flan.dll | `lib/flan.dll` | DLL | Flangerエフェクトプラグイン |
| phas.dll | `lib/phas.dll` | DLL | PhaserエフェクトVSTプラグイン |
| pitc.dll | `lib/pitc.dll` | DLL | PitchShiftエフェクトVSTプラグイン |
| regawo.dll | `lib/regawo.dll` | DLL | Retrigger/Gate/Wobble/EchoエフェクトVSTプラグイン |
| sich.dll | `lib/sich.dll` | DLL | SideChain CompressorエフェクトVSTプラグイン |
| tstp.dll | `lib/tstp.dll` | DLL | TapeStopエフェクトVSTプラグイン |
| bass_vst.dll | ルートディレクトリ | DLL | BASS Audio Library VSTブリッジDLL |
