make required changes, and fix per-channel osc
This commit is contained in:
parent
98bb0ea175
commit
606ef1e410
|
|
@ -34,7 +34,7 @@
|
||||||
(a.dir ? 0x02 : 0x00) | \
|
(a.dir ? 0x02 : 0x00) | \
|
||||||
(b.dir ? 0x01 : 0x00))
|
(b.dir ? 0x01 : 0x00))
|
||||||
#define volPan(v, p) (((v * (p >> 4) / 15) << 4) | ((v * (p & 0xf) / 15) & 0xf))
|
#define volPan(v, p) (((v * (p >> 4) / 15) << 4) | ((v * (p & 0xf) / 15) & 0xf))
|
||||||
#define mapAmp(a) (((a) * 65535 / 63 - 32768) * (pn.flags & 0x7) / 7)
|
#define mapAmp(a) ((((a) * 65535 / 63 - 32768) * (pn.flags & 0x7) / 7) >> 1)
|
||||||
#define CHIP_DIVIDER 128
|
#define CHIP_DIVIDER 128
|
||||||
|
|
||||||
const char* regCheatSheetPowerNoise[]={
|
const char* regCheatSheetPowerNoise[]={
|
||||||
|
|
@ -81,7 +81,9 @@ void DivPlatformPowerNoise::acquire(short** buf, size_t len) {
|
||||||
int16_t left, right;
|
int16_t left, right;
|
||||||
|
|
||||||
for (size_t h=0; h<len; h++) {
|
for (size_t h=0; h<len; h++) {
|
||||||
pwrnoise_step(&pn, &left, &right);
|
for(int i = 0; i < 32; i++) {
|
||||||
|
pwrnoise_step(&pn, &left, &right);
|
||||||
|
}
|
||||||
|
|
||||||
oscBuf[0]->data[oscBuf[0]->needle++]=mapAmp(pn.n1.out_latch);
|
oscBuf[0]->data[oscBuf[0]->needle++]=mapAmp(pn.n1.out_latch);
|
||||||
oscBuf[1]->data[oscBuf[1]->needle++]=mapAmp(pn.n2.out_latch);
|
oscBuf[1]->data[oscBuf[1]->needle++]=mapAmp(pn.n2.out_latch);
|
||||||
|
|
@ -145,7 +147,7 @@ void DivPlatformPowerNoise::tick(bool sysTick) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (chan[i].std.vol.had) {
|
if (chan[i].std.vol.had) {
|
||||||
chan[i].outVol=VOL_SCALE_LINEAR_BROKEN(chan[i].vol&15,MIN(15,chan[i].std.vol.val),15);
|
chan[i].outVol=VOL_SCALE_LINEAR(chan[i].vol&15,MIN(15,chan[i].std.vol.val),15);
|
||||||
if (chan[i].outVol<0) chan[i].outVol=0;
|
if (chan[i].outVol<0) chan[i].outVol=0;
|
||||||
}
|
}
|
||||||
if (NEW_ARP_STRAT) {
|
if (NEW_ARP_STRAT) {
|
||||||
|
|
@ -165,7 +167,7 @@ void DivPlatformPowerNoise::tick(bool sysTick) {
|
||||||
chan[i].pan|=chan[i].std.panR.val&15;
|
chan[i].pan|=chan[i].std.panR.val&15;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(chan[i].std.vol.had || chan[i].std.panL.had || chan[i].std.panR.had) {
|
if (chan[i].std.vol.had || chan[i].std.panL.had || chan[i].std.panR.had) {
|
||||||
cWrite(i,0x06,isMuted[i]?0:volPan(chan[i].outVol, chan[i].pan));
|
cWrite(i,0x06,isMuted[i]?0:volPan(chan[i].outVol, chan[i].pan));
|
||||||
}
|
}
|
||||||
if (chan[i].std.pitch.had) {
|
if (chan[i].std.pitch.had) {
|
||||||
|
|
@ -190,49 +192,49 @@ void DivPlatformPowerNoise::tick(bool sysTick) {
|
||||||
if (chan[i].freq<0) chan[i].freq=0;
|
if (chan[i].freq<0) chan[i].freq=0;
|
||||||
if (chan[i].freq>0x7ffffff) chan[i].freq=0x7ffffff;
|
if (chan[i].freq>0x7ffffff) chan[i].freq=0x7ffffff;
|
||||||
|
|
||||||
if(chan[i].freq >= 0x4000000) {
|
if (chan[i].freq >= 0x4000000) {
|
||||||
chan[i].octave = 15;
|
chan[i].octave = 15;
|
||||||
}
|
}
|
||||||
else if(chan[i].freq >= 0x2000000) {
|
else if (chan[i].freq >= 0x2000000) {
|
||||||
chan[i].octave = 14;
|
chan[i].octave = 14;
|
||||||
}
|
}
|
||||||
else if(chan[i].freq >= 0x1000000) {
|
else if (chan[i].freq >= 0x1000000) {
|
||||||
chan[i].octave = 13;
|
chan[i].octave = 13;
|
||||||
}
|
}
|
||||||
else if(chan[i].freq >= 0x800000) {
|
else if (chan[i].freq >= 0x800000) {
|
||||||
chan[i].octave = 12;
|
chan[i].octave = 12;
|
||||||
}
|
}
|
||||||
else if(chan[i].freq >= 0x400000) {
|
else if (chan[i].freq >= 0x400000) {
|
||||||
chan[i].octave = 11;
|
chan[i].octave = 11;
|
||||||
}
|
}
|
||||||
else if(chan[i].freq >= 0x200000) {
|
else if (chan[i].freq >= 0x200000) {
|
||||||
chan[i].octave = 10;
|
chan[i].octave = 10;
|
||||||
}
|
}
|
||||||
else if(chan[i].freq >= 0x100000) {
|
else if (chan[i].freq >= 0x100000) {
|
||||||
chan[i].octave = 9;
|
chan[i].octave = 9;
|
||||||
}
|
}
|
||||||
else if(chan[i].freq >= 0x80000) {
|
else if (chan[i].freq >= 0x80000) {
|
||||||
chan[i].octave = 8;
|
chan[i].octave = 8;
|
||||||
}
|
}
|
||||||
else if(chan[i].freq >= 0x40000) {
|
else if (chan[i].freq >= 0x40000) {
|
||||||
chan[i].octave = 7;
|
chan[i].octave = 7;
|
||||||
}
|
}
|
||||||
else if(chan[i].freq >= 0x20000) {
|
else if (chan[i].freq >= 0x20000) {
|
||||||
chan[i].octave = 6;
|
chan[i].octave = 6;
|
||||||
}
|
}
|
||||||
else if(chan[i].freq >= 0x10000) {
|
else if (chan[i].freq >= 0x10000) {
|
||||||
chan[i].octave = 5;
|
chan[i].octave = 5;
|
||||||
}
|
}
|
||||||
else if(chan[i].freq >= 0x8000) {
|
else if (chan[i].freq >= 0x8000) {
|
||||||
chan[i].octave = 4;
|
chan[i].octave = 4;
|
||||||
}
|
}
|
||||||
else if(chan[i].freq >= 0x4000) {
|
else if (chan[i].freq >= 0x4000) {
|
||||||
chan[i].octave = 3;
|
chan[i].octave = 3;
|
||||||
}
|
}
|
||||||
else if(chan[i].freq >= 0x2000) {
|
else if (chan[i].freq >= 0x2000) {
|
||||||
chan[i].octave = 2;
|
chan[i].octave = 2;
|
||||||
}
|
}
|
||||||
else if(chan[i].freq >= 0x1000) {
|
else if (chan[i].freq >= 0x1000) {
|
||||||
chan[i].octave = 1;
|
chan[i].octave = 1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
@ -245,7 +247,7 @@ void DivPlatformPowerNoise::tick(bool sysTick) {
|
||||||
cWrite(i,0x02,(chan[i].freq>>8) | (chan[i].octave<<4));
|
cWrite(i,0x02,(chan[i].freq>>8) | (chan[i].octave<<4));
|
||||||
|
|
||||||
if (chan[i].keyOn) {
|
if (chan[i].keyOn) {
|
||||||
if(chan[i].slope) {
|
if (chan[i].slope) {
|
||||||
cWrite(i, 0x00, slopeCtl(true, false, chan[i].slopeA, chan[i].slopeB));
|
cWrite(i, 0x00, slopeCtl(true, false, chan[i].slopeA, chan[i].slopeB));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
@ -253,7 +255,7 @@ void DivPlatformPowerNoise::tick(bool sysTick) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (chan[i].keyOff) {
|
if (chan[i].keyOff) {
|
||||||
if(chan[i].slope) {
|
if (chan[i].slope) {
|
||||||
cWrite(i, 0x00, slopeCtl(false, false, chan[i].slopeA, chan[i].slopeB));
|
cWrite(i, 0x00, slopeCtl(false, false, chan[i].slopeA, chan[i].slopeB));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
@ -442,18 +444,7 @@ unsigned short DivPlatformPowerNoise::getPan(int ch) {
|
||||||
|
|
||||||
DivChannelModeHints DivPlatformPowerNoise::getModeHints(int ch) {
|
DivChannelModeHints DivPlatformPowerNoise::getModeHints(int ch) {
|
||||||
DivChannelModeHints ret;
|
DivChannelModeHints ret;
|
||||||
|
ret.count=0;
|
||||||
ret.count=1;
|
|
||||||
|
|
||||||
if (ch==3) {
|
|
||||||
ret.hint[0]=ICON_FUR_SAW;
|
|
||||||
ret.type[0]=5;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ret.hint[0]=ICON_FUR_NOISE;
|
|
||||||
ret.type[0]=4;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -514,10 +505,10 @@ void DivPlatformPowerNoise::notifyInsDeletion(void* ins) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void DivPlatformPowerNoise::setFlags(const DivConfig& flags) {
|
void DivPlatformPowerNoise::setFlags(const DivConfig& flags) {
|
||||||
chipClock=16777216;
|
chipClock=16000000;
|
||||||
|
|
||||||
CHECK_CUSTOM_CLOCK;
|
CHECK_CUSTOM_CLOCK;
|
||||||
rate=chipClock;
|
rate=chipClock/32;
|
||||||
|
|
||||||
for (int i=0; i<4; i++) {
|
for (int i=0; i<4; i++) {
|
||||||
oscBuf[i]->rate=rate;
|
oscBuf[i]->rate=rate;
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,6 @@
|
||||||
#define _POWER_NOISE_H
|
#define _POWER_NOISE_H
|
||||||
|
|
||||||
#include "../dispatch.h"
|
#include "../dispatch.h"
|
||||||
#include "../../fixedQueue.h"
|
|
||||||
#include "../../../extern/pwrnoise/pwrnoise.h"
|
#include "../../../extern/pwrnoise/pwrnoise.h"
|
||||||
|
|
||||||
class DivPlatformPowerNoise: public DivDispatch {
|
class DivPlatformPowerNoise: public DivDispatch {
|
||||||
|
|
@ -62,9 +61,6 @@ class DivPlatformPowerNoise: public DivDispatch {
|
||||||
bool isMuted[4];
|
bool isMuted[4];
|
||||||
unsigned char regPool[32];
|
unsigned char regPool[32];
|
||||||
|
|
||||||
FixedQueue<int16_t,64> queueLeft;
|
|
||||||
FixedQueue<int16_t,64> queueRight;
|
|
||||||
|
|
||||||
power_noise_t pn;
|
power_noise_t pn;
|
||||||
|
|
||||||
friend void putDispatchChip(void*,int);
|
friend void putDispatchChip(void*,int);
|
||||||
|
|
|
||||||
|
|
@ -1986,7 +1986,7 @@ void DivEngine::registerSystems() {
|
||||||
);
|
);
|
||||||
|
|
||||||
sysDefs[DIV_SYSTEM_POWER_NOISE]=new DivSysDef(
|
sysDefs[DIV_SYSTEM_POWER_NOISE]=new DivSysDef(
|
||||||
"PowerNoise", NULL, 0xd2, 0, 4, false, false, 0, false, 0, 0, 0,
|
"PowerNoise", NULL, 0xd4, 0, 4, false, false, 0, false, 0, 0, 0,
|
||||||
"a fantasy sound chip designed by jvsTSX and The Beesh-Spweesh!\nused in the Hexheld fantasy console.",
|
"a fantasy sound chip designed by jvsTSX and The Beesh-Spweesh!\nused in the Hexheld fantasy console.",
|
||||||
{"Noise 1", "Noise 2", "Noise 3", "Slope"},
|
{"Noise 1", "Noise 2", "Noise 3", "Slope"},
|
||||||
{"N1", "N2", "N3", "SL"},
|
{"N1", "N2", "N3", "SL"},
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue