fmgen 008 — pmd-hle での入手元と改変(このファイルは UTF-8。ほかのファイルは元のまま Shift_JIS・CRLF) 入手元 http://retropc.net/cisc/sound/dl/fmgen008.lzh (cisc 氏のサイト、2026-10-14 に取得) SHA-256 e7c30e842d994c4fc65495508899e045710ccc2f046a7a2ee9cac087ad8c6b39 書庫の 18 ファイルをそのまま置いた。readme.txt は改変していない(配布の条件 4)。 改変(配布の条件 3。どれも該当の行に「pmd-hle:」と書いてある) headers.h windows.h を Windows のときだけ読む。それ以外では HANDLE・MAX_PATH・__stdcall を置く。 types.h を読む(元は M88 の側で読まれていて、fmgen.h の読む行はコメントになっている)。 fmgen.cpp Operator::MakeTable の「*p++ = p[-512] / 2;」を「*p = p[-512] / 2; p++;」に。 元の式は評価の順が決まらない(NP2kai の fmgen にも同じ直しがある)。 fmgeninl.h Operator::KeyOn の「ssg_phase_ = -1;」を「ssg_phase_ = ssg_type_ ? -1 : 0;」に。 SSG-EG を切ったままキーオンして -1 が残ると、そのあと SSG-EG を入れたときに表の添字が負になる (QuuBee で見つけたもの。QuuBee の NP2kai パッチ 13)。 fmgen.h Operator に EGOut()(eg_out_ を読むだけ)を足す。 opna.h OPNA に dbgGetRhythm()(リズムの音の並び・長さ・位置と音量を読むだけ)を足す。 どちらもエディタのパートごとのメーターのため(src/machine/opna.cpp の opna_levels)。合成は変えない。 psg.cpp PSG::PSG で scount[3](トーンの数え)と ncount(ノイズの数え)を 0 にする。元はどこでも初期化しないので、 置かれたメモリの前の中身で SSG の音の位相が変わり、同じ曲でも音が食い違った(2026-10-23。ネイティブでは 新しいプロセスのヒープが 0 なのでたまたま揃い、wasm ではコンパイルで使ったあとのメモリに置かれて食い違った)。 使わないもの file.cpp は Windows の API で書かれているので組まない。代わりに src/machine/fmgen_file.cpp(stdio 版)を組む。 opm.cpp は使わない。 組み方 C++03(-std=gnu++03)。C++11 では psg.cpp の初期化子が縮小変換で通らない。