はじめに
最近、自作のシンセサイザーを作り始めているのですが、結構実装が楽だったので使ってるライブラリについて軽く情報を残しておきます。
libsoundio
オーディオのコールバック命令やイベント実行待ち等がすでに実装されているライブラリ。
(内部にスレッド使っててマルチスレッド的に処理可能みたい)
WindowsだとWASAPIとJACKが使える模様。
ただ自分はWASAPIだけ使う考え。デフォルト設定でつなぐ。
どうも列挙型SoundIoBackendの順番で取得しに行くっぽい。
実装例
公式ページの「Basic Sine Wave Example」を参照。
コールバック関数を用意すれば簡単にオーディオ再生の実装が出来上がる。
ちなみになんかアクションを行う場合、コールバック変数において書き込むバッファの数値を小さくするとレスポンスが早くなるけど、なんかシーケンス走らせてる場合それとは別に秒数を制御してデータを書き込む必要があるのに注意。
あと実装サンプルだとsample_rateが48000になってるけど、これを44100Hzにしたい場合、以下の手順で実装しておくこと。
- soundio_outstream_create()関数でSoundIoOutStreamのデータ取得
- SoundIoOutStream内のメンバであるsample_rateに44100をアサイン(他の数値も一緒に定義しとくと間違いがない)
- soundio_outstream_open()関数を実行
- soundio_outstream_start()関数を実行
ということはダウンサンプリングする場合は別途値を持っている必要がありそう。
(未確認だけど)
実装例
https://twitter.com/__machia__/status/1129654105327038466
https://twitter.com/__machia__/status/1125313931273052160
とりあえず位相を補正したサイン波とか波形メモリ音源を実装できてます。
IF周りも調整予定。(今の所dear imgui使ってサクッと実装しているのみ)
注意事項
あ、注意なのがDirectSound/XAudio2/ASIOについてはライブラリ側で対応してない部分ね。つまり上記API使う場合は別途定義したりオーディオレンダリングは別途スレッド立てる必要があるってことね。
だから実際のところ上記APIも組み込む場合はオーディオのクラス作ってそこにまとめてしまう実装になるかも。
(自分の場合XAudio2は不要としてlibsoundioだけで作ってる。今後必要なら上記方法でまとめる予定)
おわりに
ライセンスはMITっぽいので、取扱もすごい楽。
現在、このライブラリ使ってシーケンサ+シンセを実装中。