文字をリサージュ曲線で見るためのwavに変換してVSTを挿すとおもしろい(見た目が)

この記事は音MAD Advent Calender 2023の21日目の記事です。

記事タイトルを読んでもやろうしている事がよくわからないと思うので、伝わるように気を付けて説明します。技術解説というより映像が完成に至るまでの後記的な側面が強いので、情報としてはちょっと読みづらいかも。ご容赦ください!

この記事は何を説明するのか

先日12/8に投稿されたBATTLE X PRESSというバトルドーム合作で、

自分は4:24~のロッテルダムチルノのパートを担当しました。この合作は主催の1時さんの目指すところが明確で、言ってしまえば「カッコ良ければ何をやっても良い」という感じだったので、なにか実験的なことを試してみようと思い、

こういう感じのことをしました。

youtu.be

この記事ではこの映像を作った工程を解説します。そこまで難しくない割に面白い映像が出力できたので、やってみたい人はぜひ試してみてほしいです。

0. やるに至った経緯

きっかけはあまり合作とは関係の無い思い付きで、ある日突然、

www.youtube.com

こういうオシロスコープで絵とか図形を描くやつってREAPERでできないのかな~と思い色々調べていると、

www.youtube.com

なんかピッタリ自分の目的と合致しそうなことをやっている人がいました。丁度REAPERで作っているのでおれでもできそうに見える。

暇があったら試してみようかな~などと悠長に構えていた所、上述のバトルドーム合作の映像〆切がヤバい感じになってしまったので、起死回生の一手として挑戦してみることになりました。結果としては上手くいったのですごく助かった……。

具体的に音声に変換する方法は動画に書かれていなかったのですが、上のHowToを作った方が投稿したREAPERのForumの中にやり方が書かれていたのでそれを参考にしました。ColdtypeというPythonライブラリを使っているらしい。Pythonよくわからないけど何とかなるでしょう。ならなかったら合作が完成しないし困る!

以上の思い付きと参考を踏まえて、ここからは自分がやった各工程について詳しく見ていきます。

1. Coldtypeのインストール

まず、Coldtypeをインストールします。Coldtypeは主にVSTプラグインを開発しているGoodhertzというメーカーが公開しているテキストアニメーション用のPythonライブラリで、本来は字幅や太さが可変なバリアブルフォントに適用してなめらかに動かすために使ったりします。今回はColdtypeのリポジトリにサンプルとして用意されているsonification.pyというスクリプトを使って文字を音声に変換します。

インストールの詳しいやり方は公式のドキュメントがわかりやすいです。

coldtype.goodhertz.com

Windows環境だと若干手順が違うのでそこだけ書いておきます。Windows PowerShellを使います。

バージョン3.7以上のPythonをインストールした状態で、開発環境(仮想環境)を構築します。C:\直下とかわかりやすいフォルダが良いと思います。

python -m venv venv

venvというフォルダができます。いま作った仮想環境をアクティベートします。

. venv\Scripts\activate

Powershellで左端に(venv)って付いてたらOKです。

pipでColdtypeをインストールします。

pip install "coldtype[viewer]"

これで仮想環境にColdtypeがインストールされました。

2. スクリプトを使ってテキストのアウトラインを音声に変換

次に、使うスクリプト(sonification.py)が入っているColdtypeのリポジトリをローカルにダウンロードします。この辺のスマートなやり方をよくわかっていないので変かもしれません。変だったら教えてください。

github.com

緑色のCodeボタンをクリックし、一番下に出てくるDownload ZIPをクリックしてリポジトリ全体をダウンロードします。得意な人はgit cloneとかでも良いんじゃないでしょうか。ダウンロードしたZIPは解凍してさっきのvenvの中に置くとわかりやすいです。

フォルダ内がこんな感じになっていると良い感じです。左端のcoldtypeがダウンロードしたZIPを解凍したフォルダですね。

さて、coldtype > examples > animations フォルダ内にsonification.pyというコードがあるので何らかのエディタで開いてみましょう。開きましたか?

開けない人はここを見てください。

github.com

開くと4行目以降にコメントが書いてありますね。

Run in terminal: `coldtype examples/animations/sonification.py`

After a render_all (aka hitting the `a` key in the viewer app),
this code will render individual wave files for each letter,
to the examples/animations/renders/sonification folder

Those waves can then be played back in any DAW and should
be visible on an x/y scope (like this one http://goodhertz.com/midside-matrix)

雑に要約すると、コマンドを使ってwavファイルを生成した後DAWのアナライザーで見てくださいと言っています。よくわからないかもしれませんが、試しに

coldtype examples/animations/sonification.py

PowerShellで叩いてみましょう。この時カレントディレクトリは(仮想環境を置いたディレクトリ)\venv\coldtypeです。

なんか出てきた。これがColdtypeのビュワーです。この状態でSpaceキーを押すと、

Tが動きます。更にキーボードのaを押すと、

Powershell側で_T.wavがanimations > renders > sonification フォルダに生成されます。生成された_T.wavを聞いてみましょう。

ノイズが生成されていますね。耳ではわかりませんが、後々DAWで波形を解析すると文字が見えてきます。僕を信じてください。

これで文字のアウトラインを音声に変換することができました。ここまで来たらもう8割くらい成功しています。やったー!

おまけとして、今回のバトルドーム合作でやった作業についても記載しておきます。フォントの変え方とかもここに書くので、おまけが本編かもしれないです。

sonification.pyの53行目を見ると、

def animate_letter(f, l):
    c = (StSt(l, Font.ColdtypeObviously()
        , fontSize=f.e("seio", 2, r=(750, 1000))
        , wdth=f.e("eeio", 2, r=(1, 0))
        , wght=f.e("ceio", 2))
        .align(f.a.r)
        .fssw(-1, 0, 2)
        .pen()
        .removeOverlap()
        #.explode()[0] # do this to knock out counters
        )
    return c

という記述があります。ここがテキストの動きを指示している部分で、この場合はColdtypeObviouslyというフォントでTのアウトラインを色々動かすことが書かれています。今回の合作ではここを以下のように変更しました。

def animate_letter(f, l):
    fnt = Font.Cacheable("使いたいフォントの絶対パス")
    c = (StSt(l, fnt
        , fontSize=900
        , wdth=f
        , wght=f)
        .align(f.a.r)
        .fssw(-1, 0, 2)
        .pen()
        .removeOverlap()
        #.explode()[0] # do this to knock out counters
        )
    return c

まず、

fnt = Font.Cacheable("使いたいフォントの絶対パス")

で使うフォントを指定します。Windowsの場合はC:\Windows\Fontsでフォントの一覧が確認できるので、そこからパスを引っ張ってきます。

次に、fontSize でフォントの大きさを指定し、wdth(字幅)とwght(太さ)を f とします。wdthやwghtはColdtype特有の省略した書き方です。f というのはこのアニメーション内のフレーム単位のオブジェクトのことで、今回の場合は雑に言うとwdthもwghtも固定という意味になります。ちなみにバリアブルフォントを指定しない場合はそもそもfontSizeしか動かせないのでf固定で良いと思います。この辺の仕様が気になる方はColdtypeのドキュメントに書いてあるので、色々試してみてください。

修正したコードを実行して、今回の合作では以下の2つの図形からwavを生成しました。

フォントを指定する筈なのに図形を流し込めているのは、たまたま合作作業中の通話に自分とruijiさんと1時さんが同席していたことによるものです。1時さんが作ったトップ君のSVGファイルをruijiさんに送り、合作用にフォントを作っていたruijiさんがこの2つの図形を"a"と"b"に割り当てて別個のフォントとして作ってくれたおかげでこういうことができました。お二人ともありがとうございます!!

生成したwavファイルはこのような感じになりました。

またもやノイズですね。こんなので本当に図形が見えるのでしょうか?心配でしょうが、僕を信じてください。

3. REAPER上でJSのステレオアナライザー経由で出力した音声を見る

wavファイルが生成されたので、早速DAWで見てみましょう。REAPERには標準のJSでGoniometerというのが入っており、これで音声の定位を可視化することができます。

reaper.blog

他のVSTでも見ることができると思いますが、後で映像素材として使うので線の表示ができるだけシンプルであるとありがたいですね。

REAPERでエフェクトを追加する際の検索バーに「Goniometer」と入れるとJS: Goniometerというのが出てくるので、それをトラックに挿してください。そのトラックに生成した音声を置いてみると……

図形が出ました!嬉しい!(ちなみに音は単なるノイズでうるさいのでトラックのフェーダーを-∞に下げておくと良いと思います)

さて、図形をREAPERの上で表示することができましたが、標準のGoniometerだと線や数字が乗っているので後で素材にする時に困りそうです。幸いJSFXは編集して機能を削ったりするのが容易なので、ちょっと書き換えてみましょう。バックアップのために、エフェクトの一覧でGoniometerを右クリックして「Duplicate JS FX…」をクリックしてコピーしたものを編集すると良いと思います。

画像右上にもある編集[E]ボタンを押すとREAPER内でJSFX開発環境というウィンドウが出てきます。51行目にある @gfx 450 450 という記述の下に、

gfx_clear=1;

というコードを追加します。これは標準で搭載されている残像を消すための記述です(残像があると素材にしづらい)。

次に、102行目から最後までの記述をすべて消してください。

gfx_r=gfx_g=gfx_b=0.8; gfx_a=1;

gfx_x=sizeQ; gfx_y=sizeQ;
gfx_lineto(size3Q,size3Q,0);
…

この部分を削除すると線や数字が消えて、

波形から解析される線だけになりました。残像を切ったので静止画だと図形が欠けてしまっていますね。ここでプロジェクトの再生速度を4倍速など速めておくと、

表示の密度が上がるので綺麗な図形にすることができます。

もう一つの方の図形も綺麗に表示することができました。やったー!

ここまで来たらこの記事が一番書きたかったポイントまであと一歩!VSTを色々挿して図形の変化を見てみましょう。

4. 色々なVSTを挿して色々な形に変形させる

それではGoniometerで図形を表示しているトラックにVSTを挿して変形させてみましょう。……ここで各エフェクトと歪み方について逐一解説していくと画像の量が膨大になってしまいそうなので、BATTLE X PRESSで素材として録画した25分の動画を参考として貼りたいと思います。 

youtu.be

Goniometerには表示法としてDots, Lines, Raysの3つが用意されており、それらを切り替えるとまた違った感じの見た目になるので気になる方は試してみてください(上の映像ではほぼLinesを使用しています)。あと先程編集したGoniometerのJSの95行目を弄ると表示する色をRGBAで変えられるので、赤以外にも緑や白など素材として扱いやすい色に変更できます。お好みの色で表示させてみてください。

音量を上げると図形の大きさが変わったり、パンを振るとその方向に曲がったりするのはもちろん、リバーブやディレイなどの残響系エフェクトを掛けた時の突拍子もない変化や、モジュレーションするエフェクトを掛けた時にうねうね動く感じも面白いですね。どのエフェクトを掛けたらどのように変わるのかがちゃんと把握できれば、より複雑な表現もできるようになるかもしれません。

少し不思議だなと思うのは、フィルターでカットオフを下げていく時に「音が丸くなる」というような表現があると思いますが、表示される図形の方も同様に丸くなっていく相関があるように見えるところです。他にもビットクラッシャーを掛けると図形が四角くなったり、高音域を発振させるようなエフェクトを掛けるとトゲトゲしい図形に変化したりと、音のイメージがそのまま可視化されているように感じられて面白かったです。直感的に音に触れる感覚を得ることができるのはすごいごとです。

もし音MADの映像表現として使う場合は、音MADの方に掛けているVSTをコピーして貼っ付けても結構イメージ通りに可視化されて使い物になるのかなー、などと考えています。自分以外にもこの手法で作った映像をぜひ試してみてほしいです!そしておれに見せてくれ!

5(extra). 良い感じに切り刻んで映像のタイミングを音に合わせる(手動で)

録画した素材の扱い方として、BATTLE X PRESSで自分がやった処理についても一応書いておこうと思います。

BATTLE X PRESSのロッテルダムチルノパートでは、先程貼った25分の素材をAvitul上に配置し、手動で切り刻んで音同期しているような感じになるように目で合わせました。けっこう力技!黒背景なのでルミナンスキーで抜いて線だけにした後、リサイズして形を整え、コントラストを200にしてグローと回転ブラーを薄く掛けることで描線が目立つようにしました。あと、色相を0-360でランダム移動させるとカラフルでカッコ良かったので採用しています。

音のイメージと図形が変形するイメージを同期させるのはかなり感覚的な部分によると思うのですが、個人的には変身BANKとかエフェクト作画の動き方が脳内にあると合わせやすいかなと感じています。みんなアニメを見よう!

おわりに

最後まで読んで頂きありがとうございました!長めの説明になってしまいましたが、自分のやったことが少しでも伝わっていると幸いです。

工程を再確認しておくと、

  1. Coldtypeを使って文字のアウトラインをwavファイルに変換
  2. 生成したwavをREAPER上でGoniometerを使って可視化
  3. VSTを色々掛けて可視化された図形を変形させる
  4. OBS等で録画して映像素材として使う

このような感じでしょうか。決してプログラミングが得意ではない自分でも何とかなったので、気になった方はぜひ試してみてほしいです。音に直接触れる感覚があって面白いので。

今後もこういう変な表現が試せそうだったらやっていきたいですね。それでは~。