Edited at

woslicer III の謎に迫る! ~ポップノイズの知られざる正体とは!?~

More than 3 years have passed since last update.

BMSぶつ切り最強ツールであるところのwoslicer、皆さん使ってますか? もちろん使ってますよね? さて、このwoslicerですが、どうやら謎のノイズが発生するらしいのです・・・ということで調査してみました。

image

こんな感じで試しにスライスしてみました。wavの最初から最後までを1つのスライスとするような分割です。すると・・・


(1) sweep音をスライスした場合

$y(t) = \sin(2\pi \cdot 100 t e^{0.201t})$ (0≦t<10) です。こんな数式を見なくても、周波数がだんだん上がっていく音と考えてもらえればOKです。

(周波数は、 $f(t) = \frac{1}{2\pi}\cdot\frac{d\theta}{dt} = 100 (0.201t+1) e^{0.201t}$ [Hz] )

こちらが結果です。

image

なんでや! 逆再生必要ないやろ!

音声の末尾に、元の音声を逆再生した音声が挿入されていることが分かります。例えば声をスライスした場合、しっかりと逆再生されていることが分かります。


(2) 直流に近い波形(1次関数)をスライスした場合

$y(t) = t/5 - 1/2$ (0≦t<10) です。設定は(1)と同じです。

image

上から2つ目の波形を見ると、位相が反転していることがよく分かります。また、一番下の波形を見ると、フェードアウト係数の精度が(若干ですが)よくないらしいことがわかります。一定間隔で不連続な点があることから考えると、高速化のためにフェードアウト係数(恐らくsin関数)の値を予め計算して、ルックアップテーブルにしているのかもしれません。

なお、ここでの微分とは、差分 $y(n) = x(n+1) - x(n)$ を取る操作のことを指すものとします。


(3) さらに波形が複雑な音声をスライスした場合

y(t) = \frac{1}{2} \left\{\sin\theta+\sin\left(2\theta+\frac{3}{5}\pi\right) \right\} \\ \\

\mbox{where} \theta = 2\pi \cdot 100t e^{0.201t} \;\;\;\; (0\leq t<10)

設定はこのような感じです。

image

結果がこちら。上の図において水色の丸で囲んだ部分、つまり5番目(n=004)のスライスの波形の一部を示しています。

image

黄色い線が、フェードアウトが無い場合の、おおよそのスライスの終了位置(1.58333秒)を示しています。これを見ると、それより後の箇所(赤線)で音声が逆再生され、さらに上下が反転されているらしいことが分かります。また、ちょうど赤線の箇所に、値が0となるサンプルが、1サンプル分だけ挿入されていることが分かります。どうやらこれがポップノイズの正体のようです。

image

(1)と(2)の例についても、よく見ると0値が挿入されていたことが分かりました。

image


まとめ

パラ出力されたトラックをぶつ切りする際に、カットポイントより前をフェードアウトさせると音が短くなってしまいます。かと言って、カットポイントより後をフェードアウトさせると次の音が混入してしまいます。これはパラ出力された音源をぶつ切りする以上避けることのできない現象です。

そこで、仕方なく「音の末尾を反転させつつ逆再生することで音を引き伸ばし、ぶつ切り感を低減させる」という手法を採用したのではないかと推測されます。いやはや、なるほど、という感じです。ただ、その結果として折り返し地点で若干のポップノイズが生じてしまうのは、できれば改善したい点だったのではないかとも思われます。


(BMS製作者向けの)まとめ

(可能な限り)ぶつ切りはやめよう!!