ソナグラムと言えば,周波数スペクトルのパワーを時間軸で見れるようにしたグラフです.スペクトルの時間変化を確認したい時に使われます.
ソナグラムを確認するためのビジュアライザを作ってみたかったので,Siv3Dで作ってみました.こんな感じになります.
# include <Siv3D.hpp>
void Main()
{
const Font font(30);
Window::Resize(1024, 1024);
Recorder::SetBufferLengthBySec(s3d::RecorerSamplingRate::S44100, 60 * 5);
Image image = Image(1024, 1024, Color(0, 0, 0));
DynamicTexture texture = DynamicTexture(image);
if (!Recorder::Start())
{
return;
}
int count = 1;
while (System::Update())
{
if (Recorder::IsEnd())
{
Recorder::Restart();
}
Waving::FFT(Recorder::GetWave(), Recorder::GetPos(), Waving::SampleLength::Default);
const float* p = Waving::FFTBuffer();
for (int i = 0; i < Window::Height(); ++i)
{
image[i][count] = HSV(-log(p[i]) * 10);
}
//Texture(image).draw();
texture.fill(image);
texture.draw();
Line(count, 0, count, Window::Height()).draw();
if (++count >= 1024)
count = 0;
//count++;
}
}
ちなみに,どうやらTexture(image).draw()を何度もやっていると,終了時にエラーが出て落ちるみたいです.一応,アセットが大量に生成と削除を繰り返している,と警告が出ていたので気になってはいたのですが案の定です.アセット周りの警告が出ないように設定を弄ったので,本当にまずい方法だったんですね()
現状,あまり気にするようなデモではないのですが,気になる人は他の方法を考えたほうがいいのかもしれません.
DynamicTextureを利用したらうまく行きました.