ラヴェル「高雅で感傷的なワルツ」を Sound Canvas VA で全曲やってみました。昔 Nifty-serve の FMIDICLA で発表した MIDI データですが、今回全面的にテンポを見直しました。動画では、テンポを表示しながら演奏しています。
動画の編集も少しだけ頑張ってみました。映像ソースは Alchemusica の演奏を QuickTime Player の「新規画面収録」で録画。音声ソースは Alchemusica のオーディオ録音で保存したものを Audacity でレベル調整。QuickTime Player の録画の時も、SoundFlower を通して音声を録音してあります。
映像の方を iMovie で開き、タイトル画面と、「Valse 1: Modéré」などというテロップを入れる。
映像側はこれでよいとして、別録りした音声データと組み合わせてみた。iMovie 上で、オーディオの開始位置をなるべく合わせる。目分量ではあるけど、0.1 秒もずれてないはず。
元の動画のオーディオをミュートして、mp4 で書き出してみた。すると、最後の方で音ズレを起こしているのです。Valse 8 の冒頭を切り出してみました。ピアノロールと音声がずれているのがおわかりでしょうか。映像と音声が別々に進行しているので、時間のわずかな誤差が積み重なって、曲の最後の方では1秒近くずれてしまっている。
ここはちょっとトリッキーな処理が必要。まず、動画の先頭から「○分○秒」の位置を正確に知るため、今作った mp4 ファイルを VLC で開く。「再生→指定時間へジャンプ」を使って、動画の最初の方、たとえば 00:05 にジャンプする。
画面の左上に「その時点での MIDI データ上の位置」が表示されている。このデータを Alchemusica で開いて、「MIDIデータ上の位置」を「先頭からの時間(秒)」に直す。この場合だと、「MIDIデータ上の位置」が 1:3:0 なので、イベントリストウィンドウを開いて 1:3:0 の位置にダミーイベント (@text とか) を挿入して、表示を "time in seconds" に変えればよい。あ、ちょうど 1.000 秒だ。そりゃそうだな、最初の2小節は tempo=120 で初期化データを送っているから、2拍はちょうど1秒になる。
同じように、VLC で動画の最後の方、15:56 にジャンプする。MIDI データの位置は 598:3:403 となった。
Alchemusica 上でもう一度ダミーイベントを入れて、秒数に変換。951.100 秒で、妙にキリのいい数字だな、と思ったが、Alchemusica では画面書き換えを 100 ミリ秒ごとに行っているためだった。
映像のタイムスケールを変更して音声に合わせ、音声は開始位置を合わせる。ややこしいので、下の図をみてください。ffmpeg
を使って、タイムスケールは itsscale
、開始位置は itsoffset
オプションで指定する。-map 0:v -map 1:a
は、最初(0番目)の入力から映像 (v) を取り出し、次(1番目)の入力から音声 (a) を取り出すオプション。
うまくできました!
本当は、タイトルやテロップを入れたり、最後をフェードアウトするのとかも、ffmpeg
でやりたいところ。今後の課題だな。