自作ファミコンソフトとcc65でのΔPCMの再生について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
KEYONN_
記事: 70
登録日時: 14年前

自作ファミコンソフトとcc65でのΔPCMの再生について

#1

投稿記事 by KEYONN_ » 14年前

こんばんわ。TKOZです。
ファミコンプログラムにハマッております。
BGの書き換え方が大体分かってきたのですが、横スクロールとか、縦スクロールになると
難しく感じてしまいます。

ところで、面白半分でふざけて録音したwavファイルをcc65で(startup.asm内で)読み込んで
再生しようとふと思いました。
ところが、上手く再生されません。

具体的には、自分が「メタルスラッグ」と発音したのですが、ノイズが乗ってしまい、
「ピーィィガーァァ・・・ベェエアタグ」みたいな感じになってしまいます。
ファミコンのDPCMはそんなに悪い音質なのでしょうか?
確かに8ビットから>>1して7ビットPCMにするのですが、そこまで悪くなるとは思えません。

ソース一式をアップロードするので、どこがマズいのか教えて欲しいです。

あと、
一応、5つのwavファイルを入れようとしたのですが、cc65でのバンク切り替えと、
読み込み方が分からないので、metalslug.wavしか読み込んでないです。

あと、とある有名掲示板のゲーム開発技術板のファミコンスレッドでPCM再生のアセンブリソース
を公開していた人がいたので、参考にさせていただきました。
添付ファイル
pcm_on_cc65.zip
(55.75 KiB) ダウンロード数: 163 回

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 自作ファミコンソフトとcc65でのΔPCMの再生について

#2

投稿記事 by softya(ソフト屋) » 14年前

ファミコンで組んだことは無いので気になるところを指摘しておきます。

どうみてもiが初期化されていない。

コード:

void SetUpPCM()
{
	int i;

	*buffer=*(char*)0xc000;
	
	buffer[i]>>=1;
	
	*(char*)0x4011=*(buffer+0);
	
	
}
DPCMのレジスタ0x4010~0x04013の内0x4011しか初期化していないのでは?
あと*(char*)0x4011=*(buffer+0);もアドレスを入れていない気が。
NES研究所によるとN x 0x40 + 0xC000のNを入れるが正しいようです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

たかぎ
記事: 328
登録日時: 14年前
住所: 大阪
連絡を取る:

Re: 自作ファミコンソフトとcc65でのΔPCMの再生について

#3

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

0xc000番地を更新しようとしていますが、その領域はROMでは?
(少なくとも本物のファミコンではそうです)
もうひとついうと、本物のファミコンでは、ROM領域にMMCのレジスタがアサインされていることが多く(カセットの基板構成によります)、ここに書き込むと、バンク切り替えなどが起こります。
TKOZ さんが書きました:横スクロールとか、縦スクロールになると
難しく感じてしまいます。
本物のファミコンでは、縦スクロールと横スクロールの切り替えは、カセット基板上のショートランドで切り替えるのが基本です。
MMCを使う場合は、そのレジスタを設定することで切り替えられたりします。
お使いの環境ではどうなんですかね?

アバター
KEYONN_
記事: 70
登録日時: 14年前

Re: 自作ファミコンソフトとcc65でのΔPCMの再生について

#4

投稿記事 by KEYONN_ » 14年前

TKOZです。返信が遅れてすみません。
cc65でのΔPCMの実装例が下のURLに書いてあります。
http://www37.atwiki.jp/kikakubu4/pages/62.html#library

他にも横スクロール、縦スクロールなどの実装例が載っていますが、
あくまで参考例にとどまっており、実際にはソースを改造しなければいかないようです。

これを参考に作ってみる予定です。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 自作ファミコンソフトとcc65でのΔPCMの再生について

#5

投稿記事 by softya(ソフト屋) » 14年前

PCMの例は、リンク先のこちらでしか見つかりませんでした。
http://www.geocities.jp/kz_s6502/nesdemo/index.html
こちらのPCMのコードを見る限り、6502のアセンブラには詳しくないですがΔPCMのレジスタはちゃんと設定しているようです。

なので、
1.ちゃんとアセンブラのコードを解析して移植されたほうが良いと思います。
2.WAVデータはちゃんとROMの所定のアドレスに組み込まれるようにリンカ・スクリプトを調整する必要があります。
3.少なくともC言語としても不適当なのでコードを見なおしてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
KEYONN_
記事: 70
登録日時: 14年前

Re: 自作ファミコンソフトとcc65でのΔPCMの再生について

#6

投稿記事 by KEYONN_ » 14年前

TKOZです。なんとか再生することが出来ました。
ポインタの基本からやり直す事で、なんとかI/Oレジスタに書き込んでいろいろな録音した音を
再生できるようになりました。
今は、そのソフトを作っている最中です。しかし、音質が悪いですね。
添付ファイル
pcmsample.png
pcmsample.png (7.1 KiB) 閲覧数: 3871 回

閉鎖

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