"Ootake" Nonsupport BBS ノンサポート掲示板 管理:ソフト開発グループ「Finath(ファイナス)」

現在までに、1477人の方が、この書き込みをご覧になっています。

17/08/27(日)19:30 ひろ
ADPCMの動作について

こんばんは

度々、すみません。

ADPCMの動きで下記2点の動きがよくわからないです。

実機で3x3 Eyes - San Shigan Shousei (J)をアーケードカードで起動した後
転送終了後にNEC、日本クリエイトの表示があるのですが、
ここでノイズのような音がします。

実機が壊れている可能性もあると思います。
他の方はいかがでしょうか?


Yuna - HuVideo CD (J)のVideo停止は、
下記の変更で多少動くようになるのですが、
この処理をする条件が分からないです。

makeSample関数 605行目付近の
if ((_PlayAddr == 0x8000)||(_PlayAddr == 0x0000))
を下記に変更願います。
if (_PlayAddr == _PlayHalfAddr && _LengthCount == 0x8001 && _bRepeat)
{
 _PlayHalfAddr += 0x80;
 if (_pfnNotification != NULL) _pfnNotification(ADPCM_STATE_HALF_PLAYED);
}
else if ((_PlayAddr == 0x8000)||(_PlayAddr == 0x0000))
//Kitao更新。再生がPCエンジンADPCM用バッファメモリの分岐点(半分か終点)まで達したとき

ADPCM_Mix関数 変数定義の下に
if( _bRepeat && !_bPlay && _LengthCount == 0x8001 && _bRepeat){
 if(_WriteAddr > 0x80){
  _PlayAddr = _ReadAddr;
  _PlayLength = _LengthCount + 1;
  _PlayHalfAddr = 0x80;
  _PlayedSampleCount = 0;
  ad_sample = 0;
  _DecodeBuffer = decode(_Ram[_PlayAddr] >> 4);
  _bLowNibble = TRUE;
  _Phase = 0;
  _CDDAAjustCount = 0;
  _bPlay = TRUE;
 }
}


17/08/28(月)08:00 Ootake作者
ガリバーボーイだいぶ動きました!

こんにちは。

頂いた情報をヒントに「空想科学世界ガリバーボーイ」で試行錯誤してみたところ、
まだ音声ノイズがあるのと映像と音のタイミングが合っていないのですが、オープニ
ングのデモとスタートデモは完走できるようになったです!

自分が試した限りの動作の肝は、ADPCM_Mix関数はそのままで、

ADPCM_Play関数の先頭に

if (_bRepeat) bPlay = TRUE;

を置きました。
スチームハーツの時も_bRepeatがTRUEのときは音を止めない実装でうまく行ってい
て、今回、_bRepeatがTRUEのときは「再生の開始もされる」ようにしたら、ガリバ
ーボーイでちゃんと音声が出てストリームが続くようになりました。

makeSample関数のほうは

if (_LengthCount < 0x7FFF)
{
(略)
}
else if (_LengthCount == 0x8001) //HuVideo再生時。テスト
{
 if (_PlayAddr == _PlayHalfAddr)
 {
  _PlayHalfAddr += 1;
  if (_pfnNotification != NULL) _pfnNotification(ADPCM_STATE_HALF_PLAYED);
 }
}
else

スタートしてデモ終了時にまだ固まってしまうのと、動画の再生もまだ完全なスム
ーズではないのですが、あとタイミングを調整すればなんとかゴールに行けそうな
気がします。ありがとうございます。

3x3Eyesは、自分も時間ができたときに実機で試してみますね。


Ootake作者>書き忘れました。ガリバーボーイはOotakeメニューの「Speed -> Fast CD」を外した状態(アクセス速度実機並)で動かしました。[08/28(月)08:17 Mail

17/08/28(月)13:03 ひろ
Re)ADPCMの動作について

こんにちは
Yuna - HuVideo CD (J)では
ADPCM関連の処理の流れは下記のようで

ADPCM_WriteBuffer 134Byte書き込み
ADPCM_SetLength 0x8001
ADPCM_SetFreq 16kHz
割り込みマスク設定 ADPCM_STATE_HALF_PLAYED
ADPCM_Repeat Enable
割り込み待ちとなる。

実機のIRQ2の割り込み周期が16m秒程度なので
128Byteで割り込みかと思われます。

_LengthCountが0x8001で動作を切り替える場合は
下記の様になると思われます。

makeSample関数 変更願います
else if (_LengthCount == 0x8001) //HuVideo再生時。テスト
{
 if (_PlayAddr == _PlayHalfAddr)
 {
  _PlayHalfAddr += 0x80;
  if (_pfnNotification != NULL) _pfnNotification(ADPCM_STATE_HALF_PLAYED);
 }
}

ADPCM_Reset関数 追加願います。
_PlayLength = 0;

ADPCM_Play関数の初めに追加願います。
if (_bRepeat && _LengthCount == 0x8001)
{
 _PlayAddr = _ReadAddr;
 _PlayHalfAddr = 0x01;
 _PlayedSampleCount = 0;
 ad_sample = 0;
 _DecodeBuffer = decode(_Ram[_PlayAddr] >> 4);
 _bLowNibble = TRUE;
 _Phase = 0;
 _CDDAAjustCount = 0;
 _bPlay = TRUE;
}
else if (bPlay)


17/08/30(水)07:23 Ootake作者
「ユナHuVideo」「サザンアイズ」

こんにちは。色々試していただいてありがとうございます。

128Byte割り込みでよさそうですね。

自分もユナのおまけCDも見つかったので、ガリバーボーイと共に試行錯誤してみ
ました。

makeSample関数は、以下のようにするとユナだけでなく、ガリバーボーイのデモ
も動きます。
else if ((_LengthCount >= 0x8001)&&(_LengthCount <= 0x80FF))
{
 if (_PlayAddr == _PlayHalfAddr)
 {
  _PlayHalfAddr += 0x80;
  if (_pfnNotification != NULL) _pfnNotification(ADPCM_STATE_HALF_PLAYED);
 }
}

あとはウェイトを調整して限りある時間で頑張ってみたのですが、ユナもガリバー
ボーイも、まだ実機並のスムーズさへはだいぶ及ばない感じです。(とりあえず
自分はここまでで、2,3日中にv2.83を公開できると思います)

それでも貴重な情報頂いたおかげで、HuVideo動作もやっとスタートラインに立て
ました。ありがとうございます。

それから「サザンアイズ」実機で試してみました。
アーケードカード差さない状態でも、NEC、日本クリエイトの表示で、
「ぶつ、ぶつ、ぶつ、ぶつ、ぶつ」と、小さな工事現場のような音が(^^;
これが仕様のようです。


17/08/30(水)08:59 ひろ
Re)ADPCMの動作について

おはようございます。

「サザンアイズ」の確認ありがとうございます。

何かわかった場合はこちらにご連絡させていただきます。


17/08/30(水)21:45 ひろ
Re)ADPCMの動作について

こんばんは

_Port[3]のリード時にSIGNAL_ADPCM1を落とすことで
割り込みがそれらしくなるようです。


参考程度に下記の変更で「Speed -> Fast CD」を
外せば時折引っかかりますが近い動きかと思います。


ADPCM.cpp

_PlayBitはグローバルで定義

ADPCM_Reset関数 追加
_PlayBit = FALSE;
_PlayLength = 0;
_PlayedSampleCount=0;


ADPCM_Play関数 先頭で
if(bPlay || _bPlay) _PlayBit=TRUE;
else _PlayBit=FALSE;
if (_bRepeat && _PlayBit==FALSE)
{
 //停止中に_bRepeatがセットされた場合に128Byte単位で割り込み発生
 _PlayAddr = _ReadAddr;
 _PlayHalfAddr = _LengthCount&0xff;//根拠はないです
 _PlayedSampleCount = 0;
 ad_sample = 0;
 _DecodeBuffer = decode(_Ram[_PlayAddr] >> 4);
 _bLowNibble = TRUE;
 _Phase = 0;
 _CDDAAjustCount = 0;
 _bPlay = TRUE;
}
else if (bPlay)

makeSample関数
else if (_bRepeat && _PlayBit==FALSE) //HuVideo再生時。テスト
{
 if (_PlayAddr == _PlayHalfAddr)
 {
  _PlayHalfAddr += 0x80;
  if (_pfnNotification != NULL) _pfnNotification(ADPCM_STATE_HALF_PLAYED);
 }
}

CDROM.cpp
CDROM_Read関数 case 0x3
ret = _Port[3] | SIGNAL_BRAM; //Kitao更新
_Port[3] &= ~SIGNAL_ADPCM1;//<-追加


17/08/30(水)23:06 ひろ
Re)追加でお願いします

もう1点よろしいでしょうか?

CDROM関連で転送データが残っているうちの
$1801のライトの処理も変更した方が良いと思われます。
実機の動作では実行コマンドの中止処理になっているようです。

CDROM.cpp
receive_command関数
if (data == 0x81)
{
// _ArgsLeft > 0 つまりコマンド引数を受付中のときは
// リセットしない。
if(_CheckCountAfterRead||_ReadByteCount){
 _CheckCountAfterRead = 0;
 return;
}
else if (_ArgsLeft == 0)


ひろ>ReadByteCountも0クリアです。[08/31(木)06:40 Mail

17/09/03(日)20:55 Ootake作者
Re)v2.83公開できました!

こんにちは。予定していたより少し遅くなってしまったですが、おかげさまでv2.83
公開できました。

正直寝不足で頑張ったかいもあって、ガリバーボーイもユナHuVideoも100%ではない
ものの元気に動作するようになりました!

動きと音は実機並にスムーズで、まだ映像にちらつき(ティアリング)が少々出て
しまっているので、次回直せたらと思っています。

コードとしては、128byte毎の割り込みだと途中でデータ不足になって止まったり、
読み込み直しで引っ掛かったりしていたので、133byte毎の割り込みにしたところ
スムーズに行きました。

あとは、教えて頂いたPort[3]を読むときにSIGNAL_ADPCM1をクリアしてもユナ
HuVideoのほうは上手く行かなかったので、Port[0xC]を読んだ際にクリアする
ようにしました。ただ、Port[3]でもPort[0xC]でもこのタイミングで
SIGNAL_ADPCM1をクリアしてしまうと、ソーサリアンなど他のソフトで音切れ
が起こるので、おそらく実機の動きとは違うと思います。将来的には、実機と
同じタイミングと仕組みで動くようにできればと思っています。

あとはウェイトがシビアで、多すぎても少なすぎても途中で止まったり、引っ掛
かったりしましたが、なんとか安定してスムーズに動くようにできたと思います。

とにかく動くようになってよかったです。ありがとうございます。


メッセージ一覧へ戻る

Copyright(C)1997-2007 Kitao Nakamura.