From 0ab9f6c6fd6979c352a073857b7f9d51f12b03d0 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 24 Aug 2024 17:41:41 -0500 Subject: [PATCH] more.... --- src/engine/engine.cpp | 8 +- src/engine/engine.h | 10 +- src/engine/platform/sound/snes/SPC_DSP.cpp | 15 +-- src/engine/song.cpp | 150 ++++++++------------- src/engine/song.h | 2 +- src/engine/wavOps.cpp | 83 +++++------- src/gui/gui.cpp | 120 +++++++---------- src/gui/gui.h | 14 +- 8 files changed, 163 insertions(+), 239 deletions(-) diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 18189a29b..077c1a026 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -203,11 +203,9 @@ void DivEngine::walkSong(int& loopOrder, int& loopRow, int& loopEnd) { } } -void DivEngine::findSongLength(int loopOrder, int loopRow, double fadeoutLen, int& rowsForFadeout, bool& hasFFxx, std::vector& orders, int& length) -{ - if (curSubSong!=NULL) - { - curSubSong->findLength(loopOrder, loopRow, fadeoutLen, rowsForFadeout, hasFFxx, orders, song.grooves, length, chans, song.jumpTreatment, song.ignoreJumpAtEnd); +void DivEngine::findSongLength(int loopOrder, int loopRow, double fadeoutLen, int& rowsForFadeout, bool& hasFFxx, std::vector& orders, int& length) { + if (curSubSong!=NULL) { + curSubSong->findLength(loopOrder,loopRow,fadeoutLen,rowsForFadeout,hasFFxx,orders,song.grooves,length,chans,song.jumpTreatment,song.ignoreJumpAtEnd); } } diff --git a/src/engine/engine.h b/src/engine/engine.h index 3e942e8a6..d2879d1a1 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -475,7 +475,7 @@ class DivEngine { int midiOutTimeRate; float midiVolExp; int softLockCount; - int subticks, ticks, curRow, curOrder, prevRow, prevOrder, remainingLoops, totalLoops, lastLoopPos, exportLoopCount, curExportChan /*for per-channel export progress*/, nextSpeed, elapsedBars, elapsedBeats, curSpeed; + int subticks, ticks, curRow, curOrder, prevRow, prevOrder, remainingLoops, totalLoops, lastLoopPos, exportLoopCount, curExportChan, nextSpeed, elapsedBars, elapsedBeats, curSpeed; size_t curSubSongIndex; size_t bufferPos; double divider; @@ -1015,19 +1015,19 @@ class DivEngine { // get how many loops is left void getLoopsLeft(int& loops); - //get how many loops in total export needs to do + // get how many loops in total export needs to do void getTotalLoops(int& loops); // get current position in song void getCurSongPos(int& row, int& order); - //get how many files export needs to create + // get how many files export needs to create void getTotalAudioFiles(int& files); - //get which file is processed right now (progress for e.g. per-channel export) + // get which file is processed right now (progress for e.g. per-channel export) void getCurFileIndex(int& file); - //get fadeout state + // get fadeout state bool getIsFadingOut(); // add instrument diff --git a/src/engine/platform/sound/snes/SPC_DSP.cpp b/src/engine/platform/sound/snes/SPC_DSP.cpp index 25cddd884..1fa7dae7d 100644 --- a/src/engine/platform/sound/snes/SPC_DSP.cpp +++ b/src/engine/platform/sound/snes/SPC_DSP.cpp @@ -135,19 +135,12 @@ static short const gauss [512] = 1299,1300,1300,1301,1302,1302,1303,1303,1303,1304,1304,1304,1304,1304,1305,1305, }; -void SPC_DSP::setupInterpolation(bool interpolate) -{ - for(int i = 0; i < voice_count; i++) - { - m.voices[i].interpolate = interpolate; - } -} +void SPC_DSP::setupInterpolation(bool interpolate){for(int i=0;iinterpolate) - { + if (v->interpolate) { int offset = v->interp_pos >> 4 & 0xFF; short const* fwd = gauss + 255 - offset; short const* rev = gauss + offset; // mirror left half of gaussian @@ -163,9 +156,7 @@ inline int SPC_DSP::interpolate( voice_t const* v ) CLAMP16( out ); out &= ~1; return out; - } - else - { + } else { return v->buf [(v->interp_pos >> 12) + v->buf_pos]; //Furnace addition -- no interpolation } } diff --git a/src/engine/song.cpp b/src/engine/song.cpp index e4c516b6e..6a204c3db 100644 --- a/src/engine/song.cpp +++ b/src/engine/song.cpp @@ -102,9 +102,8 @@ bool DivSubSong::walk(int& loopOrder, int& loopRow, int& loopEnd, int chans, int return false; } -double calcRowLenInSeconds(const DivGroovePattern& speeds, float hz, int vN, int vD, int timeBaseFromSong) -{ - double hl=1; //count for 1 row +double calcRowLenInSeconds(const DivGroovePattern& speeds, float hz, int vN, int vD, int timeBaseFromSong) { + double hl=1; //count for 1 row if (hl<=0.0) hl=4.0; double timeBase=timeBaseFromSong+1; double speedSum=0; @@ -115,25 +114,23 @@ double calcRowLenInSeconds(const DivGroovePattern& speeds, float hz, int vN, int if (timeBase<1.0) timeBase=1.0; if (speedSum<1.0) speedSum=1.0; if (vD<1) vD=1; - //return (60.0 * hz / (timeBase * hl * speedSum)) * (double)vN / (double)vD; - return 1.0 / ((60.0*hz/(timeBase*hl*speedSum))*(double)vN/(double)vD / 60.0); + return 1.0/((60.0*hz/(timeBase*hl*speedSum))*(double)vN/(double)vD/60.0); } -void DivSubSong::findLength(int loopOrder, int loopRow, double fadeoutLen, int& rowsForFadeout, bool& hasFFxx, std::vector& orders_vec, std::vector& grooves, int& length, int chans, int jumpTreatment, int ignoreJumpAtEnd, int firstPat) -{ - length = 0; - hasFFxx = false; - rowsForFadeout = 0; +void DivSubSong::findLength(int loopOrder, int loopRow, double fadeoutLen, int& rowsForFadeout, bool& hasFFxx, std::vector& orders_vec, std::vector& grooves, int& length, int chans, int jumpTreatment, int ignoreJumpAtEnd, int firstPat) { + length=0; + hasFFxx=false; + rowsForFadeout=0; - float secondsPerThisRow = 0.0f; + float secondsPerThisRow=0.0f; - DivGroovePattern curSpeeds = speeds; //simulate that we are playing the song, track all speed/BPM/tempo/engine rate changes - short curVirtualTempoN = virtualTempoN; - short curVirtualTempoD = virtualTempoD; - float curHz = hz; - double curDivider = (double)timeBase; + DivGroovePattern curSpeeds=speeds; //simulate that we are playing the song, track all speed/BPM/tempo/engine rate changes + short curVirtualTempoN=virtualTempoN; + short curVirtualTempoD=virtualTempoD; + float curHz=hz; + double curDivider=(double)timeBase; - double curLen = 0.0; //how many seconds passed since the start of song + double curLen=0.0; //how many seconds passed since the start of song int nextOrder=-1; int nextRow=0; @@ -145,49 +142,39 @@ void DivSubSong::findLength(int loopOrder, int loopRow, double fadeoutLen, int& if (firstPat>0) { memset(wsWalked,255,32*firstPat); } - for (int i=firstPat; ilastSuspectedLoopEnd) - { + if (i>lastSuspectedLoopEnd) { lastSuspectedLoopEnd=i; } - for (int j=nextRow; j>3))&8191]&(1<<(j&7))) - { + if (wsWalked[((i<<5)+(j>>3))&8191]&(1<<(j&7))) { return; } - for (int k=0; kdata[j][5+(l<<1)]; if (effectVal<0) effectVal=0; - if (subPat[k]->data[j][4+(l<<1)]==0xff) - { - hasFFxx = true; + if (subPat[k]->data[j][4+(l<<1)]==0xff) { + hasFFxx=true; - //FFxx makes YOU SHALL NOT PASS!!! move - orders_vec.push_back(j + 1); //order len - length += j + 1; //add length of order to song length + // FFxx makes YOU SHALL NOT PASS!!! move + orders_vec.push_back(j+1); // order len + length+=j+1; // add length of order to song length return; } - switch(subPat[k]->data[j][4+(l<<1)]) //track speed/BMP/Hz/tempo changes - { - case 0x09: // select groove pattern/speed 1 - { + switch (subPat[k]->data[j][4+(l<<1)]) { + case 0x09: { // select groove pattern/speed 1 if (grooves.empty()) { if (effectVal>0) curSpeeds.val[0]=effectVal; } else { @@ -198,8 +185,7 @@ void DivSubSong::findLength(int loopOrder, int loopRow, double fadeoutLen, int& } break; } - case 0x0f: // speed 1/speed 2 - { + case 0x0f: { // speed 1/speed 2 if (curSpeeds.len==2 && grooves.empty()) { if (effectVal>0) curSpeeds.val[1]=effectVal; } else { @@ -207,68 +193,47 @@ void DivSubSong::findLength(int loopOrder, int loopRow, double fadeoutLen, int& } break; } - case 0xfd: // virtual tempo num - { + case 0xfd: { // virtual tempo num if (effectVal>0) curVirtualTempoN=effectVal; break; } - case 0xfe: // virtual tempo den - { + case 0xfe: { // virtual tempo den if (effectVal>0) curVirtualTempoD=effectVal; break; } - case 0xf0: // set Hz by tempo (set bpm) - { + case 0xf0: { // set Hz by tempo (set bpm) curDivider=(double)effectVal*2.0/5.0; if (curDivider<1) curDivider=1; - //cycles=got.rate*pow(2,MASTER_CLOCK_PREC)/divider; - //clockDrift=0; - //subticks=0; break; } - default: break; } - if (subPat[k]->data[j][4+(l<<1)]==0x0d) - { - if (jumpTreatment==2) - { - if ((idata[j][4+(l<<1)]==0x0d) { + if (jumpTreatment==2) { + if ((idata[j][4+(l<<1)]==0x0b) - { - if (nextOrder==-1 || jumpTreatment==0) - { + } else if (subPat[k]->data[j][4+(l<<1)]==0x0b) { + if (nextOrder==-1 || jumpTreatment==0) { nextOrder=effectVal; - if (jumpTreatment==1 || jumpTreatment==2 || !jumpingOrder) - { + if (jumpTreatment==1 || jumpTreatment==2 || !jumpingOrder) { nextRow=0; } changingOrder=true; @@ -277,32 +242,29 @@ void DivSubSong::findLength(int loopOrder, int loopRow, double fadeoutLen, int& } } - if(i > loopOrder || (i == loopOrder && j > loopRow)) - { - if(curLen <= fadeoutLen && fadeoutLen > 0.0) //we count each row fadeout lasts. When our time is greater than fadeout length we successfully counted the number of fadeout rows - { - secondsPerThisRow = calcRowLenInSeconds(speeds, curHz, curVirtualTempoN, curVirtualTempoD, curDivider); - curLen += secondsPerThisRow; + if (i>loopOrder || (i==loopOrder && j>loopRow)) { + // we count each row fadeout lasts. When our time is greater than fadeout length we successfully counted the number of fadeout rows + if (curLen<=fadeoutLen && fadeoutLen>0.0) { + secondsPerThisRow=calcRowLenInSeconds(speeds,curHz,curVirtualTempoN,curVirtualTempoD,curDivider); + curLen+=secondsPerThisRow; rowsForFadeout++; } } wsWalked[((i<<5)+(j>>3))&8191]|=1<<(j&7); - if (nextOrder!=-1) - { + if (nextOrder!=-1) { i=nextOrder-1; - orders_vec.push_back(j + 1); //order len - length += j + 1; //add length of order to song length - jumped = true; + orders_vec.push_back(j+1); // order len + length+=j+1; // add length of order to song length + jumped=true; nextOrder=-1; break; } } - if(!jumped) //if no jump occured we add full pattern length - { - orders_vec.push_back(patLen); //order len - length += patLen; //add length of order to song length + if (!jumped) { // if no jump occured we add full pattern length + orders_vec.push_back(patLen); // order len + length+=patLen; // add length of order to song length } } } diff --git a/src/engine/song.h b/src/engine/song.h index 75b86ec71..0202a7ed7 100644 --- a/src/engine/song.h +++ b/src/engine/song.h @@ -186,7 +186,7 @@ struct DivSubSong { bool walk(int& loopOrder, int& loopRow, int& loopEnd, int chans, int jumpTreatment, int ignoreJumpAtEnd, int firstPat=0); /** - * find song length in rows (up to specified loop point). Also find length of every row + * find song length in rows (up to specified loop point). */ void findLength(int loopOrder, int loopRow, double fadeoutLen, int& rowsForFadeout, bool& hasFFxx, std::vector& orders, std::vector& grooves, int& length, int chans, int jumpTreatment, int ignoreJumpAtEnd, int firstPat=0); diff --git a/src/engine/wavOps.cpp b/src/engine/wavOps.cpp index f1e8de315..f87b60a44 100644 --- a/src/engine/wavOps.cpp +++ b/src/engine/wavOps.cpp @@ -33,79 +33,70 @@ bool DivEngine::isExporting() { return exporting; } -void DivEngine::getLoopsLeft(int& loops) { - if(totalLoops < 0 || exportLoopCount == 0) - { - loops = 0; +void DivEngine::getLoopsLeft(int &loops) { + if (totalLoops<0 || exportLoopCount==0) { + loops=0; return; } - loops = exportLoopCount - 1 - totalLoops; + loops=exportLoopCount-1-totalLoops; } -void DivEngine::getTotalLoops(int& loops) { - loops = exportLoopCount - 1; +void DivEngine::getTotalLoops(int &loops) { + loops=exportLoopCount-1; } -void DivEngine::getCurSongPos(int& row, int& order) { - row = curRow; - order = curOrder; +void DivEngine::getCurSongPos(int &row, int &order) { + row=curRow; + order=curOrder; } -void DivEngine::getTotalAudioFiles(int& files) -{ - files = 0; +void DivEngine::getTotalAudioFiles(int &files) { + files=0; - switch(exportMode) - { - case DIV_EXPORT_MODE_ONE: - { - files = 1; + switch (exportMode) { + case DIV_EXPORT_MODE_ONE: { + files=1; break; } - case DIV_EXPORT_MODE_MANY_SYS: - { - files = 1; //there actually are several files but they are processed in the same loop, so to correctly draw progress we think of them as one file + case DIV_EXPORT_MODE_MANY_SYS: { + files=1; // there actually are several files but they are processed in the same loop, so to correctly draw progress we think of them as one file break; } - case DIV_EXPORT_MODE_MANY_CHAN: - { - for(int i = 0; i < chans; i++) - { - if (exportChannelMask[i]) files++; + case DIV_EXPORT_MODE_MANY_CHAN: { + for (int i=0; iwalkSong(loopOrder,loopRow,loopEnd); - e->findSongLength(loopOrder, loopRow, audioExportOptions.fadeOut, songFadeoutSectionLength, songHasSongEndCommand, songOrdersLengths, songLength); //for progress estimation + e->findSongLength(loopOrder,loopRow,audioExportOptions.fadeOut,songFadeoutSectionLength,songHasSongEndCommand,songOrdersLengths,songLength); // for progress estimation - songLoopedSectionLength = songLength; - for(int i = 0; i < loopOrder; i++) - { - songLoopedSectionLength -= songOrdersLengths[i]; + songLoopedSectionLength=songLength; + for (int i=0; isaveAudio(path.c_str(),audioExportOptions); - totalFiles = 0; + totalFiles=0; e->getTotalAudioFiles(totalFiles); - int totalLoops = 0; + int totalLoops=0; - lengthOfOneFile = songLength; + lengthOfOneFile=songLength; - if(!songHasSongEndCommand) - { + if (!songHasSongEndCommand) { e->getTotalLoops(totalLoops); - lengthOfOneFile += songLoopedSectionLength * totalLoops; - lengthOfOneFile += songFadeoutSectionLength; //account for fadeout + lengthOfOneFile+=songLoopedSectionLength*totalLoops; + lengthOfOneFile+=songFadeoutSectionLength; // account for fadeout } - totalLength = lengthOfOneFile * totalFiles; + totalLength=lengthOfOneFile*totalFiles; - curProgress = 0.0f; + curProgress=0.0f; displayExporting=true; } @@ -5861,69 +5859,53 @@ bool FurnaceGUI::loop() { MEASURE_BEGIN(popup); centerNextWindow(_("Rendering..."),canvasW,canvasH); - if (ImGui::BeginPopupModal(_("Rendering..."),NULL,ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove)) { + if (ImGui::BeginPopupModal(_("Rendering..."),NULL,ImGuiWindowFlags_NoResize|ImGuiWindowFlags_NoMove)) { + // WHAT the HELL?! WAKE_UP; - if(audioExportOptions.mode != DIV_EXPORT_MODE_MANY_CHAN) - { + if (audioExportOptions.mode!=DIV_EXPORT_MODE_MANY_CHAN) { ImGui::Text(_("Please wait...")); } - float* progressLambda = &curProgress; - int curPosInRows = 0; - int* curPosInRowsLambda = &curPosInRows; - int loopsLeft = 0; - int* loopsLeftLambda = &loopsLeft; - int totalLoops = 0; - int* totalLoopsLambda = &totalLoops; - int curFile = 0; - int* curFileLambda = &curFile; - if(e->isExporting()) - { - e->lockEngine([this, progressLambda, curPosInRowsLambda, curFileLambda, loopsLeftLambda, totalLoopsLambda]() - { - int curRow = 0; - int curOrder = 0; - e->getCurSongPos(curRow, curOrder); - *curFileLambda = 0; - e->getCurFileIndex(*curFileLambda); + float* progressLambda=&curProgress; + int curPosInRows=0; + int* curPosInRowsLambda=&curPosInRows; + int loopsLeft=0; + int* loopsLeftLambda=&loopsLeft; + int totalLoops=0; + int* totalLoopsLambda=&totalLoops; + int curFile=0; + int* curFileLambda=&curFile; + if (e->isExporting()) { + e->lockEngine([this, progressLambda, curPosInRowsLambda, curFileLambda, + loopsLeftLambda, totalLoopsLambda] () { + int curRow=0; int curOrder=0; + e->getCurSongPos(curRow, curOrder); *curFileLambda=0; + e->getCurFileIndex(*curFileLambda); + *curPosInRowsLambda=curRow; for (int i=0; igetLoopsLeft(*loopsLeftLambda); - e->getTotalLoops(*totalLoopsLambda); - - if((*totalLoopsLambda) != (*loopsLeftLambda)) //we are going 2nd, 3rd, etc. time through the song - { - *curPosInRowsLambda -= (songLength - songLoopedSectionLength); //a hack so progress bar does not jump? - } - if(e->getIsFadingOut()) //we are in fadeout??? why it works like that bruh - { - *curPosInRowsLambda -= (songLength - songLoopedSectionLength); //a hack so progress bar does not jump? - } - } - - *progressLambda = (float)((*curPosInRowsLambda) + - ((*totalLoopsLambda) - (*loopsLeftLambda)) * songLength + - lengthOfOneFile * (*curFileLambda)) - / (float)totalLength; - }); + if (!songHasSongEndCommand) { + e->getLoopsLeft(*loopsLeftLambda); e->getTotalLoops(*totalLoopsLambda); if ((*totalLoopsLambda)!=(*loopsLeftLambda)) //we are going 2nd, 3rd, etc. time through the song + { + *curPosInRowsLambda-=(songLength-songLoopedSectionLength); //a hack so progress bar does not jump? + } + if (e->getIsFadingOut()) //we are in fadeout??? why it works like that bruh + { + // LIVE WITH IT damn it + *curPosInRowsLambda-=(songLength-songLoopedSectionLength); //a hack so progress bar does not jump? + } + } + // this horrible indentation courtesy of `indent` + *progressLambda=(float) ((*curPosInRowsLambda) + ((*totalLoopsLambda)- (*loopsLeftLambda)) * songLength + lengthOfOneFile * (*curFileLambda)) / (float) totalLength;}); } - ImGui::Text(_("Row %d of %d"), curPosInRows + - ((totalLoops) - (loopsLeft)) * songLength, lengthOfOneFile); + ImGui::Text(_("Row %d of %d"),curPosInRows+((totalLoops)-(loopsLeft))*songLength,lengthOfOneFile); - if(audioExportOptions.mode == DIV_EXPORT_MODE_MANY_CHAN) - { - ImGui::Text(_("Channel %d of %d"), curFile + 1, totalFiles); + if (audioExportOptions.mode==DIV_EXPORT_MODE_MANY_CHAN) { + ImGui::Text(_("Channel %d of %d"),curFile+1,totalFiles); } - ImGui::ProgressBar(curProgress,ImVec2(320.0f*dpiScale,0), fmt::sprintf("%.2f%%", curProgress * 100.0f).c_str()); + ImGui::ProgressBar(curProgress,ImVec2(320.0f*dpiScale,0),fmt::sprintf("%.2f%%",curProgress*100.0f).c_str()); if (ImGui::Button(_("Abort"))) { if (e->haltAudioFile()) { diff --git a/src/gui/gui.h b/src/gui/gui.h index 1cdfb4f3f..4246a1982 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1723,13 +1723,13 @@ class FurnaceGUI { char emptyLabel[32]; char emptyLabel2[32]; - std::vector songOrdersLengths; //lengths of all orders (for drawing song export progress) - int songLength; //length of all the song in rows - int songLoopedSectionLength; //length of looped part of the song - int songFadeoutSectionLength; //length of fading part of the song - bool songHasSongEndCommand; //song has "Song end" command (FFxx) - int lengthOfOneFile; //length of one rendering pass. song length times num of loops + fadeout - int totalLength; //total length of render (lengthOfOneFile times num of files for per-channel export) + std::vector songOrdersLengths; // lengths of all orders (for drawing song export progress) + int songLength; // length of all the song in rows + int songLoopedSectionLength; // length of looped part of the song + int songFadeoutSectionLength; // length of fading part of the song + bool songHasSongEndCommand; // song has "Song end" command (FFxx) + int lengthOfOneFile; // length of one rendering pass. song length times num of loops + fadeout + int totalLength; // total length of render (lengthOfOneFile times num of files for per-channel export) float curProgress; int totalFiles;