どもです。
表題の通り、libsndfileの関数を使ってオーディオファイルをいろいろ操作するサンプル集「libsndfile-samples」をリリースしました。
背景
趣味柄FPGAデザインにI2Sを流すことがあるんですが、1kHz正弦波だったり、インパルスだったり、「左だけ1kHzで右は無音」みたいな「欲しいときに欲しい音源を生成したい」ということは多々あります。
Pythonでも手軽にこれらのファイルを生成できるライブラリがあるのですが、
Pythonだとデータ量に比例して極端に実行時間は遅くなりますし、MATLABは有料ですし、かといってOctaveをこのために勉強するのもなんですし、「高速にかつ無料でAUDIYにとってコストなく」生成しようとするとやはりC言語に戻ってしまいます。
過去にAUDIYはWAVIOという、WAVファイル限定の読み込み・書き込みライブラリを作っていましたが、
これはWAVファイルの構造を理解する目的で作っていたものであり、FLACファイルなどに対する対応ができないため柔軟性がありませんでした。
ということで、この際なのでlibsndfileを使ってオーディオファイルを読み書きできるようにしておこうという魂胆です。
libsndfileについて
幅広いオーディオファイルやデータ形式(short, int, float, double)に対応しており、柔軟性高くオーディオファイルを読み書きできます。
WAV, AIFF, FLAC、なんとMATファイルにも対応しています。
これは使わない手はありません。
実はこのlibsndfile
libsndfile自体、複数のexampleを持っています。
ファイルをコピーしたり、各チャンネルの音量を調整したり、テキストファイルに出力したりといろいろありますが、Programming Interfaceに記載の関数の実際の動作を網羅しているようなものではありません。
今回は「一つ一つの関数の動作をたしかめる」ことを目的にサンプル集を作ってみました。
構成
2025年2月22日時点で30個のサンプルから成り立ちます。
各関数を確認してて便利だなと思ったのは「浮動小数(double)から整数型のファイルを生成できる点」や、wavファイルに任意のチャンクを埋め込むことができる点です。
libsndfileで遊んでるけどすげー
— AUDIY (@AUDIY14) February 12, 2025
wavファイルの中に任意のチャンクを埋め込むことができるっぽい pic.twitter.com/4BX5ux8jc1
上記ツイートはlibsndfileを使ってwavファイルの中に"Test"というチャンクを作成し、"The quick brown fox jumped over the lazy dogs."という文字列データを埋め込んだ例です。
一部使用できるオーディオファイルも6つほど保存してあります。
興味のあるかたはぜひいろいろ試してみていただければと思います。
また、Issues、Pull requests、Star、Folk大歓迎です。