GUI: add signed waveform view mode
This commit is contained in:
parent
fc14211997
commit
09233b6de0
|
@ -228,7 +228,7 @@ void FurnaceGUI::encodeMMLStr(String& target, int* macro, int macroLen, int macr
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FurnaceGUI::decodeMMLStrW(String& source, int* macro, int& macroLen, int macroMax, bool hex) {
|
void FurnaceGUI::decodeMMLStrW(String& source, int* macro, int& macroLen, int macroMin, int macroMax, bool hex) {
|
||||||
int buf=0;
|
int buf=0;
|
||||||
bool negaBuf=false;
|
bool negaBuf=false;
|
||||||
bool hasVal=false;
|
bool hasVal=false;
|
||||||
|
@ -264,9 +264,9 @@ void FurnaceGUI::decodeMMLStrW(String& source, int* macro, int& macroLen, int ma
|
||||||
case ' ':
|
case ' ':
|
||||||
if (hasVal) {
|
if (hasVal) {
|
||||||
hasVal=false;
|
hasVal=false;
|
||||||
negaBuf=false;
|
|
||||||
macro[macroLen]=negaBuf?-buf:buf;
|
macro[macroLen]=negaBuf?-buf:buf;
|
||||||
if (macro[macroLen]<0) macro[macroLen]=0;
|
negaBuf=false;
|
||||||
|
if (macro[macroLen]<macroMin) macro[macroLen]=macroMin;
|
||||||
if (macro[macroLen]>macroMax) macro[macroLen]=macroMax;
|
if (macro[macroLen]>macroMax) macro[macroLen]=macroMax;
|
||||||
macroLen++;
|
macroLen++;
|
||||||
buf=0;
|
buf=0;
|
||||||
|
@ -277,9 +277,9 @@ void FurnaceGUI::decodeMMLStrW(String& source, int* macro, int& macroLen, int ma
|
||||||
}
|
}
|
||||||
if (hasVal && macroLen<256) {
|
if (hasVal && macroLen<256) {
|
||||||
hasVal=false;
|
hasVal=false;
|
||||||
negaBuf=false;
|
|
||||||
macro[macroLen]=negaBuf?-buf:buf;
|
macro[macroLen]=negaBuf?-buf:buf;
|
||||||
if (macro[macroLen]<0) macro[macroLen]=0;
|
negaBuf=false;
|
||||||
|
if (macro[macroLen]<macroMin) macro[macroLen]=macroMin;
|
||||||
if (macro[macroLen]>macroMax) macro[macroLen]=macroMax;
|
if (macro[macroLen]>macroMax) macro[macroLen]=macroMax;
|
||||||
macroLen++;
|
macroLen++;
|
||||||
buf=0;
|
buf=0;
|
||||||
|
@ -4621,6 +4621,7 @@ bool FurnaceGUI::init() {
|
||||||
|
|
||||||
tempoView=e->getConfBool("tempoView",true);
|
tempoView=e->getConfBool("tempoView",true);
|
||||||
waveHex=e->getConfBool("waveHex",false);
|
waveHex=e->getConfBool("waveHex",false);
|
||||||
|
waveSigned=e->getConfBool("waveSigned",false);
|
||||||
waveGenVisible=e->getConfBool("waveGenVisible",false);
|
waveGenVisible=e->getConfBool("waveGenVisible",false);
|
||||||
waveEditStyle=e->getConfInt("waveEditStyle",0);
|
waveEditStyle=e->getConfInt("waveEditStyle",0);
|
||||||
lockLayout=e->getConfBool("lockLayout",false);
|
lockLayout=e->getConfBool("lockLayout",false);
|
||||||
|
@ -4906,6 +4907,7 @@ bool FurnaceGUI::finish() {
|
||||||
|
|
||||||
e->setConf("tempoView",tempoView);
|
e->setConf("tempoView",tempoView);
|
||||||
e->setConf("waveHex",waveHex);
|
e->setConf("waveHex",waveHex);
|
||||||
|
e->setConf("waveSigned",waveSigned);
|
||||||
e->setConf("waveGenVisible",waveGenVisible);
|
e->setConf("waveGenVisible",waveGenVisible);
|
||||||
e->setConf("waveEditStyle",waveEditStyle);
|
e->setConf("waveEditStyle",waveEditStyle);
|
||||||
e->setConf("lockLayout",lockLayout);
|
e->setConf("lockLayout",lockLayout);
|
||||||
|
@ -5112,6 +5114,7 @@ FurnaceGUI::FurnaceGUI():
|
||||||
firstFrame(true),
|
firstFrame(true),
|
||||||
tempoView(true),
|
tempoView(true),
|
||||||
waveHex(false),
|
waveHex(false),
|
||||||
|
waveSigned(false),
|
||||||
waveGenVisible(false),
|
waveGenVisible(false),
|
||||||
lockLayout(false),
|
lockLayout(false),
|
||||||
editOptsVisible(false),
|
editOptsVisible(false),
|
||||||
|
|
|
@ -1327,7 +1327,7 @@ class FurnaceGUI {
|
||||||
|
|
||||||
SelectionPoint selStart, selEnd, cursor, cursorDrag, dragStart, dragEnd;
|
SelectionPoint selStart, selEnd, cursor, cursorDrag, dragStart, dragEnd;
|
||||||
bool selecting, selectingFull, dragging, curNibble, orderNibble, followOrders, followPattern, changeAllOrders, mobileUI;
|
bool selecting, selectingFull, dragging, curNibble, orderNibble, followOrders, followPattern, changeAllOrders, mobileUI;
|
||||||
bool collapseWindow, demandScrollX, fancyPattern, wantPatName, firstFrame, tempoView, waveHex, waveGenVisible, lockLayout, editOptsVisible, latchNibble, nonLatchNibble;
|
bool collapseWindow, demandScrollX, fancyPattern, wantPatName, firstFrame, tempoView, waveHex, waveSigned, waveGenVisible, lockLayout, editOptsVisible, latchNibble, nonLatchNibble;
|
||||||
FurnaceGUIWindows curWindow, nextWindow, curWindowLast;
|
FurnaceGUIWindows curWindow, nextWindow, curWindowLast;
|
||||||
float peak[2];
|
float peak[2];
|
||||||
float patChanX[DIV_MAX_CHANS+1];
|
float patChanX[DIV_MAX_CHANS+1];
|
||||||
|
@ -1741,7 +1741,7 @@ class FurnaceGUI {
|
||||||
|
|
||||||
void encodeMMLStr(String& target, int* macro, int macroLen, int macroLoop, int macroRel, bool hex=false, bool bit30=false);
|
void encodeMMLStr(String& target, int* macro, int macroLen, int macroLoop, int macroRel, bool hex=false, bool bit30=false);
|
||||||
void decodeMMLStr(String& source, int* macro, unsigned char& macroLen, unsigned char& macroLoop, int macroMin, int macroMax, unsigned char& macroRel, bool bit30=false);
|
void decodeMMLStr(String& source, int* macro, unsigned char& macroLen, unsigned char& macroLoop, int macroMin, int macroMax, unsigned char& macroRel, bool bit30=false);
|
||||||
void decodeMMLStrW(String& source, int* macro, int& macroLen, int macroMax, bool hex=false);
|
void decodeMMLStrW(String& source, int* macro, int& macroLen, int macroMin, int macroMax, bool hex=false);
|
||||||
|
|
||||||
String encodeKeyMap(std::map<int,int>& map);
|
String encodeKeyMap(std::map<int,int>& map);
|
||||||
void decodeKeyMap(std::map<int,int>& map, String source);
|
void decodeKeyMap(std::map<int,int>& map, String source);
|
||||||
|
|
|
@ -255,6 +255,9 @@ void FurnaceGUI::drawWaveEdit() {
|
||||||
for (int i=0; i<wave->len; i++) {
|
for (int i=0; i<wave->len; i++) {
|
||||||
if (wave->data[i]>wave->max) wave->data[i]=wave->max;
|
if (wave->data[i]>wave->max) wave->data[i]=wave->max;
|
||||||
wavePreview[i]=wave->data[i];
|
wavePreview[i]=wave->data[i];
|
||||||
|
if (waveSigned && !waveHex) {
|
||||||
|
wavePreview[i]-=(int)((wave->max+1)/2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (wave->len>0) wavePreview[wave->len]=wave->data[wave->len-1];
|
if (wave->len>0) wavePreview[wave->len]=wave->data[wave->len-1];
|
||||||
|
|
||||||
|
@ -269,9 +272,9 @@ void FurnaceGUI::drawWaveEdit() {
|
||||||
ImVec2 contentRegion=ImGui::GetContentRegionAvail(); // wavetable graph size determined here
|
ImVec2 contentRegion=ImGui::GetContentRegionAvail(); // wavetable graph size determined here
|
||||||
contentRegion.y-=ImGui::GetFrameHeightWithSpacing()+ImGui::GetStyle().WindowPadding.y;
|
contentRegion.y-=ImGui::GetFrameHeightWithSpacing()+ImGui::GetStyle().WindowPadding.y;
|
||||||
if (waveEditStyle) {
|
if (waveEditStyle) {
|
||||||
PlotNoLerp("##Waveform",wavePreview,wave->len+1,0,NULL,0,wave->max,contentRegion);
|
PlotNoLerp("##Waveform",wavePreview,wave->len+1,0,NULL,(waveSigned && !waveHex)?(-(int)((wave->max+1)/2)):0,(waveSigned && !waveHex)?((int)(wave->max/2)):wave->max,contentRegion);
|
||||||
} else {
|
} else {
|
||||||
PlotCustom("##Waveform",wavePreview,wave->len,0,NULL,0,wave->max,contentRegion,sizeof(float),ImVec4(1.0f,1.0f,1.0f,1.0f),0,NULL,NULL,true);
|
PlotCustom("##Waveform",wavePreview,wave->len,0,NULL,(waveSigned && !waveHex)?(-(int)((wave->max+1)/2)):0,(waveSigned && !waveHex)?((int)(wave->max/2)):wave->max,contentRegion,sizeof(float),ImVec4(1.0f,1.0f,1.0f,1.0f),0,NULL,NULL,true);
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemClicked(ImGuiMouseButton_Left)) {
|
if (ImGui::IsItemClicked(ImGuiMouseButton_Left)) {
|
||||||
waveDragStart=ImGui::GetItemRectMin();
|
waveDragStart=ImGui::GetItemRectMin();
|
||||||
|
@ -737,12 +740,33 @@ void FurnaceGUI::drawWaveEdit() {
|
||||||
waveHex=true;
|
waveHex=true;
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
if (!waveHex) if (ImGui::Button(waveSigned?"±##WaveSign":"+##WaveSign",ImVec2(ImGui::GetFrameHeight(),ImGui::GetFrameHeight()))) {
|
||||||
|
waveSigned=!waveSigned;
|
||||||
|
}
|
||||||
|
if (ImGui::IsItemHovered()) {
|
||||||
|
ImGui::SetTooltip("Signed/Unsigned");
|
||||||
|
}
|
||||||
|
ImGui::SameLine();
|
||||||
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); // wavetable text input size found here
|
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x); // wavetable text input size found here
|
||||||
if (ImGui::InputText("##MMLWave",&mmlStringW)) {
|
if (ImGui::InputText("##MMLWave",&mmlStringW)) {
|
||||||
decodeMMLStrW(mmlStringW,wave->data,wave->len,wave->max,waveHex);
|
int actualData[256];
|
||||||
|
decodeMMLStrW(mmlStringW,actualData,wave->len,(waveSigned && !waveHex)?(-((wave->max+1)/2)):0,(waveSigned && !waveHex)?(wave->max/2):wave->max,waveHex);
|
||||||
|
if (waveSigned && !waveHex) {
|
||||||
|
for (int i=0; i<wave->len; i++) {
|
||||||
|
actualData[i]+=(wave->max+1)/2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
memcpy(wave->data,actualData,wave->len*sizeof(int));
|
||||||
}
|
}
|
||||||
if (!ImGui::IsItemActive()) {
|
if (!ImGui::IsItemActive()) {
|
||||||
encodeMMLStr(mmlStringW,wave->data,wave->len,-1,-1,waveHex);
|
int actualData[256];
|
||||||
|
memcpy(actualData,wave->data,256*sizeof(int));
|
||||||
|
if (waveSigned && !waveHex) {
|
||||||
|
for (int i=0; i<wave->len; i++) {
|
||||||
|
actualData[i]-=(wave->max+1)/2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
encodeMMLStr(mmlStringW,actualData,wave->len,-1,-1,waveHex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue