こんばんわ。TKOZです。
ファミコンプログラムにハマッております。
BGの書き換え方が大体分かってきたのですが、横スクロールとか、縦スクロールになると
難しく感じてしまいます。
ところで、面白半分でふざけて録音したwavファイルをcc65で(startup.asm内で)読み込んで
再生しようとふと思いました。
ところが、上手く再生されません。
具体的には、自分が「メタルスラッグ」と発音したのですが、ノイズが乗ってしまい、
「ピーィィガーァァ・・・ベェエアタグ」みたいな感じになってしまいます。
ファミコンのDPCMはそんなに悪い音質なのでしょうか?
確かに8ビットから>>1して7ビットPCMにするのですが、そこまで悪くなるとは思えません。
ソース一式をアップロードするので、どこがマズいのか教えて欲しいです。
あと、
一応、5つのwavファイルを入れようとしたのですが、cc65でのバンク切り替えと、
読み込み方が分からないので、metalslug.wavしか読み込んでないです。
あと、とある有名掲示板のゲーム開発技術板のファミコンスレッドでPCM再生のアセンブリソース
を公開していた人がいたので、参考にさせていただきました。
自作ファミコンソフトとcc65でのΔPCMの再生について
自作ファミコンソフトとcc65でのΔPCMの再生について
- 添付ファイル
-
- pcm_on_cc65.zip
- (55.75 KiB) ダウンロード数: 163 回
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 自作ファミコンソフトとcc65でのΔPCMの再生について
ファミコンで組んだことは無いので気になるところを指摘しておきます。
どうみてもiが初期化されていない。 DPCMのレジスタ0x4010~0x04013の内0x4011しか初期化していないのでは?
あと*(char*)0x4011=*(buffer+0);もアドレスを入れていない気が。
NES研究所によるとN x 0x40 + 0xC000のNを入れるが正しいようです。
どうみてもiが初期化されていない。 DPCMのレジスタ0x4010~0x04013の内0x4011しか初期化していないのでは?
あと*(char*)0x4011=*(buffer+0);もアドレスを入れていない気が。
NES研究所によるとN x 0x40 + 0xC000のNを入れるが正しいようです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 自作ファミコンソフトとcc65でのΔPCMの再生について
0xc000番地を更新しようとしていますが、その領域はROMでは?
(少なくとも本物のファミコンではそうです)
もうひとついうと、本物のファミコンでは、ROM領域にMMCのレジスタがアサインされていることが多く(カセットの基板構成によります)、ここに書き込むと、バンク切り替えなどが起こります。
MMCを使う場合は、そのレジスタを設定することで切り替えられたりします。
お使いの環境ではどうなんですかね?
(少なくとも本物のファミコンではそうです)
もうひとついうと、本物のファミコンでは、ROM領域にMMCのレジスタがアサインされていることが多く(カセットの基板構成によります)、ここに書き込むと、バンク切り替えなどが起こります。
本物のファミコンでは、縦スクロールと横スクロールの切り替えは、カセット基板上のショートランドで切り替えるのが基本です。TKOZ さんが書きました:横スクロールとか、縦スクロールになると
難しく感じてしまいます。
MMCを使う場合は、そのレジスタを設定することで切り替えられたりします。
お使いの環境ではどうなんですかね?
Re: 自作ファミコンソフトとcc65でのΔPCMの再生について
TKOZです。返信が遅れてすみません。
cc65でのΔPCMの実装例が下のURLに書いてあります。
http://www37.atwiki.jp/kikakubu4/pages/62.html#library
他にも横スクロール、縦スクロールなどの実装例が載っていますが、
あくまで参考例にとどまっており、実際にはソースを改造しなければいかないようです。
これを参考に作ってみる予定です。
cc65でのΔPCMの実装例が下のURLに書いてあります。
http://www37.atwiki.jp/kikakubu4/pages/62.html#library
他にも横スクロール、縦スクロールなどの実装例が載っていますが、
あくまで参考例にとどまっており、実際にはソースを改造しなければいかないようです。
これを参考に作ってみる予定です。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: 自作ファミコンソフトとcc65でのΔPCMの再生について
PCMの例は、リンク先のこちらでしか見つかりませんでした。
http://www.geocities.jp/kz_s6502/nesdemo/index.html
こちらのPCMのコードを見る限り、6502のアセンブラには詳しくないですがΔPCMのレジスタはちゃんと設定しているようです。
なので、
1.ちゃんとアセンブラのコードを解析して移植されたほうが良いと思います。
2.WAVデータはちゃんとROMの所定のアドレスに組み込まれるようにリンカ・スクリプトを調整する必要があります。
3.少なくともC言語としても不適当なのでコードを見なおしてください。
http://www.geocities.jp/kz_s6502/nesdemo/index.html
こちらのPCMのコードを見る限り、6502のアセンブラには詳しくないですがΔPCMのレジスタはちゃんと設定しているようです。
なので、
1.ちゃんとアセンブラのコードを解析して移植されたほうが良いと思います。
2.WAVデータはちゃんとROMの所定のアドレスに組み込まれるようにリンカ・スクリプトを調整する必要があります。
3.少なくともC言語としても不適当なのでコードを見なおしてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 自作ファミコンソフトとcc65でのΔPCMの再生について
TKOZです。なんとか再生することが出来ました。
ポインタの基本からやり直す事で、なんとかI/Oレジスタに書き込んでいろいろな録音した音を
再生できるようになりました。
今は、そのソフトを作っている最中です。しかし、音質が悪いですね。
ポインタの基本からやり直す事で、なんとかI/Oレジスタに書き込んでいろいろな録音した音を
再生できるようになりました。
今は、そのソフトを作っている最中です。しかし、音質が悪いですね。
- 添付ファイル
-
- pcmsample.png (7.1 KiB) 閲覧数: 3871 回