ページ 11

ファミコンプログラムを作っているのですが…

Posted: 2009年11月12日(木) 13:22
by KEYONN_
cc65であいかわらず、c言語でファミコンプログラミングしているTKOZです。

今回は、サウンドの音の出し方について質問します。

サウンドのドレミファソラシドの音を出力する方法が分かりません。
矩形波のチャンネル1でいいのですが、以下のページを参考にして作ってみたのですが、
何の音すら再生されません。

http://hp.vector.co.jp/authors/VA042397/nes/apu.html
http://hp.vector.co.jp/authors/VA042397/nes/ioport.html

ソースはこんな感じです。

void SoundProc(int freq)
{
int num=0;
*(char*)0x4015=0x00;
num=1790000/(freq<<5)-1;
num=num&0x00FF;
*(char*)0x4002=num;
*(char*)0x4015=0x01;
}

I/Oレジスタ0x4003の
bit7-3 再生時間
bit2-0 再生周波数上位3bit データ値
というのは、どうすれば設定できますでしょうか?

Re:ファミコンプログラムを作っているのですが…

Posted: 2009年11月12日(木) 13:30
by たかぎ
例えば、再生時間をt、再生周波数をfとすると...
unsigned char t;
unsigned char f;
...
*(unsigned char*)0x4003 = (t << 2) | (f & 3);
でよいのでは?

# ファミコンのプログラミングはほとんど忘れました。

Re:ファミコンプログラムを作っているのですが…

Posted: 2009年11月12日(木) 17:52
by KEYONN_
先ほどの書き込みはネットカフェからのものです。

下のソースのようにしたのですが、音が全く鳴りません。
何故でしょうか?
void SoundPlay(void)
{
	int num;
	unsigned char t=0xF;
	*(char*)0x4015=00;
	
	num=1790000/(440*32)-1;
	
	num=num & 0x00FF;
	
	*(char*)0x4002=num;
	
	*(unsigned char*)0x4003 = (t << 2) | (440 & 3);
	
	*(char*)0x4003=num;
	
	*(char*)0x4015=01;
}

Re:ファミコンプログラムを作っているのですが…

Posted: 2009年11月12日(木) 18:05
by softya
こうじゃないですか?
num=1790000/(440*32)-1;
*(char*)0x4001=0;//とりあえずクリア
*(char*)0x4002=(num&0xff);
*(unsigned char*)0x4003 = (t << 2) | ((num>>8) & 0x03);

>*(char*)0x4003=num;
いらないです。

Re:ファミコンプログラムを作っているのですが…

Posted: 2009年11月12日(木) 19:54
by KEYONN_
http://gikofami.fc2web.com/nes/nes012.html
上記のページを参考に組んでみたした。
しかし、…メインループがおかしいのか、どうかは分かりませんが、
連続した音の再生は出来ませんでした。
時々、プツッって途切れるような音の鳴り方です。
というか、ほとんど音鳴りません。
void SoundPlay(void)
{
	int num;
	unsigned char t=0xF;
	
	*(char*)0x4015=0x01;
	
	*(char*)0x4000=0xBF;
	
	*(char*)0x4001=0xAB;
	
	num=1790000/(220>>5)-1; 
	//*(unsigned char*)0x4003 = (t << 2) | ((num>>8) & 0x03); 
	*(char*)0x4002=0xDC;
	*(char*)0x4003=0xF0;
	
}

Re:ファミコンプログラムを作っているのですが…

Posted: 2009年11月12日(木) 21:20
by toyo
NES研究室さんのHELLO WORLDサンプルにサウンドをつけてみました

Re:ファミコンプログラムを作っているのですが…

Posted: 2009年11月13日(金) 10:53
by toyo
ドレミファソラシドを鳴らしてみました
実機での確認は出来ないのでエミュでやりましたがVirtuaNESでは鳴ってくれました
6502はレジスタが8ビットしかないのでCの変数も8ビットのみでやったほうがいいと思います
スタックも少ないので引数のサイズも少ないほうがいいでしょうし

Re:ファミコンプログラムを作っているのですが…

Posted: 2009年11月13日(金) 17:05
by KEYONN_
今日は忙しかったので、返信が遅れました。

>toyoさん
ありがとうございます。
これで、なんとか自作の曲がサウンドで鳴らせそうです。