Implement VERA noise generation instead of rand()

This commit is contained in:
Natt Akuma 2022-03-07 16:46:12 +07:00
parent 252dc16492
commit 7f3519b970
2 changed files with 10 additions and 6 deletions

View File

@ -62,14 +62,17 @@ void DivPlatformVERA::acquire(short* bufL, short* bufR, size_t start, size_t len
int32_t lout=0;
int32_t rout=0;
// PSG
// TODO this is a currently speculated noise generation
// as the hardware and sources for it are not out in the public
// and the official emulator just uses rand()
noiseState=(noiseState<<1)|(((noiseState>>1)^(noiseState>>2)^(noiseState>>4)^(noiseState>>15))&1);
noiseOut=((noiseOut<<1)|(noiseState&1))&63;
for (int i=0; i<16; i++) {
unsigned freq=regPool[i*4+0] | (regPool[i*4+1] << 8);
unsigned old_accum=chan[i].accum;
unsigned new_accum=old_accum+freq;
int val=0x20;
// TODO actually emulate the LFSR, it's currently unknown publicly
// and the official emulator just uses this:
if ((old_accum^new_accum)&0x10000) chan[i].noiseval=rand()&63;
if ((old_accum^new_accum)&0x10000) chan[i].noiseval=noiseOut;
new_accum&=0x1ffff;
chan[i].accum=new_accum;
switch (regPool[i*4+3]>>6) {
@ -136,6 +139,8 @@ void DivPlatformVERA::reset() {
rWriteHi(i,2,3); // default pan
}
chan[16].vol=15;
noiseState=1;
noiseOut=0;
}
int DivPlatformVERA::calcNoteFreq(int ch, int note) {

View File

@ -46,8 +46,10 @@ class DivPlatformVERA: public DivDispatch {
};
Channel chan[17];
bool isMuted[17];
unsigned noiseState, noiseOut;
unsigned char regPool[66];
int calcNoteFreq(int ch, int note);
friend void putDispatchChan(void*,int,int);
public:
@ -67,8 +69,5 @@ class DivPlatformVERA: public DivDispatch {
const char* getEffectName(unsigned char effect);
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
~DivPlatformVERA();
private:
int calcNoteFreq(int ch, int note);
};
#endif