ゲームには何と言っても音関連が欠かせませんが
ゲームボーイのサウンドにはノイズやゾンビモードなど
厄介な問題が存在するため今まで避けてきました。
が、その辺りの事はとりあえず無視して音を鳴らしてみます。
といっても、音関係のレジスタに決まった値をセットするだけです。
資料となるページはこのあたりでしょうか。
では、プログラムを作ってみましょう。
#include <stdio.h>
#include <gb.h>
// タイルデータ
#include "Ascii_misaki.c"
UBYTE input_on, input_old, input_edge, input_trg;// キー入力用
// サウンド関連の全レジスタを初期化
void snd_reg_init()
{
NR10_REG = 0;
NR11_REG = 0;
NR12_REG = 0;
NR13_REG = 0;
NR14_REG = 0;
NR21_REG = 0;
NR22_REG = 0;
NR23_REG = 0;
NR24_REG = 0;
NR30_REG = 0;
NR31_REG = 0;
NR32_REG = 0;
NR33_REG = 0;
NR34_REG = 0;
NR41_REG = 0;
NR42_REG = 0;
NR43_REG = 0;
NR44_REG = 0;
NR50_REG = 0;
NR51_REG = 0;
NR52_REG = 0;
}
void proc()
{
if (input_trg & J_A) {
gotoxy(5, 2);
print("PLAY");
// チャンネル制御
NR52_REG = 0x80;// b7:全チャンネルON=1 / b3-0:チャンネル4~1再生中フラグは読込のみ
NR50_REG = 0x77;// b7:左VinOF=0F / b6-4:左音量=7 / b3:右VinOFF=0 / b2-0:右音量=7
NR51_REG = 0xFF;// b7-4:チャンネル4~1左出力ON=F(1111) / b3-0:チャンネル4~1右出力ON=F(1111)
// チャンネル1(矩形波スイープあり)
NR10_REG = 0x00;// b6-4:スイープ時間=0 / b3:スイープ方向=0(上) / b2-0:スイープ変化量=0
NR11_REG = 0xC0;// b7-6:デューティ比=3 / b5-0:音長カウンタ=0
NR12_REG = 0xF0;// b7-4:初期音量=15 / b3:エンベロープ増減=0(減) / b2-0:エンベロープ単位時間=0
NR13_REG = 0x0A;// b7-0:周波数(11ビットの下位8ビット)
NR14_REG = 0x86;// b7:開始フラグ=1 / b6:カウンタ再生フラグ=0 / b2-0:周波数(11ビットの上位3ビット)
}
if (input_trg & J_B) {
gotoxy(5, 2);
print("INIT");
snd_reg_init();// サウンドレジスタ初期化
}
}
// VBL割込で呼ばれる
void vbl_isr(void)
{
// キー入力
input_old = input_on;
input_on = joypad();
input_edge = input_on ^ input_old;
input_trg = input_on & input_edge;
proc();
}
void main()
{
DISPLAY_OFF;// 画面全体を非表示
HIDE_BKG;// BGを非表示
HIDE_SPRITES;// スプライトを非表示
print(" ");// ダミー描画
set_bkg_data(32, 64, AsciiBgLabel);// アスキー文字
// SHOW_SPRITES;// スプライトを表示
SHOW_BKG;// BGを表示
DISPLAY_ON;// 画面全体を表示
disable_interrupts();// 割込無効
add_VBL(vbl_isr);// VBL割込に追加
enable_interrupts();// 割込有効
set_interrupts(VBL_IFLAG);// VBL割込セット
snd_reg_init();// サウンドレジスタ初期化
// メインループ(無くても良いけど何となく)
while(1) {
delay(1000UL);
}
}
Aボタンを押すと音が鳴ります(音量注意)。
Bボタンを押すと音が止まります。
他のチャンネルも鳴らしてみます。
他のチャンネルも鳴らしてみます。
// チャンネル2(矩形波) NR21_REG = 0xC0;// b7-6:デューティ比=3 / b5-0:音長カウンタ=0 NR22_REG = 0xF0;// b7-4:初期音量=15 / b3:エンベロープ増減=0(減) / b2-0:エンベロープ単位時間=0 NR23_REG = 0xB2;// b7-0:周波数(11ビットの下位8ビット) NR24_REG = 0x86;// b7:開始フラグ=1 / b6:カウンタ再生フラグ=0 / b2-0:周波数(11ビットの上位3ビット) // チャンネル3(波形メモリ音源) NR30_REG = 0x80;// b7:出力ON=1 NR31_REG = 0x00;// b7-0:音長=0 NR32_REG = 0x20;// b6-5:音量 100%出力=1 ※ミュート(0%出力)=0、50%出力=2、25%出力=3 NR33_REG = 0x72;// b7-0:周波数(11ビットの下位8ビット) NR34_REG = 0x86;// b7:開始フラグ=1 / b6:カウンタ再生フラグ=0 / b2-0:周波数(11ビットの上位3ビット) // チャンネル4(ノイズ) NR41_REG = 0x00;// b5-0:音長=0 NR42_REG = 0xF3;// b7-4:初期音量=15 / b3:エンベロープ増減=0(減) / b2-0:エンベロープ単位時間=3 NR43_REG = 0x33;// b7-4:周波数シフト量=3 / b3:カウンタ単位(0:15/1:7)=0 / b2-0:周波数=7 NR44_REG = 0x80;// b7:開始フラグ=1 / b6:カウンタ再生フラグ=0
4チャンネル同時に鳴りました。
0 件のコメント:
コメントを投稿