Implement VERA noise generation instead of rand()
This commit is contained in:
parent
252dc16492
commit
7f3519b970
|
@ -62,14 +62,17 @@ void DivPlatformVERA::acquire(short* bufL, short* bufR, size_t start, size_t len
|
||||||
int32_t lout=0;
|
int32_t lout=0;
|
||||||
int32_t rout=0;
|
int32_t rout=0;
|
||||||
// PSG
|
// 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++) {
|
for (int i=0; i<16; i++) {
|
||||||
unsigned freq=regPool[i*4+0] | (regPool[i*4+1] << 8);
|
unsigned freq=regPool[i*4+0] | (regPool[i*4+1] << 8);
|
||||||
unsigned old_accum=chan[i].accum;
|
unsigned old_accum=chan[i].accum;
|
||||||
unsigned new_accum=old_accum+freq;
|
unsigned new_accum=old_accum+freq;
|
||||||
int val=0x20;
|
int val=0x20;
|
||||||
// TODO actually emulate the LFSR, it's currently unknown publicly
|
if ((old_accum^new_accum)&0x10000) chan[i].noiseval=noiseOut;
|
||||||
// and the official emulator just uses this:
|
|
||||||
if ((old_accum^new_accum)&0x10000) chan[i].noiseval=rand()&63;
|
|
||||||
new_accum&=0x1ffff;
|
new_accum&=0x1ffff;
|
||||||
chan[i].accum=new_accum;
|
chan[i].accum=new_accum;
|
||||||
switch (regPool[i*4+3]>>6) {
|
switch (regPool[i*4+3]>>6) {
|
||||||
|
@ -136,6 +139,8 @@ void DivPlatformVERA::reset() {
|
||||||
rWriteHi(i,2,3); // default pan
|
rWriteHi(i,2,3); // default pan
|
||||||
}
|
}
|
||||||
chan[16].vol=15;
|
chan[16].vol=15;
|
||||||
|
noiseState=1;
|
||||||
|
noiseOut=0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int DivPlatformVERA::calcNoteFreq(int ch, int note) {
|
int DivPlatformVERA::calcNoteFreq(int ch, int note) {
|
||||||
|
|
|
@ -46,8 +46,10 @@ class DivPlatformVERA: public DivDispatch {
|
||||||
};
|
};
|
||||||
Channel chan[17];
|
Channel chan[17];
|
||||||
bool isMuted[17];
|
bool isMuted[17];
|
||||||
|
unsigned noiseState, noiseOut;
|
||||||
unsigned char regPool[66];
|
unsigned char regPool[66];
|
||||||
|
|
||||||
|
int calcNoteFreq(int ch, int note);
|
||||||
friend void putDispatchChan(void*,int,int);
|
friend void putDispatchChan(void*,int,int);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -67,8 +69,5 @@ class DivPlatformVERA: public DivDispatch {
|
||||||
const char* getEffectName(unsigned char effect);
|
const char* getEffectName(unsigned char effect);
|
||||||
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
int init(DivEngine* parent, int channels, int sugRate, unsigned int flags);
|
||||||
~DivPlatformVERA();
|
~DivPlatformVERA();
|
||||||
|
|
||||||
private:
|
|
||||||
int calcNoteFreq(int ch, int note);
|
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue