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は消音です。
2. 3チャンネルを重ねる
3つのトーンチャンネルを同時に使ってC・E・Gの和音を鳴らします。notesを変えると和音が変わります。同時発音では音量が加算されるため、この例は各CHの減衰量を10にしています。
3. ノイズも、音色を選べる
whiteのlow → medium → high、次にperiodicの同じ3種類を鳴らします。whiteは不規則な質感、periodicは繰り返しが聞こえる質感です。typeとrateを固定すると、一つの音だけを繰り返し比較できます。
別の設定rate: "tone3"ではCH3のトーン周期がノイズの周期に関係します。CH3のトーンとノイズを完全に独立して調整できる設定ではありません。
音程・音量・時間の関係
| API | PSGでの操作 |
|---|---|
tone(ch, {note}) | 物理CH 0〜2の10 bit周期。既定クロック3,579,545 Hzでは周波数は概ねclock / (32 × period)。音名は表現できる周期に丸めます。 |
attenuation | 0〜14は約2 dBずつの減衰、15は消音。音量の線形倍率を表す数値ではありません。 |
noise({type, rate}) | ノイズ方式と周期。white / periodic、low / medium / high / tone3。 |
off(ch) / noiseOff() | 該当チャンネルの減衰量を15にします。 |
sleep()はJavaScript側の待ち時間です。音量を段階的に書き換えると減衰する音を作れますが、それはPSGの自動エンベロープではなくソフトウェアによる制御です。
実際の曲では音程・音量・ノイズの設定を演奏中に書き換えます。発音時の設定だけでは、その時間変化まで再現できません。