Skip to content
This repository has been archived by the owner on Oct 4, 2020. It is now read-only.

Commit

Permalink
Audio: (Square) TickSweep() logic was incorrect (sound effects were w…
Browse files Browse the repository at this point in the history
…rong in Journey to Silius, etc.)
  • Loading branch information
SourMesen committed Jul 14, 2016
1 parent c7d0e51 commit 1a1ab36
Showing 1 changed file with 18 additions and 28 deletions.
46 changes: 18 additions & 28 deletions Core/SquareChannel.h
Expand Up @@ -47,7 +47,7 @@ class SquareChannel : public ApuEnvelope
_reloadSweep = true;
}

void UpdateTargetPeriod(bool setPeriod)
void UpdateTargetPeriod()
{
uint16_t shiftResult = (_realPeriod >> _sweepShift);
if(_sweepNegate) {
Expand All @@ -59,10 +59,13 @@ class SquareChannel : public ApuEnvelope
} else {
_sweepTargetPeriod = _realPeriod + shiftResult;
}
if(setPeriod && _sweepShift > 0 && _realPeriod >= 8 && _sweepTargetPeriod <= 0x7FF) {
_realPeriod = _sweepTargetPeriod;
_period = (_realPeriod * 2) + 1;
}
}

void SetPeriod(uint16_t newPeriod)
{
_realPeriod = newPeriod;
_period = (_realPeriod * 2) + 1;
UpdateTargetPeriod();
}

protected:
Expand Down Expand Up @@ -136,17 +139,13 @@ class SquareChannel : public ApuEnvelope
break;

case 2: //4002 & 4006
_realPeriod &= ~0x00FF;
_realPeriod |= value;
_period = (_realPeriod * 2) + 1;
SetPeriod((_realPeriod & 0x0700) | value);
break;

case 3: //4003 & 4007
LoadLengthCounter(value >> 3);

_realPeriod &= ~0x0700;
_realPeriod |= (value & 0x07) << 8;
_period = (_realPeriod * 2) + 1;
SetPeriod((_realPeriod & 0xFF) | ((value & 0x07) << 8));

//The sequencer is restarted at the first value of the current sequence.
_timer = 0;
Expand All @@ -160,26 +159,17 @@ class SquareChannel : public ApuEnvelope

void TickSweep()
{
if(_reloadSweep) {
if(_sweepDivider == 0 && _sweepEnabled) {
//If the divider's counter was zero before the reload and the sweep is enabled, the pulse's period is also adjusted
UpdateTargetPeriod(true);
_sweepDivider--;
if(_sweepDivider == 0) {
if(_sweepShift > 0 && _sweepEnabled && _realPeriod >= 8 && _sweepTargetPeriod <= 0x7FF) {
SetPeriod(_sweepTargetPeriod);
}
_sweepDivider = _sweepPeriod;
_reloadSweep = false;
} else {
if(_sweepDivider > 0) {
_sweepDivider--;
} else if(_sweepEnabled) {
UpdateTargetPeriod(true);
_sweepDivider = _sweepPeriod;
}
}
}

void Run(uint32_t targetCycle)
{
UpdateTargetPeriod(false);
ApuLengthCounter::Run(targetCycle);
if(_reloadSweep) {
_sweepDivider = _sweepPeriod;
_reloadSweep = false;
}
}
};

0 comments on commit 1a1ab36

Please sign in to comment.