LoginSignup
1
1

More than 5 years have passed since last update.

Siv3Dでソナグラムをやってみる

Last updated at Posted at 2014-08-12

ソナグラムと言えば,周波数スペクトルのパワーを時間軸で見れるようにしたグラフです.スペクトルの時間変化を確認したい時に使われます.

ソナグラムを確認するためのビジュアライザを作ってみたかったので,Siv3Dで作ってみました.こんな感じになります.

無題.jpg

# 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を利用したらうまく行きました.

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1