(こっちの方向でいいかな~)
(クジラ以外認めん!...なんて偏狭な)
(写真はPS版で<略>?)
(写真はX-680*0版で<略>?)
(写真はFM-T*WNS版で<略>?)
(写真はチキンランで<略>?)
■2007年、ついに<以下略>
■カンケー無いケド、「GensのFM音源」は、「見るべきテクノロジー」がタクサンある。
ワカル人にしかワカランが、どおせココはそーゆーぺえじだしさ。
「GensのFM音源」は、速い。「MAMEのFM音源」はトロイ。
NJ氏のMVSだって、未だに「MAMEのFM音源」。
「MAMEのFM音源」を高速化出来れば、価値がある。
■まず「本物のFM音源」の特性として、「アルゴリズム(AR)(各オペレーターの接続順序)」は「高速に切り替えられない」
とゆー特性がある。(それ以前に、本物のFM音源は「レジスタアクセス」がトロイ(ウェイトが要る)んだが...)
「GensのFM音源」は、「UPDATE_ONE()の途中でアルゴリズムが切り替わる」事は想定してないが、
これは本物だってそうなんだから、正しい。
1.「UPDATE_ONE()の途中でアルゴリズムが切り替わる」事は、ありえない。
■「MAMEのFM音源」は「サインテーブル」を素直に、使ってるが「GensのFM音源」は、「サインテーブル」は「出力テーブルへのポインタ」だ。
非常に合理的。それにこの「出力テーブル(TLのテーブル)(トータルレベルのテーブル)」で「範囲外」になった場合出力は「0」だが、
「MAMEのFM音源」は「if文で判定」するが「GensのFM音源」は、「テーブル長さを始めから2倍」にしておき、空きには「0」が入ってるので、
「判定自体が無い」
(註:この話は、UPDATE_ONE()ループの「最深部分」つまり、多重ループの「一番内側」の話)
(註:FM音源えみゅは要するにUPDATE_ONE()ループが重過ぎるので、トロイ)
(註:但しPSPで単純に「MAMEのFM音源」のTLテーブルを二倍にし、判定を取ったら「遅く」なった。
「TLテーブル自体の長さ(や実装を)」を見直さないとダメ。MAMEの奴は「一次元配列風、二次元配列」(envがある))
■「GensのFM音源」は、「Gensの76496音源」と同じく、「length ループが散在して小さい(チャンネル毎レンダーし後で合成)」
これは一見「MAMEのFM音源」や「MAMEの76496音源」の「巨大 length ループが一つの一括レンダー」の方が効率が良さそうだが、
この方式は、「酷く効率が悪い」多分原因は「一次キャッシュ(やRISCのレジスタ)が壊れてキャッシュにのらないから」なんじゃないかな?
小さな length ループでチャンネル毎レンダーし、後でミキシングした方が(処理量は増えても)「どんなPCでも速い」
(2007-02/08、06:21)
■YM2151日記。
えっと、MAMEの2151ってさ。他のFM音源は、fm.cで統合されてるのにさ。一つだけ仲間外れなんだよな。
それって、「DT2」があるから?。まーそれもあるんだケドさ。どっちかってゆーと「めんどくさいから途中で投げ出してある」
ってのが真相っぽい。
だ、だって「傍証」があるもん。そりゃイインだが、特に「レジスタ#15(0x0f)のノイズ」はさ。
「N - - P P P P P」
Noise: 0:off 1:on
-:不明か未使用.
P:period
らしい。
んで「ノイズ有効ビット」は使ってるケド「period」は「使ってない」現在(MAME1.12)のym2151えみゅはさ。
CH7のノイズはさ「ワザワザ専用のchan7_calc()」でやってるケド。これ殆ど「汎用のchan_calc()」と同じなんだよな。
CH7のノイズは、「最終段キャリア(c2)と入れ替えて発生する」処ダケ違う。C言語で書くと、
en3 = volume_calc(3); /* C2 */ /* SLOT 4 */
if((7==chan) &&(PSG->noiseCH7 & 0x80)) /* ch#07の特殊ノイズ(発生条件は#0fレジスタのMSB(0x80)のみ) */
{
UINT32 noiseout; /* ここが現状のノイズルーチン。「priod」は使ってない */
noiseout = 0;
if (en3 < 0x3ff)
noiseout = (en3 ^ 0x3ff) * 2; /* range of the YM2151 noise output is -2044 to 2040 */
chanout[7] += ((PSG->noise_rng&0x10000) ? noiseout: -noiseout); /* bit 16 -> output */
}
else /* 通常時(ch#0~ch#6まで) */
{
if (en3 < ENV_QUIET)
op_calc3();
}
(註:あくまで「原理」の説明。このとおり書けば「遅くなる」タブン。変数名とかも少し変えてある)
こんなん。結局つまり「(CH7ノイズは)まだヨクワカラン」って事。(だってperiod使う筈でしょ?本来。設定するんだからさ)
訂正:「period」は「noise_f」にいれて、ノイズテーブル経由で出してる。
カンケーナイケド、「mem_connect」「mem_value」は「slot毎」じゃなくて「ch毎」ですね。「fm.c」見て気が付いたんだケド。
「slot毎」の「connect」も「判りづらい」よ。fm.cの「connect1~connect4」の方が、まだ判りやすい。ついでに言うと、
「connect4」は要らんよなあ。fm.cは関数に与える都合上使ってるが本来要らん。
MAMEのfm.c。「setup_connection()」も解かりづらいよなあ。
/* set algorithm connection */
static void setup_connection( FM_CH *CH, int ch )
{
INT32 *carrier = &out_fm[ch];
INT32 **om1 = &CH->connect1;
INT32 **om2 = &CH->connect3;
INT32 **oc1 = &CH->connect2;
INT32 **memc = &CH->mem_connect;
switch( CH->ALGO ){
case 0:
/* M1---C1---MEM---M2---C2---OUT */
*om1 = &c1;
*oc1 = &mem;
*om2 = &c2;
*memc= &m2;
break;
<中略>
case 5:
/* +----C1----+ */
/* M1-+-MEM---M2-+-OUT */
/* +----C2----+ */
*om1 = 0; /* special mark */
*oc1 = carrier;
*om2 = carrier;
*memc= &m2;
break;
<以下略>
はさ、「ポインタを使わないで書けば」
/* set algorithm connection */
static void setup_connection( FM_CH *CH, int ch )
{
//ここは(原理の説明だから)イラネ
switch( CH->ALGO ){
case 0:
/* M1---C1---MEM---M2---C2---OUT */
CH->connect1 = &c1;
CH->connect2 = &mem;
CH->connect3 = &c2;
CH->mem_connect = &m2;
break;
<中略>
case 5:
/* +----C1----+ */
/* M1-+-MEM---M2-+-OUT */
/* +----C2----+ */
CH->connect1 = 0; /* special mark */
CH->connect2 = &out_fm[ch]; /* キャリアはつまり出力 */
CH->connect3 = &out_fm[ch]; /* キャリアはつまり出力 */
CH->mem_connect = &m2;
break;
<以下略>
つまり、こういう「意味」だよ。速度気にしないなら、これでも動作する。
まー「速度」は「同じ」かもしんないけど。
(註:「コンパイラの最適化で同じコードになるかも」とゆー意味)
(註:これも、あくまで「原理」の説明)
(註:「static 変数」で「c1 mem c2 m2」用意してるが、速いんだか遅いんだか(???))
(2007-02/08、15:18)
■んと、たあぼ/あうとらん、に関しては、まーなんとかなってきた、きがする。んがとてつもなく不安定。
不安定なのは、やっぱMAMEのストリームじゃあダメっぽい。namco86の真似して専用soundにすりゃあ、
いいんだろーケド。まだ実験してない。とてつもなく不安定だけど、(とりあえずめんどくさいから)UPしちゃおかな~(悩)。
「はんぐおん」や「すぺはり」は現在画面が出るだけで、げえむは「夢のまた夢」な速度(とてつもなくトロイ)んが、
どーせ実験だし。次のターゲットはこいつにしよか悩み中。
(2007-03/05、23:45、悩み多き年頃)
■ま、まさか「こい~ぃん(仮称)」まで動くとは、...恐るべし。エスパーmameさんゴメ。だ、だって当時は本当にそう思ってたにょ。
「たぼ」よか、「こい~ぃん」のほーがメモリキビシーしさあ。
(2007-03/23、23:15)
「こい~ぃん」はどおなるかワカラナイ。PSPSDKじゃあキビシクてPSPDEVに戻ったほーがてっとりばやいかも、しれん。
地味にruka氏の気持ちがワカル今日この頃...。sfcガンガッテネ(はあと)
「たぼ」は、もちっとまし(対してカワランが)になってるし、忍者くんも、稼動はしてるし、FZも思い切って簡略化したので、
全然まったくチガク(速く)なってる。(但しFZは「終了出来ない」)。だけどUPめんどいなー。
(註:阿修羅の章が動かなかった原因は、純粋に「メモリ不足」でした>Cど素人氏)
(2007-03/23、23:55、めんどいから、も少しなまけてよー)
■えっとさ全然マッタクMAMEとカンケー無いケド、某コード実験室でTYL実験してるからさ。「myちょーテキトーカスタム版sfc」を、
(註:テキトーにカスタマイズしたら、「終了時に青画面」が出るのでやんなって投げ出した奴。myHDD内で地味に生息中)
「0002diff-src.zip」のとうりに書き換えて試た。確かに3kBytes程小さくなった。速度は速くなった気がする。
次に「0003diff-src.zip」はリンクされてないが、あるべき場所にあるので、落として変更。約15kbytes程小さくなる筈だが、
約73kbytes程大きくなった。速度はヨクワカラン。元々テキトーカスタムなので不安定だがマスマス不安定になった。
メニュー行き来すると死ぬ。sfcはっきり言ってシロートにはゼンゼンワカランなー。
(2007-03/28、01:50)
■コメントは、この下に入れてね。