From 38e4245ee0415fed45c0ecdbcefe1e7eda713423 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 24 Jun 2025 02:54:18 -0500 Subject: [PATCH] Virtual Boy: envelope bug status --- doc/7-systems/status-VBoy-env-error.png | Bin 0 -> 730 bytes doc/7-systems/status-VBoy-env-none.png | Bin 0 -> 553 bytes doc/7-systems/status-VBoy-env-warn.png | Bin 0 -> 754 bytes doc/7-systems/virtual-boy.md | 8 ++++++ src/engine/dispatch.h | 2 ++ src/engine/platform/sound/vsu.cpp | 3 ++- src/engine/platform/sound/vsu.h | 2 ++ src/engine/platform/vb.cpp | 33 ++++++++++++++++++++++++ src/engine/platform/vb.h | 3 +++ src/gui/gui.h | 2 ++ src/gui/guiConst.cpp | 2 ++ src/gui/pattern.cpp | 6 +++++ src/gui/settings.cpp | 2 ++ 13 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 doc/7-systems/status-VBoy-env-error.png create mode 100644 doc/7-systems/status-VBoy-env-none.png create mode 100644 doc/7-systems/status-VBoy-env-warn.png diff --git a/doc/7-systems/status-VBoy-env-error.png b/doc/7-systems/status-VBoy-env-error.png new file mode 100644 index 0000000000000000000000000000000000000000..5567e529d1f3deabcdc5b20861a387c073ac2cc9 GIT binary patch literal 730 zcmV<00ww*4P)rI zRf(p(7GeWJ;m8Ni+hN;o9z2v?b)3>Dn3PQjjSzMHa$@j1C#+CWTTkQZ&cTx zSyu2{Zuup`V;w?)71Dd7j`On7C?MyaT2`2F7buNRU8XdgdSsdf^k+6kF$ z>3@|m0niQJMM}$UD|ttFDJuac+pJ8-TZ_;{+_IMQjBQ9~30aL$KD_IU#TuE)FR*Dk znPLpyh^`+^Xlw)X2`)v({y>7OjuEmwp&rF7cx;-xGh|X{krjO3>})!}Ll`d{Op0tK z`{VXe_{sTKLTpU-_9xGqnwxX~bvs$6Z!tEQto+XNcG`AJNmWcZO-Ki@V2g+KdiZ&Y zkPdjm2%RKkrdEqT&l12D#)`dPU1Q8rW9mQNc}iCRttxom`}@lPJ;M9p`-7E= z;=j+?Zadw{$H+aSS#_Sf?ucQmLa11dlEjNfW2{>JwK#unmZaD67nN$FPbs6BcK`qY M07*qoM6N<$f*UGX1^@s6 literal 0 HcmV?d00001 diff --git a/doc/7-systems/status-VBoy-env-none.png b/doc/7-systems/status-VBoy-env-none.png new file mode 100644 index 0000000000000000000000000000000000000000..cfd5af66dfd0d9c2324b4c22e9d5634ae7e37f10 GIT binary patch literal 553 zcmV+^0@nSBP)nO|8+LPG>ru z(srZKxL&Ve7;3FxXr!WCW@c2b>*C?N{D#9Jw{5jrjpnv^KhrcPlS%x!<2d-K`29mB zo6V-+eU0xoKAlcQ#)mW_nUXwLDwQJr5S*kg5F)Z#m>=pM7|{0f`3xgMmpu&i)ym};2b@-8Qdb3kncrYA z-~gBVso-yD0WSAb!9URtW`q!3KTH{oM%sShR|t5j9|S)M{)QIdDt>bO4I$v&ZdXhz zA?!WSh$lQ1e?bt-QHY$hoU;D0wlK|(0 zQo^3G%?3HCQ-D9dRPXou3lEFM0=a(E_c*q2yF6|1k7aUQC4OW5Mcc9;XgebIDInR0zC&L(ZpZB{;#R|`O~NWR8F5wO&pGnSi+8*oAKX2hW-2hP}6^kicG+$V#5(~ z-@pIY*8cM3$v>+3Z`w3YU0s|iSy>r{g&8+){6ii8nVT~oKFkAQ|M|o4@FBt<3JOfj zU}yaQ4^;N$!iB$7$OZ=w^1w4dc{w|>RCP5wTx!=YZYt!5z(7_@OGHTiK@GFNNd9qf zVDa>1p~yZ~R))4V4rCDy6dnT?7fN(=c5*T^Q(#|420O55Mi$}ZWJI+OMZJaw;p~so zK41+{RmF}bh~^<+=0j6ZSI5E2%SeuW6&38jRE{Rd$%)T;AP^H{EGc0p**0ue9{XpFjU0#dKdEhnyTv#n-R@Gcx-87qv`9aY9-e8y?FbMr_{v8_rElWy52i zrY2KjBHNrfzp#fVKR;tl4F`3bJoWV)JUoop?JFx|7ZD*)Jux!k<6=wCjK#(5SmIAs zmg(wMUJgRu1GZC^Ecp$OznBXqW kCx3tUjxL>>Q9x?|0LALcaYds~^#A|>07*qoM6N<$g36m!R{#J2 literal 0 HcmV?d00001 diff --git a/doc/7-systems/virtual-boy.md b/doc/7-systems/virtual-boy.md index 5bdadb67a..2bb1d4224 100644 --- a/doc/7-systems/virtual-boy.md +++ b/doc/7-systems/virtual-boy.md @@ -51,6 +51,14 @@ additionally, channel 5 offers a modulation/sweep unit. the former is similar to this chip uses the [Virtual Boy](../4-instrument/virtual-boy.md) instrument editor. +## channel status + +the following icons are displayed when channel status is enabled in the pattern view: + +- ![envelope off](status-VBoy-env-none.png) hardware envelope is disabled or running OK +- ![envelope warning](status-VBoy-env-warn.png) hardware envelope has finished - attempting to write a new envelope won't work without phase reset! +- ![envelope error](status-VBoy-env-error.png) can't start hardware envelope - please reset phase + ## chip config the following options are available in the Chip Manager window: diff --git a/src/engine/dispatch.h b/src/engine/dispatch.h index bd720b597..c048ad918 100644 --- a/src/engine/dispatch.h +++ b/src/engine/dispatch.h @@ -564,6 +564,8 @@ struct DivChannelModeHints { // - 18: inc linear // - 19: inc bent // - 20: direct + // - 21: warning + // - 22: error unsigned char type[4]; // up to 4 unsigned char count; diff --git a/src/engine/platform/sound/vsu.cpp b/src/engine/platform/sound/vsu.cpp index 467c2c00e..af9dd6319 100644 --- a/src/engine/platform/sound/vsu.cpp +++ b/src/engine/platform/sound/vsu.cpp @@ -156,8 +156,9 @@ void VSU::Write(int timestamp, unsigned int A, unsigned char V) WavePos[ch] = 0; - if(ch == 5) // Not sure if this is correct. + if(ch == 5) { // Not sure if this is correct. lfsr = 1; + } EnvelopeModMask[ch] = 0; if(!(EnvControl[ch] & 0x200) && ( diff --git a/src/engine/platform/sound/vsu.h b/src/engine/platform/sound/vsu.h index 967e4f4b7..29b8acd4a 100644 --- a/src/engine/platform/sound/vsu.h +++ b/src/engine/platform/sound/vsu.h @@ -92,10 +92,12 @@ class VSU int EnvelopeClockDivider[6]; int SweepModClockDivider; + public: int EnvelopeModMask[6]; int ModState; int ModLock; +private: int NoiseLatcherClockDivider; unsigned int NoiseLatcher; diff --git a/src/engine/platform/vb.cpp b/src/engine/platform/vb.cpp index f8cdb7fba..ae75f0044 100644 --- a/src/engine/platform/vb.cpp +++ b/src/engine/platform/vb.cpp @@ -19,6 +19,8 @@ #include "vb.h" #include "../engine.h" +#include "IconsFontAwesome4.h" +#include "furIcons.h" #include //#define rWrite(a,v) pendingWrites[a]=v; @@ -252,6 +254,27 @@ void DivPlatformVB::tick(bool sysTick) { } } } + + for (int i=0; i<6; i++) { + if ((chan[i].envHigh&3)==0) { + chan[i].hasEnvWarning=0; + } else { + switch (vb->EnvelopeModMask[i]) { + case 0: // envelope OK + chan[i].hasEnvWarning=0; + break; + case 1: // envelope has finished + chan[i].hasEnvWarning=21; + break; + case 2: // can't envelope + chan[i].hasEnvWarning=22; + break; + } + } + } + /*if (vb->ModLock) { + chan[4].hasEnvWarning=4; + }*/ } int DivPlatformVB::dispatch(DivCommand c) { @@ -477,6 +500,16 @@ unsigned short DivPlatformVB::getPan(int ch) { return ((chan[ch].pan&0xf0)<<4)|(chan[ch].pan&15); } +DivChannelModeHints DivPlatformVB::getModeHints(int ch) { + DivChannelModeHints ret; + //if (ch>4) return ret; + ret.count=1; + ret.hint[0]=ICON_FA_EXCLAMATION_TRIANGLE; + ret.type[0]=chan[ch].hasEnvWarning; + + return ret; +} + DivDispatchOscBuffer* DivPlatformVB::getOscBuffer(int ch) { return oscBuf[ch]; } diff --git a/src/engine/platform/vb.h b/src/engine/platform/vb.h index f7dc6c422..1a95f39b5 100644 --- a/src/engine/platform/vb.h +++ b/src/engine/platform/vb.h @@ -30,6 +30,7 @@ class DivPlatformVB: public DivDispatch { int antiClickPeriodCount, antiClickWavePos; unsigned char pan, envLow, envHigh; bool noise, deferredWaveUpdate, intWritten; + unsigned char hasEnvWarning; signed short wave; DivWaveSynth ws; Channel(): @@ -42,6 +43,7 @@ class DivPlatformVB: public DivDispatch { noise(false), deferredWaveUpdate(false), intWritten(false), + hasEnvWarning(0), wave(-1) {} }; Channel chan[6]; @@ -78,6 +80,7 @@ class DivPlatformVB: public DivDispatch { void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); unsigned short getPan(int chan); + DivChannelModeHints getModeHints(int chan); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/gui/gui.h b/src/gui/gui.h index 81e4a8383..45975dd35 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -434,6 +434,8 @@ enum FurnaceGUIColors { GUI_COLOR_PATTERN_STATUS_INC, GUI_COLOR_PATTERN_STATUS_BENT, GUI_COLOR_PATTERN_STATUS_DIRECT, + GUI_COLOR_PATTERN_STATUS_WARNING, + GUI_COLOR_PATTERN_STATUS_ERROR, GUI_COLOR_PATTERN_PAIR, GUI_COLOR_SAMPLE_BG, diff --git a/src/gui/guiConst.cpp b/src/gui/guiConst.cpp index 40938b42d..fa9bb99e4 100644 --- a/src/gui/guiConst.cpp +++ b/src/gui/guiConst.cpp @@ -1134,6 +1134,8 @@ const FurnaceGUIColorDef guiColors[GUI_COLOR_MAX]={ D(GUI_COLOR_PATTERN_STATUS_INC,"",ImVec4(0.1f,0.1f,1.0f,1.0f)), D(GUI_COLOR_PATTERN_STATUS_BENT,"",ImVec4(1.0f,1.0f,0.1f,1.0f)), D(GUI_COLOR_PATTERN_STATUS_DIRECT,"",ImVec4(1.0f,0.5f,0.2f,1.0f)), + D(GUI_COLOR_PATTERN_STATUS_WARNING,"",ImVec4(0.98f,0.98f,0.06f,1.0f)), + D(GUI_COLOR_PATTERN_STATUS_ERROR,"",ImVec4(0.98f,0.06f,0.06f,1.0f)), D(GUI_COLOR_PATTERN_PAIR,"",ImVec4(0.6f,0.8f,1.0f,1.0f)), diff --git a/src/gui/pattern.cpp b/src/gui/pattern.cpp index c0bd230d0..5551bd284 100644 --- a/src/gui/pattern.cpp +++ b/src/gui/pattern.cpp @@ -1138,6 +1138,12 @@ void FurnaceGUI::drawPattern() { case 20: hintColor=uiColors[GUI_COLOR_PATTERN_STATUS_DIRECT]; break; + case 21: + hintColor=uiColors[GUI_COLOR_PATTERN_STATUS_WARNING]; + break; + case 22: + hintColor=uiColors[GUI_COLOR_PATTERN_STATUS_ERROR]; + break; default: hintColor=uiColors[GUI_COLOR_TEXT]; break; diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index 5835a2cb2..22d1f305d 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -4312,6 +4312,8 @@ void FurnaceGUI::drawSettings() { UI_COLOR_CONFIG(GUI_COLOR_PATTERN_STATUS_INC,_("Status: increase")); UI_COLOR_CONFIG(GUI_COLOR_PATTERN_STATUS_BENT,_("Status: bent")); UI_COLOR_CONFIG(GUI_COLOR_PATTERN_STATUS_DIRECT,_("Status: direct")); + UI_COLOR_CONFIG(GUI_COLOR_PATTERN_STATUS_WARNING,_("Status: warning")); + UI_COLOR_CONFIG(GUI_COLOR_PATTERN_STATUS_ERROR,_("Status: error")); ImGui::TreePop(); } if (ImGui::TreeNode(_("Sample Editor"))) {