デモ・ビデオ
昨日 WaoN 0.10 をリリースしたが、 密かに、この成果はすごいと思っている。
というか、これでやっと、比較的、使い物になるレベルになったかな、と。
これまでは、やはり、必要な音を取り逃がさないようにとしてたので、 それに伴う余分なゴミも沢山ピックアップしていた。
当社比(0.9 と 0.10)、つまり改良前、改良後のノート数を見ると、
Kurt Rosenwinkel Improvisation:
waon-0.9
WAON_notes : n = 28066
Brad Mehldau Better Days Ahead Intro:
waon-0.9
WAON_notes : n = 60894
結果を聞いてみた感じでは、大事な音が消えているようなことはなさそうだ。
ってことで、大満足!
よい結果は、みんなに公開すべきだ! (定理:何でもいいから成果を出していこう) ということで、 midi file を Google Documents に公開してみる。
この成果を分かりやすくプレゼンする意味で、ビデオを作ろうとしている。
前回(12/25/2011)のように GarageBand で演奏させたものをキャプチャすることはせず、 手動でだけどもっと精密に動画を作ってみる事にする。
断念した理由は、職場の mac mini が不調で、すごく遅いこと。
挑戦した理由は、実際の演奏と同期させたかったから。
やったことのまとめ:
準備編 - 素材を準備する。
audio: GarageBand に midi file を読み込んで、 export する。
Kurt Rosenwinkel's improvisation は Clean Guitar で
Brad Mehldau's Better Days Ahead Intro は Grand Piano で
楽譜: GarageBand に midi file を読み込んで、その画面をキャプチャする。
後で合成するために、各画像で楽譜部分だけきれいに切り出しておく。
各小節を切り出すのは、以下の処理で ImageMagick を使った。
convert bar-001-014.png -crop 64x482+0+0 bars/bar-001.png
convert bar-001-014.png -crop 64x482+64+0 bars/bar-002.png
convert bar-001-014.png -crop 64x482+128+0 bars/bar-003.png
convert bar-001-014.png -crop 64x482+192+0 bars/bar-004.png
convert bar-001-014.png -crop 64x482+256+0 bars/bar-005.png
convert bar-001-014.png -crop 64x482+320+0 bars/bar-006.png
convert bar-001-014.png -crop 64x482+384+0 bars/bar-007.png
convert bar-001-014.png -crop 64x482+448+0 bars/bar-008.png
convert bar-001-014.png -crop 64x482+512+0 bars/bar-009.png
convert bar-001-014.png -crop 64x482+576+0 bars/bar-010.png
convert bar-001-014.png -crop 64x482+640+0 bars/bar-011.png
convert bar-001-014.png -crop 64x482+704+0 bars/bar-012.png
convert bar-001-014.png -crop 64x482+768+0 bars/bar-013.png
convert bar-001-014.png -crop 64x482+832+0 bars/bar-014.png
...
このように、キャプチャ画像には 14 小節含まれていて、 横幅はそれぞれ 64 ピクセル。
この結果、 64x482 な小節画像の短冊がたくさんできる。 Kurt Rosenwinkel の場合、 123 小節。
この他に、ノートが乗ってない blank な小節画像 bar-blank.png も GIMP で作っておく。
それから、 indicator も切り出して、作っておく(sign.png)。 背景は透明にしておく。
背景:楽譜用に撮った GarageBand の画像をベースに、 左の鍵盤を残して、上にタイトル領域を作る。
superimpose する動画: youtube から持ってきて、 ffmpeg で frame 画像にダンプしておく。
rm -rf decoded
mkdir decoded
ffmpeg -i KurtRosenwinkel-rzR1tAo-gRU.flv\
-r 30000/1001 -f image2 decoded/frame-%04d.png
素材の時間軸のチェック
original movie は 264 秒で 7925 frames ある。
最初の 7 秒は動画のタイトルなどで無音。
midi file は最初の音が出たときからスタート。 (original の 211 frame からはじめる。)
original movie の 7575 frame あたりが演奏終了。
midi の 123 小節に対応する frame カウントは 7365.
各小節のピクセル幅は 16 なので、 スクロールのスピードは、 123 * 4 * 16 / 7365 [pixel / frame]
GarageBand で出力した sound file の頭とお尻に、 対応する無音部分を追加しておく。
audacity でやったけど、無音部分に white noise が乗るのは、このせいか?
フレーム画像の生成
以下のような python script を書いた。
import subprocess# pixel is that 16 pixel = 1 beat, 4 beat = 1 bar.
def compose_score (pixel):
px = int (pixel % 16.0)
beat = pixel / 16.0
bt = int (beat % 4.0)
bar = beat / 4.0nbar = int( bar )
offset = pixel - nbar * 64str_score = ""
for i in range(nbar, nbar + 16):
x0 = (i - nbar) * 64 - offset
if x0 < 0 : x0 = 0if x0 + 19 < 960 and i+1 <= 123:
str_score += " bars/bar-%03d.png -geometry 64x482+%d+57 -composite"%(i+1, x0 + 19)
else:
str_score += " bar-blank.png -geometry 64x482+%d+57 -composite"%(x0 + 19)
return str_score
nframes = 7925
for i in range(nframes):
str_frame = " decoded/frame-%04d.png -geometry 384x288+570+12 -composite"%(i+1)
str_output = " output/frame-%04d.png"%(i+1)if i < 210:
# still
cmd_str = "convert background.png"\
+ str_frame\
+ str_output
else:
# calc pixel
dpdf = 123.0 * 4.0 * 16.0 / 7365.0
pixel = dpdf * (i - 211)if pixel < 3 * 64:
# score is in the initial position
str_score = compose_score (0)
# sign is moving
str_sign = " sign.png -geometry 15x480+%d+60 -composite"%(pixel + 19 - 7)
elif i < 7575:
# sign is stop at the third bar position
str_sign = " sign.png -geometry 15x480+%d+60 -composite"%(3 * 64 + 19 - 7)
# score is moving instead
str_score = compose_score (pixel - 3 * 64)
else:
# stop scrolling
pixel = dpdf * (7575 - 211)# sign is stop at the third bar position
str_sign = " sign.png -geometry 15x480+%d+60 -composite"%(3 * 64 + 19 - 7)
# score is moving instead
str_score = compose_score (pixel - 3 * 64)cmd_str = "convert background.png"\
+ str_score\
+ str_sign\
+ str_frame\
+ str_outputargs = cmd_str.split(" ")
subprocess.call(args)
この結果、 output directory に frame-%04d.png が生成される。
動画の生成
ffmpeg で h264 な mp4 を作る。
ffmpeg \
-r 30000/1001\
-f image2 -i output/frame-%04d.png \
-pass 1\
-an\
-vcodec libx264\
-b 8000k\
-r 30000/1001\
-coder 1 -flags +loop -cmp +chroma\
-partitions +parti8x8+parti4x4+partp8x8+partb8x8 -me_method umh\
-subq 8 -me_range 16 -g 250 -keyint_min 25 -sc_threshold 40\
-i_qfactor 0.71 -b_strategy 2 -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4\
-bf 3 -refs 5 -directpred 3 -trellis 1\
-flags2 +bpyramid+mixed_refs+wpred+dct8x8+fastpskip\
-wpredp 2 -rc_lookahead 50\
-f rawvideo\
-y /dev/null
ffmpeg \
-r 30000/1001\
-f image2 -i output/frame-%04d.png \
-i KurtRosenwinkel-Improvisation-adjusted.wav\
-pass 2\
-acodec libfaac -ar 44100 -ab 96k \
-vcodec libx264\
-b 8000k\
-r 30000/1001\
-coder 1 -flags +loop -cmp +chroma\
-partitions +parti8x8+parti4x4+partp8x8+partb8x8 -me_method umh\
-subq 8 -me_range 16 -g 250 -keyint_min 25 -sc_threshold 40\
-i_qfactor 0.71 -b_strategy 2 -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4\
-bf 3 -refs 5 -directpred 3 -trellis 1\
-flags2 +bpyramid+mixed_refs+wpred+dct8x8+fastpskip\
-wpredp 2 -rc_lookahead 50\
output.mp4
preset がないと文句を言われるので、手書きで。
audio は aac にする。 (なので ffmpeg は +nonfree でビルドしておく必要がある。 macports の場合。)
結果は output.mp4
不満なところ
一番左の小節のスクロール、手を抜いている。
ImageMagick でうまいことするのが、面倒だったので。
でも、出来上がったものを見ると、これはこれで味があるような気がしてきた。
encode を実装させたまま、就寝。WaoN 0.10 のデモ・動画を作ろうとして、気がつくと0時。
教訓:動画を手で作ろうとしないこと!
ちなみに今は 1080p にしちゃえ、と元画像を2倍にスケール中
(どんな HD なんだ、ってのは置いといて、と)
12:02 AM - 29 12月 11
1/1/2012: 2012年の目標、音楽の勉強 - 曲目リスト