Files
松浦 知也 Matsuura Tomoya cbef2fda11
All checks were successful
Build / build (push) Successful in 7m22s
[obsidian] vault backup: 2025-06-18 15:44:16[
2025-06-18 15:44:16 +09:00

4.0 KiB
Raw Permalink Blame History

date
date
2025-06-12 09:29

#computermusic #programming-language

GitHub - rbdannenberg/arco

メモ

オーディオレートの処理でも、サンプルごとの処理のパターンと、ブロックレベルの処理の2種類がある。

ブロックレベルの処理の場合は入力もブロック

UGenは基本的に参照カウントGC

ここが重要そう

ポイントは、入力信号の種類が非常に多様である点です。constant、block、audioレート入力に加え、単一チャンネルとマルチチャンネル信号の組み合わせにより、潜在的に6種類の入力タイプが存在します。入力数がNの場合、real_runのバリエーションは6^Nに及ぶ可能性があり、自動コード生成であっても管理が困難になります。 この問題を解決するために、2つの主要な戦略を採用しています。まず、入力と出力信号の複数チャンネルを反復処理するコードは、単一のreal_runメソッドに実装されます。ただし、異なる種類の入力の処理は、run_channelメソッドを介した間接的なメソッド呼び出しにより個別化されています。run_channelは、対応するメソッドを指すメソッドです。例えば、multでは、2つのオーディオレートチャンネル各々32浮動小数点数のベクトルを乗算してオーディオレートチャンネルを生成するchan_aa_aメソッドと、オーディオレートチャンネルとブロックレートチャンネル(単一の浮動小数点数)を乗算するchan_ab_aメソッドがあります。変数run_channelは入力が変更されるたびに適切なメソッドに設定され、正しい個別化されたDSP計算が実行されます。

2 番目の戦略では、入力チャンネルを反復処理するロジックを、run_channel を呼び出す前に各入力に対して 1 つの加算命令に削減します。したがって、オーバーヘッドは出力チャンネルの数 x 入力信号の数になります。これは、アクセスおよび計算されるデータの総量に比べて非常に小さいです。

各 run_channel メソッドは、入力が入力ごとのサンプルポインタのアドレスから開始することを期待しています。ポインタは run_channelによって変更されることはありませんが、戻ると、サンプルポインタは入力ごとのストライド量だけインクリメントされます。シングルチャンネル入力の場合、各チャンネルで同じ入力を再利用したいので、ストライドは 0 です。マルチチャンネルオーディオ入力の場合、入力の次のチャンネルに進みたいので、ストライドは 2 です。入力と出力はメモリ内で連続しているため、ストライドはブロック長 (BL = 32) になります。マルチチャンネルのブロックレート入力の場合、1 ブロックにつき 1 サンプルしかないので、ストライドは 1 になります。最後に、定数入力 (メッセージによって更新できる値) は、ブロックレート信号と同じように扱われます。定数は、ストライドが 0 または 1 のシングルチャンネルまたはマルチチャンネルにすることができます。

これらの戦略により、オーディオレート入力とブロックレート入力に異なるコードが必要であるため、組み合わせは 6^N バージョンの内部計算ループから 2^N バージョンに減少します。一部の入力をオーディオレートに制限することで、これをさらに制限することができます。たとえば、ブロックレート信号にオーディオローパスフィルターを適用することはあまり意味がありません。

arco/doc/design.md at main · rbdannenberg/arco · GitHub