まえがき
だいたいの方は初めまして、MachiaWorksです。
Sessions終了お疲れ様でした。
自分はMusicCompoに曲を提出して5位でしたが、今回面白かったのは「StreamingMusicが全体の半分くらいだった」ということかと。ほかはTracked(トラッカーを使った曲)とExecutableMusicになってました。
そういう意味ではわりとエッジのきいたコンペではあったかと考えます。
(ちょっくら数えてみたらStreaming6、Tracked4、Executable2というコンペでした)
TrackedMusicは他のところでも情報があるしそれは省略するとして、
今回は(多分自分くらいしか情報もってねえんだろうなと思う)ExecutableMusicについて情報を書いておこうと思います。
概要・ExecutableMusicとは
ExecutableMusicとは、実行ファイルしかなくて、その時に音声データを生成するというファイル、という形で伝わっています。
この実行ファイルしかないというのが曲者で、X68000のように音源を搭載している環境ならまだしも、Windowsではどうやって音声を鳴らすのかという部分から考えないといけません。
この部分でいかに緻密かつ容量少なくWAVを生成する、というのが実質的なトレンドになっているものと考えます。
言い方を変えると、メガデモで生成される曲のプログラムを単体で切り出したものをExecutableMusicと定義したと考えていいと思います。
よって、音楽を作ったことない人でもメガデモの制作経験があれば十二分に知識を流用できるものと考えます。
例えばこういうもの
自分が作ったやつ
https://youtu.be/NP8bjmesy2Q?list=PLOfPKPePZaWlrP5XE11RmFMxogxyrBdAM&t=14197
今回のSessions、PC demo Compoのうち、5作品はプログラムで音を生成してます。
(数え間違ってたらスイマセン)
https://youtu.be/NP8bjmesy2Q?list=PLOfPKPePZaWlrP5XE11RmFMxogxyrBdAM&t=36799
ExecutableMusicの基本的な構成
構成はWindows環境であれば主に以下のステップに分かれます
(音源を持ってるPCであれば少し変わった形になりますが基本的にはこのステップで分類できるかと)
1. ウィンドウの生成
2. 波形の作成
3. 波形の再生
1.および3.については、割と定型的な処理になってくるかと思います。
1.はAPIを使うなり自前で描画するなりすれば済みますし、3.についても同じくそこまでの選択肢がないのでAPIで鳴らすことになるかと思います。
結局2.に大量の時間を費やして作ることになるわけですね。
2.にて製作者のオリジナリティを主に発揮することになります。
波形生成の実例
ここでは、上記のExecutableMusicについて「こんな感じで作ってみましたよー」というご紹介を書いておきます。
Githubにソースコードもアップ済みです。
GPUで波形生成?
まず今回の楽曲ではGPUで曲を作ってます。
なんのことかわからんかたは、下記URLを見てみて下さい。
https://qiita.com/MachiaWorx/items/68f8691d0866e0e0ff68
つまり、GPGPU的なアプローチで音楽を生成しているわけですね。
結構有名なものだと、よっしんさん+Yet11さんのこのデモでもGPU生成で曲が作られてます。
ちょっと書き方にクセがあるため、ちょっと記述内容にむずかしいところはあるんですが、生成速度も早いですし、比較的短いコードに形になるので、慣れると扱いやすいかと。
自分はツールも自作しておいて、Shadertoy上で書くよりちょっぱやで試行錯誤できる環境を構築しました。
よかったら使ってみて下さい。
https://machiaworx.net/?p=332
どうやって譜面書いてるの?
内部では配列に音の高さを格納して、相対的な音の高さを指定してます。
加えて、毎データ拍数をカウントしておいて、特定の拍になったら音の高さを変更する、といった処理を追加しております。
結果、移調や途中でのフレーズ変更が楽に行える状態になりました。
どうやって波形を生成しているの?
TransformFeedbackですね。
(Shadertoyだと2*WAVの長さ分のテクスチャに書き込んでるみたいですが)
で、上記のソースコードでWAVを生成して、TransformFeedbackでCPU上でWAVデータを使えるようにしてそれを再生すれば終わりと。
意外とシンプルですね。
アセンブラとかも使わなくていいのでプログラムの入門にももってこい。
どうやってソースコードにしているの?
ExecutableMusicは1個のファイルに全部格納する必要があるので、別ファイルを読み込んで再生ということがやりづらいです。
よって、ソースコード内にシェーダのコードを記入します。
自分はShader Minifierを利用しています。
https://ctrl-alt-test.fr/minifier/?main
オプションは「--no-renaming」を利用。
これは、マクロや最適化すると動作しないことを確認しているためです。
可能だったら変数名だけ最適化するのがよさそうですが、検証のための時間がなく文字列そのまま載せています。
この手の最適化は「動かなくなることがある」のを前提として検証していくのが確実です。
思いついたら
また色々書く予定です。
そもそもサイズコーディング関連の事ほとんど書いてないので。