Loading

S.F. Info.

S.F.@SFPGMR

2022/3/24 17:43:30

やはり式は式として書けるようにしないとこれではちょっとやっとれん!ってやっぱりなったんだよな。

2022/3/24 17:45:08

普通にwasmのインストラクションが書けて、式も織り交ぜるようにできればそれで十分なんだよなあ・・。って前思ってちょっとそういうの作ろうとしたんだよな。確か。

2022/3/27 16:22:28

そういうわけで過去にパーサ作りまでで放り出した言語の、binaryenに橋渡しする部分のコードを書き始めている。とりあえず文法を思い出すところから始めてる。実はbinaryenの助けを借りれば、wasmのコード生成や最適化はbinaryenに任せることができるので割と簡単に書けたりする。 https://t.co/ZgdEmO77Bq

2022/3/27 16:26:55

パーサもpeg.jsというのを使って書いてるから、ここも文法さえきちんと決めることができればそんなに大変でもないんだよね。しかしこの文法を決めるのが私にとってはすごく大変なことで、まあ悩みに悩むところではある。自由度が高すぎて決めきれない感じなんだよな。

2022/3/27 16:37:47

wasmのmemoryに対するロード・ストア・演算をC言語風の式で書けるようにすればいいんじゃないかなあ?って思ったのはつい先日だけど、2-3年前もそう思ってたみたいでそういうwasmのインストラクションを生成する薄いラッパみたいな言語を作ろうとしてたようだ。

2022/3/27 16:38:29

でそのコードを見てこれでええやん!ってなってまた続きを作り始めた次第である😭

2022/3/27 16:42:53

今作ろうとしているゲームシステムは、昔のHWの構成を部分的に真似たものになってるんですな。メモリ・マップド・I/Oのエミュレーションみたいな感じですな。言い換えると、共有メモリを使ってWebGL2・WebAudio・JS・WASM間で情報の受け渡しを行うって感じですわ。

2022/3/27 16:54:36

VRAMやスプライトバッファみたいなものをTypedArrayで作って、そこにJSやWASMから書き込むと、GPUシェーダがそれを読んで画面に書くんですな。なのでゲーム中の処理はメモリから読んで演算してメモリに書くっていう感じのものが多くなる。こういうのってJSではちょっと書きにくいんですわ。

2022/3/27 16:57:20

書けないことはないけど、ちょっと面倒くさい。wasmだとメモリの読み書きは自在にできるけど、オフセットが数値のみの指定でこれまたつらい。これを定数変数で指定できるようにしたのがmwasmなのだが、しかしwasmのテキストモードで書くのはちとつらい。

2022/3/27 16:59:49

かといってrustやAssemblyScriptでwasm部分を書くと、wasmのメモリマネジメントの部分が若干抽象的になってしまうんですわ。言語にいろいろ任せられる一方、メモリの内容がどうなってるのかわかりにくくなるってことなんですわな。

2022/3/27 17:02:22

私が作ろうとしてるゲームのようなものは、ある程度自分でメモリマネジメントができるんで、ヒープとかガベージ・コレクタはいらなかったりするんですわ。あらかじめメモリをどう利用するかとか利用する容量とか決められるんでね。その枠内で処理を進められるからね。

2022/3/27 17:05:33

メモリはあらかじめ最初に10MBとか決めておいて確保して、そのなかのオフセット0~65535まではVRAMレミュレートに使って、65536~128Kまではスプライトメモリ、そのあとはオーディオ用としてXXK確保とかそういう感じで決めれるということなんですわな。

2022/3/27 17:14:04

wasmのメモリはスタックやローカル変数用のメモリとは切り離されてるから、そういうのに汚染されることもないんだよね。確保した分は全部自分用に使うことができるんだよね。

2022/3/27 17:22:12

で今考えて実装している言語というのは

・変数の値=メモリオフセット
・変数の参照=変数の値の位置にあるメモリの値
・変数への代入=変数の値の位置にあるメモリに値を書き込む

とまあこういう感じになってるのですわ。

2022/3/27 17:35:46

wasmのメモリ定義って領域確保しかできないんだけど、今作ってる言語はそれに加え、変数定義できるようになってるんですな。で変数の型に従って自動的に変数に格納するオフセットが計算されると。この言語では変数はこの中でしか定義できないようになっている。 https://t.co/jlSmqOAlAD

2022/3/27 17:37:49

もちろんwasmでいうところのグローバル変数やローカル変数も定義できる。が、メモリに対する演算をするっていうのを志向するんで通常の変数はこういう仕様にしている。この言語には変数スコープすらない。

2022/3/27 17:42:17

メモリ定義の例(実際まだ動いてないのになんだが😅)

こんな感じで変数を事前定義して、これを関数内で使ってごにょごにょやるわけですな。このへんかなりCOBOLのWORKING-STORAGE SECTIONみたいな感じもするな😅 https://t.co/gJcVX8TFdO

2022/3/27 17:46:59

関数とかはこんな感じですわな。構造体ももちろん定義できる。配列なんかももちろん使えますわ。しかし配列は可変長ではなく固定長のみである。ローカル変数や引数はwasmと同様$が先頭に付く。構文見てもらうとわかると思うけど、式以外はほぼwasmをなぞっている。for/whileなんかももちろんないよ😅 https://t.co/8lNyElTHrk

2022/3/27 17:51:59

これを前に作ったmwasmで書くとこうなるんですわな。これは純然たるwatではないので注意だけど、結構長くなるんだよね。 https://t.co/0AVScLhzPz

2022/3/27 17:53:29

load とstoreが頻発するんで書いてるとめんどくさくなってくるんだよね。

2022/3/27 17:56:02

定数(定数ラベル)もまあこんな感じで定義できるようになってるというわけですな。 https://t.co/mC4ZjXufRF

2022/3/27 17:58:41

C風に式やステートメントが書けるwasmテキストフォーマットって感じのものを志向してるのですわ。

2022/3/30 6:11:41

ほったらかしにしてるうちに、wasmでmulti-valueも使えるようになってる。これは関数の戻り値としてtupleを使えるようにすのが主目的だとなんだと思う。これつまるところ、スタック操作の拡張なんだなとProposalを読んで思った。pickとかね。

multi-value/Overview.md at master · WebAssembly/multi-value · GitHub
Proposal to add multi-values to WebAssembly. Contribute to WebAssembly/multi-value development by creating an account on GitHub.

2022/3/30 6:13:27

このProposalがどこまで取り込まれたのかよくわからんけど、キャリー付きの演算命令とか、マクロ、そしてさっき言及したpickなどのスタックから値を取り出す拡張命令なんかも入ってるんだよね。単に複数の値を返すだけの提案ではないんだよな。

2022/3/30 7:05:56

1.1のドラフトを読む限り、pickやマクロは取り込まれてはいない。Result Typeがvec(valtype)になってるので、やはりMulti ValueのProposalはすべてが取り込まれたのではないんだな。どっかでこの議論を読んだきがするんだがなあ・・

No Image
WebAssembly Core Specification

2022/3/30 7:09:54

binaryen.jsのMulti Value Operationを見るとなんとpush/popが疑似命令で実装されていた。そしてtuple.make/extractなんていう疑似命令も。

GitHub - AssemblyScript/binaryen.js: A buildbot for browser & Node.js builds of Binaryen, a compiler infrastructure and toolchain library for WebAssembly.
A buildbot for browser & Node.js builds of Binaryen, a compiler infrastructure and toolchain library for WebAssembly. - GitHub - AssemblyScript/binaryen.js: A buildbot for browser & Node.js...

2020/5/5 10:13:00

v8ブログに載ってたwabtに入ってるwasm-decompileを使って作成中のモジュールをdecompileしてみた。抽象的な言語コードにデコンパイルされるのだが、確かに読みやすくてデバッグに有効かも。左がデコンパイルしたやつで、右がwat版の同じ関数。
#webassembly

v8.dev/blog/wasm-deco… https://t.co/UtDo6kMRBx

2022/3/30 8:31:50

自分スレッドをまた追っかけると。しかしこれはまた長いスレッドですわ😭

2020/5/14 17:20:41

がしかしこのMultivalueってどこまで規格に取り込まれるのだろうか。finishedになってるから全部なのかなあ。。

github.com/WebAssembly/mu…

2022/3/30 8:38:15

まあMulti ValueのProposalで一番気になったコードがこれなんですわな。pick使ってスタックだけで階乗関数を実装しているやつ。 https://t.co/hoavPpCTuE

2022/3/30 8:38:55

ただここの部分

(pick 1) (pick 1) (i64.mul)

(pick 0) (pick 1) (i64.mul)
じゃないかと思うんだけどなあ・・

2022/3/30 19:29:01

このサンプルにあるphisっていうのはΦ関数のことっぽいが定かではない😅
このΦ関数はSSAにおいて挿入されるΦ関数のことであると思われるがこれもまた定かではない😰
ーー
An iterative factorial function whose loop doesn't use locals, but uses arguments like phis.

2022/3/30 19:38:33

自作ゲーム用のコンパイラ(というよりはwasmテキストモードもしくはbinaryen用のトランスパイラ的なものだが)を作っててこのMultiValueあたりを調べてるうちに「コンパイラ知識のなさ」というのを痛感し、ちょっと凹んだのを思い出したな・・

2022/3/31 6:08:01

peg.jsはpeggyjsに引き継がれたのか・・。

GitHub - peggyjs/peggy: Peggy: Parser generator for JavaScript
Peggy: Parser generator for JavaScript. Contribute to peggyjs/peggy development by creating an account on GitHub.

2022/3/31 6:18:30

peggy(peg.js)のドキュメントを見直すに、パーサーの処理結果をASTでなくbinaryen.jsのModule(Module Treeとでも言うべきか)を生成することができそうな気もしてきたな・・。

2022/3/31 7:11:17

しかしこのpeggyもまた停滞が始まっている模様・・

2022/4/1 19:26:21

peggyとbinaryen、そして自分でかいた(はずの)パーサーコードを睨んで、どうやれば一番すっきりというか、無駄のないコードになるのかをここ2日ほど延々と考えてるところ。今のところこれだ!っていう状態には至っていない。どころか自分の書いたパーサのコードでさえ「はて?」ってなってる😭

2022/4/1 19:27:34

しかしまあこれで唸ってるだけで1日の余暇の時間が過ぎるのが早いこと早いこと・・

2022/4/1 19:29:40

寝てる、もしくは気を失っているのはないかと思うほど時間が経つのが早いのだ😥

2022/4/1 19:30:38

まあしかし今日は昨日の地震でちょっと眠りが浅くなってしまって1日眠かったんでもう寝ることにしよう・・

2022/4/2 8:10:07

やっぱりあれですな。

1.プリプロセス
2.自前AST生成
3.ASTからbinaryen irに変換
4.binaryen.emitBinary()でバイナリ生成

っていう順番で行くのが無難ですわな。

2022/4/2 17:08:16

binaryenのIR=wasmではないんだよな。かなり前に、途中で「あ、これwasmまんまじゃないんだ。中間表現なんだ。」って気づいたんだよね。なのでfuncでもifでもブロックを挟まないといけないとか、微妙な違いがbinaryen IRとwasmではあるんだよな。

2022/4/2 17:09:21

しかしその違いの細かいところはすっかり忘れてるので、またこのドキュメントを読み返す必要があるのだった😭

No Image
binaryen | Compiler infrastructure and toolchain library for WebAssembly
Compiler infrastructure and toolchain library for WebAssembly

2022/4/5 5:29:22

パーサのテストコード書いてバグ出し→修正のプロセスをここ数日繰り返している。この作業が私にとってかなり苦痛である。が、あきらめずぼちぼち進めようと思う。「いずれ終わる」という楽観的思考で進めますわ。

2022/4/5 7:38:00

binaryen.jsでdataセクション(セグメント)を設定するのはどうするんだ?ってなった。

setMemoryのsegmentsで指定するんだな・・。 https://t.co/2IACus3bpN

2022/4/7 6:55:43

ひたすらパーサのテストコードを書き、テストし、パーサのソースを修正するということを繰り返してる。ちょっと中だるみですな・・。なかなかコードジェネレートのところに進むことができんですわ・・。

2022/4/7 6:58:29

過去に作ったパーサなんでなんか特殊な仕様を付けようとしてた部分もあり、そこが今に至りトラップとなっているという😭これ何のために??っていうのを思い出すが大変なのよね・・😥

2022/4/7 7:00:39

例えばこの「エレメント識別子」やらも、ナニコレ??ってなっている。自分で考えて書いたはずなのだが😥 https://t.co/iKPsG1hFqU

2022/4/7 7:01:19

多分table関係なのかなと思うけどね。

2022/4/7 7:04:48

peg.js -> peggy.jsになって、エラーメッセージがこんな感じで出せるようになったみたい。 https://t.co/ry8t0wGhUU

2022/4/7 7:20:48

おお、確かに。。 https://t.co/G8ylSqgr4R

2022/4/7 19:08:47

エラーがわかりやすくなったな。シフト&ローテートオペレータの代入式がおかしいですな・・。評価の順序に問題があるんだろうなあ・・ https://t.co/zaFLSa1V2z

2022/4/7 19:52:03

ん?ローテート・シフトに代入演算子っているのかな🤔

2022/4/9 9:04:33

今書いたテストは全部通るようになった。網羅できてるかというと🤔 https://t.co/g7s4sQE3is

2022/4/9 9:05:56

ASTをbinaryenに引き渡す部分のコードを書き始めますか・・まだまだ道のりは長い・・

2022/4/9 9:09:38

コンパイルできるようになったらプリプロセスの部分を書こうかなと思ってるんだよね。。プリプロセスの部分は以前書いたmwasmのやつを改造して使おうかなと思ってるんだけどね。つまりメタ・プログラミングはJSを使ってできるようにしようかなと。

2022/4/9 9:12:21

mwasmってコードジェネレートする部分書いた感ないなあ・・って思ってたら実際書いてなかった😥
watのプリプロセッサだもんね。当り前ですわ。生成したwatはwabtに渡してwasmバイナリにしてたんですな。

2022/4/9 9:13:49

いやでもコードをbinaryenに引き渡すやつ書いたよなあ・・って思ってたらこれだった。

No Image
オレオレ言語を作る

2022/4/9 9:15:00

この言語よりもさらにwasmに寄せようとしてるのが今の言語なんですな・・。まあこのsgl2っていうのもできてないんだけど😅

2022/4/9 9:16:17

ベクトルの式をwebglみたいに簡単に書きたいって思ってたんだよな。あと行列もか。

2022/4/10 20:28:56

コードジェネレート部分を考えつつ家の掃除、車洗車、用事で出かけたりしてたらもう夜ですな・・休日もあっという間に過ぎますな😅
このコードジェネレート部分も悩ましいところであることは間違いない。なにせまともに実装したことない領域だもんでね。binaryenに助けてもらうにしてもね。

2022/4/10 20:30:51

昔コードジェネレート部分書いてる途中でほったらかしにしてる言語のコードジェネレート部分を見直していろいろ思い出そうとしてるんですが、もうすでに眠くなってるんで、本格的には明日からになりますなあ・・。

sgl2/generateCode.mjs at master · sfpgmr/sgl2 · GitHub
TDOPパーサをベースとした言語を作っていく. Contribute to sfpgmr/sgl2 development by creating an account on GitHub.

2022/4/10 20:32:55

このsgl2という言語はTDOPパーサ使ってパーサ部分は書いたんですな。まあこのTDOPっていうパーサアルゴリズムはすごくわかりやすいんですわ。

2022/4/10 20:35:51

悩ましいのはやはりデバッグがまともにできるように、ソースマップをきちんと出さんといかんところが一つのハードルとなってるんですわ。あ、その前にちゃんと意味のわかるエラー表示もしないといかんのだった😰
今のパーサが出すエラーはちょっと意味不明なんでね。

2022/4/10 20:39:53

意味不明というか、もともとの原因ではなく、間接的な要因でエラーが出力される部分が多いんで、何でこのエラーが出るのか?をパーサの動きを想像したり、構文を見たり、はたまたトレースログ見たりしないといけなかったりするところが多いんですわ。エラー表示に工夫が必要ってことなんですが。

2022/4/10 20:41:55

ちょっとこの辺も、使ってるpeggy.jsやらbinaryen.jsの理解が浅くて本来こうすればいいものを・・っていう部分も多分にあると思うので、もっと調べないといかんなあと。そこに多大な時間がかかるんですな。

2022/4/10 20:43:54

AssemblyScriptのコードを読むのもいいかもしれんのですが、これも結構巨大なコードなんで読むのに骨が折れるんですわ。でもお手本になるのは間違いないんだよね。私のコード読解力の問題ですわな。

2022/4/12 18:45:23

コードジェネレートの部分はbinaryen様のお力を借りたとしても、面倒くさいことこの上ないですな・・。それだけ私がヘタレだということなのだが。できる限り手をかけないでこの局面を乗り切りたいが、ヘタレなので手をかけないで済ますテクがないから手をかけないといけないのだ。なんだこりゃ😥

2022/4/12 18:46:20

なぜこれを放置したのか今になって理解したな😢

2022/4/12 18:48:48

しかし今回は、牛の歩みだろうが亀の歩みであろうが、遅くても一歩ずつ進めるんだという気持ちも強いのであった。ほんまか😅

2022/4/12 18:50:20

再帰というテクニックにより、思いのほか書くコードの量は少ないということもまた事実なのだが。この再帰というものを考え始めるとなぜか頭がこんがらがってしまうんだな、これが😭

2022/4/12 18:51:23

うんうん頭が無駄な唸りをあげ、疲れて惰眠を貪ってしまう感じである・・

2022/4/12 18:52:18

無駄なループとでもいおうか・・

2022/4/14 6:03:06

うーむ。改めてこれをを読もうとしたり・・

No Image
低レイヤを知りたい人のためのCコンパイラ作成入門

2022/4/14 6:07:37

ソース・インクルードことをずーっと考えてるんだよね。peggy.jsを使う場合、ソース・インクルードをどう扱えばいいのかなあって思ってね。それでヒントにならないかな?って思ってC言語の分割コンパイルの単元を読んでたわけ。

2022/4/14 6:13:53

C言語の場合、ヘッダファイルでコンパイルに必要な情報を提供して、.Cファイルごとにコンパイルしてオブジェクトにして、後でリンカでオブジェクトをまとめて1つの実行ファイルにするって感じですわな。

2022/4/14 6:17:19

今作ってる言語の場合は

1.コードジェネレート前にすべてのソースファイルを取り込み、1つの巨大なソースファイルにする。
2.そのソースコードをpeggyで作ったパーサでASTにする
3.ASTをbinaryen.js IRツリーに変換してバイナリ出力する

こんな感じで考えてるんですわな。

2022/4/14 6:19:55

それで3.のbinaryen.jsのIRに変換するときに、ソースマップの情報を与えることができるんだよね。これ入れるとソースマップが作られて、オリジナルの言語だけどブラウザのデバッガでステップ実行とかできるようになるはずなんだな。知らんけど😅

2022/4/14 6:45:41

最初にソースインクルードしてまとめるときに、どこからどこまでがもともとのファイルなのかと、行情報を持っておかないといかんのですわ。これをなんとかしてbinaryenにソースマップ情報として渡さんといかんのですよ。これがちと面倒くさいなあと。

2022/4/14 6:48:13

だがしかしその間にパーサによるパースっていうフェーズがある。peggy.jsで作ったパーサはその情報を受け取ってASTにうまいことくっつけることなんていうことはできんので、そこを自分で書かないといけないんですわ。しかしこのツィート書いてるうちに頭の中が整理できてきたな😄

2022/4/14 6:59:52

さらにマクロ使えるようにするってなると、デバッグ情報を引き渡すのにまた工夫が必要になってくるんですな。マクロは今回の言語では不要にしよう。やるならインライン展開かなあって思う。しかしデバッグビルドでできるようにするにはとても面倒だと思うので、デバッグビルド時は無効にするのかなと。

2022/4/14 7:00:11

なんてこと考えてたら、ああ、コンパイラにデバッグ・リリースビルドってあるけど、なるほどそういうわけかあ・・って妙に納得したりとかしてね

2022/4/14 7:04:28

プリプロセスもある程度固めとかないと、後で手戻りが発生しそうだなあってちょっと思ってる。
手戻りや再考の時点で放置リスクが最大になるんでね🤔

2022/4/14 7:07:54

やはりちょっとAssemblyScriptのソースコードまた読もうかな。過去なんどもチラ見してるけど、やっぱりあれくらい本格的になるとコード追うの大変なんだよね・・
contributeできるぐらいに精通してないと大まかに理解できないっていうなんか矛盾めいた感じが。

2022/4/14 7:10:05

cプリプロセッサのアルゴリズム解説。。おおお。
github.com/rui314/8cc/wik…

2022/4/14 7:34:46

ちゅうわけでAssemblyScriptのソースコードを読み始めた。。
まずはトークン分割から。。やはりトークン分割してパーサに渡す流れですわな。私は今PEGパーサジェネレータ使ってるんで、トークン分割とパーシングを同時にやってる感じになるんだよね。

assemblyscript/tokenizer.ts at main · AssemblyScript/assemblyscript · GitHub
A TypeScript-like language for WebAssembly. Contribute to AssemblyScript/assemblyscript development by creating an account on GitHub.

2022/4/14 7:42:58

トークナイザはソースコードから文字を1文字ずつ読んで、識別子単位で分割するって感じですわな。その時にRangeというオブジェクトでソースコード中の識別子の位置を記録して持っておくというわけですな。AssemblyScriptではね。

2022/4/14 7:49:22

私が欲してるのは自分の趣味嗜好を反映したものすごく汎用性の低いものなんだよね。そうじゃない場合はrustやAsemblyScriptで十分ですからな。そこを自分自身わきまえとかんとまた夢仕様を考え始めてそんなの無理って放置してしまうんで気を引き締めないとな・・

2022/4/14 7:51:32

まあ、トークナイザはまあまあこういうもんですわな。。これはこれくらいの理解でいいな・・。続いてパーサを読んでこうか・・ってやっぱり前読んだことあるなこれ。すっかりわすれてたが😅

2022/4/14 20:01:48

パーサーで気になるのはやはりimportの処理だわな・・これはもうAssembly Scriptのコードで真似できるならそれでいいな。それよりまず理解しないとな。

2022/4/14 20:17:54

parseImport()を読んだ。単にこれはimportのノードを作っただけのように見えるな。この段階ではまだpathからソースを読んでASTにくっつけるみたいことはしないのかなあ・・とするとどのフェーズでimportのソースを読むんだろうな・・

assemblyscript/parser.ts at d884ac8032b2bfa0caf26d4dc11d99c5a9543c13 · AssemblyScript/assemblyscript · GitHub
A TypeScript-like language for WebAssembly. Contribute to AssemblyScript/assemblyscript development by creating an account on GitHub.

2022/4/14 20:20:44

最終的にはimportしたモジュールも展開したASTができるんだろうけけどね。それをいつ・どこでやってるかですな・・

2022/4/15 7:23:30

今はcliのソースコードを読んでいる。
そもそも全体の流れを把握せず読んでたし・・まずこれを読むべきだった・・😭

assemblyscript/index.js at main · AssemblyScript/assemblyscript · GitHub
A TypeScript-like language for WebAssembly. Contribute to AssemblyScript/assemblyscript development by creating an account on GitHub.

2022/4/15 7:35:26

おお、ここだ😊

なるほどお・・
再帰的に呼び出してるって推測してたんだけど、まあ見た目再帰呼び出しでない感じなんで見過ごしてたわ・・
なるほどなあ・・

assemblyscript/index.js at main · AssemblyScript/assemblyscript · GitHub
A TypeScript-like language for WebAssembly. Contribute to AssemblyScript/assemblyscript development by creating an account on GitHub.
https://t.co/gDWSYU5g1X

2022/4/15 7:42:20

ものすごく簡略化していうと

1.パースしてimportファイルをキューにプッシュ
2.キューに溜まったimportファイルをパース
3.キューが空でない→2.に戻る
4.終了

な感じ。

2.でさらにimportがあればキューに溜まり、空になるまでパースすれば展開完了になるんだな・・

2022/4/15 7:43:52

重複したimportファイルの取り扱いもここで調整するんだなあ・・頭いいなあ・・

2022/4/15 7:44:42

やっぱりコンパイラを完成させられる人たちってすごいや・・😊

2022/4/15 7:47:04

そりゃparser.tsやcompiler.tsだけ読んでもわからんはずだわ。そこに書いてないんだもの・・でもまあよかった。大まかには理解できたな・・😄

2022/4/15 20:37:46

import した時の参照名と実際定義されている関数の名前と一致してるかとかのチェックはやはりパースが完了した後にやるんだろうな。それもソースコードを読み進めて確かめるか・・

2022/4/15 20:45:26

あ、そうだ。ついでに64ビット整数をどう扱ってるのかも勉強させてもらおう。なんか昔このドキュメントを読んでJSのBIGINTとWASMの64ビット整数の受け渡しできるやらできないやらを理解したつもりが、すっかり忘れちゃってるんでね・・

No Image
WebAssembly integration with JavaScript BigInt · V8

2022/4/15 20:46:24

V8の深堀なんかもすごく面白そうなんだけど、まあそれはおいとこう・・

2022/4/16 12:38:20

結局あれだな。文法に適合してるかどうかのチェックをしたらもうどんどんASTにしてしまって、あとからセマンティクスのチェックをかけるってほうが効率的だわな。実際。そしてAssemblyScriptのインポートのアルゴリズムでいけば、循環参照で無限ループになることもなさそうな気もするんだな。

2022/4/16 12:43:20

importはとにかく単純にまずソースインクルードでいいな。そしてAssemblyScriptのインポートアルゴリズムに倣って全部取り込んでAST化すると。そのあとセマンティクスのチェックをする流れですなあ・・。いやしかし、シンタックスとセマンティクスをごっちゃにしがちなんだよな。。

2022/4/16 12:44:25

No Image
compilers - プログラミング言語における構文と意味エラーの違い - de-vraag

2022/4/16 12:47:19

パーサで行うこと→文法チェック
ですわな。peggyだといろいろなアクションできるんで、セマンティクスなチェックを入れてしまったりしてややこしくしてしまいがちだが、シンプルに考えんといかんな。。

2022/4/16 12:47:45

シンプル・イズ・ベストですよ。

2022/4/17 17:42:04

まあそういいながら、コードを2行くらい書いただけで他の雑用でこの土日は過ぎ去ってしまったな・・
しかしpeggyのエラー周りの処理の中身とか少しチェックして理解できたんでよしとしよう・・

2022/4/17 17:44:36

まあ朝は朝で、svelteカスタムビルドしてるんでいつもの元レポジトリを取り込んでマージしたら大量にビルドエラーが出てそれなおすのに四苦八苦してたのもあるんですが😭
結構破壊的変化はある。私にとってはだけど。

2022/4/17 17:47:19

そしてまあ午後は佐々木くんの試合。いやあやはりすごい。本人も言ってたけど、今日は球数が多くて、6-7回あたりは少し疲れた感じだったもんな。試合はロッテの負けか。しかし日本ハムのピッチャーもこのシチュエーションであのピッチングはすごかったな。プロ野球選手ってやっぱりすごいわ。

2022/4/17 17:48:57

言語つくりはゆっくり進めよう。焦ってはいかん。。ロッテが佐々木君にしたように、じっくり大切に育てるようにしよう。

2022/4/20 6:05:07

ASTからbinaryenに引き渡すコードを書き始めてるが、いろいろ考慮漏れがあって手が止まるというか、考えてる時間が非常に長い。例えば変数のスコープとかね。

2022/4/20 6:07:43

WASMだと変数のスコープって

1.グローバルスコープ(グローバル変数)
2.ローカルスコープ(ローカル変数と関数引数)

この2つだと思ってるんだけど、1.、2.の変数が関数本体に現れた場合、仮に同じ名前だとするとどちらを参照してよいのかコンパイラに情報を与えないといけないんだな。

2022/4/20 6:11:08

実際ローカル変数へのアクセスは最終的には
local.get/local.set
だしグローバル変数だと
global.get/global.set
というインストラクションにしないといけないんでね。

2022/4/20 6:12:10

もっというと今作っている言語の変数は名前でアクセスできるようにしているけども、最終的にはインデックス値に変換する必要もあるからね。

2022/4/20 6:19:30

でグローバルとローカルが同じ変数名であった場合に

・既定はローカル変数であるとみなす

っていう考えでいた。しかしこれだとグローバル変数にアクセスできなくなってしまうんで、「この変数はグローバルですよ」ってコンパイラに教える構文が必要なのだな。そういうの忘れてたりとかね😅

2022/4/20 6:22:47

あと私の言語上ではメモリ変数という変数もあるんで、それも1つのスコープ。その中では名前の重複は許されないけど、ローカル変数スコープとグローバル変数スコープとの名前は重複しててもよいとすると、それを識別するための構文が必要ですわな。

2022/4/20 6:27:19

メモリ変数っていうのはWASMの線形メモリ上にラベルと型、大きさを事前定義してラベルを変数みたく使うっていうものですわ。これまあ私の言語上の話ですけどね。変数で線形メモリのデータを出し入れ(load/store)できるようにするってことなんですが。 https://t.co/jjX5OrVzqu

2022/4/20 6:31:24

アセンブラなんかにある機能を参考にしてるというかほぼまんまですが😅
関数のステートメント上では普通に変数みたくアクセスできるんですが、WASMレベルではオフセット計算してload/storeするインストラクションに変換されるわけですわな。変数は定義順にメモリにアサインされる。

2022/4/20 6:32:56

もちろんオフセットの先頭アドレスを明示的に指定できたりとかいう仕様も入れてるんですわ。スタックメモリはWASMでは線形メモリとは別の領域にあるんでそれは気にしなくていいんだよね。

2022/4/20 6:35:41

動的に確保するメモリとかってどうするんだ?っていうことなんだけども、いわゆるヒープっていうのは言語仕様としては存在しない。
必要であればライブラリで線形メモリ上に作るって感じですな。

2022/4/20 6:40:33

もし動的管理が必要な部分があればそこはJSに逃がすってこともできるしね。つまりはメモリは必要な分をあらかじめ静的に確保しておいて、その中でチマチマやるってことを想定してる。私が作りたいゲームはまさにそういう感じの言語仕様が望ましい。

2022/4/20 7:17:34

まだ迷ってるところとしては式あたりのところなんだよね。WASMはスタックマシンなんで、演算結果はスタックに置かれるんですわ。これをうまいこと使って冗長な操作を端折れんかな?っていうことも考えとるんですわ。

2022/4/20 7:22:17

例えばテンポラリな値の入れ物をわざわざローカル変数で用意せずとも、スタックで代用できないかなあとかね。
func hoge(a:i32,b:i32,c:i32):(i32){
stack = a+b;//a+bの値をスタックに
stack += c;//スタックの値とCを足してスタックに
//スタックの値をそのまま戻り値とする
return stack;
}

2022/4/20 7:27:29

このスタックを使った演算をもうちょっとわかりやすく書けんやろか・・って思っててね。

= a+b;
+= c;

ってだけ書けばよいってのはどうかなあとかいろいろ考えてるところですわ。

スタックなんで
= a;
= b+c;
+=;
って書けるなあとか、これはかえってわかりにくいなあとかね。

2022/4/20 7:32:11

=もなくして書けるのもいいのかもなあ?ってとかね。pegによる構文をかなり直す必要があると思うけど。

a+b;
+c;

しかしこれだと+cの+が符号を表すのか加算を表すのかわからんようになってしまうなあとかね・・。

2022/4/20 7:35:58

まあこういうことを考えてるのは例えばローカル変数を一時変数として使用してしまうと、
d = a+b;
d += c;
return d;
ってやるとWASMにコンパイルすると

local.get b
local.get a
i32.add
local.set d
local.get d
local.get c
i32.add
local.set d
local.get d
return;

こうなってしまうんだよね。

2022/4/20 7:39:02

まああの、binaryenに渡すんで最適化されるかもだけどね。これがスタックを一時変数として使えるとするとコンパイルしたときに

local.get b
local.get a
i32.add
local.get c
i32.add
return

こうなるわけですな。ローカル変数は疑似的なものですわな。最終的には整数インデックスになるけども。

2022/4/20 7:43:45

言語ソースからコンパイル結果がある程度イメージできるというか、1:1っぽくなるようにしたいっていうかね・・。せっかくWASMが式指向なんで、rustっぽくしたいなあっていうのはあるね・・

2022/4/20 7:47:30

スタックを言語上で意識して使えるようになると、関数呼び出しも引数あたりの処理で最適化できそうな気もするんだよなあ。

2022/4/20 7:47:59

ってなことを考えてたりすると時間はあっというまに過ぎるな😰

2022/4/20 18:58:17

webassembly 2.0のWorking Draftか。。

No Image
WebAssembly Core Specification

2022/4/20 18:59:49

それよりまずこれもう一度読み返そう。2年前と比べると仕様追加部分が加筆されとるんだよね。このドキュメントはとてもわかりやすいと私は思う。

WebAssembly テキスト形式の理解 - WebAssembly | MDN
WebAssembly を人間が読んだり編集したりできるようにするため、 wasm バイナリー形式にはテキスト表現が存在します。これはテキストエディター、ブラウザーの開発者ツールなどで見せるために設計された中間表現です。この記事では、テキスト形式のしくみ、生の構文、および元のバイトコードの表現との関係 (と JavaScript で wasm を表現したラッパーオブジェクト) について説明します。

2022/4/20 19:02:09

blockも考えたら引数持てるから、ブロック単位のスコープってのもできるんじゃないかな?とか思ったり。スコープとか別にコンパイラ側でなんとかすりゃいい話だけど、コンパイラが余分なランタイムインストラクションを吐かんようにしたいってのもあってね。WASMに寄り添う言語でありたいので。。

2022/4/21 6:12:44

blockの仕様を読んでるけど、やっぱりこの抽象構文ってえげつなく読みにくいなあ・・。
数学記号の意味が頭に入ってないせいかと思うんだけどね。

No Image
Instructions — WebAssembly 2.0 (Draft 2022-04-16)

2022/4/21 6:14:48

「⇒」は「ならば」の意だとかね。

2022/4/21 6:18:24

もうこのblocktypeの定義だけで「はあ?」ってなってる😭 https://t.co/MB1OSaKHIC

2022/4/21 6:31:39

なんとなく
tがresultならばtですよと。しかしかっこがついてる。かっこがついてるということは複数あるってことを表すらしい。「?」記号はoptionalってことなので、0以上のtのリストってことになるのかなあ?ってなぼんやりした理解でいいのか🤔 https://t.co/ndDqo1IJOl

2022/4/21 6:32:08

resultはさすがにわかりますわ。
(result i32)
みたいなのですわな。 https://t.co/jfpfrPRUtH

2022/4/21 6:37:43

ああ、「?」は「optional occurrence 」なんでそれ自体複数の可能性あるのか。 https://t.co/sZWvKgUpKT

2022/4/21 6:41:14

このtypeuseのお尻の下付きイタリックの「I」はなんやねん?とかなっている。 https://t.co/U0mYpxgkBh

2022/4/21 6:45:48

「x,I':typeuse」っていう部分は、「xがtypeuseだった場合」ってことかな。
そしてtypeuseってなんやねん?っていうのもちゃんと定義はある。

No Image
Modules — WebAssembly 2.0 (Draft 2022-04-16)

2022/4/21 6:48:49

そしてこの「'」だよな。これはなんとなくインスタンス化した実体(コピー)みたいなものを表すって気もするな。数学的には「プライム」って読むらしいな・・まあこの抽象記法が数学的な記法に沿ってるかどうかもわからんですが。「'」記号は文脈によって取る意味は違ってくるようだけどね。

2022/4/21 7:10:06

厳密に定義するとめちゃくちゃ長くなって書くのが大変だから、記号に意味を持たせて抽象化する(省略する)んですわな。

2022/4/21 7:10:41

まあこの仕様を読みこなすにはそれなりの知識が必要だってことですわな。

2022/4/21 7:21:24

とは言いながら、binaryen.js上のblockでは引数付きのblockサポートしとらんようですがね・・ https://t.co/hd9nAGDMGe

2022/4/21 7:40:40

まあおおもとのbinaryenのソース見てもやはりBlockは引数サポートしとらんね。ここはいったんスルーしよう。 https://t.co/CmVvLQVKwz

2022/4/22 7:42:58

昨日からじわじわと、コードジェネレート部分を実装している。なんと1日10数行レベル!
もうその行間に沸く疑問や謎が半端ないのだ。いかに自分の知識が薄いか、痛感しているここ数日なのである。

2022/4/22 7:46:24

まあしかし、実装のセオリーみたいなものが見えてきたのもまた事実。スピードは少しずつ上がっていくだろうと思ってはいるがしかし我ながら超遅いな😭

2022/4/22 7:48:37

今回はきちんとコンパイルエラー吐いて、デバッグビルドでソースマップ吐いてブラウザでデバッグできるようにしようと思ってるのでね・・。そこまでできたらVS Codeでデバッグとか、コード補完とかもできそうな気もしてきたりと。まあこれは今の状況では単なる夢想でしかないのですが😅

2022/4/26 5:27:11

やはりこの時期、やる気にムラが出るなあ。今はまったくやる気がでないな・・。5月病ですかな。

2022/4/29 10:10:13

ちょこちょこいじってはいるんだけど、進捗ははかばかしくないですな。仕事ではないんで追われるようなスケジュールもないからね😄
まあいつものことか😅

2022/4/29 10:15:41

なんかこう「再帰呼び出し」についていろいろ考えるところがあってですな。長考してることが多い。普通に考えて条件分岐が多い冗長なやつを書くんではなくて、再帰呼び出しでスマートかつ短いコードを書くことができんかな?って思ってね。

2022/4/29 10:17:10

「とりあえず動くものを今知っている方法で書く」のではなくて「自分にとってあまり過去書いたことのない手法で書いてみたい」って感じが強い。まあこれ私にとってなんで、他人が見ると「ふつう」ってことなのかもしれないけれどもね。

2022/4/29 10:19:10

長考して「続きはまた明日」ってなるんだけど、長考した内容を忘れてしまって、「あれ昨日なんでこんなコード書いてるんだ。何を考えてたっけかな?」ってなったりもしてるな😥

2022/4/29 10:23:10

デバッガが優秀なんで、途中までコードを動かしながら変数の中身を見てその先をどう書くか考えるようなやり方を取っている。期待したような変数の値にはなってないことも多くパーサコードの手直しも結構多く発生しているな。

2022/4/29 10:26:38

ちょっとこの記事を読んでから、私の考え方が少し変わったというか。逆に混乱してるのかもしれんけども。かなり影響を受けた気がする。

ABNF Parser の実装 | blog.jxck.io
IETF の RFC では ABNF 形式の表現がよく使われ、たまに実装することがある。しかし、実装するたびに前のコードを引っ張り出して思い出す、を繰り返しているので、自分用にメモとしてやり方をまとめる。完全に我流であり、目的は「その ABNF が正しいかを確認すること」な...

2022/4/29 10:27:47

この記事と今の私のコードの書き方とはまったく関係ないけどね。なんかこう見え方が変わったというかね。なんて言っていいのかわからんのですが。

2022/4/29 10:30:03

むしろパーサやコードジェネレータについて分かった気になっていたが、この記事を読んで私が何も理解していないということが分かったということかもしれんですな。

2022/5/10 7:28:36

ひさしぶりに自作言語のコードジェネレータをいじっている。連休中は時間を割くつもりだったのだが、ほかのことに流されてしまいまったく手を付けることができなかった😅

2022/5/10 7:32:43

今のところは1つのテストコード(関数1個)をエラーなくコンパイルできるまでのコードを一通り書くってことをしているのだけれども、デバッガでチェックするとASTの構造が思ってたようなものになってなかったりすることも多いんだよな。でパーサの手直しに戻ったりして、なかなか先に進めないでいる。

2022/5/10 7:36:32

コンパイラは私にとって未知の世界なんで進まんのはあたり前っちゃあ当たり前の話なんだけどもね。

2022/5/11 6:51:56

おお、コンパイラエラーっぽいものが出るようになった。return文まだ実装していないので、このエラーは正しい。未実装部分は大量にあるから大半はこのエラーで落ちる😅 https://t.co/pPbHNG7iWP

2022/5/11 6:54:58

ソースマップ作成支援機能みたいなのがbinaryenにはあるから、それ使ってデバッグビルドでソースマップを作れるようにして、wasmバイナリでもchromeデバッガで自作言語のソースコードトレースができるようになるんじゃないだろうかという推測のもと作業をすすめている。

2022/5/11 6:57:06

このあたりの支援機能がないと、私のレベルではコンパイラなど作れんわな・・
しかし面白いな。

2022/5/12 5:09:21

今日からreturnの実装ですな。

これは

return (式);

って構文で、

1.(式)を実行し、結果をスタックに積む
2.returnする

っていう動きになるんだよね。まあ簡単ですわな。

これをbinaryen IRで実装できれば今のテストコードをwasmバイナリに落とすことができるってわけですわ。

2022/5/12 5:10:43

テストコードはこんな簡単な関数ですが😅

module {
export func a (i:i32,j:i32):(i32):(k:i32) {
k = i + j;
i += k + j;
k = i + j;
return k;
};
};

2022/5/19 5:44:37

ようやくbinaryenでテストコードをbinaryen IRに落とすところまできたが、emitBinary()で落ちてしまう。うむう。どこかで凡ミスしとるな。たぶん。。

2022/5/19 5:47:20

再帰的にASTをパースしてIRに変換する大まかな道筋は得られた感ありですな。

2022/5/23 7:50:38

ようやくテスト関数がwasmにコンパイルできた。まだまだ未実装部分が大量にあるのでこれからが本当に大変なのですが、アプローチ的におかしくないってことが分かったんでとりあえずよかった・・😁 https://t.co/SyWMfqQWCi

2022/5/24 5:05:37

わざとエラーにしてみると、おお、3行目の15カラム目に未定義変数があるってエラーメッセージが出た!
これはわかりやすい!って当たり前なのですが😅
この誤ってる箇所をソースコードとともに指し示すってのも結構面倒くさくてですな。peggy.jsのコードのおかげ😅 https://t.co/EuTAuM7iem

2022/5/24 5:07:56

ただエラーメッセージ間違ってるな・・

Undefiend

Undefined

ですやん😰

2022/5/25 7:03:57

まともな実装に入る前にこのレベルで

・ソース・マップの作り方
・デバッグビルドの作り方

を実装しながら学んどかんといかんな。これわかってないで実装進めて、知らんかったから手戻り・・とかは避けないといかん。

2022/5/25 7:28:46

binaryen.jsにはソースマップ作るための3つのメソッドがある。

・addDebugInfoFileName
・getDebugInfoFileName
・setDebugLocation

これ使ってソースマップに必要な情報をセットして、emitBinary()をsourceMapUrlを引数にして呼び出せばデバッグビルドが作れるみたい。

GitHub - AssemblyScript/binaryen.js: A buildbot for browser & Node.js builds of Binaryen, a compiler infrastructure and toolchain library for WebAssembly.
A buildbot for browser & Node.js builds of Binaryen, a compiler infrastructure and toolchain library for WebAssembly. - GitHub - AssemblyScript/binaryen.js: A buildbot for browser & Node.js...

2022/5/25 7:47:26

私用言語(私の中ではwlと呼んでる)のソースとwasmテキストフォーマットをくらべる。このレベルの簡単なコードでも量がかなり違う。でもほぼほぼ1:1な感じで生成されてる。式が書けるとやっぱり見通しがいいなあ・・ https://t.co/0IckOwuhNV

2022/5/25 7:51:14

optimize()するとこんな感じになる。おお、最適化されてるわ・・ https://t.co/JhnaKJKjCJ

2022/5/26 7:30:09

デバッグ情報を付加に必要な

・addDebugInfoFileName
・getDebugInfoFileName
・setDebugLocation

の使い方をassemblyscriptで学んでるところ。お手本があるのはありがたい。

GitHub - AssemblyScript/assemblyscript: A TypeScript-like language for WebAssembly.
A TypeScript-like language for WebAssembly. Contribute to AssemblyScript/assemblyscript development by creating an account on GitHub.

2022/5/27 5:55:27

しかしbinaryen.jsのsourcemap用のメソッドだけではソーステキストをセットできないので、どうやって埋め込むんだろうな?って思ってAssmeblyScriptのコード読んでた。答えが書いてあった。emitBinary()でできるオブジェクトのsourceMapプロパティに後付けするんだ🤔

assemblyscript/index.js at 73670f22ef45e8858eb3be6550bbb1cce3cd2505 · AssemblyScript/assemblyscript · GitHub
A TypeScript-like language for WebAssembly. Contribute to AssemblyScript/assemblyscript development by creating an account on GitHub.
https://t.co/jh1cPc7MxL

2022/5/27 5:58:53

後付けする部分のコードはここですな。

assemblyscript/index.js at 73670f22ef45e8858eb3be6550bbb1cce3cd2505 · AssemblyScript/assemblyscript · GitHub
A TypeScript-like language for WebAssembly. Contribute to AssemblyScript/assemblyscript development by creating an account on GitHub.
https://t.co/naW7qoC86T

2022/5/27 7:12:10

おお、sourcemapができたようだ。emitText()するとインストラクションに対して元ソースの位置がコメントされるようになったな。こりゃすごい。 https://t.co/cL9KNm9d2j

2022/5/27 7:27:49

binaryen.jsとAssemblyScriptのソースコードのおかげでコンパイル~ソースマップを作るところまではできたなあ・・

2022/5/27 7:35:32

しかしこのsourcemapのnamesが空なのがなんか気になるな。mappingsデータに対応するように名前をつけることができるみたいなのだが、そもそもどう使われるのかわからんな・・。これはsourcemapのspecを読むしかないね🤔

No Image
Source Map Revision 3 Proposal
https://t.co/YsQrDpRnMh

2022/5/27 7:44:18

そもそもBase64 VLQっちゅうのがわからんね🤔

2022/5/28 7:49:09

私用言語をwasmにコンパイル、sourcemapを出力してvscodeのJS debug terminalで動かしてみる・・。おお、ステップ実行できたああ!
スタックやらローカル変数もウォッチできますがな。。
私が書いたコード以外のすべてのツール・ライブラリのすごさに驚嘆ですわ・・ https://t.co/xgmFJbay1J

2022/5/28 7:54:14

動かしてみてわかったのはsetDebugLocationの挿入する粒度。インストラクションを生成するごとにこのメソッドを呼んでいたが、それだとちょっと細かすぎる。程よいところを見つけないといかんですな。

2022/5/31 5:24:18

とりあえずマイルストーンの1つを達成したことにして😅、動画製作の練習も兼ねて自作言語のデモ動画を作ってみた。自作言語のデモになっていない気もするが・・😥
youtu.be/0IBGzz4uIwg

2022/5/31 6:53:51

さて実装を進めんといかんですな。
正直道筋が見えただけで、完成には程遠い状態ですからな😰

2022/6/1 7:14:05

まずは四則演算の残り😅
減算・乗算・除算はできた。
けど、演算時の変数や値の型チェックしないとなあ・・
そもそもリテラルの処理も実装していないなあ・・
やることが山ほどあるな・・
今はローカル変数同士の加減乗除しかできんというスーパーヘボ言語なんで、これを早く脱却しないとな🤔 https://t.co/yiSwBE4iBj

2022/6/1 7:24:16

todoリストでも作るか。いや、todo作るとやることが大量にあるということが明確になってやる気をなくすのでしばらくは作らないことにしよう😄

2022/6/1 7:43:26

加減乗除もサクって・・思ってたけど、整数の割り算は符号あり・なしでwasmでは命令(div_s/div_u)が違うからねえ。整数の時だけ場合分けして処理しないといかんのよね。剰余命令とかビット・シフトもそうだわな。

2022/6/1 7:50:29

一応私用言語上は整数の型としては

i8/u8
i16/u16
i32/u32
i64/u64

があるんだな。i32/i64/u32/u64はwasmが型としてもってるからわりとすっきり実装できるんだけど、i8/u8/i16/u16は演算時にi32/i64への変換が必要になってきてちょっと面倒なんだよな。そして演算コストも高い。 https://t.co/0DeS0VBU9K

2022/6/1 7:57:21

i8配列なんかでindexアクセスなんてするとまあコスト高いですわ。ってまだ実装してないけど😅

2022/6/1 7:58:57

>i32/i64/u32/u64はwasmが型としてもってるから
正確にいうとi32/i64ですな・・

2022/6/6 20:18:01

テスト関係のコードを作り直している。node.jsにテスト・ランナーが組み込まれたのでそれとassert使ってやるようにしようかなと。

2022/6/7 4:56:47

node.jsのテスト・ランナーへの切り替えが終わった。 https://t.co/QrsC56W1Re

2022/6/10 7:44:00

四則・剰余演算のテストが通りましたな
しかし道のりはまだまだ果てしなく長い・・

関数定義の文法がなんとも変な感じですな・・
でもまあこれでいいか・・私用だし😅 https://t.co/nLSV7b7jCD

2022/8/7 10:00:18

自作ゲーム用の言語作りを少し進めることにしたが、すっかり内容を忘れてしまってる😭
どうやらリテラルあたりの処理でめんどくさくなって手が動かなくなったらしい😢

2022/8/7 10:04:33

この間ReaperのJSFXでPSG風音源を作るにあたり、EEL2という言語に触れてちょっと影響を受けた部分もあるので、言語仕様は少し変えるかもしれない。
しかしゲームを作るのに言語作りから始めるのはあまりにも遠回りかもしれんですな😅
完成する気あるのかという・・

2022/8/7 10:08:27

私としては

1.GLES 3.0(WebGL 2.0)ベースのシェーダーが書ける
2.カスタム頂点フォーマットが使える
3.シェーダーで整数が扱える

ことができれば出来合いのゲーム・エンジンでよいのだが・・

2022/8/7 10:13:46

これに合致するゲームエンジンってなぜかないんだよね。私のニーズがどれだけニッチなのかっていうのがよくわかってしまってかなわんですわ😰

2022/8/7 10:22:09

GLES3.0希望なのはシェーダーで整数が簡単に取り扱えるからなんだけどね。GLSL/HLSLとかでも使えるからまあ3.の要件のほうが1.の要件よりも強いわな。

2022/8/7 10:22:39

ゲームエンジンの使い方を覚えること自体も億劫になってるのもあるよな。自分用だと汎用性を気にしなくていいからかなり限定した仕様で簡素化したエンジンにすれば、ゲームエンジン覚える時間で書けるだろうっていう考えが今私の脳内を支配してるんだよね。
ポンコツですな😅

2022/8/7 10:24:27

しかし実際は自作するのも時間がかかりすぎて、UE5リリースされてすぐに勉強してたらそれなりに学習できて成果物も存在していたのではとも一方では思いますな😱

2022/8/7 10:27:18

しかしUE5はちょっと勉強してみようかなとも思いますがね。さっき言ってたようなカスタム頂点とかも使えるみたいだし。しかし私がやりたい映像表現でUE5を使うのはあまりにも勿体ないのではないか、機能をそれこそスポイルしてしまうのではという危惧があるのですわ。
どんな映像表現やねん😅

2022/8/7 10:29:55

そういうわけでUE5起動しようとしたらニュースに学習コンテンツが😁 https://t.co/UvfGYFCYTj

2022/8/7 10:31:28

そしてまだ使ってもいないのにいきなりアップデートしないといかんとは・・しかし激重で起動すらままならんのだった。私のマシンでは・・
だめだこりゃ😭 https://t.co/hKwmObpPi5

2022/8/7 12:19:59

がんばれゴエモンの演奏動画は削除することにした。ファンメイド作品は許諾していないし、かなり厳しく取り締まっているようなので。何か言われる前に削除しておこうと思った。ちなみにナムコの場合は条件はあるが許可しているとのこと。

POLICY │ パックマン ウェブ PAC-MAN WEB
バンダイナムコエンターテインメントのアーケードゲーム『パックマン』に関する情報を発信するオフィシャルサイトです。

2022/8/7 12:27:39

権利関係についてはコナミは普通の対応で、ナムコはかなり寛大。そういう違いがあるということですわな。利用する際は各社のポリシーもきちんと確認し遵守しないといかんわな・・

2022/8/7 12:30:15

ゲーム会社はJASRACに加盟してなかったりするから、YoutubeにBGM演奏動画をアップするっていうのも注意しないといかんね。。

2022/8/7 16:41:03

気を取り直してUE5のチュートリアルをやってみることにする。UnrealオンライントレーニングはUE4だったので、UE5ベースのものを見ることにした。

How To Make A 2D Game In Unreal Engine 5 (Beginner Tutorial) - YouTube
How To Make A 2D Platformer In Unreal Engine 5 (Beginner Tutorial)In Unreal Engine 5 They removed the 2d platformer template, in this video I go over how we ...

2022/8/7 16:51:00

ゲームキャラとしてMagicaVoxelのキャラを表示できればそれでいいのだが。ただボクセルをボクセルとして表示するのではなくて

1.1ボクセル=1ポイントスプライト
(ボクセルの拡縮はポイントスプライトの拡縮に置き換える)
2.Stacked Spriteで疑似3D表示する

のいずれかをやりたいんだな。

2022/8/7 16:56:07

1ボクセル=1ポイントスプライトで表示はこれですな。これはかなり前にWebGLで実験したものをキャプチャしたもの。なかなか独特な表現でいいなあって思ってる。しかしポイントスプライトって横/縦のピクセル数にハードによって上限があるけどね。youtu.be/ynbLDQx9slQ

2022/8/7 17:00:00

Stacked Spriteでの疑似3D表示ってのはこれですな。Voxelデータをスライスして、複数のスプライトで疑似3D表示するってものなのですが。

youtu.be/SmKfudntpsI

2022/8/7 17:03:53

今どきのハードならボクセルを立方体として積み重ねてレンダリングしても大したコストにはならんだろうとは思うのだが、どうも爺の貧乏癖みたいな、少しでも表現に対するコストを下げたいような無駄な欲望がいつも私の頭の中に出てきて先に進むのを妨げるんだよな😥

2022/8/7 17:05:36

しかしこのあたりあまり独自なものを取り入れるとせっかくのゲームエンジンの便利機能を損なう可能性があるので、できる限り避けるのが一般的には吉なんだろうけどね。まああの2Dでやろうって時点UE5を使うメリットをかなり損ないそうだけど😱

2022/8/7 17:09:09

さらにいうとライブラリや外部アセットが充実し、コミュニティも大きいUnityを使うほうが、ゲームを完成させる可能性は上がるわね。普通に考えて。

2022/8/7 17:19:21

DXライブラリあたりを使うってのもどうかなあって思ったりしてね。しかしこのライブラリも古くからあって、SWITCHとかもサポートするようになってるのか・・すごいな・・

No Image
DXライブラリ置き場 HOME

2022/8/7 17:20:07

OpenSiv3Dを使うっていう手もあるわなあ・・

No Image
Siv3D をはじめよう - Siv3D

2022/8/7 17:20:59

今の時代選択肢がありすぎて困るなあ😭
ものになるかどうかとは別の話にはなりますが😅

2022/8/7 17:37:15

OpenSiv3D使ってちょっとやってみたくなってきたな
これでやってみるか・・
どうなるかは知らん😅

No Image
Siv3D をはじめよう - Siv3D

2022/8/7 17:55:42

でも一応UE5のチュートリアルもやっておこう😅
なんという成り行き任せ・・
趣味ならではのものですな

2022/8/7 21:11:44

なんていいながらvs community editionとopensiv3dをインストールしてテストプロジェクトをビルド。
いやあvs使うのも久しぶりだし、C++使うのも久しぶりですな・・
とりあえずこれで環境は整ったということですな・・ https://t.co/N2sFTSNuH5

2022/8/7 21:16:21

まず教科書を一通り読みますか・・
そして自作音源とカスタム頂点&シェーダあたりの移植を進めてみよう。わたしごときがやりたいことなんてたかがしれてますからな・・

Siv3D リファレンス v0.6.5
◆ 内容
2D/3D ゲーム、メディアアート、ビジュアライザ、シミュレータなど、可視化やインタラクションに関わるプログラムを、驚くほど短い、楽しく簡単なコードで書けるモダンな C++ フレームワーク Siv3D のリファレンスです。

◆ 対応バージョン
OpenSiv3D v0

2022/8/7 21:19:16

しかしデモプロジェクトでサクッと絵文字が表示できてるのがすげえな。
絵文字からテクスチャ作るってのもサクッてできてるわ。 https://t.co/KtCpMUcuOa

2022/8/8 4:54:15

こういうrust製のゲームエンジンもあるんだなあ・・

Bevy - A data-driven game engine built in Rust
Bevy is a refreshingly simple data-driven game engine built in Rust. It is free and open-source forever!

2022/8/8 6:12:53

Siv3Dのチュートリアルをざっと読んだ。
いやあ、面白い。
C++の構文もえらく変わったなあって印象。開発者の方が積極的に新しい構文を使っているせいもあると思うが。わしのC++知識などほぼC++03で止まってますからな😅

Siv3D リファレンス v0.6.5
◆ 内容
2D/3D ゲーム、メディアアート、ビジュアライザ、シミュレータなど、可視化やインタラクションに関わるプログラムを、驚くほど短い、楽しく簡単なコードで書けるモダンな C++ フレームワーク Siv3D のリファレンスです。

◆ 対応バージョン
OpenSiv3D v0

2022/8/8 6:15:48

C++はgodot engineを去年あたりいじっていた時に波形メモリシンセをgdnativeで書いて以来っちゃあ以来だが。最近のSiv3dではオーディオ・バッファに直接書き込めるそうなので、これも移植できるなあって思うしね。何よりC++だと過去のライブラリの蓄積が強烈にあるしな。

2022/8/8 6:16:25

Cの古いライブラリも範疇に入りますからな。これが移植作業なしに使えるってのが嬉しいところですな。

2022/8/8 6:20:19

これがDynamic Audioのサンプルか。先ほどのサンプル・バッファに直接波形データを書き込めるってやつですな・・

zenn.dev/link/comments/…

2022/8/8 6:26:32

あとは独自な頂点フォーマットを使えるかだけど使えそうではある。2D限定だがカスタム頂点シェーダ・ピクセルシェーダを書くことができる。

チュートリアル 35 | 2D カスタムシェーダ|Siv3D リファレンス v0.6.5

2022/8/8 6:33:12

そもそも頂点シェーダは独自な頂点フォーマットを持つことはできるんだけど、ライブラリで図形描画するときには頂点フォーマットは固定しとかないとやっかいですからな。逆に言うと独自な頂点フォーマット持つとライブラリの支援が受けれなくなるかもしれん。godotなんかもそうなんだよな。

2022/8/8 6:34:32

ひょっとしたらテンプレートパラメータとかで、頂点フォーマットをカスタマイズできるようになっとるかもしれんけどね。これはソース読まんとわからんですな。そういうわけで、そのとっかかりになりそうなコードをまず読んでるところですわ。

OpenSiv3D/SivGraphics2D.cpp at e4ef5d9676f0048b3ce527779baaff3ad0d3059b · Siv3D/OpenSiv3D · GitHub
C++20 framework for creative coding 🎮🎨🎹 / Cross-platform support (Windows, macOS, Linux, and the Web) - OpenSiv3D/SivGraphics2D.cpp at e4ef5d9676f0048b3ce527779baaff3ad0d3059b · Siv3D/OpenSiv3D

2022/8/8 6:37:11

これはあくまでド素人の感想ですが、ジオメトリ・シェーダとかテッセレータとかは、こういうゲームエンジンの類ではカスタマイズまでサポートしてるっていうやつってない感じもするね。

2022/8/8 6:40:39

MagicaVoxelのData Readerはもうすでにあったりする。こういうのベースに自分用に改造するっていうのが楽でいいんだな。JSで作ってた時はこういうのを移植しなくちゃいかんのでそれがめんどくさいんだよね。まあemscriptenってのもあるはあるけど1ソースにそれはねえ・・

opengametools/ogt_vox.h at master · jpaver/opengametools · GitHub
A set of open c++ game development tools that are lightweight, easy-to-integrate and free to use. Currently hosting a magicavoxel .vox full scene loader. - opengametools/ogt_vox.h at master · jpave...

2022/8/8 6:41:43

まあゲーム用の独自言語(wasmにコンパイルするやつ)も忘れん程度に実装を継続しようと思いますがね。

2022/8/8 20:27:30

ソースコード読んでお勉強中。。
しかしC++の言語仕様の進歩もなかなかえぐいものがあるな・・

GitHub - Siv3D/OpenSiv3D: C++20 framework for creative coding 🎮🎨🎹 / Cross-platform support (Windows, macOS, Linux, and the Web)
C++20 framework for creative coding 🎮🎨🎹 / Cross-platform support (Windows, macOS, Linux, and the Web) - GitHub - Siv3D/OpenSiv3D: C++20 framework for creative coding 🎮🎨🎹 / Cross-platform support (...

2022/8/8 20:33:50

いやあしかしDX11とかかなり忘れちゃってるので、思い出すことに脳を使いすぎて疲れたからもう寝るとしよう・・
そう、歳をとると思い出すのも一苦労なのですよ・・

2022/8/8 20:36:56

コード読みばかりしてるとそれでもうお腹いっぱいになって放置してしまうので、そこそこのところで何かコードを書かんといかんのよね。お盆の連休中にカスタムシェーダに手をつけることができればいいんだけどもね。厳しいかもだけど😅

2022/8/9 18:45:13

このあたりのコードを読んでうんうん唸っているところ。DX11の概念すっかり忘れとるのでそこもう一度勉強しなおさんといかんな。しかし流れは大体わかった気もする。私がやりたいことをやるにはレンダラを改造せんといかんかもしれんのう・・

OpenSiv3D/Siv3D/src/Siv3D-Platform/WindowsDesktop/Siv3D/Renderer2D/D3D11 at main · Siv3D/OpenSiv3D · GitHub
C++20 framework for creative coding 🎮🎨🎹 / Cross-platform support (Windows, macOS, Linux, and the Web) - OpenSiv3D/Siv3D/src/Siv3D-Platform/WindowsDesktop/Siv3D/Renderer2D/D3D11 at main · Siv3D/Ope...

2022/8/9 18:47:24

私が今読まないといかんのはこれかも!

No Image
いまさらDirect3D11入門

2022/8/10 5:09:23

理解を進めるためにOpenSiv3Dをforkしてローカルに持ってくるとするかな・・ https://t.co/Z7gUE2M0kQ

2022/8/10 5:19:44

これビルドするのにVisual Studio使わんとvs codeのみでできんかのう・・

2022/8/10 5:20:17

msbuild使えばできたような気もするがな・・

2022/8/10 5:46:54

まずはvs codeのターミナルからDeveloper Powershellを起動するようにしてみるかな。 https://t.co/pl9H2LhgSF

2022/8/10 6:08:38

こういうPowershellスクリプトを書いてとりあえずビルドしてみることにした。

OpenSiv3D をPowershellコマンドラインでビルドするスクリプト · GitHub
OpenSiv3D をPowershellコマンドラインでビルドするスクリプト. GitHub Gist: instantly share code, notes, and snippets.
https://t.co/zWGxhQ4jHQ

2022/8/10 6:11:50

おお、いちおう動いとる・・ https://t.co/O2KOWcDTYZ

2022/8/10 6:27:00

あら、postbuildのxcopyでエラーが・・ https://t.co/S5wYiQeSgB

2022/8/10 6:35:32

もう一度ビルドすると今度は違うエラーが出たな・・ https://t.co/ba4Ldj5lqf

2022/8/10 6:36:44

これがコケとるようですな。ml64.exeへのパスが通っとらんようですな・・もしくはml64.exe自体がないか・・ないわけないわなあ・・ https://t.co/AI50y7OM2Q

2022/8/10 6:40:13

上がcmd.exe版のDeveloper Command Promptで下がPowershellのもの。下はどうやらml64.exeへのパスが通っとらんようですな・・ https://t.co/GXKOELRPgB

2022/8/10 6:47:54

とりあえずパスが通るように無理くりこれを突っ込んでみますかな・・ https://t.co/fsjiYT3u5A

2022/8/10 7:10:38

結局バッチで実行するのが簡単なのでこうなった・・

😭 https://t.co/2HrW14LD6X

2022/8/10 7:12:33

powershell版のDeveloper Command Promptて過去バージョンもそうだけどいつもこうなってしまうんだよなあ・・
私の環境が悪いのか、はたまたC#とかだと問題ないのか・・

2022/8/10 7:14:06

まああの、Visual Studioで普通にビルドすれば簡単なので、ふつうはそうしたほうがいいけどね😄

2022/8/10 7:15:05

ビルドできましたな・・ https://t.co/o8IDJgI2R6

2022/8/10 7:18:28

ビルドするとできるテストプログラムも動きますな・・
あとデバッグできるかどうかだが・・ https://t.co/F1cTqJxV2y

2022/8/10 7:25:58

このライブラリの良さをスポイルせずにうまいこと自分のやり方を組み込まんといかんのだけども、私の頭が悪いのでここでいつも挫折してる気もするな🤔

2022/8/10 7:26:33

自分のやり方ではないか、自分のやりたいことですな。

2022/8/10 7:40:48

とりあえずデバッグビルドのアタッチでデバッグできますな😊 https://t.co/csRb72gQur

2022/8/11 5:57:57

vs codeでやりたいのはcopilot使いたかったからだけど、vs 2022 でもサポートしてるみたいですな・・

2022/8/11 6:03:36

おお、3DだとInput Layout変更できるようになってそうだな・・
これでシェーダ+アルファを書くだけでライブラリ本体をいじらんでもよさそうですな😊 https://t.co/UJcib8FdYl

2022/8/11 6:05:23

私のようなポンコツは、自分の欲望のためライブラリの良いところをどんどん壊していってしまいがちですからな。そして壊していくとライブラリ利用による生産性もどんどん落ちていくからね・・

2022/8/11 6:06:41

そして「こんなんだったらライブラリ使う意味ないがな、自作じゃあああ」ってなって自滅すると😭

2022/8/11 6:11:26

1.自作が面倒くさいからライブラリ使う
2.ライブラリ使ってるから面倒くさいのだ!っていうおかしな状況に自ら追い込む
3.1に戻る

ってのを繰り返している気もするね😥

2022/8/11 7:52:36

ここちゃんと読んどこう・・

チュートリアル 36 | 3D 形状を描く|Siv3D リファレンス v0.6.5

2022/8/11 8:28:44

カスタムシェーダでポイントスプライトを使いたいが、どうやらDX11ではジオメトリシェーダなどでエミュレートしないといかんようですな・・
うむうう・・・🤔

GLSLでは簡単にできたのだが・・
GLSLに切り替えて試すっていう手もあるよな😄

2022/8/11 8:29:19

ポイントスプライトではなくてポイントリストで描く点の大きさを変えたいってことなんですが。

2022/8/11 17:33:12

外出から帰宅して引き続きどうするか検討中。
OpenSiv3Dの3Dシーン描画に倣って、MSRenderTexture に独自の自前なんちゃって3Dを描画するコードを書けばいいのではないかという考えに至り、その方向で試してみようと思っている。

2022/8/11 17:36:27

これもライブラリには手を入れずにできそうな気がしている。やってみないとわからないけどもね。

2022/8/12 6:10:24

しかし冗長な初期化コードを書かなくていいのは非常にありがたいな・・
サンプルコードもコピペしてコンパイルで動くし😄 https://t.co/WkrCy4iwMQ

2022/8/12 6:20:48

とりあえずこのMagicaVoxelで作ったしょぼいMyShipキャラをなんちゃって3Dレンダラでレンダリングするのを当面の目標とする。さてお盆休み中にできるだろうか・・ https://t.co/smQkbrEtMi

2022/8/12 6:24:14

これWebGL2で作ったやつだけど、これをOpenSiv3Dに移植するっていうことですな。JSで作ったものをわざわざC++ネイティブな環境に移植する人も珍しいのではないだろうか😅
youtu.be/ynbLDQx9slQ

2022/8/13 15:40:15

opengametoolsを見てたらMagicaVoxelデータをメッシュに変換する関数も備わっていたので、それを使ってコードを書き足してOpenSiv3Dで表示してみたところ。
ボクセルごとの色は、シェーダのInputLayoutを変えて頂点ごとに渡さんといかんだろうなあって感じ。

GitHub - jpaver/opengametools: A set of open c++ game development tools that are lightweight, easy-to-integrate and free to use. Currently hosting a magicavoxel .vox full scene loader.
A set of open c++ game development tools that are lightweight, easy-to-integrate and free to use. Currently hosting a magicavoxel .vox full scene loader. - GitHub - jpaver/opengametools: A set of o...
https://t.co/huIs1kKQdG

2022/8/13 15:49:48

3Dでも抽象レイヤではInputLayoutを変えることができなかったので、そこは考えないといけなくなってるんだな。実装方法を探るために、このメッシュを使ってカスタムInputLayoutを使ったRenderTargetへの描画コードを書いてみることにする。

2022/8/13 15:57:55

もしくはパレットの色データをそのままテクスチャにしてuvで色を指定するみたいにすればそんなことしないでも済むかもしれんですな・・

2022/8/13 16:04:13

u -> パレットインデックス/パレット数
v -> 0固定

というuv座標にして、テクスチャは横がパレット数の幅、縦が1pixelっていうのを用意する。テクスチャのそれぞれのピクセルはそのインデックスの色データ(rgb)をいれておく。

2022/8/13 17:10:36

作者よりいろいろ助言いただいて恐縮しているところ。今までのコード読みでの理解がずれてないっていうことが分かってよかった。

2022/8/14 7:48:11

パレットインデックスをu、vは0固定にセットし、パレットカラー情報をテクスチャにて描画してみたもの。しかしこのv情報は冗長で、InputLayoutでカットしたいところではある・・それくらいいいじゃないかとも思うがまあ貧乏性なもので・・😅 https://t.co/jNPEhmqRza

2022/8/14 7:52:29

結局アラインメントやらなにやらでどうでもよくなったりもするんだけどね。また1ボクセルに1cube分の頂点を割り当てるのももったいないというかね。ここに趣味ならではの妙なこだわりがあるのですな。さらに1ボクセル=1ポイントスプライトとして描画して独特の雰囲気も出したいというね。

2022/8/14 7:57:36

HLSLではポイント・リストで描画するとき、点の大きさを指定することができないようだ。なのでジオメトリ・シェーダーでエミュレーションしないといかんようですな・・

2022/8/14 8:08:11

1ボクセルレンダリングするのに12の三角形が必要で、それがボクセル分必要だとカリングやインデックスバッファで最適化されるにしてもデータとしてはGPUに置いとかないといけないし、1キャラにこれだけの三角形を使うのは非常にもったいない気がするんだな。これが8ビットPC脳のおっさんの思考ですな😰 https://t.co/er2g7fRp40

2022/8/14 8:17:09

要するに私のくだらんアイデアというのは

・1ボクセル分の中心座標=1頂点
・1ボクセル分の法線ベクトルは1個だけ
・ボクセルごとに色情報を持ち、ライティングはボクセル単位で
・1ボクセルは1ピクセルとして、Z座標をもとにピクセルサイズを可変させることで疑似的に立方体を描画

なんですな

2022/8/14 8:19:38

もはや現代のPCではこんな変な手法をとる必要はなくて、もっと富豪的に考えないといかんのだが🤔

2022/8/14 8:48:42

狙ってる画像表現というのはこれくらいのレトロなもので、解像度も低い。が、このころのキャラはすべて手書きでアニメーションしているので、これを今回の画像表現で置き換えてみようと考えている。
恐ろしくニッチですな😅
youtu.be/w4pg_SsXgZY

2022/8/14 8:53:04

しかし別にキャラを事前レンダリングしておいて、スプライトとして表示するほうがもっとコスト低いかもですがね😅

2022/8/14 8:55:58

まあしかし、私のようなおかしな画像表現が実現できることで分かるように(笑)、現代のGPUは自由度が非常に高いってことなんですな。もはやリアルタイムでレイトレーシングまでもが可能な時代。それと真逆なこともやれるってことですわな(笑)

2022/8/14 15:52:40

うむう・・私のような「しょうもないこと」をやろうとするとOpenSiv3Dは手に余るなあ・・私のようなヘタレにはもうちょっと低レベルなライブラリが必要なのかも。しかしこの手軽さは素晴らしいな。このようなライブラリを設計・リリースできる人はほんと尊敬しますなあ・・

2022/8/14 17:14:29

しかしこの「しょうもない表現」をなんとかこのライブラリ内に押し込むことができれば、それ以外の部分はライブラリにべったり依存して楽したいという思いも強いのであった・・

2022/8/14 17:18:53

しかし現代ではゲーム・エンジンも多数存在しており、自分の要件にできる限りフィットするものを探し続けるのもありっちゃあ、ありだが。Vulkanベースで検索してみるとこんなのを見つけたな。おそらくはOpenSiv3Dほどの手軽さはないと思うが・・

GitHub - EQMG/Acid: A high speed C++17 Vulkan game engine
A high speed C++17 Vulkan game engine. Contribute to EQMG/Acid development by creating an account on GitHub.

2022/8/14 18:06:20

しかしまあ、ライブラリも一応forkしてコンパイルできるようにしてるので、そっちからのアプローチでやってみるかあ・・

2022/8/15 7:38:17

forkしたOpenSiv3Dの中にゲーム用のプロジェクトを作って、そこでカスタムレンダラを作ってみようと思う。そうすれば所望のことは行えると思うので。

2022/8/15 7:40:48

RenderTextureに対してカスタム入力レイアウト+カスタムシェーダでレンダリングするっていう方法でやろうかなと。

2022/8/15 8:48:14

これで私の初心者丸出しポンコツコードで元ライブラリを汚染しないで済むな😄

2022/8/15 17:35:23

OpenSiv3Dのライブラリコードを参照しながら、なんちゃって3Dの.voxレンダラを書いてるところ。C++忘れてるところ多し😭
遅々として進まん・・
しかし進化してますよC++もねえ https://t.co/U7pF3OhiV0

2022/8/15 17:37:53

しかしようやくGPUメモリにセットする入力データへの変換が終わったところ。あとHLSL書かないといかんねえ・・
GLSLとHLSLって似たようなもんっしょ!って思ってたけどやっぱりちと違うねえ・・
考えが甘い😢

2022/8/15 17:39:02

PSIZEっていうセマンティクスが使えれば万事解決なんだけど、DX11ではサポートしてないみたいですな。なのでジオメトリシェーダでエミュレーションしないといかんみたいだ。

2022/8/15 17:51:16

1頂点の情報はこんな感じ。サイズは16バイトで頂点の位置とカラーパレット、隣接面情報となっている。しかしHLSLで入力情報に整数を含めることができるかどうはまだ調べてないという😅
WebGL2.0のGLSLではできたけどね。 https://t.co/LffGkP8qVa

2022/8/15 17:52:08

あとジオメトリシェーダなんていう高級なものは使ったことがないので、そこも勉強せんといかんのですな。

2022/8/16 15:07:49

とりあえず点を描こうとしてPS/VSを書いているところ。HLSLだと行列とベクトルの積はmul()を使うのかあ・・

2022/8/17 7:58:19

ようやくPS/VSを書き終えて、render()メソッドを書き終えたところ。動かしてみると黒い点が真ん中に表示されるのみ😥
定数バッファに何も値をセットしてないので当たり前ですが😅
2D描画できてるので、ライブラリと私のなんちゃって3D表示の共存に問題はなさそうである。 https://t.co/gBPJRVDvT3

2022/8/19 7:08:30

なぜかハマってしまい進まない。OpenGL ESからDX11へ移植するだけなのだが。どこかで凡ミスを冒してるのだろうと思う。昨日VS2022のシェーダー・デバッガの存在を知り、四苦八苦してようやく動かせるようになった。これを使えばデバッグが少しは捗るかな・・ https://t.co/e5qG5Qm7fw

2022/8/19 7:10:22

しかし、シェーダー・コードがステップ実行できるようになっていたとは・・
すごいですなあ・・

2022/8/19 8:05:46

あれ、定数バッファの値がおかしいですな・・この行列は今の時点では単位行列の値のはずなのだが・・
なんかずれとる感じがするな。アラインメントの問題かなあ・・ https://t.co/qGA6QIhnnl

2022/8/19 8:50:02

うむう・・どうやらアラインメントの問題っぽいなあ・・データサイズ削ろうとしていらない成分をカットしたことが裏目にでとるようじゃのう・・😅
定数バッファは128bit(16バイト)アラインメントのようですな・・

2022/8/19 10:07:18

ようやく表示できたな・・
やはりアラインメントの問題だった・・
WebGLのUniform変数だとあんまり気にしなくてよかったところ・・
しかし11x11だとさすがに小さいな・・ https://t.co/sir08reJpP

2022/8/19 10:09:37

11x11x11のボクセルだと、11x11x11pxで表示されるんですわ。あとはZ座標の位置関係でピクセルを拡大しないといかんのですな。これはPSIZEで変化してほしかったがやはりダメでしたな・・
ジオメトリシェーダ書かんといかんみたい。知らんけど😅

2022/8/19 16:45:35

ここまでの成果をアップ。レトロPC風に3Dキャラを表示できているっちゃあできている。先ほど「なんちゃってライティング」の計算に考慮不足があることがわかり、どうしようか思案しているところ。
youtu.be/Im7uZi6CLDs

2022/8/19 16:47:59

ちなみに仮想画面は160x100にしている。11x11x11pxのキャラだと256x192だと細かすぎてよくわからんので😥
もうちょっとキャラはおおきくしないとなあ・・24x24x24くらいにするかな・・

2022/8/19 16:55:16

なんかちょっとエクセリオンのキャラに似ていなくもないな・・😅 https://t.co/hRInXYYPZh

2022/8/19 16:56:19

しかしこの時代に256x192pxだと細かすぎるとかおかしいな😁

2022/8/19 16:58:14

なんでかわからんがMSXのグラ2をオマージュしたゲームを自分で作って自分で遊びたい欲望に駆られており、しばらくはゲームつくりの真似事を続けると思う・・

youtu.be/w4pg_SsXgZY

2022/8/19 17:12:34

ライティング後のキャラの色も階調を抑えて256色くらいになるようにせんといかんね・・

2022/8/19 17:16:06

Reaperで作ってたPSG風音源も一応完成したのだけれど、これにSCC風な波形メモリのオシレータを付加して、ReaperでBGM作ってそのデータをゲームで再生しようかなとも思ってるんだよね。

Reaper DAWのJSFXでPSG風音源を作る(5)ピッチEG・LFOの実装 - YouTube
ReaperのJSFXでPSG風音源を作っており、その途中経過をアップしています。ピッチEGとLFOができたので、リズムも入れたデモ曲(いい加減なものですが)を作って演奏してみました。高音になると若干音痴になるところがPSGっぽくていいですね。

2022/8/19 17:25:23

しかしオマージュとはいえ、まったく同じものを作るつもりはなくて、マイシップのウェポンシステムにしてもグラ2を参考にするけれどもオリジナル要素を入れないといかんわなあって思いますな。こんなおっさんにオリジナルな要素をひねり出す脳があるとは到底思えんが🤔

2022/8/19 17:31:21

昔のゲームみたく1枚1枚ドット絵で綺麗に描く能力は残念ながら私にはなく、大きな壁のひとつなのだが、MagicaVoxelでなんとかモデリングすれば優秀なライブラリと自作へなちょこ3Dレンダラでその壁は越えられそうではある。その他に壁はいくつもそびえたっているけども😭

No Image
MagicaVoxel

2022/8/20 15:30:57

なにやらまた不具合に見舞われていて、シェーダーデバッガのお世話になっている。回転すると陰面となって出てくるはずのない面(実際はPoint Listで描いているので点だが)が表に出てきてしまうというバグである。凡ミスだと思うのだが。
しかしこのVS2022のシェーダーデバッガはすごい https://t.co/foEEq6I4qO

2022/8/20 15:34:53

描画をキャプチャしてバグってるおかしなピクセルをクリックするどういう入力データでシェーダーがどう処理したのかが一目瞭然にわかる。そしてシェーダーをステップ実行することもできる。これで追っかけるとZバッファに書き込まれているZ値がおかしいことが分かった。 https://t.co/zsivWaCUCl

2022/8/20 15:37:52

なんでZ値がおかしな値になっているのかはわからんけども😅

2022/8/20 15:43:05

どうもねえ。シェーダの入力・出力変数におけるセマンティクスの働きが、わかっているようでわからん感じなのよね。いまいまは。ちなみにGLだとこういうのなかったのでね。今はなんかチュートリアルやらサンプルにならって適当につけている感じ。それもいかんのかもしれんね。

2022/8/20 15:45:39

表示はX軸・Y軸の回転で発生し、Z軸の回転では起こらない。とすると回転行列あたりの計算でZ値がらみのところで、何か凡ミスをやらかしてるんだろうなあって思うんだけどもね。

2022/8/21 8:19:48

どうやらいろいろ試してみた結果、Depthバッファに何も書き込まれていないような状況になっているみたい。というのもOMSetRenderTargetsにデプスバッファをセットしようがしまいが、描画結果が変わらないので。なんでそうなっているのかはわからないが。

2022/8/21 8:31:17

うーむ。どうやらID3D11DepthStencilStateを設定するのを忘れてるだけのような・・ちょっと試してみるか・・凡ミスの可能性大・・

2022/8/21 8:32:56

しかしいろいろやること多いわ。DX11までレイヤを下げてしまうとね・・DX12だともっとややこしいみたいだからね・・

2022/8/21 8:33:46

OpenSiv3Dを普通に使う分にはいっさいやらなくていい作業ですわ😅

2022/8/21 10:02:58

やっぱりID3D11DepthStencilState設定するの忘れてただけだったあああ😭

2022/8/21 10:03:26

アホ丸出しで申し訳ない😭

2022/8/21 18:27:07

というわけで「適当ライティング」が一応の完成をみた気がしたので、ここまでの成果を動画にしてみた。
ドット抜けする部分はピクセルを拡大することによって塞ごうと思っている。ピクセルを拡大するにはジオメトリシェーダを使おうと思っている。

youtu.be/kMWYkZQXAXY

2022/8/21 18:32:08

1voxel=1pixelとしてレンダリングするとどうしてもドット抜けが出てしまうんだよな。そこを埋めるために適当ピクセル拡大ロジックを頂点シェーダーに実装してピクセルの大きさをジオメトリシェーダーに渡し、それでジオメトリで頂点を追加して埋めようという算段なんだけど、うまくできるかな🤔

2022/8/21 20:55:55

まずマイシップのキャラクターデザインを考案中。16X16X16のサイズにしようと思う。 https://t.co/gKU5wj8bMP

2022/8/22 6:58:32

何もしないジオメトリシェーダーを間に挟んでみた😅
とりあえず動きましたな・・ https://t.co/ziSSdS6TbE

2022/8/22 7:00:01

これくらい小さいキャラだと1voxel=1pixelでもまあいけると思うけど、でかいキャラだとそうはいかん気もするんだよね。。

2022/8/22 7:17:48

大きなオブジェクトをレンダリングしてみるとドット抜けがはっきりする。その位置におけるピクセルの大きさを計算で求めてジオメトリシェーダでごにょごにょして隙間を埋めんといかんのですな。 https://t.co/4q94t0hT2P

2022/8/22 7:19:26

シャドウマッピングぐらいはしないとライティングだけではちとつらい気もするけど、まあいいか・・

2022/8/22 7:20:35

まあしかし、こんな変なレンダラを書くのは私くらいであろう😁

2022/8/22 7:23:28

しかしこんな基本的なプリミティブを描くところでこんなに時間を費やして大丈夫かなと私自身思う😥

2022/8/22 7:33:23

しかしZバッファも今やfloat型が当たり前っぽいですなあ・・昔のように精度が低いので丸められてどうのこうの・・ってのはあまりないようですな・・

2022/8/22 21:01:55

頂点シェーダで適当なアルゴリズムでピクセルサイズを計算してジオメトリシェーダに渡し、そのサイズをもとにピクセル頂点を生成してみたところ。すきまはうまいこと塞がったように見えるがオブジェクトを拡大するとまたすきまができる。 https://t.co/hVEl2hkNVP

2022/8/22 21:05:02

オブジェクトを5倍に拡大してみたところ。すきまができていることがわかるだろう。ピクセルサイズの生成アルゴリズムがいい加減すぎるからだろうね。もうちょっと精度のいいものにしないとまずいわな🤔 https://t.co/4BgjRpIa4z

2022/8/23 6:37:32

ようやくできた感じ。拡縮してもスキマは埋まる(笑)
結局こうなった。

・1voxel=1pxとして頂点座標を受け取り、VSで座標変換、ピクセルサイズを求める
・GSで頂点データとピクセルサイズで1ビルボード(6頂点3角形2枚)を生成する

youtu.be/hl_tDeV05GY

2022/8/23 6:41:13

ポリゴンによる3Dレンダリングに至るまでの過渡期に発生した手法によるグラフィックスのようなものが実現できそうだ😊

youtu.be/hl_tDeV05GY

2022/8/23 6:43:18

しかしこのOpenSiv3DのSimpleGUIはめちゃくちゃ簡単にGUIが構築できるので良いですな。
C++であることを忘れてしまう😁

チュートリアル 11 | GUI|Siv3D リファレンス v0.6.5

2022/8/23 6:44:16

リソースエディタからのAPIゴリゴリ書きUI構築の時代からすれば隔世の感あり😭

2022/8/23 7:49:00

ちょっとライティングのアルゴリズムを変更して、フリーのモデルをレンダリングしてみた。ボクセル的な風情が出ている気もする妙なレンダラができたな・・ https://t.co/BJa9oXKiKq

2022/8/23 7:51:36

まあこれ、単一のキャラを読み込んで動かせる実装レベルなので、複数キャラを読み込んで動かせるようにしないといかんですな。しかしグラフィックスとしては一段落した感じ。

2022/8/24 18:33:54

とりあえずここまでの成果をアップ。次は音源作りにとりかかろうと思う。
youtu.be/CwR21SpJRZA

2022/8/25 4:08:21

さてReaperのJSFXで作ったPSG風音源にSCC風のオシレータを追加したオリジナル?音源を作り、Reaperで作った楽曲をゲーム・システムに取り込んで鳴らそうと思っている。音源はコア部分は形になるまで実装するけどエディタでいつも挫折するので😭、今回はそこはReaperにゆだねようと思っているのだ。

2022/8/25 4:13:20

かつてはgodotでゲームを作ろうとして、音源をGDNativeで作り、そしてエディタを作ろうと少し頑張っていた。シーケンサーを作ってある程度形になったところで放置してますな・・
youtu.be/uoza8GTJI2k

2022/8/25 4:18:08

ベースは波形メモリ音源なのだが数式で波形を作り、メモリを埋めるようにしてたようですな。FM方式の数式で作るとFM音源みたいな音が鳴るんで、これはええなあってなってたようなんですが😅
しかし去年のことなのにあんまり覚えてないな😭

youtu.be/x2M3WCxWbIw

2022/8/25 4:20:43

godot engineでゲーム作りを頑張ろうとしてたが、グラフィックへの妙なこだわりでカスタム頂点レイアウトを使おうとしてできないことがわかり、一気にgodotで作るモチベーションが萎えてしまったようだ。

2022/8/25 4:23:45

godotはgdscriptというpythonに似た言語で作る。やはりツールとしてとてもよくできているけど、私のような妙なこだわりを持ったおっさんには合わんかっただけですわ。4.0になるとvulkanベースになるんで状況は変わるかもしれん。でもやっぱり頂点レイアウトっていろいろなものの土台になるものなのでね

2022/8/25 4:26:24

そこ自由に定義できるようにしてしまうと、ツールとしてシンプルにわかりやすく作れなくなってしまうんだろうなって思うし、頂点レイアウトもまあデファクトみたいな形が出来上がってるしね。

2022/8/25 4:28:12

そこはこだわるところでは本来ないのだと思うな。私の場合は変わり者ってだけでね。

2022/8/25 4:52:53

昨日はコード書く前にmameのSCC(051649)のコード読んでたんだけど、オシレータ部分はものすごくシンプルですわ。SCCって波形メモリのビット幅は8bitなのですな・・ナムコだとマッピーあたりだと4bitだったりしますな。PSGとの親和性を重視した設計もうかがえますな🤔

mame/k051649.cpp at master · mamedev/mame · GitHub
MAME. Contribute to mamedev/mame development by creating an account on GitHub.

2022/8/25 4:54:34

なのでオシレータとして加えること自体はたやすいですわ。ピッチのパラメータも同じだし。ということは高音で音痴になるのも同じってわけですな😄

2022/8/25 4:57:21

まああのまんまSCCというわけではなくて、オシレータやピッチの方式をまねてトラックあたり8ポリで鳴らせるようにするんですが。昔っぽくトラック少なく鳴らすのはそれはそれでできるしね。まずはそれをJSFXで実装して鳴らせるようにしようかなと。

2022/8/25 4:58:31

でReaperでテストデータを作り、それを読み込んでOpenSiv3D上で鳴らすものを作ろうかと。

2022/8/25 5:02:55

Reaperのプロジェクトファイルはテキストファイル。データフォーマットは独自っぽい。文字列をダブルクォートで囲まれてるところだけ注意して、スペースと改行でトークンを分割できそうですわ。ブロックは「<」「>」で囲むようだ。 https://t.co/H0qL29VqKi

2022/8/25 5:05:36

OpenSiv3Dではこれ使おうかなと思ってますな。

AudioStream (DynamicAudio) · Issue #736 · Siv3D/OpenSiv3D · GitHub

2022/8/25 5:07:02

サンプルはこれですな・・
zenn.dev/link/comments/…

2022/8/27 6:38:40

ReaperのJSFXで作ったPSG風音源をベースに波形メモリをプラスしたものを作ってる。今EEL2で書いたコードをC++に置き換えてるんだけど、今後を考えるとゲーム側とReaper側のコードを共通化しないと変更が面倒くさいなあって思ったんだよね。

2022/8/27 6:43:19

共通化案としては

1.EEL2コンパイラはOSSなのでゲーム側にコンパイラを取り込み、jsfxをゲーム側でコンパイルして使う

2.今作っているC++コードをベースにVSTを作ってReaperで使う

の2つあって、1.のほうが面白そうではあるけれど、2.でいこうかなと考えた。

2022/8/27 6:48:19

音源のコアなコードはできる限りC++標準ライブラリなどを使ってライブラリに依存しないようにして、ゲーム(OpenSiv3D)とReaperで共用できるようにしようかなと。VSTプラグインはこのライブラリで作ろうかなと考えている。

GitHub - iPlug2/iPlug2: C++ Audio Plug-in Framework for desktop, mobile and web
C++ Audio Plug-in Framework for desktop, mobile and web - GitHub - iPlug2/iPlug2: C++ Audio Plug-in Framework for desktop, mobile and web

2022/8/27 6:49:08

今のところはだけどね。

2022/8/27 6:50:26

VSTもかつてはSDKのみで作ろうとしてたこともあったよなあ・・もう完全に忘れたわ😅

2022/8/27 9:33:11

iPlug2のセットアップが終わり、サンプルプロジェクトをビルドしてみた。そしてReaperで動かしてみた。おおお、比較的ここまでは簡単にできましたな。
このプロジェクトをベースに作ればいいな😀
ここからはそうはいかんかも🤔 https://t.co/DCB9byNqo0

2022/8/27 9:34:31

まあしかしものすごく簡単かつ原始的なものですからな。私が作ろうとしてるものは😅
なのでまあいけるかなと

2022/8/27 16:46:22

IPlug2を勉強中。これはすごいな。VST作るために必要なものがほぼ揃っとりますな・・
あかん。これは高機能すぎて学習コスト高いかもしれん。時間がかかること必至・・
まあでも私が作ろうとしてるものは原始的なものですから😅

2022/8/27 16:50:46

話ちょっとずれるけど、constexprでSin関数テーブルをコンパイル時に作れるのはたまげたよなあ・・C++14くらいからできたみたいだけど・・
ただsin関数はテイラー展開だか、マクローリン展開だかで作らんといかんみたいですが、それにしてもすごい時代になりましたな。 https://t.co/tUQ28aWerQ

2022/8/28 6:58:26

IPlug2の中身を知れば知るほど、このフレームワークに沿って音源作ってゲームで使うほうがいいのではないかという気持ちが大きくなってきている。

GitHub - iPlug2/iPlug2: C++ Audio Plug-in Framework for desktop, mobile and web
C++ Audio Plug-in Framework for desktop, mobile and web - GitHub - iPlug2/iPlug2: C++ Audio Plug-in Framework for desktop, mobile and web

2022/8/28 7:00:48

VST3もSDKはGPL3とプロプライタリ・ライセンスというデュアルライセンスだったりするんで、慎重に使用せんといかんし。まあこれはしかし音源をVST3としてバイナリもしくはソースで公開する場合に限る話ではあるが。私はそのつもりはないけども。

2022/8/28 7:07:30

できればこうできればいいのだが

・game側はiPlug2をライブラリとして使う
・Reaper側で使うときはExtensionとして作る
(ReaperでExtensionをFXやInstrumentで使えるのかはまだわからんが・・)

ちなみにiPlug2自体のライセンスは非常に緩い

iPlug2/LICENSE.txt at master · iPlug2/iPlug2 · GitHub
C++ Audio Plug-in Framework for desktop, mobile and web - iPlug2/LICENSE.txt at master · iPlug2/iPlug2

2022/8/28 7:10:33

MIDIデータの受け渡しとかVoiceアロケーションとかEGとかLFOとかOSCとかフィルタとか、おおよそソフトシンセを作るのに必要なものは全部iPlug2に備わってるんだよね。こりゃたまげましたわ。

2022/8/28 14:54:13

iPlug2のサンプルプロジェクトのソースコードを読んでる。内容が示唆に富んでおり、読んでわからないところを調べるだけで1日を終えそうですな😅
おおよそソフトシンセつくりにおけるツボのようなものはこのライブラリがおさえてくれてるっていう理解で間違いなさそうだ・・

2022/8/28 15:00:56

iPlug2はVST2or3/AAX/AUのプラグインが作れるってだけでなくてスタンドアローンのアプリも作れるんだよね。なのでホストアプリケーションを作るためのコードも内包しているし、その場合プラグイン自体もiPlug2独自のプラグイン(IPlugAPP)となるみたい。

iPlug2/IPlugAPP.h at master · iPlug2/iPlug2 · GitHub
C++ Audio Plug-in Framework for desktop, mobile and web - iPlug2/IPlugAPP.h at master · iPlug2/iPlug2

2022/8/28 15:10:21

なのでゲーム側でIPlugAPPをホストするコードを書けばいけそうな感じがしてきたな。Reaperでゲーム用の楽曲を作る場合にはVST3に仕立てないといけなさそうではある。IPlug2はReaperのExtensionも作れるのでこれ使うとどうかな?ってところはある。今のところはできなさそうな感じがする。

2022/8/28 20:16:56

というわけでまずはJSFX(EEL2)で作ったPSG風音源をVST3で作り直してReaperで動かすことを目標に頑張ろうかなって思う。今週中くらいでできるかなあ・・
youtu.be/kE1wePKovm8

2022/8/28 20:19:41

まあしかしiPlug2を知ったおかげでReaperのExtension作りの敷居も下がった気もする。Reaperで作ったデータをReaper側でゲーム用のオリジナルファイルとして出力するなんてこともExtension使えばできるみたいだしね。まあこれはReaScriptでもできることだが。しかしReaperはカスタマイズ性がえぐいな。

2022/8/28 20:21:06

.rppファイルをゲーム側で読み込むコードを作るのはちょっと面倒だし、不要な情報もいっぱいあるからね。ゲーム用に必要な情報だけをエクスポートするほうがいいもんね。

2022/8/28 20:23:55

copilotも使用期限が来たみたい。テクノロジー・プレビューが単に期限まで使えてただけだった・・😭
まああの便利に使わせてもらってたところもあるけど、copilotがサジェストしたコードをキャンセルしたり手直しするのも結構やってたから、生産性上がってたかというとどうなんだろうなあ・・

2022/8/28 20:27:51

・グラフィック作成ツール→MagicaVoxel
・BGM・効果音作成ツール→Reaper

という組み合わせでゲームに必要なアセットを作るツールはいけそうですな・・

2022/8/29 19:33:29

C++の構造体の初期化もこんな感じで書けるようになったのも驚きですわ・・しかもスタティック変数もヘッダで初期データの定義できますな・・すごいなあ・・
指示付き初期化というそうですが。 https://t.co/imgyoR35Hi

2022/8/29 19:37:16

JSを経たせいなのかどうかわからんけど、標準コンテナ使ったりするのも抵抗がなくなってるし。まあこれは自分自身の変化ではあるけれど😅
メタプログラミングとかもconstexprの登場でかなり楽になってるしなあ。すごいなC++。。
しかし今だにムーブ・セマンティクスは理解しているとはいいがたい😭

2022/8/29 19:38:55

多分rustとかのほうが言語としてはスマートなんだろうけど、このC++の混沌とした言語仕様は私のような変わり者にはすごく魅力的に映りますわ。

2022/8/29 19:40:43

まあどちらがいいかとかはさっぱりわかりませんが😅
言語は進化し続けるので、私は永遠に初心者のままかもなあ😊

2022/8/29 21:13:55

ライブラリのテンプレをベースに、UIを構築中。地味だ・・
しかしiPlug2のレイアウトシステムはよくできている。かなりわかりやすい気がする。ここまではだけど😅 https://t.co/mLL8bAXUta

2022/8/30 6:22:55

一通りUIパーツを並び終えた。
GetGridCell()が使いやすいなあ😄 https://t.co/lGueOmzeqh

2022/8/30 6:59:23

単独アプリとして音が鳴るようになったので動画にしてみた。がトランスポーズが変ですわ😅

youtu.be/tMP23WO5aeo

2022/8/30 8:01:21

VST3としてコンパイルしてReaperで読み込んで鳴らしてみた。いけますな😄
youtu.be/l9WDcBfIjfI

2022/8/30 20:37:03

バッハのこの曲がなんか聴いてるうちに良くなってきてちょっとアレンジしてみた。といってもPSG風音源を2個使って左右に振り、リバーブをちょっと効かせただけですが😅
なかなか重厚なサウンドになったかも。

youtu.be/1PTTq14zPAA

2022/8/30 20:40:57

30年以上前、X1という8ビットPCで3音同時に使って音作りしてたときはこれがポリで鳴ればなあ・・って思ってたんだよね。
まあちょっと夢が叶ったかも😊
続いて波形メモリオシレータを作ろう・・

2022/8/31 17:44:45

波形メモリオシレータを追加したので演奏動画をアップした。いうても適当にいじってるだけですが。
波形メモリの編集機能はIVMultiSliderControlで実装してみた。これ使うと簡単にできましたわ・・

OpenSiv3D でゲーム製作(8)ゲーム用音源を作る(iPlug2)~波形メモリオシレータを作っていじる~ - YouTube
OpenSiv3Dでゲーム製作を行っていて、その途中経過を動画にアップしています。現在はゲーム用のBGM/効果音用のPSG風音源をiPlug2というライブラリで作っているところです。今日は波形メモリオシレータを作ってみました。音源をいじった動画をアップします。SCCっぽい音が鳴りますが、本物にこだわってはいないの...

2022/8/31 20:38:09

しかしこのiPlug2のレイアウトシステムはよくできてますわ・・OpenSiv3Dもそうだが、このような優秀なライブラリの制作者にはほんと頭が下がりますな。

2022/8/31 20:40:20

特に感心したのはIRECTのGetGridCell()メソッドですわ。RECTっていうものはほんと古くからある構造体だけど、こういう風なアプローチでやれば扱いやすく、わかりやすくなるんだなあって思ったな。

2022/8/31 21:21:07

このコナミドラムの解析がすごい。

No Image
コナミドラム

2022/8/31 21:31:45

おお、ReaperでiPlug2で作ったPSG風音源のパラメータ見るとWaveTableも全部スライダーになってるな。とするとオートメーションで波形メモリを変更できるってことですな。しかしこのプラグイン(ゲーム側ではVST3ではなく単なるクラスだが)を演奏するエンジン作るのがまた大変ですな。 https://t.co/ycugY6Wv1E

2022/8/31 21:33:06

Reaperのオートメーションもゲーム・エンジン側でサポートするとなるとですけどね。

2022/8/31 21:35:14

しかしここまで作ってきて、C++の環境も相当よくなってるし、ライブラリも充実してて私のような永遠のビギナーでも苦も無くVST3を作れる(とは言え私のはかなり原始的なものだが)時代になったのだなあって感動してますわ・・

2022/8/31 21:40:20

今のPSG風の音源は矩形波もしくは波形メモリ3音+ノイズ使って音色を作り、それをポリで鳴らすって設計にしてる。波形メモリは3音それぞれ別々の波形を割り当てることができるようにしないとな。

2022/9/2 20:27:02

とりあえず今の画面・・
波形メモリは32音色分用意し、それを選んでエディットする。オシレータはPSG風のオシレータ+ノイズか、波形メモリを選ぶ。波形メモリを選んだら32個の波形メモリから1つ選ぶ。 https://t.co/NHgr56jt32

2022/9/2 20:29:27

あとピッチ・エンベロープを付けたらいったん完成としようか・・アンプ・ピッチモジュレーションはChA~Cそれぞれ個別に設定できたほうがいいのかもしれんな・・

2022/9/2 20:30:09

Reaperでこの音源使ってコンポーズしたデータをゲームで鳴らすドライバも作らんといかんもんね・・

2022/9/2 20:32:04

しかしほんとiPlug2のレイアウト・システムはよくできてると思いますわ・・なんども繰り返すようであれですが😅

2022/9/3 7:45:00

かなり昔から考えていることがあって。SIMDを使って複数チャンネルの処理したいなってやつなんだけど。
AVXだとfloatで8CH同時に処理できそうなんでね。

2022/9/3 7:47:58

いまいまの考えだと、1音あたりオシレータが8つあって、それを16音ポリくらいで鳴らすイメージなんですが。そしてオシレータごとにMIDIチャンネルを割り当てて、対応したMIDIチャンネルのオシレータだけ音が鳴るようにする。まあちょっとへんてこなマルチティンバー音源みたいな感じなんですが。

2022/9/3 7:50:39

SIMD使って、1音分の処理で8パート分の処理をするってことなのだが。私が作るBGMなんていうのは8パートもあれば十分なわけで。

2022/9/3 7:55:39

まずはプロトタイプとして、8オシレータでオシレータそれぞれにピッチEG・アンプEG・ピッチLFO・アンプLFO・ゲイン(ボリューム)がコントロールできるようなものをスカラで作り、それをベクトルかするようにしてみようと思う。ベクトル化しなくても普通に負荷なく動くんだったらそれでいいし😅

2022/9/3 7:56:58

こういうふうにしたほうが、ゲーム側で扱いやすい気がするんですな。

2022/9/3 7:57:27

とはいえ一般的な話ではなく、あくまで私が作ろうとしているゲームでの話ですが😅

2022/9/3 8:00:17

SIMDはコンパイラがする自動ベクトル化ではなくて、昔から意図して使ってみたいと思っていたんだよね・・

2022/9/3 8:01:42

フィルタ入れなかったら、SIMD化しなくてもいけそうな気もするんだよね。7-8年くらい前くらいのCPUでもね。

2022/9/3 8:04:44

しかしまあ、こんな中途半端な音源をリアルタイムで鳴らさなくても、DAWでレンダリングしたWAVやMP3やOGGなどのファイルをストリーム再生すれば高品質な音をいとも簡単に再生できるのだが。OpenSiv3Dだったら簡単にできる話だし。そこは私の妙なこだわりだということですな。老害の一種かも😰

2022/9/3 8:40:44

しかしPSGに忠実なのかというと、PSG風なのはオシレータの

・波形生成アルゴリズム
・ボリュームパラメータのビット幅(4ビット)
・ピッチ算出アルゴリズム

がPSGと同じだけで他はまるで違ってますが😅

2022/9/3 8:42:10

中途半端な音源でオリジナリティを出そうという妙な戦略かも😂

2022/9/4 19:14:03

思いのほか大改造になってしまい、わたしのヘッポコ実装スピードではあと数日くらいはかかってしまいそう。AVXでうまく処理できるよう構造を見直した結果、ほぼ再実装のような状況になってしまった・・ https://t.co/iv1ediL2Ze

2022/9/4 19:14:33

SIMDを積極的に使うような実装はもちろんやったことない(だからやってみたいのだが😅)ので今後も紆余曲折あるだろうね・・

2022/9/4 19:17:45

これができるとなかなか面白い音源にはなりそうだけどね。わたしにとってはだけど。

2022/9/4 19:30:08

256ビットの整数演算ができるのはどうやらAVX2からのようですな。2013年ころ発売したCPUから使えるので、さすがに9年経過した今AVX2使っても問題ないだろうとは思っているのだがどうか・・

2022/9/4 19:31:39

まあ今改造したSIMD命令なしのバージョンが普通に動けばそれはそれでいいんだけども😅

2022/9/5 7:14:21

UIの配置中。8chともなるとパラメータ数がえぐい・・
LFOはプリセットではなく、WaveTableから選択できるようにした。そしてCHごとに

・アンプEG/LFO
・ピッチEG/LFO
・ノイズON/OFFと周波数の可変

設定できるようにした。
まだちゃんと動いてないけど😆 https://t.co/XPmznU7cA1

2022/9/5 7:16:10

LFOの波形はWave Tableから選ぶようにした。

2022/9/5 7:23:11

この音源は波形メモリ/矩形波のオシレータを8個持っていて、それが16音ポリで鳴るっていう仕組みなのですな。各オシレータにはMIDI CHを設定できて、一致するMIDIメッセージのみに反応するっていう風にしてみた。今、マルチCH対応の考慮が足りてないところがあることに気づいたな。

2022/9/5 7:23:33

普通のマルチティンバーにすればよいものを😰

2022/9/5 7:27:38

なぜ私はライブラリの想定範囲から外れたことをしようとしてしまうのか😭

2022/9/6 7:45:25

現状のUI。抜け漏れていたパラメータを配置。音はとりあえず鳴るようになったがまだまだバグつぶし&調整が必要・・
これだけオシレータがあると、加算合成な音作りも可能。そういう用途で使うつもりはないけども。 https://t.co/sUgZPSjkP8

2022/9/6 7:49:18

まだ完成してないけど、ツマミをいじってるとなかなか楽しいですわ😊

2022/9/6 19:14:40

とりあえず今の状況をアップ。
youtu.be/Kvqc2XTbGQc

2022/9/6 19:16:50

謎のマルチティンバーっぽい波形メモリ付きPSG風シンセですな・・

2022/9/6 19:22:11

しかしこのアレンジは秀逸ですな・・
とてもSCC5音+PSG3音で作られているとは思えんですな・・
そらこのゲームに手にしたときは驚きましたわ。なんでこんな音がMSX単体で鳴るんだってね😅
まさかカートリッジに音源積んでるとは・・
youtu.be/Bjlv7c-zAvQ

2022/9/6 20:11:27

当時はSCCなんていう存在自体しらんかったなあ・・
ちょっと恥ずかしい思い出ですな・・

2022/9/6 20:12:45

しかし私用なので適当なつくりとはいえ、VST3をこんなに簡単に作れるなんてすごい時代になったものですなあ・・

2022/9/7 6:39:09

ようやくピッチ・アンプ LFO/EGが動くようになったので、リズム音を作ってReaperで鳴らしてみた。

youtu.be/OVURtQEz40Y

2022/9/7 6:53:51

あと音色ファイルの保存・読み込みとか必要なのかもな・・プログラムチェンジの単位をどうしようかなと思っている。Midi Ch単位にするのが無難かもなあ・・
Midi Chにマッチしたオシレータだけがプログラムチェンジの影響を受けるようにしてみるかな。

2022/9/7 6:57:28

iPlug2の難点は初心者向けのチュートリアルがないこと。なので永遠の初心者の私はちょっと路頭に迷った😅
基本的にはサンプルを見て学ぶ。
サンプルをベースに自分の作りたいものを改造していくうちに理解が進むようにできているみたい。
知らんけど😅

iPlug2/Examples at master · iPlug2/iPlug2 · GitHub
C++ Audio Plug-in Framework for desktop, mobile and web - iPlug2/Examples at master · iPlug2/iPlug2

2022/9/7 7:00:40

音源まわりのめどをつけて、はやくOpenSiv3Dの領域に戻りたいけど、まだまだかかりそうですな・・🤔
C++の仕様のキャッチアップもやりたいところだがそれやってると一生かかりそうなので😅、なんだこの構文は?ってなったら調べるスタイルで行く。

2022/9/7 7:03:25

確かにOpenSiv3Dのライブラリのソースコードを読むのは大変勉強になりますわ。
ああ、こんな風に書けるようになってるのか!ってな驚きがたくさんある。しかしテンプレートメタ的なところに差し掛かるとそっ閉じしてしまってるが😭

2022/9/7 7:06:05

音色保存やプログラムチェンジあたりのめどがついたらSIMD化をいよいよ進めるか・・AVXもしくはAVX2を念頭にして作って、環境がサポートしてなかったら今のコードにフォールバックするようにしようかなと思っている・・SSE2あたりをターゲットにしたほうが無難かもしれんですがね・・

2022/9/7 7:08:01

一応今のコードも、アラインメントの考慮やデータの持たせ方を再検討して、比較的SIMDに乗せやすいようにしたつもりなんだけど、さてどうなるだろうか・・

2022/9/7 7:09:43

あとはSIMDをイントリンシックで書くか、ライブラリを間にかませるかというのもちょっと悩みどころではある・・

2022/9/7 7:12:00

xbyak使って書いてみるとか。私には無理か😅

GitHub - herumi/xbyak: a JIT assembler for x86(IA-32)/x64(AMD64, x86-64) MMX/SSE/SSE2/SSE3/SSSE3/SSE4/FPU/AVX/AVX2/AVX-512 by C++ header
a JIT assembler for x86(IA-32)/x64(AMD64, x86-64) MMX/SSE/SSE2/SSE3/SSSE3/SSE4/FPU/AVX/AVX2/AVX-512 by C++ header - GitHub - herumi/xbyak: a JIT assembler for x86(IA-32)/x64(AMD64, x86-64) MMX/SSE/...

2022/9/7 7:15:34

私のCPU(Ryzen5 3600)ではデバッグモードでビルドしたものでReaperのCPU Usage見ると0.1%-0.2%くらいなので、SIMDする意味あるかな?って気もしますが😅 https://t.co/SlH0s4MR2f

2022/9/7 7:16:42

さてさて音色プログラムのハンドル方法を勉強せねば・・遊びたくば、まず勉強・・

2022/9/8 4:13:31

状態保存に関してはこのサンプルを見て理解した。
セオリーに沿って実装すればパラメータの状態保存は勝手にやってくれるんだけど、IVMultiSliderControlに関しては手前実装がどうやら必要そうだ。それ以外に波形メモリのデータも保存したいのでそれも併せてやっておいた。

iPlug2/Examples/IPlugChunks at master · iPlug2/iPlug2 · GitHub
C++ Audio Plug-in Framework for desktop, mobile and web - iPlug2/Examples/IPlugChunks at master · iPlug2/iPlug2

2022/9/8 4:16:00

シリアライズ・デシリアライズメソッドを書いておけばライブラリが呼んでくれるようになってるんで簡単。

2022/9/8 4:16:44

あとやっぱりパンニングは欲しいなあって感じ・・

2022/9/8 4:46:42

ここまで入れてみてパンが欲しいなと・・
いうても4小節でリズムだけですけど・・😅

youtu.be/9a0n3-gzZrw

2022/9/8 4:47:26

しかし入りの音が鳴らないのはなんでだろうかな🤔

2022/9/9 7:04:42

かなり適当だが、パンニングを実装した。
これで実装したいパラメータは全部そろったかも。
あとピッチベンドを同じMIDI CHのオシレータだけに効かせるようにしないといかんな。 https://t.co/x6hb1GSilc

2022/9/9 7:08:22

あとプログラム管理とプログラムチェンジの実装も必要か。ここまでが必須となるかな。Glideもオシレータ単位で効くようにしたほうがいいかもね。

2022/9/12 13:07:53

ピッチ・ベンドがMIDIチャンネルごとに有効にならないというバグをつぶすのに思いのほか時間をかけてしまったな・・アプリモードだと動くのにVST3でコンパイルすると動かない・・結論からいうとVST3向けのプリプロセッサ定義が足りなかったというお粗末な原因・・😭

2022/9/12 15:44:09

VST3ホストでデバッグしたいと思って、Reaperのプロセスにアタッチしたら、Reaperってマネージドアプリだったんですな。VST3はネイティブなんでデバッグできないのかな・・って思ってたんだけど、コードの種類をマネージドとネイティブの両方指定したらちゃんとデバッグできますわ・・すごいな https://t.co/Ieb1toSQz3

2022/9/12 15:48:34

それとテスト用のホストもあるんですな。ユニットテストとかもできるみたい。

No Image
VST 3 Plug-in Test Host - VST 3 Developer Portal
https://t.co/m6W8iq0zpd

2022/9/12 18:05:08

ピッチベンドのバグがようやくとれたのでピッチベンドを効かせた動画をアップ😭
youtu.be/K95092cMlDw

2022/9/12 18:05:34

めちゃくちゃ時間がかかってしまった😢

2022/9/12 18:06:34

続いてプログラム・チェンジですなあ・・

2022/9/12 18:08:40

今のコードはiPlug2のサンプルから出発しているため、はなはだつぎはぎな感じになってしまっているなあっていうことがわかるくらいにiPlug2のことを理解した感じはあるな。

2022/9/12 18:11:19

しかしこれが完成したらいよいよゲーム作りだあああ
でもなく、ゲーム側で使うための音源ドライバも作らんといかんしな・・まだまだ先は長い・・
しかしまだモチベーションは保ち続けている。これが突然萎えるのがわしのいかんところだが、それがいつ訪れるかは自分でもわからんのよね・・

2022/9/12 18:13:35

しかしVST Pluginもよいライブラリがいろいろあって、かなり楽に作れるようになってるのは確かだな。以前のSDKだけの状況だったらたぶんここまで作れなかったろうな。わたしのようなヘタレ野郎ではな。

2022/9/12 18:15:30

このような設計の良いライブラリの作者には尊敬・感謝の念しかないね。

2022/9/15 16:29:45

現在の画面。プログラムNo・チェンジボタン・保存ボタンをCHごとに配置。一応プログラムチェンジ・保存できるようにはなった。あとMIDIメッセージからの切り替えですわな。 https://t.co/fllRZ077hw

2022/9/15 16:30:26

しかし単なるPSG+波形メモリの音源なのだがパラメータの多いこと😅

2022/9/15 18:47:43

とりあえず現状のバージョンでモーツァルトのセレナーデを演奏した動画をアップしてみた。

youtu.be/MW-BlK519DU

2022/9/16 4:36:44

サンプル動画用のデータを作って気づいたが、なぜかステートの保存・読み込みがうまくいっていないようだ。データを保存して再度読み込むと作成した音色データが消えてしまうどころか、初期化された状態に戻ってしまう😭

2022/9/16 5:14:05

いやあコードを見返すと凡ミスだった😭

2022/9/16 18:35:57

SIMD化するのこのライブラリ使うのががよさそうな気がするな・・

GitHub - google/highway: Performance-portable, length-agnostic SIMD with runtime dispatch
Performance-portable, length-agnostic SIMD with runtime dispatch - GitHub - google/highway: Performance-portable, length-agnostic SIMD with runtime dispatch

2022/9/16 18:38:09

あ、その前にMIDIメッセージで対応するの忘れてるとこあるんだった。

2022/9/17 7:56:47

プログラムチェンジをVST3で機能させるにはプログラムリストっていうのを使わないといけないようですな。

No Program Changes in VST3 - regrettable decision - Cubase - Steinberg Forums
Steinberg’s decision of making VST3 instruments unresponsive to MIDI Program Changes means that unless I install my VST3 instruments as VST2, I cannot make nor create and test my live sets in Cubase and have to take them elsewhere. I wish a plug-in or setting for program changes, CC etc. were created.

2022/9/17 7:59:23

これを実装すると、プログラムチェンジメッセージをVST3が受け取るようになり、プログラムチェンジでプログラムリストを切り替えることができるようなるようですな。

MIDI Program Change - Developer / VST 3 SDK - Steinberg Forums
Hi, you basically have to do the following: create a parameter per channel and bus that is your program list for that channel create a unit per channel/bus and set the parameter from above as the program list. This should give you a program list per channel/bus. I hope this helps. Arne

2022/9/17 7:59:57

iPlug2上でどうやればいいのかよくわかりませんがね😅

2022/9/17 16:58:03

VST3のプリセット仕様の理解はまだまだ。しかしいろいろいじくったり調べたりして、iPlug2上でVST3のプリセットを有効化するにはVST3_PRESET_LISTをプリプロセッサ定義に加えなければならないことが分かった。

IPlug1 and IPlug2. Problem with presets in VST3. - DSP and Plug-in Development Forum - KVR Audio
KVR Audio Forum - IPlug1 and IPlug2. Problem with presets in VST3. - DSP and Plug-in Development Forum

2022/9/17 17:02:11

VST3ではプリセット(ProgramListっていうらしい)が動くようにコードが書かれていないとプログラムチェンジが機能しない。ただMIDIメッセージベースでプログラム・チェンジが飛んでくるかっていうとそうではないようだ。このあたりまだよくわかっていない。

2022/9/17 17:04:35

アプリでビルドしたものやVST2だとMIDIメッセージとしてプログラム・チェンジをプラグイン側で受け取るようだ。これはデバッガで確かめた。が、VST3はどうやらそうではないみたい。

No Program Changes in VST3 - regrettable decision - Cubase - Steinberg Forums
Steinberg’s decision of making VST3 instruments unresponsive to MIDI Program Changes means that unless I install my VST3 instruments as VST2, I cannot make nor create and test my live sets in Cubase and have to take them elsewhere. I wish a plug-in or setting for program changes, CC etc. were created.

2022/9/17 17:06:32

DAWでホストしているVST3にデバッガでアタッチしてプログラム・チェンジメッセージなどを処理するProcessMidiMsg()を監視しても、プログラムチェンジメッセージ(CX)はまったく飛んでこない。

2022/9/17 17:09:48

そうではなくて、プログラム・チェンジメッセージはプログラム番号を引数にRestorePreset()を呼び出すっていう処理に置き換えるようだ。これはiPlug2上での話だけどね。 https://t.co/UU0P95cAd9

2022/9/17 17:14:00

でRestorePreset()は何をしているのかっていうと、ステートの保存・読み込みと同じ仕組みでプリセットの入れ替えをするようになっていた。しかしこの動きは私が期待していた動きではないんだな。
プログラム・チェンジメッセージをフックして自前処理で対応したかった。音色管理が特殊なので。

2022/9/17 17:16:31

いまいまはRestorePreset()メソッドをオーバーライドしてカスタマイズできないか試そうかなって思ってるところだけどね。virtualになってなかったらまた不細工な実装しないといけなくなるのが悲しいが😰

2022/9/18 7:22:10

iPlug2は複数のプラグインに対応できるようにプリセットもIPresetという名前の構造体で再定義(抽象化)されている。IByteChunkってのがプリセットパラメータを格納するメモリブロックとなっているようだ。

iPlug2/IPlugStructs.h at master · iPlug2/iPlug2 · GitHub
C++ Audio Plug-in Framework for desktop, mobile and web - iPlug2/IPlugStructs.h at master · iPlug2/iPlug2
https://t.co/t0nVJ10dDi

2022/9/18 7:30:48

ソースコードを読むとiPlug2では

・プリセットとは、プラグイン全体のパラメータの状態を保存したもの

として定義されているように思う。
またプログラムチェンジは

・プリセットを切り替える

という動作なので、プログラムチェンジで全体がごっそり切り替わってしまうんですな。

2022/9/18 7:34:32

この仕様、私にとっては都合が悪い。私はプラグイン中の1チャンネルのパラメータ=プログラムとしたいので。要するに赤枠の部分を1プログラムとして管理したいのですな。全体のステートは別途管理したいのだが、iPlug2の仕様では全体のステートがプログラム(プリセット)となってるところが痛い😰 https://t.co/qpL3r183qX

2022/9/18 7:36:12

これは私が作ろうとしているプラグインの仕様が変なのであって、iPlug2の仕様のほうがまともだと思う😅

2022/9/18 7:39:10

VST3上の動きだと、プログラムチェンジはMIDIメッセージとしては受け取るけど、プリセットの切り替えメソッドを呼び出してプログラムチェンジ・メッセージはライブラリ側で吸収してしまうように見える。iPlug2がそうしているのかVST3側がそうしているのかまだ私はわかっていない。

2022/9/18 7:42:55

アプリモードで動かすときちんとMIDIメッセージをハンドルするメソッドまでプログラムチェンジ・メッセージが飛んでくる。しかしVST3だとそこまで飛んでこないで、かわりにプリセット切り替えメソッドが呼ばれるようになっているんですな。

2022/9/18 7:44:59

これどうやらVST2だともっと簡単に済みそう(アプリモードの動きとほぼ同じなので)だけど、VST3のこのあたりの理解をしておきたい(理解しないと悔しい😅)のでVST3 SDKのドキュメントも読んでおくことにしよう。まだ読んでないんかい😰

2022/9/18 7:47:40

ゲーム開発用のツールとして使うだけなのできちんとしたVST3として作る必要はないと思うが、ここはツール上としても必要なところなんで避けては通れないってのもあるんですな。

2022/9/18 7:50:06

しかしVST3の仕様上プログラムチェンジがDAWから呼び出される時点でMIDIメッセージでなくなっているのなら、ちょっと自分のやりたいことができないってことになるのでVST2に落とす必要は出てくるかもしれませんな。

2022/9/18 7:58:38

しかしあれですな。この方向性でなくて、別途コントロールチェンジメッセージの汎用操作子メッセージを使って私仕様の音色チェンジ・メッセージを送るっていう手もありますわな。これでいくことにしようかな。

2022/9/18 8:24:11

普通のマルチティンバー音源みたく設計すれば、このような問題も起きないのではないかと思いますが。なにぶんおかしな設計なものでね😅
ライブラリを使用するメリットをすこぶる損なう仕様なのかもしれん。グラフィックにしてもそうなのですが😅

2022/9/18 20:33:47

結局

・プログラムチェンジ = プラグイン全体のパラメータ変更
・コントロールチェンジ110番(未定義) = チャンネルごとの音色変更

という形に落ち着きそうだ。

2022/9/21 4:43:11

おお、音源作っている間にGodot 4 がとうとうベータレベルになっていた・・

Godot Engine - The next big step: Godot 4.0 reaches Beta
It has been a long road to Godot 4.0 with 17 alpha builds distributed in 2022, and continuous development effort since 2019. We aren’t done yet, but today marks a major milestone on the road to Godot 4.0: the first beta is out!

2022/9/21 7:25:05

音色チェンジがようやくまともに動くようになった。
音色は切り替えできたのだが、それにUI表示が追随しない不具合で数日悩んでいた・・

youtu.be/_TYPcOCPfPw

2022/9/21 19:03:38

バッハBWV147を演奏してみた。ええ曲ですなあ・・
ここまでで一応機能として欲しかったものは実装したが、アルペジエータが欲しくなってきたので追加で実装しようかどうか検討しているところである。
youtu.be/-c9gHpM7YIo

2022/9/22 5:02:35

このようなアルペジエータのソースを見つけましたな・・

arp/MidiArpeggiator.h at master · tfwio/arp · GitHub
[WIP/starter] simple MIDI arpeggiator VST instrument/effect using WDL-ol/IPLUG - arp/MidiArpeggiator.h at master · tfwio/arp

2022/9/22 5:03:09

若干改造すれば使えそうですわ

2022/9/22 7:51:36

というわけで明日からの3連休はアルペジエータの実装ということになりますかな。

2022/9/23 11:08:21

アルペジオ機能を実装中・・
出かけるのでつづきは帰ってから・・ https://t.co/eniHk3G3xJ

2022/9/23 20:50:32

UIはとりあえずこれで仮置きした。MIDIの0~7Chまでのチャネルごとにアルペジオパターンを設定可能というこれまた謎仕様のアルペジエータである😅 https://t.co/bvhPJ8gidt

2022/9/25 16:41:01

アルペジエータがようやくまともに動くようになったので動画にしてみた。アルペジオパターンをもう少し増やしたいなあと思う。ランダムとかね。

youtu.be/-hCzC2BQR3Y

2022/9/25 16:49:06

あとこれ作ってる途中でキャリアとモジュレータの波形に波形メモリを割り当てることができるようにするFMオシレータも作れんかなって思ってて、OPLあたりのエミュレータソースを読んでみようと思っているところである。
あかん、音源まわりで時間かけすぎだ😰
歩みも亀のようにのろい😭

2022/9/26 4:58:20

このコードを読んで、FMオシレータ実装の参考にさせていただこう・・

GitHub - digital-sound-antiques/emu8950: A Y8950/YM3526/YM3812 emulator written in C.
A Y8950/YM3526/YM3812 emulator written in C. Contribute to digital-sound-antiques/emu8950 development by creating an account on GitHub.

2022/9/26 5:43:49

OPLのsinテーブルは10bitかあ。。

emu8950/emu8950.c at bb4c784a7804353124cfba95b825bff1de1f8088 · digital-sound-antiques/emu8950 · GitHub
A Y8950/YM3526/YM3812 emulator written in C. Contribute to digital-sound-antiques/emu8950 development by creating an account on GitHub.

2022/9/26 5:44:17

結構でかいな。

2022/9/26 5:58:03

16bitで1024個の波形テーブルってことですな。

2022/9/26 6:16:45

まさにキャリアの波形テーブルをモジュレータの波形出力で変調して読み出すところ。
つまりはモジュレータの値をオフセットの要素として使うってことなんですな。この単純な実装であのような豊かな倍音を含んだ音色を奏でるんですな。

emu8950/emu8950.c at bb4c784a7804353124cfba95b825bff1de1f8088 · digital-sound-antiques/emu8950 · GitHub
A Y8950/YM3526/YM3812 emulator written in C. Contribute to digital-sound-antiques/emu8950 development by creating an account on GitHub.

2022/9/26 6:20:32

さらにモジュレータのEGによって、時間的な倍音成分の変化をもたらすんですわ。いやあ、すごいですわ。FM音源は。これややこしいデジタルフィルタの実装なしで実現してるところがすごい。当時だとdspでしかなし得ない世界でしたからな。

2022/9/26 6:22:02

この簡素な作りがあるからローコストで豊かな音を奏でるチップがあの当時作れたというわけですな。

2022/9/26 6:33:10

波形テーブルの数はこのソースの実装がそうだっただけで、sinの値はπ/2分あれば2π分の波形データは符号反転や読み出し位置の逆転とかで作れるもんな。実際のチップはどうだったんだろうな。

2022/9/27 5:17:46

しかしFMのモジュレータを追加実装するとなると、波形メモリのテーブルも大きくしたくなってくるなあ。1波形メモリあたり最大8Kbyte・64個分メモリを用意したとしても、512KBですからな。8KHzくらいのサンプリングレートだと1秒くらい鳴らすことができるからね。

2022/9/27 5:18:49

とりあえずは32バイトの波形メモリをモジュレータの波形として使える仕様にしようと思っている。

2022/9/27 5:20:35

512KBだと30年ほど前なら卒倒しそうな容量だが。しかも音だけに使うっていうんだからね。64KBメインメモリの時代ですからな😅

2022/9/27 7:25:40

とりあえずパラメータだけを並べてみた。モジュラーシンセみたいな感じになってきた。
パラメータ多し😰 https://t.co/y3JspvexmU

2022/9/27 7:34:55

ここがFMのモジュレータ部分。実際のところ2個目のオシレータみたいなもんで、1個目の波形テーブル読み出しオフセットに2個目の出力値を足す感じになるんですな。FM項目のRateはフィードバックレートですな。 https://t.co/z4qiFhBvko

2022/9/27 7:37:08

実際のFM音源も結局のところ波形メモリのデータとしてサイン波を持っていて、同じような感じで処理してるんだよね。なのでものすごいシンプルなんですな。これがFM音源があの時代で一世を風靡した理由でもあるんだな。

2022/9/28 8:51:03

実装してみた。が、FMをONにするとノイズが混ざるのみで聴くに堪えない😭
バグも多分にあると思うけど、32バイトの波形メモリではちとFMは厳しいのかもしれんですな・・ https://t.co/oJCZkTytya

2022/9/28 19:57:51

波形メモリのサイズをソースレベルで変えれるように(2の階乗サイズで)しようかなと思っているところ。

2022/9/29 7:25:50

モジュレータ部分に大バグを発見。そりゃこれじゃノイズしかならんわ・・

2022/9/29 8:36:10

とりあえず今の状況をアップ。
一応FM音源っぽい音が鳴らなくもない感じにはなった。結構歪んでますが😅

youtu.be/q0p5ldEx12Q

2022/9/29 8:39:30

エレピっぽい音出したほうがよかったのかもね。

2022/9/29 8:40:48

LPF入れたほうがいいのかもな。ちょっとエイリアスノイズが耳障りですわな・・

2022/9/29 8:42:20

LPF入れたところでエイリアスノイズ除けるとは限らんわな。相変わらずアホですな。

2022/9/29 20:37:12

FM音源っぽい音色?を作ってバッハを演奏してみた。
youtu.be/UJw9aW-_Ryc

2022/9/29 20:38:09

ちょっとノイジーですな。

2022/9/29 20:49:10

まあちょっと音質があれでバグはまだいっぱい潜んでいそうだが、波形メモリの大きさを調整できるようにしたら次はいよいよSIMD化するかな。そのあとゲーム側のドライバを作らんといかんのですわな。それができてようやくOpenSiv3Dにもどれるってわけですわ。もう忘れてるかもしれん😅

2022/9/30 17:45:23

チェンバロ風の音色を作ってバッハを演奏してみた。

youtu.be/ZozxPvsQyis

2022/9/30 17:48:41

リリースを長めにして、2CH使ってピッチずらして左右に振ってみたらこんな感じになった。
やっぱりこういう尖った音作るのはFM音源の得意分野かもしれんね・・

2022/9/30 17:50:10

エフェクトはいっさいかけてないけど、やはり周波数成分の時間的変化があるといい感じになるなあ。

2022/10/1 17:05:28

ちょっと今日はバグ取りを行っていた。
LFOがいつの間にか効かなくなってたりとかその他いろいろ。
とりあえず目立ったところは取れたので全CH使ってバグチェックがてら演奏してみた。
やはりプチノイズやアタック時のポップノイズが気になりますな🤔
youtu.be/ZuqmSBfJOIk

2022/10/1 17:07:03

この演奏でデバッグモードで3%台のCPU負荷率の模様。リリースモードでも試してみようか・・

2022/10/1 17:13:25

リリースモードだと1%いきませんがな😁
まあこの曲だからかもな。やっぱりデジタルフィルタ使わないと軽いなあ・・ https://t.co/9II4M5TKKq

2022/10/1 17:15:13

使っても大したことないのかもしれませんな🤔
なにせ古い頭の人間なもので😅

2022/10/1 17:16:23

5700Gに換装したおかげでもあるか・・

2022/10/1 20:14:04

とりあえず最適化は置いておいて、次のステップに進むとしますかな。ゲーム側のドライバとReaperのデータエクスポータ・インポータですな。SIMD化はゲーム制作が進んできた後にしますわ。

2022/10/1 20:17:09

今はこの法則(もちろん第一法則)に従うことにする・・。

■プログラム最適化の第一法則
・最適化するな。

■プログラム最適化の第二法則(上級者限定)
・ まだするな。

- Michael A. Jackson

2022/10/1 20:22:53

ドライバも音源部分がiPlug2に依存してしまってるので、ゲーム本体のプロジェクト構成はOpesnSiv3DベースとしてiPlug2も利用するって形に変更しないといかんですな。

2022/10/2 6:27:00

モジュレータを付けたことによってピッチをもう少し厳密に計算する必要が出てきたので、Pitch Modeを増やした。Orig(inal)モードというやつ。厳密に計算するというか、12bitだとちょっと粒度が粗すぎて微妙な変異が表現できないので。Originalはfloatでピッチを計算する(普通のやり方ですが)。 https://t.co/xozG1ks7Cy

2022/10/2 6:31:10

あとはちょっと

1.リアルタイムMIDIメッセージ受信処理
2.波形生成処理(MIDIメッセージの処理も含む)
3.UI処理

の3つの観点で見直しておかしなところを直していっている。この辺よくわかっていなくてコードではごちゃ混ぜになっていて、分けないといけないということが最近わかった😅

2022/10/2 6:38:34

今回作ろうとしているゲームではサンプル音はいっさい使わず、リアルタイムで波形合成してBGMや効果音を出すつもり。仕様としてはここまでよいかなあって思う。最終的な出力にLPFやHPFをかけたいけど、それはOpenSiv3Dのオーディオフィルタに任せようと思っている。

チュートリアル 19 | オーディオ再生|Siv3D リファレンス v0.6.5

2022/10/2 6:53:17

しかし波形メモリ音源も、厳密にはサンプリング音源の一種とも思えるので、この音源へのこだわりも中途半端な風にも思えるが😅

2022/10/2 8:59:04

ベートーベンの運命を試奏・・
youtu.be/QSk7W9Uf92g

2022/10/2 9:01:14

やはりプチプチしますなあ・・

2022/10/2 9:06:27

しかしベートーベンの交響曲5番は今更ですがすさまじいアンサンブルですな・・
わたしはクラシックはあまりよくわからんので適当な感想ですが。

2022/10/2 15:28:02

さてドライバを作るか・・といってもこれはこれで私にとってはなかなか難しい作業だが、「少しずつ進めたらなんか形のあるものができた」作戦で地道に進めますわ・・

2022/10/2 15:31:21

Reaper DAWの機能はものすごく豊富だから、この機能をそのまま持ってこようとすると完成が遠のくので必要な機能だけ取捨選択してドライバで動かすようにしないといかんのですな。

2022/10/2 15:35:07

そしてドライバが読み込むデータはReascriptもしくはReaper Extensionで独自フォーマットで作ろうかなと思う。最初Reaperのプロジェクトファイルをパースして読み込むコードを書こうかなと思ったがこれはこれで非常に面倒なことがわかったので。

2022/10/2 21:36:24

ヨハン・シュトラウス2世「美しく青きドナウ」を試奏。ちょっと自作シンセでクラシックを演奏するのが面白くなってきてる気も😅
しかしアタックのこの鍵盤押したような音が気になるよねえ・・
youtu.be/IFXs1QUTixY

2022/10/3 8:17:07

うむう。。プリセット周りの挙動がいまいちわからんなあ・・

2022/10/3 18:35:07

Reaperで保存したユーザー・プリセットをプログラムチェンジで切り替えることがそのままではできないっぽいんだな。VST3側で持つプリセットはプログラム・チェンジで切り替えできるんだけれども。でもこれはまあ名前通りのプリセットで、その内容を書き換えることはどうやらできないみたいだ。

2022/10/3 18:35:54

iPlug2でもVST2用にプリセットを保存(Write)するメソッドはあるけど、VST3用にはないんだな。

2022/10/3 18:40:40

作成中の音源は8オシレータ×16ポリっていう構成。各オシレータは独立したAmp EG/LFO,Pitch EG/LFO,Pan,Amp EG/LFO付きFMモジュレータを持つ。
さらに受信MIDI CHのパラメータを持っていて、ノート・イベントのCHと一致するオシレータだけが発音するっていう仕様なんですわ。 https://t.co/cYt4qD0EQk

2022/10/3 18:43:16

オシレータのMIDI CHを全部1CHにすると、1CHのMIDIメッセージをすべてのオシレータが受け取る。つまり8オシレータ同時に発音するっていう感じ。こういう音源って今までなかったと思うけどどうだろうね。いわゆるマルチティンバー音源の仕組みとも違いますわ。

2022/10/3 18:46:03

オシレータ単位でプリセットを保存・呼び出しすることができるんだけど、シーケンスから呼び出すのは未定義のコントロールチェンジを使って行っている。本来のプログラム・チェンジは1音分(つまり8オシレータ分)の情報のプリセットっていう位置づけにしているんですな。

2022/10/3 18:46:45

なんでこういう仕様にしたのかっていうとこれはもう成り行きですな😅

2022/10/3 18:52:26

プリセットはとりあえず宿題として置いておいて、ゲーム側のドライバを作るための環境整備を急がんといかんですな・・

2022/10/3 18:53:18

iPlug2とOpenSiv3Dを相乗りさせないといけないんですわ。そんなに難しい話じゃないとは思いますが・・

2022/10/4 18:17:46

考えた結果、シンセのエンジン部分は独立させ、iPlug2コードとは完全に分離してゲーム側に持ってくるのがやっぱり一番いい気がする。iPlug2のコードをOpenSiv3Dの領域に持ち込むのはやっぱりシンプルさに欠けるもんな。しかもiPlug2のコードは開発にのみ必要なものだしなあ。

2022/10/4 18:18:31

開発→開発時

2022/10/4 18:21:08

ただiPlug2のMIDISynthやVoiceAllocatorのコードは独立性が高いからできればそのまま流用したいけどね。

2022/10/6 16:05:23

音源のエンジン部分のポータビリティを高めるための作業を実施中。ライブラリ・コードも使えるところはどんどん拝借し、コンテナはできるだけ標準コンテナに置き換える。ついでにパスカルケースなメソッドをキャメルケースに置き換えたりして収拾がつかなくなりつつある😅 https://t.co/yAj15mGLD1

2022/10/6 16:09:07

クラスの階層構造の見直しや、汎用化のために冗長なコードもどんどん削っていっている。ライブラリコードは汎用化のためにかなり込み入った実装になっているし、読むとものすごく勉強になるけども、理解してここは自分にはいらないと悟ったらバッサリ切り捨てている。

2022/10/6 16:10:58

そしてのちに困ったことが起こって、「ああ、
あのコードはこういうケースを想定してのものだったのかあ・・」って切り捨てた部分がすごく重要な実装だったりして理解が浅かったことに気づいたりもすることも多いですがね😭

2022/10/6 16:24:01

ついでに音声データの型がfloatだったりdoubleだったり混在してたんだけどそれもできるだけfloatにまとめようと思う。これは将来のSIMD化(AVX256、32bitfloatx8を想定)に備えとこう。
ただこれオーバーフローやデノーマルとかも気にしとかんといかんのだろうねえ。doubleだとかなり安心するのだが。

2022/10/6 16:27:26

iPlug2 のExtrasに入っているソフトシンセ用のコードはほんと参考になったなあ。bitsetとか使っててね。
bitsetなんて使ったことなかったもんでね。

No Image
bitset - cpprefjp C++日本語リファレンス
`<bitset>`ヘッダでは、ビットの固定サイズ配列を計算するための`std::bitset`クラスを定義する。

2022/10/6 16:29:44

なぜ python roboto botがべたなC++の話にリツイートしたのだろうか・・

2022/10/7 20:57:04

アルペジエータのコードをいじくってバグ取りすればOpenSiv3Dに持ってけそうな感じにはなってきたな・・3連休でOpenSiv3Dでの動作確認まで持っていけるかどうかが勝負ですな。

2022/10/7 21:00:50

勝負というほどでもないか

2022/10/9 8:15:53

OpenSiv3Dの領域にようやく帰ってきた・・
がやっぱりすっかり忘れてますわ😭
さすが老人の記憶力😅 https://t.co/5e1SRDLiYj

2021/5/16 15:23:43

旧 Siv3D にあった MIDI 譜面データ(ノートオン・オフのタイミング)取得機能も実装 #OpenSiv3D (v0.6) https://t.co/A65wJT7Ib4

2022/10/10 16:32:54

OpenSiv3D上で「美しく青きドナウ」をPSG風音色で演奏。12bit周波数テーブルならではの、高音域のピッチのずれをお楽しみください(笑)
ようやくOpenSiv3Dで鳴らすことができた😁
いやあX1Cのデモを思い出しましたわ
youtu.be/ZiRWpl34I9o

2022/10/10 16:35:26

X1Cのデモとはこれですわ。このPCを所有してこのデモを観たときの感動っていったらなかったな😂
テンポが揺れているのはご愛敬。
タイマ割り込みによる演奏ができなかったんだよなあ。X1は確か。それでFM7なんかと比べるとテンポの揺れが激しかった。
youtu.be/HDt2r1bkpMI

2022/10/10 16:35:55

あくまでBASICでの演奏の話ですけどね・・

2022/10/10 16:38:05

OpenSiv3D側ではIAudioStreamを使っている。
このサンプルを参考にさせていただいた。

zenn.dev/reputeless/scr…

2022/10/12 4:55:38

音色データの受け渡しをするのに、OpenSiv3Dのシリアライズ機能を使うことにした。今独自クラスをシリアライズできるように修正中・・
OpenSiv3Dはcerealっていうのを使っているんですな。boost::serializationになんとなく似た構文のようですな・・知らんけど。

No Image
cereal Docs - Main
https://t.co/APnRSJWHmT

2022/10/12 4:56:45

軽くてポータビリティーがあるらしいね。cerealは。

2022/10/12 4:58:10

これ使うのにiplug2側のプロジェクトにOpenSiv3Dを使えるように設定変更した。っていってもインクルードパス・ライブラリパス・ソースパスを足しただけだけど😅

2022/10/13 19:45:17

結局cerealをiplug2のプロジェクトとOpenSiv3Dのプロジェクト双方で使うことでシリアライズ問題?は決着した。

2022/10/13 19:49:07

とりあえずカスタムオブジェクトのシリアライズコードの実装はしたので明日テストするか・・
今日は午前中がん検診、午後医者の診察とはしごをしてちと疲れましたわ・・

2022/10/13 19:50:45

まあ幸いまだガンにはなっていないけど、もうなってもおかしくない歳ですからな・・毎年検診の際はかなりびくびくして受けてるので、ものすごい疲れるんだな・・胃カメラも全然慣れないし・・

2022/10/13 19:52:32

でもコンパイルタイムのエラーってstatic_assertできるようになったこともあいまってか、昔にくらべてかなりわかりやすくなってるよなあ・・

2022/10/14 4:28:34

boost::serialization/cerealとかのシリアライザってよく設計されているなあって思うね。最初見たときなんて魔法だ・・って思ったもんな。

2022/10/14 4:31:58

私なぞは2004年くらいのころからboost::serializationを使ってなんかやろうとしてたみたいで。ひええ。もうあれから18年も経っているのか😆
そういえばwin32-gui-genericsなんていう尖ったライブラリがあったなあ・・懐かしいですな😄
sfpgmr.net/blog/entry/boo…

2022/10/14 4:34:35

そのころはラムダ関数とかも使えなかったもんな。boost::lamdaとかあったよねえ。。

No Image
letsboost::lambda

2022/10/14 4:38:05

標準ライブラリのアルゴリズムとか使うときに簡単な演算でもファンクタ作ったりだとか関数書かないといけないのが面倒くさかったんだよね。それを演算子のオーバーロードやらテンプレートやらを駆使してラムダ関数を書けるようにしたってのがboost::lamdaだったんだよな。

2022/10/14 4:39:41

boost::lamdaによってラムダ関数の必要性がC++の言語仕様を策定するメンバーによって認知され、ラムダ関数がC++11に取り入れられたのかどうかは定かではないが、影響は与えたんだろうな。多分。

2022/10/14 4:42:12

10年くらいはC++を追っかけるのやめていたので、今は完全に浦島太郎状態ですが。しかしその間いろいろな言語が出現・台頭してきましたなあ・・
pythonなんかもそうだよね。こんなにメジャーな言語になるとは思いもしなかったな。
そしてrustだよな。やっぱりな。

2022/10/14 4:43:56

linuxカーネルって長年C言語の独壇場だったんだけど、そこにどうやらrustが食い込んできそうなんだよね。確か。そのインパクトたるやわしのようなにわかおっさんウォッチャーにとっては衝撃的ですわ。リーナスが認めたってことだよね。rustをね。

2022/10/14 4:45:29

確かリーナスはC++を嫌ってたような気がするな。

No Image
Linus Torvalds on C++

2022/10/14 4:48:53

まあしかし、ほんとにいろいろなプログラミング言語が出現して、用途に応じて得意な言語を使い分けることができるような世の中になったことはすごいことですわな。またこうなると言語間の覇権争いも勃発しがちだけど、ネガティブ面もあるが、言語を進化させるっていう点では必要なことなのかもな。

2022/10/14 4:52:04

しかしまあライブラリのコードの洗練さに比して、私の書くコードのレベルときたらまあ・・とりあえず自分のコードはあまり見ないでおこう😅

2022/10/14 5:54:16

cereal::JSONOutputArchiveでシリアライズしたみた。おおお、ちゃんとJSONでアーカイブされとる。。
いやあこんなに簡単にC++オブジェクトがJSONでシリアライズできる時代になったんですな😊
生きててよかった😭
大げさな・・😅 https://t.co/mb5zItEXRK

2022/10/15 20:51:04

iPlug2側でのcerealによるシリアライズができるようになったので、OpesnSiv3D側で読み込もうとしたらなぜかあるはずのserialize関数がないというstatic_assertが出てすごく困った。追っかけていくと、OpenSiv3Dライブラリ側でCEREAL_SERIALIZE_FUNCTION_NAMEを書き換えていたのだった。ひいい😭

2022/10/15 20:55:00

なのでserialize関数の名前は「serialize」と直書きせず、マクロ「CEREAL_SERIALIZE_FUNCTION_NAME」で定義するようにしておいたほうがよいみたいですな。
「SIV3D_SERIALIZE」でもいいんだけど、それだとiPlug2側でまた何か工夫しなくてはいけなくなるんで、今回はそれは避けましたわ。

2022/10/15 21:01:15

それぞれ独自のエコシステムを形成しているライブラリの両方で動くコードを書くのも結構やっかいですな・・しかしこの程度のやっかいさはライブラリから受ける恩恵からすればどうってことないが。

2022/10/16 10:31:59

今の状況を動画にアップ。ようやく音色データをOpenSiv3Dに持ってくることができるようになりましたな。
youtu.be/_FXmWqHhQdc

2022/10/16 10:33:52

しかしちょっと設計にまずいところを発見してさっそく手直しをしないといかんですわ😅

2022/10/23 15:05:25

ちょっとOpenSiv3D + imguiでUIを作ってみたくなったのでセットアップ実施中・・
またTracker風のシーケンサを作りたくなったのですわ・・

2022/10/23 15:06:51

imguiでの実装例でこういうのがあったものでね・・

GitHub - immortalx74/utracker: uTracker: A mod music tracker
uTracker: A mod music tracker. Contribute to immortalx74/utracker development by creating an account on GitHub.

2022/10/23 17:27:33

とりあえずOpenSiv3D開発環境にimguiを組み込めた模様。 https://t.co/88OfaNZrca

2022/10/23 17:31:14

組み込みにはこの記事を参考にした。ただしこのgistのコードは現状のimguiのバージョンではコンパイルエラーになる。

OpenSiv3DでImGuiを使う - Qiita


追記

OpenSiv3D用のimgui_implの実装が公開されています。
https://twitter.com/telyaino/status/1209112739110514689


はじめに

OpenSiv3Dで簡単...

imgui_impl_s3d · GitHub
imgui_impl_s3d. GitHub Gist: instantly share code, notes, and snippets.

2022/10/23 17:32:08

このコンパイルエラーはとりあえずこの情報を見て修正した。

Platform IME: changed io.ImeSetInputScreenPosFn() to io.SetPlatformImeDataFn() API. · 3a90dc3893 - imgui - Git @ FSU John D. Fox's Lab
A fork of DearImGui which has a CMake and a premake build file. DearImGui is a cross-platform, renderer-agnositc, light-weight GUI framework.

2022/10/23 17:57:09

これ使ってPSG音源の音源エディタをまずimguiに移植してみようかなと思っている。それがうまくいったらトラッカー風のシーケンスエディタを作ろうかなと思う。まあどうなるかはわからんけども。

2022/10/23 18:01:29

いやしかしC++のGUIライブラリも10年くらい前とくらべてかなりの充実ぶり・・すごいですな。
GUIの実装のめんどくささに過去何度も打ちのめされたヘタレな私にとっては再チャレンジするに十分なスペックを有してるんだよね・・

2022/10/24 20:22:14

しかしimguiというのは面白い設計ですな

2022/10/25 5:58:07

imgui::ShowDemoWindow()で表示されるウィンドウでimguiを勉強中。imgui_demo.cppのコードを見ながらやるとよい感じ。いやしかしこのライブラリはすごいな・・このGUIの記法は目から鱗ですわ・・ https://t.co/odG2GNWTgx

2022/10/25 7:53:49

imguiでimgui_demo.cppを見ながらOpenSiv3DでぼちぼちUI構築を開始・・ https://t.co/tWAx6Fpp7t

2022/10/25 8:03:05

iplug2のレイアウトシステムも感動したが、imguiはそれを上回るなあ。OpenSiv3Dももちろんですが。
今年は良いライブラリをいろいろ触ることができてうれしいですな。

2022/10/25 19:55:45

確かにimgui_demo.cppのソース読めば大体わかるようになってるなあ。すごいなimgui。

2022/10/26 7:13:02

シーケンサーの部分はgdnativeで作ったものを改造して使用することにした。ついてにその時に作った波形メモリシンセエンジンも持ってくるか、PSG風音源に機能を取り込もうかなと考えているところ。

2022/10/26 19:32:36

今日はgodot用に作った波形メモリシンセとシーケンサーをGDNavtiveに依存している部分を取り除く作業を行っていて、ようやく先ほどOpenSiv3D環境でコンパイルが通るようになった。この波形メモリシンセは波形メモリor波形サンプル+デジタルフィルタという構成のもの。

2022/10/26 19:35:12

波形メモリを可変にしていて、ドラムサンプルも鳴らせるようにしたものなんだよな。フィルタはRBJ CookBookベースで作られたC++のサンプルコードを改造したものである。いまだにデジタル・フィルタの仕組みは理解できていない😅

2022/10/26 19:37:55

これとPSG風波形メモリシンセとどう統合するかを考えているところなんですな。しかしゲーム用音源からなかなか抜け出せないな・・楽しいので抜けだしたくないという力も働いているのは確かだが😅

2022/10/26 19:39:42

年内で音源部分ができるか微妙な感じになってきたな・・そろそろ大掃除もやらんといかんしなあ・・

2022/10/27 17:00:46

ようやく熱も下がり回復。リハビリがてらコーディングの続き・・
OpenSiv3DにはMIDI In入力サポートがないようなので、RtMidiを組み込んで入力できるようにした。 https://t.co/qDloiUH6Ff

2022/10/27 17:04:05

ImGuiはどうやらstd::stringのサポートがないようですな。char*[]でパラメータ指定するときにstd::string[]からの場合いちいち変換しないといかんのがちと面倒・・

2022/10/27 17:07:25

たがしかしコンボボックスでMIDI In インターフェースを指定してアクティブするコードがこんなに簡単に書けてしまうのがImGuiのすごいところですな・・ https://t.co/uSg2oLWc3U

2022/10/31 6:04:11

この土日は別件で忙しくほとんどコードいじりはできず。

2022/10/31 6:06:38

過去のコードを引っ張り出してきてコンパイルできるようにしたわいいけど、今はキャメルケースで書いてるけどこのコードはスネークケースで書いていて、キャメルケースに直すのが面倒なのでJSでコード書いて変換することにした。C++で書こうと思ったけどこのあたりはやはりスクリプト言語の出番かなと

2022/10/31 6:08:57

node.jsはコンソールツールとしても便利に使えるんでね。ひょっとしたらpythonで書いたほうが楽かもだけど。powershellはちょっと正規表現あたりが若干使いにくい感じが私はするもんでね。慣れの問題かもだけど。

2022/10/31 6:12:28

こんな感じのコードを書くと変換できるのだけれど、これだとC++のキーワードやSTLのスネークケース部分まで変換されてしまうのでそれを除外するコードを前に挟んだりしてる。

const output = src.replace(/(?<=[^\s])_[a-z]/g,w=>w.toUpperCase().replace("_",""));

2022/10/31 6:17:42

変換してみた結果。まあまあできてる感じ。push_backとか大文字のみのスネークケースはそのまま残すようにしているがうまくいってますな・・
ただC++キーワード系は自分が使いそうなところだけサポート😅 https://t.co/zpy3THIOvJ

2022/10/31 6:19:16

このころはSTLがスネークケースだしスネークケースでいこう!って思ってたみたい。あくまでメソッドだけだけどね。私の場合。C++クラスは昔からパスカルケースで書いていて、そこは揺らぎがない。なんでかはわからないが・・

2022/10/31 6:22:11

これで大まかに変換して、漏れが出たらパッチを当てるという作戦で進めますかな。これに完璧を期そうとすると私の場合また時間がかかるんでね・・

2022/10/31 6:26:42

OpenSiv3Dはパスカルケースで書かれているのでそこでまた相容れない部分が出てくるのだが、そこは自作コードとの判別が容易になるからという屁理屈で納得することにした😄

2022/10/31 7:00:22

なんとか変換できて、コンパイルも通った模様・・ https://t.co/S5izu4zeHj

2022/10/31 17:28:44

まあこれやってもなんの進捗もしないのですが・・😅

2022/11/2 4:41:55

OpenSiv3D + ImGuiでPSG風+波形メモリシンセのパラメータ設定画面を作成中。ImGuiを勉強しながらなのでとても遅い歩み具合。よちよちレベル以下😅
レイアウトシステムがまだよくわからんのよね・・🤔 https://t.co/bMDw1nkaTc

2022/11/2 5:41:43

このソースコードマジでリファレンスがわりになるな。。
github.com/ocornut/imgui/…

2022/11/2 19:27:36

ImGuiでのUI作りに勤しみ中・・ https://t.co/FrDRB6mb69

2022/11/3 5:23:40

ようやくパラメータを並べ終わった!って思ったけどアルぺジエータのパラメータ忘れてるね・・ https://t.co/kzyI0ZfUad

2022/11/3 15:36:27

とりあえず今の状態をYoutubeにアップ。しかしこのImGuiっていうのはすごくわかりやすいですわ。
youtu.be/J8uLYjNpU78

2022/11/3 15:37:23

ちょっと音源部分も同時にいじっていて、今は音が鳴らない状況・・

2022/11/3 15:41:08

しかしこのImGuiの直感的な記法は素晴らしいな。私でもすいすいUIが作れますがな😊
なんでかはわからんが私、UI作りがとてつもなく嫌いで苦手なのですわ😭
その私でも割とサクッとここまで来てるからなあ😁

2022/11/3 15:42:31

「ここまで来てる」っていうレベルが相当低いっちゃあ低いのですが😅

2022/11/3 15:44:19

しかしまあ、パラメータのUndo/Redoを実現しようと思ったらこのままではいかんのですが。

2022/11/4 5:42:52

波形メモリ編集機能をImGuiにて作成中・・ https://t.co/HbIQ9RtG9G

2022/11/4 7:24:47

波形メモリエディタは今こんな感じ・・
しかしImGuiはかなり直感的というか、手続き的というか・・おっさんには理解しやすいものなのかもしれんね・・ https://t.co/el38ewRuFm

2022/11/4 7:25:21

波形を画面に並べて編集できるのはけっこういい感じだなあって思っている。

2022/11/4 7:45:37

パラメータいじると音も出るようになっている。というかなっていた😅

2022/11/4 7:50:50

これ1ボイス分の音色パラメータなんだけども、きれいに並ぶと壮観ですな・・ImGuiさまさまですわ・・ https://t.co/2LBweqiXY1

2022/11/4 7:53:02

前の画面も私の割にはコンパクトにまとめられて気に入ってましたが。iPlug2もすごいライブラリですよ・・ https://t.co/JGDD8yHs1M

2022/11/4 20:42:34

@SFPGMR Knobsを使ったほうがいいそう
github.com/altschuler/img… (more github.com/ocornut/imgui/…) https://t.co/7wIoh7pE85

2022/11/5 5:03:30

Trackerと称している部分はいわゆるレコンポーザやsted2などのステップシーケンサ+αでよいと思っていて、過去何度かトライしているがいずれも途中で放棄している始末。私にとって鬼門な機能なのだ😰

2022/11/5 5:05:51

直近ではgodot engineを使ってゲームを作ろうとしていて今作っているような波形メモリ音源+シーケンサを作ろうとしていた。これは一応シーケンスデータの入力まではできるようになっていた。が、godotでもカスタム頂点が使えないことを知ってグラフィック面で我儘を追求できないことがわかりお蔵入り https://t.co/7uREgMwKXu

2022/11/5 5:09:14

MappyのBGMを鳴らして喜んでたりしてたな・・
youtu.be/2EHHTQAyvFc

2022/11/5 5:10:14

今聞くといろいろおかしいな😅

2022/11/5 5:12:01

10年以上前はSTEd2をいじってたこともあったな。これにソフトシンセつければいける!とか思ってたのよね。たぶん。Windows版のSTEd2のソースコードはなかなか面白いつくりになっていたわ。
sfpgmr.net/blog/archive/c…

2022/11/5 5:13:35

X68000のBIOSをエミュレーションするレイヤみたいなのを作って、その上でもともとのSTEd2のコードをそのまま使って動かすような感じだったと思う。内部的にX68000をエミュレーションしているイメージでしたわ。それだけにちょっとこれは・・ってなってしまった。ヘタレなんで😭

2022/11/5 5:19:14

レコンポーザはゲーム会社にいたときに、rcpファイルをゲーム用BGMデータとしてそのまま読み込んで使うシステムのドライバを書いたのでちょっと知ってるんだけどね。そんなに詳しいわけではないけども。編集機能がえげつなく良くできてたんだよな。当時は感動したわ。

2022/11/5 5:19:59

コピペ、カットアンドペーストができるだけで「売り」になる時代でしたからな。なんともすごい時代ですよ😅

2022/11/5 5:25:24

過去にはRECOPというレコンポーザのクローンを見つけ、その追っかけもしていましたなあ・・このツールも完成を見ないまま凍結となってしまったみたい。かなりいいところまでいってたし、ソースコードも公開していたんだよね。ちなみにこのソースはかなり読みやすい。

hp.vector.co.jp/authors/VA0034…

2022/11/5 17:26:29

OpenSiv3D備え付けのAngelScriptで波形メモリのデータをスクリプトで生成できるようにしてみた。手書きだとサイン波形がきれいに書けないんだな・・ https://t.co/RPaFK9RL4R

2022/11/5 17:31:33

FM変調っぽい式で波形を生成してみたりもできる・・ https://t.co/ZKRG9qkuT6

2022/11/5 17:33:49

鋸波とかね・・きれいに書けるわ。やっぱり・・ https://t.co/LuI6hm2MKd

2022/11/6 7:35:01

さて、シーケンサの改造をしつつUI作りに入りますか・・ https://t.co/rbdeWlkUKb

2022/11/6 7:38:21

いやあ。imguiのおかげで私にしてはかなり捗った感じ。まさにdear imguiですわ。

2022/11/6 7:43:52

しかしAngelScriptってのは最近まで知らなかったな。これを知ったのはOpenSiv3Dをいじり始めたからだけど。なんかC++っぽい構文だけど微妙に違うみたい。キャストあたりとかはちょっとglslっぽい感じもするわ。
angelcode.com/angelscript/

2022/11/6 7:48:51

普通のAngelScriptと異なるのはOpenSiv3Dが持つオブジェクトやライブラリ的なものはビルトインで使えるようになってるところ。全部かどうか知らんけど。Math::Sin()とか普通に使えたんでね。これはありがたい。

2022/11/6 7:55:32

今回imguiのテキストボックスで入力された文字列をScriptオブジェクトに渡してコンパイルするっていうことをしてみたんだけど、imguiは文字がcharベースでOpenSiv3DはUTF32なんで変換が必要。ただOpenSiv3Dには文字コンバータもついてるんでそれ使えば簡単にできたんだな。

2022/11/6 8:03:18

あとコンストラクタの引数でもちょっとはまったな。Scriptのコンストラクタってファイル名かソースコードを引数に取ることができるんだけど、ソースコードを指定してもコンパイル済みにならないんだよね。あれ、なんで?ってなって。

Script script{U"void test(){};"}

2022/11/6 8:07:53

どうやらコード文字列はタグ付けしないといけないみたいで、いろいろまさぐった結果

Script script{s3d::Arg::code(U"void test(){};")}

こうすればできたんだな。おそらく文字列を指定した場合コンストラクタの定義順でファイルパス文字列としとコンストラクトされるからかな?とか思った。

2022/11/7 5:20:28

imguiとOpenSiv3Dの橋渡しコードを書いてくれた方がアップデートしてくれたのでそれを反映。
テキスト入力がおかしかったのがこれで解消された。
感謝感激😭
gist.github.com/sthairno/88774…

2022/11/7 5:25:25

そろそろundo/redoを考えんといかんなあ・・ってことで過去書いたundo/redo managerコードを引っ張りだしてきた。更新日付を見るとなんと2010年となっている。boost::functionとか使ってるな。そりゃまだこのころは標準ライブラリには入ってなかったもんなあ・・ https://t.co/PkojGT3RtZ

2022/11/7 5:28:06

これは典型的なコマンド・パターンとかいうやつで実装したやつじゃないかな。さらにboost::serializationで実装したやつもあったような気もするんだけどな。どこへいったかなあ🤔

2022/11/7 5:35:49

このバージョンはboost::bind使って、undoを処理する関数の引数にアンドウする値を束縛して、それをboost::function<void ()>に収め、undoはそれを呼び出すというアイデア。一応それなり動いてた気もするんだよな。
gist.github.com/sfpgmr/d98d129…

2022/11/7 5:38:13

今はboost::bind/boost::function両方とも標準ライブラリになったんだよな。確か。

2022/11/7 5:38:57

boost::mplとかもうさすがに使われてないのかもな。

2022/11/7 5:43:21

1.ツールがほぼ使えるようになってきてかららundo/redoを組み込む

2.最初からundo/redo対応コードを書く

どっちにするか悩みどころだ。過去はundo/redoコード書くのが煩わしすぎて嫌になり放置した経験を持つだけに、今回は1.で進めるとするかな。

2022/11/7 5:45:04

しかしエディタ作る人とかまあなんちゅうか、こういう極めて面倒くさいことをきっちりこなすってことだよな。もうそりゃリスペクトするしかないわな。

2022/11/7 7:50:25

ようやくSongエディタの制作に入った・・ https://t.co/LFpFLJkuKC

2022/11/10 6:38:51

Song Editorはぼちぼち実装中。MIDI INのノート入力をポリで受けるコードを書いてテスト中。
複数の鍵盤を押すとひとかたまりの入力としてまとめるんですな。コード入力に対応するためにね。 https://t.co/iZj9BmVqtC

2022/11/10 6:41:50

しかしImGuiは楽だなあ・・魔法のようですわ。コンセプトがすごいんだな。やはり。

2022/11/10 6:45:44

まだまだ先は長いが。このソングエディタはMC-8を元祖とするこだわりのST/GT方式で作るつもり・・

Mays@EightbitMays

2022/11/5 18:24:45

「音声合成データ変換ツール」により生成したYM2413用データを、VRC7に転用する検証をしたときの
設定ファイルデータ一式を公開します。
(OFGS2用のMML、設定用のasmファイル、再生用のNSF、少し改造したOFGS2のサウンドドライバ本体)

dropbox.com/scl/fo/gohce4s…

梶原正裕 / KAJA@kajaponn

2022/11/5 18:14:37

レアなのあったので弄ってみた#80mk2
エディターの音階表記が数字のみなのが辛すぎる😂12の倍数がCだよ的な https://t.co/Otb1f2QTZN

S.F.@SFPGMR

2022/11/4 20:44:51

@ocornut ありがとうございます。使ってみます!

ハップ@hap_inc

2022/11/3 18:48:51

再び起きた今朝の出来事 https://t.co/oy0PjZz2ut

S.F.@SFPGMR

2022/11/3 20:18:08

あらまた揺れた

S.F.@SFPGMR

2022/11/3 19:08:05

千葉県北西部かあ・・

typhoon.yahoo.co.jp/weather/jp/ear… https://t.co/LPXeDgo1wh

S.F.@SFPGMR

2022/11/3 19:05:49

ん、まあまあ揺れたな・・

Dōgen@Dogen

2022/11/1 19:04:35

when a japanese native teaches japanese https://t.co/XnLHnjQxwI

bekotaizi(ベコタイジ)@Indiedev@東京ゲームダンジョン@休職Unityフリーランス@bekotaizi

2022/11/2 11:02:50

AI画像生成ソフト色々使ってみたけど、Unityアセットを沢山買ったけど微妙に欲しいものが無くて、やっぱり自作した方が良いかもしれねぇ………ってなるときの心理になってる。

痒い所に手が届かない感。