From 2fcb47454447664de99c4d3a6e9c1b2947f74dfc Mon Sep 17 00:00:00 2001 From: tildearrow Date: Thu, 13 Jan 2022 01:03:57 -0500 Subject: [PATCH] stuff implement two systems and system vol/pan --- src/engine/dispatchContainer.cpp | 2 ++ src/engine/engine.cpp | 14 +++++------ src/engine/playback.cpp | 19 +++++++++++---- src/engine/song.h | 5 +++- src/gui/gui.cpp | 42 ++++++++++++++++++++++++++++++++ src/gui/gui.h | 5 +++- 6 files changed, 72 insertions(+), 15 deletions(-) diff --git a/src/engine/dispatchContainer.cpp b/src/engine/dispatchContainer.cpp index dff2019bd..d5a820d36 100644 --- a/src/engine/dispatchContainer.cpp +++ b/src/engine/dispatchContainer.cpp @@ -75,6 +75,7 @@ void DivDispatchContainer::init(DivSystem sys, DivEngine* eng, int chanCount, do switch (sys) { case DIV_SYSTEM_GENESIS: + case DIV_SYSTEM_YM2612: dispatch=new DivPlatformGenesis; break; case DIV_SYSTEM_GENESIS_EXT: @@ -101,6 +102,7 @@ void DivDispatchContainer::init(DivSystem sys, DivEngine* eng, int chanCount, do ((DivPlatformC64*)dispatch)->setChipModel(false); break; case DIV_SYSTEM_ARCADE: + case DIV_SYSTEM_YM2151: dispatch=new DivPlatformArcade; ((DivPlatformArcade*)dispatch)->setYMFM(true); break; diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 71397c6e6..96da3c293 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -1080,11 +1080,11 @@ bool DivEngine::loadFur(unsigned char* file, size_t len) { } if (tchans>DIV_MAX_CHANS) tchans=DIV_MAX_CHANS; - // system volume, skipped for now - for (int i=0; i<32; i++) reader.readC(); + // system volume + for (int i=0; i<32; i++) ds.systemVol[i]=reader.readC(); - // system panning, skipped for now - for (int i=0; i<32; i++) reader.readC(); + // system panning + for (int i=0; i<32; i++) ds.systemPan[i]=reader.readC(); // system props, skipped for now for (int i=0; i<32; i++) reader.readI(); @@ -1517,13 +1517,11 @@ SafeWriter* DivEngine::saveFur() { } for (int i=0; i<32; i++) { - // for now - w->writeC(64); + w->writeC(song.systemVol[i]); } for (int i=0; i<32; i++) { - // for now - w->writeC(0); + w->writeC(song.systemPan[i]); } for (int i=0; i<32; i++) { diff --git a/src/engine/playback.cpp b/src/engine/playback.cpp index 85337d4de..623a8e662 100644 --- a/src/engine/playback.cpp +++ b/src/engine/playback.cpp @@ -101,6 +101,7 @@ bool DivEngine::perSystemEffect(int ch, unsigned char effect, unsigned char effe switch (sysOfChan[ch]) { case DIV_SYSTEM_GENESIS: case DIV_SYSTEM_GENESIS_EXT: + case DIV_SYSTEM_YM2612: switch (effect) { case 0x17: // DAC enable dispatchCmd(DivCommand(DIV_CMD_SAMPLE_MODE,ch,(effectVal>0))); @@ -179,12 +180,14 @@ bool DivEngine::perSystemPostEffect(int ch, unsigned char effect, unsigned char switch (sysOfChan[ch]) { case DIV_SYSTEM_GENESIS: case DIV_SYSTEM_GENESIS_EXT: + case DIV_SYSTEM_YM2612: case DIV_SYSTEM_ARCADE: + case DIV_SYSTEM_YM2151: case DIV_SYSTEM_YM2610: case DIV_SYSTEM_YM2610_EXT: switch (effect) { case 0x10: // LFO or noise mode - if (sysOfChan[ch]==DIV_SYSTEM_ARCADE) { + if (sysOfChan[ch]==DIV_SYSTEM_ARCADE || sysOfChan[ch]==DIV_SYSTEM_YM2151) { dispatchCmd(DivCommand(DIV_CMD_STD_NOISE_FREQ,ch,effectVal)); } else { dispatchCmd(DivCommand(DIV_CMD_FM_LFO,ch,effectVal)); @@ -211,12 +214,12 @@ bool DivEngine::perSystemPostEffect(int ch, unsigned char effect, unsigned char } break; case 0x17: // arcade LFO - if (sysOfChan[ch]==DIV_SYSTEM_ARCADE) { + if (sysOfChan[ch]==DIV_SYSTEM_ARCADE || sysOfChan[ch]==DIV_SYSTEM_YM2151) { dispatchCmd(DivCommand(DIV_CMD_FM_LFO,ch,effectVal)); } break; case 0x18: // EXT or LFO waveform - if (sysOfChan[ch]==DIV_SYSTEM_ARCADE) { + if (sysOfChan[ch]==DIV_SYSTEM_ARCADE || sysOfChan[ch]==DIV_SYSTEM_YM2151) { dispatchCmd(DivCommand(DIV_CMD_FM_LFO_WAVE,ch,effectVal)); } else { dispatchCmd(DivCommand(DIV_CMD_FM_EXTCH,ch,effectVal)); @@ -238,7 +241,7 @@ bool DivEngine::perSystemPostEffect(int ch, unsigned char effect, unsigned char dispatchCmd(DivCommand(DIV_CMD_FM_AR,ch,3,effectVal&31)); break; case 0x20: // PCM frequency or Neo Geo PSG mode - if (sysOfChan[ch]==DIV_SYSTEM_ARCADE) { + if (sysOfChan[ch]==DIV_SYSTEM_ARCADE || sysOfChan[ch]==DIV_SYSTEM_YM2151) { dispatchCmd(DivCommand(DIV_CMD_SAMPLE_FREQ,ch,effectVal)); } else if (sysOfChan[ch]==DIV_SYSTEM_YM2610 || sysOfChan[ch]==DIV_SYSTEM_YM2610_EXT) { dispatchCmd(DivCommand(DIV_CMD_STD_NOISE_MODE,ch,effectVal)); @@ -540,7 +543,7 @@ void DivEngine::processRow(int i, bool afterDelay) { break; case 0xe5: // pitch chan[i].pitch=effectVal-0x80; - if (sysOfChan[i]==DIV_SYSTEM_ARCADE) { // arcade pitch oddity + if (sysOfChan[i]==DIV_SYSTEM_ARCADE || sysOfChan[i]==DIV_SYSTEM_YM2151) { // YM2151 pitch oddity chan[i].pitch*=2; if (chan[i].pitch<-128) chan[i].pitch=-128; if (chan[i].pitch>127) chan[i].pitch=127; @@ -967,6 +970,12 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi out[1][j]+=(float)disCont[i].bbOut[0][j]/16384.0; } } + float volL=((float)song.systemVol[i]/64.0f)*((float)MIN(127,127-(int)song.systemPan[i])/127.0f); + float volR=((float)song.systemVol[i]/64.0f)*((float)MIN(127,127+(int)song.systemPan[i])/127.0f); + for (size_t j=0; jsong.systemLen; i++) { + snprintf(id,31,"MixS%d",i); + bool doInvert=e->song.systemVol[i]&128; + signed char vol=e->song.systemVol[i]&127; + ImGui::PushID(id); + if (ImGui::SliderScalar("##Volume",ImGuiDataType_S8,&vol,&_ZERO,&_ONE_HUNDRED_TWENTY_SEVEN)) { + e->song.systemVol[i]=(e->song.systemVol[i]&128)|vol; + } + ImGui::NextColumn(); + ImGui::SliderScalar("##Panning",ImGuiDataType_S8,&e->song.systemPan[i],&_MINUS_ONE_HUNDRED_TWENTY_SEVEN,&_ONE_HUNDRED_TWENTY_SEVEN); + ImGui::NextColumn(); + if (ImGui::Checkbox("Invert",&doInvert)) { + e->song.systemVol[i]^=128; + } + ImGui::NextColumn(); + ImGui::PopID(); + } + } + ImGui::End(); +} + void FurnaceGUI::drawPattern() { if (!patternOpen) return; if (e->isPlaying() && followPattern) cursor.y=oldRow; @@ -2866,6 +2893,12 @@ bool FurnaceGUI::loop() { sysAddOption(DIV_SYSTEM_ARCADE); sysAddOption(DIV_SYSTEM_YM2610); sysAddOption(DIV_SYSTEM_YM2610_EXT); + sysAddOption(DIV_SYSTEM_AY8910); + sysAddOption(DIV_SYSTEM_AMIGA); + sysAddOption(DIV_SYSTEM_YM2151); + sysAddOption(DIV_SYSTEM_YM2612); + sysAddOption(DIV_SYSTEM_TIA); + sysAddOption(DIV_SYSTEM_SAA1099); ImGui::EndMenu(); } if (ImGui::BeginMenu("change platform...")) { @@ -2882,6 +2915,12 @@ bool FurnaceGUI::loop() { sysChangeOption(i,DIV_SYSTEM_ARCADE); sysChangeOption(i,DIV_SYSTEM_YM2610); sysChangeOption(i,DIV_SYSTEM_YM2610_EXT); + sysChangeOption(i,DIV_SYSTEM_AY8910); + sysChangeOption(i,DIV_SYSTEM_AMIGA); + sysChangeOption(i,DIV_SYSTEM_YM2151); + sysChangeOption(i,DIV_SYSTEM_YM2612); + sysChangeOption(i,DIV_SYSTEM_TIA); + sysChangeOption(i,DIV_SYSTEM_SAA1099); ImGui::EndMenu(); } } @@ -2940,6 +2979,7 @@ bool FurnaceGUI::loop() { if (ImGui::MenuItem("sample editor")) sampleEditOpen=!sampleEditOpen; if (ImGui::MenuItem("orders")) ordersOpen=!ordersOpen; if (ImGui::MenuItem("pattern")) patternOpen=!patternOpen; + if (ImGui::MenuItem("mixer")) mixerOpen=!mixerOpen; ImGui::EndMenu(); } if (ImGui::BeginMenu("help")) { @@ -2974,6 +3014,7 @@ bool FurnaceGUI::loop() { drawWaveEdit(); drawSampleList(); drawSampleEdit(); + drawMixer(); drawPattern(); drawSettings(); @@ -3289,6 +3330,7 @@ FurnaceGUI::FurnaceGUI(): sampleEditOpen(false), aboutOpen(false), settingsOpen(false), + mixerOpen(false), selecting(false), curNibble(false), extraChannelButtons(false), diff --git a/src/gui/gui.h b/src/gui/gui.h index 6768bfe6a..52ac97c80 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -67,7 +67,8 @@ enum FurnaceGUIWindows { GUI_WINDOW_WAVE_LIST, GUI_WINDOW_WAVE_EDIT, GUI_WINDOW_SAMPLE_LIST, - GUI_WINDOW_SAMPLE_EDIT + GUI_WINDOW_SAMPLE_EDIT, + GUI_WINDOW_MIXER }; enum FurnaceGUIFileDialogs { @@ -168,6 +169,7 @@ class FurnaceGUI { int curIns, curWave, curSample, curOctave, oldRow, oldOrder, oldOrder1, editStep; bool editControlsOpen, ordersOpen, insListOpen, songInfoOpen, patternOpen, insEditOpen; bool waveListOpen, waveEditOpen, sampleListOpen, sampleEditOpen, aboutOpen, settingsOpen; + bool mixerOpen; SelectionPoint selStart, selEnd, cursor; bool selecting, curNibble, extraChannelButtons, followOrders, followPattern, changeAllOrders; FurnaceGUIWindows curWindow; @@ -224,6 +226,7 @@ class FurnaceGUI { void drawWaveEdit(); void drawSampleList(); void drawSampleEdit(); + void drawMixer(); void drawAbout(); void drawSettings();