From d395abe47fde517e572bff037a79813a89f09cd2 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Thu, 9 Dec 2021 01:44:40 -0500 Subject: [PATCH] actually obey the orders --- CMakeLists.txt | 1 + src/engine/engine.cpp | 6 +----- src/engine/pattern.cpp | 22 ++++++++++++++++++++++ src/engine/pattern.h | 5 ++++- src/engine/playback.cpp | 6 +++--- 5 files changed, 31 insertions(+), 9 deletions(-) create mode 100644 src/engine/pattern.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index bf99a5128..012a33edc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -63,6 +63,7 @@ src/engine/blip_buf.c src/engine/safeReader.cpp src/engine/engine.cpp src/engine/macroInt.cpp +src/engine/pattern.cpp src/engine/playback.cpp src/engine/platform/abstract.cpp src/engine/platform/genesis.cpp diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index f921a2d72..ae112d27f 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -293,9 +293,6 @@ bool DivEngine::load(void* f, size_t slen) { for (int i=0; ids.ordersLen) { - logW("pattern %d exceeds order count %d!\n",ds.orders.ord[i][j],ds.ordersLen); - } } } @@ -540,7 +537,7 @@ bool DivEngine::load(void* f, size_t slen) { return false; } for (int j=0; jgetPattern(ds.orders.ord[i][j],true); for (int k=0; kdata[k][0]=reader.readS(); @@ -571,7 +568,6 @@ bool DivEngine::load(void* f, size_t slen) { // instrument pat->data[k][2]=reader.readS(); } - chan->data.push_back(pat); } ds.pat.push_back(chan); } diff --git a/src/engine/pattern.cpp b/src/engine/pattern.cpp new file mode 100644 index 000000000..61961e503 --- /dev/null +++ b/src/engine/pattern.cpp @@ -0,0 +1,22 @@ +#include "engine.h" + +static DivPattern emptyPat; + +DivPattern::DivPattern() { + memset(data,0,256*16); +} + +DivPattern* DivChannelData::getPattern(int index, bool create) { + if (data[index]==NULL) { + if (create) { + data[index]=new DivPattern; + } else { + return &emptyPat; + } + } + return data[index]; +} + +DivChannelData::DivChannelData() { + memset(data,0,128*sizeof(void*)); +} diff --git a/src/engine/pattern.h b/src/engine/pattern.h index 421870cc6..387c82b4a 100644 --- a/src/engine/pattern.h +++ b/src/engine/pattern.h @@ -1,5 +1,6 @@ struct DivPattern { short data[256][16]; + DivPattern(); }; struct DivChannelData { @@ -11,5 +12,7 @@ struct DivChannelData { // 2: instrument // 3: volume // 4-5+: effect/effect value - std::vector data; + DivPattern* data[128]; + DivPattern* getPattern(int index, bool create); + DivChannelData(); }; diff --git a/src/engine/playback.cpp b/src/engine/playback.cpp index 086193af9..58382aae0 100644 --- a/src/engine/playback.cpp +++ b/src/engine/playback.cpp @@ -278,7 +278,7 @@ bool DivEngine::perSystemPostEffect(int ch, unsigned char effect, unsigned char void DivEngine::processRow(int i, bool afterDelay) { int whatOrder=afterDelay?chan[i].delayOrder:curOrder; int whatRow=afterDelay?chan[i].delayRow:curRow; - DivPattern* pat=song.pat[i]->data[whatOrder]; + DivPattern* pat=song.pat[i]->getPattern(song.orders.ord[i][whatOrder],false); // pre effects if (!afterDelay) for (int j=0; jeffectRows; j++) { short effect=pat->data[whatRow][4+(j<<1)]; @@ -515,7 +515,7 @@ void DivEngine::nextRow() { snprintf(pb,4095," %.2x",song.orders.ord[i][curOrder]); strcat(pb1,pb); - DivPattern* pat=song.pat[i]->data[curOrder]; + DivPattern* pat=song.pat[i]->getPattern(song.orders.ord[i][curOrder],false); snprintf(pb2,4095,"\x1b[37m %s", formatNote(pat->data[curRow][0],pat->data[curRow][1])); strcat(pb3,pb2); @@ -579,7 +579,7 @@ void DivEngine::nextRow() { // post row details for (int i=0; idata[curOrder]; + DivPattern* pat=song.pat[i]->getPattern(song.orders.ord[i][curOrder],false); if (!(pat->data[curRow][0]==0 && pat->data[curRow][1]==0)) { if (pat->data[curRow][0]!=100) { dispatchCmd(DivCommand(DIV_CMD_PRE_NOTE,i,ticks));