市來健吾の日記

プログラマ、(元)物理屋(ナノテク、流体)

デモ・ビデオ


  • 昨日 WaoN 0.10 をリリースしたが、 密かに、この成果はすごいと思っている。

    • というか、これでやっと、比較的、使い物になるレベルになったかな、と。

      • これまでは、やはり、必要な音を取り逃がさないようにとしてたので、 それに伴う余分なゴミも沢山ピックアップしていた。

    • 当社比(0.9 と 0.10)、つまり改良前、改良後のノート数を見ると、

    • 結果を聞いてみた感じでは、大事な音が消えているようなことはなさそうだ。

    • ってことで、大満足!

  • よい結果は、みんなに公開すべきだ! (定理:何でもいいから成果を出していこう) ということで、 midi file を Google Documents に公開してみる。

  • この成果を分かりやすくプレゼンする意味で、ビデオを作ろうとしている。

  • 前回(12/25/2011)のように GarageBand で演奏させたものをキャプチャすることはせず、 手動でだけどもっと精密に動画を作ってみる事にする。

    • 断念した理由は、職場の mac mini が不調で、すごく遅いこと。

    • 挑戦した理由は、実際の演奏と同期させたかったから。

  • やったことのまとめ:

    • 準備編 - 素材を準備する。

      • audio: GarageBandmidi file を読み込んで、 export する。

      • 楽譜: GarageBandmidi 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.pngGIMP で作っておく。

        • それから、 indicator も切り出して、作っておく(sign.png)。 背景は透明にしておく。

      • 背景:楽譜用に撮った GarageBand の画像をベースに、 左の鍵盤を残して、上にタイトル領域を作る。

        • 最初 1080p で作りたいなと思って、 16:9 なら横は 1920 なので、 1920x1080 を作ろうとするが、素材のサイズからちょうど半分の 960x540 だとそのまま使えそうだったので、これでいくことにする。

        • タイトルは GIMP で Brush Script MT Italic を使う。

        • 最初、そこで使「WaoN」も Brush Script で書いてたが、 ふと、ロゴを使おうと思って、今の形にしてみた。

      • 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.0

        nbar = int( bar )
        offset = pixel - nbar * 64

        str_score = ""
        for i in range(nbar, nbar + 16):
        x0 = (i - nbar) * 64 - offset
        if x0 < 0 : x0 = 0

        if 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_output

        args = 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年の目標、音楽の勉強 - 曲目リスト