hvccをlogue SDK向けに拡張する(2)

前回の続きです。この2週間ほどは、作成中のexternal generatorを使って、いろいろなパッチを変換しつつ仕様を改善しているところです。

衝撃だったのは、このパッチがメモリ不足(コンパイル結果が大きすぎる)で動かないことです。

arm-none-eabi/bin/ld: region `SRAM' overflowed by 3392 bytes
collect2: error: ld returned 1 exit status

どうも、生成されたコードを見ると、[noise~]を使用したことでHvControlBinop.cHvControlUnop.cがプロジェクトに追加され、これらの中から三角関数や対数関数など多くの数学関数が呼ばれ、それがリンクされてバイナリサイズを底上げしているようです。

malloc()を差し替えたのと同じ方法で、一部の関数をlogue SDKの近似用関数で置き換えてみましたが、全部を置き換えることはできず、かろうじて上のパッチが動作するところまでは来ました。

それでもメモリ使用量はこんな感じです。

$ size build/noise.elf
   text	   data	    bss	    dec	    hex	filename
  23104	   2128	   3136	  28368	   6ed0	build/noise.elf

ちょっとフィルタをかけてみるくらいの実験はできますが・・・


もう少しメモリに余裕があれば、ディレイラインを入れてKarplus-Strongオシレータの実験ができるかなと思ったのですが、3Kb程度のバッファしか取れない(=750サンプル=15msec程度)となるとちょっと難しそうです。

[noise~]の代わりになるオブジェクトをlogue SDK側から提供できれば良いのですが、hvccにはコントロール信号は送ることができますが、シグナル(音声信号)を送り込む仕組みは無いようです。

唯一の例外が[adc~]で、ここから音声信号をサンプリングデータとしてHVCCコンテキストに送ることはできます。ここにホワイトノイズを送ることにすれば、メモリを大幅に節約することができるます。

とはいえ、[adc~]の本来の機能を損なうような変更はしたくないので、Pure Data側から[adc~]にノイズを送るように、パラメータなどで要求する方法を考えてみたのですが、あまりこれといった方法は思いついていません。hvccの実装が、[adc~]のパラメータは数字しか受け付けないようになっているので、シンボリックな情報は指定できないのです。

基本的な機能は概ね実現できたかなと思っていますが、もうちょっと各種オブジェクトの互換性を確認してからリリースしようと思います。

コメント