fix wiz lab AGAIN and implement repeat pat

0x0b + 0x0d = broken
This commit is contained in:
tildearrow 2021-12-21 17:42:27 -05:00
parent 7b360b55a7
commit c2669f208e
5 changed files with 80 additions and 14 deletions

View File

@ -1424,6 +1424,8 @@ void DivEngine::setLoops(int loops) {
void DivEngine::playSub(bool preserveDrift) { void DivEngine::playSub(bool preserveDrift) {
reset(); reset();
if (preserveDrift && curOrder==0) return; if (preserveDrift && curOrder==0) return;
bool oldRepeatPattern=repeatPattern;
repeatPattern=false;
int goal=curOrder; int goal=curOrder;
curOrder=0; curOrder=0;
curRow=0; curRow=0;
@ -1446,6 +1448,7 @@ void DivEngine::playSub(bool preserveDrift) {
if (goal>0) { if (goal>0) {
dispatch->forceIns(); dispatch->forceIns();
} }
repeatPattern=oldRepeatPattern;
if (preserveDrift) { if (preserveDrift) {
clockDrift=prevDrift; clockDrift=prevDrift;
} else { } else {
@ -1548,6 +1551,16 @@ int DivEngine::getTotalTicks() {
return totalTicks; return totalTicks;
} }
bool DivEngine::getRepeatPattern() {
return repeatPattern;
}
void DivEngine::setRepeatPattern(bool value) {
isBusy.lock();
repeatPattern=value;
isBusy.unlock();
}
bool DivEngine::hasExtValue() { bool DivEngine::hasExtValue() {
return extValuePresent; return extValuePresent;
} }

View File

@ -78,6 +78,7 @@ class DivEngine {
bool endOfSong; bool endOfSong;
bool consoleMode; bool consoleMode;
bool extValuePresent; bool extValuePresent;
bool repeatPattern;
int ticks, cycles, curRow, curOrder, remainingLoops, nextSpeed, clockDrift; int ticks, cycles, curRow, curOrder, remainingLoops, nextSpeed, clockDrift;
int changeOrd, changePos, totalTicks, totalCmds, lastCmds, cmdsPerSecond; int changeOrd, changePos, totalTicks, totalCmds, lastCmds, cmdsPerSecond;
unsigned char extValue; unsigned char extValue;
@ -232,6 +233,12 @@ class DivEngine {
// get time // get time
int getTotalTicks(); int getTotalTicks();
// get repeat pattern
bool getRepeatPattern();
// set repeat pattern
void setRepeatPattern(bool value);
// has ext value // has ext value
bool hasExtValue(); bool hasExtValue();
@ -311,6 +318,7 @@ class DivEngine {
endOfSong(false), endOfSong(false),
consoleMode(false), consoleMode(false),
extValuePresent(false), extValuePresent(false),
repeatPattern(false),
ticks(0), ticks(0),
cycles(0), cycles(0),
curRow(0), curRow(0),

View File

@ -5,6 +5,7 @@
void DivEngine::nextOrder() { void DivEngine::nextOrder() {
curRow=0; curRow=0;
if (repeatPattern) return;
if (++curOrder>=song.ordersLen) { if (++curOrder>=song.ordersLen) {
endOfSong=true; endOfSong=true;
curOrder=0; curOrder=0;
@ -385,14 +386,14 @@ void DivEngine::processRow(int i, bool afterDelay) {
speed2=effectVal; speed2=effectVal;
break; break;
case 0x0b: // change order case 0x0b: // change order
if (changeOrd==-1) { if (changeOrd<0) {
changeOrd=effectVal; changeOrd=effectVal;
changePos=0; changePos=0;
} }
break; break;
case 0x0d: // next order case 0x0d: // next order
if (changeOrd==-1) { if (changeOrd<0) {
changeOrd=curOrder+1; changeOrd=-2;
changePos=effectVal; changePos=effectVal;
} }
break; break;
@ -610,15 +611,21 @@ void DivEngine::nextRow() {
if (++curRow>=song.patLen) { if (++curRow>=song.patLen) {
nextOrder(); nextOrder();
} }
if (changeOrd>=0) { if (changeOrd!=-1) {
curRow=changePos; if (repeatPattern) {
if (changeOrd<=curOrder) endOfSong=true; curRow=0;
curOrder=changeOrd; changeOrd=-1;
if (curOrder>=song.ordersLen) { } else {
curOrder=0; curRow=changePos;
endOfSong=true; if (changeOrd==-2) changeOrd=curOrder+1;
if (changeOrd<=curOrder) endOfSong=true;
curOrder=changeOrd;
if (curOrder>=song.ordersLen) {
curOrder=0;
endOfSong=true;
}
changeOrd=-1;
} }
changeOrd=-1;
} }
if (song.system==DIV_SYSTEM_YMU759) { if (song.system==DIV_SYSTEM_YMU759) {

View File

@ -269,6 +269,17 @@ void FurnaceGUI::drawEditControls() {
if (ImGui::Button(ICON_FA_STOP "##Stop")) { if (ImGui::Button(ICON_FA_STOP "##Stop")) {
e->stop(); e->stop();
} }
ImGui::Text("Follow");
ImGui::SameLine();
ImGui::Checkbox("Orders",&followOrders);
ImGui::SameLine();
ImGui::Checkbox("Pattern",&followPattern);
bool repeatPattern=e->getRepeatPattern();
if (ImGui::Checkbox("Repeat pattern",&repeatPattern)) {
e->setRepeatPattern(repeatPattern);
}
} }
if (ImGui::IsWindowFocused()) curWindow=GUI_WINDOW_EDIT_CONTROLS; if (ImGui::IsWindowFocused()) curWindow=GUI_WINDOW_EDIT_CONTROLS;
ImGui::End(); ImGui::End();
@ -365,7 +376,9 @@ void FurnaceGUI::drawOrders() {
ImGui::TableSetupScrollFreeze(0,1); ImGui::TableSetupScrollFreeze(0,1);
float lineHeight=(ImGui::GetTextLineHeight()+4*dpiScale); float lineHeight=(ImGui::GetTextLineHeight()+4*dpiScale);
if (e->isPlaying()) { if (e->isPlaying()) {
ImGui::SetScrollY((e->getOrder()+1)*lineHeight-(ImGui::GetContentRegionAvail().y/2)); if (followOrders) {
ImGui::SetScrollY((e->getOrder()+1)*lineHeight-(ImGui::GetContentRegionAvail().y/2));
}
} }
ImGui::TableNextRow(0,lineHeight); ImGui::TableNextRow(0,lineHeight);
ImGui::TableNextColumn(); ImGui::TableNextColumn();
@ -954,7 +967,7 @@ void FurnaceGUI::drawPattern() {
int curRow=e->getRow(); int curRow=e->getRow();
if (e->isPlaying()) updateScroll(curRow); if (e->isPlaying()) updateScroll(curRow);
if (nextScroll>-0.5f) { if (nextScroll>-0.5f) {
ImGui::SetScrollY(nextScroll); if (followPattern) ImGui::SetScrollY(nextScroll);
nextScroll=-1.0f; nextScroll=-1.0f;
} }
ImGui::TableSetupScrollFreeze(1,1); ImGui::TableSetupScrollFreeze(1,1);
@ -1652,6 +1665,22 @@ void FurnaceGUI::doPaste() {
} }
void FurnaceGUI::keyDown(SDL_Event& ev) { void FurnaceGUI::keyDown(SDL_Event& ev) {
// GLOBAL KEYS
switch (ev.key.keysym.sym) {
case SDLK_F5:
if (!e->isPlaying()) e->play();
break;
case SDLK_F6:
e->play();
break;
case SDLK_F7:
e->play();
break;
case SDLK_F8:
e->stop();
break;
}
// PER-WINDOW KEYS
switch (curWindow) { switch (curWindow) {
case GUI_WINDOW_PATTERN: { case GUI_WINDOW_PATTERN: {
if (ev.key.keysym.mod&KMOD_CTRL) { if (ev.key.keysym.mod&KMOD_CTRL) {
@ -1694,6 +1723,13 @@ void FurnaceGUI::keyDown(SDL_Event& ev) {
case SDLK_INSERT: case SDLK_INSERT:
doInsert(); doInsert();
break; break;
case SDLK_RETURN:
if (e->isPlaying()) {
e->stop();
} else {
e->play();
}
break;
default: default:
if (selStart.xFine==0) { // note if (selStart.xFine==0) { // note
try { try {
@ -2307,6 +2343,8 @@ FurnaceGUI::FurnaceGUI():
selecting(false), selecting(false),
curNibble(false), curNibble(false),
extraChannelButtons(false), extraChannelButtons(false),
followOrders(true),
followPattern(true),
curWindow(GUI_WINDOW_NOTHING), curWindow(GUI_WINDOW_NOTHING),
arpMacroScroll(0), arpMacroScroll(0),
macroDragStart(0,0), macroDragStart(0,0),

View File

@ -97,7 +97,7 @@ class FurnaceGUI {
bool editControlsOpen, ordersOpen, insListOpen, songInfoOpen, patternOpen, insEditOpen; bool editControlsOpen, ordersOpen, insListOpen, songInfoOpen, patternOpen, insEditOpen;
bool waveListOpen, waveEditOpen, sampleListOpen, sampleEditOpen, aboutOpen, settingsOpen; bool waveListOpen, waveEditOpen, sampleListOpen, sampleEditOpen, aboutOpen, settingsOpen;
SelectionPoint selStart, selEnd; SelectionPoint selStart, selEnd;
bool selecting, curNibble, extraChannelButtons; bool selecting, curNibble, extraChannelButtons, followOrders, followPattern;
FurnaceGUIWindows curWindow; FurnaceGUIWindows curWindow;
std::map<SDL_Keycode,int> noteKeys; std::map<SDL_Keycode,int> noteKeys;