GUI: implement channel volume bar

This commit is contained in:
tildearrow 2022-09-20 02:32:23 -05:00
parent 1a84812a1d
commit e1890173b2
9 changed files with 108 additions and 8 deletions

View file

@ -69,6 +69,39 @@ float FurnaceGUI::computeGradPos(int type, int chan) {
return 0.0f;
}
void FurnaceGUI::calcChanOsc() {
std::vector<DivDispatchOscBuffer*> oscBufs;
std::vector<ChanOscStatus*> oscFFTs;
std::vector<int> oscChans;
int chans=e->getTotalChannelCount();
for (int i=0; i<chans; i++) {
DivDispatchOscBuffer* buf=e->getOscBuffer(i);
if (buf!=NULL && e->curSubSong->chanShow[i]) {
// 30ms should be enough
int displaySize=(float)(buf->rate)*0.03f;
if (e->isRunning()) {
float minLevel=1.0f;
float maxLevel=-1.0f;
unsigned short needlePos=buf->needle;
needlePos-=displaySize;
for (unsigned short i=0; i<512; i++) {
float y=(float)buf->data[(unsigned short)(needlePos+(i*displaySize/512))]/65536.0f;
if (minLevel>y) minLevel=y;
if (maxLevel<y) maxLevel=y;
}
float estimate=pow(maxLevel-minLevel,0.5f);
if (estimate>1.0f) estimate=1.0f;
chanOscVol[i]=MAX(chanOscVol[i]*0.87f,estimate);
}
} else {
chanOscVol[i]=MAX(chanOscVol[i]*0.87f,0.0f);
}
if (chanOscVol[i]<0.00001f) chanOscVol[i]=0.0f;
}
}
void FurnaceGUI::drawChanOsc() {
if (nextWindow==GUI_WINDOW_CHAN_OSC) {
chanOscOpen=true;
@ -361,7 +394,6 @@ void FurnaceGUI::drawChanOsc() {
if (maxLevel<y) maxLevel=y;
}
dcOff=(minLevel+maxLevel)*0.5f;
chanOscVol[ch]=MAX(chanOscVol[ch]*0.87f,maxLevel-minLevel);
for (unsigned short i=0; i<512; i++) {
float x=(float)i/512.0f;
float y=(float)buf->data[(unsigned short)(needlePos+(i*displaySize/512))]/65536.0f;