見出し画像

バン1グランプリ2024「コロコロカービィ」制作記

今年のバン1グランプリでは、コロコロカービィのタイトルコールをバンブラPで再現してみました

この記事では、「コロコロカービィ」の制作後記として、作るときに考えたことややったことを書いていきます

題材選び

以前から「コロコロカービィ」をバンブラに打ち込んでみたいとは思っていました
ただ、これはGB音源でありながらおそらく波形メモリをふんだんに使ってボイスを再現してるものなので、いくら矩形波・三角波の揃っているバンブラでも再現は非常に難しいとも思っていました

一方で、フーリエ変換を利用して音声を再現するのもバンブラでやりたいと考えていました
こちらは計算結果をバンブラに打ち込むのが非常に面倒なのが予想されるのと、いい感じのお題が見つからないため今まで実行には移せていませんでした

今回「今年のバン1でやるネタないな~」と考えているところにこのネタを思い出して、実際に作ってみることにしました
実際の制作時間は動画化まで含めて6時間くらいです。ネタにふさわしい短時間での制作ですね?

フーリエ変換する(考察)

まずフーリエ変換する部分……ですが、単にフーリエ変換するだけでは再現できないと踏んでいました
バンブラでは余り多くの音や細かい音が鳴らせないことと、原曲が基本的にカクカクとした波形で構成されていることが理由です

そこで、まずはフーリエ変換の式を矩形波の式に変更できないか考えました
が、こちらはうまく構成できませんでした
(そもそも矩形波に直交性がないから無理……?)

ということで、正弦波で普通にフーリエ変換したものを元に計算することにしました

フーリエ変換の結果から値が大きい周波数を順に割り当ててもいいのですが、今回は矩形波を使いたいので、矩形波の倍音成分の分をフーリエ変換の結果から引くようにしてみました

duty比 $${ D }$$ の矩形波の $${ n }$$ 倍音成分の振幅は、位相を無視すると $${ \frac{\sin(n \pi D)}{n}}$$ となります
(本当は位相も考えたいところですが、とりあえず簡略化ということで……)

フーリエ変換する(実装)

実際にフーリエ変換するコードは、ざっくりChatGPTに書いてもらったものを改造しました
これくらいのコード書いてもらえるの便利

実際に打ち込んだときにどんな音になるか確かめたいので、シミュレートした結果も出力してみました
色々な矩形波(と正弦波)で試した結果がこちらです(音量注意)

この中で原曲の感じに一番近く感じた25%矩形波を使うことにしました

バンブラへ打ち込む

一番めんどくさいところ
計算結果をバンブラに合うように音階・音量を変換して、出力された結果の通りに打ち込んでいきます

どう打ち込むかの情報はすべて動画に載せましたが、音階・音量の部分の情報が速すぎて見えないのでここに載せておきます

音階は最低音がC1、最高音がB7となるように設定

動画化する

音源が1秒しかないので、どう動画にするかちょっと悩みました

単に流すだけでは寂しい → 情報量がほしい → どう打ち込んだかの情報を入れよう

まで思いついたところで、「過剰な情報量で殴ったら面白そう」「音階・音量の情報まで全部入れてしまおう」という電波を受信したので実行に移しました

幸いexo(AviUtlの編集データ的なファイル)を作るコードは書いたことがあったので、サクっと情報量を増やせました
(別にわざわざexo作らなくても、AviUtl内のスクリプトで書いても良かったと後から思った)

感想

実働4時間くらいでコードを色々書いて作るのがAHC(競技プログラミング)っぽくて面白かったです

ただ、完成したものは「それっぽいけどまだまだ遠い」と感じる音だったので、より良い音が作れないかまた考えていきたいです

フーリエ変換では低周波数成分がまばらに&高周波成分が密に解析されるため、音楽的な解析をする場合は「定Q変換(Constant-Q Transform)」というものを使うといいらしいです
この変換はPythonなら「librosa」というライブラリを使って試せます
(というメモを残しておきます)
この変換の存在はフォロワーに教えていただきました 感謝!


いいなと思ったら応援しよう!