この記事はkmc-id : base64による KMC Advent Calendar 2016 22日目の記事です.
前回の記事はwass80さんによるnullでした.とてもnullですね.
QOL*1を上げたい
皆さんは何か作業するときに曲を聴きますか?私はよく聞いています.私のお気に入りの作業用BGMはニコニコ動画の【打ち込み】駆け抜けるアニソンメドレー by M.Iz(元M.I.) 音楽/動画 - ニコニコ動画です.この曲はアニソンがいい感じに繋げられていて聞いていて気持ちいいです.
この曲を聞いていて,こんな感じのメドレーを自動生成できたらQOLが爆上がりして人生勝ち組になれるのでは⁉︎と思ったため,いい感じのメドレーを自動生成するプログラムを作ってみました.(進捗力が足りなかったので,精度はあまり良くないかも……)
(QOLは大事です)
本題
ここから,いい感じのメドレーを生成する大まかな方針を簡単に説明していきます.
ソースコードを見たいという方や,実際に試してみたいという方はgithubで公開しているのでそちらを参照してください*2. github.com
いい感じのメドレーを作りたいと言っても,どうすると「いい感じ」なのかをちゃんと定義しないと先に進めないので,「いい感じなメドレー」をここでは下のように定義します.
- 中途半端なタイミングで曲が切り替わるのではなく,小節や拍単位で一つの曲から抜き出されている.
- 似ている音を持つところで曲が繋げられている.
曲をいい感じのタイミングで切り取る
まず曲を短時間フーリエ変換し,各時間における周波数ごとの音の大きさを求めて,これの単位時間当たりの変化が大きい時刻を音が変化したタイミングとして列挙します.
音が変化したタイミングは拍のタイミングと一致することが多いことから,音が変化するタイミング同士の時間間隔を調べて,そこから拍と拍の間隔を推測します.
そして,得られた拍の間隔を基にして,音の変化の度合いが大きい箇所を調べて,それを小節の開始点ということにしています*3.
以上の手順を得て,曲の小節(拍)のタイミングと思われるタイミングで曲を切り取っています.
似た音で曲を繋げる
あらかじめ曲をいい感じのタイミングで切り取ってたくさんのパーツに分けます.このパーツの始まりと終わった直後の部分の音の周波数成分で大きいものをフーリエ変換で調べてます.これで得られた周波数の音でそのパーツが始まり,そしてその音が鳴る直前にパーツが終わるということにします*4.
あとは適当な曲のパーツから始めて,そのパーツの直後の周波数と近い周波数で始まるパーツをつなげて,つなげたパーツの直後の周波数と近い……(以下略)とすることで似た高さの音で曲を繋げています.
成果物
僕のPCに入っている曲を使って手元で生成したメドレーをあげたかったんですが,思いっきり著作権的にまずい*5ので,jackerさんのKMCフリー素材*6の音楽を使わせてもらって作ったいい感じのメドレーをKMC内で公開します(jackerさんに感謝!).
(こうしてKMCのDTM勢の曲を聴くとすごいなぁといつも思います)
KMCに入っていない人は手元でプログラムを動かすか入部しましょう!
それなりにいい感じのメドレーが(少なくとも僕のitunesの曲に対して)自動生成できたので満足してますが,いろいろな部分を雑に実装していて精度も良くないので,今後改良していくかも.
次回のKMC Advent Calendar
明日のKMC Advent Calendar 2016の記事はtetsutalow先生による「1223は素数だしかし20161223は素数ではない」です.楽しみですね.
KMCM(宣伝)
京大マイコンクラブではQOLを上げたい部員を募集しています.年齢や所属、国籍や宗教その他諸々に関する制約はありません。詳しくは入部案内を見て下さい。 www.kmc.gr.jp