From 7db931bfd2b1e4d09baf5104c6207bb00c17cf95 Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Sat, 27 Feb 2021 09:45:03 +0100 Subject: [PATCH] Keyswitch badge with the key name --- plugins/editor/layout/main.fl | 14 +- plugins/editor/src/editor/Editor.cpp | 76 ++++++- plugins/editor/src/editor/layout/main.hpp | 257 +++++++++++----------- 3 files changed, 209 insertions(+), 138 deletions(-) diff --git a/plugins/editor/layout/main.fl b/plugins/editor/layout/main.fl index 80132b24..f472a88b 100644 --- a/plugins/editor/layout/main.fl +++ b/plugins/editor/layout/main.fl @@ -61,17 +61,25 @@ widget_class mainView {open class ClickableLabel } Fl_Box keyswitchLabel_ { - label {Key switch:} - xywh {195 45 360 30} labelsize 20 align 20 + xywh {265 45 290 30} labelsize 20 align 20 class Label } + Fl_Box keyswitchBadge_ { + xywh {195 47 60 26} box THIN_UP_BOX labelsize 20 + class Badge + } + Fl_Box keyswitchInactiveLabel_ { + label {No key switch} selected + xywh {195 45 360 30} labelsize 20 align 20 hide + class InactiveLabel + } Fl_Box {} { label {Voices:} xywh {195 78 60 25} labelsize 12 align 24 class Label } Fl_Button {} { - comment {tag=kTagPreviousSfzFile} selected + comment {tag=kTagPreviousSfzFile} xywh {480 18 25 25} labelsize 24 class PreviousFileButton } diff --git a/plugins/editor/src/editor/Editor.cpp b/plugins/editor/src/editor/Editor.cpp index 9a9c77cb..51049ac1 100644 --- a/plugins/editor/src/editor/Editor.cpp +++ b/plugins/editor/src/editor/Editor.cpp @@ -52,7 +52,6 @@ struct Editor::Impl : EditorController::Receiver, IControlListener { int currentKeyswitch_ = -1; std::unordered_map keyswitchNames_; - std::string keyswitchLabelPrefix_; SharedPointer memQueryTimer_; @@ -108,6 +107,8 @@ struct Editor::Impl : EditorController::Receiver, IControlListener { CControl *stretchedTuningSlider_ = nullptr; CTextLabel* stretchedTuningLabel_ = nullptr; CTextLabel* keyswitchLabel_ = nullptr; + CTextLabel* keyswitchInactiveLabel_ = nullptr; + CTextLabel* keyswitchBadge_ = nullptr; STitleContainer* userFilesGroup_ = nullptr; STextButton* userFilesDirButton_ = nullptr; @@ -204,6 +205,18 @@ struct Editor::Impl : EditorController::Receiver, IControlListener { void enterOrLeaveEdit(CControl* ctl, bool enter); void controlBeginEdit(CControl* ctl) override; void controlEndEdit(CControl* ctl) override; + + // Misc + static std::string getUnicodeNoteName(unsigned key) + { + const char* keyNames[12] = { + u8"C", u8"C♯", u8"D", u8"D♯", u8"E", + u8"F", u8"F♯", u8"G", u8"G♯", u8"A", u8"A♯", u8"B", + }; + int octave = static_cast(key / 12) - 1; + const char* keyName = keyNames[key % 12]; + return std::string(keyName) + ' ' + std::to_string(octave); + } }; Editor::Editor(EditorController& ctrl) @@ -592,8 +605,8 @@ void Editor::Impl::createFrameContents() darkTheme.titleBoxBackground = { 0xba, 0xbd, 0xb6 }; darkTheme.icon = darkTheme.text; darkTheme.iconHighlight = { 0xfd, 0x98, 0x00 }; - darkTheme.valueText = { 0x2e, 0x34, 0x36 }; - darkTheme.valueBackground = { 0xff, 0xff, 0xff }; + darkTheme.valueText = { 0x00, 0x00, 0x00 }; + darkTheme.valueBackground = { 0x9a, 0x9a, 0x9a }; darkTheme.knobActiveTrackColor = { 0x00, 0xb6, 0x2a }; darkTheme.knobInactiveTrackColor = { 0x60, 0x60, 0x60 }; darkTheme.knobLineIndicatorColor = { 0xff, 0xff, 0xff }; @@ -636,6 +649,16 @@ void Editor::Impl::createFrameContents() lbl->setFont(font); return lbl; }; + auto createInactiveLabel = [&theme](const CRect& bounds, int, const char* label, CHoriTxtAlign align, int fontsize) { + CTextLabel* lbl = new CTextLabel(bounds, label); + lbl->setFrameColor(CColor(0x00, 0x00, 0x00, 0x00)); + lbl->setBackColor(CColor(0x00, 0x00, 0x00, 0x00)); + lbl->setFontColor(theme->inactiveText); + lbl->setHoriAlign(align); + auto font = makeOwned("Roboto", fontsize); + lbl->setFont(font); + return lbl; + }; auto createHLine = [](const CRect& bounds, int, const char*, CHoriTxtAlign, int) { int y = static_cast(0.5 * (bounds.top + bounds.bottom)); CRect lineBounds(bounds.left, y, bounds.right, y + 1); @@ -663,6 +686,18 @@ void Editor::Impl::createFrameContents() lbl->setFont(font); return lbl; }; + auto createBadge = [&theme](const CRect& bounds, int, const char* label, CHoriTxtAlign align, int fontsize) { + CTextLabel* lbl = new CTextLabel(bounds, label); + lbl->setFrameColor(CColor(0x00, 0x00, 0x00, 0x00)); + lbl->setBackColor(theme->valueBackground); + lbl->setFontColor(theme->valueText); + lbl->setHoriAlign(align); + lbl->setStyle(CParamDisplay::kRoundRectStyle); + lbl->setRoundRectRadius(5.0); + auto font = makeOwned("Roboto", fontsize); + lbl->setFont(font); + return lbl; + }; auto createVMeter = [](const CRect& bounds, int, const char*, CHoriTxtAlign, int) { // TODO the volume meter... CViewContainer* container = new CViewContainer(bounds); @@ -831,10 +866,6 @@ void Editor::Impl::createFrameContents() mainView_ = owned(mainView); } - /// - if (keyswitchLabel_) - keyswitchLabelPrefix_ = std::string(keyswitchLabel_->getText()) + ' '; - /// SharedPointer fileDropTarget = owned(new SFileDropTarget); @@ -973,6 +1004,8 @@ void Editor::Impl::createFrameContents() }; } + updateKeyswitchNameLabel(); + /// CViewContainer* panel; activePanel_ = 0; @@ -1389,9 +1422,32 @@ absl::string_view Editor::Impl::getCurrentKeyswitchName() const void Editor::Impl::updateKeyswitchNameLabel() { - if (CTextLabel* label = keyswitchLabel_) { - std::string name { getCurrentKeyswitchName() }; - label->setText((keyswitchLabelPrefix_ + name).c_str()); + CTextLabel* label = keyswitchLabel_; + CTextLabel* badge = keyswitchBadge_; + CTextLabel* inactiveLabel = keyswitchInactiveLabel_; + + int sw = currentKeyswitch_; + const std::string name { getCurrentKeyswitchName() }; + + if (sw == -1) { + if (badge) + badge->setVisible(false); + if (label) + label->setVisible(false); + if (inactiveLabel) + inactiveLabel->setVisible(true); + } + else { + if (badge) { + badge->setText(getUnicodeNoteName(sw)); + badge->setVisible(true); + } + if (label) { + label->setText(name.c_str()); + label->setVisible(true); + } + if (inactiveLabel) + inactiveLabel->setVisible(false); } } diff --git a/plugins/editor/src/editor/layout/main.hpp b/plugins/editor/src/editor/layout/main.hpp index e1f8905e..f997c035 100644 --- a/plugins/editor/src/editor/layout/main.hpp +++ b/plugins/editor/src/editor/layout/main.hpp @@ -25,142 +25,149 @@ view__8->addView(view__10); auto* const view__11 = createClickableLabel(CRect(10, 8, 260, 38), kTagLoadSfzFile, "DefaultInstrument.sfz", kLeftText, 20); sfzFileLabel_ = view__11; view__8->addView(view__11); -auto* const view__12 = createLabel(CRect(10, 40, 370, 70), -1, "Key switch:", kLeftText, 20); +auto* const view__12 = createLabel(CRect(80, 40, 370, 70), -1, "", kLeftText, 20); keyswitchLabel_ = view__12; view__8->addView(view__12); -auto* const view__13 = createLabel(CRect(10, 73, 70, 98), -1, "Voices:", kRightText, 12); +auto* const view__13 = createBadge(CRect(10, 42, 70, 68), -1, "", kCenterText, 20); +keyswitchBadge_ = view__13; view__8->addView(view__13); -auto* const view__14 = createPreviousFileButton(CRect(295, 13, 320, 38), kTagPreviousSfzFile, "", kCenterText, 24); +auto* const view__14 = createInactiveLabel(CRect(10, 40, 370, 70), -1, "No key switch", kLeftText, 20); +keyswitchInactiveLabel_ = view__14; view__8->addView(view__14); -auto* const view__15 = createNextFileButton(CRect(320, 13, 345, 38), kTagNextSfzFile, "", kCenterText, 24); +view__14->setVisible(false); +auto* const view__15 = createLabel(CRect(10, 73, 70, 98), -1, "Voices:", kRightText, 12); view__8->addView(view__15); -auto* const view__16 = createChevronDropDown(CRect(345, 13, 370, 38), kTagFileOperations, "", kCenterText, 24); -fileOperationsMenu_ = view__16; +auto* const view__16 = createPreviousFileButton(CRect(295, 13, 320, 38), kTagPreviousSfzFile, "", kCenterText, 24); view__8->addView(view__16); -auto* const view__17 = createLabel(CRect(75, 73, 115, 98), -1, "", kCenterText, 12); -infoVoicesLabel_ = view__17; +auto* const view__17 = createNextFileButton(CRect(320, 13, 345, 38), kTagNextSfzFile, "", kCenterText, 24); view__8->addView(view__17); -auto* const view__18 = createLabel(CRect(130, 73, 170, 98), -1, "Max:", kRightText, 12); +auto* const view__18 = createChevronDropDown(CRect(345, 13, 370, 38), kTagFileOperations, "", kCenterText, 24); +fileOperationsMenu_ = view__18; view__8->addView(view__18); -auto* const view__19 = createLabel(CRect(175, 73, 210, 98), -1, "", kCenterText, 12); -numVoicesLabel_ = view__19; +auto* const view__19 = createLabel(CRect(75, 73, 115, 98), -1, "", kCenterText, 12); +infoVoicesLabel_ = view__19; view__8->addView(view__19); -auto* const view__20 = createLabel(CRect(240, 73, 300, 98), -1, "Memory:", kRightText, 12); +auto* const view__20 = createLabel(CRect(130, 73, 170, 98), -1, "Max:", kRightText, 12); view__8->addView(view__20); -auto* const view__21 = createLabel(CRect(305, 73, 365, 98), -1, "", kCenterText, 12); -memoryLabel_ = view__21; +auto* const view__21 = createLabel(CRect(175, 73, 210, 98), -1, "", kCenterText, 12); +numVoicesLabel_ = view__21; view__8->addView(view__21); -auto* const view__22 = createChevronValueDropDown(CRect(210, 77, 230, 97), kTagSetNumVoices, "", kCenterText, 16); -numVoicesSlider_ = view__22; +auto* const view__22 = createLabel(CRect(240, 73, 300, 98), -1, "Memory:", kRightText, 12); view__8->addView(view__22); -auto* const view__23 = createRoundedGroup(CRect(570, 5, 795, 105), -1, "", kCenterText, 14); -view__2->addView(view__23); -auto* const view__24 = createKnob48(CRect(45, 15, 93, 63), -1, "", kCenterText, 14); -view__23->addView(view__24); -view__24->setVisible(false); -auto* const view__25 = createValueLabel(CRect(40, 65, 100, 70), -1, "Center", kCenterText, 12); -view__23->addView(view__25); -view__25->setVisible(false); -auto* const view__26 = createStyledKnob(CRect(110, 15, 158, 63), kTagSetVolume, "", kCenterText, 14); -volumeSlider_ = view__26; -view__23->addView(view__26); -auto* const view__27 = createValueLabel(CRect(105, 65, 165, 87), -1, "0.0 dB", kCenterText, 12); -volumeLabel_ = view__27; -view__23->addView(view__27); -auto* const view__28 = createVMeter(CRect(175, 15, 210, 70), -1, "", kCenterText, 14); -view__23->addView(view__28); +auto* const view__23 = createLabel(CRect(305, 73, 365, 98), -1, "", kCenterText, 12); +memoryLabel_ = view__23; +view__8->addView(view__23); +auto* const view__24 = createChevronValueDropDown(CRect(210, 77, 230, 97), kTagSetNumVoices, "", kCenterText, 16); +numVoicesSlider_ = view__24; +view__8->addView(view__24); +auto* const view__25 = createRoundedGroup(CRect(570, 5, 795, 105), -1, "", kCenterText, 14); +view__2->addView(view__25); +auto* const view__26 = createKnob48(CRect(45, 15, 93, 63), -1, "", kCenterText, 14); +view__25->addView(view__26); +view__26->setVisible(false); +auto* const view__27 = createValueLabel(CRect(40, 65, 100, 70), -1, "Center", kCenterText, 12); +view__25->addView(view__27); +view__27->setVisible(false); +auto* const view__28 = createStyledKnob(CRect(110, 15, 158, 63), kTagSetVolume, "", kCenterText, 14); +volumeSlider_ = view__28; +view__25->addView(view__28); +auto* const view__29 = createValueLabel(CRect(105, 65, 165, 87), -1, "0.0 dB", kCenterText, 12); +volumeLabel_ = view__29; +view__25->addView(view__29); +auto* const view__30 = createVMeter(CRect(175, 15, 210, 70), -1, "", kCenterText, 14); +view__25->addView(view__30); enterTheme(defaultTheme); -auto* const view__29 = createLogicalGroup(CRect(5, 110, 796, 395), -1, "", kCenterText, 14); -subPanels_[kPanelGeneral] = view__29; -view__0->addView(view__29); -view__29->setVisible(false); -auto* const view__30 = createRoundedGroup(CRect(0, 0, 175, 280), -1, "", kCenterText, 14); -view__29->addView(view__30); -auto* const view__31 = createLabel(CRect(15, 10, 75, 35), -1, "Curves:", kLeftText, 14); -view__30->addView(view__31); -auto* const view__32 = createLabel(CRect(15, 35, 75, 60), -1, "Masters:", kLeftText, 14); -view__30->addView(view__32); -auto* const view__33 = createLabel(CRect(15, 60, 75, 85), -1, "Groups:", kLeftText, 14); -view__30->addView(view__33); -auto* const view__34 = createLabel(CRect(15, 85, 75, 110), -1, "Regions:", kLeftText, 14); -view__30->addView(view__34); -auto* const view__35 = createLabel(CRect(15, 110, 75, 135), -1, "Samples:", kLeftText, 14); -view__30->addView(view__35); -auto* const view__36 = createLabel(CRect(115, 10, 155, 35), -1, "0", kCenterText, 14); -infoCurvesLabel_ = view__36; -view__30->addView(view__36); -auto* const view__37 = createLabel(CRect(115, 35, 155, 60), -1, "0", kCenterText, 14); -infoMastersLabel_ = view__37; -view__30->addView(view__37); -auto* const view__38 = createLabel(CRect(115, 60, 155, 85), -1, "0", kCenterText, 14); -infoGroupsLabel_ = view__38; -view__30->addView(view__38); -auto* const view__39 = createLabel(CRect(115, 85, 155, 110), -1, "0", kCenterText, 14); -infoRegionsLabel_ = view__39; -view__30->addView(view__39); -auto* const view__40 = createLabel(CRect(115, 110, 155, 135), -1, "0", kCenterText, 14); -infoSamplesLabel_ = view__40; -view__30->addView(view__40); -auto* const view__41 = createLogicalGroup(CRect(5, 110, 795, 395), -1, "", kCenterText, 14); -subPanels_[kPanelControls] = view__41; -view__0->addView(view__41); -view__41->setVisible(false); -auto* const view__42 = createRoundedGroup(CRect(0, 0, 790, 285), -1, "", kCenterText, 14); -view__41->addView(view__42); -auto* const view__43 = createControlsPanel(CRect(0, 0, 790, 285), -1, "", kCenterText, 14); -controlsPanel_ = view__43; -view__42->addView(view__43); -auto* const view__44 = createLogicalGroup(CRect(5, 109, 795, 425), -1, "", kCenterText, 14); -subPanels_[kPanelSettings] = view__44; -view__0->addView(view__44); -auto* const view__45 = createTitleGroup(CRect(300, 26, 495, 126), -1, "Engine", kCenterText, 12); +auto* const view__31 = createLogicalGroup(CRect(5, 110, 796, 395), -1, "", kCenterText, 14); +subPanels_[kPanelGeneral] = view__31; +view__0->addView(view__31); +view__31->setVisible(false); +auto* const view__32 = createRoundedGroup(CRect(0, 0, 175, 280), -1, "", kCenterText, 14); +view__31->addView(view__32); +auto* const view__33 = createLabel(CRect(15, 10, 75, 35), -1, "Curves:", kLeftText, 14); +view__32->addView(view__33); +auto* const view__34 = createLabel(CRect(15, 35, 75, 60), -1, "Masters:", kLeftText, 14); +view__32->addView(view__34); +auto* const view__35 = createLabel(CRect(15, 60, 75, 85), -1, "Groups:", kLeftText, 14); +view__32->addView(view__35); +auto* const view__36 = createLabel(CRect(15, 85, 75, 110), -1, "Regions:", kLeftText, 14); +view__32->addView(view__36); +auto* const view__37 = createLabel(CRect(15, 110, 75, 135), -1, "Samples:", kLeftText, 14); +view__32->addView(view__37); +auto* const view__38 = createLabel(CRect(115, 10, 155, 35), -1, "0", kCenterText, 14); +infoCurvesLabel_ = view__38; +view__32->addView(view__38); +auto* const view__39 = createLabel(CRect(115, 35, 155, 60), -1, "0", kCenterText, 14); +infoMastersLabel_ = view__39; +view__32->addView(view__39); +auto* const view__40 = createLabel(CRect(115, 60, 155, 85), -1, "0", kCenterText, 14); +infoGroupsLabel_ = view__40; +view__32->addView(view__40); +auto* const view__41 = createLabel(CRect(115, 85, 155, 110), -1, "0", kCenterText, 14); +infoRegionsLabel_ = view__41; +view__32->addView(view__41); +auto* const view__42 = createLabel(CRect(115, 110, 155, 135), -1, "0", kCenterText, 14); +infoSamplesLabel_ = view__42; +view__32->addView(view__42); +auto* const view__43 = createLogicalGroup(CRect(5, 110, 795, 395), -1, "", kCenterText, 14); +subPanels_[kPanelControls] = view__43; +view__0->addView(view__43); +view__43->setVisible(false); +auto* const view__44 = createRoundedGroup(CRect(0, 0, 790, 285), -1, "", kCenterText, 14); +view__43->addView(view__44); +auto* const view__45 = createControlsPanel(CRect(0, 0, 790, 285), -1, "", kCenterText, 14); +controlsPanel_ = view__45; view__44->addView(view__45); -auto* const view__46 = createValueMenu(CRect(25, 60, 85, 85), kTagSetOversampling, "", kCenterText, 12); -oversamplingSlider_ = view__46; -view__45->addView(view__46); -auto* const view__47 = createValueLabel(CRect(15, 20, 95, 45), -1, "Oversampling", kCenterText, 12); -view__45->addView(view__47); -auto* const view__48 = createValueLabel(CRect(100, 20, 180, 45), -1, "Preload size", kCenterText, 12); -view__45->addView(view__48); -auto* const view__49 = createValueMenu(CRect(110, 60, 170, 85), kTagSetPreloadSize, "", kCenterText, 12); -preloadSizeSlider_ = view__49; -view__45->addView(view__49); -auto* const view__50 = createTitleGroup(CRect(170, 161, 585, 261), -1, "Tuning", kCenterText, 12); -view__44->addView(view__50); -auto* const view__51 = createValueLabel(CRect(155, 20, 235, 45), -1, "Root key", kCenterText, 12); -view__50->addView(view__51); -auto* const view__52 = createValueMenu(CRect(250, 60, 310, 85), kTagSetTuningFrequency, "", kCenterText, 12); -tuningFrequencySlider_ = view__52; -view__50->addView(view__52); -auto* const view__53 = createValueLabel(CRect(240, 20, 320, 45), -1, "Frequency", kCenterText, 12); -view__50->addView(view__53); -auto* const view__54 = createStyledKnob(CRect(340, 45, 388, 93), kTagSetStretchedTuning, "", kCenterText, 14); -stretchedTuningSlider_ = view__54; -view__50->addView(view__54); -auto* const view__55 = createValueLabel(CRect(325, 20, 405, 45), -1, "Stretch", kCenterText, 12); -view__50->addView(view__55); -auto* const view__56 = createValueLabel(CRect(20, 20, 120, 45), -1, "Scala file", kCenterText, 12); -view__50->addView(view__56); -auto* const view__57 = createValueButton(CRect(20, 60, 120, 85), kTagLoadScalaFile, "DefaultScale", kCenterText, 12); -scalaFileButton_ = view__57; -view__50->addView(view__57); -auto* const view__58 = createValueMenu(CRect(165, 60, 200, 85), kTagSetScalaRootKey, "", kCenterText, 12); -scalaRootKeySlider_ = view__58; -view__50->addView(view__58); -auto* const view__59 = createValueMenu(CRect(200, 60, 230, 85), kTagSetScalaRootKey, "", kCenterText, 12); -scalaRootOctaveSlider_ = view__59; -view__50->addView(view__59); -auto* const view__60 = createResetSomethingButton(CRect(120, 60, 145, 85), kTagResetScalaFile, "", kCenterText, 12); -scalaResetButton_ = view__60; -view__50->addView(view__60); -auto* const view__61 = createTitleGroup(CRect(615, 161, 754, 261), -1, "Files", kCenterText, 12); -userFilesGroup_ = view__61; -view__44->addView(view__61); -auto* const view__62 = createValueLabel(CRect(20, 20, 120, 45), -1, "User SFZ folder", kCenterText, 12); -view__61->addView(view__62); -auto* const view__63 = createValueButton(CRect(20, 60, 120, 85), kTagChooseUserFilesDir, "DefaultPath", kCenterText, 12); -userFilesDirButton_ = view__63; -view__61->addView(view__63); -auto* const view__64 = createPiano(CRect(5, 400, 795, 470), -1, "", kCenterText, 12); -piano_ = view__64; -view__0->addView(view__64); +auto* const view__46 = createLogicalGroup(CRect(5, 109, 795, 425), -1, "", kCenterText, 14); +subPanels_[kPanelSettings] = view__46; +view__0->addView(view__46); +auto* const view__47 = createTitleGroup(CRect(300, 26, 495, 126), -1, "Engine", kCenterText, 12); +view__46->addView(view__47); +auto* const view__48 = createValueMenu(CRect(25, 60, 85, 85), kTagSetOversampling, "", kCenterText, 12); +oversamplingSlider_ = view__48; +view__47->addView(view__48); +auto* const view__49 = createValueLabel(CRect(15, 20, 95, 45), -1, "Oversampling", kCenterText, 12); +view__47->addView(view__49); +auto* const view__50 = createValueLabel(CRect(100, 20, 180, 45), -1, "Preload size", kCenterText, 12); +view__47->addView(view__50); +auto* const view__51 = createValueMenu(CRect(110, 60, 170, 85), kTagSetPreloadSize, "", kCenterText, 12); +preloadSizeSlider_ = view__51; +view__47->addView(view__51); +auto* const view__52 = createTitleGroup(CRect(170, 161, 585, 261), -1, "Tuning", kCenterText, 12); +view__46->addView(view__52); +auto* const view__53 = createValueLabel(CRect(155, 20, 235, 45), -1, "Root key", kCenterText, 12); +view__52->addView(view__53); +auto* const view__54 = createValueMenu(CRect(250, 60, 310, 85), kTagSetTuningFrequency, "", kCenterText, 12); +tuningFrequencySlider_ = view__54; +view__52->addView(view__54); +auto* const view__55 = createValueLabel(CRect(240, 20, 320, 45), -1, "Frequency", kCenterText, 12); +view__52->addView(view__55); +auto* const view__56 = createStyledKnob(CRect(340, 45, 388, 93), kTagSetStretchedTuning, "", kCenterText, 14); +stretchedTuningSlider_ = view__56; +view__52->addView(view__56); +auto* const view__57 = createValueLabel(CRect(325, 20, 405, 45), -1, "Stretch", kCenterText, 12); +view__52->addView(view__57); +auto* const view__58 = createValueLabel(CRect(20, 20, 120, 45), -1, "Scala file", kCenterText, 12); +view__52->addView(view__58); +auto* const view__59 = createValueButton(CRect(20, 60, 120, 85), kTagLoadScalaFile, "DefaultScale", kCenterText, 12); +scalaFileButton_ = view__59; +view__52->addView(view__59); +auto* const view__60 = createValueMenu(CRect(165, 60, 200, 85), kTagSetScalaRootKey, "", kCenterText, 12); +scalaRootKeySlider_ = view__60; +view__52->addView(view__60); +auto* const view__61 = createValueMenu(CRect(200, 60, 230, 85), kTagSetScalaRootKey, "", kCenterText, 12); +scalaRootOctaveSlider_ = view__61; +view__52->addView(view__61); +auto* const view__62 = createResetSomethingButton(CRect(120, 60, 145, 85), kTagResetScalaFile, "", kCenterText, 12); +scalaResetButton_ = view__62; +view__52->addView(view__62); +auto* const view__63 = createTitleGroup(CRect(615, 161, 754, 261), -1, "Files", kCenterText, 12); +userFilesGroup_ = view__63; +view__46->addView(view__63); +auto* const view__64 = createValueLabel(CRect(20, 20, 120, 45), -1, "User SFZ folder", kCenterText, 12); +view__63->addView(view__64); +auto* const view__65 = createValueButton(CRect(20, 60, 120, 85), kTagChooseUserFilesDir, "DefaultPath", kCenterText, 12); +userFilesDirButton_ = view__65; +view__63->addView(view__65); +auto* const view__66 = createPiano(CRect(5, 400, 795, 470), -1, "", kCenterText, 12); +piano_ = view__66; +view__0->addView(view__66);