Skip to content

Commit

Permalink
spc出力のときは先頭のレジスタ初期化コマンドを出力しないようにした
Browse files Browse the repository at this point in the history
  • Loading branch information
osoumen committed Jan 31, 2017
1 parent 929b835 commit aeb5084
Show file tree
Hide file tree
Showing 6 changed files with 37 additions and 12 deletions.
12 changes: 6 additions & 6 deletions C700DSP.cpp
Expand Up @@ -733,7 +733,6 @@ bool C700DSP::writeDsp(int addr, unsigned char data)
void C700DSP::BeginRegisterLog()
{
mLoggerSamplePos = 0;
//mLogger.SetResolution(16000);
mLogger.SetProcessSampleRate(32000);
mLogger.BeginDump(0);
mIsLoggerRunning = true;
Expand Down Expand Up @@ -761,7 +760,7 @@ void C700DSP::BeginRegisterLog()
mLogger.addDspRegRegion(dspreg);
}
// 現在のレジスタ値をログに出力
// TODO: SPC出力のときのために出力した量を記録しておく
mLogger.BeginDspInitialization();
for (int i=0; i<128; i++) {
int reg = mDsp.GetDspMirror(i);
if ((i & 0x0f) == 0x03) {
Expand All @@ -775,6 +774,7 @@ void C700DSP::BeginRegisterLog()
mLogger.DumpReg(0, i, reg, 0);
}
}
mLogger.EndDspInitialization();
}

void C700DSP::MarkRegisterLogLoop()
Expand Down Expand Up @@ -807,10 +807,10 @@ int C700DSP::saveRegisterLog(const char *path)

//PlayingFileGenerateBase exporter;
//exporter.WriteToFile(path, mLogger, 16000);
//SmcFileGenerate exporter;
//exporter.WriteToFile(path, mLogger);
SpcFileGenerate exporter;
exporter.WriteToFile(path, mLogger);
SmcFileGenerate exporter1;
exporter1.WriteToFile("/Users/osoumen/Desktop/c700dump.smc", mLogger);
SpcFileGenerate exporter2;
exporter2.WriteToFile("/Users/osoumen/Desktop/c700dump.spc", mLogger);

return(0);
}
Expand Down
9 changes: 7 additions & 2 deletions PlayingFileGenerateBase.cpp
Expand Up @@ -94,7 +94,7 @@ void PlayingFileGenerateBase::writeRegLogWithLoopPoint( DataBuffer &buffer, cons
// タイムベースの変換
unsigned char *optimizedData = new unsigned char [mRegLogBuffer.GetMaxDataSize()];
int optimizedLoopPoint;
int optimizedDataSize = convertLogData( reglog, tickPerSec, optimizedData, mRegLogBuffer.GetMaxDataSize(), &optimizedLoopPoint );
int optimizedDataSize = convertLogData( reglog, tickPerSec, optimizedData, mRegLogBuffer.GetMaxDataSize(), &optimizedLoopPoint, false );

int loopAddr = optimizedLoopPoint + 3;
unsigned char loopStart[3];
Expand Down Expand Up @@ -166,7 +166,7 @@ bool PlayingFileGenerateBase::WriteToFile( const char *path, const RegisterLogge
}

//-----------------------------------------------------------------------------
int PlayingFileGenerateBase::convertLogData( const RegisterLogger &reglog, double tickPerSec, unsigned char *outData, int outDataSize, int *outLoopPoint )
int PlayingFileGenerateBase::convertLogData( const RegisterLogger &reglog, double tickPerSec, unsigned char *outData, int outDataSize, int *outLoopPoint, bool skipInitialize )
{
mTickPerTime = tickPerSec / reglog.mProcessSampleRate;

Expand All @@ -179,6 +179,11 @@ int PlayingFileGenerateBase::convertLogData( const RegisterLogger &reglog, doubl
if (i == reglog.mLogCommandsLoopPoint) {
markLoopPoint();
}
if (skipInitialize) {
if ((i >= reglog.mBeginInitializationPoint) && (i < reglog.mEndInitializationPoint)) {
continue;
}
}
unsigned char cmd = reglog.m_pLogCommands[i].data[0];
int cmdLen = getCommandLength(cmd);
if (cmd < 0x80) {
Expand Down
2 changes: 1 addition & 1 deletion PlayingFileGenerateBase.h
Expand Up @@ -25,7 +25,7 @@ class PlayingFileGenerateBase {
void writeBrrRegionWithHeader( DataBuffer &buffer, const RegisterLogger &reglog, int bankSize=0 );
void writeRegLogWithLoopPoint( DataBuffer &buffer, const RegisterLogger &reglog, double tickPerSec );
void writeWaitTable( DataBuffer &buffer, const RegisterLogger &reglog );
int convertLogData( const RegisterLogger &reglog, double tickPerSec, unsigned char *outData, int outDataSize, int *outLoopPoint );
int convertLogData( const RegisterLogger &reglog, double tickPerSec, unsigned char *outData, int outDataSize, int *outLoopPoint, bool skipInitialize );

private:
static const int WAIT_VAL_NUM = 32;
Expand Down
16 changes: 16 additions & 0 deletions RegisterLogger.cpp
Expand Up @@ -31,6 +31,8 @@ RegisterLogger::RegisterLogger(int allocSize)
mLogCommandsSize = allocSize;
mLogCommandsPos = 0;
mLogCommandsLoopPoint = 0;
mBeginInitializationPoint = 0;
mEndInitializationPoint = 0;

mDirRegionData = NULL;
mBrrRegionData = NULL;
Expand Down Expand Up @@ -129,12 +131,26 @@ void RegisterLogger::BeginDump( int time )
{
mLogCommandsPos = 0;
mLogCommandsLoopPoint = 0;
mBeginInitializationPoint = 0;
mEndInitializationPoint = 0;
for ( int i=0; i<256; i++ ) {
mReg[i] = -1;
}
mIsEnded = false;
}

//-----------------------------------------------------------------------------
void RegisterLogger::BeginDspInitialization()
{
mBeginInitializationPoint = mLogCommandsPos;
}

//-----------------------------------------------------------------------------
void RegisterLogger::EndDspInitialization()
{
mEndInitializationPoint = mLogCommandsPos;
}

//-----------------------------------------------------------------------------
bool RegisterLogger::DumpReg( int device, int addr, unsigned char data, int time )
{
Expand Down
4 changes: 4 additions & 0 deletions RegisterLogger.h
Expand Up @@ -44,6 +44,8 @@ class RegisterLogger : public ChunkReader {
void SetProcessSampleRate( int rate );

void BeginDump( int time );
void BeginDspInitialization(); // DSPの初期化開始
void EndDspInitialization(); // DSPの初期化終了
bool DumpReg( int device, int addr, unsigned char data, int time );
bool DumpApuPitch( int device, int addr, unsigned char data_l, unsigned char data_m, int time );
void MarkLoopPoint();
Expand All @@ -70,4 +72,6 @@ class RegisterLogger : public ChunkReader {
int mLogCommandsSize;
int mLogCommandsPos;
int mLogCommandsLoopPoint;
int mBeginInitializationPoint;
int mEndInitializationPoint;
};
6 changes: 3 additions & 3 deletions SpcFileGenerate.cpp
Expand Up @@ -33,13 +33,13 @@ bool SpcFileGenerate::WriteToFile( const char *path, const RegisterLogger &reglo
// レジスタログの生成
unsigned char *reglogData = new unsigned char [4 * 1024 * 1024];
int loopPoint;
int reglogSize = convertLogData( reglog, tickPerSec, reglogData, 4 * 1024 * 1024, &loopPoint );
int reglogSize = convertLogData( reglog, tickPerSec, reglogData, 4 * 1024 * 1024, &loopPoint, true );

// TODO: 64kに収まらない場合、700ファイルの形式で書き出す

// SPCヘッダの書き出し
spcFile.writeData("SNES-SPC700 Sound File Data v0.30", 33);
spcFile.writeByte(0x26, 3);
spcFile.writeByte(26, 3);
spcFile.writeByte(30); // Version minor
spcFile.writeU16(0x100); // PC
spcFile.writeByte(0); // A
Expand All @@ -51,7 +51,7 @@ bool SpcFileGenerate::WriteToFile( const char *path, const RegisterLogger &reglo

spcFile.writeData("C700 spctest ", 32); // Song title
spcFile.writeData("Game title ", 32); // Game title
spcFile.writeData("osoumen ", 16); // Name of dumper
spcFile.writeData("dumper ", 16); // Name of dumper
spcFile.writeData("Comments ", 32); // Comments
spcFile.writeData("2016/07/17", 11); // Date SPC was dumped (MM/DD/YYYY)
spcFile.writeData("120", 3); // Number of seconds to play song before fading out
Expand Down

0 comments on commit aeb5084

Please sign in to comment.