
2026/04/25 22:28
Raspberry Pi Pico 向けに完全機能オーディオ DSP ファームウェア。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
DSPi システムは、安価な Raspberry Pi Pico ボード(RP2040 または RP2350 マイクロコントローラーを使用)を、macOS、Windows、Linux、iOS のいずれでも Plug-and-Play 機能に対応した高性能 USB オーディオカードに変換します。主要なハードウェア機能としては、RP2350 モデルで最大 8 チャンネルの音声入力・出力(RP2040 では 4 チャンネル)、24 ビット S/PDIF/I2S 対応、専用モノラル PDM サブウーハー出力があります。同ユニットはパラメトリックイコライゼーション(10 バンド)、マトリックスミキシング(最大 2×9 チャンネル)、ISO 226:2003 に基づく音量補償、最大 85ms の時間整合、BS2B ヘッドフォンクロスフィードといったプロフェッショナルグレードの DSP 機能を搭載しています。RP2350 プラットフォームは、専用ハイブリッド SVF/biquad アーキテクチャとハードウェア FPU を備え、標準電圧でも優れた低周波数精度を実現する一方、RP2040 はピーククロック速度を得るためにわずかな電圧上昇が必要です。設定は USB コントロール転送を通じて管理され、ファームウェアの再フラッシュなしでランタイムでのピンリエイスマイトが可能であり、DSP 設定とルーティングを含む最大 10 のプリセットを保存できます。ユーザーは CPU ロード、エラー統計量、音声レベルなどのシステムテレメトリを提供されており、GPL v3.0 ライセンスの下で提供され、ソースコードも公開されています。
本文
DSPi は、Raspberry Pi Pico および他の RP2040 ベースのボードを、非常に能力がありながら低価格なデジタルオーディオプロセッサへと変貌させます。搭載された DSP エンジンを有する USB オーディオインターフェースとして動作し、ルーム補正、アクティブ・クロスポイント、パラメトリックEQ、時間同期、音量補償、およびヘッドフォンのクロスフィードといった主要機能を活用可能にします。
RP2040 と RP2350 が「コーヒー一杯より安いオーディオの万能軍刀」という評判を確立するよう心から願っております。開発状況の確認、議論、あるいはサポートの要請については、公式 Discord サーバーへお気軽にご参加ください!
目次
主要機能 プラットフォーム対応 オーディオ信号チェーン ハードウェア接続手順 DSP 機能 ユーザープリセット 開発者リファレンス ソースからビルド 詳細仕様書 ライセンス
主要機能 (Key Capabilities)
- USB オーディオインターフェース: macOS、Windows、Linux、iOS で Plug-and-Play。16 ビットおよび 24 ビットの PCM 入力を、44.1 kHz、48 kHz、96 kHz のサンプリング周波数でサポートします。
- 24 ビット S/PDIF または I2S 出力: 最大 4 つの独立したステレオ出力スロット(RP2350 で 8 チャンネル、RP2040 で 4 チャンネル)。各スロットは動作時に S/PDIF と I2S の間で切り替え可能であり、あらゆる標準的な DAC に直接接続できます。I2S スロットは共通の BCK/LRCLK クロックを共有し、オプションとして 128 倍/256 倍のマスタークロックも出力可能です。
- チャンネルごとのプレアンプ: DSP パイプラインの最初の処理(PASS 1)として、USB 入力チャンネル(L/R)それぞれに独立したゲイン制御を適用します。
- マトリックスミキサー: どちらかまたは両方の USB 入力を任意の出力へルーティング可能。各交差点で独立したゲインと位相反転を制御できます。RP2350 で 2×9、RP2040 で 2×5 の構成です。
- パラメトリック等化 (PEQ): チャンネルあたり最大 10 バンド、6 種類のフィルタータイプをサポート。RP2350 で総計 110 バンド、RP2040 で 70 バンドです。RP2350 は卓越した低周波数精度を実現するためにハイブリッドな SVF/biquad アーキテクチャを採用しています。
- 音量リベラー: RMS ベースのステレオリンク、ソフトニー(膝)を持つ向上圧縮器で、静かな部分を目標レベルへ引き上げながら、大きなパートを絶対に増幅することはありません。オプションの 10 ms ルックアヘッド、設定可能な速度と最大ゲインセージング、そして -6 dBFS のゲイン削減用安全リミッター付きです。
- 音量補償: ISO 226:2003 等価値周波数特性曲線標準に基づいた、音量依存型の EQ です。低い再生レベルで自動的にバスとトレブルをBoostし、知覚上のトーンバランスを維持します。
- ヘッドフォンクロスフィード: BS2B ベースのクロスフィードに左右間聴時差(ITD)を組み込み、ヘッドフォンでの再生における不自然なステレオ分離を軽減します。3 つのクラシックプリセットに加え、完全にカスタマイズ可能なパラメータです。
- マスターボリューム: シグナルチェーンの最後に適用されるデバイス側の出力上限値(-128 〜 0 dB、真のミュート哨兵あり)で、USB ホストの音量や DSP 処理とは独立しています。2 つのパステランシーモード: プリセットとは別に保存(デフォルト——再起動でも保持され、プリセット切り替えの影響を受けない)または各プリセットの一部として保存/復元します。
- 出力ごとのゲインとミュート: 各出力チャンネルに対して独立したゲイン制御とミュート制御が備わります。
- 時間同期 (Time Alignment): スピーカー/サブウーファーの同期のための出力ごとの遅延(最大 85ms)で、S/PDIF/I2S と PDM 出力経路の間を自動的にレイテンシー補償します。
- サブウーファー出力: セカンドオードデルタ・シグマ変調器搭載の専用モノラル PDM 出力チャンネルであり、第 2 の DAC を必要とせず直接サブウーファーへ接続可能です。
- デュアルコア DSP: 複数出力が動作中の際、等化処理は両プラットフォームで両コアに分割され、最大スループットを実現します。
- 設定可能な出力ピン: すべての出力 GPIO ピン(I2S BCK/MCK も含む)を動作時に再割り当て可能であり、カスタム PCB 配置に適応でき、フラッシュ書き換え不要です。
- 10 スロットプリセットシステム: ユーザー定義の名前を持つ最大 10 つの完全な DSP 構成を保存・ロード・管理可能です。チャンネルごとの命名、起動スロットの設定、高速状態同期のためのバッチパラメータ転送機能を備えます。
- 診断機能: チャンネルごとのピーク/クリップメータリング、USB PHY エラーカウンター(CRC、ビットスタッフィング、タイムアウト、オーバーフロー、シーケンス)、バッファ充填統計、各出力スロットの S/PDIF DMA 飢餓カウンター、コアごとの CPU ロード報告を備えます。
- USB 経由でのファームウェア更新: ベンダーコマンドでデバイスを UF2 ブートローダーに再起動し、ホストアプリから物理的な BOOTSEL 押下なしで新しいファームウェアをプッシュできる機能です。
プラットフォーム対応 (Platform Support)
| 機能 | RP2040 (Pico) | RP2350 (Pico 2) |
|---|---|---|
| システムクロック | 307.2 MHz (オーバークロック) | 307.2 MHz |
| コア電圧 | 1.15 V | 1.15 V |
| サンプリング周波数 | 44.1 / 48 / 96 kHz | 44.1 / 48 / 96 kHz |
| オーディオ処理 | Q28 定点数 | シングルプレシジョンフロート |
| EQ バンド | チャンネルあたり 10 (総計 70) | チャンネルあたり 10 (総計 110) |
| チャンネル総数 | 7 (マスター 2 + S/PDIF・I2S 4 + PDM 1) | 11 (マスター 2 + S/PDIF・I2S 8 + PDM 1) |
| 出力スロット | ステレオ 2 つ (それぞれ S/PDIF または I2S) | ステレオ 4 つ (それぞれ S/PDIF または I2S) |
| 出力ビット深度 | 24 ビット | 24 ビット |
| PDM 出力 | 1 (サブウーファー) | 1 (サブウーファー) |
| 最大遅延 | 85ms 各出力あたり | 85ms 各出力あたり |
| マスチンエンジン | ハンド最適化 ARM アセンブリ | ハードウェア FPU (ハイブリッド SVF/biquad EQ) |
| デュアルコア EQ | はい (コア 1 で出力 3-4 を処理) | はい (コア 1 で出力 3-8 を処理) |
| ユーザープリセット | 10 スロット | 10 スロット |
| ステータス | 生産開始 | 生産開始 |
両プラットフォームとも完全テスト済みで生産準備が完了しています。RP2040 はわずかな電圧上昇により 307.2 MHz に達し、RP2350 は同じ電圧で同周波数に達します。クロックは固定(レート依存切り替えなし)であり、サポートされているすべてのサンプリングレートで PIO デバイダーは整数値です。RP2350 はハードウェア浮動小数点ユニットにより大幅な処理余裕を提供し、より多くの出力チャンネルと低周波数精度を向上させるハイブリッド SVF/biquad フィルターアーキテクチャを実現します。
オーディオ信号チェーン (Audio Signal Chain)
DSPi は線形かつ低レイテンシーのパイプラインでオーディオを処理します:
RP2350 (11 チャンネル、9 出力):
USB 入力 (16/24 ビット PCM ステレオ, 44.1 / 48 / 96 kHz) | PASS 1: チャンネルごとのプレアンプ (独立した L/R ゲイン) + USB ボリューム | PASS 2: マスター EQ (チャンネルあたり 10 バンド、Left/Right) | PASS 2.5: 音量リベラー (RMS 向上圧縮、オプション) | PASS 3: ヘッドフォンクロスフィード (BS2B + ITD, オプション) + マスターピークメータリング 音量補償 (音量依存型 EQ, オプション) | PASS 4: マトリックスミキサー (入力 2x 出力 9、各交差点ごとのゲインと位相) | PASS 5: 出力ごとの EQ -> ゲイン/ミュート -> 遅延 -> 出力ゲイン × マスターボリューム | +-- Out 1-2 --> S/PDIF または I2S スロット 0 (データ: GPIO 6 デフォルト) +-- Out 3-4 --> S/PDIF または I2S スロット 1 (データ: GPIO 7 デフォルト) +-- Out 5-6 --> S/PDIF または I2S スロット 2 (データ: GPIO 8 デフォルト) +-- Out 7-8 --> S/PDIF または I2S スロット 3 (データ: GPIO 9 デフォルト) +-- Out 9 --> PDM サブ (データ: GPIO 10 デフォルト) (I2S BCK/LRCLK は GPIO 14/15 で共有; オプションの MCK は GPIO 13 デフォルト)
RP2040 (7 チャンネル、5 出力):
USB 入力 (16/24 ビット PCM ステレオ, 44.1 / 48 / 96 kHz) | PASS 1: チャンネルごとのプレアンプ + USB ボリューム | PASS 2: マスター EQ (チャンネルあたり 10 バンド、Left/Right) | PASS 2.5: 音量リベラー (RMS 向上圧縮、オプション) | PASS 3: ヘッドフォンクロスフィード (BS2B + ITD, オプション) + マスターピークメータリング 音量補償 (音量依存型 EQ, オプション) | PASS 4: マトリックスミキサー (入力 2x 出力 5、各交差点ごとのゲインと位相) | PASS 5: 出力ごとの EQ -> ゲイン/ミュート -> 遅延 -> 出力ゲイン × マスターボリューム | +-- Out 1-2 --> S/PDIF または I2S スロット 0 (データ: GPIO 6 デフォルト) +-- Out 3-4 --> S/PDIF または I2S スロット 1 (データ: GPIO 7 デフォルト) +-- Out 5 --> PDM サブ (データ: GPIO 10 デフォルト) (I2S BCK/LRCLK は GPIO 14/15 で共有; オプションの MCK は GPIO 13 デフォルト)
信号チェーン詳細
- 入力 (USB): 44.1、48、または 96 kHz の 16 ビットまたは 24 ビット PCM ステレオオーディオ。ビット深度は USB Alt セッティング経由で選択され、サンプリングレートは USB Audio Class レートセットリクエスト経由です。
- チャンネルごとのプレアンプ (PASS 1): USB Left と Right 入力チャンネルそれぞれに独立した dB 単位のゲイン制御。DSP チェーンの最初に適用されるため、すべての下流処理に影響を与えます。
- マスター EQ (PASS 2): チャンネル(Left/Right)あたり最大 10 バンドのパラメトリック EQ。ピーキング、ローシェルフ、ハイスヘルフ、ローパス、ハイパスのフィルタータイプをサポート。
- 音量リベラー (PASS 2.5): オプションのフィードフォワード、ステレオリンク、単一バンド RMS コンプレッサーでソフトニー向上圧縮 —— より静かなコンテンツは目標レベルへ引き上げられし、閾値以上のコンテンツは無傷です。設定可能な速度、最大ゲインセージング、ノイズゲート付き。オプションの 10 ms ルックアヘッドあり。-6 dBFS ゲイン削減用安全リミッターにより出力オーバーシュートを防止します。
- ヘッドフォンクロスフィード (PASS 3): オプションの BS2B クロスフィードで、各チャンネルから低通フィルタリングされた遅延部分を取り込み反対側にミックスします。補完的なフィルター設計に左右間聴時差(ITD)を採用し、アッパスフィルター経由でモデル化します。3 つのプリセット(Default, Chu Moy, Jan Meier)に加え、カスタム周波数とフィードレベルも可能。ITD は独立して切り替え可能です。マスターピークメータリングはこのステージに接続されます。
- 音量補償: オプションの ISO 226:2003 等価値 EQ で、現在の音量レベルに適応します。低い音量では耳の感受性低下を補うためにバスとトレブルを Boost。設定可能な参照 SPL と強度。USB ホストボリューム位置に駆動されるため、下流のマスタボリューム減衰によらず常に正しく動作します。
- マトリックスミキサー (PASS 4): 2 つの USB 入力チャンネル(L/R)をすべての出力チャンネルへルーティング。各交差点には独立した有効化、ゲイン(-∞〜+12 dB)、および位相反転があり、出力は個別にオン/オフして CPU を節約できます。RP2350 は 2×9 マトリックス(9 出力)、RP2040 は 2×5 マトリックス(5 出力)です。
- 出力 EQ (PASS 5): 両プラットフォームで各出力チャンネルごとに独立した 10 バンド EQ。クロスポイントフィルターやドライバーごとの補正に最適。RP2350 では、Fs/7.5 以下のフィルターは Cytomic SVFトポロジー(低周波数における優れた数値精度)、それ以上の周波数は従来の TDF2 biquad を使用します。
- 出力ごとのゲインとミュート: 各出力チャンネルに独立したゲイン(-∞〜+12 dB)とミュートが備わります。
- 時間同期: スピーカー同期のための出力ごとの遅延、最大 85ms(48 kHz で 4096 サンプル)。S/PDIF/I2S と PDM 出力経路間の自動レイテンシー補償付き。
- マスターボリューム: シグナルチェーンの最後に適用されるデバイス側の出力上限値、-128〜0 dB で -128 が真のミュート哨兵。PASS 5 の出力マルチплиアに折りたたまれるため CPU コストは実質ゼロ。USB ホストボリュームとは独立しており、両者が掛け合わせられます。音量補償の動作には影響しません。
- 出力: 各番号されたスロットは、24 ビット S/PDIF または 24 ビット I2S(左揃え、MSB 先頭)として設定可能です。I2S スロットは共通の BCK/LRCLK クロックペアを共有し、LRCLK は常に BCK+1 です(PIO サイドセット制約のため)。オプションのマスタークロック(MCK)で 128×または 256× Fs は別の GPIO にルーティング可能です。PDM サブウーファーは独自の出力とピンに常設されます。
ハードウェア接続手順 (Hardware Setup)
ファームウェアのフラッシュ
- ボード用の最新 DSPi.uf2 リリースをダウンロードします。
- Pico をコンピューターに挿入する際、BOOTSEL ボタンを押したまま維持します。
- 「RPI-RP2」と名付けられたドライブが表示されます。
- .uf2 ファイルをこのドライブにドラッグ&ドロップします。
- Pico は再起動し、「Weeb Labs DSPi」オーディオデバイスとして表示されます。
- DSPi Console アプリケーションをダウンロードして起動し、DSPi を制御します。
ワイリングガイド
RP2350 (Pico 2) — 最大 8 つの出力ピン:
| 機能 | ピン | 接続 |
|---|---|---|
| 出力スロット 0 (Out 1-2) | GPIO 6 (デフォルト) | メイン L/R或多分音ペア 1 の S/PDIF または I2S データ |
| 出力スロット 1 (Out 3-4) | GPIO 7 (デフォルト) | 多分音ペア 2 の S/PDIF または I2S データ |
| 出力スロット 2 (Out 5-6) | GPIO 8 (デフォルト) | 多分音ペア 3 の S/PDIF または I2S データ |
| 出力スロット 3 (Out 7-8) | GPIO 9 (デフォルト) | 多分音ペア 4 の S/PDIF または I2S データ |
| サブウーファー出力 (PDM, Out 9) | GPIO 10 (デフォルト) | アクティブサブウーファーまたは PDM-アナログフィルター |
| I2S BCK (共有、I2S のみ) | GPIO 14 (デフォルト) | I2S と設定された任意のスロットのビットクロック |
| I2S LRCLK (I2S のみ) | GPIO 15 (BCK+1、固定) | ワード/フレームクロック; 常に BCK+1 |
| I2S MCK (オプション) | GPIO 13 (デフォルト) | MCK が有効時の 128×または 256× Fs マスタークロック |
| USB | マイクロUSB | ホストデバイス (PC/Mac/モバイルデバイス) |
RP2040 (Pico) — 最大 6 つの出力ピン:
| 機能 | ピン | 接続 |
|---|---|---|
| 出力スロット 0 (Out 1-2) | GPIO 6 (デフォルト) | メイン L/Rまたはステレオペア 1 の S/PDIF または I2S データ |
| 出力スロット 1 (Out 3-4) | GPIO 7 (デフォルト) | ステレオペア 2 の S/PDIF または I2S データ |
| サブウーファー出力 (PDM, Out 5) | GPIO 10 (デフォルト) | アクティブサブウーファーまたは PDM-アナログフィルター |
| I2S BCK (共有、I2S のみ) | GPIO 14 (デフォルト) | I2S と設定された任意のスロットのビットクロック |
| I2S LRCLK (I2S のみ) | GPIO 15 (BCK+1、固定) | ワード/フレームクロック; 常に BCK+1 |
| I2S MCK (オプション) | GPIO 13 (デフォルト) | MCK が有効時の 128×または 256× Fs マスタークロック |
| USB | マイクロUSB | ホストデバイス (PC/Mac/モバイルデバイス) |
注記: S/PDIF 出力には Toshiba TX179 光送信器または単純な抵抗分圧回路が必要。I2S 出力は標準的な 24 ビットイン32 ビット左揃えフレームであり、多くの I2S DAC に直結可能です。PDM 出力は 1 ビットロジック信号で、アナログオーディオに変換するためのローパスフィルター(抵抗とコンデンサー)が必要になります。
カスタムピン割り当て
上記のデフォルトピン割り当てはそのまま使用可能ですが、DSPi Console アプリケーションを経由してすべての出力ピン——I2S BCK および MCK も含む——を動作時に再割り当てできます。フラッシュ書き換え不要です。カスタム PCB デザイン時や、デフォルト GPIO が不便なボードへの適応時に役立ちます。ピン割り当てはフラッシュに保存され、起動時に自動的に復元されます。GPIO 12 (UART TX) および GPIO 23-25 (電力制御と LED) は出力使用に予約されています。LRCLK は PIO サイドセット制約により常に BCK+1 にピン留めされます。
DSP 機能 (DSP Features)
マトリックスミキサー
マトリックスミキサーは USB ステレオ入力をすべての出力チャンネルへルーティングします。RP2350 は 2×9 マトリックス(9 出力)、RP2040 は 2×5 マトリックス(5 出力)です。各交差点(入力/出力ペア)には:
- 有効化/無効化: アクティブまたは非アクティブのルーティング。
- ゲイン: 各交差点あたり -∞〜+12 dB。
- 位相反転: ドライバー同期用の極性反転。
また、各出力チャンネルには:
- 有効化: 無効化された出力はすべての処理(EQ、遅延、変換)をスキップして CPU を節約します。
- ゲイン: 出力ごとのゲイン (-∞〜+12 dB)。
- ミュート: 出力ごとのソフトミュート。
- 遅延: 出力ごとの時間同期。
出力可用性: コア 1 は PDM サブウーファー変調器と高番号の S/PDIF 出力を処理する EQ ワーカーを共有しています。PDM と EQ ワーカーモードは排他的です:
RP2350:
| モード | 利用可能な出力 | コア 1 使用 |
|---|---|---|
| PDM 有効 (Out 9 On) | Out 1-2 (S/PDIF 1) + Out 9 (PDM) | デルタ・シグマ変調器 |
| PDM 無効 (Out 9 Off) | Out 1-8 (S/PDIF 1-4) | EQ ワーカーで出力 3-8 |
RP2040:
| モード | 利用可能な出力 | コア 1 使用 |
|---|---|---|
| PDM 有効 (Out 5 On) | Out 1-2 (S/PDIF 1) + Out 5 (PDM) | デルタ・シグマ変調器 |
| PDM 無効 (Out 5 Off) | Out 1-4 (S/PDIF 1-2) | EQ ワーカーで出力 3-4 |
PDM サブウーファーが有効な際、コア 1 はデルタ・シグマ変調器に完全に割り当てられ、高番号の S/PDIF 出力は利用できません。PDM がオフの場合、コア 1 はそれらの出力を並列に処理する EQ ワーカーとして動作し、コア 0 と共に動作します。
一般的な構成例 (RP2350):
| 用途 | ルーティング | モード |
|---|---|---|
| ステレオ + サブ | L→Out1, R→Out2, L+R→Out9 | PDM オン (3 出力) |
| 2 分アクティブ | L→Out1(トゥイーター), L→Out3(ウーファー), R→Out2(トゥイーター), R→Out4(ウーファー) | PDM オフ (4 出力) |
| 3 分アクティブ | 上記に加え、ミドルレンジを Out5-6 | PDM オフ (6 出力) |
| 4 分アクティブ | 上記に加え、スーパートゥイーターを Out7-8 | PDM オフ (8 出力) |
一般的な構成例 (RP2040):
| 用途 | ルーティング | モード |
|---|---|---|
| ステレオ | L→Out1, R→Out2 | PDM オフ (2 出力) |
| ステレオ + サブ | L→Out1, R→Out2, L+R→Out5 | PDM オン (3 出力) |
| 2 分アクティブ | L→Out1(トゥイーター), L→Out3(ウーファー), R→Out2(トゥイーター), R→Out4(ウーファー) | PDM オフ (4 出力) |
パラメトリック等化
各フィルターバンドは 6 つのタイプをサポート:
| タイプ | 説明 |
|---|---|
| Flat | バイパス(処理なし) |
| Peaking | パラメトリックベルフィルター |
| Low Shelf | ロー周波数シェルフ |
| High Shelf | ハイク周波数シェルフ |
| Low Pass | ローパスフィルター |
| High Pass | ハイパスフィルター |
RP2040 では、すべてのフィルターが Q28 定点算術を持つ biquad IIR(転置直接形式 II)を使用します。RP2350 では、ファームウェアはハイブリッド SVF/biquad アーキテクチャを使用:Fs/7.5(48 kHz で約 6.4 kHz)以下のフィルターは低周波数における優れた数値精度のための Cytomic SVF(線形梯形)トポロジーを、それ以上の周波数は従来の TDF2 biquad を使用します。すべてのフィルターには設定可能な周波数、Q ファクター、およびゲインがあり、フラットフィルターはゼロ CPU オーバーヘッドのために自動的にバイパスされます。
チャンネルレイアウト: RP2350 (11 チャンネル):
| チャンネル | インデックス | EQ バンド |
|---|---|---|
| マスター Left | 0 | 10 |
| マスター Right | 1 | 10 |
| 出力 1-8 (S/PDIF) | 2-9 | 各々 10 |
| 出力 9 (PDM サブ) | 10 | 10 |
RP2040 (7 チャンネル):
| チャンネル | インデックス | EQ バンド |
|---|---|---|
| マスター Left | 0 | 10 |
| マスター Right | 1 | 10 |
| 出力 1-4 (S/PDIF) | 2-5 | 各々 10 |
| 出力 5 (PDM サブ) | 6 | 10 |
音量補償
ISO 226:2003 等価値周波数特性曲線標準に基づく再生音量が低いと、人間の耳はバスとトレブル周波数に対する感受性が低下します。音量補償はあらゆる再生レベルにおける知覚されたトーンバランスを維持するために、音量依存型の EQ カーブを適用します。
- 参照 SPL: 設定可能(40-100 dB)。システムが全音量でトーンバランスが取れている時の SPL に設定します。
- 強度: 標準 ISO 曲線の 0-200% で調整可能です。
- 実装: 91 段階のすべてのボリュームステップに対する事前計算された係数テーブルと、クラッシュのない更新のためのダブルバッファリングを採用しています。
ヘッドフォンクロスフィード
Bauer Stereophonic-to-Binaural (BS2B) クロスフィードを実装し、補完的なフィルター設計でヘッドフォン再生における不自然なステレオ分離を軽減します。各チャンネルは反対側のチャンネルからの低通フィルタリングされ、時間遅延されたミックスを受けます。アコースティッククロスフィッド(スピーカー再生時のような)をシミュレートします。
- 補完的な設計: 直接パス = 入力 - 低通 (入力)。単音信号はゲイン Unity で通過し、色付けなしを保証します。
- 左右間聴時差 (ITD): 一次側アッパスフィルターがクロスフィードパスに約 220us の遅延を追加し、60 度のステレオスピーカー配置の頭を回った音の伝播をモデル化します。ITD は独立して切り替え可能です。
- プリセット:
| プリセット | カットオフ | フィードレベル | キャラクター |
|---|---|---|---|
| Default | 700 Hz | 4.5 dB | バランス型、最も人気 |
| Chu Moy | 700 Hz | 6.0 dB | ストロングな空間効果 |
| Jan Meier | 650 Hz | 9.5 dB | サブティル、ナチュラル |
| Custom | 500-2000 Hz | 0-15 dB | ユーザー定義 |
音量リベラー
変動する音量を持つコンテンツで一貫した知覚ボリュームを維持するためのフィードフォワード、ステレオリンク、単一バンド RMS ダイナミックレンジコンプレッサーです。
- 向上圧縮: 閾値下のコンテンツを引き上げながら、閾値上のコンテンツは完全に無傷のままです。メイクアップゲイン不要。
- RMS ベース検出: ピーク検出よりも知覚ボリュームに相関する RMS エンベロープを追跡します。
- ソフトニー: フルブーストとユニティゲインの間の漸移で、透明なアーティファクトフリー動作を実現します。
- ステレオリンク: 2 チャンネルのうち音量の大きい方が両方のゲインを決定し、ステレオイメージを保持します。
- ゲイン削減安全リミッター: ハードクリッピングではなくゲイン削減(即時アタック、100 ms リリース)で -6 dBFS セージングを強制。大声コンテンツはユニティで通過するため稀に作動します。
- オプション 10 ms ルックアヘッド: 滑らかな遷移のために。
- 設定可能: 速度(アタック/リリース)、最大ゲインセージング(静かなコンテンツが引き上げられる量の上限)、およびゲート閾値(レベラーがブーストを停止してサイレンス/ノイズを増幅しないように)。
リベラーは PASS 2.5 に位置し、マスター EQ の後、クロスフィードの前に配置されます。音量補償とは独立しており、両者を同時に有効にすることも可能です。
チャンネルごとのプレアンプ
各 USB 入力チャンネル(Left と Right)には、他のすべての処理前の PASS 1 で適用される独立したプレアンプゲイン(dB)があります。チャンネルの不均衡を修正し、EQ の前に熱い入力を減衰させたり、ソース間のレベルを一致させるのに役立ちます。後方互換性のためのレガシー単一値コマンドも残っています(両チャンネルを同じ値に設定)。
マスターボリューム
シグナルチェーンの最後に適用されるデバイス側の出力上限値で、USB ホストボリュームとは独立しています。
-
範囲: -128〜0 dB。-128 は真のサイレンス(ミュート)の哨兵です。
-
USB ホストボリュームとの独立性: 両者が掛け合わされるため、ホストスライダーはマスターボリュームが許す範囲内で動作します。
-
DSP 処理との独立性: 音量補償、EQ、リベラー、クロスフィードはいずれもマスタボリュームではなく生 USB ボリュームに駆動され、マスタ設定によらず動作は変化しません。
-
2 つのパステランシーモード(動作時に選択可能で再起動後も保持):
- モード 0 — 独立 (デフォルト): マスターボリュームはスタンドアロンなデバイス設定です。アプリが現在の値をディレクトリに保存するコマンドを呼び出すと、その値がすべての次の起動時に適用されます。プリセットの保存/ロードはマスターボリュームに影響せず、プリセット切り替えで音量は移動しません。
- モード 1 — プリセットに含まれる: マスターボリュームは各プリセットの一部です。プリセットと共にもうすられて、プリセットロード時に復元されます。あらゆる他の DSP パラメータと同様に、異なる感度/最大出力要件を持つスピーカー設定をターゲットにする異なるプリセットがある場合に便利です。
最初の起動時のデフォルト: -20 dB(ファームウェア内の MASTER_VOL_DEFAULT_DB で設定可能)。
I2S 出力
各出力スロットはスロットごとに独立して動作時に S/PDIF(デフォルト)と I2S の間で切り替え可能です。1 つのデバイスで混合を駆動できます——例:スロット 0 を I2S にして DAC チップへ、スロット 1 を Toslink で外部レシーバーへ S/PDIF。
- I2S 形式: 24 ビットデータ、左揃え、MSB 先頭、32 ビットフレーム。多くの標準 I2S DAC(PCM5102, ES9038Q2M など)へのドロップイン可能です。
- 共有クロック: すべての I2S スロットは単一の BCK/LRCLK ペアを共有します。LRCLK は常に BCK+1 です(PIO サイドセットハードウェア制約のため)。
- オプション MCK: 有効時に、設定可能な GPIO に 128×または 256× Fs マスタークロックが生成されます。内部 PLL を持っていない一部の DAC が必要とします。96 kHz では PIO クロック・デバイダーの制限によりのみ 128×を選択可能です。
- サンプル同期開始: I2S スロットはまとめてオンになり、複数の DAC が位相同期した状態を維持できます。
DSP パイプラインは両出力タイプで同一であり、最後のエンコーディングのみが異なります(S/PDIF は BMC/NRZI 対 I2S は生の左揃え PCM)。
サブウーファー PDM 出力
サブウーファー出力はコア 1 で動作する高性能ソフトウェア定義デルタ・シグマ変調器を使用します。
- 変調: 2nd-Order Delta-Sigma
- オーバーサンプリング比: 256x(48 kHz では 12.288 MHz ビットクロック)
- ダither: TPDF(三角確率密度関数)とノイズシェイピング
- DC 保護: DC オフセット蓄積を防ぐリーキーインテグラタ設計
目標は、サブウーファーにのみ使用されるかもしれないがフルレンジとして聞こえる優れた出力を作り出すためにコア 1 の可能な最大部分を使用することでした。この実装は非常に安定しており、ポップ、クリック、またはアイドルトーンはありません。
ユーザープリセット (User Presets)
DSPi はフラッシュに完全な DSP 構成を保存する 10 スロットのプリセットシステムを含んでいます。プリセットは常にアクティブであり、「プリセットなし」の状態はありません。
- 10 プリセットスロット: 各スロットはチャンネルごとのプレアンプ、EQ バンド、遅延、音量、リベラー、クロスフィード、マトリックスミキサー、出力ゲイン/ミュート、出力タイプ(S/PDIF または I2S)、I2S クロック設定、ピン割り当て、マスターボリューム(モード 1 で使用)、およびチャンネルごとの名前という完全な DSP 状態を保存します。
- チャンネル名: 各チャンネルにはユーザー定義の名前(最大 31 文字)を設定でき、プリセットと共に保存されます。
- 起動構成: 起動時にロードされるプリセットを選択——特定のデフォルトスロットか、最後にアクティブだったスロットどちらか。
- ピン設定含み: プリセットを保存/ロードする際、GPIO ピン割り当てを含める/除外するオプション(デフォルト:含める——ピンレイアウトがプリセットと共に移動)。
- マスターボリュームモード: マスターボリュームが各プリセットの一部(モード 1)か、プリセットディレクトリに独立して保存される(モード 0、デフォルト)かを選択します。詳細は「マスターボリューム」を参照。
- プリセット切り替えミュート: プリセット遷移中はオーディオ出力を一時的にミュート(約 10ms)し、聴覚可能なクラッシュを防ぎます。
- レガシーコマンド: オリジナルの保存/ロード/リセットコマンド(0x51-0x53)はプリセットシステムを経由して再ルーティングされ、現在アクティブなスロットに対して動作します。
- バッチパラメータ転送: 完全な DSP 状態を単一の USB コントロール転送(約 2.9 KB)で読み取りまたは書き込みでき、ホストアプリケーションとの高速同期が可能です。
- 自動移行: 新しいファームウェアの最初の起動時に古いプリセットディレクトリが透明にアップグレードされ、スロット名、起動構成、および他の保持状態は保持されます。
開発者リファレンス (Developer Reference)
システムアーキテクチャ
-
コア 0: USB コミュニケーション、オーディオストリーミング、DSP 処理(マスター EQ、クロスフィード、音量補償、マトリックスミキシング、S/PDIF ペア 1 の出力 EQ)、および制御ロジック。
-
コア 1(3 つのモード):
- PDM モード: サブウーファー出力用のデルタ・シグマ変調器(PDM 出力が有効時のみ)。
- EQ ワーカーモード: PDM が無効で高番号の出力がアクティブな際に、コア 0 と並列でそれらの出力の出力 EQ、遅延、および S/PDIF 変換を処理。RP2350: 出力 3-8。RP2040: 出力 3-4。いずれかの出力が有効で PDM が無効の場合に活性化します。
- アイドルモード: コア 1 を必要とする出力が有効でない場合。
-
PIO と DMA: S/PDIF エンコーディング(PIO0)と PDM ビットストリーム生成(PIO1)のためのハードウェアオフロードで、I/O のゼロ CPU オーバーヘッドを確保します。
-
マスチンエンジン:
- RP2040: 32 ビット定点数(Q28)処理で、内側 DSP ループ用にハンド最適化された ARM アセンブリ。
- RP2350: シングルプレシジョンフロートパイプラインとハードウェア FPU。ハイブリッド SVF/biquad EQ —— 低周波数(Fs/7.5 以下)では Cytomic SVF、高周波数では TDF2 biquad。SVF は低周波数フィルターにおける優れた数値精度を提供し、biquad 係数クアンタイゼーションが問題となる場所で優れています。
注記: PDM モードと EQ ワーカーモードはコア 1 で排他的です。PDM 出力が有効な場合、コア 0 がすべての S/PDIF 出力 EQ 処理を処理します。PDM が無効で高番号の出力がアクティブな場合、コア 1 はそれらの出力のための EQ ワーカーとして動作します。
パフォーマンスチューニング
両プラットフォームとも固定 307.2 MHz システムクロック(VCO 1536 MHz / 5 / 1)で動作するため、サポートされているすべてのサンプリングレートで PIO デバイダーが整数値となり、サンプリングレート依存のクロック切り替えクラッシュを排除します。
| プラットフォーム | システムクロック | コア電圧 |
|---|---|---|
| RP2040 | 307.2 MHz (オーバークロック) | 1.15 V |
| RP2350 | 307.2 MHz | 1.15 V |
RP2040 はノミナル 1.10 V よりわずかな電圧上昇で 307.2 MHz に達し、RP2350 はこのクロックで同じ電圧で快適です。電圧ステップは周波数変更前に適用されます。サンプリングレート変化はシステムクロックの再設定ではなく PIO デバイダーのみを調整するため、44.1 / 48 / 96 kHz の間の遷移はシームレスです。フラッシュアクセスもチューニングされており、PICO_FLASH_SPI_CLKDIV は 6 に設定され、このクロックで W25Q080 の 104-133 MHz 仕様の下に XIP とイレイズ/プログラム操作を安全に保っています。RP2350 では、ブート ROM がそのプラットフォームで boot2 設定に従わないため、ランタイム QMI レジスタ管理はファームウェア/DSPi/flash_clkdiv.c で処理されます。
USB コントロールプロトコル
設定は Windows ではインターフェース 2(ベンダーインターフェース)を経由したコントロール転送、macOS ではインターフェース 0 を経由して行われます。デバイスは Windows での自動ドライバーレスインストールのための WinUSB/WCID をサポートしています。
リクエストテーブル
| コード | 名称 | 方向 | ペイロード | 説明 |
|---|---|---|---|---|
| 0x42 | REQ_SET_EQ_PARAM | OUT | 16 バイト | フィルターパラメータアップロード |
| 0x43 | REQ_GET_EQ_PARAM | IN | 16 バイト | フィルターパラメータ読み取り |
| 0x44 | REQ_SET_PREAMP | OUT | 4 バイト | グローバルゲイン設定 (float dB) |
| 0x45 | REQ_GET_PREAMP | IN | 4 バイト | グローバルゲイン取得 |
| 0x46 | REQ_SET_BYPASS | OUT | 1 バイト | マスター EQ バイパス (1=On, 0=Off) |
| 0x47 | REQ_GET_BYPASS | IN | 1 バイト | バイパスステータス取得 |
| 0x48 | REQ_SET_DELAY | OUT | 4 バイト | チャンネル遅延設定 (float ms) |
| 0x49 | REQ_GET_DELAY | IN | 4 バイト | チャンネル遅延取得 |
| 0x50 | REQ_GET_STATUS | IN | 4-12 バイト | システム統計取得 (wValue でフィールド選択) |
| 0x51 | REQ_SAVE_PARAMS | IN | 1 バイト | アクティブプリセットスロットへ保存 |
| 0x52 | REQ_LOAD_PARAMS | IN | 1 バイト | アクティブプリセットスロットから読み込み |
| 0x53 | REQ_FACTORY_RESET | IN | 1 バイト | ライブ状態をデフォルトにリセット |
| 0x54 | REQ_SET_CHANNEL_GAIN | OUT | 4 バイト | 出力チャンネルゲイン設定 (float dB) |
| 0x55 | REQ_GET_CHANNEL_GAIN | IN | 4 バイト | 出力チャンネルゲイン取得 |
| 0x56 | REQ_SET_CHANNEL_MUTE | OUT | 1 バイト | 出力チャンネルミュート (1=Muted) |
| 0x57 | REQ_GET_CHANNEL_MUTE | IN | 1 バイト | ミュートステータス取得 |
| 0x58 | REQ_SET_LOUDNESS | OUT | 1 バイト | 音量補償の有効化/無効化 (1=On) |
| 0x59 | REQ_GET_LOUDNESS | IN | 1 バイト | 音量補償ステータス取得 |
| 0x5A | REQ_SET_LOUDNESS_REF | OUT | 4 バイト | 参照 SPL 設定 (float, 40-100) |
| 0x5B | REQ_GET_LOUDNESS_REF | IN | 4 バイト | 参照 SPL 取得 |
| 0x5C | REQ_SET_LOUDNESS_INTENSITY | OUT | 4 バイト | 強度%設定 (float, 0-200) |
| 0x5D | REQ_GET_LOUDNESS_INTENSITY | IN | 4 バイト | 強度取得 |
| 0x5E | REQ_SET_CROSSFEED | OUT | 1 バイト | クロスフィード有効化/無効化 (1=On) |
| 0x5F | REQ_GET_CROSSFEED | IN | 1 バイト | クロスフィードステータス取得 |
| 0x60 | REQ_SET_CROSSFEED_PRESET | OUT | 1 バイト | プリセット設定 (0-3) |
| 0x61 | REQ_GET_CROSSFEED_PRESET | IN | 1 バイト | 現在のプリセット取得 |
| 0x62 | REQ_SET_CROSSFEED_FREQ | OUT | 4 バイト | カスタム周波数設定 (float Hz, 500-2000) |
| 0x63 | REQ_GET_CROSSFEED_FREQ | IN | 4 バイト | カスタム周波数取得 |
| 0x64 | REQ_SET_CROSSFEED_FEED | OUT | 4 バイト | カスタムフィードレベル設定 (float dB, 0-15) |
| 0x65 | REQ_GET_CROSSFEED_FEED | IN | 4 バイト | カスタムフィードレベル取得 |
| 0x66 | REQ_SET_CROSSFEED_ITD | OUT | 1 バイト | ITD 有効化/無効化 (1=On) |
| 0x67 | REQ_GET_CROSSFEED_ITD | IN | 1 バイト | ITD ステータス取得 |
| 0x70 | REQ_SET_MATRIX_ROUTE | OUT | 8 バイト | マトリックス交差点設定 (MatrixRoutePacket) |
| 0x71 | REQ_GET_MATRIX_ROUTE | IN | 8 バイト | マトリックス交差点取得 |
| 0x72 | REQ_SET_OUTPUT_ENABLE | OUT | 1 バイト | 出力チャンネル有効化/無効化 |
| 0x73 | REQ_GET_OUTPUT_ENABLE | IN | 1 バイト | 出力有効ステータス取得 |
| 0x74 | REQ_SET_OUTPUT_GAIN | OUT | 4 バイト | 出力ごとのゲイン設定 (float dB) |
| 0x75 | REQ_GET_OUTPUT_GAIN | IN | 4 バイト | 出力ごとのゲイン取得 |
| 0x76 | REQ_SET_OUTPUT_MUTE | OUT | 1 バイト | 出力ミュート (1=Muted) |
| 0x77 | REQ_GET_OUTPUT_MUTE | IN | 1 バイト | 出力ミュートステータス取得 |
| 0x78 | REQ_SET_OUTPUT_DELAY | OUT | 4 バイト | 出力ごとの遅延設定 (float ms) |
| 0x79 | REQ_GET_OUTPUT_DELAY | IN | 4 バイト | 出力ごとの遅延取得 |
| 0x7A | REQ_GET_CORE1_MODE | IN | 1 バイト | コア 1 モード取得 (0=Idle, 1=PDM, 2=EQ Worker) |
| 0x7B | REQ_GET_CORE1_CONFLICT | IN | 1 バイト | PDM vs EQ ワーカー競合チェック |
| 0x7C | REQ_SET_OUTPUT_PIN | IN | 1 バイト | 出力 GPIO ピン変更 (ステータスを返す) |
| 0x7D | REQ_GET_OUTPUT_PIN | IN | 1 バイト | 現在の出力 GPIO ピン取得 |
| 0x7E | REQ_GET_SERIAL | IN | 変数 | 一意のボードシリアル番号取得 |
| 0x7F | REQ_GET_PLATFORM | IN | 1 バイト | プラットフォーム ID 取得 (0=RP2040, 1=RP2350) |
| 0x83 | REQ_CLEAR_CLIPS | OUT | — | クリップ検知ラッチクリア |
| 0x90 | REQ_PRESET_SAVE | IN | 1 バイト | ライブ状態をプリセットスロットへ保存 (wValue=スロット) |
| 0x91 | REQ_PRESET_LOAD | IN | 1 バイト | プリセットスロットからライブ状態へ読み込み (wValue=スロット) |
| 0x92 | REQ_PRESET_DELETE | IN | 1 バイト | プリセットスロット削除 (wValue=スロット) |
| 0x93 | REQ_PRESET_GET_NAME | IN | 32 バイト | プリセット名取得 (wValue=スロット) |
| 0x94 | REQ_PRESET_SET_NAME | OUT | 32 バイト | プリセット名設定 (wValue=スロット) |
| 0x95 | REQ_PRESET_GET_DIR | IN | 変数 | プリセットディレクトリ取得 (占有量、起動構成) |
| 0x96 | REQ_PRESET_SET_STARTUP | OUT | 2 バイト | 起動モードとデフォルトスロット設定 |
| 0x97 | REQ_PRESET_GET_STARTUP | IN | 2 バイト | 起動構成取得 |
| 0x98 | REQ_PRESET_SET_INCLUDE_PINS | OUT | 1 バイト | ピン設定含み設定 (1=含める) |
| 0x99 | REQ_PRESET_GET_INCLUDE_PINS | IN | 1 バイト | ピン設定含みステータス取得 |
| 0x9A | REQ_PRESET_GET_ACTIVE | IN | 1 バイト | 現在アクティブなプリセットスロットインデックス取得 |
| 0x9B | REQ_SET_CHANNEL_NAME | OUT | 32 バイト | チャンネル名設定 (wValue=チャンネル) |
| 0x9C | REQ_GET_CHANNEL_NAME | IN | 32 バイト | チャンネル名取得 (wValue=チャンネル) |
| 0xA0 | REQ_GET_ALL_PARAMS | IN | ~2896 バイト | 完全な DSP 状態のバッチ読み取り (マルチパケット) |
| 0xA1 | REQ_SET_ALL_PARAMS | OUT | ~2896 バイト | 完全な DSP 状態のバッチ書き込み (マルチパケット) |
| 0xB0 | REQ_GET_BUFFER_STATS | IN | 変数 | バッファ充填統計読み取り |
| 0xB1 | REQ_RESET_BUFFER_STATS | IN | 1 バイト | バッファ統計カウンターリセット |
| 0xB2 | REQ_GET_USB_ERROR_STATS | IN | 24 バイト | USB PHY エラーカウンター読み取り (CRC/ビットスタッフィング/タイムアウト/オーバーフロー/シーケンス) |
| 0xB3 | REQ_RESET_USB_ERROR_STATS | IN | 1 バイト | USB PHY エラーカウンターリセット |
| 0xB4 | REQ_SET_LEVELLER_ENABLE | OUT | 1 バイト | 音量リベラー有効化/無効化 |
| 0xB5 | REQ_GET_LEVELLER_ENABLE | IN | 1 バイト | リベラー有効ステータス取得 |
| 0xB6 | REQ_SET_LEVELLER_AMOUNT | OUT | 4 バイト | リベラー目標/量設定 (float) |
| 0xB7 | REQ_GET_LEVELLER_AMOUNT | IN | 4 バイト | リベラー量取得 |
| 0xB8 | REQ_SET_LEVELLER_SPEED | OUT | 1 バイト | リベラーアタック/リリース速度設定 |
| 0xB9 | REQ_GET_LEVELLER_SPEED | IN | 1 バイト | リベラー速度取得 |
| 0xBA | REQ_SET_LEVELLER_MAX_GAIN | OUT | 4 バイト | 最大向上ゲイン設定 (float dB) |
| 0xBB | REQ_GET_LEVELLER_MAX_GAIN | IN | 4 バイト | 最大向上ゲイン取得 |
| 0xBC | REQ_SET_LEVELLER_LOOKAHEAD | OUT | 1 バイト | 10 ms ルックアヘッド有効化/無効化 |
| 0xBD | REQ_GET_LEVELLER_LOOKAHEAD | IN | 1 バイト | ルックアヘッドステータス取得 |
| 0xBE | REQ_SET_LEVELLER_GATE | OUT | 4 バイト | ノイズゲート閾値設定 (float dB) |
| 0xBF | REQ_GET_LEVELLER_GATE | IN | 4 バイト | ノイズゲート閾値取得 |
| 0xC0 | REQ_SET_OUTPUT_TYPE | OUT | 1 バイト | スロット出力タイプ設定 (0=S/PDIF, 1=I2S; wValue=スロット) |
| 0xC1 | REQ_GET_OUTPUT_TYPE | IN | 1 バイト | スロット出力タイプ取得 (wValue=スロット) |
| 0xC2 | REQ_SET_I2S_BCK_PIN | OUT | 1 バイト | 共有 I2S BCK GPIO 設定 (LRCLK オート = BCK+1) |
| 0xC3 | REQ_GET_I2S_BCK_PIN | IN | 1 バイト | 現在の I2S BCK ピン取得 |
| 0xC4 | REQ_SET_MCK_ENABLE | OUT | 1 バイト | I2S マスタークロック出力有効化/無効化 |
| 0xC5 | REQ_GET_MCK_ENABLE | IN | 1 バイト | MCK 有効ステータス取得 |
| 0xC6 | REQ_SET_MCK_PIN | OUT | 1 バイト | MCK GPIO 設定 |
| 0xC7 | REQ_GET_MCK_PIN | IN | 1 バイト | MCK GPIO 取得 |
| 0xC8 | REQ_SET_MCK_MULTIPLIER | OUT | 1 バイト | MCK マルチプライヤー設定 (0=128×, 1=256×) |
| 0xC9 | REQ_GET_MCK_MULTIPLIER | IN | 1 バイト | MCK マルチプライヤー取得 |
| 0xD0 | REQ_SET_PREAMP_CH | OUT | 4 バイト | チャンネルごとのプレアンプ設定 (wValue=チャンネル, ペイロード=float dB) |
| 0xD1 | REQ_GET_PREAMP_CH | IN | 4 バイト | チャンネルごとのプレアンプ取得 (wValue=チャンネル) |
| 0xD2 | REQ_SET_MASTER_VOLUME | OUT | 4 バイト | マスターボリューム設定 (-128 ミュート哨兵, -127..0 dB) |
| 0xD3 | REQ_GET_MASTER_VOLUME | IN | 4 バイト | 現在のライブマスターボリューム取得 |
| 0xD4 | REQ_SET_MASTER_VOLUME_MODE | OUT | 1 バイト | パステランシーモード設定 (0=独立, 1=プリセット込) |
| 0xD5 | REQ_GET_MASTER_VOLUME_MODE | IN | 1 バイト | パステランシーモード取得 |
| 0xD6 | REQ_SAVE_MASTER_VOLUME | IN | 1 バイト | ライブマスターボリュームをディレクトリへ保存 (モード 0 パステランシー) |
| 0xD7 | REQ_GET_SAVED_MASTER_VOLUME | IN | 4 バイト | ディレクトリの保存されたマスター音量値読み取り |
| 0xF0 | REQ_ENTER_BOOTLOADER | IN | 1 バイト | ファームウェア更新のための UF2 ブートローダーへの再起動 |
REQ_GET_STATUS (0x50) — システムテレメトリ
REQ_GET_STATUS リクエストは wValue フィールドに基づいてデータを返します:
| wValue | 返すデータ | 説明 |
|---|---|---|
| 0 | uint32 | チャンネル 0-1 のピーク (圧縮化された 16 ビット値) |
| 1 | uint32 | チャンネル 2-3 のピーク (圧縮化された 16 ビット値) |
| 2 | uint32 | チャンネル 4 のピーク + CPU0/CPU1 ロード (圧縮化) |
| 3 | uint32 | PDM リングバッファオーバーラン数 |
| 4 | uint32 | PDM リングバッファアンダーラン数 |
| 5 | uint32 | PDM DMA オーバーラン数 |
| 6 | uint32 | PDM DMA アンダーラン数 |
| 7 | uint32 | S/PDIF オーバーラン数 |
| 8 | uint32 | S/PDIF アンダーラン数 |
| 9 | 12 バイト | 合計:5 つのピーク + CPU ロード |
| 10 | uint32 | USB オーディオパケットカウント |
| 11 | uint32 | USB Alt セッティング |
| 12 | uint32 | USB オーディオマウントステータス |
| 13 | uint32 | システムクロック周波数 (Hz) |
| 14 | uint32 | コア電圧 (mV) |
| 15 | uint32 | サンプリングレート (Hz) |
| 16 | int32 | システム温度 (センチ度 C) |
| 17 | uint32 | 総 S/PDIF DMA 飢餓数(すべてのスロット合計) |
| 18 | uint32 | S/PDIF スロット 0 飢餓数 (Out 1-2) |
| 19 | uint32 | S/PDIF スロット 1 飢餓数 (Out 3-4) |
| 20 | uint32 | S/PDIF スロット 2 飢餓数 (Out 5-6, RP2350) |
| 21 | uint32 | S/PDIF スロット 3 飢餓数 (Out 7-8, RP2350) |
「飢餓事象」は、S/PDIF DMA がバッファーを必要としたがコンシューマプ 풀为空だったため、ファームウェアがその転送にサイレンスバッファーを代替したことを意味します。これは従来の spdif_underruns USB パケットギャップヒューリスティックスよりも直接的な出力側ドロップアウトシグナルです。
データ構造体
フィルターパケット (16 バイト):
struct __attribute__((packed)) { uint8_t channel; // RP2350: 0-10, RP2040: 0-6 uint8_t band; // 0-9 uint8_t type; // 0=Flat, 1=Peak, 2=LS, 3=HS, 4=LP, 5=HP uint8_t reserved; float freq; // Hz float Q; float gain_db; }
マトリックスルートパケット (8 バイト):
struct __attribute__((packed)) { uint8_t input; // 0-1 (USB L/R) uint8_t output; // RP2350: 0-8, RP2040: 0-4 uint8_t enabled; // 0 or 1 uint8_t phase_invert; // 0 or 1 float gain_db; // -inf to +12dB }
ランタイムピン構成
出力 GPIO ピンはフラッシュ書き換えなしで動作時に再割り当て可能です。カスタム PCB レイアウトや、デフォルトピン割り当てが他のハードウェアと競合する場合に役立ちます。 REQ_SET_OUTPUT_PIN (0x7C) — IN 転送、1 バイトステータスを返す:
wValue = (new_pin << 8) | output_index- RP2350: S/PDIF 出力 1-4 用に output_index 0-3、PDM サブウーファー用に 4
- RP2040: S/PDIF 出力 1-2 用に output_index 0-1、PDM サブウーファー用に 2
S/PDIF 出力はピン変更中に自動的に無効化/有効化されます(その出力でのみ約 1ms のオーディオドロップ)。PDM 出力を先に無効化(REQ_SET_OUTPUT_ENABLE を使用)していないと、PIN_CONFIG_OUTPUT_ACTIVE を返します。
| ステータスクード | 値 | 意味 |
|---|---|---|
| PIN_CONFIG_SUCCESS | 0x00 | ピン変更成功 |
| PIN_CONFIG_INVALID_PIN | 0x01 | ピンが範囲外または予約済み (GPIO 12, 23-25) |
| PIN_CONFIG_PIN_IN_USE | 0x02 | ピンがすでに他の出力に割り当てられている |
| PIN_CONFIG_INVALID_OUTPUT | 0x03 | 出力インデックスが範囲外 |
| PIN_CONFIG_OUTPUT_ACTIVE | 0x04 | PDM 出力をピンジャン換える前に無効にする必要あり |
REQ_GET_OUTPUT_PIN (0x7D) — IN 転送、1 バイトを返す:
wValue = output_index- その出力の現在の GPIO ピン番号を返す
ピン割り当ては各プリセットに保存され、プリセット保存/ロード時にオプションで含めることができます(REQ_PRESET_SET_INCLUDE_PINS で制御)。
ソースからビルド (Building from Source)
ファームウェアを自らビルドするには、標準的な Raspberry Pi Pico C/C++ 開発環境が必要です。
1. 前提条件のインストール
以下のツールがインストールされていることを確認してください:
- CMake (3.13 以降)
- Arm GNU Toolchain (arm-none-eabi-gcc など)
- Python 3 (Pico SDK スクリプト用)
- Git
2. リポジトリのクローン
Pico SDK および他のサブモジュールを含むようにリクルーシブにプロジェクトをクローンします:
git clone --recursive https://github.com/WeebLabs/DSPi.git cd DSPi
すでに
--recursive なくクローンした場合は、以下を実行してください:
git submodule update --init --recursive
3. ファームウェアのビルド
標準 RP2040 (Raspberry Pi Pico) または新しい RP2350 (Raspberry Pi Pico 2) のいずれかのためにビルドできます。ビルドシステムは別のディレクトリを使用して競合を回避します。
オプション A: RP2040 (Standard Pico) 用ビルド
mkdir build-rp2040 cd build-rp2040 cmake -DPICO_BOARD=pico -DPICO_EXTRAS_PATH=../firmware/pico-extras ../firmware make
出力:
DSPi/DSPi.uf2
オプション B: RP2350 (Pico 2) 用ビルド
mkdir build-rp2350 cd build-rp2350 cmake -DPICO_BOARD=pico2 -DPICO_EXTRAS_PATH=../firmware/pico-extras ../firmware make
出力:
DSPi/DSPi.uf2
4. デバイスのフラッシュ
ボード上の BOOTSEL ボタンを押したまま挿入します。生成された .uf2 ファイルを RPI-RP2 (または RP2350) ドライブにドラッグ&ドロップします。
または、すでに動作中の DSPi をボタン押さずにブートローダーモードに入れるには、REQ_ENTER_BOOTLOADER (0xF0) を送信します。DSPi Console アプリケーションはワンクリックファームウェア更新のためにこれを利用しています。プロトコル詳細については Documentation/Features/firmware_update.md を参照してください。
詳細仕様書 (Detailed Specifications)
各サブシステムの詳細仕様は Documentation/Features/ 下で保持されています。これらがプロトコル形式、ワイヤレイアウト、エッジケース、およびホストアプリ統合パターンの権威あるソースです。
| 機能 | 仕様書 |
|---|---|
| マトリックスミキサー | matrixmixer_spec.md |
| ユーザープリセット | user_presets_spec.md |
| マスターボリューム | master_volume_spec.md |
| チャンネルごとのプレアンプ | per_channel_preamp_spec.md |
| 音量リベラー | volume_leveller_spec.md |
| I2S 出力 | i2s_output_spec.md |
| ピーク/クリップメータリング | peak_clip_metering_spec.md |
| バッファ統計 | buffer_statistics_spec.md |
| S/PDIF DMA 飢餓 | spdif_starvation_spec.md |
| USB エラー診断 | usb_errors_spec.md |
| コア 1 モード | core1_modes_spec.md |
| デバイス識別 | device_identification_spec.md |
| S/PDIF 入力 (計画) | SPDIF_input_spec.md |
| USB 経由ファームウェア更新 | Documentation/Features/firmware_update.md |
| ロードマップ | roadmap.md |
ライセンス (License)
このプロジェクトは GNU General Public License v3.0 の下でライセンスされています。詳細は LICENSE を参照してください。