diff --git a/src/engine/platform/powernoise.cpp b/src/engine/platform/powernoise.cpp index a45cb9bf1..77e128ddd 100644 --- a/src/engine/platform/powernoise.cpp +++ b/src/engine/platform/powernoise.cpp @@ -206,6 +206,7 @@ void DivPlatformPowerNoise::tick(bool sysTick) { if (chan[i].freqChanged || chan[i].keyOn || chan[i].keyOff) { chan[i].freq=parent->calcFreq(chan[i].baseFreq,chan[i].pitch,chan[i].fixedArp?chan[i].baseNoteOverride:chan[i].arpOff,chan[i].fixedArp,true,0,chan[i].pitch2,chipClock,CHIP_DIVIDER); + chan[i].freq>>=chan[i].octaveOff; if (chan[i].freq<0) chan[i].freq=0; if (chan[i].freq>0x7ffffff) chan[i].freq=0x7ffffff; @@ -268,6 +269,9 @@ int DivPlatformPowerNoise::dispatch(DivCommand c) { chan[c.chan].freqChanged=true; chan[c.chan].note=c.value; } + if (chan[c.chan].insChanged) { + chan[c.chan].octaveOff=ins->powernoise.octave; + } chan[c.chan].active=true; chan[c.chan].macroInit(ins); if (!parent->song.brokenOutVol && !chan[c.chan].std.vol.will) { diff --git a/src/engine/platform/powernoise.h b/src/engine/platform/powernoise.h index d59153fa0..72f1562e9 100644 --- a/src/engine/platform/powernoise.h +++ b/src/engine/platform/powernoise.h @@ -46,7 +46,7 @@ class DivPlatformPowerNoise: public DivDispatch { struct Channel: public SharedChannel { int fNum; unsigned short initLFSR; - unsigned char octave, pan, tapA, tapB; + unsigned char octave, pan, tapA, tapB, octaveOff; bool slope, am, tapBEnable, keyOn, keyOff; SlopePortion slopeA, slopeB; @@ -58,6 +58,7 @@ class DivPlatformPowerNoise: public DivDispatch { pan(255), tapA(1), tapB(2), + octaveOff(0), slope(false), am(false), tapBEnable(false), diff --git a/src/gui/insEdit.cpp b/src/gui/insEdit.cpp index 44444d50b..6f334868d 100644 --- a/src/gui/insEdit.cpp +++ b/src/gui/insEdit.cpp @@ -7295,6 +7295,18 @@ void FurnaceGUI::drawInsEdit() { drawMacros(macroList,macroEditStateMacros); ImGui::EndTabItem(); } + if (ins->type==DIV_INS_POWERNOISE) { + if (ImGui::BeginTabItem("PowerNoise")) { + int pnOctave=ins->powernoise.octave; + if (ImGui::InputInt("Octave offset",&pnOctave,1,4)) { PARAMETER + if (pnOctave<0) pnOctave=0; + if (pnOctave>15) pnOctave=15; + ins->powernoise.octave=pnOctave; + } + ImGui::Text("go to Macros for other parameters."); + ImGui::EndTabItem(); + } + } if (ins->type==DIV_INS_NES || ins->type==DIV_INS_AY || ins->type==DIV_INS_AY8930 ||