前回の続きです。この2週間ほどは、作成中のexternal generatorを使って、いろいろなパッチを変換しつつ仕様を改善しているところです。
衝撃だったのは、このパッチがメモリ不足(コンパイル結果が大きすぎる)で動かないことです。
arm-none-eabi/bin/ld: region `SRAM' overflowed by 3392 bytes
collect2: error: ld returned 1 exit status
どうも、生成されたコードを見ると、[noise~]を使用したことでHvControlBinop.c
やHvControlUnop.c
がプロジェクトに追加され、これらの中から三角関数や対数関数など多くの数学関数が呼ばれ、それがリンクされてバイナリサイズを底上げしているようです。
malloc()を差し替えたのと同じ方法で、一部の関数をlogue SDKの近似用関数で置き換えてみましたが、全部を置き換えることはできず、かろうじて上のパッチが動作するところまでは来ました。
それでもメモリ使用量はこんな感じです。
$ size build/noise.elf
text data bss dec hex filename
23104 2128 3136 28368 6ed0 build/noise.elf
ちょっとフィルタをかけてみるくらいの実験はできますが・・・
今日のPure Data => logue SDK実験。ノイズにフィルタをかけるだけなのに、結構苦労させられました。 pic.twitter.com/HnCDXHwjxH
— boochowp (@boochowp) March 9, 2025
もう少しメモリに余裕があれば、ディレイラインを入れてKarplus-Strongオシレータの実験ができるかなと思ったのですが、3Kb程度のバッファしか取れない(=750サンプル=15msec程度)となるとちょっと難しそうです。
[noise~]の代わりになるオブジェクトをlogue SDK側から提供できれば良いのですが、hvccにはコントロール信号は送ることができますが、シグナル(音声信号)を送り込む仕組みは無いようです。
唯一の例外が[adc~]で、ここから音声信号をサンプリングデータとしてHVCCコンテキストに送ることはできます。ここにホワイトノイズを送ることにすれば、メモリを大幅に節約することができるます。
とはいえ、[adc~]の本来の機能を損なうような変更はしたくないので、Pure Data側から[adc~]にノイズを送るように、パラメータなどで要求する方法を考えてみたのですが、あまりこれといった方法は思いついていません。hvccの実装が、[adc~]のパラメータは数字しか受け付けないようになっているので、シンボリックな情報は指定できないのです。
基本的な機能は概ね実現できたかなと思っていますが、もうちょっと各種オブジェクトの互換性を確認してからリリースしようと思います。
コメント