ランのお供に!音楽ファイルBPM自動変換の要件定義
前回のYouTube動画MP3保存プログラムのときと同様、まずはやりたいことをまとめておく。
ゴールは「ランニングでピッチのガイド用に、目標のピッチ数に手持ちのMP3音楽ファイルを変換する」こと。
ランしている方には釈迦に説法になってしまうが、ピッチとはランニングでいえばステップ数またはランケイデンスと呼ばれ、ケイデンスという単語で分かる通り、自転車で言うケイデンスに相当する。
自転車のケイデンスはクランクの回転数なので1回転(1 revolution)単位になるが、ランニングの場合はステップ単位なので左右の足で2歩単位になり、だいたい自転車のケイデンス×2がランのケイデンスになる。
つまり自転車の場合90rpmくらいなのがランでは180spmとかになる。
ちなみに単位はrpm(revolution per minute)、spm(step per minute)、bpm(beat per minute、心拍数や音楽がそう)と変わるが、基本的にどれも「1分間に何回~が繰り返されるか」という意味になる。
今回の要件を分解するとこんな感じ。
- 特定のフォルダに変換したいMP3音楽ファイルを入れる
- 変換したいターゲットbpmを指定
- プログラムを実行すると同フォルダ内のMP3を全て指定bpmに変換
- あとは走りながら聴いてそのピッチに合わせて走る
自転車では
ちなみに自転車でもケイデンストレーニングをしたいときに同じようなことをしたことがある。
ただ自転車で音楽聴きながらの実走は危ないので、そのとき用意したのはKORGのMCM-1という電子メトロノーム。
さすが日本の企業だけあって国際版のはずだが日本語の説明もある(製造国はMade in Chinaだけど)。
裏側がクリップのようになっているので、ジャージの襟とかに付けて「ピッピッピッ」という音をガイドにして120rpmとかの高回転トレーニングに使っていた。
が、ランニングでは車道を走らないしスピードも出ないので普通に音楽を聴ける環境にあり、それなら音楽をターゲットピッチに変換して走ろうと思ったのがそもそもピッチ変換MP3を作ろうと思ったきっかけだった。
手動でピッチ変換
ちなみに実はすでに1年以上手動で変換し続けていた。
手動の場合に必要なのは元楽曲のピッチを知ることと、ピッチを変換することの2つ。
MixMeister BPM Analyzerというフリーソフトでフォルダ内のMP3ファイルのピッチを一括で取れることができるのでそれでピッチをチェックし、
AdobeのSoundboothというソフトウェア(すでに廃版で今はAdobe Auditionに統合されている)でタイムストレッチができるのでそれを使っていた。
ただタイムストレッチはパーセンテージで指定するため、MixMeister BPM Analyzerで調べた元楽曲のピッチを目標ピッチで割ることで変換割合を計算していた。
たとえば元楽曲が170bpmで、180bpmにしたかったら、170 ÷ 180 = 94.44%で、その分再生速度が速くなるので元楽曲が4分だったら変換後は3分47秒になる。
始めの頃は毎回数曲ずつ変換するくらいだったので、面倒だが一曲一曲手動で変換していた。
そして186bpmと190bpmのストックが溜まっていった。
が、今回ターゲットピッチを変え、194bpmとかピッチを上げてトレーニングしてみたいとなったところで行き詰まる。
これまでコツコツ作成してきた結果、30曲くらいたまっているが、それらを一つ一つまた手動で変換するのはさすがに厳しい。
それに今後196bpm版とか200bpm版とか作る手間を考えるととてもじゃないがマニュアルでやる気になれない・・・。
ということで自動化に踏み切ることにした。
自動ピッチ変換
ピッチ(正確にはピッチ(音程、キー)は変更せずにタイムストレッチするので語弊があるが)を変換するのはJavaでもできるんだろうが、とりあえず最近お世話になっているPythonで試してみる。
調べてみるとLibrosaという音楽用ライブラリでテンポの取得と変更ができるようだったのでまずはPIPでインストール。
プログラムの手順としてはこんな感じ。
- フォルダと変換後のBPMを指定
- 当該フォルダ内のMP3ファイル一覧を取得してひとつずつ処理
- MP3ファイルの元楽曲BPMを取得
- ターゲットBPMとの差分(変換パラメータ)を計算
- ターゲットBPMに変換処理
- MP3で書き出し
まずはフォルダ内に変換したいMP3ファイル(今回はRockyから数曲)を入れる。
プログラムを走らせると自動でターゲットBPMのフォルダを作成。
そのフォルダ内に変換後ファイルを書き出し。わかりやすいようにファイル名の接頭辞に「194bpm_」をつける。
上記Length(楽曲の長さ)を見ていただくとわかる通り、ちゃんと短く(=再生速度が速く)なっている。
ちなみにやり方はいくつかあるらしく、Librosaでは(設定で直るのかも知れないが)音が籠もった感じで変換されてしまい、別途waveのライブラリを使ってタイムストレッチを試してみる。
これだと音質は保てるのだが、タイムストレッチで再生速度を上げるとピッチの音程も高くなってしまう。
まあランニング中に聴く曲なんて元々テンポの速い曲が多く、タイムストレッチして聴いてもそこまで違和感はない(たとえば男性の声が女性に聞こえるほどではない)ので十分実用に耐えうる状態ではある。
逆に原曲が遅いテンポでゆっくりした曲だった場合、194bpmとかにするとかなり速くなって別の曲のようになってしまうだろう・・・。
実走
テストはうまくいったので30曲くらい一気に194bpmに変換して保存。
やはり自動化ができると楽。
聴きたい曲を選んでプログラムを流せば勝手に作成。
作成後はスマホに入れて外へ。
実際にトラックに行って194bpmに変換した音楽に合わせて走ってみる。
そもそも自分の貧脚ではピッチを合わせるのにも一苦労という問題があるが、変換後の194bpm前後のピッチで走れているので当初の目標は達成できた。
とりあえずやりたいことはできたのでひとまずOK。
今後もお世話になるプログラムなので逐次改善していきたいと思う。
0 件のコメント :
コメントを投稿