LemonteaのUnity部屋

UnityとかC#のおはなしです~

Unity GetSpectrumDataで音ゲーの譜面を自動生成(2)

こんにちは。レモンティーです。

前回、思いつきで適当な自動譜面作成をやりましたよね。
sawalemounity.hatenablog.com

あれが意外と進化しそうだったので、
今回はレベルメータの転用ではなく
普通に作ってみました。

やり方としては
・GetSpectrumDataでデータを取得
・今鳴ってる一番強い音の強さをとる
・前フレームの最強音と比較して、ある程度以上強くなっていたら1音と認定

って感じです。

それではやってみます。



・GetSpectrumDataでデータを取得

 AS.GetSpectrumData(spectrum, 0, FFTWindow.Blackman);

これで配列Spectrumにデータが入ります
詳しくはここで
sawalemounity.hatenablog.com



・今鳴ってる一番強い音の強さをとる

 NowMax = 0;
        for (int k = 0; k < 1024; k++)
        {
            if (spectrum[k] >= NowMax)
            {
                NowMax = spectrum[k];
            }
        }

こんな感じにしました。

また、比較のために
Updateの最後に

 PreMax = NowMax;

こんな感じにしてます



・前フレームの最強音と比較して、ある程度以上強くなっていたら1音と認定

そして比較して記録します
このへんはここに~
sawalemounity.hatenablog.com

 if (NowMax >= PreMax + MinimamDifference)
        {
            if (intv <= 0)
            {
                sms.Timing[i] = timecount;
                i++;
                Array.Resize(ref sms.Timing, i + 1);
                intv = Interval;
            }
        }

あちゃ~なことにミニマムの綴り間違えてますね笑笑笑

そのアホそうな変数が
前フレームの音からどれくらい強くなれば
音譜を作るかを決める大切な変数なのです笑

最適な値は曲によりけりだと思うのでpublicなやつです。
今回は15くらい。
(この直前にNowMaxを100倍しているためで、そのままだと0.01とかの世界です)


また、Intervalというのは
最小の音の間隔のことです

そのままだと音がユラッてなった時に
0.0何秒間隔くらいでババババ~っと音譜ができちゃうので
それを抑えてます


さあ、簡易的ですができたので
さっそくいつもの魔王魂さんの曲で
試してみましょう

youtu.be



おお、音が抜けて中盤の精度はやや下がりましたが
全体的にはずいぶんよくなったのではないでしょうか

もうちょっと良くなったら
長押しとかも組み込んでみたいですね

今回はこれでおしまいです。


関連

音ゲーの記事初回
sawalemounity.hatenablog.com