メガデモのサウンド実装について、現状取れそうな策をまとめた。

はじめに

メガデモを作成する際、どのようにグラフィックを作ればいいのかは知ってる人が多いけど、
どのように音楽を作ればいいのかはあまり触れられてるWebページが少ない。

過去に同様の記事を書いたdemoscene.jpも今動いてねえし。

上記を補完するのが目的です。(2021/4/9現在)

そこまで網羅的にまとめてるわけじゃないけど、今だとこういうのがありそうだよ、ってのを書いてく感じ。
もちろんこっから新たなシンセだったり表現を突き詰めていくのはありだと思う。

あ、今回はmodみたいなのを使うのは除外してます。

あとどちらかというと4k intro/64k introを主戦場としてます。
ブラウザベースだと別途考えないとアカンね。(と言いつつ確か日本の人がJavaScriptでElevatedをブラウザに移植してなかったっけ。ってか301さんだよな)

まず4k introみたいな環境で音楽を再生するには

gm.dlsみたいなのは除いて。

となると、以下の方法になります。

  • シンセサイザーを実装、Exe実行時にプログラムからWAVファイルを生成して再生

この方法が割とスタイルが分かれる部分なので、
どんなアプローチを取って音やフレーズを作っていくかを模索していく形になります。

現状利用可能そうなシンセ

4klang

GitHub – hzdgopher/4klang: Official 4klang repository

おなじみ?4klang。
結構いろんな人が使ってるよね。
四則演算を利用して音を作り込む+Renoiseとかで譜面を打ち込んだあと、
書き出しでオブジェクトファイルになるためこれを組み込むことでシンセとして利用可能。

ただ、4k introに組み込む場合、グラフィックのコードを書くのが辛いくらいの容量らしく、
グラフィックに容量を割きたい場合、結構茨の道だと思ってる。

Oidos

GitHub – askeksa/Oidos: Software synthesizer based on additive synthesis

4k/8k intro用の加算合成シンセ。
Renoise使う想定みたい。

Clinkster

Clinkster by Loonies :: pouët.net (pouet.net)

これもRenoise使う想定。

割と単体でExecutableMusic作る分にはいいかもしれない。
(ASM含めてツールも用意されてる)

64klang

GitHub – hzdgopher/64klang: Official 64klang repository

64k intro用の4Klang。

モジュールシンセ構造・・・みたいなんだけどうちの環境では動作しねえ。
どうしたらええんや。

V2 Synthesizer

GitHub – farbrausch/fr_public: Farbrausch demo tools 2001-2011

みんなおなじみV2 Synthesizer。
スピーチシンセも付いてるよ。

余談ですが、自分が開発で参加した64k introではこのシンセを利用してました。

WaveSabre

GitHub – logicomacorp/WaveSabre: Official WaveSabre repository

今回Revisionで結構使われていたシンセ。

ただ、どうも旧バージョンのDAW対応だったり、日本語設定との相性がかなり悪いっぽく(自分も書き出してみたけど余計なデータが大量に含まれてアカンかった)自分の選択肢としては外すことになりそう。

tunefish

Tunefish Synth | Home (tunefish-synth.com)

BrainControl開発のVST。元々64k intro用に作られたらしい。
ソースコードも公開されている(自作シンセのコードをJUCE上に組み込んだみたい)ので、
これ参考にするのもいいかもしれない。(今のバージョンだと加算合成も付いてるのな)

自作する場合

CPUベースの自作

これが一番分かりやすい。元々CPUベースの実装についてはある程度書籍が出ているため、
これを利用するのが早い。(VSTについてもCPUベースの資料が多い)

ただ、以下の点に注意。

  • グラフィックとの兼ね合いで機能を削るケースがある
  • マルチスレッドで実装しないとWAVの生成に時間がかかるけど、
    マルチスレッド自体が別途ライブラリ参照してくるので容量食う
  • 64k introではDirectSoundでマルチスレッドを実装しているケースが多いけど、本来もう対応していないライブラリなので、いつ削除されるのかなっていう問題がある
  • 上記のシンセが便利なのでそっち使うほうがええやん

勿論必要な機能を厳選して実装するのはアリと思うけど。

あとJavaScriptでシンセを書くという手も現状あるけど、
メモリ確保とかどうなるん?という部分が謎なので、ブラウザベースの4kだとあかん感じになりそう。

GPUベースの自作

これが最近台頭に上がってくる。

方法は過去にまとめたけどここ参照

GPUSound入門 – Qiita

以下、実装方法を列挙。

  • OpenGLでWAV書き込み用バッファを作成
  • シェーダコードを実行(1回だけ)
  • TransformFeedbackでデータをVBOに書き込む(環境によってはテクスチャに書き込む)
  • サウンド再生のAPIでアクセスして再生する

この方法は、以下の理由で便利ではある。

  • マルチスレッドでレンダリングが行われるので生成が早い
  • シンプルなコードでWAVを生成可能
  • Shaderのコードを短くするツールがあるため、それに読み込ませると内容を縮めるのも割と容易

ただ、現状以下の問題点があるので、それを乗り越える必要がある

  • フィルタの実装を行うには工夫が必要(WAVのデータ単位で更に積分的にフィルタ処理を行う必要あり)
  • 位相の調整が行えないので、音のグリッチが発生しやすい
  • GLSLのバージョンによって配列が使えないケースがあるので、譜面作成に制約が発生する
  • マクロ使いまくるとShaderのコードが縮まないどころか動作が怪しくなる

個人的にはグリッチが発生しやすい以外の問題は超えることができたので、
GPUで作ってしまうのはアリかなって思う。

終わりに

もうちょっとサウンド担当から情報まとめらんねえかな?と思うので、
ネタあれば募集しとこかw