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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
KEYONN_

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

#1

投稿記事 by KEYONN_ » 15年前

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:ファミコンプログラムを作っているのですが…

#2

投稿記事 by たかぎ » 15年前

例えば、再生時間をt、再生周波数をfとすると...
unsigned char t;
unsigned char f;
...
*(unsigned char*)0x4003 = (t << 2) | (f & 3);
でよいのでは?

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

KEYONN_

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

#3

投稿記事 by KEYONN_ » 15年前

先ほどの書き込みはネットカフェからのものです。

下のソースのようにしたのですが、音が全く鳴りません。
何故でしょうか?
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;
}

softya

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

#4

投稿記事 by softya » 15年前

こうじゃないですか?
num=1790000/(440*32)-1;
*(char*)0x4001=0;//とりあえずクリア
*(char*)0x4002=(num&0xff);
*(unsigned char*)0x4003 = (t << 2) | ((num>>8) & 0x03);

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

KEYONN_

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

#5

投稿記事 by KEYONN_ » 15年前

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;
	
}

toyo

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

#6

投稿記事 by toyo » 15年前

NES研究室さんのHELLO WORLDサンプルにサウンドをつけてみました

toyo

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

#7

投稿記事 by toyo » 15年前

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

KEYONN_

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

#8

投稿記事 by KEYONN_ » 15年前

今日は忙しかったので、返信が遅れました。

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

閉鎖

“C言語何でも質問掲示板” へ戻る