0
0

音が降ってくる動画から楽譜作成

Posted at

モチベーション

youtubeにあるsynthesiaで生成されたピアノ動画と同じものを弾きたい、となったときに楽譜が公開されていない(購入もできない)、ということは多々ある。自分は楽譜が無いと弾けないので、どうにか動画から楽譜を作成できないかと思い試したところ、案外うまくいったので記録を残しておこうと思う。

ちなみにgithubはこちら。サイトとして公開してみたくて、htmlなど勉強してサイトを作ってみたは良いものの、結局サーバー費用などの関係で公開は泣く泣く断念...。

最終目標はmidiファイル生成

まず、楽譜を生成するには音の情報ファイルを用意してmusescoreなどのソフトに読み込ませればよい。音の情報ファイルとしては、midiファイルとmusicxmlファイルを検討してみたが、結局midiファイルを選んだ。

musicxmlは音符の情報を細かく設定できるが、その分四分音符か八分音符かなど自分で特定する必要がある。一方、midiでは音のピッチと開始時間、終了時間を指定すればよいので、よりシンプルでやりやすい。
ただ、これだとグリッサンドなどがうまく表現できないので、より高いクオリティを目指すならmusicxmlを使うべきなのだろう。

とりあえず今回は、降ってくる各音のピッチとその開始時刻、長さを取得することを目標とした。

簡単な流れ

まず、キーボードの色の変化から判定する方法を考えたが、音が同じピッチで連続しているとき、フレームごとに見てもキーボードの色が変化していなかった。つまり、連続した音は一つの長い音として捉えられてしまう。

そこで、キーボードではなく降ってくる音の方に着目することにした。つまり、小節ごとに画像をキャプチャし、各四角を捉え、その横方向の位置からピッチを、縦方向の位置から時間を取得する。長さを時間に変換する際は、一小節が流れ終わるのにかかる時間を利用した。ついでに色も取得し、楽器または右手左手を区別するようにする。(midiファイルでは楽器の種類を指定できる。)

四角を捉える部分はCanny edge detectionを利用。鍵盤の位置は、動画によって異なるので、鍵盤の数と黒鍵白鍵の位置から特定するようにした。オクターブを特定する方法は音源を使用したり、あれば鍵盤上のC3などの文字を利用できるだろうが、そこまでは実装していない。

小節ごとのキャプチャの部分や、四角を上手く捉えて音情報に変換するところは、かなり試行錯誤をしたが、細かい部分は割愛。

①小節ごとにキャプチャ
test_6.533333333333333.jpeg

②Canny edge detectionで各音を抽出し、一つずつ処理
image.png

最後に

今回、小節ごとに音を処理することで、処理を単純にしていたが、小節を示す線がそもそもない動画、あっても画質が悪く抽出できない動画がかなりあった。
そのような動画に対応する方法も今後検討したい。余裕があれば機械学習とかも使ってみたい。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0