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

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

MSX研鑚推進委員会@mdpc___

2022/9/11 14:07:37

需要があるか分かりませんが、BASIC上動く音声合成再生ソフトを作りました。
メインRAM128Kバイト以上のMSX2以降が対象です。
MGSDRVやPLAY文と併用したい方はご利用下さい。

mdpc.dousetsu.com/utility/msx/wa…

※MSX turboR A1GT使用
※動画の音声はSCC5音/FM6音/FM6音での再生です
※1秒当り720バイトの消費 https://t.co/u3c5tMNeGU

S.F.@SFPGMR

2022/9/11 6:59:36

茨城県鉾田市で。
大洗まで続く長い海岸。いやしかしここは九十九里浜に匹敵するほどの広大な砂浜ですわ。太平洋の雄大さを感じますわ。 https://t.co/MpW67rtMxW

2022/9/11 7:05:01

そして涸沼でキャンプした。涸沼もかなり大きな湖。釣り人が多かった。しかし風がかなり強くて設営に苦労した・・。 https://t.co/W2BR64TMYb

2022/9/11 7:11:57

大人になってからはデイキャンくらいしかしたことなくて、テントで泊まったのは学生時代以来なのですが😅
虫の音や鳥の鳴き声、波の音が一斉にウワーってな感じに鳴り響き、私は耳栓なしでは眠ることができなかった・・どうも耳が異様に大きな敏感みたく・・

2022/9/11 7:17:18

焚き火。
炎をじっと見ていると時間のたつのを忘れてしまうよな・・
今日の場所は松葉が大量に落ちていたのでそれで火おこしした。枯れた松葉があると火おこしに便利。 https://t.co/558OdeJ22r

2022/9/11 7:19:07

熾火とかもきれいですよ。ほんと。。 https://t.co/uUCWTZMnzu

S.F.@SFPGMR

2022/9/5 7:37:03

そうかあ・・MSX3も半導体供給不足の影響を受けてるのか・・そりゃそうか

西 和彦 Kazuhiko Nishi@nishikazuhiko

2022/9/5 3:43:31

#MSXDEVCON
Devcon2 will be when we have working SDK(msx engine3 and motherboard light) and ready to go for developers. We are doing our best to make that but semicon shortage is our headquake.

西 和彦 Kazuhiko Nishi@nishikazuhiko

2022/8/30 6:36:21

msx3もmsx0もビルゲイツに会ってちゃんと説明しました

最初は懐疑的だったけど、しっかりやれと言われたです

日本に来た最初の日2時間

S.F.@SFPGMR

2022/8/28 20:35:38

Daddy's Carを最近よく聞いてしまうなあ・・
youtu.be/NMqVUniRUqk

2022/8/28 20:37:46

もちろんこちらを聴いてカーディガンズのことを知ったのですが。802かなんかでヘビーローテーションになってましたなあ。かなり前の話ですが・・
youtu.be/7bK5EPjGri4

2022/8/28 20:39:23

でもこっちのほうが大ヒットしたから、このイメージのほうが強いんだろうなあ・・
私は実はこの曲がカーディガンズであることを知らんかった😭
youtu.be/NI6aOFI7hms

S.F.@SFPGMR

2022/8/28 17:11:33

さっきTLで流れてきたが、これは楽しそうなイベントだなあ。。

Wheel Reinvention Jam 2022 | Handmade Network
A one-week jam to change the status quo. August 15 - 21 on Handmade Network.

新山祐介 (Yusuke Shinyama)@mootastic

2022/8/28 7:57:07

つい先週終了したが「車輪の再発明ジャム」というイベントがあったらしい。文字通りみんなでGUIライブラリやprintf関数などを再発明するオンライン大会。
handmade.network/jam

ざきち@zakichi_

2022/4/9 20:45:52

#俺が作るとこうなる

サンダーフォースのようなゲームを作ろうと思っていたらR-TYPEに脱線したけど最後サンダーフォースに戻ってるのでギリセーフ

#STG #shmup #VASTYNEX

DL:zakichi.itch.io/vastynex https://t.co/GNhG63jxTu