Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save shivaduke28/b7d7b0225b08dbf8bb339bf3c0ec6f1b to your computer and use it in GitHub Desktop.
Save shivaduke28/b7d7b0225b08dbf8bb339bf3c0ec6f1b to your computer and use it in GitHub Desktop.
claudeにBPM検知を実装させたときのログ
# BPM Detector プロトタイピング実装レポート
## 概要
RectorプロジェクトにおけるリアルタイムBPM検出機能のプロトタイプ実装を行った。当初は単純な低周波数レベル検出を使用していたが、スペクトラムフラックスベースのアプローチに移行し、より正確なBPM検出を実現した。
## 実装の経緯
### 1. 初期実装の問題点
- `audioInput.LevelLow`(時間領域の低周波数フィルタ)を使用
- BPMが150付近で張り付く問題が発生
- ダブルビート検出(実際のBPMの2倍を検出)が頻発
### 2. スペクトラムフラックスベースへの移行
- `audioInput.LogSpectrum`を使用した周波数領域での分析に変更
- 前フレームとのスペクトラム差分(フラックス)を計算
- 低周波数帯域(2-48ビン)に絞ってキックドラムを検出
### 3. パラメータ調整
- **クールダウン時間**: 0.1秒 → 0.4秒(ダブルビート防止)
- **閾値倍率**: 1.3 → 2.0(誤検出を減少)
- **BPM範囲**: 80-160 → 60-180(より広いジャンルに対応)
- **IOIバッファサイズ**: 32 → 64(統計的安定性向上)
### 4. BPM安定化の実装
- 信頼度ベースの更新ロジック
- BPM変化率のチェック(5%以上の変化で更新)
- 近接BPM(±2)を含めた信頼度計算
## 技術的知見
### 成功した点
1. **スペクトラムフラックス**は時間領域のレベル検出より正確
2. **低周波数帯域に絞る**ことでキックドラムを効果的に検出
3. **適切なクールダウン時間**(0.4秒)でダブルビート問題を解決
4. **信頼度ベースの更新**でBPMの急激な変動を防止
### 課題と限界
1. **ジャンル依存性**
- 4つ打ちのハウス/テクノは良好
- 2-step、Drum'n'bassなど不規則なキックパターンは苦手
2. **パラメータの固定値**
- 閾値倍率、クールダウン時間が固定
- 楽曲によって最適値が異なる可能性
3. **単一帯域分析の限界**
- キックドラムのみに依存
- スネア、ハイハットの情報を活用していない
## 今後の改善提案
### 1. マルチバンド分析
```
- 低域(< 200Hz): キックドラム
- 中域(200-2000Hz): スネア、クラップ
- 高域(> 2000Hz): ハイハット、シンバル
```
各帯域で独立してオンセットを検出し、統合することでより頑健なビート検出が可能。
### 2. オートコリレーション
- 現在のIOIクラスタリングより数学的に堅牢
- 周期的パターンの検出に優れる
- 不規則なキックパターンにも対応可能
### 3. 適応的パラメータ
- 楽曲の特性に応じて閾値を動的に調整
- ジャンル検出による最適パラメータの選択
### 4. ビート位相の改善
- 現在は最後のオンセットからの経過時間で計算
- ビートグリッドの概念を導入してより正確な位相計算
## 実装上の注意点
1. **Unity特有の制約**
- `NativeArray`の使用によるメモリ効率
- 毎フレームのスペクトラム取得はパフォーマンスに影響
- LASPライブラリの特性を理解する必要
2. **リアルタイム性の確保**
- 計算量とレイテンシのトレードオフ
- バッファサイズと応答性のバランス
3. **デバッグとチューニング**
- Debug.Logによるリアルタイムモニタリングが有効
- 実際の楽曲での検証が必須
## まとめ
プロトタイプ実装により、スペクトラムフラックスベースのBPM検出の有効性を確認できた。一般的な4つ打ち楽曲では良好な結果を得られたが、より多様なジャンルに対応するにはマルチバンド分析やオートコリレーションなどの高度な手法の導入が必要。
今回の実装は基礎として十分機能するため、用途に応じて段階的に改善していくことを推奨する。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment