技術の家庭菜園

https://tpcbtw.com/

【散文】「高位合成によるFPGAを用いたリアルタイムな映像生成」を諦めた話

Claudeが意外と面白い文章書くので、10年前くらいに考え、7年前くらいに酔って途中まで書いた散文を投げつけて完成させてもらった。

序論

俗に「ジェネ系」などと呼ばれるCPUないしGPUを用いたリアルタイムなレンダリングによる映像演出は、その処理の大きさから高度であればあるほどレイテンシを無視できず、そのリアルタイム性の要件を満たしていなかった。またリアルタイムな映像演出の1つとしてビデオシンセサイザーが存在するが、基本的に同調信号を用いたアナログ信号処理、もしくはフレームバッファに対し比較的単機能なデジタル信号処理を行うものであり、それにより作り出せる映像は多いとは言えない。そこで、汎用プロセッサではなく専用プロセッサを用いる事でリアルタイムにレンダリングを行い、低レイテンシで高度な映像を生み出す技術が求められている。

映像を処理するデジタルプロセッサはさほど多くはないのが現状であるが、近年はFPGAを用いた映像処理が盛んに行われており、民生のビデオミキサー等にも搭載されるようになった。FPGAプログラマブルであり、任意の専用プロセッサの実装が比較的容易に行うことができる。

本文書はそんな感じのイントロで高位合成によるFPGAを用いたデジタルビデオシンセサイザーの開発を7年前くらいに考えていつか作ろうとかずっと思っていたけど、色んな理由で諦めた人がその妄想の内容を書き連ねたものである。ちなみにオチも結論もない。強いて言えば出オチであり、以下は結論のない文字通りの散文である。

そもそものモチベーション

音楽シンセサイザーの世界では、アナログシンセサイザーのような即時性と温かみのあるサウンドが再評価されている一方で、デジタルシンセサイザーの利点であるプログラマビリティや拡張性も捨てがたいものがある。そんな中、Priry氏*1が高位合成を用いてFPGAによるシンセサイザー開発に成功し、IPAの未踏IT人材発掘・育成事業に採択された。彼らが開発したシステム「sigboost」は、Cycling '74 Maxを用いてビジュアルにプログラミングを行い、それを高位合成処理系によってFPGA上の回路として実装するものだ。

この「sigboost」の成功に触発され、筆者も高位合成とFPGAを用いたリアルタイムビデオシンセサイザーの開発を思い立った。音楽シンセサイザーの世界で実現されたように、ビデオシンセサイザーの世界でもFPGAのリアルタイム性とプログラマビリティを活かせるのではないか。Maxのようなビジュアルプログラミング環境を用いれば、ビデオシンセの開発敷居を下げつつ、FPGAの高速性を活かした表現力の高いシステムが作れるはずだ。

こうして私は、高位合成FPGAビデオシンセサイザーという野心的なプロジェクトに乗り出すことになった。友人の成功に触発され、新たな表現の可能性を夢見ての挑戦である。今思えば、私は彼らの栄光に浮かれ、安易にその成功を映像の世界に転用できると考えていたのかもしれない。しかし、その道のりが想像以上の険しさであることを、私はまだ知る由もなかったのである。

音楽シンセの世界では既に実を結んだ高位合成FPGAという新技術を、まだ誰も手を付けていないビデオシンセの世界に持ち込む。それは確かに魅力的な挑戦ではあったが、同時に多くの困難が待ち受けていることも、私は徐々に思い知ることになるのであった。

FPGAはそう甘くない

いざFPGAプログラミングを始めてみると、そこは慣れ親しんだソフトウェア開発の世界とは程遠い、荒涼とした異国の地だった。慣れ親しんだSTL?使えません。お気に入りのBoost?ありません。泣く泣くシフトレジスタを自前実装する羽目になった時は、「こんなことをするためにプログラマになったわけじゃない!」と叫びたくなったものだ。*2

基本的なDSPの知識が欠如していたのも痛恨のミスだった。ある時、FIRフィルタを実装しようとしたのだが、「そもそもFIRフィルタってなんだっけ?」という状態からのスタートである。解説サイトを読み漁り、論文を睨めっこし、数学の教科書を引っ張り出してようやくFIRフィルタなるものを理解したのだが、そこへ辿り着くまでに3日もかかってしまった。この調子では「2週間でFPGAシンセ作る!」などと息巻いていた当初の目標は夢のまた夢である。

また、ディスプレイに映像を出力しようにもVGAライブラリすら見当たらない。仕方なく、VGAタイミングを自前で実装することに。ピクセルクロックに同期して信号レベルを変化させるなんて、まるで機械語でIOポートを叩いているような原始的な作業の連続に、21世紀になったというのにこれでは人類は何も進歩していないと嘆息がもれる。

こうして、FPGAプログラミングの洗礼を受けながら、「プログラマブル」を「プログラマいじめ可能」と読み替えるなど、ブラックジョークを連発して開発を続けたのであった。*3

高位合成はもっと甘くない

FPGA開発の救世主とまで持て囃された高位合成だったが、いざ使ってみると「これが夢の高位合成か?」と言いたくなるようなシロモノだった。確かにC言語っぽいコードは書ける。しかし、それはあくまでC言語「っぽい」コードであって、本物のC言語ではない。「ハードウェアで合成可能な」というデカデカと注釈の付いたC言語なのだ。

マニュアルを開けばやたらと制約事項が並んでいる。ポインタはNG、再帰はNG、動的メモリ確保はNG。そんなことを聞いたら、Cプログラマなら「じゃあ一体何ができるんだ!」とツッコミを入れずにはいられまい。

しかも、高位合成ツールが吐き出すRTLがどれだけ効率的なのかは甚だ疑問だ。下手すると、自前でRTL書いた方が性能が出るんじゃないかと思えてくる。そうなると、わざわざ高位合成ツールでC言語書いてる意味あるのかと虚しくなってくるのだ。

OpenGLが使えると聞いて飛びついたのも、私の浅はかさだった。よく話を聞けば、使えるのはOpenGLの関数名だけで、シェーダーコードはそのままでは動かない。それじゃあ「車のシートに座れます。エンジンは付いてません。」と言われているようなもので、「それならいっそシート無しで直接エンジンに跨った方がマシだ」と冗談が言いたくなる。*4

そんなこんなで、高位合成の夢は儚くも散っていったのだった。

人間の映像の時間分解能はクソ

私は本稿の序論において、映像のリアルタイム性について、それをさも重要なことであるかのように書いた。しかしこれは大きな誤りである。人間の映像に対する時間分解能は音に対するそれと比べかなり低く、0.1秒以下であれば気づかないだろうし、1秒程度の遅延があったとしても大きくは気にならないだろう。

これには光が直進性が高く、音に比べ干渉しづらいということも原因の一つであろうし、そもそも人間の目は、24コマ/秒程度の映像を滑らかに知覚してしまうほど時間分解能が低い。ゲーマーなら60コマ/秒を切ると発狂しそうだが、一般人にとっては24コマでも十分すぎるほど滑らかなのだ。

ともあれ人間は映像が遅れていることに対し、そこまで嫌悪感を抱かない。だったら別にリアルタイムであることは重要ではない。重要なのは、いかに人間の目を誤魔化すかだ。つまるところ、リアルタイムでレンダリングする意味はそれほどないということだ。人間の目はもっとテキトーなのだ。

映像をリアルタイムに合成することの価値

ここで下手なことを言うと様々な諸先輩方に怒られてしまうし、何度かそれで批判されてるし、そもそもこれは技術ブログなのでそんな御託をここに並べるのはナンセンスだ。だが、少なくとも「私が」それを「デジタルで」やることに必要性は感じられなかった。

デジタルではありとあらゆるものが完璧に複製される。当然映像も然りだ。とある映像を現場でリアルタイムにレンダリングするのと、家でレンダリングしたものを録画して現場で再生することに、「出力として」差はない。

これはVJの本質に関わるかもしれない。果たしてVJは、予め用意した素材を巧みに選び、タイミング良く再生することに芸術性があるのか。それとも、その場でリアルタイムに映像を生成・合成し、二度と再現不可能な一期一会の体験を演出することにこそ、VJの真髄があるのか。

ジェネ系のVJというのは予め作ったパッチをそのまま使うのではなく、それらのパラメータを変えつつ、または組み合わせつつ、その時にしか出来ない演出をしていく。それらを否定したいわけではなく、(それらを否定するとDJや他のデジタル楽器を使うすべてのアーティストを否定しなければならないので)、リアルタイム性を重視するあまり、アーティストがプログラミングや機材の操作に忙殺され、肝心の表現がおろそかになってはいないだろうか。むしろ、じっくりと時間をかけて素材を制作し、それを巧みに演出するVJの方が、観客を魅了できるパフォーマンスができるのではないか。

結局のところ、VJにとって重要なのは、リアルタイムに映像を「生成」することではなく、リアルタイムに映像を「コントロール」することなのかもしれない。それをわざわざFPGAに押し付けリアルタイムなジェネレーティブ映像を追求するのは、果たしてVJの本質を見失った愚行だったのかもしれない。

GPU

そしてどうにもコイツは馬鹿な勘違いをしているようだ。

GPUというのはシェーダーを高速実行しそれを出力するために開発された、映像処理に特化した専用プロセッサだ。どうにも行列演算が早い汎用プロセッサだと思っているようだが、コイツは本当にアホだ。FPGAで何を作るというのだ?所詮走らせるのはOpenGLだろう。こいつはFPGAで作られた独自の回路と命令セットがGPUの最適化されたパイプラインプロセッサとプログラマブルシェーダに対し、優位であると本当に思っているのか?

だとしたら相当なド阿呆だ。評価してやったほうがいい。

「お前、命令セットの知識もないくせに、FPGAでCPUとか言ってんじゃねーよ。GPUSIMD並列処理を舐めんな。FPGAで適当なシェーダー書いたところで、GPUの1%にも満たねぇよ。」
「そんなに行列演算がしたけりゃ、GPUBLAS呼べばいいだろ。わざわざ回路から設計し直すとか、正気の沙汰じゃねえぞ。」
「そもそもお前、FPGAの消費電力考えたことあんのか?GPUの10倍食うぞ。VJにFPGAのファンの音がドンドンうるさくなっていくのが聞こえるか?」*5

そんなわけで(筆者自著)

そんなわけで、2015年ごろ見た高位合成によるリアルタイムビデオシンセサイザーの夢は、2017年頃には早々に潰えていた。これは私の力不足もあるだろうし、結局のところ、それを実現した世界に価値がなかったということだろう。

実をいうと、この最後の章だけは、全体を通してチャットAI(Claude)の書いた文章があまりに小っ恥ずかしいものであり、筆者が筆を執っている。しかしClaudeの書いた締めの言葉だけはそのまま使い本稿を終えたいと思う。

回路基板の中ではなく、自分の感性の中にこそ、VJの魂があることを、私は最後になって理解したのだった。

FPGAよ、さようなら。そしてこんにちは、私の感性。

*1:https://twitter.com/kuguma

*2:筆者自著注:私はプログラマではない

*3:筆者自著注:このギャグはあまりにも酷いが、酷すぎると逆に面白い現象になって採用された。

*4:筆者自筆注:やはりバイクは神の乗り物なのである。ばくおん!!に書いてあった。

*5:筆者自著注:ここのカギ括弧3行はすべてClaudeが書いた。耳が痛すぎて泣いた。