プログラミング
NAM A2-LiteをiRig HD Xに組み込む
I Put Nam A2-Lite Inside an iRig HD X (playtaurus.com)
要約
筆者は、IK MultimediaのiRig HD Xオーディオインターフェースに搭載されている500MHz Cortex-M7マイクロコントローラ(NXP MIMXRT1011DAE5A)の余剰処理能力を活用し、ギターアンプモデリングソフトウェアであるNAM A2-Liteを直接組み込むことに成功しました。これにより、PCやスマートフォンなどの外部デバイスなしで、iRig HD X単体でリアルタイムのアンプモデリングが可能になりました。この改造は、インターフェースのUSBオーディオパスを再設計した後に可能となり、ESP32-S3ペダルプロトタイプとの連携を経て実現されました。
全文翻訳
NAM A2-LiteをiRig HD Xに組み込む
私のデスクにあるiRig HD Xは、以前はギターオーディオを別のコンピューターに送って処理するために使用されていました。しかし、今ではインターフェース自体がアンプモデリングを行います。
ギター → iRigコーデック → NAM A2-Lite → ヘッドフォンまたはアンプ
モデルは、インターフェースに既に内蔵されている500MHzマイクロコントローラ上で実行されます。USBから電力が供給されます。ホイールは引き続きヘッドフォン音量を制御します。出力されるサウンドは、OD808を前に置いた5150のキャプチャで、iRig内でリアルタイムにレンダリングされています。
写真提供:IK Multimedia公式iRig HD X画像ギャラリー。
インターフェースの中にコンピューターがあった
これは、HD XのUSBオーディオパスを書き換えた直後に始まりました。その作業により、インターフェースが私のペダルプロトタイプ内のESP32-S3と互換性を持つようになりました。ファームウェアの読み出しを行い、ボックスがオーディオをどのように移動させるかを理解した後、基板上のより大きなチップを無視することは困難になりました。
HD XはNXP MIMXRT1011DAE5Aを中心に構築されています。これは、ハードウェア浮動小数点演算、密結合メモリ、外部QSPIフラッシュ、SAIオーディオ、eDMAを備えた500MHz Cortex-M7です。その通常のジョブは、コーデックを設定し、サンプルを移動させ、コントロールを処理することです。プロセッサの大部分は、オーディオ割り込みの間に待機していました。
NAM A2-Liteは、まさにこのようなマシン向けに設計されています。これは、Taurusで使用しているA2ファミリーのコンパクトなメンバーであり、繰り返し使用されるアンプモデルと48kHzオーディオを備えています。私は、組み込みテスト全体で使用していたものと同じモデルである、jp_is_out_of_tune氏がオンラインで見つけたOD808を前に置いた5150のキャプチャを使用しました。私は、インターフェース全体を内部に収めたかったのです。コーデックがギターをキャプチャし、RT1011がモデルを実行し、コーデックが結果を再生します。ESP32-S3、Mac、電話はすべてオーディオパスから削除される可能性があります。
エンジンを128KiBに収める
プロセッサには、32KiBのFlexRAMバンクが4つあります。これらのバンクは、起動時に命令TCM、データTCM、または通常のオンチップRAMとして使用できます。A2-Liteのエンジンオブジェクトは91,204バイトを占めるため、通常のメモリレイアウトは使用できませんでした。私は3つのバンクをDTCMとして、1つをOCRAMとして設定しました。
RegionSizeWhat lives there
DTCM96 KiBA2-Lite weights and convolution history
OCRAM32 KiBDMA buffers, program data and stack
External QSPI2 MiBExecutable code, constants and the model file
コンパクトモデルは7,516バイトです。起動まではフラッシュに留まり、その後、その重みと履歴はDTCMにロードされます。最終的なライブビルドでは、91,232バイトのDTCMが使用され、7,072バイトの空き容量が残ります。予約されたスタックを含むOCRAMの使用量は10,664バイトです。これにより、オーディオ処理機構やファームウェアが生存するために必要なその他のものに22,104バイトが残ります。
48フレームから16へ
私は48サンプルブロックでエンジンを起動しました。48kHzでは、各ブロックは1ミリ秒持続し、500MHzプロセッサに500,000サイクルを提供します。
物理的なヌルテストの実行測定値:
48-sample blockCycles
Minimum442,052
Mean442,108
Maximum442,260
Deadline500,000
最も負荷の高いブロックは利用可能な時間の88.45%を使用し、57,740サイクルを残して完了しました。私は最初にCortex-M7のDSP命令を試しました。段階的なレイヤーメジャー実装は662,042サイクルを要しました。私の手書きの2フレーム畳み込みカーネルは1,001,381サイクルを要しました。どちらもオーディオのデッドラインに間に合いませんでした。
最も高速なバージョンは、ポータブルな全モデル浮動小数点エンジンでした。M7のキャッシュ、FPU、コンパイラは、私の手動カーネルよりも優れたスケジュールで合意していました。私は巧妙なコードを削除し、時間内に完了したバージョンを保持しました。
その後、ライブバッファを16フレーム、つまり0.333ミリ秒に削減しました。そのデッドラインは166,667サイクルです。
最終的なファームウェアは、遅延したブロックをストリーミングし続けます。4エントリーのDMAキューのいずれかが遅延した場合、両方のSAIストリームを再起動します。エラーが発生すると、可聴クリックまたはドロップアウトが発生し、再生が再開されます。
インターフェースをペダルに変える
交換用ファームウェアは、I2C経由で元のコーデックを設定し、eDMAを使用してSAI経由でステレオオーディオをストリーミングします。完了した各入力ブロックはfloatに変換され、A2-Liteを通過し、floatから戻されて再生用にキューイングされます。2番目の出力チャンネルは同じ処理済み信号を運び、ヘッドフォンとアンプのパスが正常に動作するようにします。物理的なホイールは引き続きヘッドフォンレベルを設定します。最初のライブビルドが非常にうるさくなったとき、これは緊急性を帯びました。ホイールが再び機能するようになったら、元のインターフェースのように演奏できるようになりました。
ライブモードでは、USBケーブルがHD Xに電力を供給します。オーディオはボード上に留まります。
コーデックは48kHzでギターをサンプリングします。
eDMAは16フレームの入力ブロックを埋めます。
A2-Liteは5150キャプチャをレンダリングします。
eDMAは結果をコーデックに送り返します。
ヘッドフォンとアンプの出力がそれを再生します。
私はギターとヘッドフォンをiRigに接続し、信号パスにホストコンピューターがない状態でモデルを聞きました。USBインターフェースは、ペダル全体になっていました。
アップストリームNAMCoreとの比較
同じ15秒、48kHzのギター録音を、元の.namキャプチャを使用して、アップストリームのNeuralAmpModelerCoreでレンダリングしました。一時的なiRigファームウェアは、比較のためにRT1011で処理されたサンプルをUSB経由で返しました。録音後、ライブファームウェアを復元しました。物理的なiRigとアップストリームのNAMCoreは、ゼロサンプルで整列しました。最初の1秒後の、レンダリングの安定した部分のヌルを示します。
MeasurementResult
Relative null−115.63 dB
Correlation0.9999999999985
Largest sample error2.811 × 10⁻⁶ (−111.0 dBFS)
Residual RMS−131.83 dBFS
すべての4つのファイルを聴く
レンダリング
同じ15秒のDIを、アップストリームのNAMCoreとiRig内の物理的なRT1011でレンダリングしました。どちらもユニティゲインで再生されます。
NAMCore−16.16 dBFS rms
元のキャプチャをアップストリームNeuralAmpModelerCoreでレンダリングしたもの。
iRig HD X−16.16 dBFS rms
同じキャプチャを物理的なiRig内でレンダリングしたもの。
ヌル
NAMCoreからiRigを引いたもの、サンプルごと。
2番目のプレーヤーは80dB追加されているため、残差を聞くことができます。
Null at unity gain−131.86 dBFS rms
実際のレベルでの完全な差。
Null +80 dB−51.86 dBFS rms
同じヌルを10,000倍したもの。再生する前に音量を下げてください。
すべての4つの波形は、1つの絶対スケールを共有しています。+80 dBファイルはリスニングゲインのみを変更します。そのサンプルはユニティゲインのヌルに10,000を掛けたものです。
開始時を含む15秒全体で、相対ヌルは-115.70 dBでした。最大の誤差は、フルスケールの数百万分の1でした。これは、異なるコンパイラとプロセッサからの浮動小数点丸めであり、コーデックのアナログノイズフロアよりもはるかに低い値です。
私のデスクのボックスは今や違います
iRig HD Xは、ギターとどこかで実行されているソフトウェアの間のブリッジとして販売されています。このiRigは、アンプモデルを独自のオーディオループ内で実行できます。
完成した研究ビルドには以下が含まれます。
リアルなNAM A2-Liteエンジン。
5150 + OD808キャプチャが独自のフラッシュに保存されています。
16フレーム、0.333ミリ秒ブロックでの48kHz処理。
アンダーラン後の永続的なサイレンスの代わりに、自動SAI/eDMAリカバリ。
元のコーデック、入力、出力、ボリュームホイール。
アップストリームNAMCoreに対する-115.63 dBのヌル。
私は、間違ったUSBインターフェースをESP32-S3と通信させようとすることからこの旅を始めました。約12時間後、インターフェースはアンプサウンドを単独で鳴らすことができるようになりました。