-
Notifications
You must be signed in to change notification settings - Fork 20
Expand file tree
/
Copy pathC700DSP.h
More file actions
210 lines (181 loc) · 6.65 KB
/
C700DSP.h
File metadata and controls
210 lines (181 loc) · 6.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
//
// C700DSP.h
// C700
//
// Created by osoumen on 2014/11/30.
//
//
#ifndef __C700__C700DSP__
#define __C700__C700DSP__
#include "DspController.h"
#include "EchoKernel.h"
#include "C700defines.h"
#include "RegisterLogger.h"
//-----------------------------------------------------------------------------
typedef enum
{
ATTACK,
DECAY,
SUSTAIN,
RELEASE,
} env_state_t32;
class C700DSP {
public:
enum SmcTimeBase {
SmcTimeBaseNTSC,
SmcTimeBasePAL
};
C700DSP();
~C700DSP();
void ResetVoice(int voice);
void KeyOffAll();
void ResetEcho();
void SetVoiceLimit(int value);
void SetNewADPCM(bool value);
void SetRealEmulation(bool value);
void SetMainVolumeL(int value);
void SetMainVolumeR(int value);
void SetEchoVol_L( int value );
void SetEchoVol_R( int value );
void SetFeedBackLevel( int value );
void SetDelayTime( int value );
void SetFIRTap( int tap, int value );
void SetAR(int v, int value);
void SetDR(int v, int value);
void SetARDR(int v, int ar, int dr);
void SetSLSR(int v, int sl, int sr);
void SetSL(int v, int value);
void SetSR(int v, int value);
void SetVol_L(int v, int value);
void SetVol_R(int v, int value);
void SetPitch(int v, int value);
void SetEchoOn(int v, bool isOn);
void SetEchoOnFlg(int flg, int mask);
void SetPMOn(int v, bool isOn);
void SetPMOnFlg(int flg, int mask);
void SetNoiseOn(int v, bool isOn);
void SetNoiseOnFlg(int flg, int mask);
void SetSrcn(int v, int value);
void SetDir(int value);
void SetNoiseFreq(int value);
void WriteReg(int addr, unsigned char data);
void WriteRam(int addr, const unsigned char *data, int size);
void WriteRam(int addr, unsigned char data);
void KeyOffVoice(int v);
void KeyOffVoiceFlg(int flg);
void KeyOnVoice(int v);
void KeyOnVoiceFlg(int flg);
void Process1Sample(int &outl, int &outr);
void BeginFrameProcess(double frameTime);
bool IsHwAvailable() { return mDsp.IsHwAvailable(); }
void setBrr(int v, unsigned char *brrdata, unsigned int loopPoint);
void BeginRegisterLog();
void MarkRegisterLogLoop();
void EndRegisterLog();
void SetSongRecordPath(const char *path);
void SetRecSaveAsSpc(bool enable);
void SetRecSaveAsSmc(bool enable);
void SetTimeBaseForSmc(SmcTimeBase timebase);
void SetGameTitle(const char *title);
void SetSongTitle(const char *title);
void SetNameOfDumper(const char *dumper);
void SetArtistOfSong(const char *artist);
void SetSongComments(const char *comments);
char* GetSongRecordPath() { return mSongRecordPath; }
bool GetRecSaveAsSpc() { return mRecSaveAsSpc; }
bool GetRecSaveAsSmc() { return mRecSaveAsSmc; }
SmcTimeBase GetTimeBaseForSmc() { return mTimeBaseForSmc; }
char* GetGameTitle() { return mGameTitle; }
char* GetSongTitle() { return mSongTitle; }
char* GetNameOfDumper() { return mNameOfDumper; }
char* GetArtistOfSong() { return mArtistOfSong; }
char* GetSongComments() { return mSongComments; }
float GetRepeatNumForSpc() { return mRepeatNumForSpc; }
int GetFadeMsTimeForSpc() { return mFadeMsTimeForSpc; }
int GetSongPlayCodeVer();
void SetSmcNativeVector(const void *vec);
void SetSmcEmulationVector(const void *vec);
void SetSmcPlayerCode(const void *code, int size);
void SetSpcPlayerCode(const void *code, int size);
void SetSongPlayCodeVer(int ver);
void SetRepeatNumForSpc(float num);
void SetFadeMsTimeForSpc(int time);
private:
bool writeDsp(int addr, unsigned char data);
int saveRegisterLog(const char *path);
bool canSaveRegisterLog();
static void onDeviceReady(void *ref);
static void onDeviceStop(void *ref);
private:
struct DSPState {
// 音源内部状態
int ar,dr,sl,sr;
int vol_l,vol_r;
bool ecen;
bool ecenNotWrited;
bool pmon;
bool pmonNotWrited;
bool non;
bool nonNotWrited;
unsigned char *brrdata;
unsigned int loopPoint;
int memPtr; /* Sample data memory pointer */
int end; /* End or loop after block */
int loop;
int envcnt; /* Counts to envelope update */
env_state_t32 envstate; /* Current envelope state */
int envx; /* Last env height (0-0x7FFF) */
int filter; /* Last header's filter */
int half; /* Active nybble of BRR */
int headerCnt; /* Bytes before new header (0-8)*/
int mixfrac; /* Fractional part of smpl pstn */ //サンプル間を4096分割した位置
int pitch; /* Sample pitch (4096->32000Hz) */
int range; /* Last header's range */
int sampptr; /* Where in sampbuf we are */
int smp1; /* Last sample (for BRR filter) */
int smp2; /* Second-to-last sample decoded*/
int sampbuf[4]; /* Buffer for Gaussian interp */
void Reset();
};
EchoKernel mEcho[2];
DSPState mVoice[kMaximumVoices]; //ボイスの状況
int mVoiceLimit;
int mMainVolume_L;
int mMainVolume_R;
int mDirAddr;
bool mNewADPCM;
bool mUseRealEmulation;
int mEchoVolL;
int mEchoVolR;
int mEchoStartAddr;
int mEchoDelay;
int mEchoFeedBack;
int mEchoEnableWait;
unsigned char mRam[65536];
int mBrrStartAddr;
int mBrrEndAddr;
DspController mDsp;
RegisterLogger mLogger;
bool mIsLoggerRunning;
int mLoggerSamplePos;
char mSongRecordPath[PATH_LEN_MAX];
bool mRecSaveAsSpc;
bool mRecSaveAsSmc;
SmcTimeBase mTimeBaseForSmc;
char mGameTitle[33];
char mSongTitle[33];
char mNameOfDumper[17];
char mArtistOfSong[33];
char mSongComments[33];
float mRepeatNumForSpc;
int mFadeMsTimeForSpc;
unsigned char mSmcNativeVector[12];
unsigned char mSmcEmulationVector[12];
unsigned char *mSmcPlayerCode;
int mSmcPlayerCodeSize;
unsigned char *mSpcPlayerCode;
int mSpcPlayerCodeSize;
int mCodeVer;
static char mPathSeparatorChar;
};
#endif /* defined(__C700__C700DSP__) */