キノコの自省録

日々適当クリエイト

YMZ294のエンベロープについて

ちょっぴりとっつきにくいYMZ294のエンベロープについて。

YMZ294には、音量を増減させるためのエンベロープ機能が用意されています。音量だけなので、今ならソフトウェア的に強引に変えたり、回路工夫すればこれ使わなくても表現できますけど、せっかく用意されている機能なので、使わない手はないでしょう。

PSGのエンベロープとの出会いは、私が小学生の頃、MSX時代に遡ります。しかし、当時はエンベロープパターンと周期の関係がいまいち理解できず、謎の機能としてなんとなく使用していました。

どうでもいい話はおいといて、エンベロープの設定は、次のように行います。

エンベロープ周期

エンベロープ周期は、16bitで設定します。0~65535です。確か、MSXMMLでも、この値を入力していた記憶があります。

YMZ294の値指定はだいたいどれもそうなのですが、この値が直接使われる、つまり、この値=周波数ということはありません。仕様書に記載の通り、

fe =  fsc / 256EP(Hz)

です。EPは入力値、fscは2,000,000です。つまり、65535を入力すると、fe=0.1192(Hz)となります。値が大きいほど、周波数が小さくなります。

EPの値域は0~65535のため、エンベロープ周波数の値域は、0.1192 < fe < 7812.5と求まります。

fe=1Hzだと、エンベロープパターンを1秒に1回繰り返す、fe=1000Hzだと、エンベロープパターンを1秒に1000回繰り返すということです。念のため。

エンベロープパターン

エンベロープパターンは、仕様書に書いてある通りです。単純に減衰したり、ギザギザの音量変化をしたりといった具合です。ただ、これエンベロープ周期との関係がいまいちわかりにくいです。

一応書いてあるのですが、最初見たとき意味がわかりませんでした。この赤線のところに書いてあります。

f:id:kinokorori:20170405232017j:plain

何を言っているのかというと、fe=1Hzの時、→| |←これで示される幅が1周期分だということです。例えば、単純な減衰の場合、fe=1Hzだと、ちょうど1秒で音量が0になります。山型のエンベロープの場合、fe=1Hzの時、2秒で登って下ります。

エンベロープ使用上の注意

これも仕様書に書いてありますが、エンベロープパターンをレジスタに書き込むと、YMZ294内部のカウンター(5bit)をクリアして、カウントを開始します。繰り返し系のエンベロープの場合は問題ありませんが、繰り返しのないエンベロープパターン(0, 4, 9, 11, 13, 15)は、一度カウンタが上がりきってしまうと、そこでストップしてしまいます。

つまり、メロディーを1音鳴らすたびに、エンベロープパターンをYMZ294に書き込んで、カウンタをリセットする必要があります

エンベロープサンプルムービー

エンベロープなし、9番0.8Hz, 10番10Hz, 10番100Hzです。ギザギザ系のエンベロープは、周波数を上げると歪んで聞こえるようになります。ちなみに曲は風色メロディ。

youtu.be