Add X-Y Oscilloscope

This commit is contained in:
Natt Akuma 2023-11-01 14:56:43 +07:00
parent fbbe0bdf63
commit e702e56901
6 changed files with 295 additions and 1 deletions

View file

@ -3430,6 +3430,7 @@ bool FurnaceGUI::loop() {
DECLARE_METRIC(readOsc)
DECLARE_METRIC(osc)
DECLARE_METRIC(chanOsc)
DECLARE_METRIC(xyOsc)
DECLARE_METRIC(volMeter)
DECLARE_METRIC(settings)
DECLARE_METRIC(debug)
@ -4425,6 +4426,7 @@ bool FurnaceGUI::loop() {
if (ImGui::MenuItem("piano/input pad",BIND_FOR(GUI_ACTION_WINDOW_PIANO),pianoOpen)) pianoOpen=!pianoOpen;
if (ImGui::MenuItem("oscilloscope (master)",BIND_FOR(GUI_ACTION_WINDOW_OSCILLOSCOPE),oscOpen)) oscOpen=!oscOpen;
if (ImGui::MenuItem("oscilloscope (per-channel)",BIND_FOR(GUI_ACTION_WINDOW_CHAN_OSC),chanOscOpen)) chanOscOpen=!chanOscOpen;
if (ImGui::MenuItem("oscilloscope (X-Y)",BIND_FOR(GUI_ACTION_WINDOW_XY_OSC),xyOscOpen)) xyOscOpen=!xyOscOpen;
if (ImGui::MenuItem("volume meter",BIND_FOR(GUI_ACTION_WINDOW_VOL_METER),volMeterOpen)) volMeterOpen=!volMeterOpen;
if (ImGui::MenuItem("clock",BIND_FOR(GUI_ACTION_WINDOW_CLOCK),clockOpen)) clockOpen=!clockOpen;
if (ImGui::MenuItem("register view",BIND_FOR(GUI_ACTION_WINDOW_REGISTER_VIEW),regViewOpen)) regViewOpen=!regViewOpen;
@ -4645,6 +4647,7 @@ bool FurnaceGUI::loop() {
MEASURE(readOsc,readOsc());
MEASURE(osc,drawOsc());
MEASURE(chanOsc,drawChanOsc());
MEASURE(xyOsc,drawXYOsc());
MEASURE(grooves,drawGrooves());
MEASURE(regView,drawRegView());
} else {
@ -4674,6 +4677,7 @@ bool FurnaceGUI::loop() {
MEASURE(osc,drawOsc());
MEASURE(chanOsc,drawChanOsc());
MEASURE(xyOsc,drawXYOsc());
MEASURE(volMeter,drawVolMeter());
MEASURE(settings,drawSettings());
MEASURE(debug,drawDebug());
@ -6413,6 +6417,7 @@ bool FurnaceGUI::init() {
mixerOpen=e->getConfBool("mixerOpen",false);
oscOpen=e->getConfBool("oscOpen",true);
chanOscOpen=e->getConfBool("chanOscOpen",false);
xyOscOpen=e->getConfBool("xyOscOpen",false);
volMeterOpen=e->getConfBool("volMeterOpen",true);
statsOpen=e->getConfBool("statsOpen",false);
compatFlagsOpen=e->getConfBool("compatFlagsOpen",false);
@ -6521,6 +6526,16 @@ bool FurnaceGUI::init() {
chanOscGrad.fromString(e->getConfString("chanOscGrad",""));
chanOscGrad.render();
xyOscXChannel=e->getConfInt("xyOscXChannel",0);
xyOscXInvert=e->getConfBool("xyOscXInvert",false);
xyOscYChannel=e->getConfInt("xyOscYChannel",1);
xyOscYInvert=e->getConfBool("xyOscYInvert",false);
xyOscZoom=e->getConfFloat("xyOscZoom",1.0f);
xyOscSamples=e->getConfInt("xyOscSamples",32768);
xyOscDecayTime=e->getConfFloat("xyOscDecayTime",10.0f);
xyOscIntensity=e->getConfFloat("xyOscIntensity",2.0f);
xyOscThickness=e->getConfFloat("xyOscThickness",2.0f);
syncSettings();
syncTutorial();
@ -6968,6 +6983,7 @@ void FurnaceGUI::commitState() {
e->setConf("mixerOpen",mixerOpen);
e->setConf("oscOpen",oscOpen);
e->setConf("chanOscOpen",chanOscOpen);
e->setConf("xyOscOpen",xyOscOpen);
e->setConf("volMeterOpen",volMeterOpen);
e->setConf("statsOpen",statsOpen);
e->setConf("compatFlagsOpen",compatFlagsOpen);
@ -7062,6 +7078,17 @@ void FurnaceGUI::commitState() {
e->setConf("chanOscUseGrad",chanOscUseGrad);
e->setConf("chanOscGrad",chanOscGrad.toString());
// commit x-y osc state
e->setConf("xyOscXChannel",xyOscXChannel);
e->setConf("xyOscXInvert",xyOscXInvert);
e->setConf("xyOscYChannel",xyOscYChannel);
e->setConf("xyOscYInvert",xyOscYInvert);
e->setConf("xyOscZoom",xyOscZoom);
e->setConf("xyOscSamples",xyOscSamples);
e->setConf("xyOscDecayTime",xyOscDecayTime);
e->setConf("xyOscIntensity",xyOscIntensity);
e->setConf("xyOscThickness",xyOscThickness);
// commit recent files
for (int i=0; i<30; i++) {
String key=fmt::sprintf("recentFile%d",i);
@ -7301,6 +7328,7 @@ FurnaceGUI::FurnaceGUI():
clockOpen(false),
speedOpen(true),
groovesOpen(false),
xyOscOpen(false),
basicMode(true),
shortIntro(false),
insListDir(false),
@ -7541,6 +7569,17 @@ FurnaceGUI::FurnaceGUI():
chanOscGrad(64,64),
chanOscGradTex(NULL),
chanOscWorkPool(NULL),
xyOscPointTex(NULL),
xyOscOptions(false),
xyOscXChannel(0),
xyOscXInvert(false),
xyOscYChannel(1),
xyOscYInvert(false),
xyOscZoom(1.0f),
xyOscSamples(32768),
xyOscDecayTime(10.0f),
xyOscIntensity(2.0f),
xyOscThickness(2.0f),
followLog(true),
#ifdef IS_MOBILE
pianoOctaves(7),