1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
# Fmplayer (仮)
PC-98用のFM音源ドライバエミュレーション(予定)
## 現在の状況:
* 対応ドライバ: PMD, FMP (PLAY6含む)
* PMD: FM, SSG, リズムパート, ADPCM, PPZ8(一部)のみ対応, PPS, P86 対応は未定
* FMP: PPZ8, PDZF にほぼ対応
* UI: GTK3 で作った仮のものと、仮 Win32 版
![gtk screenshot](/img/screenshot_gtk.png?raw=true)
![gtk toneviewer screenshot](/img/screenshot_gtk.toneview.png?raw=true)
![w2k screenshot](/img/screenshotw2k.png?raw=true)
* PMD, FMP の形式を解析するついでに作ったもので、手持ちのデータが少ないため再現性は PMDWin, WinFMP の劣化版
* FM は 55467Hz で合成, SSG は 249600Hz で合成した後 sinc でフィルタして混合 (高調波の多い矩形波に対して線形補間を行ったりはしません)
* FM 合成は特定の条件下で実チップ OPNA/OPN3 の出力と 4 <= ALG の時のステレオ出力を含めて完全に一致 (エンベロープは完全でなく、AR >= 21 のときのみ一致)
* CSM モード (効果音モードとの違いが分からない) と SSGEG とハードウェア LFO 未対応
* PPZ8 は線形補間のみ(オリジナルの無補完よりは…)
* libopna, fmdriver 部分は freestanding な c99 (のはず) なのでマイコンからFM音源の制御にも使える (但し曲データを全部読み込むバッファが必要なので SRAM が 64KB くらいは必要)
## 今後の予定:
* まともなUIを作る
* MDRV2, PLAY5などの対応
* 他人に見せられるくらいにはコードを綺麗にする
## (まだ使えるような状況じゃないけど) 使い方
### GTK 版の仮 UI
gtk3, portaudio を使用します。
```
$ cd gtk
$ autoreconf -i
$ ./configure
$ make
$ ./fmplayer
```
`$HOME/.local/share/fmplayer/ym2608_adpcm_rom.bin`からMAME互換のドラムサンプルを読み込みます。
現在のところタイトル表示は font.rom を `$HOME/.local/share/fmplayer/font.rom` に置かなければ表示されません。(2バイト半角文字、 Ambiguous Width など色々な問題があるのでわざわざ自力でフォントを読む構造にしてあります、そのうち font.rom がなくてもとりあえず表示できるようにはします)
### WIN32 版の仮 UI
Releases:
https://github.com/takamichih/fmplayer/releases/
MinGW でコンパイルします。~~MSVCでもコンパイルできると思います。~~ c11 atomics を使い始めたので MSVC ではコンパイルできないと思います。
```
$ cd win32/x86
$ make
```
exe の置いてあるディレクトリの中の`ym2608_adpcm_rom.bin`からMAME互換のドラムサンプルを読み込みます。
DirectSound, WinMM の順に使用します。Windows 2000 までの API しか使用していないので、理論的には PC-98 実機でも動くはずですが、libopna 部の処理が最適化されてなく非常に重いため手持ちの PC-9821V12 (Pentium 120MHz) や PC-9821Ra300 (P6 Mendocino Celeron 300MHz) では半分くらいの速度でしか再生されませんでした。
|