AY-3-8910PSGサウンドの使い方

「AY-3-8910PSGサウンドの使い方」の編集履歴(バックアップ)一覧はこちら

AY-3-8910PSGサウンドの使い方」(2012/05/03 (木) 23:34:53) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

AY-3-8910はPSGサウンドを再生するチップで比較的良く知られており、 数多くの機器に搭載されたサウンドデバイスである。 PSGはパルス波形を基本とした音で、同時発音数は3チャンネル、 このほかにノイズジェネレータ機能を含む。 単純なビープ音を発するのであれば最新のチップでは専用のLSIを用いずとも 可能だが、正確な音階やメロディー、和音を再現する場合は既存の機能では 不十分の場合があり、現在でもAY-3-8910などと互換性を持つ設計が用いられる事がある。 AY-3-8910I/Oアドレス |0xA0|Register number| |0xA1|Write| |0xA2|Read| AY-3-8910のレジスタは16個。音を発生させる場合は、3つあるチャンネルから、 各チャンネルの周波数と音量を設定するだけ。 音量をセットすると即座に音が発音する。FM音源LSIのような鍵盤のON/OFF といった制御は必要ではない。 音階は各チャンネルごとに用意されたレジスタにセットする。 ChannelAであればR0,R1。 このレジスタのパラメータは数値が小さくなるほど高音となる。 音階は二つのレジスタを組み合わせ12bitの長さを持つ。 この他に音量レジスタがある。ChannelA用のボリュームはR8。 音量は15段階が設定可能で、16を指定すると単調な音にくわえて振幅を変えるエンベロープ と呼ばれる効果を指定可能。 音階は12bitで指定し、R0,R1の二つで一つのチャンネルの音階を指定する。 このレジスタセットはチャンネルAからチャンネルCの三つがある。 R7で各チャンネルやノイズ音源の有効、無効を指定する。 これはミキサー切り替え機能。 PSG音源のチップはFM音源LSIの打鍵ON/OFFという区別はなく、 直接ボリュームを指定するとダイレクトに音が再生される。 このほか一つだけエンベロープの振幅変化パターンを指定することが可能。 このエンベロープは振幅を一定のパターンと周期(周波数)によって変化 させるもの。 R11,12で周波数を指定し、R13でエンベロープのパターンを指定する。 有効化する場合は、ABC各チャンネルの音量指定レジスタの5bitを1として有効化する。 エンベロープ機能が有効の時は音量設定は意味を持たない。 AY-3-8910、PSGの基準クロックはCPUクロック(3.57Mhz)の1/2である、1.7897MhzをAY-3-8910に入力し、 内部で1/16した周波数、111.86khzがPSG音源の基準信号となる。 チャンネルの各周波数は基準信号、111.86Khzに対する分周(割り算)比で 指定する。 ChannelAの周波数レジスタにR0=255、R1=0を設定する場合は、111.86khz/255=438.667hzとなる。 この場合は438hzの音が鳴るという事。 音階を再生する場合は、ドレミの音階を周波数に変換するテーブルを 用意しておくと良いだろう。 オクターブ表は[[URLhttp://ngs.no.coocan.jp/doc/wiki.cgi/TechHan?page=1%BE%CF+PSG%A4%C8%B2%BB%C0%BC%BD%D0%CE%CF>http://ngs.no.coocan.jp/doc/wiki.cgi/TechHan?page=1%BE%CF+PSG%A4%C8%B2%BB%C0%BC%BD%D0%CE%CF]] の表5-1を参照。 一定の時間間隔で音をコントロールし、指定されたオクターブを演奏する プログラムを書くと、それらはシーケンサと呼ばれる音楽演奏機となる。 AY-3-8910は汎用的な音源LSIで、多くの機械に搭載されている。音源LSIの詳細は以下の資料を参照。 [[URLhttp://www.vdsteenoven.com/aquarius/psgprog.html>http://www.vdsteenoven.com/aquarius/psgprog.html]] [[URLhttp://ngs.no.coocan.jp/doc/wiki.cgi/TechHan?page=1%BE%CF+PSG%A4%C8%B2%BB%C0%BC%BD%D0%CE%CF>http://ngs.no.coocan.jp/doc/wiki.cgi/TechHan?page=1%BE%CF+PSG%A4%C8%B2%BB%C0%BC%BD%D0%CE%CF]] -C言語によるAY-3-8910を直接操作しPSGサウンドを発生するサンプル。 extern unsigned char inp(unsigned char); extern outp(unsigned char,unsigned char); void psgsound(unsigned char reg, unsigned char parm); void main(void){ volatile unsigned long i; //CH-A Freq psgsound(0,0x55); psgsound(1,0); //Mixer psgsound(7,56); //Vol psgsound(8,15); //Wait for(i=0; i<30000; i++); //Vol psgsound(8,0); } void psgsound(unsigned char reg, unsigned char parm){ volatile int i; outp(0xA0,reg); //wait for(i=0; i<1000; i++); outp(0xA1,parm); } コンパイルは以下の通り >sdcc -mz80 -c psg1.c >sdld -b _CODE=0x100 -b _DATA=0x100 -i psg1.ihx psg1.rel iolib.rel >makebin -s 4096 psg1.ihx > psg1.bin >perl binout.pl > psg1.com 上記のコードは、以下のBASICと等しい。 10 sound 0,&h55 20 sound 1,0 30 ' 40 sound 7,56 50 ' 60 sound 8,15 70 ' 80 for i=0 to 10000:next i 85 ' 90 sound 8,0 以下の例は音階を変える例。 extern unsigned char inp(unsigned char); extern outp(unsigned char,unsigned char); void psgsound(unsigned char reg, unsigned char parm); void main(void){ volatile unsigned int j; unsigned int i; unsigned int k; //CH-A Freq psgsound(0,0x55); psgsound(1,0); //Mixer psgsound(7,56); //Vol psgsound(8,15); for(k=0; k<5; k++){ for(i=0; i<80; i=i+5){ psgsound(0,0x55-i); //Wait for(j=0; j<10000; j++); } } //Vol psgsound(8,0); }

表示オプション

横に並べて表示:
変化行の前後のみ表示:
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。