//www.旧型、PSP開発幼稚園.game.jp/(本館) -9ページ目

涙のリクエスト

■めんどくさいなあ。ASMたん。特に意味を全く理解してナイ処は特にさ。
blur
(涙で半分滲んでるのです)

#if 00
extern void Half_Blur(void);//misc.asm
#else
static /*extern*/ void Half_Blur(void)
{
int i;
int n;
int j;
int k;
unsigned short aaa;
unsigned short bbb;
unsigned char *ppp;
    ppp=(unsigned char *)MD_Screen;
    n=0;            //mov esi, MD_Screen
    i=(336*240);    //mov ecx, 336 * 240    ;i=336*240; ; Number de pix 16 bits __ render en blur
    j=0;            //xor edi, edi
    k=0;            //xor edx, edx
//  test byte [Mode_555], 1
//  jnz short .Loop_555
//  jmp short .Loop_565
//  if(1==Mode_555){
//      .Loop_555
// /* 中略 */
//  }else{
//      .Loop_565
        do{
        //  aaa=ppp[n];     //mov ax, [esi]     ;ax=MD_Screen[n];
            aaa=(ppp[n+1]<<8)+(ppp[n  ]);
            n+=2;           //add esi, 2
            aaa>>=1;        //shr ax, 1
            bbb=aaa;        //mov bx, ax
/*555*/                     //                  ; --rr rr-g ggg- bbbb
        //  aaa&=0x3C0F;    //and ax, 0x3C0F    ; 0011 1100 0000 1111
        //  bbb&=0x01E0;    //and bx, 0x01E0    ; 0000 0001 1110 0000
/*565*/                     //                  ; -rrr r-gg ggg- bbbb
            aaa&=0x780F;    //and ax, 0x780F    ; 0111 1000 0000 1111
            bbb&=0x03E0;    //and bx, 0x03E0    ; 0000 0011 1110 0000
//
            j+=aaa;         //add di, ax
            k+=bbb;         //add dx, bx
            k+=j;           //add dx, di
            i--;            //dec ecx
        //  ppp[n-2]=k;     //mov [esi - 2], dx ;MD_Screen[n-2]=dx;
            ppp[n-1]=(k>>8)&0xff;
            ppp[n-2]=(k&0xff);
            j=aaa;          //mov di, ax
            k=bbb;          //mov dx, bx
//          jnz short .Loop_565
        }while(i);
//  }
}
#endif

ち、ちゃんと動きマスよお。でもインテル変換めんどくさ~。
別ににさ~。ここは移植スルとこじゃあナイケド。(註:Gensの滲みは現実的でないでしょ?)まあ短いしさ。 えっとね。メガドラの「ニジミ」を再現したいなら、この程度(単純フィルター)では、全然ダメなのです。 輝度に拠って滲み率(実装するならフィルター)、かえないとな~。(註:実機は高輝度ならば、殆んど滲まない) (2006-09/26、00:55)
■本家Gens2.14Souvenir。まーべるらんど、動くんだなあ。うちのあやしー(BADDUMP&MyPatch)奴でも。 んで、ゲーム中にポーズかけると「ラスターパレットが無効になる」おや? ばーにんぐふをーす、「ラスターパレットの技術サンプル」みたいなプログラムだケド。こっちは、「ゲーム中にポーズかけてもOK」 なのにー。
こんとら、本家Gens2.14Souvenir。は動くらしい。んで分家SEGADRIVE(pc)A00-A02は(ちゃんと)動かない。 (註:これはオソラクGensはdiv7.0系で、SEGADRIVE(pc)は、div7.5系の為) (2006-09/26、18:00)
■しかし、「本家Gens2.14Souvenir」では動かない「えりそるデモ#4(蜘蛛)」がSEGADRIVE(pc)では、ちゃんと動くのです。 これは、ここからは予想なので妄想なんですが、GensはZ80止める筈の場所で止まってないんじゃあないかなー。 んで、クロックはやっぱdiv7.5系なんぢゃあ、ないかなー。と、思うのです。まあワカランですが。 (註:メガドラは、m68000は止まらないケドZ80は止められる仕組みだと思う。 Gensでこんとらが巧く動く理由は、Gensはdiv7.0系で、m68000が少し速いと、Z80が少しぐらい止まらなくたって、 その分m68000が速いから辻褄が合っちゃう。Gensはそおいう仕掛けだと睨んでいるのです。妄想ですが) (2006-09/26、23:45)
■うおお、「えりそるデモ#4(蜘蛛)」も「こんとら、はーどこーぷすデモ#1」も動くジェー@SEGADRIVE(pc)A02!! やっぱdiv7.5系だよ!! えっとね。順序立てて話す。「★1.」「★2.」「★3.」を読めば理解出来るシカケだな。 「★1.」 まずSMS(セガ版ファミコン)のどっかのページでね。SMSのクリスタル。オシロで測定した人がいてさあ。NTSCの規格では、 Yの基準搬送波が、3.579545MHzだけど、現実のSMSでは違うのな。幾つかワスレタけど。本物は「チト高い」。 そりゃ「オシロの精度」もあるけど、現実的に「安いオシロ」でも、「3.57MHz近辺ならそんなに狂わんじゃろ」。 もちろん水晶だから当然「温度によって長さが変わるからその分狂う」。温度が高けりゃ鉄でもなんでも物は伸び~~~~~る。 電車も脱線するしな。話も脱線するしな。とにかく水晶(クリスタル)だって、当然伸びる。もっとも「温度補償回路」が入ってりゃ、 ある程度補償するけどさ。現実のメガドラそんなもん(温度補償回路)入ってるかどおか知らんが、少なくとも(仮に入ってたとしても) 精度はあてにならん。だってメガドラのコンデンサってパスコンを除けば、ほぼ100%電解だよ(コスト制限があるからさ)。 一つグライpFのセラコン使ってた気がするが(良く覚えてない)画像関係(CXAの周辺)だった事は間違いない。 イカンまた変な方向に話が...ぐいっと修正。 「とにかく現実のSMS、マスターXTAL(水晶)。3.579545よりは高い。」これはOK? んで、メガドラはSMSの上位互換機。これのマスターXTAL(水晶)はNTSCの15倍。つまり3.579545x15==53.693175。 53.693175MHzとかってさ、「FMラジオの搬送波、周波数帯」である事も解かるようにさ。これをきちんと測定できるオシロは、 (当時は)チト高い。まあ10マソ以下ではまず無理だな。20マソ程度は出さないとね。(註:今ならもっとずっと安くて精度が高い。 ヨク知らないが1マソ以下でも何とかなるのかも??但し「まともなオシロ」は相変わらず「プローブが高い」) とにかく、ここは「電気工作講座」じゃないからこの手の話もパス。 イカンまた変な方向に話が...ぐいっと修正。 まあ、平たく言えば、メガドラクリスタルまともに測定した人いないし、仮にまともに測定しても、あまり意味がない。 (水晶単体で測定しても、無意味。実機のm68000の入力ピンなら多少意味ある)
で、強引な結論。「メガドラは温度によって速度が変わる」これはOK? 「★2.」 そうそう、実機はさ。「熱いんだよ」。「メガドラ7805が2つも」乗ってて、 (註:7805:9V~12Vぐらいの交流っぽい不安定な直流から、安定的な5Vの直流を作ってくれる素子。一つでも十分熱い。 メガドラはプラスチックで蓄熱するが、(スリットあるけど)2つであの放熱面積ではチトキビシーな~。メガドラ熱暴走するのは、 あの辺がダイタイ原因。ちなみにマニアは安定化電源を付ける、が(メガCDとか考えると)結構回路がめんどくてハマル。)
で、強引な結論。「メガドラは熱い!!!!!!(マニア含む)」これはOK? 「★3.」 「えりそるデモ#4(蜘蛛)」と「こんとら、はーどこーぷすデモ#1」に共通点がある。 プログラムの仕組みが、丁度「MAMEリプレイと同じ」。 つまり、「巧い人のプレイを実機上で録音(録プレイ)」 んで、現実の「デモ」では、 「巧い人のプレイを実機上で再生(再生プレイ)」 してるだけである。もちろんシステムに「途中録音(録プレイ)機能」も実装されてるだろーから、 どんなに下手な人でも(回数を重ねて途中録音を繰り返せば)「究極プレイのデーターを作成する事が可能」だな。 はら、「マリオ3」の究極プレイ動画とか見た事ないかな。丁度あの方式だね。
で、結論。「両デモは、プレイ再生」これはOK?


「★んで結論」 にゃー大変だった。書くの。 んで、今度は「実験ね」 まず前提。 あ、そうそうもう一つ「予備知識」。 えっとさ、「すーぱーシノビ」(改造版Gensで)聞いてチェックしたんだケドさあ。 MASTER=53.693175の場合。 div7.0(Gensオリジナル)では、「本物より音程が高い」。 div7.5(SEGADRIVE説)では、「本物より音程が低い」。 んじゃあdiv7.25は?。まあマテそれは早合点とゆーモノ。そういう話ではない。そういう事が言いたいのではない。 ワカラナイならもう一回「★1.」「★2.」「★3.」を読む事。 (註:「div数字」:「div7.0」とゆーのは、「単純に7.0で割る」とゆー意味では無い。「div7.0」の「機能」として 結果的に、マスターXTALが7.0で割られるが、これはハードウェアーの常識として、数字上の辻褄合わせでなく、 暗黙に「分周回路」をさす。「div7.0」は7分周回路。「パルスの数」で、考えてくれな。 「ハードウェアーが関係ない論理レベル」ではさ。)
つまり(Z80問題は別にあるにせよ)疑っているのが「マスターXTAL」の「実周波数」。XTAL単体の精度は関係ないんだから、 誤解せんようにな。 したがって、実験をしてみた。
マズ前提。ワタシはメガドラシステムのクロックの流れをこの様に考えている。 「マスターXTAL→div7.5→m68クロック(==YMクロック)→div2.0→Z80クロック(==SNクロック)」 これが、最も「合理的」。現実のメガドラはともかく、「少なくとも設計上はこうであったに違いない」と考えている。 (註:PS(プレステ)だって、これと似た仕組みだしさー)
だから、「div7.5」これは「回路なんだから固定」ね。ここまでOK? (註:Gensはdiv7.0なのに、Z80はdiv15.0。(div14.0ではない)この組み合わせを満足させるのには、回路規模が大きくなる。)
じゃあ「マスターXTALの周波数を換えて」 「えりそるデモ#4(蜘蛛)」と「こんとら、はーどこーぷすデモ#1」が動くかどうかチェックしてみよー。@Gens2.14Souvenir。 (註:Z80問題は、依然問題だが、この際、置いとく) 実験結果: 5???????.? こんとらOK。えりそるNG。----。(div7.0相当になればこうなる筈) 54000000.0 こんとらOK。----。だぶどら2OK。 53900000.0 こんとらOK、えりそるOK。だぶどら2OK。 53800000.0 こんとらOK、えりそるOK。だぶどら2NG。 53700000.0 こんとらNG。(えりそるOKの筈)。----。 53693175.0 こんとらNG。えりそるOK。だぶどら2OK。
さてと、53800000/15は、「3586666.666略」(3.58666MHz)か。SMSのページでも行って調査してくるかな... (2006-09/27、20:00)
■上の表は少し不完全だし、「Gens」は「CRTC」でクロック単位の時間調整をしてるので、いずれそこも見直す必要があるから、 あくまで現時点のデーターだ。ともかく、今度は「不思議ちゃん2」こと「だぶるどらごん2」でもチェックを加えたので、上の表に加筆する。 「だぶどら2」に関しては「53693175」がOKだもん。ちょっと「やってみないと判らないな」やはり「最終チェックには必要」なそふと。 (エミュ作成の件で)海外で有名なダケの事はあるな。nko氏の情報収集能力には感謝してる。ワタシだけなら「きっと見過ごしてる」だろーからな。 (2006-09/28、15:50)
■Gensで、m68:Z80のクロックの比率を計算し、アセンブラから直読みしてる所発見!。くそお、やり直しじゃねえか。 そこの「7.0」を「7.5」に修正。つまり、 void Init_Tab(void) { int x; // for(x=0; x<512; x++) Z80_M68K_Cycle_Tab[x] = (int) ((double) x * 7.0 / 15.0); /*元の奴*/ for(x=0; x<512; x++) Z80_M68K_Cycle_Tab[x] = (int) ((double) x * (XTAL_M68D) / (XTAL_Z80D) ); }
へ修正。この状態でコンパイル。3つとも動作。現在、 5???????.? こんとらOK。えりそるNG。----。(div7.0相当になればこうなる筈) 54000000.0 ----。----。----。 53900000.0 こんとらOK。えりそるOK。だぶどら2OK。 53800000.0 こんとらOK。えりそるOK。だぶどら2NG。 53700000.0 こんとらNG。----。----。----。 53693175.0 こんとらNG。えりそるOK。だぶどら2OK。
変わらないんだな。 (2006-09/30、00:00)
■やりたい事と行動がズレてるのはいつもの事。SMSのページを調べに行ったんだケド... 勝手に無許可転載。http://www.avis.ne.jp/~nakat/column.htm 2002/7/21 「サンダーフォース」シリーズ サンダーフォースはシューティングの中でも長い歴史を持つシリーズです。 記念すべき1はX1用でリリースされました。マイコン雑誌に載せられた広告は、ゼビウス調の画面が8方向スクロールする、1目でわかる内容でした。 近所のマイコンショップのゲーム大会で遊ぶ機会があったのですが、あまりに速いスクロール、ゲームスタート時に喋るなどかなりショックを受けました。 所有のPC88でも出て友人にテープ版を借りたのですが、画質は落ちてる、スクロールは波打つはと、88だけあって期待はずれのものでした。 それだけX1はアクションが得意なマシンだったのです。処理が遅いだけに88版は、ちょっと慣れればすぐ全面クリアできるもので、これでもおなかいっぱいになりました。 数年後に出たX68K版の2は、パソコンサンデーで山下氏が攻略をやってるのをみて、あまりの美しい画面やハードな内容にかなり衝撃を受けました。 MDで出て即購入、MDの他社製品ということもありこれはかなり楽しめました。その後X68版も購入、MDに比べ鮮明な画面や、喋りまくるし演出過剰、効果音も迫力がありすばらしい完成度です。 この68版は個人的にシリーズ中最も好きなタイトルです。MD版は結構力技でクリアできたけど、68版は1回しかクリアしてないなぁ。(^^; その後3の登場、伝統のトップビューの廃止、これは正直この時期ではおっくうだったのでまあ正解だったとは思う。3はアーケード版まででましたね。散々遊びました。 その後の4は、けっこう覚えゲーな内容が辛く挫折、ポリゴン化までした5も、あまり遊ぶ時間が取れずまだクリアできずじまいです。 つねにハードな内容を提供してくれたこのシリーズ、そろそろ20周年かな。もう続編はでないのでしょうか・・・ ふうん、そおなんだ。でも、「X68K版の2(超、高難度)」は確かに難しいケド。 >MD版は結構力技でクリア (註:MD版の2は(2D面が特に)ゲームとして比較的難度高い。もちろんX68K版の2よかは、ずーーと低難度だが。) 何であの簡単な「V」が解けない訳?(註:5はシステムさえちゃんと把握してればかなり低難度。) よっぽど時間が無いんだな~。(註:5はPS版とSS版がアル) 「AC」は「Ⅲ」とは序盤面が似てるが、途中から「全然違う面」になるんで、ぜんぜん違うゲームだよ。
別館のPSPのSEGADRIVE。「サンダーフォースⅢ」(&Ⅳ)が遊びたくて作ったよーなもんだから、無視出来ないのです。
「サンダーフォース」系譜マトメ。 →「初代X1版」(知らないです) →「移植88版」(知らないです) →「サンダーフォースⅡ、68K版」(難しすぎるです) →「サンダーフォースⅡMD、移植メガドラ版」(難しいと思ってたケド68K版やったら、考えが180度変わったです。) →「サンダーフォースⅢ、メガドラ版」(ハマレます) →「サンダーフォースAC、アーケード版」(難度はそれ程高くないです) →「サンダーフォースⅣ、メガドラ版」(少し難しかしめ、やっぱ難いです) →「サンダーフォースⅤ、SS版」(残念、持ってないからワカランです) →「サンダーフォースⅤ-PS(パーフェクトシステム)、プレステ版」(最後のボス(ちょうちょ)以外は、まあやった事ない人で「2日」あれば大丈夫でしょう) それ以外の奴はシラネ。この中でお勧めは「Ⅲ」と「Ⅴ」ですが、 「Ⅲ」は「アイレム好き(R-TYPEとか)」でなければ、ちとお勧めしがたい感じですかね。(段々難度が上がる&覚えゲー的要素がある) 「Ⅴ」は良ゲーです。シリーズの中でも難易度は、低いです。(タブン)R-TYPEと無理やり(設定での最低)難易度を比較すれば、 (低)「PS2のR-TYPE FINAL」<「TF5」<「PS版R-TYPE⊿」(高)って感じかな~。 「⊿」大して難しくないから、解かるんではないかと。まあどれも同じ様な気もスルですが。 但し、マニア向けに設定変えれば、難度高いです。ってゆーか「サンダーフォースシリーズ」の本当に面白い所は一度クリアして、 「難度高い所」なんですケド。覚えゲーなんでね。...現時点でどれも入手不可能なゲームばかりだなー。おまけにPSP開発に やっぱ関係ない事に今頃気が付いたり... (2006-09/27、21:00)
■だらだらWEB巡回するも、有意義な情報にはブツカラズ。とあるサイトではSMS3.58MHzって書いてあるし。ワカンネ。 一体何処で見たんだろ。どっかで見たんだけどなあ。その「どっか」が思い出せないんだよなああ。もう寝るかね。 (2006-09/28、01:00)
■ちょっと描いてみた。 sn_write 怪しげ(?)なつーるを使い描いてみたです。 矩形波(ってゆーかSN)をイメージして、ちと描いてみた。です。全く全然イイカゲンなでーたーですが、MAMEやGensよりは、 少し良くなるです。(ヤッパさうんどぶらすたツナイで今度さんぷりんぐせねば)
■ちょっとサンプリングしてみた。 ontei ここは、音程変化してる所だし、サンプル数が少なすぎてあてにならんが、ってゆーかVDPから直接サンプルしちゃったからなー。 とにかく意外とハイクオリティーなのな。VDP出力はさ。 (2006-09/29、01:50) ■今度は44100にして音程変化ない所を狙ってみた。 sam3p3 段々判ったゾ。そうか録音は48kでもいいのか。今度からは48kにする。 (2006-09/29、02:30)
■しかし、実機の矩形波についてワカッタ事があるな。 マズ、立ち上がり。微妙に遅く立ち上がる。がけを上る感じだな。 んで、立ち上がったら「エッジ」。そこでパルスが乱れつつ比較的高い位置に収束。パルスの乱れはなかなか収まらないが、 44100でサンプリングしたから、時間はワカル。んで、パルスの乱れが収束しつつ「C」コンデンサー容量低下。矩形波で、 明らかに音程変化してない場所だけど、容量。つまり音量が減るんだな。ふんふん。そんで減ってる途中の真ん中あたりに、 少しサイン波的ノイズが入る。と、これは、パルスが大変化してる影響だな。恐らく位相の関係上必ず真中に入る。 何、周波数解析しないでタコな事言ってるんだかと思うかもしんないケド。(註:人間の耳は位相はワカラン)いいんだよ。どおせ みんな同じ波形なんだから。一般的な音響理論も当て嵌まるケド。(註:一般的に波形なんて見ても無意味)これは、かなり特殊な 状況だから、波形見て意味あるんだよ。 ちなみに、この測定された波形は、(理屈上は)純粋にVDPの出力って訳じゃあない。普通に線繋ぐだけで、既に 「ローパスフィルター」かかってるから、正確には「ローパスフィルター後の波形」それでエッジからエッジの返り(収束しない部分が 発生する)んが、ワタシが欲しいのは正にこの収束しない部分。ここは多分「ウェーブレット」と同じ感じで、これ以上の高周波成分は、 「ローパスフィルター」でフィルタリングされて、恐らく無い。だから、これ以上の高周波成分が発生しない波形として実装して構わん。 タブン。
■これをもし、エミュるとすると、やっぱ現状の「テーブル法」とは相性が悪そうだなあ。 これは破棄して、再構成する場合は。 んと重要な所は、 1.立ち上がりディレイ。(変数1個) 2.立ち上がり後のサイン上変化。(変数1個+サインテーブル読み) 3.コンデンサ抜け。(音量)(変数1個) 4.立ち下がり前のサイン上変化。(ちとめんどい、レンダー後に遡るなら簡単だけど、2回レンダー入るしなー。2重レンダーで「2.」と同じ) 5.立ち下がりディレイ。(変数1個) 6.真中の「へにょ」実装するなら、遡のぼって「2重レンダーが簡単だなあ」 めんどくさそー。まんなかの「へにょ」要らないかもな。 (2006-09/29、03:00)
■そもそも、MAMEみたいな「デジタルフィルター」なんて、(PSPには)負荷が高いからヤダネ。なんである。もっと簡略化して、 実装できない。かなあ。特に「2重レンダー」なんて絶対禁止。 setumei 1.まず、「立ち上がり」「立ち下がり」ディレイは実装が簡単。つまり最大差分を制限すれば十分。 (本物だって単にコンデンサに充電時間がかかるからだろ?) 考え方は、ADPCMの「Differrencial(差分)」と同じだね。但し、聞いて効果が無ければ、これは破棄する。 2.一番重要はパラメーターは、立ち上がってから一定角度ずつ下がる処だろ。(本物はコンデンサ容量抜け) ここは(音量の正負を見て(ABS()))常に、一定量、引けばヨロシ。 3.ウェイブレット風の所は「SIN(A)+COS(B)」で近似しちゃう。(AもBも定数)。立下りは「常に位置が合わない」が、 「人間の耳は位相が判らんで、それで十分」だな。(本物はローパスフィルターの都合だから位相関係ないなら、それで十分だよ、タブン) (3の実装註:これは1周が32個とかのサインコサインテーブル。つまり unsigned short sin_tbl[32]; サインはsin_tbl[kakudo&31];コサインはsin_tbl[(kakudo+8)&31];こーゆーレベルを想定してる。)
これなら、なんとか出来そうだ。但しヤッテナイから妄想。(いつもの事だな) (2006-09/29、04:15)
■とりあえず、こうした。 SN_bbb とはいえ、現状はGensにおまけで入ってたテーブル式を使ってるダケだ。そこで簡単な所から始めた。まずこう。 サンプル波形は「フィルター後」なんだから、この減衰は、コンデンサー容量抜けじゃあなくて、単なる低周波成分なんじゃ。 って思うかも知れない。(ってゆーか普通はそう思うだろう)だが、SNの波形。確かにサンプリングデーターに可聴周波数以下の 低周波成分も含まれているが、それとこの傾きは一致しない。というより、低周波成分=単なるノイズ。(ローパスフィルターの誤差) という風に考えるより、低周波成分=SNの回路の都合上発生する避けられないコンデンサー容量抜け。と考えた方が合理的ではないのか。 少なくともワタシはそう考える。 (註:もし、ローパスフィルターの誤差ならば、音量が段々上がる波形が一つ位あって然るべきだ。だが、そんな波形は一つも無い。 また音量の「降下速度も常に一定」だった。これはつまり、「ローパスフィルターうんぬん」の話は完全に除外され、 純粋にメガドラVDP(76496互換音源)の出力特性だと考える以外、無いじゃないか)
さてこの波形で、実際に聞いてみよう。実際に聞くと殆ど違いはない。「あふたーばーなー2」では「激しく異音」がするので、 この件は「プログラムのバグ」っぽいな。「少なくともデーターは関係ない」事が判明した。 実際、理屈上。「低周波成分」ぽい音しか違いが出ない筈だ。 この「低周波成分」は具体的に何を表してるのかと言うと、MAMEやGensの完全矩形波の音は、似てるんだけど、 「キラキラしすぎて他の音と合わない」。それが「フィルター前の音なんだから仕方ないだろ?」と言われても、仮にこれに一般的な 一次フィルター掛けるとしても。それでも「一部キラキラしすぎてる成分」がある。この「一部キラキラしすぎてる成分」は現実の76は、 「フィルターでカットされたから聞こえない」のではなく「始めからそんな成分ないから聞こえない」って気がする。 VDP「315-5313」の95ピンから、直接録音したり、聞いたりしてるが、それでもこいつは「完全矩形波ではない」っぽいよなあ。
「えりそる」のサウンドテストで、BGM TEST。「SLAP-UP」にする。もちろんDACやYMはOFF。こいつで聞き比べる。 MAMEやGensの完全矩形波の音より、今回のテーブルの音の方が、「ほんの少し柔らかくなる」。 「一部キラキラしすぎてる成分」が少なくなる。低音にほんの少し厚みが増す。ほんの少し実機に近づく。 殆んど判りにくいレベルだが効果は出てる。要するに「完全矩形波の音」は落ち着かない音。「コンデンサー抜けがある音」は落ち着いた音。 実機は、VDP後に、色々通る(YMとMIXする時点でも)から、もっと落ち着いた音なんだが。 それは「ローパスフィルター」が噛むからじゃろーなー。 (註:ローパスフィルター:このレベルの音の世界は、何も回路が無くても「ローパスフィルター」がかかる。線つなくだけで、 厳密には「1次ローパスフィルター」(RCフィルター)と等価回路になってるからさ)
ずっと、音聞いてて、いい例えが見つかったよ。メガドラVDPの音は、「完全矩形波の音」ではなくて、「矩形波と三角波のあいのこ」 なんだよ。矩形波より、三角波の方がやわらかいし、低音成分があるだろ?ファミコンの「三角波のベース音」とか低音出てるじゃねーか。 つまり、MAMEやGensの76496エミュには、それが足りない。「三角波成分」が足りない。本物よりさ。 だから、「三角波成分」は76496エミュで補う必要がある。YMだけ音が似てると、音が余計融合しないんだ。メガドラのゲームは、 VDPサウンドが結構前に出てるサウンドが多いから、そおいう物は、必然的に「変な音」になる。 (2006-09/29、16:45)
void SN76496_Update(int **buffer, int length) { int i, j; int cur_cnt, cur_step, cur_vol; for(j=2; j>=0; j--) { if(cur_vol=sn.Volume[j]) { int k; k=0; if((cur_step=sn.CntStep[j])<0x10000) { cur_cnt=sn.Counter[j]; for(i=0; i<length; i++) { if((cur_cnt += cur_step) & 0x10000) { buffer[0][i] += (cur_vol-k); buffer[1][i] += (cur_vol-k); } // else{ // buffer[0][i] += k; // buffer[1][i] += k; // } //#define MY_DRR (1) #define MY_DRR (3) #define MY_HARF //#undef MY_HARF #ifdef MY_HARF if(0==(length&MY_DRR)) #endif {k++;} } sn.Counter[j]=cur_cnt; } else { for(i=0; i<length; i++) { buffer[0][i] += (cur_vol+k); buffer[1][i] += (cur_vol+k); #ifdef MY_HARF if(0==(length&MY_DRR)) #endif {k++;} #undef MY_HARF #undef MY_DRR } } } else { sn.Counter[j] += sn.CntStep[j] * length; } } // Channel 3 - Noise <以下略> その辺踏まえて実装してみたケド。これで合ってるのやら、よくワカランなあ。 (2006-09/29、21:00)
実際聞いてみたケド、これでは「k」の値が大きすぎるっぽい。音がじゃりじゃりする。 「k++;」を「if(0==(length&1))k++;」とかにしてみよーかなー?
厳密には、じゃりじゃりして厳しい所もあるが、上記のよーにするとかなり「改善」される。んで、Mixを、 Gensは、50%なんだが、 /* 55/160==Mix34.375% ??(少し前は「pspSEGADRIVEを参考にして」こうだった) */ /* 58/160==Mix36.25% ?? */ 36.25%にしたら、いい感じになった。 SEGADRIVE(pc)A02チョット感動するよ。今迄のエミュ(MAME系の76496==「完全矩形波」)の音は聞けねえ。 (註:「完全矩形波」は「ゲームボーイみたいな音」)(註:「三角波」は「ファミコンのベースみたいな音」)(註:「正弦波」は時報) 実機と比較して低音が足りんし、少しフィルター(LPF)掛けたくもなるが、初めてのメガドラサウンドだじぇー。 メガドラVDP76496は「矩形三角波」だああああ。 (2006-09/30、20:00)
■別館に、 SGPC_A02.zip 06-09/30 21:00(580kb)SEGADRIVE(pc)A02実験版。ソース+バイナリ+ツール UPしたよ。音にヴルサイまにあ、は聞き比べてくれ。しばし休む。 (2006-09/30、21:00) ぐへえ、SEGADRIVE(pc)A02実験版。露骨にピッチ(音程)がオカシイよお。多分。やっぱMASTER-XTALが悪い。 やっぱ本当は53693175なんだろな-。修正するとなー。イロイロ問題が出るしなー。ちとゴマカスしか無いか。 (2006-09/30、23:55) ■サウンドだけ53693175にして、「修正(fake)SGPC_A02b.zip」した。(対応ソフトは変わらない筈だ) ...相変わらすメガドラはワカランナ~。やはり「真の原因」は「Z80調停」なんだろな~。ソコを直さない限り、根本解決はしない。 (2006-10/01、00:45)