SEGA SOUND / INTRODUCTION

JavaScriptでメガドライブのSega PSGを鳴らす

FMとは違う、矩形波とノイズの音作りを、短いJavaScriptで試してみましょう。

このページの試し方

各例のRunで再生、Stopで停止します。コードの値を一つ変えて、もう一度Runして聴き比べてください。再生は自動では始まりません。比較するときは、先にもう一方の例をStopしてください。

サンプルは最後に音源を解放する短い演奏です。実機のスピーカーやアンプの音色を再現するものではありません。

FMの隣にある、もう一つの音源

メガドライブではYM2612のFM音源に加えて、Sega PSGが矩形波とノイズを担当します。3つのトーンチャンネルと1つのノイズチャンネルがあり、それぞれ音量を設定できます。

トーンは50%デューティの矩形波です。Game Boyのようなデューティ比の切り替えや、自動のエンベロープを設定する機能はありません。音程と減衰量の変化を組み合わせて音を作ります。

1. 矩形波で、ドレミを鳴らす

A4などの音名からトーン周期を計算します。まずそのままRun。次にattenuation = 6を12に変えて、小さくなることを確かめます。数値を大きくすると音量は下がり、15は消音です。

このコードを別タブのPlaygroundで編集 ↗

2. 3チャンネルを重ねる

3つのトーンチャンネルを同時に使ってC・E・Gの和音を鳴らします。notesを変えると和音が変わります。同時発音では音量が加算されるため、この例は各CHの減衰量を10にしています。

このコードを別タブのPlaygroundで編集 ↗

3. ノイズも、音色を選べる

whiteのlow → medium → high、次にperiodicの同じ3種類を鳴らします。whiteは不規則な質感、periodicは繰り返しが聞こえる質感です。typeとrateを固定すると、一つの音だけを繰り返し比較できます。

別の設定rate: "tone3"ではCH3のトーン周期がノイズの周期に関係します。CH3のトーンとノイズを完全に独立して調整できる設定ではありません。

このコードを別タブのPlaygroundで編集 ↗

音程・音量・時間の関係

APIPSGでの操作
tone(ch, {note})物理CH 0〜2の10 bit周期。既定クロック3,579,545 Hzでは周波数は概ねclock / (32 × period)。音名は表現できる周期に丸めます。
attenuation0〜14は約2 dBずつの減衰、15は消音。音量の線形倍率を表す数値ではありません。
noise({type, rate})ノイズ方式と周期。white / periodic、low / medium / high / tone3。
off(ch) / noiseOff()該当チャンネルの減衰量を15にします。

sleep()はJavaScript側の待ち時間です。音量を段階的に書き換えると減衰する音を作れますが、それはPSGの自動エンベロープではなくソフトウェアによる制御です。

実際の曲では音程・音量・ノイズの設定を演奏中に書き換えます。発音時の設定だけでは、その時間変化まで再現できません。