WebアプリケーションでPSGを再現するドライバ


WebアプリケーションでPSG(Programmable Sound Generator)を再現するドライバ「PSG for Web」を作成しました。

PSGとは

PSG(Programmable Sound Generator)とは、狭義にはゼネラル・インスツルメンツ社(GI)の音源LSI「AY-3-8910」を指しますが、広義には同様の原理による音源チップや音源を指します。

【参考】Programmable Sound Generator – Wikipedia

PSGは、デューティ比1:1(高と低の時間が均等)の矩形波を基本波形とし、エンベロープ(時間に対して音量を変化させること)を組み合わせることで様々な音色を出すことができます。

PSG for Webの目的

このドライバの目的は、昔のパソコンソフト(主にゲーム)をWebアプリケーションとして復刻する際に、当時の雰囲気を再現するとともに、近年ひとつの表現手法として認識されている「チップチューン」の制作に資することを目的としています。

PSG for Webの特徴

「PSG for Web」は、AY-3-8910の動作を再現します。AY-3-8910では14個のパラメータ(レジスタ)を指定することにより様々な音を出すことができます。AY-3-8910は外部から供給されるクロック周波数とレジスタの値により出力される周波数(音の高さ)が決まりますが、「PSG for Web」では、デフォルトではMSXの規格に合わせてクロック周波数を「1.7897725MHz」(CPUのクロック周波数の半分)として処理しています。

また、「PSG for Web」は、MSX BASICのPLAY命令(MMLによる音楽演奏)とSOUND命令(レジスタ値を直接設定)に相当する機能を提供します。

使い方

初期化

まず、PSGWEBをnewしてオブジェクトを生成します。続いて、生成したオブジェクトのinitメソッドを呼び出して初期化します。initメソッドは非同期処理であるため、処理が終わり次第callbackで指定された関数を呼び出します。Web Audio APIの仕様により、ユーザーのアクション(ボタンのクリック等)を起点にしないと音が出ないため、initメソッドはユーザーアクションのイベントハンドラから呼び出す必要があります。

パラメータとしてクロック周波数の値(単位はHz)を与えることにより、レジスタ値に対する音の高さを変えることができます。省略した場合は、1789772.5を指定したものとみなされます。

initメソッドで指定したコールバック関数が呼び出された場合、playメソッドやsoundメソッドで音を出すことができます。ブラウザがWeb Audio APIに対応していない場合、コールバック関数は呼び出されませんので、コールバック関数が呼ばれなくても全体の処理が止まらないようにプログラミングする必要があります。

演奏

play(mml1[,mml2[,mml3]]);

MMLで記述される音楽を演奏します。MSX BASICのPLAY命令に相当します。MMLもMSX BASICのものに準拠しています。戻り値はありません。MMLに文法違反があった場合、MSX BASICでは、Illegal function callエラーが発生しますが、PSG for Webでは例外がスローされることはなく、無視されます。

sound(register,value);

PSGのレジスタ値を直接設定します。MSX BASICのSOUND命令に相当します。registerがレジスタ番号(0〜13)、valueがレジスタに設定する値です。戻り値はありません。

PSG for Webの構成

PSG for Webは、Web Audio APIのAudioWorkletによりPSGの動作を再現しています。しかし、2020年11月時点ではiOSの各ブラウザ、macOS版SafariはAudioWorkletに対応していないため、前世代の仕様であるScriptProcessorでも同じ処理を実装しており、AudioWorkletを使用できない場合はScriptProcessorにより動作します。

PSG for Webは次のような構成になっています。

ファイル名説明
psgweb-x.y.z.jsPSG for Web本体です。MSX BASICのPLAY命令に相当するMMLのパース機能を提供します。また、ScriptProcessorによるPSGエミュレーション機能も提供します。
psgawp-x.y.z.jsAudioWorkletによるPSGエミュレーションルーチンです。Workletの仕様により、HTMLのscriptタグではなく、psgweb-1.0.0.jsからHTTP(S)により呼び出されます。
※配置場所は、https://www.minagi.jp/apps/util/。

使用例

1.PSGピアノ

ソースコード

2.MMLによる演奏

ソースコード

その他

本作と目的が似ている「FONTX for Web」はネット上を探してみても同じことをしている例が見つからなかったのですが、こちらはすでに多くの方が同様の取り組みをされているようです。「チップチューン」の隆盛がうかがわれます。

参考文献

自作のWASMプリプロセッサを使ってPSGエミュレータを作った。 – sfpgmr氏

emu2149 – Digital Sound Antiques氏

改訂履歴

日付バージョン内容
2020/12/121.0.0初回リリース