Skip to content

Commit

Permalink
Make constant frequency and variable time
Browse files Browse the repository at this point in the history
  • Loading branch information
binarymaster committed May 9, 2017
1 parent 14cc8be commit 29b1b6c
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 27 deletions.
56 changes: 31 additions & 25 deletions src/herad.cpp
Expand Up @@ -663,7 +663,7 @@ bool CheradPlayer::load(const std::string &filename, const CFileProvider &fp)

void CheradPlayer::rewind(int subsong)
{
timer = 200.299 * 256.0 / wSpeed;
wTime = 0;
songend = false;

for (int i = 0; i < nTracks; i++)
Expand Down Expand Up @@ -1156,41 +1156,47 @@ void CheradPlayer::macroSlide(uint8_t c)
bool CheradPlayer::update()
{
songend = true;
wTime = wTime - 256;
for (uint8_t i = 0; i < nTracks; i++)
{
if (chn[i].slide_dur > 0 && chn[i].keyon)
macroSlide(i);
if (track[i].pos >= track[i].size)
continue;
songend = false; // track is not finished
if (!track[i].counter)
if (wTime < 0)
{
bool first = track[i].pos == 0;
track[i].ticks = GetTicks(i);
if (first && track[i].ticks)
track[i].ticks++; // workaround to synchronize tracks (there's always 1 excess tick at start)
}
if (++track[i].counter >= track[i].ticks)
{
track[i].counter = 0;
while (track[i].pos < track[i].size)
if (chn[i].slide_dur > 0 && chn[i].keyon)
macroSlide(i);
if (!track[i].counter)
{
executeCommand(i);
if (track[i].pos >= track[i].size) {
break;
}
else if (!track[i].data[track[i].pos]) // if next delay is zero
bool first = track[i].pos == 0;
track[i].ticks = GetTicks(i);
if (first && track[i].ticks)
track[i].ticks++; // workaround to synchronize tracks (there's always 1 excess tick at start)
}
if (++track[i].counter >= track[i].ticks)
{
track[i].counter = 0;
while (track[i].pos < track[i].size)
{
track[i].pos++;
executeCommand(i);
if (track[i].pos >= track[i].size) {
break;
}
else if (!track[i].data[track[i].pos]) // if next delay is zero
{
track[i].pos++;
}
else break;
}
else break;
}
}
else if (track[i].ticks >= 0x8000)
{
track[i].pos = track[i].size;
track[i].counter = track[i].ticks;
else if (track[i].ticks >= 0x8000)
{
track[i].pos = track[i].size;
track[i].counter = track[i].ticks;
}
}
}
if (wTime < 0)
wTime = wTime + wSpeed;
return !songend;
}
4 changes: 2 additions & 2 deletions src/herad.h
Expand Up @@ -74,7 +74,7 @@ class CheradPlayer: public CPlayer

float getrefresh()
{
return timer;
return 200.299;
};

unsigned int getspeed()
Expand Down Expand Up @@ -113,7 +113,7 @@ class CheradPlayer: public CPlayer

protected:
bool songend;
float timer;
int16_t wTime;

uint8_t comp; /* File compression type (see HERAD_COMP_*) */
bool AGD; /* Whether this is HERAD AGD (OPL3) */
Expand Down

0 comments on commit 29b1b6c

Please sign in to comment.