From 40e48bcc5468ed69fd9650e6c8e3d0d94140c98a Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Wed, 2 Sep 2020 12:19:26 +0200 Subject: [PATCH] User interface update --- editor/CMakeLists.txt | 60 ++ editor/cmake/Vstgui.cmake | 2 + editor/layout/main.fl | 344 +++++++ .../Fonts/fluentui-system-regular-20.ttf | Bin 0 -> 263124 bytes editor/resources/icon_white.png | Bin 0 -> 3412 bytes editor/resources/icon_white.svg | 253 +++++ editor/resources/icon_white@2x.png | Bin 0 -> 7336 bytes editor/resources/knob.knob | Bin 0 -> 22266 bytes editor/resources/knob48.png | Bin 0 -> 10955 bytes editor/resources/knob48@2x.png | Bin 0 -> 109207 bytes editor/resources/logo_text.png | Bin 0 -> 5414 bytes editor/resources/logo_text.svg | 252 +++++ editor/resources/logo_text@2x.png | Bin 0 -> 10935 bytes editor/src/editor/Editor.cpp | 879 +++++++++--------- editor/src/editor/GUIComponents.cpp | 420 ++++++++- editor/src/editor/GUIComponents.h | 134 ++- editor/src/editor/NativeHelpers.cpp | 50 + editor/src/editor/NativeHelpers.h | 9 + editor/src/editor/NativeHelpers.mm | 30 + editor/src/editor/layout/main.hpp | 167 ++++ editor/tools/layout-maker/LICENSE | 23 + editor/tools/layout-maker/README | 2 + editor/tools/layout-maker/sources/layout.h | 42 + editor/tools/layout-maker/sources/main.cpp | 136 +++ editor/tools/layout-maker/sources/reader.cpp | 359 +++++++ editor/tools/layout-maker/sources/reader.h | 13 + lv2/CMakeLists.txt | 7 +- scripts/innosetup.iss.in | 6 +- vst/CMakeLists.txt | 7 +- 29 files changed, 2720 insertions(+), 475 deletions(-) create mode 100644 editor/layout/main.fl create mode 100644 editor/resources/Fonts/fluentui-system-regular-20.ttf create mode 100644 editor/resources/icon_white.png create mode 100644 editor/resources/icon_white.svg create mode 100644 editor/resources/icon_white@2x.png create mode 100644 editor/resources/knob.knob create mode 100644 editor/resources/knob48.png create mode 100644 editor/resources/knob48@2x.png create mode 100644 editor/resources/logo_text.png create mode 100644 editor/resources/logo_text.svg create mode 100644 editor/resources/logo_text@2x.png create mode 100644 editor/src/editor/NativeHelpers.cpp create mode 100644 editor/src/editor/NativeHelpers.h create mode 100644 editor/src/editor/NativeHelpers.mm create mode 100644 editor/src/editor/layout/main.hpp create mode 100644 editor/tools/layout-maker/LICENSE create mode 100644 editor/tools/layout-maker/README create mode 100644 editor/tools/layout-maker/sources/layout.h create mode 100644 editor/tools/layout-maker/sources/main.cpp create mode 100644 editor/tools/layout-maker/sources/reader.cpp create mode 100644 editor/tools/layout-maker/sources/reader.h diff --git a/editor/CMakeLists.txt b/editor/CMakeLists.txt index 65cdb6d9..bd9a38a8 100644 --- a/editor/CMakeLists.txt +++ b/editor/CMakeLists.txt @@ -3,8 +3,23 @@ include("cmake/Vstgui.cmake") set(EDITOR_RESOURCES logo.png + logo_text.png + logo_text@2x.png + icon_white.png + icon_white@2x.png + knob48.png + knob48@2x.png + Fonts/fluentui-system-regular-20.ttf PARENT_SCOPE) +function(copy_editor_resources SOURCE_DIR DESTINATION_DIR) + foreach(res ${EDITOR_RESOURCES}) + get_filename_component(_dir "${res}" DIRECTORY) + file(MAKE_DIRECTORY "${DESTINATION_DIR}/${_dir}") + file(COPY "${SOURCE_DIR}/${res}" DESTINATION "${DESTINATION_DIR}/${_dir}") + endforeach() +endfunction() + # editor add_library(sfizz_editor STATIC EXCLUDE_FROM_ALL src/editor/EditIds.h @@ -14,8 +29,53 @@ add_library(sfizz_editor STATIC EXCLUDE_FROM_ALL src/editor/EditorController.h src/editor/GUIComponents.h src/editor/GUIComponents.cpp + src/editor/NativeHelpers.h + src/editor/NativeHelpers.cpp + src/editor/layout/main.hpp src/editor/utility/vstgui_after.h src/editor/utility/vstgui_before.h) target_include_directories(sfizz_editor PUBLIC "src") target_link_libraries(sfizz_editor PRIVATE sfizz-vstgui) target_link_libraries(sfizz_editor PUBLIC absl::strings) +if(APPLE) + find_library(APPLE_APPKIT_LIBRARY "AppKit") + find_library(APPLE_CORESERVICES_LIBRARY "CoreServices") + find_library(APPLE_FOUNDATION_LIBRARY "Foundation") + target_sources(sfizz_editor PRIVATE + src/editor/NativeHelpers.mm) + target_link_libraries(sfizz_editor PRIVATE + "${APPLE_APPKIT_LIBRARY}" + "${APPLE_CORESERVICES_LIBRARY}" + "${APPLE_FOUNDATION_LIBRARY}") + target_compile_options(sfizz_editor PRIVATE "-fobjc-arc") +endif() + +# dependencies +if(WIN32) + # +elseif(APPLE) + # +else() + find_package(PkgConfig REQUIRED) + pkg_check_modules(sfizz-gio "gio-2.0" REQUIRED) + target_include_directories(sfizz_editor PRIVATE ${sfizz-gio_INCLUDE_DIRS}) + target_link_libraries(sfizz_editor PRIVATE ${sfizz-gio_LIBRARIES}) +endif() +target_include_directories(sfizz_editor PRIVATE "../src/external") # ghc::filesystem + +# layout tool +if(NOT CMAKE_CROSSCOMPILING) + add_executable(layout-maker + "tools/layout-maker/sources/layout.h" + "tools/layout-maker/sources/reader.cpp" + "tools/layout-maker/sources/reader.h" + "tools/layout-maker/sources/main.cpp") + target_link_libraries(layout-maker PRIVATE absl::strings) + + add_custom_command( + OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/src/editor/layout/main.hpp" + COMMAND "${CMAKE_CURRENT_BINARY_DIR}/layout-maker" + "${CMAKE_CURRENT_SOURCE_DIR}/layout/main.fl" + > "${CMAKE_CURRENT_SOURCE_DIR}/src/editor/layout/main.hpp" + DEPENDS layout-maker "${CMAKE_CURRENT_SOURCE_DIR}/layout/main.fl") +endif() diff --git a/editor/cmake/Vstgui.cmake b/editor/cmake/Vstgui.cmake index 2cac1f17..25f185bb 100644 --- a/editor/cmake/Vstgui.cmake +++ b/editor/cmake/Vstgui.cmake @@ -211,6 +211,8 @@ endif() if(CMAKE_SYSTEM_NAME STREQUAL "Windows") # higher C++ requirement on Windows set_property(TARGET sfizz-vstgui PROPERTY CXX_STANDARD 14) + # Windows 10 RS2 DDI for custom fonts + target_compile_definitions(sfizz-vstgui PRIVATE "NTDDI_VERSION=0x0A000003") endif() if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") diff --git a/editor/layout/main.fl b/editor/layout/main.fl new file mode 100644 index 00000000..1d27e987 --- /dev/null +++ b/editor/layout/main.fl @@ -0,0 +1,344 @@ +# data file for the Fltk User Interface Designer (fluid) +version 1.0305 +header_name {.h} +code_name {.cxx} +widget_class mainView {open + xywh {410 523 800 475} type Double + class LogicalGroup visible +} { + Fl_Group {} { + comment {theme=darkTheme} open + xywh {0 0 800 110} + class LogicalGroup + } { + Fl_Group {} {open + xywh {5 4 100 101} box ROUNDED_BOX align 0 + class RoundedGroup + } { + Fl_Box {} { + comment {tag=kTagFirstChangePanel+kPanelGeneral} + image {../resources/icon_white.png} xywh {7 6 96 96} + class SfizzMainButton + } + } + Fl_Group {} {open + xywh {110 5 380 100} box ROUNDED_BOX + class RoundedGroup + } { + Fl_Box {} { + label {File:} + xywh {125 15 40 25} labelsize 16 + class Label + } + Fl_Box {} { + label {KS:} + xywh {125 45 40 25} labelsize 16 + class Label + } + Fl_Box {} { + label {Separator 1} + xywh {120 40 355 5} box BORDER_BOX labeltype NO_LABEL + class HLine + } + Fl_Box {} { + label {Separator 2} + xywh {120 70 355 5} box BORDER_BOX labeltype NO_LABEL + class HLine + } + Fl_Box sfzFileLabel_ { + label {DefaultInstrument.sfz} + xywh {190 15 230 25} labelsize 20 + class Label + } + Fl_Box {} { + label {Key switch} + xywh {190 45 230 25} labelsize 20 + class Label + } + Fl_Box {} { + label {Voices:} + xywh {120 75 60 25} labelsize 12 align 24 + class Label + } + Fl_Button {} { + comment {tag=kTagLoadSfzFile} + xywh {425 15 25 25} labelsize 24 + class LoadFileButton + } + Fl_Button {} { + comment {tag=kTagEditSfzFile} + xywh {450 15 25 25} labelsize 24 + class EditFileButton + } + Fl_Box infoVoicesLabel_ { + xywh {185 75 50 25} labelsize 12 align 16 + class Label + } + Fl_Box {} { + label {Max:} + xywh {240 75 60 25} labelsize 12 align 24 + class Label + } + Fl_Box numVoicesLabel_ { + xywh {305 75 50 25} labelsize 12 align 16 + class Label + } + Fl_Box {} { + label {Memory:} + xywh {360 75 60 25} labelsize 12 align 24 + class Label + } + Fl_Box memoryLabel_ { + xywh {425 75 50 25} labelsize 12 align 16 + class Label + } + } + Fl_Group {} {open + xywh {495 5 100 100} box ROUNDED_BOX + class RoundedGroup + } { + Fl_Light_Button {} { + label SETUP + comment {tag=kTagFirstChangePanel+kPanelSettings} + xywh {510 42 70 25} + class LightButton + } + Fl_Light_Button {} { + label CC + comment {tag=kTagFirstChangePanel+kPanelControls} + xywh {510 15 70 25} + class LightButton + } + Fl_Light_Button {} { + label INFO + comment {tag=kTagFirstChangePanel+kPanelInfo} + xywh {510 69 70 25} + class LightButton + } + } + Fl_Group {} {open + xywh {600 5 195 100} box ROUNDED_BOX + class RoundedGroup + } { + Fl_Dial {} { + xywh {615 20 48 48} value 0.5 hide + class Knob48 + } + Fl_Box {} { + label Center + xywh {610 70 60 25} labelsize 12 hide + class ValueLabel + } + Fl_Dial volumeSlider_ { + comment {tag=kTagSetVolume} + xywh {680 20 48 48} value 0.5 + class Knob48 + } + Fl_Box volumeLabel_ { + label {0.0 dB} + xywh {675 70 60 25} labelsize 12 + class ValueLabel + } + Fl_Box {} { + xywh {745 20 35 70} box BORDER_BOX + class VMeter + } + } + } + Fl_Group {subPanels_[kPanelGeneral]} { + xywh {5 110 790 285} hide + class LogicalGroup + } { + Fl_Group {} {open + xywh {5 110 120 285} box ROUNDED_BOX + class RoundedGroup + } { + Fl_Box {} { + label {Curves:} + xywh {15 120 60 25} labelsize 12 align 20 + class Label + } + Fl_Box {} { + label {Masters:} + xywh {15 145 60 25} labelsize 12 align 20 + class Label + } + Fl_Box {} { + label {Groups:} + xywh {15 170 60 25} labelsize 12 align 20 + class Label + } + Fl_Box {} { + label {Regions:} + xywh {15 195 60 25} labelsize 12 align 20 + class Label + } + Fl_Box {} { + label {Samples:} + xywh {15 220 60 25} labelsize 12 align 20 + class Label + } + Fl_Box infoCurvesLabel_ { + label 0 + xywh {75 120 40 25} labelsize 12 align 16 + class Label + } + Fl_Box infoMastersLabel_ { + label 0 + xywh {75 145 40 25} labelsize 12 align 16 + class Label + } + Fl_Box infoGroupsLabel_ { + label 0 + xywh {75 170 40 25} labelsize 12 align 16 + class Label + } + Fl_Box infoRegionsLabel_ { + label 0 + xywh {75 195 40 25} labelsize 12 align 16 + class Label + } + Fl_Box infoSamplesLabel_ { + label 0 + xywh {75 220 40 25} labelsize 12 align 16 + class Label + } + } + Fl_Group {} {open + xywh {130 110 665 280} + class LogicalGroup + } { + Fl_Box {} { + image {../resources/logo_text.png} xywh {260 125 400 250} + class SfizzLargePicture + } + } + } + Fl_Group {subPanels_[kPanelControls]} { + xywh {5 110 790 285} hide + class LogicalGroup + } { + Fl_Group {} {open + xywh {5 110 790 285} box ROUNDED_BOX + class RoundedGroup + } { + Fl_Box {} { + label {Controls not available} + xywh {5 110 790 285} labelsize 40 + class Label + } + } + } + Fl_Group {subPanels_[kPanelSettings]} {open + xywh {5 110 790 285} + class LogicalGroup + } { + Fl_Group {} { + label Engine open selected + xywh {260 125 280 110} box ROUNDED_BOX labelsize 12 align 17 + class TitleGroup + } { + Fl_Spinner numVoicesSlider_ { + comment {tag=kTagSetNumVoices} + xywh {285 185 60 25} labelsize 12 textsize 12 + class ValueMenu + } + Fl_Box {} { + label Polyphony + xywh {275 145 80 25} labelsize 12 + class ValueLabel + } + Fl_Spinner oversamplingSlider_ { + comment {tag=kTagSetOversampling} + xywh {370 185 60 25} labelsize 12 textsize 12 + class ValueMenu + } + Fl_Box {} { + label Oversampling + xywh {360 145 80 25} labelsize 12 + class ValueLabel + } + Fl_Box {} { + label {Preload size} + xywh {445 145 80 25} labelsize 12 + class ValueLabel + } + Fl_Spinner preloadSizeSlider_ { + comment {tag=kTagSetPreloadSize} + xywh {455 185 60 25} labelsize 12 textsize 12 + class ValueMenu + } + } + Fl_Group {} { + label Tuning open + xywh {205 260 390 120} box ROUNDED_BOX labelsize 12 align 17 + class TitleGroup + } { + Fl_Box {} { + label {Root key} + xywh {330 280 80 25} labelsize 12 + class ValueLabel + } + Fl_Spinner tuningFrequencySlider_ { + comment {tag=kTagSetTuningFrequency} + xywh {425 320 60 25} labelsize 12 textsize 12 + class ValueMenu + } + Fl_Box {} { + label Frequency + xywh {415 280 80 25} labelsize 12 + class ValueLabel + } + Fl_Dial stretchedTuningSlider_ { + comment {tag=kTagSetStretchedTuning} + xywh {515 305 48 48} value 0.5 + class Knob48 + } + Fl_Box {} { + label Stretch + xywh {500 280 80 25} labelsize 12 + class ValueLabel + } + Fl_Box {} { + label {Scala file} + xywh {225 280 100 25} labelsize 12 + class ValueLabel + } + Fl_Button scalaFileButton_ { + label DefaultScale + comment {tag=kTagLoadScalaFile} + xywh {225 320 100 25} labelsize 12 + class ValueButton + } + Fl_Spinner scalaRootKeySlider_ { + comment {tag=kTagSetScalaRootKey} + xywh {340 320 35 25} labelsize 12 textsize 12 + class ValueMenu + } + Fl_Spinner scalaRootOctaveSlider_ { + comment {tag=kTagSetScalaRootKey} + xywh {375 320 30 25} labelsize 12 textsize 12 + class ValueMenu + } + } + } + Fl_Group {subPanels_[kPanelInfo]} { + xywh {5 110 790 285} hide + class LogicalGroup + } { + Fl_Group {} {open + xywh {5 110 790 285} box ROUNDED_BOX + class RoundedGroup + } { + Fl_Box {} { + label {Informative text goes here} + xywh {5 110 790 285} labelsize 40 + class Label + } + } + } + Fl_Box {} { + xywh {5 400 790 70} + class Piano + } +} diff --git a/editor/resources/Fonts/fluentui-system-regular-20.ttf b/editor/resources/Fonts/fluentui-system-regular-20.ttf new file mode 100644 index 0000000000000000000000000000000000000000..4e838582501533c67dc8a4f23293889f9795f258 GIT binary patch literal 263124 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ðT-teI;ETSiVhsid_R`bi3p7w2)ysN?E4XsB$FN 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 z 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 twl)u2n}@BcX<>7EASZQhW??5F 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 qIA{(BkAZo}Bu&yJP0}QdKl(ouPUnCMx<| + + sfizz logo + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + sfizz logo + 2020-05-16 + + + Tobiasz 'unfa' KaroÅ„ + + + + + CC-0 + + + + + + + + + + + + + + + diff --git a/editor/resources/icon_white@2x.png b/editor/resources/icon_white@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e5bc80a228e51e6c09cfa811cef11bd6d437c6b4 GIT binary patch literal 7336 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 literal 0 HcmV?d00001 diff --git a/editor/resources/knob.knob b/editor/resources/knob.knob new file mode 100644 index 0000000000000000000000000000000000000000..093bd66cc323bb5dcd998d9a7fcb57004ed076b7 GIT binary patch literal 22266 zcmeI32~-rR}G$b-n=ts-kGVKW4PaUZ+&&| z?^f0Q*R8Lo&nWL{VKKzo!oornFx4jr{dFV%^|C_$53zimX<^YbKfuRRl@jrE+vOmK z5Zg7IvWK1Bx4AOH`Mx42bMD6Mffr-f51JlmwKCRe^{5_R!#{{!YcIJJTkJOUZ$BLD zc6#-^)f37`|E5pOYP|D_lQ#e8l|7FKPqhE0Xx$&i#!2n+n(#OQzizv~;l*dw!)$EdMAr@Y&~}*Pm)Fj}FJ7FNzx|sH2j^H{9Pyve`mA?-fBYon zfe~pgX_I%Jx^}uIF6-E_WBa~ZY#LeMIDSUptY5x=YI$KlQDTuMaW}-;yQj zn_s9uaN~~#I~&J6->$5=o4$KxjZ5K;-|Gj?zZ3dZ`C;F@Z9i??QP&w>stjrpR`?t1hc{>GqySZQ5hf=Y*z~Or5^3 z&!J*>|7M^3bkcN+w-x8~fq(9xUz=Xi->FK4^{cwH zJ+8^}6T8@!n|Rse$`?GRjXdi>oEmR`SgS}8w_v4h z7WXzq->SN&NP7KNo^l}1vfAoT`^rm?-+6yf;YzJ4Z)+WqV87h3G{4+?OVA_rl7=UW z$sx&J`|zi-xbz6OHH-FN@@tfBtoKcDc0ZHb^u*!4l7X6}kQYH|A!#`eB%<)3hb?QW zcklM-S2eyN$st09wcWb5+GbYOTAS?bbwQ(cMAe+Tx9Owdv)>Sz4uiLD-k|-i%pu7^ zS=GxXVs=c#s$u=>{C_F)%5d^&JyIbm2$s9uIlpOb(6Jc>m#u1JtNkYIxZP)PSV-9( z-&ZF4f}pPhh76fGyWw8z#>$5M9v`aR%Cyl=4#t$2Q?jb5+bcJSuC~3hZ)>`={*{GN zH#+f!sVX&MM&x%rzMLi-b+6m5)MIyC`fS;n{Y~mjnWkHwon+UTveChxjA)BAtT=aL zdC6_9Z$ZeQqqy6EO36@FLyMu}wMWtFVGgcW{ce@^T^8jsvEcN4t@F(+(bZn{sj2S& zF-BLupm=G?oa$ot(p&L8oJ*Y?JiED`A2_GgB59h_fRL2NX_1@GVI$V{EGMET4{fUU zn_FyAWcy^>sFrCdmdmumy;@u6A^I1_jji}d8+3S3VY6y)aB<$XtweBROL+a)3G`*zxeCF&-d@W_(>Hnkg4KX4Sy$#9z5H_k52BCEOk8RZ$v zpUNB(cPu4>*A&f?U2?DWuCv&&cJig$QIak16|PGd|J}+5#KL%c){1E#;PJy)-ujkt$!G|Nxd=MZKBKa@9-i0uGFrn_FH3@ zk`g9c(XaJQRdeqd6|oh5-WTF+xAs`(K-9;zNM87RcTaD>c|Et~PW1`xyjk|K5qqw0 zz4*!TnBbq5ttSf32J3(J&fXH+l4aBFX75wk;l)Re%o|j?tnqF}ZIf@%+CI ziP)Uo>siCg_4~_n!oL08t>=k;Irg7Rr%V~S>Uq=i%Wm-vWZTD^(Ft>}{gzv&^stkL zjsI&-PR`?dxMk8XM@e{4rM~9IihIAlz8}(mzK0*;Y+1V@ePD`bcUR(WL-Nh&3Xf-U zS;di`hu6+M*I4G9J9X5}AgoDMF0aBSS!XysxvHt%4Ib~(umLsq4|2+BG-SpAz4u0cGr&&0>Og*``Bv1Rr@1+Co-hcE}&mXfd z4&JdpN;{@%iFI>SpI44eV_()@ALk%iw#$F^l?zW3gEo~LmK+XKKhIkfez?aM^HOqG z)Yr|p&|Op-u*+`q_N}$qnMYbEfAO26XA5sT6I)VqwQdu=WkK~*;y;?{Hop$xxkp6L zE55HAh?Tn^7g^8yrS0O?3obwRubq1&IVt~)*t_CKtVl9DK8(_dgFG)tK5n z!ug4ZBGzqZ?VYBkD};}7+sn_s7hUN7Yq4};klmo-H?`Xi&e+=vU7kJD-2ScG#lC$O zZk6x#U!8jD#xJUKs#ORGe|p^Gl&G-Z(Vn4a4wglU&X4+(_~x;DyY$qB2iY0j zJg)tv$DmgQIcT}I2=JZhbHFQd)q>duBG$MNb(1g{HF}*=j8AeCSqG|9k*$=8ti2Nr z20~||97?gsI@pw|C5&W=si7Q7bj++oQ$nICShJJ}RpJVsEjDw6ncGZ*B*GA^j!)2P zbaCVvf(TsXKwc8aOTyzN>BI{Myl}`1hrDpe3x~XL$P0(OaL5aX zyl}`1hrDpe3x~XL$P0(OaL5aXyl}`1hrDpe3x~XL9xuETFDc+9g}kJYmlX1nLS9nH zOA2{OAulQ9C561Cke3wll0sfm$V&=&Ng*#Oz^s@{&ScQXVg9CtfnZO9pw# zATJr@C4;z>#dC4I!IpigWyyTFV9P*Mw zUUJAw4tdFWyyTsDDF818~iGycCd^0`gKoUJA%d z0eLAPF9qbKfV>otmjd!q@OUX8uLYD!6(cn}6G=uT5@C96kWwrmWvpK7k4i`qqLLRX zNk}!RiPxAkNrci{V~Exgej2To_L3!1(2*@XjR{1wN$EBbNf^=&(ZrY*BSpj7LHa~p zOh*Gmz#fIv1kY{|92I+U$Av7L(5TKLDm#9@6Kt}^Laf?kp8iR5IXokc+h~%Z$qLI^B z0+9UHM6(vzRZ5#fhtfqndD5gY3}PhMm1?baf@v`^K@+Xl85zGuOU@igI(V@VZ;XD&fdOwYcoSy)liO^~_p4x=PYW7Ub%K3Il+L64j}AZCiw=v6$yf^hT8Zs=_dcGQqldxl>H6r7^+9~oRHO| zi@EkmGuWgypfOJnAQod<~;n2nP1bTv$>0))~h zz=8UaqbF;r0(ByKmKYl$Vjc*T!%JgAPch~{bZ2r8YI;RsZ8Rv_!QOvtJ9Hwp4c80G zL2kRyPYSXrviKKVM;j&pYQYbHVEgz|k6ZQxK5QpA$Gf`aLjvGhadFWi5Tj3~pITxi z^)Q7ljCL_Ygf(P1Xq!d!A#_HKDV4oHsk1OX{;25~OjSov#$g_nUbDr_I?5bNJ2A$| z>npcjvz=ueW^vg|oeoG}>jZmIu+Red=mX5r2fPb?07M_aojL&GW7zY2eE7U7G9u4m z9+l6ZY1-uk@asTe^C@5(^5=l>HJb!}C5%l6;d;$7_T@A7HD~PmF2=r)u`d^QszyuR zYwYz+>qMT@tjD}MGA7Sq9+yv4NS&c2l7>O;#X%z<*HYf4^ zj=IKKIs1Q0TvN|hQrWUslc251w;}%XR?ybyg_K+h$xkr!b3xG7MicjB>k!H8+Rce= z{)N=hki^+xaghXVjku7~Q_$ArdLw9S@-_i-n=kKR4Ru3-mfS5xH{z=fp3m$Sg|fRN zsJY}|BJgz`&uJ!-cy%DInW&?i3EDcD0Zx))6*2vK#7!*g=Fb7&Yc>h|N*LR08dx>t zD`;zK(U<(Uw6(B%ZJ;+V1c6P8YP6Au(H|+8{c8!_i={<2+9Rh5++9xYH=A!@i~m(O zu;~E-nH<*u>gH7(|3p?2G&4;^__>!6Zioo{@DjTIG&~GRF_5L5+ z!N$#0HYP@Lh)NS-OI}K1V@bOmjShgb}ok2ni!>-mQ=@ zf-VQRyDcP)bY!p#$=I~^77|7{>CNm~GuuV{?dpGOD_bUrY_uWA=8XS?zj)-16GS%p z;3TJT2wU0Y8#B{hW2~KZ^3xhfL<3cV^x^(NI%nKFo1=&z?QZ zDmRq0!0#e^_8e$G$N;`#^KDJtvq$K;ijtxZ1~r%1=W<;6Wz*z?)MPSzDmbnO8!w64 zQvfO6d+f&PL-q%Y7b^FgJ!1{+RYck`pnC(~du`(##^T ztDSH^@0{VSMIYuu$N{o6}5fneO+-1=<*uOrz6vf{Y zQ1fhLNg@9gM`C3!(#*!J91bUF0q55++)qzm}$zL z6Oq4X~m+)?<%67pIacb{6w0d{$pdcMWex zuw|&TIKi(x5mG1nt#wq|Q~W|={b1k-8OOq__%NH&8Z?52lXZpi(6ko*q&dtrW`WC(B>h_5G9w%k; z?johsVT6^e-<_99dUDAvGtVJlLp)^Oe(L9G4@$X}yuGi4#rDk1gkx!*jQfw6tSrIR zDz>3mQdO9oq!Zbq6kANI?eMNxHcz@ZeoOyicHS_z+h)TP?s@&-c_9VAt-{k}cqNgs z$-aO@&RTB)42`2ba2s`Ol>tvUJSlp@TysgxLcXH@Fy#eJW{I4&Y`*>d%{jMw*k@)` zsd=fZR1xGV57tAnI{82N&4aT(c_X0MGb5@>PdDqY=JzOwSrC#+%e)}E2} z6XjTKJ7e;gnHaRe(&65~CiTZ-X{U-SWx=pH=%rSBYbsBxf^JNJf}NSA)&)}oJ(xN- zhv6G>bnB)>0PU76Wx84Y0GZ$FqrVmTb++xRmf`Cv7wqT!LYpkdKJ)6jP&3z))jiU? zzXdY5$%!1dk~g8*HZ@n8vE^>+-1Rl{e7p>=dG^eDO34LgLhB9}J4If}M%xv~ug+0O zdZ%&;k_uPkvKaz5I)?+g=8X=;$CBEg5VeOreq^=aNGe-Uy48Ykt<(BazBEm{yltNzMC`l5)7<&T>r6=Bm2F7Imym zVP`X0JSWWwUees6kI0J3&7E=dsgib@c@b}FC~#+@1RE0ec{A&MhmGILGq+{B7{fpF zt|n?N!f)?a`2E0+CNxacT2Ez6-l+6*kGHraiD*liWc-rl)77=mmaMQ-S!<;KjvYH* zt$o;cqGpHI<~N+XgXSpy`t~`|nc|zP<)D?<%XEaL9k;RinqMuA!N_lG*3=_PdCSl0 z-0owy@vSh?g-n95!nV=IzZCDfyL?pBM`n_T$g z-&o#9=?zz_ToY3-5WF){Zr$#g_HD|GW3>@qsy}R*RKaZWjzolB>rCAJ*}+?wt7ta? zwQM+&)7o+57GB5AWGKH=C~II*A>TUH;9S^-O$65lj(f%0fmbY95?+;)1{13&O&QqN zf3K)NE#w@>DyiXVpqhAT3W-sbWomDN?@2j^uTkuBPusU-hmLiaoEwU@@Ihl&*#qaPk(P$h^vJ}8;#;_@+=}pakBeSpDs->Ak2?pc$DqRuyPeC zb$c->{;n|kcfDIDlduD2#|RpEXKlt!xByn|B{JC8I4l6E-W=8Blvxs_lNgn5iBrn8*?qX36Qy*p^?%Qf?)V4hd`V zHnv+P47tD>#?g1kPnax44PR-@(!%? zRQ}}BsM_*L)jjc5Hs5=gpuywbTS!4Vktw-^(8N6m0EGrt->w!C2fn(;O^D2|g*<}# zzZ!=SG|CU4GTDElKXP>xcYYEwiu(?}J_>U{ML1YH?m=aq9%3M{Vt7n}Mh{Eo?MJ-G z!A@$v{m63}ld>taAgvw6>)8Q-jI3OqcNlAyjZjs@q_kcTEq~@g9y2^A)m9ggfZ^#U z+Jtl8;&SXz7%{Hl5!yxW1ZrxUa-n4MZpr00Bjsp6>-H0{BwFDTGD@uD0|Di8b>DSL zdT$x=VsbF zu8ra52P@x%C(52$Ry0q_jP5FlzC+1#s24WXLER|5>A(5uu5r!_@=)|7P*TJ}gw6{G zw);u?+yspR;RQ2(Izpm4!^gqf&-V!G9LtCp7p61kv;gflgpR`_s1T0+$TEQDa4m6n9Z#T@>3wc>S**uHfx;dmuNbmitS;+aB*x&N>zGm++x6n9 zF!+1=UxY!=T=a+agfhhu@n&P9a44RDNx7x?qRh#V>VMV+pphGgIDk;feO|qGb;S70 z7yE=5ow8(PUe7Lj?8U}Tidx$4iRxsy#t6+Fs$P-6q z-Rd~Z>cv=40t3BwDpiFf&r<-eenXf`AfyE89K3b_^{GGwAa@i42KCwr49~%v|I9;9 zewk6+ZGc}evsAval=$U62%SiWeW-(gy0k$tG)&(g+T2BueQ8FPJ5uLD##MV#a1|~) z;UaBl;_Wz(#2@U5(A15!A;u$tlMTr_bDEP3>sLFrqdm9|HXp452sc7Z$_VGxrXRSi z{A`Nc`UH?)Csz6&RuGMEOCKl`ZMz>OhA=n7Q4I}@J`3({?#a<0DTHh0 zd$p4z+pu1)lLR&xox6)j%B|23vbkT1hEkWE;t()|lKpe}$>VcKxk;~mV-au3ss&DQ z5uvImf<|%M2*F3&-a*c__~wJ*c$(G{5?6jnSOzhU2G9mTLk<%(lE~PJI>_=M!yO_3G( zDI_v0iKq;d-R}`6rM~I>9oM~(mobb`oKkeWmyT1wRbusvIAX z147OcMuCZGlTG+#u1(<7JQ9wQS5l!L*K~*7P7BZ#^bHiz+3t!w*<pWgG;ve)ti6k^xu41*QH=P=)p&lyv!v`t;>T?q?CpwZ9PBJw+#Pg`%ahbYW(MJ9K+D#sF3a`>9t#Zjl(~@~aO7A$44kWqz z`rR4d*cES4c#lvy_K5Fz1EkOW4hpP5fGvHU&^>7#5WVJ&CMG)9ZvAERuI=!L%r*q# zdtSphI3GfVZj=g2A*ge!=+5?D>or|=&w9n4^5I2`OX;d1$yw+8q0;V!1__;TCSNAq zeiY3+;*IE}+7$}2fx(I5soMJG4smzIi&~+qt?iUf_T-clb=*a{!>|YEMbSxXSPIg$ z?#sn5kTFk^Nk+?`T2h7OnUO@G@%^6sPoN@A%wY{iMmPsE2t+?sDBcO@&rBY~)ntz9azU2Xqb`)0_7FIHlW>zoC zg8Fo35vfOUj&g2fAZX}};yCf_7#=vCpE~CBg6wb{(2y-#IuV4XNLStCUaun=m15t#>oqR|)D=Z1jdtXyi zzr9w$y*MBOKn`-SS7A3^ih!98=z1xi%!&$L-l0L;avKgm zGb&uBao@7|lDPaGN9F4p7(oy_!0Nfw*fiihSSAVtw0}~WpTF}FZ^=xD+=hQmca+V_ zdUmF)6oRGBgxtzjL%{GDC42lS9~hvaQhzSShtTi8AzobDbrKAONO6SlpP)r9sf2vI z9$#t+EYMTnX24RH-POA%z3+g67J}v5MHoyo1{;X|IB-3DV38}+Q9f=!w?zQ1|FDIe zZ!F{AO_!U#)$0A@S2N@Y2aLBry*XCS_r``p~!VDV448#L6yQOUrf2 zlkYeI%6;wS1E-3ExjeU*4Q@}&6?`MFOa(G99vH(>S3mhHtK3873+L!xAiKax9YyYn z7@i?}n}|NYJ@$qtC=-)7*POJW7qE<#zG0sb`FHhgoyY1S)ABp(Ic>UEI}R=Fn{rIB z8g{L#AP!jO9{5IoT+KzWtmcZsW!CMmK`+N1b{LxCG}i3DgiP1_EZo-Ga@8>gOKD*F z|BvF9_7YO68=XChMs`U_GDz81*-)mhza-CT&p%&8>R_8?6>@jdZ1N3jD(6MOJ2|OF zC7OtXMB=wIKM)xQt) zU%lsfJw3ZG3Lw%dnLmD^&cL`uF%G{hIP4D1n;h$|L(Hf``RHh8WKyRPGw9eW)Ap zF}n_&ksd+T&NklXZ8f61$Lm1dh5~^dk5n1ODcRiti^l*wVS}P)-G_8{6nQ@i3??t# zl!u&OM6$jB9>^IuNkL$W2$4az39MDm)815F*e_>&@b`rzkvOPw!2}uiX|wjzyIN+D zM!J$F+2`Q zBe8L!3(|di5e)}W0-?JRiy6c70Hycm*5Db7Vvh&|&5bN348nx_jS06Xze9LRsqL+Gt8kDVuAkqj(-IGPNs#$2~zT+xE7JdV3kho z`kjZ+=f4^@x|UO-_cnbHfJ@c1V-*Ce;>&PRcQd7&P0l6e z1@tSU|9x#X;P-s423-26GVO3RvGH+|4r^?j-@M5e%q! z;-3l-unrcHP5gq~Fc4S($1Z{So023f?`E~L|E@z(`HrjhEA=U)P$yp6%+Bb5n083t z)+)o3K)Vqx9Mu4MK*Ll4;_0{ONf&-k@wyeRSSo4 zHL2z`Rw&|6z^(vlO#nMyvU5YVdGpa|az3i^c?rEXvYLBNL9RPKmTp}c4SG9dtZUT9 zZ3S8sx=A?iBmV{LgUaclV8b)JmU>w-Qt0R2YUoY2lREA*SA~G$tNZ|x0F5Z0~Z0Je&l6NCw#yiwd>w1>xTFsy~BPzraOUAoaYRmbudQICvE)t+a3G#y9l8}+s3!xUCVam1f{ z2@Q$QxN)tfqnLMXQZR7vY&i5QI9TZIUo2qu`Jn~&oCPuQSR-Vb=#e~ooV+r_HN{4! zoZ5awv0SQO$``6Dh!burNvanSY0A{1PzspWD8>2m-S$zj56iiBlZBuco44x@FO=Dk>&Bf0^zUjjrGMp zb#MQ)7Df!-eer&&hhjFA`YFBwI@!jj)1?R7 zPscv_QY4pEu6+i}BPYPk$pxB$ibBtG5@3?%m6njwl#h5LFq;g4L88~C1{BWl5F)ur z$xPgL%a%G>PM$jE!q35Z)*t$H$kO*Sll;*=Wfkwu5@bk4?q@JOaua+F=WVv5hP*nd zocChQtC5(L&=^GEvr~uME!Rimv%ty$E}_kvC;ScF%{R}OGZI*#n3VGsyC<1ZTpGBz zfj|qO9mPEzW&BGPCp{xH$3R2yC45QHkS~Vlk*X}i02qOnnRy13zwt&1EE#Z+3|uGl z^Yb%7=X-GKzO~)i1mAWs4}g--c{hSV^)%mph3ub!^#kJio6P!KlY

BA(xO6jz4z{UdPwKcHf2dsn#I zVgFTCipRA@B&j(cWvXj3>8We0tcBt(9uUj=rTqQPKn98fniM*mTq`Cr$H z%!iEOZqpSe?;uLR-WQ+vN}pm}Tp&kmLsHMuad+PfG;TOo`(?o&?{s&!JzTKjyc7mdb^xhhq^xz^2EhES`P;pnv<@|)Xc*955dSxv)<5=fH|rovbVHd5BJ>~S(OEEr@fqs< z5~U@Y-v0ch(~j$kZT(>WsBwlq_h0Xkp9*TH@{$Owy1sUFuWIY*E(B0{2~C}0#K(g9 ziktu9=o)ng6|4vD4dCkFwYblE{)IIvIJ+gRqf8Elt932gQ&Ku zW&g|z7m163|ym0UMh5v>C?G2>jCDy0qo8OJX49 z{I9lYI_wDZc)Egq$EFn1+{Ok4mk5!0nYOzON92mY8O!BJg^Cs zcexp5FK3&35EYz0K=mi|;Z9u=02fSffcRBwCH<;GYN5 zgFTImJv!DofG>)@IS!2BEjciJmU_uEWV3(ds zG?_d-WK@5@{@bg|026Nwi{{FCWaTQHX+%sPsQM{Bo6uxSe`p9g`YS;K=!zLw^Ca-; zfI9k7^G3t&jq=`bzHYN>GyP_#34*Yl7C7|M%K(jM2f&@=>wmi2y@2hu3!Hy8OryBN zU+s6VdJ=zh^>q2YS`3;BJg3M%Hb&&Yd7a_ZAxVQ?(!SbEm+c>2rbz!&pcQR{(fv?9J_MV$BBr^|Rm zj{(uy`Sm=pBUNla2Z=uknyTjVUFTLdgtYO#e_zMCcM9+2wB?Yha|<*I1Yolf#h zGh}OpXifxp!4!UuY*p#xGz3Yb7 zfO~af1tRJ>Ii;1N7#`_cGAE2bv7Zv%2HoDwZ4c!c^NdtXO5L+ZwQHD}-&qNfL;yrl z)m_?=mcB!DhbJraZ=Q1h6(#=W!o6Pxjf#u!`^R&x9ut^V)1#m!R4;gv#0%cTujG14 z5q*l)#6dMM-FTN2kv*3q&uM4Io3*bFaL5Hx^lcV%ISX0)ah!@-#-@Oe%7Ad2(N=se z8Jfys<2>f6xp7+-(b-SB_;j}GtFJVT&`uqEvBGgO@nkj=%G%uf&RlMuTAaciZ8nbl z%P8yfBC_%lOmxyqMtc;n?Zzgdg%FSo=of0>QIOK;1(LDyXh?gap)S_l?2X7`(! zQJ>C&F8o&yvu_c3U>cmpz)>uIx7|O7NilA1xi4rb4;oR9c;K${m-F^1UP+ar^P*gM zVScw=(K(A?*BcfQP?JTNhp1A27a`G2iHri<55j93hkMr(EWr$%DcW3-yvcA%oB#~y8Ai|;^;1r{)10^R@y8#7veg@ChPEBKw?HQq%TsZeF_7`9WGecd!t3QHlenoaS?W-gz?9-b zPkby#%jG_m^9UUieZ-C9h9w`v(~sg?XK`kZnwvw>~iIFAsQkP&>U4CSf= zt*&8$cID4GXw!qae!o|un3SSPuWL^QRYA7*I)cWwPT(` jfRz8I^YP)-9mYGY$4Wv})hxh=RQIS{Q&Y-A-u3@KY&Vc| literal 0 HcmV?d00001 diff --git a/editor/resources/knob48@2x.png b/editor/resources/knob48@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2f8d49e67d3ca65f4cf0ccc8ac447557fc08129f GIT binary patch literal 109207 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

jLW!z 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 literal 0 HcmV?d00001 diff --git a/editor/resources/logo_text.png b/editor/resources/logo_text.png new file mode 100644 index 0000000000000000000000000000000000000000..d683e44e1a582f68ca4ce15119afafea6b358c49 GIT binary patch literal 5414 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 + + sfizz logo + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + sfizz logo + 2020-05-16 + + + Tobiasz 'unfa' Karoń + + + + + CC-0 + + + + + + + + + + + + + + + diff --git a/editor/resources/logo_text@2x.png b/editor/resources/logo_text@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c3e28c637e5168d34c6262c2ed284a4871e6cc06 GIT binary patch literal 10935 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 z +#include +#include #include #include @@ -18,19 +21,20 @@ using namespace VSTGUI; -const int Editor::viewWidth { 482 }; -const int Editor::viewHeight { 225 }; +const int Editor::viewWidth { 800 }; +const int Editor::viewHeight { 475 }; struct Editor::Impl : EditorController::Receiver, IControlListener { EditorController* ctrl_ = nullptr; CFrame* frame_ = nullptr; - SharedPointer view_; + SharedPointer mainView_; + + std::string currentSfzFile_; enum { kPanelGeneral, - // kPanelControls, + kPanelControls, kPanelSettings, - kPanelTuning, kPanelInfo, kNumPanels, }; @@ -40,6 +44,7 @@ struct Editor::Impl : EditorController::Receiver, IControlListener { enum { kTagLoadSfzFile, + kTagEditSfzFile, kTagSetVolume, kTagSetNumVoices, kTagSetOversampling, @@ -54,19 +59,21 @@ struct Editor::Impl : EditorController::Receiver, IControlListener { CTextLabel* sfzFileLabel_ = nullptr; CTextLabel* scalaFileLabel_ = nullptr; - CSliderBase *volumeSlider_ = nullptr; + CTextButton* scalaFileButton_ = nullptr; + CControl *volumeSlider_ = nullptr; CTextLabel* volumeLabel_ = nullptr; - CSliderBase *numVoicesSlider_ = nullptr; + SValueMenu *numVoicesSlider_ = nullptr; CTextLabel* numVoicesLabel_ = nullptr; - CSliderBase *oversamplingSlider_ = nullptr; + SValueMenu *oversamplingSlider_ = nullptr; CTextLabel* oversamplingLabel_ = nullptr; - CSliderBase *preloadSizeSlider_ = nullptr; + SValueMenu *preloadSizeSlider_ = nullptr; CTextLabel* preloadSizeLabel_ = nullptr; - CSliderBase *scalaRootKeySlider_ = nullptr; + SValueMenu *scalaRootKeySlider_ = nullptr; + SValueMenu *scalaRootOctaveSlider_ = nullptr; CTextLabel* scalaRootKeyLabel_ = nullptr; - CSliderBase *tuningFrequencySlider_ = nullptr; + SValueMenu *tuningFrequencySlider_ = nullptr; CTextLabel* tuningFrequencyLabel_ = nullptr; - CSliderBase *stretchedTuningSlider_ = nullptr; + CControl *stretchedTuningSlider_ = nullptr; CTextLabel* stretchedTuningLabel_ = nullptr; CTextLabel* infoCurvesLabel_ = nullptr; @@ -76,6 +83,8 @@ struct Editor::Impl : EditorController::Receiver, IControlListener { CTextLabel* infoSamplesLabel_ = nullptr; CTextLabel* infoVoicesLabel_ = nullptr; + CTextLabel* memoryLabel_ = nullptr; + void uiReceiveValue(EditId id, const EditValue& v) override; void createFrameContents(); @@ -90,11 +99,16 @@ struct Editor::Impl : EditorController::Receiver, IControlListener { } void chooseSfzFile(); + void changeSfzFile(const std::string& filePath); void chooseScalaFile(); + void changeScalaFile(const std::string& filePath); + + static absl::string_view simplifiedFileName(absl::string_view path, absl::string_view removedSuffix, absl::string_view ifEmpty); void updateSfzFileLabel(const std::string& filePath); void updateScalaFileLabel(const std::string& filePath); - static void updateLabelWithFileName(CTextLabel* label, const std::string& filePath); + static void updateLabelWithFileName(CTextLabel* label, const std::string& filePath, absl::string_view removedSuffix); + static void updateButtonWithFileName(CTextButton* button, const std::string& filePath, absl::string_view removedSuffix); void updateVolumeLabel(float volume); void updateNumVoicesLabel(int numVoices); void updateOversamplingLabel(int oversamplingLog2); @@ -142,7 +156,7 @@ void Editor::open(CFrame& frame) Impl& impl = *impl_; impl.frame_ = &frame; - frame.addView(impl.view_.get()); + frame.addView(impl.mainView_.get()); } void Editor::close() @@ -150,7 +164,7 @@ void Editor::close() Impl& impl = *impl_; if (impl.frame_) { - impl.frame_->removeView(impl.view_.get(), false); + impl.frame_->removeView(impl.mainView_.get(), false); impl.frame_ = nullptr; } } @@ -161,22 +175,27 @@ void Editor::Impl::uiReceiveValue(EditId id, const EditValue& v) case EditId::SfzFile: { const std::string& value = v.to_string(); + currentSfzFile_ = value; updateSfzFileLabel(value); } break; case EditId::Volume: { const float value = v.to_float(); - if (volumeSlider_) + if (volumeSlider_) { volumeSlider_->setValue(value); + volumeSlider_->setDirty(); + } updateVolumeLabel(value); } break; case EditId::Polyphony: { const int value = static_cast(v.to_float()); - if (numVoicesSlider_) + if (numVoicesSlider_) { numVoicesSlider_->setValue(value); + numVoicesSlider_->setDirty(); + } updateNumVoicesLabel(value); } break; @@ -188,16 +207,20 @@ void Editor::Impl::uiReceiveValue(EditId id, const EditValue& v) for (int f = value; f > 1; f /= 2) ++log2Value; - if (oversamplingSlider_) + if (oversamplingSlider_) { oversamplingSlider_->setValue(log2Value); + oversamplingSlider_->setDirty(); + } updateOversamplingLabel(log2Value); } break; case EditId::PreloadSize: { const int value = static_cast(v.to_float()); - if (preloadSizeSlider_) + if (preloadSizeSlider_) { preloadSizeSlider_->setValue(value); + preloadSizeSlider_->setDirty(); + } updatePreloadSizeLabel(value); } break; @@ -209,25 +232,35 @@ void Editor::Impl::uiReceiveValue(EditId id, const EditValue& v) break; case EditId::ScalaRootKey: { - const int value = static_cast(v.to_float()); - if (scalaRootKeySlider_) - scalaRootKeySlider_->setValue(value); + const int value = std::max(0, static_cast(v.to_float())); + if (scalaRootKeySlider_) { + scalaRootKeySlider_->setValue(value % 12); + scalaRootKeySlider_->setDirty(); + } + if (scalaRootOctaveSlider_) { + scalaRootOctaveSlider_->setValue(value / 12); + scalaRootOctaveSlider_->setDirty(); + } updateScalaRootKeyLabel(value); } break; case EditId::TuningFrequency: { const float value = v.to_float(); - if (tuningFrequencySlider_) + if (tuningFrequencySlider_) { tuningFrequencySlider_->setValue(value); + tuningFrequencySlider_->setDirty(); + } updateTuningFrequencyLabel(value); } break; case EditId::StretchTuning: { const float value = v.to_float(); - if (stretchedTuningSlider_) + if (stretchedTuningSlider_) { stretchedTuningSlider_->setValue(value); + stretchedTuningSlider_->setDirty(); + } updateStretchedTuningLabel(value); } break; @@ -284,405 +317,319 @@ void Editor::Impl::uiReceiveValue(EditId id, const EditValue& v) void Editor::Impl::createFrameContents() { - const CRect bounds { 0.0, 0.0, static_cast(viewWidth), static_cast(viewHeight) }; - CViewContainer* view = new CViewContainer(bounds); - view_ = owned(view); + CViewContainer* mainView; - view->setBackgroundColor(CColor(0xff, 0xff, 0xff)); + SharedPointer iconWhite = owned(new CBitmap("icon_white.png")); + SharedPointer knob48 = owned(new CBitmap("knob48.png")); + SharedPointer logoText = owned(new CBitmap("logo_text.png")); - SharedPointer logo = owned(new CBitmap("logo.png")); + { + const CColor frameBackground = { 0xd3, 0xd7, 0xcf }; - CRect bottomRow = bounds; - bottomRow.top = bottomRow.bottom - 30; + struct Theme { + CColor boxBackground; + CColor text; + CColor titleBoxText; + CColor titleBoxBackground; + CColor icon; + CColor valueText; + CColor valueBackground; + }; - CRect topRow = bounds; - topRow.bottom = topRow.top + 30; + Theme lightTheme; + lightTheme.boxBackground = { 0xba, 0xbd, 0xb6 }; + lightTheme.text = { 0x00, 0x00, 0x00 }; + lightTheme.titleBoxText = { 0xff, 0xff, 0xff }; + lightTheme.titleBoxBackground = { 0x2e, 0x34, 0x36 }; + lightTheme.icon = lightTheme.text; + lightTheme.valueText = { 0xff, 0xff, 0xff }; + lightTheme.valueBackground = { 0x2e, 0x34, 0x36 }; + Theme darkTheme; + darkTheme.boxBackground = { 0x2e, 0x34, 0x36 }; + darkTheme.text = { 0xff, 0xff, 0xff }; + darkTheme.titleBoxText = { 0x00, 0x00, 0x00 }; + darkTheme.titleBoxBackground = { 0xba, 0xbd, 0xb6 }; + darkTheme.icon = darkTheme.text; + darkTheme.valueText = { 0x2e, 0x34, 0x36 }; + darkTheme.valueBackground = { 0xff, 0xff, 0xff }; + Theme& defaultTheme = lightTheme; + Theme* theme = &defaultTheme; + auto enterTheme = [&theme](Theme& t) { theme = &t; }; + + typedef CViewContainer LogicalGroup; + typedef SBoxContainer RoundedGroup; + typedef STitleContainer TitleGroup; + typedef CKickButton SfizzMainButton; + typedef CTextLabel Label; + typedef CViewContainer HLine; + typedef CTextButton LightButton; + typedef CAnimKnob Knob48; + typedef CTextLabel ValueLabel; + typedef CViewContainer VMeter; + typedef CView SfizzLargePicture; + typedef SValueMenu ValueMenu; +#if 0 + typedef CTextButton Button; +#endif + typedef CTextButton ValueButton; + typedef CTextButton LoadFileButton; + typedef CTextButton EditFileButton; + typedef SPiano Piano; + + auto createLogicalGroup = [](const CRect& bounds, int, const char*, CHoriTxtAlign, int) { + CViewContainer* container = new CViewContainer(bounds); + container->setBackgroundColor(CColor(0x00, 0x00, 0x00, 0x00)); + return container; + }; + auto createRoundedGroup = [&theme](const CRect& bounds, int, const char*, CHoriTxtAlign, int) { + auto* box = new SBoxContainer(bounds); + box->setCornerRadius(10.0); + box->setBackgroundColor(theme->boxBackground); + return box; + }; + auto createTitleGroup = [&theme](const CRect& bounds, int, const char* label, CHoriTxtAlign, int fontsize) { + auto* box = new STitleContainer(bounds, label); + box->setCornerRadius(10.0); + box->setBackgroundColor(theme->boxBackground); + box->setTitleFontColor(theme->titleBoxText); + box->setTitleBackgroundColor(theme->titleBoxBackground); + auto font = owned(new CFontDesc(*box->getTitleFont())); + font->setSize(fontsize); + box->setTitleFont(font); + return box; + }; + auto createSfizzMainButton = [this, &iconWhite](const CRect& bounds, int tag, const char*, CHoriTxtAlign, int) { + return new CKickButton(bounds, this, tag, iconWhite); + }; + auto createLabel = [&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->text); + lbl->setHoriAlign(align); + auto font = owned(new CFontDesc(*lbl->getFont())); + font->setSize(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); + CViewContainer* hline = new CViewContainer(lineBounds); + hline->setBackgroundColor(CColor(0xff, 0xff, 0xff, 0xff)); + return hline; + }; + auto createLightButton = [this](const CRect& bounds, int tag, const char* label, CHoriTxtAlign align, int) { + CTextButton* button = new CTextButton(bounds, this, tag, label); + button->setTextAlignment(align); + return button; + }; + auto createKnob48 = [this, &knob48](const CRect& bounds, int tag, const char*, CHoriTxtAlign, int) { + return new CAnimKnob(bounds, this, tag, 31, 48, knob48); + }; + auto createValueLabel = [&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->text); + lbl->setHoriAlign(align); + auto font = owned(new CFontDesc(*lbl->getFont())); + font->setSize(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); + container->setBackgroundColor(CColor(0x00, 0x00, 0x00, 0x00)); + return container; + }; + auto createSfizzLargePicture = [&logoText](const CRect& bounds, int, const char*, CHoriTxtAlign, int) { + CView* picture = new CView(bounds); + picture->setBackground(logoText); + return picture; + }; +#if 0 + auto createButton = [this](const CRect& bounds, int tag, const char* label, CHoriTxtAlign align, int fontsize) { + CTextButton* button = new CTextButton(bounds, this, tag, label); + auto font = owned(new CFontDesc(*button->getFont())); + font->setSize(fontsize); + button->setFont(font); + button->setTextAlignment(align); + return button; + }; +#endif + auto createValueButton = [this, &theme](const CRect& bounds, int tag, const char* label, CHoriTxtAlign align, int fontsize) { + CTextButton* button = new CTextButton(bounds, this, tag, label); + auto font = owned(new CFontDesc(*button->getFont())); + font->setSize(fontsize); + button->setFont(font); + button->setTextAlignment(align); + button->setTextColor(theme->valueText); + button->setFrameColor(CColor(0x00, 0x00, 0x00, 0x00)); + SharedPointer gradient = owned(CGradient::create(0.0, 1.0, theme->valueBackground, theme->valueBackground)); + button->setGradient(gradient); + button->setGradientHighlighted(gradient); + return button; + }; + auto createValueMenu = [this, &theme](const CRect& bounds, int tag, const char*, CHoriTxtAlign align, int fontsize) { + SValueMenu* vm = new SValueMenu(bounds, this, tag); + vm->setHoriAlign(align); + auto font = owned(new CFontDesc(*vm->getFont())); + font->setSize(fontsize); + vm->setFont(font); + vm->setFontColor(theme->valueText); + vm->setBackColor(theme->valueBackground); + vm->setFrameColor(CColor(0x00, 0x00, 0x00, 0x00)); + vm->setStyle(CParamDisplay::kRoundRectStyle); + vm->setRoundRectRadius(5.0); + return vm; + }; + auto createGlyphButton = [this, &theme](UTF8StringPtr glyph, const CRect& bounds, int tag, int fontsize) { + CTextButton* btn = new CTextButton(bounds, this, tag, glyph); + btn->setFont(new CFontDesc("Fluent System Regular W20", fontsize)); + btn->setTextColor(theme->icon); + btn->setFrameColor(CColor(0x00, 0x00, 0x00, 0x00)); + btn->setGradient(nullptr); + btn->setGradientHighlighted(nullptr); + return btn; + }; + auto createLoadFileButton = [&createGlyphButton](const CRect& bounds, int tag, const char*, CHoriTxtAlign, int fontsize) { + return createGlyphButton("\ue142", bounds, tag, fontsize); + }; + auto createEditFileButton = [&createGlyphButton](const CRect& bounds, int tag, const char*, CHoriTxtAlign, int fontsize) { + return createGlyphButton("\ue148", bounds, tag, fontsize); + }; + auto createPiano = [](const CRect& bounds, int, const char*, CHoriTxtAlign, int) { + SPiano* piano = new SPiano(bounds); + return piano; + }; + + #include "layout/main.hpp" + + mainView->setBackgroundColor(frameBackground); + + mainView_ = owned(mainView); + } + + /// + SharedPointer fileDropTarget = owned(new SFileDropTarget); + + fileDropTarget->setFileDropFunction([this](const std::string& file) { + changeSfzFile(file); + }); + + mainView_->setDropTarget(fileDropTarget); + + /// + adjustMinMaxToEditRange(volumeSlider_, EditId::Volume); + adjustMinMaxToEditRange(numVoicesSlider_, EditId::Polyphony); + adjustMinMaxToEditRange(oversamplingSlider_, EditId::Oversampling); + adjustMinMaxToEditRange(preloadSizeSlider_, EditId::PreloadSize); + if (scalaRootKeySlider_) { + scalaRootKeySlider_->setMin(0.0); + scalaRootKeySlider_->setMax(11.0); + scalaRootKeySlider_->setDefaultValue( + static_cast(EditRange::get(EditId::ScalaRootKey).def) % 12); + } + if (scalaRootOctaveSlider_) { + scalaRootOctaveSlider_->setMin(0.0); + scalaRootOctaveSlider_->setMax(10.0); + scalaRootOctaveSlider_->setDefaultValue( + static_cast(EditRange::get(EditId::ScalaRootKey).def) / 12); + } + adjustMinMaxToEditRange(tuningFrequencySlider_, EditId::TuningFrequency); + adjustMinMaxToEditRange(stretchedTuningSlider_, EditId::StretchTuning); + + for (int value : {1, 2, 4, 8, 16, 32, 64, 96, 128, 160, 192, 224, 256}) + numVoicesSlider_->addEntry(std::to_string(value), value); + numVoicesSlider_->setValueToStringFunction2( + [](float value, std::string& result, CParamDisplay*) -> bool + { + result = std::to_string(static_cast(value)); + return true; + }); + + for (int log2value = 0; log2value <= 3; ++log2value) { + int value = 1 << log2value; + oversamplingSlider_->addEntry(std::to_string(value) + "x", log2value); + } + oversamplingSlider_->setValueToStringFunction2( + [](float value, std::string& result, CParamDisplay*) -> bool + { + result = std::to_string(1 << static_cast(value)) + "x"; + return true; + }); + + for (int log2value = 10; log2value <= 16; ++log2value) { + int value = 1 << log2value; + char text[256]; + sprintf(text, "%d kB", value / 1024); + text[sizeof(text) - 1] = '\0'; + preloadSizeSlider_->addEntry(text, value); + } + preloadSizeSlider_->setValueToStringFunction2( + [](float value, std::string& result, CParamDisplay*) -> bool + { + result = std::to_string(static_cast(std::round(value * (1.0 / 1024)))) + " kB"; + return true; + }); + + static const std::pair tuningFrequencies[] = { + {380.0f, "English pitchpipe 380 (1720)"}, + {409.0f, "Handel fork 409 (1780)"}, + {415.0f, "Baroque 415"}, + {422.5f, "Handel fork 422.5 (1740)"}, + {423.2f, "Dresden opera 423.2 (1815)"}, + {435.0f, "French Law 435 (1859)"}, + {439.0f, "British Phil 439 (1896)"}, + {440.0f, "International 440"}, + {442.0f, "European 442"}, + {445.0f, "Germany, China 445"}, + {451.0f, "La Scala in Milan 451 (18th)"}, + }; + + for (std::pair value : tuningFrequencies) + tuningFrequencySlider_->addEntry(value.second, value.first); + tuningFrequencySlider_->setValueToStringFunction( + [](float value, char result[256], CParamDisplay*) -> bool + { + sprintf(result, "%.1f Hz", value); + return true; + }); + + static const char* notesInOctave[12] = { + "C", "C#", "D", "D#", "E", + "F", "F#", "G", "G#", "A", "A#", "B", + }; + for (int note = 0; note < 12; ++note) + scalaRootKeySlider_->addEntry(notesInOctave[note], note); + for (int octave = 0; octave <= 10; ++octave) + scalaRootOctaveSlider_->addEntry(std::to_string(octave - 1), octave); + scalaRootKeySlider_->setValueToStringFunction2( + [](float value, std::string& result, CParamDisplay*) -> bool + { + result = notesInOctave[std::max(0, static_cast(value)) % 12]; + return true; + }); + scalaRootOctaveSlider_->setValueToStringFunction2( + [](float value, std::string& result, CParamDisplay*) -> bool + { + result = std::to_string(static_cast(value) - 1); + return true; + }); + + /// CViewContainer* panel; activePanel_ = 0; - CRect topLeftLabelBox = topRow; - topLeftLabelBox.right -= 20 * kNumPanels; - - // general panel - { - panel = new CViewContainer(bounds); - view->addView(panel); - panel->setTransparency(true); - - CKickButton* sfizzButton = new CKickButton(bounds, this, kTagLoadSfzFile, logo); - panel->addView(sfizzButton); - - CTextLabel* topLeftLabel = new CTextLabel(topLeftLabelBox, "No file loaded"); - topLeftLabel->setFontColor(CColor(0x00, 0x00, 0x00)); - topLeftLabel->setBackColor(CColor(0x00, 0x00, 0x00, 0x00)); - panel->addView(topLeftLabel); - sfzFileLabel_ = topLeftLabel; - - subPanels_[kPanelGeneral] = panel; - } - - // settings panel - { - panel = new CViewContainer(bounds); - view->addView(panel); - panel->setTransparency(true); - - CTextLabel* topLeftLabel = new CTextLabel(topLeftLabelBox, "Settings"); - topLeftLabel->setFontColor(CColor(0x00, 0x00, 0x00)); - topLeftLabel->setBackColor(CColor(0x00, 0x00, 0x00, 0x00)); - panel->addView(topLeftLabel); - - CRect row = topRow; - row.top += 45.0; - row.bottom += 45.0; - row.left += 20.0; - row.right -= 20.0; - - static const CCoord interRow = 35.0; - static const CCoord interColumn = 20.0; - static const int numColumns = 3; - - auto nthColumn = [&row](int colIndex) -> CRect { - CRect div = row; - CCoord columnWidth = (div.right - div.left + interColumn) / numColumns - interColumn; - div.left = div.left + colIndex * (columnWidth + interColumn); - div.right = div.left + columnWidth; - return div; - }; - - CTextLabel* label; - SimpleSlider* slider; - - label = new CTextLabel(nthColumn(0), "Volume"); - label->setFontColor(CColor(0x00, 0x00, 0x00)); - label->setFrameColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setBackColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setHoriAlign(kLeftText); - panel->addView(label); - slider = new SimpleSlider(nthColumn(1), this, kTagSetVolume); - panel->addView(slider); - adjustMinMaxToEditRange(slider, EditId::Volume); - volumeSlider_ = slider; - label = new CTextLabel(nthColumn(2), ""); - volumeLabel_ = label; - panel->addView(label); - - row.top += interRow; - row.bottom += interRow; - - label = new CTextLabel(nthColumn(0), "Polyphony"); - label->setFontColor(CColor(0x00, 0x00, 0x00)); - label->setFrameColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setBackColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setHoriAlign(kLeftText); - panel->addView(label); - slider = new SimpleSlider(nthColumn(1), this, kTagSetNumVoices); - panel->addView(slider); - adjustMinMaxToEditRange(slider, EditId::Polyphony); - numVoicesSlider_ = slider; - label = new CTextLabel(nthColumn(2), ""); - numVoicesLabel_ = label; - panel->addView(label); - - row.top += interRow; - row.bottom += interRow; - - label = new CTextLabel(nthColumn(0), "Oversampling"); - label->setFontColor(CColor(0x00, 0x00, 0x00)); - label->setFrameColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setBackColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setHoriAlign(kLeftText); - panel->addView(label); - slider = new SimpleSlider(nthColumn(1), this, kTagSetOversampling); - panel->addView(slider); - adjustMinMaxToEditRange(slider, EditId::Oversampling); - oversamplingSlider_ = slider; - label = new CTextLabel(nthColumn(2), ""); - oversamplingLabel_ = label; - panel->addView(label); - - row.top += interRow; - row.bottom += interRow; - - label = new CTextLabel(nthColumn(0), "Preload size"); - label->setFontColor(CColor(0x00, 0x00, 0x00)); - label->setFrameColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setBackColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setHoriAlign(kLeftText); - panel->addView(label); - slider = new SimpleSlider(nthColumn(1), this, kTagSetPreloadSize); - panel->addView(slider); - adjustMinMaxToEditRange(slider, EditId::PreloadSize); - preloadSizeSlider_ = slider; - label = new CTextLabel(nthColumn(2), ""); - preloadSizeLabel_ = label; - panel->addView(label); - - subPanels_[kPanelSettings] = panel; - } - - // tuning panel - { - panel = new CViewContainer(bounds); - view->addView(panel); - panel->setTransparency(true); - - CTextLabel* topLeftLabel = new CTextLabel(topLeftLabelBox, "Tuning"); - topLeftLabel->setFontColor(CColor(0x00, 0x00, 0x00)); - topLeftLabel->setBackColor(CColor(0x00, 0x00, 0x00, 0x00)); - panel->addView(topLeftLabel); - - CRect row = topRow; - row.top += 45.0; - row.bottom += 45.0; - row.left += 20.0; - row.right -= 20.0; - - static const CCoord interRow = 35.0; - static const CCoord interColumn = 20.0; - static const int numColumns = 3; - - auto nthColumn = [&row](int colIndex) -> CRect { - CRect div = row; - CCoord columnWidth = (div.right - div.left + interColumn) / numColumns - interColumn; - div.left = div.left + colIndex * (columnWidth + interColumn); - div.right = div.left + columnWidth; - return div; - }; - - CTextLabel* label; - SimpleSlider* slider; - CTextButton* textbutton; - - label = new CTextLabel(nthColumn(0), "Scala file"); - label->setFontColor(CColor(0x00, 0x00, 0x00)); - label->setFrameColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setBackColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setHoriAlign(kLeftText); - panel->addView(label); - textbutton = new CTextButton(nthColumn(1), this, kTagLoadScalaFile, "Choose"); - panel->addView(textbutton); - label = new CTextLabel(nthColumn(2), ""); - scalaFileLabel_ = label; - panel->addView(label); - - row.top += interRow; - row.bottom += interRow; - - label = new CTextLabel(nthColumn(0), "Scala root key"); - label->setFontColor(CColor(0x00, 0x00, 0x00)); - label->setFrameColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setBackColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setHoriAlign(kLeftText); - panel->addView(label); - slider = new SimpleSlider(nthColumn(1), this, kTagSetScalaRootKey); - panel->addView(slider); - adjustMinMaxToEditRange(slider, EditId::ScalaRootKey); - scalaRootKeySlider_ = slider; - label = new CTextLabel(nthColumn(2), ""); - scalaRootKeyLabel_ = label; - panel->addView(label); - - row.top += interRow; - row.bottom += interRow; - - label = new CTextLabel(nthColumn(0), "Tuning frequency"); - label->setFontColor(CColor(0x00, 0x00, 0x00)); - label->setFrameColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setBackColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setHoriAlign(kLeftText); - panel->addView(label); - slider = new SimpleSlider(nthColumn(1), this, kTagSetTuningFrequency); - panel->addView(slider); - adjustMinMaxToEditRange(slider, EditId::TuningFrequency); - tuningFrequencySlider_ = slider; - label = new CTextLabel(nthColumn(2), ""); - tuningFrequencyLabel_ = label; - panel->addView(label); - - row.top += interRow; - row.bottom += interRow; - - label = new CTextLabel(nthColumn(0), "Stretched tuning"); - label->setFontColor(CColor(0x00, 0x00, 0x00)); - label->setFrameColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setBackColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setHoriAlign(kLeftText); - panel->addView(label); - slider = new SimpleSlider(nthColumn(1), this, kTagSetStretchedTuning); - panel->addView(slider); - adjustMinMaxToEditRange(slider, EditId::StretchTuning); - stretchedTuningSlider_ = slider; - label = new CTextLabel(nthColumn(2), ""); - stretchedTuningLabel_ = label; - panel->addView(label); - - subPanels_[kPanelTuning] = panel; - } - - // info panel - { - panel = new CViewContainer(bounds); - view->addView(panel); - panel->setTransparency(true); - - CTextLabel* topLeftLabel = new CTextLabel(topLeftLabelBox, "Information"); - topLeftLabel->setFontColor(CColor(0x00, 0x00, 0x00)); - topLeftLabel->setBackColor(CColor(0x00, 0x00, 0x00, 0x00)); - panel->addView(topLeftLabel); - - CRect row = topRow; - row.top += 45.0; - row.bottom += 45.0; - row.left += 20.0; - row.right -= 20.0; - - static const CCoord interRow = 20.0; - static const CCoord interColumn = 20.0; - static const int numColumns = 3; - - auto nthColumn = [&row](int colIndex) -> CRect { - CRect div = row; - CCoord columnWidth = (div.right - div.left + interColumn) / numColumns - interColumn; - div.left = div.left + colIndex * (columnWidth + interColumn); - div.right = div.left + columnWidth; - return div; - }; - - CTextLabel* label; - - label = new CTextLabel(nthColumn(0), "Curves"); - label->setFontColor(CColor(0x00, 0x00, 0x00)); - label->setFrameColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setBackColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setHoriAlign(kLeftText); - panel->addView(label); - label = new CTextLabel(nthColumn(1), ""); - label->setFontColor(CColor(0x00, 0x00, 0x00)); - label->setFrameColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setBackColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setHoriAlign(kLeftText); - infoCurvesLabel_ = label; - panel->addView(label); - - row.top += interRow; - row.bottom += interRow; - - label = new CTextLabel(nthColumn(0), "Masters"); - label->setFontColor(CColor(0x00, 0x00, 0x00)); - label->setFrameColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setBackColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setHoriAlign(kLeftText); - panel->addView(label); - label = new CTextLabel(nthColumn(1), ""); - label->setFontColor(CColor(0x00, 0x00, 0x00)); - label->setFrameColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setBackColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setHoriAlign(kLeftText); - infoMastersLabel_ = label; - panel->addView(label); - - row.top += interRow; - row.bottom += interRow; - - label = new CTextLabel(nthColumn(0), "Groups"); - label->setFontColor(CColor(0x00, 0x00, 0x00)); - label->setFrameColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setBackColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setHoriAlign(kLeftText); - panel->addView(label); - label = new CTextLabel(nthColumn(1), ""); - label->setFontColor(CColor(0x00, 0x00, 0x00)); - label->setFrameColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setBackColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setHoriAlign(kLeftText); - infoGroupsLabel_ = label; - panel->addView(label); - - row.top += interRow; - row.bottom += interRow; - - label = new CTextLabel(nthColumn(0), "Regions"); - label->setFontColor(CColor(0x00, 0x00, 0x00)); - label->setFrameColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setBackColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setHoriAlign(kLeftText); - panel->addView(label); - label = new CTextLabel(nthColumn(1), ""); - label->setFontColor(CColor(0x00, 0x00, 0x00)); - label->setFrameColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setBackColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setHoriAlign(kLeftText); - infoRegionsLabel_ = label; - panel->addView(label); - - row.top += interRow; - row.bottom += interRow; - - label = new CTextLabel(nthColumn(0), "Samples"); - label->setFontColor(CColor(0x00, 0x00, 0x00)); - label->setFrameColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setBackColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setHoriAlign(kLeftText); - panel->addView(label); - label = new CTextLabel(nthColumn(1), ""); - label->setFontColor(CColor(0x00, 0x00, 0x00)); - label->setFrameColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setBackColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setHoriAlign(kLeftText); - infoSamplesLabel_ = label; - panel->addView(label); - - row.top += interRow; - row.bottom += interRow; - - label = new CTextLabel(nthColumn(0), "Voices"); - label->setFontColor(CColor(0x00, 0x00, 0x00)); - label->setFrameColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setBackColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setHoriAlign(kLeftText); - panel->addView(label); - label = new CTextLabel(nthColumn(1), ""); - label->setFontColor(CColor(0x00, 0x00, 0x00)); - label->setFrameColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setBackColor(CColor(0x00, 0x00, 0x00, 0x00)); - label->setHoriAlign(kLeftText); - infoVoicesLabel_ = label; - panel->addView(label); - - subPanels_[kPanelInfo] = panel; - } - // all panels for (unsigned currentPanel = 0; currentPanel < kNumPanels; ++currentPanel) { panel = subPanels_[currentPanel]; - CTextLabel* descLabel = new CTextLabel( - bottomRow, "Paul Ferrand and the SFZ Tools work group"); - descLabel->setFontColor(CColor(0x00, 0x00, 0x00)); - descLabel->setBackColor(CColor(0x00, 0x00, 0x00, 0x00)); - panel->addView(descLabel); - - for (unsigned i = 0; i < kNumPanels; ++i) { - CRect btnRect = topRow; - btnRect.left = topRow.right - (kNumPanels - i) * 50; - btnRect.right = btnRect.left + 50; - - const char *text; - switch (i) { - case kPanelGeneral: text = "File"; break; - case kPanelSettings: text = "Setup"; break; - case kPanelTuning: text = "Tuning"; break; - case kPanelInfo: text = "Info"; break; - default: text = "?"; break; - } - - CTextButton* changePanelButton = new CTextButton(btnRect, this, kTagFirstChangePanel + i, text); - panel->addView(changePanelButton); - - changePanelButton->setRoundRadius(0.0); - } + if (!panel) + continue; panel->setVisible(currentPanel == activePanel_); } @@ -697,14 +644,18 @@ void Editor::Impl::chooseSfzFile() if (fs->runModal()) { UTF8StringPtr file = fs->getSelectedFile(0); - if (file) { - std::string str(file); - ctrl_->uiSendValue(EditId::SfzFile, str); - updateSfzFileLabel(str); - } + if (file) + changeSfzFile(file); } } +void Editor::Impl::changeSfzFile(const std::string& filePath) +{ + ctrl_->uiSendValue(EditId::SfzFile, filePath); + currentSfzFile_ = filePath; + updateSfzFileLabel(filePath); +} + void Editor::Impl::chooseScalaFile() { SharedPointer fs = owned(CNewFileSelector::create(frame_)); @@ -714,42 +665,64 @@ void Editor::Impl::chooseScalaFile() if (fs->runModal()) { UTF8StringPtr file = fs->getSelectedFile(0); - if (file) { - std::string str(file); - ctrl_->uiSendValue(EditId::ScalaFile, str); - updateScalaFileLabel(str); - } + if (file) + changeScalaFile(file); } } +void Editor::Impl::changeScalaFile(const std::string& filePath) +{ + ctrl_->uiSendValue(EditId::ScalaFile, filePath); + updateScalaFileLabel(filePath); +} + +absl::string_view Editor::Impl::simplifiedFileName(absl::string_view path, absl::string_view removedSuffix, absl::string_view ifEmpty) +{ + if (path.empty()) + return ifEmpty; + +#if defined (_WIN32) + size_t pos = path.find_last_of("/\\"); +#else + size_t pos = path.rfind('/'); +#endif + path = (pos != path.npos) ? path.substr(pos + 1) : path; + + if (!removedSuffix.empty() && absl::EndsWithIgnoreCase(path, removedSuffix)) + path.remove_suffix(removedSuffix.size()); + + return path; +} + void Editor::Impl::updateSfzFileLabel(const std::string& filePath) { - updateLabelWithFileName(sfzFileLabel_, filePath); + updateLabelWithFileName(sfzFileLabel_, filePath, ".sfz"); } void Editor::Impl::updateScalaFileLabel(const std::string& filePath) { - updateLabelWithFileName(scalaFileLabel_, filePath); + updateLabelWithFileName(scalaFileLabel_, filePath, ".scl"); + updateButtonWithFileName(scalaFileButton_, filePath, ".scl"); } -void Editor::Impl::updateLabelWithFileName(CTextLabel* label, const std::string& filePath) +void Editor::Impl::updateLabelWithFileName(CTextLabel* label, const std::string& filePath, absl::string_view removedSuffix) { if (!label) return; - std::string fileName; - if (filePath.empty()) - fileName = ""; - else { -#if defined (_WIN32) - size_t pos = filePath.find_last_of("/\\"); -#else - size_t pos = filePath.rfind('/'); -#endif - fileName = (pos != filePath.npos) ? - filePath.substr(pos + 1) : filePath; - } + std::string fileName = std::string(simplifiedFileName(filePath, removedSuffix, "")); label->setText(fileName.c_str()); + label->setDirty(); +} + +void Editor::Impl::updateButtonWithFileName(CTextButton* button, const std::string& filePath, absl::string_view removedSuffix) +{ + if (!button) + return; + + std::string fileName = std::string(simplifiedFileName(filePath, removedSuffix, "")); + button->setTitle(fileName.c_str()); + button->setDirty(); } void Editor::Impl::updateVolumeLabel(float volume) @@ -762,6 +735,7 @@ void Editor::Impl::updateVolumeLabel(float volume) sprintf(text, "%.1f dB", volume); text[sizeof(text) - 1] = '\0'; label->setText(text); + label->setDirty(); } void Editor::Impl::updateNumVoicesLabel(int numVoices) @@ -774,6 +748,7 @@ void Editor::Impl::updateNumVoicesLabel(int numVoices) sprintf(text, "%d", numVoices); text[sizeof(text) - 1] = '\0'; label->setText(text); + label->setDirty(); } void Editor::Impl::updateOversamplingLabel(int oversamplingLog2) @@ -786,6 +761,7 @@ void Editor::Impl::updateOversamplingLabel(int oversamplingLog2) sprintf(text, "%dx", 1 << oversamplingLog2); text[sizeof(text) - 1] = '\0'; label->setText(text); + label->setDirty(); } void Editor::Impl::updatePreloadSizeLabel(int preloadSize) @@ -795,9 +771,10 @@ void Editor::Impl::updatePreloadSizeLabel(int preloadSize) return; char text[64]; - sprintf(text, "%.1f kB", preloadSize * (1.0 / 1024)); + sprintf(text, "%d kB", static_cast(std::round(preloadSize * (1.0 / 1024)))); text[sizeof(text) - 1] = '\0'; label->setText(text); + label->setDirty(); } void Editor::Impl::updateScalaRootKeyLabel(int rootKey) @@ -826,6 +803,7 @@ void Editor::Impl::updateScalaRootKeyLabel(int rootKey) }; label->setText(noteName(rootKey)); + label->setDirty(); } void Editor::Impl::updateTuningFrequencyLabel(float tuningFrequency) @@ -838,6 +816,7 @@ void Editor::Impl::updateTuningFrequencyLabel(float tuningFrequency) sprintf(text, "%.1f", tuningFrequency); text[sizeof(text) - 1] = '\0'; label->setText(text); + label->setDirty(); } void Editor::Impl::updateStretchedTuningLabel(float stretchedTuning) @@ -850,6 +829,7 @@ void Editor::Impl::updateStretchedTuningLabel(float stretchedTuning) sprintf(text, "%.3f", stretchedTuning); text[sizeof(text) - 1] = '\0'; label->setText(text); + label->setDirty(); } void Editor::Impl::setActivePanel(unsigned panelId) @@ -857,9 +837,11 @@ void Editor::Impl::setActivePanel(unsigned panelId) panelId = std::max(0, std::min(kNumPanels - 1, static_cast(panelId))); if (activePanel_ != panelId) { - subPanels_[activePanel_]->setVisible(false); + if (subPanels_[activePanel_]) + subPanels_[activePanel_]->setVisible(false); + if (subPanels_[panelId]) + subPanels_[panelId]->setVisible(true); activePanel_ = panelId; - subPanels_[panelId]->setVisible(true); } } @@ -893,6 +875,14 @@ void Editor::Impl::valueChanged(CControl* ctl) Call::later([this]() { chooseSfzFile(); }); break; + case kTagEditSfzFile: + if (value != 1) + break; + + if (!currentSfzFile_.empty()) + openFileInExternalEditor(currentSfzFile_.c_str()); + break; + case kTagLoadScalaFile: if (value != 1) break; @@ -921,8 +911,15 @@ void Editor::Impl::valueChanged(CControl* ctl) break; case kTagSetScalaRootKey: - ctrl.uiSendValue(EditId::ScalaRootKey, value); - updateScalaRootKeyLabel(static_cast(value)); + { + if (scalaRootKeySlider_ && scalaRootOctaveSlider_) { + int key = static_cast(scalaRootKeySlider_->getValue()); + int octave = static_cast(scalaRootOctaveSlider_->getValue()); + int midiKey = key + 12 * octave; + ctrl.uiSendValue(EditId::ScalaRootKey, midiKey); + updateScalaRootKeyLabel(midiKey); + } + } break; case kTagSetTuningFrequency: diff --git a/editor/src/editor/GUIComponents.cpp b/editor/src/editor/GUIComponents.cpp index a85bf64b..c4e6f958 100644 --- a/editor/src/editor/GUIComponents.cpp +++ b/editor/src/editor/GUIComponents.cpp @@ -5,34 +5,422 @@ // If not, contact the sfizz maintainers at https://github.com/sfztools/sfizz #include "GUIComponents.h" +#include #include "utility/vstgui_before.h" #include "vstgui/lib/cdrawcontext.h" +#include "vstgui/lib/cgraphicspath.h" +#include "vstgui/lib/cframe.h" #include "utility/vstgui_after.h" -SimpleSlider::SimpleSlider(const CRect& bounds, IControlListener* listener, int32_t tag) - : CSliderBase(bounds, listener, tag) +/// +SBoxContainer::SBoxContainer(const CRect& size) + : CViewContainer(size) { - setStyle(kHorizontal|kLeft); - - CPoint offsetHandle(2.0, 2.0); - setOffsetHandle(offsetHandle); - - CCoord handleSize = 20.0; - setHandleSizePrivate(handleSize, bounds.bottom - bounds.top - 2 * offsetHandle.y); - setHandleRangePrivate(bounds.right - bounds.left - handleSize - 2 * offsetHandle.x); + CViewContainer::setBackgroundColor(CColor(0, 0, 0, 0)); } -void SimpleSlider::draw(CDrawContext* dc) +void SBoxContainer::setCornerRadius(CCoord radius) +{ + cornerRadius_ = radius; + setDirty(); +} + +void SBoxContainer::setBackgroundColor(const CColor& color) +{ + backgroundColor_ = color; + setDirty(); +} + +CColor SBoxContainer::getBackgroundColor() const +{ + return backgroundColor_; +} + +void SBoxContainer::drawRect(CDrawContext* dc, const CRect& updateRect) { CRect bounds = getViewSize(); - CRect handle = calculateHandleRect(getValueNormalized()); dc->setDrawMode(kAntiAliasing); - dc->setFrameColor(_frame); - dc->drawRect(bounds, kDrawStroked); + SharedPointer path = owned(dc->createGraphicsPath()); + path->addRoundRect(bounds, cornerRadius_); - dc->setFillColor(_fill); - dc->drawRect(handle, kDrawFilled); + dc->setFillColor(backgroundColor_); + dc->drawGraphicsPath(path.get(), CDrawContext::kPathFilled); + + CViewContainer::drawRect(dc, updateRect); +} + +/// +STitleContainer::STitleContainer(const CRect& size, UTF8StringPtr text) + : SBoxContainer(size), text_(text ? text : ""), titleFont_(kNormalFont) +{ +} + +void STitleContainer::setTitleFont(CFontRef font) +{ + titleFont_ = font; + setDirty(); +} + +void STitleContainer::setTitleFontColor(CColor color) +{ + titleFontColor_ = color; + setDirty(); +} + +void STitleContainer::setTitleBackgroundColor(CColor color) +{ + titleBackgroundColor_ = color; + setDirty(); +} + +void STitleContainer::drawRect(CDrawContext* dc, const CRect& updateRect) +{ + SBoxContainer::drawRect(dc, updateRect); + + CRect bounds = getViewSize(); + CCoord cornerRadius = cornerRadius_; + + dc->setDrawMode(kAntiAliasing); + + CCoord fontHeight = titleFont_->getSize(); + CCoord titleHeight = fontHeight + 8.0; + + CRect titleBounds = bounds; + titleBounds.bottom = titleBounds.top + titleHeight; + + SharedPointer path = owned(dc->createGraphicsPath()); + path->beginSubpath(titleBounds.getBottomRight()); + path->addLine(titleBounds.getBottomLeft()); + path->addArc(CRect(titleBounds.left, titleBounds.top, titleBounds.left + 2.0 * cornerRadius, titleBounds.top + 2.0 * cornerRadius), 180., 270., true); + path->addArc(CRect(titleBounds.right - 2.0 * cornerRadius, titleBounds.top, titleBounds.right, titleBounds.top + 2.0 * cornerRadius), 270., 360., true); + path->closeSubpath(); + + dc->setFillColor(titleBackgroundColor_); + dc->drawGraphicsPath(path, CDrawContext::kPathFilled); + + dc->setFont(titleFont_); + dc->setFontColor(titleFontColor_); + dc->drawString(text_.c_str(), titleBounds, kCenterText); +} + +/// +void SFileDropTarget::setFileDropFunction(FileDropFunction f) +{ + dropFunction_ = std::move(f); +} + +DragOperation SFileDropTarget::onDragEnter(DragEventData data) +{ + op_ = isFileDrop(data.drag) ? + DragOperation::Copy : DragOperation::None; + return op_; +} + +DragOperation SFileDropTarget::onDragMove(DragEventData data) +{ + (void)data; + return op_; +} + +void SFileDropTarget::onDragLeave(DragEventData data) +{ + (void)data; + op_ = DragOperation::None; +} + +bool SFileDropTarget::onDrop(DragEventData data) +{ + if (op_ != DragOperation::Copy || !isFileDrop(data.drag)) + return false; + + IDataPackage::Type type; + const void* bytes; + uint32_t size = data.drag->getData(0, bytes, type); + std::string path(reinterpret_cast(bytes), size); + + if (dropFunction_) + dropFunction_(path); + + return true; +} + +bool SFileDropTarget::isFileDrop(IDataPackage* package) +{ + return package->getCount() == 1 && + package->getDataType(0) == IDataPackage::kFilePath; +} + +/// +SPiano::SPiano(const CRect& bounds) + : CView(bounds), font_(kNormalFont) +{ +} + +void SPiano::setFont(CFontRef font) +{ + font_ = font; + setDirty(); +} + +void SPiano::clearKeyRanges() +{ + keyInRange_.reset(); +} + +void SPiano::addKeyRange(int start, int end) +{ + start = std::min(127, std::max(0, start)); + end = std::min(127, std::max(0, end)); + + for (int x = start; x <= end; ++x) + keyInRange_.set(x); +} + +CCoord SPiano::getKeyWidth() +{ + return 6.0; +} + +CCoord SPiano::getKeySwitchesHeight() +{ + return 20.0; +} + +CCoord SPiano::getKeyRangesHeight() +{ + return 11.0; +} + +CCoord SPiano::getKeysHeight() const +{ + return getHeight() - + (getKeySwitchesHeight() + getKeyRangesHeight() + getOctavesHeight()); +} + +CCoord SPiano::getOctavesHeight() const +{ + return font_->getSize(); +} + +void SPiano::getZoneDimensions( + CRect* pKeySwitches, + CRect* pKeyboard, + CRect* pKeyRanges, + CRect* pOctaves) +{ + CRect bounds = getViewSize(); + + CRect keySwitches(bounds); + keySwitches.setHeight(getKeySwitchesHeight()); + + CRect keyboard(bounds); + keyboard.top = keySwitches.bottom; + keyboard.setHeight(getKeysHeight()); + + CRect keyRanges(bounds); + keyRanges.top = keyboard.bottom; + keyRanges.setHeight(getKeyRangesHeight()); + + CRect octaves(bounds); + octaves.top = keyRanges.bottom; + octaves.setHeight(getOctavesHeight()); + + // apply some paddings + keySwitches.extend(-2.0, -2.0); + keyboard.extend(-2.0, -2.0); + keyRanges.extend(-2.0, -4.0); + octaves.extend(-2.0, -2.0); + + // offsets for centered keyboard + CCoord keyWidth = getKeyWidth(); + CCoord offset = std::round((keyboard.getWidth() - (128.0 * keyWidth)) * 0.5); + if (offset > 0) { + keySwitches.extend(-offset, 0.0); + keyboard.extend(-offset, 0.0); + keyRanges.extend(-offset, 0.0); + octaves.extend(-offset, 0.0); + } + + // + if (pKeySwitches) + *pKeySwitches = keySwitches; + if (pKeyboard) + *pKeyboard = keyboard; + if (pKeyRanges) + *pKeyRanges = keyRanges; + if (pOctaves) + *pOctaves = octaves; +} + +void SPiano::draw(CDrawContext* dc) +{ + CRect bounds = getViewSize(); + + dc->setDrawMode(kAntiAliasing); + + SharedPointer path; + + path = owned(dc->createGraphicsPath()); + path->addRoundRect(bounds, 5.0); + dc->setFillColor(CColor(0xca, 0xca, 0xca)); + dc->drawGraphicsPath(path, CDrawContext::kPathFilled); + + // + CRect rectKeySwitches; + CRect rectKeyboard; + CRect rectKeyRanges; + CRect rectOctaves; + getZoneDimensions(&rectKeySwitches, &rectKeyboard, &rectKeyRanges, &rectOctaves); + + // + path = owned(dc->createGraphicsPath()); + path->addRoundRect(rectKeyboard, 1.0); + dc->setFillColor(CColor(0xff, 0xff, 0xff)); + dc->drawGraphicsPath(path, CDrawContext::kPathFilled); + + CCoord keyWidth = getKeyWidth(); + for (int key = 0; key < 128; ++key) { + CCoord keyX = rectKeyboard.left + key * keyWidth; + int key12 = key % 12; + if (key12 == 1 || key12 == 3 || + key12 == 6 || key12 == 8 || key12 == 10) + { + CRect blackRect(keyX, rectKeyboard.top + 2, keyX + keyWidth, rectKeyboard.bottom - 2); + path = owned(dc->createGraphicsPath()); + path->addRoundRect(blackRect, 1.0); + dc->setFillColor(CColor(0x02, 0x02, 0x02)); + dc->drawGraphicsPath(path, CDrawContext::kPathFilled); + } + if (key != 0 && key12 == 0) { + dc->setLineWidth(1.5); + dc->setFrameColor(CColor(0x63, 0x63, 0x63)); + dc->drawLine(CPoint(keyX, rectKeyboard.top), CPoint(keyX, rectKeyboard.bottom)); + } + if (key12 == 5) { + CCoord pad = rectKeyboard.getHeight() * 0.4; + dc->setLineWidth(1.0); + dc->setFrameColor(CColor(0x63, 0x63, 0x63)); + dc->drawLine(CPoint(keyX, rectKeyboard.top + pad), CPoint(keyX, rectKeyboard.bottom - pad)); + } + } + + // + + for (int rangeStart = 0; rangeStart < 128;) + { + if (!keyInRange_[rangeStart]) { + ++rangeStart; + } + else { + int rangeEnd = rangeStart; + while (rangeEnd + 1 < 128 && keyInRange_[rangeEnd + 1]) + ++rangeEnd; + + CCoord rangeStartX = rectKeyRanges.left + rangeStart * keyWidth; + CCoord rangeEndX = rectKeyRanges.left + (rangeEnd + 1.0) * keyWidth; + CRect rectRange(rangeStartX, rectKeyRanges.top, rangeEndX, rectKeyRanges.bottom); + + path = owned(dc->createGraphicsPath()); + path->addRoundRect(rectRange, 2.0); + dc->setFillColor(CColor(0x0f, 0x0f, 0x0f)); + dc->drawGraphicsPath(path, CDrawContext::kPathFilled); + + rangeStart = rangeEnd + 1; + } + } + + // + + for (int key = 0; key < 128; ++key) { + CCoord keyX = rectOctaves.left + key * keyWidth; + int key12 = key % 12; + if (key12 == 0) { + CRect textRect(keyX, rectOctaves.top, keyX + 12 * keyWidth, rectOctaves.bottom); + dc->setFont(font_); + dc->setFontColor(CColor(0x63, 0x63, 0x63)); + dc->drawString(std::to_string(key / 12 - 1).c_str(), textRect, kLeftText); + } + } + + // +} + +/// +SValueMenu::SValueMenu(const CRect& bounds, IControlListener* listener, int32_t tag) + : CParamDisplay(bounds), menuListener_(owned(new MenuListener(*this))) +{ + setListener(listener); + setTag(tag); +} + +CMenuItem* SValueMenu::addEntry(CMenuItem* item, float value, int32_t index) +{ + if (index < 0 || index > getNbEntries()) { + menuItems_.emplace_back(owned(item)); + menuItemValues_.emplace_back(value); + } + else + { + menuItems_.insert(menuItems_.begin() + index, owned(item)); + menuItemValues_.insert(menuItemValues_.begin() + index, value); + } + return item; +} + +CMenuItem* SValueMenu::addEntry(const UTF8String& title, float value, int32_t index, int32_t itemFlags) +{ + if (title == "-") + return addSeparator(index); + CMenuItem* item = new CMenuItem(title, nullptr, 0, nullptr, itemFlags); + return addEntry(item, value, index); +} + +CMenuItem* SValueMenu::addSeparator(int32_t index) +{ + CMenuItem* item = new CMenuItem("", nullptr, 0, nullptr, CMenuItem::kSeparator); + return addEntry(item, 0.0f, index); +} + +int32_t SValueMenu::getNbEntries() const +{ + return static_cast(menuItems_.size()); +} + +CMouseEventResult SValueMenu::onMouseDown(CPoint& where, const CButtonState& buttons) +{ + (void)where; + + if (buttons & (kLButton|kRButton|kApple)) { + CFrame* frame = getFrame(); + CRect bounds = getViewSize(); + + CPoint frameWhere = bounds.getBottomLeft(); + this->localToFrame(frameWhere); + + auto self = shared(this); + frame->doAfterEventProcessing([self, frameWhere]() { + if (CFrame* frame = self->getFrame()) { + SharedPointer menu = owned(new COptionMenu(CRect(), self->menuListener_, -1, nullptr, nullptr, COptionMenu::kPopupStyle)); + for (const SharedPointer& item : self->menuItems_) { + menu->addEntry(item); + item->remember(); // above call does not increment refcount + } + menu->popup(frame, frameWhere + CPoint(0.0, 1.0)); + } + }); + return kMouseDownEventHandledButDontNeedMovedOrUpEvents; + } + + return kMouseEventNotHandled; +} + +void SValueMenu::onItemClicked(int32_t index) +{ + float oldValue = getValue(); + setValue(menuItemValues_[index]); + if (getValue() != oldValue) + valueChanged(); } diff --git a/editor/src/editor/GUIComponents.h b/editor/src/editor/GUIComponents.h index c76c2e44..8c295f5e 100644 --- a/editor/src/editor/GUIComponents.h +++ b/editor/src/editor/GUIComponents.h @@ -5,22 +5,144 @@ // If not, contact the sfizz maintainers at https://github.com/sfztools/sfizz #pragma once +#include #include "utility/vstgui_before.h" #include "vstgui/lib/controls/cslider.h" +#include "vstgui/lib/controls/cknob.h" +#include "vstgui/lib/controls/ctextlabel.h" +#include "vstgui/lib/controls/coptionmenu.h" +#include "vstgui/lib/cviewcontainer.h" #include "vstgui/lib/ccolor.h" +#include "vstgui/lib/dragging.h" #include "utility/vstgui_after.h" using namespace VSTGUI; -class SimpleSlider : public CSliderBase { +/// +class SBoxContainer : public CViewContainer { public: - SimpleSlider(const CRect& bounds, IControlListener* listener, int32_t tag); - void draw(CDrawContext* dc) override; + explicit SBoxContainer(const CRect& size); + virtual ~SBoxContainer() {} + void setCornerRadius(CCoord radius); + void setBackgroundColor(const CColor& color) override; + CColor getBackgroundColor() const override; - CLASS_METHODS(SimpleSlider, CSliderBase) +protected: + void drawRect(CDrawContext* dc, const CRect& updateRect) override; + +protected: + CCoord cornerRadius_ = 0.0; + CColor backgroundColor_; +}; + +/// +class STitleContainer : public SBoxContainer { +public: + explicit STitleContainer(const CRect& size, UTF8StringPtr text = nullptr); + ~STitleContainer() {} + + void setTitleFont(CFontRef font); + CFontRef getTitleFont() { return titleFont_; } + + void setTitleFontColor(CColor color); + CColor getTitleFontColor() const { return titleFontColor_; } + void setTitleBackgroundColor(CColor color); + CColor getTitleBackgroundColor() const { return titleBackgroundColor_; } + +protected: + void drawRect(CDrawContext* dc, const CRect& updateRect) override; private: - CColor _frame = CColor(0x00, 0x00, 0x00); - CColor _fill = CColor(0x00, 0x00, 0x00); + std::string text_; + CColor titleFontColor_; + CColor titleBackgroundColor_; + SharedPointer titleFont_; +}; + +/// +class SFileDropTarget : public IDropTarget, + public NonAtomicReferenceCounted { +public: + typedef std::function FileDropFunction; + void setFileDropFunction(FileDropFunction f); + +protected: + DragOperation onDragEnter(DragEventData data) override; + DragOperation onDragMove(DragEventData data) override; + void onDragLeave(DragEventData data) override; + bool onDrop(DragEventData data) override; + +private: + static bool isFileDrop(IDataPackage* package); + +private: + DragOperation op_ = DragOperation::None; + FileDropFunction dropFunction_; +}; + +/// +class SPiano : public CView { +public: + explicit SPiano(const CRect& bounds); + CFontRef getFont() const { return font_; } + void setFont(CFontRef font); + + void clearKeyRanges(); + void addKeyRange(int start, int end); + +protected: + static CCoord getKeyWidth(); + static CCoord getKeySwitchesHeight(); + static CCoord getKeyRangesHeight(); + CCoord getKeysHeight() const; + CCoord getOctavesHeight() const; + + void getZoneDimensions( + CRect* pKeySwitches, + CRect* pKeyboard, + CRect* pKeyRanges, + CRect* pOctaves); + + void draw(CDrawContext* dc) override; + +private: + SharedPointer font_; + std::bitset<128> keyInRange_; +}; + +/// +class SValueMenu : public CParamDisplay { +public: + explicit SValueMenu(const CRect& bounds, IControlListener* listener, int32_t tag); + CMenuItem* addEntry(CMenuItem* item, float value, int32_t index = -1); + CMenuItem* addEntry(const UTF8String& title, float value, int32_t index = -1, int32_t itemFlags = CMenuItem::kNoFlags); + CMenuItem* addSeparator(int32_t index = -1); + int32_t getNbEntries() const; + +protected: + CMouseEventResult onMouseDown(CPoint& where, const CButtonState& buttons); + +private: + class MenuListener; + + // + void onItemClicked(int32_t index); + + // + CMenuItemList menuItems_; + std::vector menuItemValues_; + SharedPointer menuListener_; + + // + class MenuListener : public IControlListener, public NonAtomicReferenceCounted { + public: + explicit MenuListener(SValueMenu& menu) : menu_(menu) {} + void valueChanged(CControl* control) override + { + menu_.onItemClicked(static_cast(control->getValue())); + } + private: + SValueMenu& menu_; + }; }; diff --git a/editor/src/editor/NativeHelpers.cpp b/editor/src/editor/NativeHelpers.cpp new file mode 100644 index 00000000..ab760d73 --- /dev/null +++ b/editor/src/editor/NativeHelpers.cpp @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: BSD-2-Clause + +// This code is part of the sfizz library and is licensed under a BSD 2-clause +// license. You should have receive a LICENSE.md file along with the code. +// If not, contact the sfizz maintainers at https://github.com/sfztools/sfizz + +#include "NativeHelpers.h" + +#if defined(_WIN32) +#include "ghc/fs_std.hpp" +#include +#include + +bool openFileInExternalEditor(const char *filename) +{ + std::wstring path = fs::u8path(filename).wstring(); + + SHELLEXECUTEINFOW info; + memset(&info, 0, sizeof(info)); + + info.cbSize = sizeof(info); + info.fMask = SEE_MASK_CLASSNAME; + info.lpVerb = L"open"; + info.lpFile = path.c_str(); + info.lpClass = L"txtfile"; + info.nShow = SW_SHOW; + + return ShellExecuteExW(&info); +} +#elif defined(__APPLE__) + // implemented in NativeHelpers.mm +#else +#include + +bool openFileInExternalEditor(const char *filename) +{ + GAppInfo* appinfo = g_app_info_get_default_for_type("text/plain", FALSE); + if (!appinfo) + return 1; + + GList* files = nullptr; + GFile* file = g_file_new_for_path(filename); + files = g_list_append(files, file); + gboolean success = g_app_info_launch(appinfo, files, nullptr, nullptr); + g_object_unref(file); + g_list_free(files); + g_object_unref(appinfo); + return success == TRUE; +} +#endif diff --git a/editor/src/editor/NativeHelpers.h b/editor/src/editor/NativeHelpers.h new file mode 100644 index 00000000..b9c29bb6 --- /dev/null +++ b/editor/src/editor/NativeHelpers.h @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: BSD-2-Clause + +// This code is part of the sfizz library and is licensed under a BSD 2-clause +// license. You should have receive a LICENSE.md file along with the code. +// If not, contact the sfizz maintainers at https://github.com/sfztools/sfizz + +#pragma once + +bool openFileInExternalEditor(const char *filename); diff --git a/editor/src/editor/NativeHelpers.mm b/editor/src/editor/NativeHelpers.mm new file mode 100644 index 00000000..9cb8cd28 --- /dev/null +++ b/editor/src/editor/NativeHelpers.mm @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: BSD-2-Clause + +// This code is part of the sfizz library and is licensed under a BSD 2-clause +// license. You should have receive a LICENSE.md file along with the code. +// If not, contact the sfizz maintainers at https://github.com/sfztools/sfizz + +#include "NativeHelpers.h" + +#if defined(__APPLE__) +#import +#import +#import + +bool openFileInExternalEditor(const char *fileNameUTF8) +{ + BOOL wasOpened = NO; + + NSURL* applicationURL = (__bridge_transfer NSURL*)LSCopyDefaultApplicationURLForContentType( + kUTTypePlainText, kLSRolesEditor, nil); + if (!applicationURL) + return false; + if ([applicationURL isFileURL]) { + NSWorkspace* workspace = [NSWorkspace sharedWorkspace]; + NSString* fileName = [NSString stringWithUTF8String:fileNameUTF8]; + wasOpened = [workspace openFile:fileName withApplication:[applicationURL path]]; + } + + return wasOpened == YES; +} +#endif diff --git a/editor/src/editor/layout/main.hpp b/editor/src/editor/layout/main.hpp new file mode 100644 index 00000000..808e5a10 --- /dev/null +++ b/editor/src/editor/layout/main.hpp @@ -0,0 +1,167 @@ +/* This file is generated by the layout maker tool. */ +LogicalGroup* const view__0 = createLogicalGroup(CRect(0, 0, 800, 475), -1, "", kCenterText, 14); +mainView = view__0; +enterTheme(darkTheme); +LogicalGroup* const view__1 = createLogicalGroup(CRect(0, 0, 800, 110), -1, "", kCenterText, 14); +view__0->addView(view__1); +RoundedGroup* const view__2 = createRoundedGroup(CRect(5, 4, 105, 105), -1, "", kCenterText, 14); +view__1->addView(view__2); +SfizzMainButton* const view__3 = createSfizzMainButton(CRect(2, 2, 98, 98), kTagFirstChangePanel+kPanelGeneral, "", kCenterText, 14); +view__2->addView(view__3); +RoundedGroup* const view__4 = createRoundedGroup(CRect(110, 5, 490, 105), -1, "", kCenterText, 14); +view__1->addView(view__4); +Label* const view__5 = createLabel(CRect(15, 10, 55, 35), -1, "File:", kCenterText, 16); +view__4->addView(view__5); +Label* const view__6 = createLabel(CRect(15, 40, 55, 65), -1, "KS:", kCenterText, 16); +view__4->addView(view__6); +HLine* const view__7 = createHLine(CRect(10, 35, 365, 40), -1, "", kCenterText, 14); +view__4->addView(view__7); +HLine* const view__8 = createHLine(CRect(10, 65, 365, 70), -1, "", kCenterText, 14); +view__4->addView(view__8); +Label* const view__9 = createLabel(CRect(80, 10, 310, 35), -1, "DefaultInstrument.sfz", kCenterText, 20); +sfzFileLabel_ = view__9; +view__4->addView(view__9); +Label* const view__10 = createLabel(CRect(80, 40, 310, 65), -1, "Key switch", kCenterText, 20); +view__4->addView(view__10); +Label* const view__11 = createLabel(CRect(10, 70, 70, 95), -1, "Voices:", kRightText, 12); +view__4->addView(view__11); +LoadFileButton* const view__12 = createLoadFileButton(CRect(315, 10, 340, 35), kTagLoadSfzFile, "", kCenterText, 24); +view__4->addView(view__12); +EditFileButton* const view__13 = createEditFileButton(CRect(340, 10, 365, 35), kTagEditSfzFile, "", kCenterText, 24); +view__4->addView(view__13); +Label* const view__14 = createLabel(CRect(75, 70, 125, 95), -1, "", kCenterText, 12); +infoVoicesLabel_ = view__14; +view__4->addView(view__14); +Label* const view__15 = createLabel(CRect(130, 70, 190, 95), -1, "Max:", kRightText, 12); +view__4->addView(view__15); +Label* const view__16 = createLabel(CRect(195, 70, 245, 95), -1, "", kCenterText, 12); +numVoicesLabel_ = view__16; +view__4->addView(view__16); +Label* const view__17 = createLabel(CRect(250, 70, 310, 95), -1, "Memory:", kRightText, 12); +view__4->addView(view__17); +Label* const view__18 = createLabel(CRect(315, 70, 365, 95), -1, "", kCenterText, 12); +memoryLabel_ = view__18; +view__4->addView(view__18); +RoundedGroup* const view__19 = createRoundedGroup(CRect(495, 5, 595, 105), -1, "", kCenterText, 14); +view__1->addView(view__19); +LightButton* const view__20 = createLightButton(CRect(15, 37, 85, 62), kTagFirstChangePanel+kPanelSettings, "SETUP", kCenterText, 14); +view__19->addView(view__20); +LightButton* const view__21 = createLightButton(CRect(15, 10, 85, 35), kTagFirstChangePanel+kPanelControls, "CC", kCenterText, 14); +view__19->addView(view__21); +LightButton* const view__22 = createLightButton(CRect(15, 64, 85, 89), kTagFirstChangePanel+kPanelInfo, "INFO", kCenterText, 14); +view__19->addView(view__22); +RoundedGroup* const view__23 = createRoundedGroup(CRect(600, 5, 795, 105), -1, "", kCenterText, 14); +view__1->addView(view__23); +Knob48* const view__24 = createKnob48(CRect(15, 15, 63, 63), -1, "", kCenterText, 14); +view__23->addView(view__24); +view__24->setVisible(false); +ValueLabel* const view__25 = createValueLabel(CRect(10, 65, 70, 90), -1, "Center", kCenterText, 12); +view__23->addView(view__25); +view__25->setVisible(false); +Knob48* const view__26 = createKnob48(CRect(80, 15, 128, 63), kTagSetVolume, "", kCenterText, 14); +volumeSlider_ = view__26; +view__23->addView(view__26); +ValueLabel* const view__27 = createValueLabel(CRect(75, 65, 135, 90), -1, "0.0 dB", kCenterText, 12); +volumeLabel_ = view__27; +view__23->addView(view__27); +VMeter* const view__28 = createVMeter(CRect(145, 15, 180, 85), -1, "", kCenterText, 14); +view__23->addView(view__28); +enterTheme(defaultTheme); +LogicalGroup* const view__29 = createLogicalGroup(CRect(5, 110, 795, 395), -1, "", kCenterText, 14); +subPanels_[kPanelGeneral] = view__29; +view__0->addView(view__29); +view__29->setVisible(false); +RoundedGroup* const view__30 = createRoundedGroup(CRect(0, 0, 120, 285), -1, "", kCenterText, 14); +view__29->addView(view__30); +Label* const view__31 = createLabel(CRect(10, 10, 70, 35), -1, "Curves:", kLeftText, 12); +view__30->addView(view__31); +Label* const view__32 = createLabel(CRect(10, 35, 70, 60), -1, "Masters:", kLeftText, 12); +view__30->addView(view__32); +Label* const view__33 = createLabel(CRect(10, 60, 70, 85), -1, "Groups:", kLeftText, 12); +view__30->addView(view__33); +Label* const view__34 = createLabel(CRect(10, 85, 70, 110), -1, "Regions:", kLeftText, 12); +view__30->addView(view__34); +Label* const view__35 = createLabel(CRect(10, 110, 70, 135), -1, "Samples:", kLeftText, 12); +view__30->addView(view__35); +Label* const view__36 = createLabel(CRect(70, 10, 110, 35), -1, "0", kCenterText, 12); +infoCurvesLabel_ = view__36; +view__30->addView(view__36); +Label* const view__37 = createLabel(CRect(70, 35, 110, 60), -1, "0", kCenterText, 12); +infoMastersLabel_ = view__37; +view__30->addView(view__37); +Label* const view__38 = createLabel(CRect(70, 60, 110, 85), -1, "0", kCenterText, 12); +infoGroupsLabel_ = view__38; +view__30->addView(view__38); +Label* const view__39 = createLabel(CRect(70, 85, 110, 110), -1, "0", kCenterText, 12); +infoRegionsLabel_ = view__39; +view__30->addView(view__39); +Label* const view__40 = createLabel(CRect(70, 110, 110, 135), -1, "0", kCenterText, 12); +infoSamplesLabel_ = view__40; +view__30->addView(view__40); +LogicalGroup* const view__41 = createLogicalGroup(CRect(125, 0, 790, 280), -1, "", kCenterText, 14); +view__29->addView(view__41); +SfizzLargePicture* const view__42 = createSfizzLargePicture(CRect(130, 15, 530, 265), -1, "", kCenterText, 14); +view__41->addView(view__42); +LogicalGroup* 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); +RoundedGroup* const view__44 = createRoundedGroup(CRect(0, 0, 790, 285), -1, "", kCenterText, 14); +view__43->addView(view__44); +Label* const view__45 = createLabel(CRect(0, 0, 790, 285), -1, "Controls not available", kCenterText, 40); +view__44->addView(view__45); +LogicalGroup* const view__46 = createLogicalGroup(CRect(5, 110, 795, 395), -1, "", kCenterText, 14); +subPanels_[kPanelSettings] = view__46; +view__0->addView(view__46); +TitleGroup* const view__47 = createTitleGroup(CRect(255, 15, 535, 125), -1, "Engine", kCenterText, 12); +view__46->addView(view__47); +ValueMenu* const view__48 = createValueMenu(CRect(25, 60, 85, 85), kTagSetNumVoices, "", kCenterText, 12); +numVoicesSlider_ = view__48; +view__47->addView(view__48); +ValueLabel* const view__49 = createValueLabel(CRect(15, 20, 95, 45), -1, "Polyphony", kCenterText, 12); +view__47->addView(view__49); +ValueMenu* const view__50 = createValueMenu(CRect(110, 60, 170, 85), kTagSetOversampling, "", kCenterText, 12); +oversamplingSlider_ = view__50; +view__47->addView(view__50); +ValueLabel* const view__51 = createValueLabel(CRect(100, 20, 180, 45), -1, "Oversampling", kCenterText, 12); +view__47->addView(view__51); +ValueLabel* const view__52 = createValueLabel(CRect(185, 20, 265, 45), -1, "Preload size", kCenterText, 12); +view__47->addView(view__52); +ValueMenu* const view__53 = createValueMenu(CRect(195, 60, 255, 85), kTagSetPreloadSize, "", kCenterText, 12); +preloadSizeSlider_ = view__53; +view__47->addView(view__53); +TitleGroup* const view__54 = createTitleGroup(CRect(200, 150, 590, 270), -1, "Tuning", kCenterText, 12); +view__46->addView(view__54); +ValueLabel* const view__55 = createValueLabel(CRect(125, 20, 205, 45), -1, "Root key", kCenterText, 12); +view__54->addView(view__55); +ValueMenu* const view__56 = createValueMenu(CRect(220, 60, 280, 85), kTagSetTuningFrequency, "", kCenterText, 12); +tuningFrequencySlider_ = view__56; +view__54->addView(view__56); +ValueLabel* const view__57 = createValueLabel(CRect(210, 20, 290, 45), -1, "Frequency", kCenterText, 12); +view__54->addView(view__57); +Knob48* const view__58 = createKnob48(CRect(310, 45, 358, 93), kTagSetStretchedTuning, "", kCenterText, 14); +stretchedTuningSlider_ = view__58; +view__54->addView(view__58); +ValueLabel* const view__59 = createValueLabel(CRect(295, 20, 375, 45), -1, "Stretch", kCenterText, 12); +view__54->addView(view__59); +ValueLabel* const view__60 = createValueLabel(CRect(20, 20, 120, 45), -1, "Scala file", kCenterText, 12); +view__54->addView(view__60); +ValueButton* const view__61 = createValueButton(CRect(20, 60, 120, 85), kTagLoadScalaFile, "DefaultScale", kCenterText, 12); +scalaFileButton_ = view__61; +view__54->addView(view__61); +ValueMenu* const view__62 = createValueMenu(CRect(135, 60, 170, 85), kTagSetScalaRootKey, "", kCenterText, 12); +scalaRootKeySlider_ = view__62; +view__54->addView(view__62); +ValueMenu* const view__63 = createValueMenu(CRect(170, 60, 200, 85), kTagSetScalaRootKey, "", kCenterText, 12); +scalaRootOctaveSlider_ = view__63; +view__54->addView(view__63); +LogicalGroup* const view__64 = createLogicalGroup(CRect(5, 110, 795, 395), -1, "", kCenterText, 14); +subPanels_[kPanelInfo] = view__64; +view__0->addView(view__64); +view__64->setVisible(false); +RoundedGroup* const view__65 = createRoundedGroup(CRect(0, 0, 790, 285), -1, "", kCenterText, 14); +view__64->addView(view__65); +Label* const view__66 = createLabel(CRect(0, 0, 790, 285), -1, "Informative text goes here", kCenterText, 40); +view__65->addView(view__66); +Piano* const view__67 = createPiano(CRect(5, 400, 795, 470), -1, "", kCenterText, 14); +view__0->addView(view__67); diff --git a/editor/tools/layout-maker/LICENSE b/editor/tools/layout-maker/LICENSE new file mode 100644 index 00000000..36b7cd93 --- /dev/null +++ b/editor/tools/layout-maker/LICENSE @@ -0,0 +1,23 @@ +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/editor/tools/layout-maker/README b/editor/tools/layout-maker/README new file mode 100644 index 00000000..e8402cc3 --- /dev/null +++ b/editor/tools/layout-maker/README @@ -0,0 +1,2 @@ +This purpose of this tool is to accept UI designs make with Fluid, the FLTK +design editor, and convert these designs to music plugin interfaces. diff --git a/editor/tools/layout-maker/sources/layout.h b/editor/tools/layout-maker/sources/layout.h new file mode 100644 index 00000000..35a1978e --- /dev/null +++ b/editor/tools/layout-maker/sources/layout.h @@ -0,0 +1,42 @@ +#pragma once +#include +#include + +struct LayoutImage { + std::string filepath; + int x = 0; + int y = 0; + int w = 0; + int h = 0; +}; + +struct LayoutItem { + std::string id; + std::string classname; + std::string label; + int x = 0; + int y = 0; + int w = 0; + int h = 0; + std::string box; + std::string down_box; + int labelfont = 0; + int labelsize = 14; + std::string labeltype; + int textsize = 14; + int align = 0; + double value = 0; + double minimum = 0; + double maximum = 0; + double step = 0; + std::string type; + std::string callback; + LayoutImage image; + bool hidden = false; + std::string comment; + std::vector items; +}; + +struct Layout { + std::vector items; +}; diff --git a/editor/tools/layout-maker/sources/main.cpp b/editor/tools/layout-maker/sources/main.cpp new file mode 100644 index 00000000..06e5283b --- /dev/null +++ b/editor/tools/layout-maker/sources/main.cpp @@ -0,0 +1,136 @@ +#include "layout.h" +#include "reader.h" +#include +#include +#include +#include + +/// +typedef std::unordered_map Metadata; + +static Metadata metadata_from_comment(absl::string_view comment) +{ + Metadata md; + + while (!comment.empty()) { + absl::string_view line; + + size_t pos = comment.find_first_of("\r\n"); + if (pos != comment.npos) { + line = comment.substr(0, pos); + comment.remove_prefix(pos + 1); + } + else { + line = comment; + comment = {}; + } + + line = absl::StripAsciiWhitespace(line); + if (line.empty() || line[0] == '#') + continue; + + std::string key, value; + pos = line.find_first_of('='); + if (pos != comment.npos) { + key = std::string(line.substr(0, pos)); + value = std::string(line.substr(pos + 1)); + } + else + key = std::string(line); + + md.emplace(std::move(key), std::move(value)); + } + + return md; +} + +/// +static void codegen_item(int& idCounter, int parentId, int parentX, int parentY, const LayoutItem& item, absl::string_view oldTheme) +{ + const Metadata md = metadata_from_comment(item.comment); + + absl::string_view tag = "-1"; + absl::string_view newTheme; + + Metadata::const_iterator it; + it = md.find("tag"); + if (it != md.end()) + tag = it->second; + it = md.find("theme"); + if (it != md.end()) + newTheme = it->second; + + absl::string_view currentTheme = newTheme.empty() ? oldTheme : newTheme; + + int id = idCounter++; + int myX = item.x; + int myY = item.y; + if (parentId == -1) { + myX = 0; + myY = 0; + } + int relX = myX - parentX; + int relY = myY - parentY; + + //std::cout << "// Begin " << id << " " << item.classname << " {" << item.label << "}" << "\n"; + + if (!newTheme.empty()) + std::cout << "enterTheme(" << newTheme << ");\n"; + + absl::string_view label; + if (!item.label.empty() && item.labeltype != "NO_LABEL") + label = item.label; + + absl::string_view align = "kCenterText"; + if (item.align & 4) + align = "kLeftText"; + else if (item.align & 8) + align = "kRightText"; + + std::cout << item.classname << "* const view__" << id << " = create" << item.classname << "(CRect(" << relX << ", " << relY << ", " << (relX + item.w) << ", " << (relY + item.h) << "), " << tag << ", \"" << label << "\", " << align << ", " << item.labelsize << ");\n"; + + if (!item.id.empty()) + std::cout << item.id << " = view__" << id << ";\n"; + + if (parentId != -1) + std::cout << "view__" << parentId << "->addView(view__" << id << ");\n"; + + if (item.hidden) + std::cout << "view__" << id << "->setVisible(false);\n"; + + for (const LayoutItem& subItem : item.items) + codegen_item(idCounter, id, myX, myY, subItem, currentTheme); + + if (!newTheme.empty()) + std::cout << "enterTheme(" << oldTheme << ");\n"; + + //std::cout << "// End " << id << " " << item.classname << " {" << item.label << "}" << "\n"; +} + +static void codegen_layout(const LayoutItem& item) +{ + int idCounter = 0; + codegen_item(idCounter, -1, 0, 0, item, "defaultTheme"); +} + +/// +int main(int argc, char *argv[]) +{ + if (argc != 2) { + std::cerr << "Please indicate a fluid design file.\n"; + return 1; + } + + Layout layout = read_file_layout(argv[1]); + + if (layout.items.size() != 1) { + std::cerr << "There must be exactly 1 top level component."; + return 1; + } + + std::cout << "/* This file is generated by the layout maker tool. */\n"; + + codegen_layout(layout.items[0]); + + return 0; +} diff --git a/editor/tools/layout-maker/sources/reader.cpp b/editor/tools/layout-maker/sources/reader.cpp new file mode 100644 index 00000000..788f93d7 --- /dev/null +++ b/editor/tools/layout-maker/sources/reader.cpp @@ -0,0 +1,359 @@ +#include "reader.h" +#include +#include +#include + +typedef std::vector TokenList; +static bool read_file_tokens(const char *filename, TokenList &tokens); +static Layout read_tokens_layout(TokenList::iterator &tok_it, TokenList::iterator tok_end); + +Layout read_file_layout(const char *filename) +{ + std::vector tokens; + if (!read_file_tokens(filename, tokens)) + throw std::runtime_error("Cannot read fluid design file."); + + TokenList::iterator tok_it = tokens.begin(); + TokenList::iterator tok_end = tokens.end(); + return read_tokens_layout(tok_it, tok_end); +} + +static std::string consume_next_token(TokenList::iterator &tok_it, TokenList::iterator tok_end) +{ + if (tok_it == tok_end) + throw file_format_error("Premature end of tokens"); + return *tok_it++; +} + +static bool try_consume_next_token(const char *text, TokenList::iterator &tok_it, TokenList::iterator tok_end) +{ + if (tok_it == tok_end) + return false; + + if (*tok_it != text) + return false; + + ++tok_it; + return true; +} + +static void ensure_next_token(const char *text, TokenList::iterator &tok_it, TokenList::iterator tok_end) +{ + std::string tok = consume_next_token(tok_it, tok_end); + if (tok != text) + throw file_format_error("Unexpected token: " + tok); +} + +static std::string consume_enclosed_string(TokenList::iterator &tok_it, TokenList::iterator tok_end) +{ + ensure_next_token("{", tok_it, tok_end); + unsigned depth = 1; + + std::string text; + for (;;) { + std::string part = consume_next_token(tok_it, tok_end); + if (part == "}") { + if (--depth == 0) + return text; + } + else if (part == "{") + ++depth; + if (!text.empty()) + text.push_back(' '); + text.append(part); + } + + return text; +} + +static std::string consume_any_string(TokenList::iterator &tok_it, TokenList::iterator tok_end) +{ + if (tok_it != tok_end && *tok_it == "{") + return consume_enclosed_string(tok_it, tok_end); + else + return consume_next_token(tok_it, tok_end); +} + +static int consume_int_token(TokenList::iterator &tok_it, TokenList::iterator tok_end) +{ + std::string text = consume_next_token(tok_it, tok_end); + return std::stoi(text); +} + +static int consume_real_token(TokenList::iterator &tok_it, TokenList::iterator tok_end) +{ + std::string text = consume_next_token(tok_it, tok_end); + return std::stod(text); +} + +static void consume_image_properties(LayoutImage &image, TokenList::iterator &tok_it, TokenList::iterator tok_end) +{ + for (bool have = true; have;) { + if (try_consume_next_token("xywh", tok_it, tok_end)) { + ensure_next_token("{", tok_it, tok_end); + image.x = consume_int_token(tok_it, tok_end); + image.y = consume_int_token(tok_it, tok_end); + image.w = consume_int_token(tok_it, tok_end); + image.h = consume_int_token(tok_it, tok_end); + ensure_next_token("}", tok_it, tok_end); + } + else + have = false; + } +} + +// static void consume_layout_item_properties(LayoutItem &item, TokenList::iterator &tok_it, TokenList::iterator tok_end) +// { +// ensure_next_token("{", tok_it, tok_end); +// for (std::string text; (text = consume_next_token(tok_it, tok_end)) != "}";) { +// if (text == "open" || text == "selected") +// ; // skip +// else if (text == "label") +// item.label = consume_any_string(tok_it, tok_end); +// else if (text == "xywh") { +// ensure_next_token("{", tok_it, tok_end); +// item.x = consume_int_token(tok_it, tok_end); +// item.y = consume_int_token(tok_it, tok_end); +// item.w = consume_int_token(tok_it, tok_end); +// item.h = consume_int_token(tok_it, tok_end); +// ensure_next_token("}", tok_it, tok_end); +// } +// else if (text == "box") +// item.box = consume_next_token(tok_it, tok_end); +// else if (text == "labelfont") +// item.labelfont = consume_int_token(tok_it, tok_end); +// else if (text == "labelsize") +// item.labelsize = consume_int_token(tok_it, tok_end); +// else if (text == "labeltype") +// item.labeltype = consume_any_string(tok_it, tok_end); +// else if (text == "align") +// item.align = consume_int_token(tok_it, tok_end); +// else if (text == "type") +// item.type = consume_any_string(tok_it, tok_end); +// else if (text == "callback") +// item.callback = consume_any_string(tok_it, tok_end); +// else if (text == "class") +// item.classname = consume_any_string(tok_it, tok_end); +// else if (text == "minimum") +// item.minimum = consume_real_token(tok_it, tok_end); +// else if (text == "maximum") +// item.maximum = consume_real_token(tok_it, tok_end); +// else if (text == "step") +// item.step = consume_real_token(tok_it, tok_end); +// else if (text == "image") { +// item.image.filepath = consume_any_string(tok_it, tok_end); +// consume_image_properties(item.image, tok_it, tok_end); +// } +// } +// } + +static void consume_layout_item_properties(LayoutItem &item, TokenList::iterator &tok_it, TokenList::iterator tok_end) +{ + ensure_next_token("{", tok_it, tok_end); + for (bool have = true; have;) { + if (try_consume_next_token("open", tok_it, tok_end)) + ; // skip + else if (try_consume_next_token("selected", tok_it, tok_end)) + ; // skip + else if (try_consume_next_token("label", tok_it, tok_end)) + item.label = consume_any_string(tok_it, tok_end); + else if (try_consume_next_token("xywh", tok_it, tok_end)) { + ensure_next_token("{", tok_it, tok_end); + item.x = consume_int_token(tok_it, tok_end); + item.y = consume_int_token(tok_it, tok_end); + item.w = consume_int_token(tok_it, tok_end); + item.h = consume_int_token(tok_it, tok_end); + ensure_next_token("}", tok_it, tok_end); + } + else if (try_consume_next_token("box", tok_it, tok_end)) + item.box = consume_next_token(tok_it, tok_end); + else if (try_consume_next_token("down_box", tok_it, tok_end)) + item.down_box = consume_next_token(tok_it, tok_end); + else if (try_consume_next_token("labelfont", tok_it, tok_end)) + item.labelfont = consume_int_token(tok_it, tok_end); + else if (try_consume_next_token("labelsize", tok_it, tok_end)) + item.labelsize = consume_int_token(tok_it, tok_end); + else if (try_consume_next_token("labeltype", tok_it, tok_end)) + item.labeltype = consume_any_string(tok_it, tok_end); + else if (try_consume_next_token("textsize", tok_it, tok_end)) + item.textsize = consume_int_token(tok_it, tok_end); + else if (try_consume_next_token("align", tok_it, tok_end)) + item.align = consume_int_token(tok_it, tok_end); + else if (try_consume_next_token("type", tok_it, tok_end)) + item.type = consume_any_string(tok_it, tok_end); + else if (try_consume_next_token("callback", tok_it, tok_end)) + item.callback = consume_any_string(tok_it, tok_end); + else if (try_consume_next_token("class", tok_it, tok_end)) + item.classname = consume_any_string(tok_it, tok_end); + else if (try_consume_next_token("value", tok_it, tok_end)) + item.value = consume_real_token(tok_it, tok_end); + else if (try_consume_next_token("minimum", tok_it, tok_end)) + item.minimum = consume_real_token(tok_it, tok_end); + else if (try_consume_next_token("maximum", tok_it, tok_end)) + item.maximum = consume_real_token(tok_it, tok_end); + else if (try_consume_next_token("step", tok_it, tok_end)) + item.step = consume_real_token(tok_it, tok_end); + else if (try_consume_next_token("image", tok_it, tok_end)) + item.image.filepath = consume_any_string(tok_it, tok_end); + else if (try_consume_next_token("hide", tok_it, tok_end)) + item.hidden = true; + else if (try_consume_next_token("visible", tok_it, tok_end)) + /* skip */; + else if (try_consume_next_token("comment", tok_it, tok_end)) + item.comment = consume_any_string(tok_it, tok_end); + else + have = false; + } + ensure_next_token("}", tok_it, tok_end); +} + +static LayoutItem consume_layout_item(const std::string &classname, TokenList::iterator &tok_it, TokenList::iterator tok_end, bool anonymous = false) +{ + LayoutItem item; + item.classname = classname; + if (!anonymous) + item.id = consume_any_string(tok_it, tok_end); + consume_layout_item_properties(item, tok_it, tok_end); + if (tok_it != tok_end && *tok_it == "{") { + consume_next_token(tok_it, tok_end); + for (std::string text; (text = consume_next_token(tok_it, tok_end)) != "}";) { + if (text == "decl") { + consume_any_string(tok_it, tok_end); + consume_any_string(tok_it, tok_end); + } + else if (text == "Function") { + consume_any_string(tok_it, tok_end); + consume_any_string(tok_it, tok_end); + consume_any_string(tok_it, tok_end); + } + else + item.items.push_back(consume_layout_item(text, tok_it, tok_end)); + } + } + return item; +} + +static Layout read_tokens_layout(TokenList::iterator &tok_it, TokenList::iterator tok_end) +{ + Layout layout; + + std::string version_name; + std::string header_name; + std::string code_name; + + while (tok_it != tok_end) { + std::string key = consume_next_token(tok_it, tok_end); + + if (key == "version") + version_name = consume_next_token(tok_it, tok_end); + else if (key == "header_name") { + ensure_next_token("{", tok_it, tok_end); + header_name = consume_next_token(tok_it, tok_end); + ensure_next_token("}", tok_it, tok_end); + } + else if (key == "code_name") { + ensure_next_token("{", tok_it, tok_end); + code_name = consume_next_token(tok_it, tok_end); + ensure_next_token("}", tok_it, tok_end); + } + else if (key == "decl") { + consume_any_string(tok_it, tok_end); + consume_any_string(tok_it, tok_end); + } + else if (key == "widget_class") { + key = consume_next_token(tok_it, tok_end); + layout.items.push_back(consume_layout_item(key, tok_it, tok_end, true)); + layout.items.back().id = key; + } + else + layout.items.push_back(consume_layout_item(key, tok_it, tok_end)); + } + + return layout; +} + +/// +class tokenizer { +public: + tokenizer( + absl::string_view text, + absl::string_view dropped_delims, + absl::string_view kept_delims); + + absl::string_view next(); + +private: + absl::string_view text_; + absl::string_view dropped_delims_; + absl::string_view kept_delims_; +}; + +tokenizer::tokenizer( + absl::string_view text, + absl::string_view dropped_delims, + absl::string_view kept_delims) + : text_(text), dropped_delims_(dropped_delims), kept_delims_(kept_delims) +{ +} + +absl::string_view tokenizer::next() +{ + auto is_dropped = [this](char c) -> bool { + return dropped_delims_.find(c) != dropped_delims_.npos; + }; + auto is_kept = [this](char c) -> bool { + return kept_delims_.find(c) != kept_delims_.npos; + }; + auto is_delim = [this](char c) -> bool { + return dropped_delims_.find(c) != dropped_delims_.npos || + kept_delims_.find(c) != kept_delims_.npos; + }; + + absl::string_view text = text_; + + while (!text.empty() && is_dropped(text[0])) + text.remove_prefix(1); + + if (text.empty()) + return {}; + + size_t pos; + { + auto it = std::find_if(text.begin(), text.end(), is_delim); + if (it == text.end()) + pos = text.size(); + else { + pos = std::distance(text.begin(), it); + pos += is_kept(text[0]); + } + } + + absl::string_view token = text.substr(0, pos); + text_ = text.substr(pos); + return token; +} + +/// +static bool read_file_tokens(const char *filename, TokenList &tokens) +{ + std::ifstream stream(filename); + std::string line; + + std::string text; + while (std::getline(stream, line)) { + if (!line.empty() && line[0] != '#') { + text.append(line); + text.push_back('\n'); + } + } + + if (stream.bad()) + return false; + + tokenizer tok(text, " \t\r\n", "{}"); + absl::string_view token; + while (!(token = tok.next()).empty()) + tokens.emplace_back(token); + + return !stream.bad(); +} diff --git a/editor/tools/layout-maker/sources/reader.h b/editor/tools/layout-maker/sources/reader.h new file mode 100644 index 00000000..589bd307 --- /dev/null +++ b/editor/tools/layout-maker/sources/reader.h @@ -0,0 +1,13 @@ +#pragma once +#include "layout.h" +#include +#include + +Layout read_file_layout(const char *filename); + +/// +struct file_format_error : public std::runtime_error { +public: + explicit file_format_error(const std::string &reason = "Format error") + : runtime_error(reason) {} +}; diff --git a/lv2/CMakeLists.txt b/lv2/CMakeLists.txt index 3322d3d1..a888ca81 100644 --- a/lv2/CMakeLists.txt +++ b/lv2/CMakeLists.txt @@ -98,10 +98,9 @@ endforeach() if (SFIZZ_LV2_UI) execute_process ( COMMAND "${CMAKE_COMMAND}" -E make_directory "${PROJECT_BINARY_DIR}/Contents/Resources") - foreach(res ${EDITOR_RESOURCES}) - file (COPY "${CMAKE_CURRENT_SOURCE_DIR}/../editor/resources/${res}" - DESTINATION "${PROJECT_BINARY_DIR}/Contents/Resources") - endforeach() + copy_editor_resources( + "${CMAKE_CURRENT_SOURCE_DIR}/../editor/resources" + "${PROJECT_BINARY_DIR}/Contents/Resources") endif() # Installation diff --git a/scripts/innosetup.iss.in b/scripts/innosetup.iss.in index b287de6a..7c845a4b 100644 --- a/scripts/innosetup.iss.in +++ b/scripts/innosetup.iss.in @@ -50,9 +50,7 @@ Name: "vst3"; Description: "VST3 plugin"; Types: full custom; [Files] Source: "sfizz.lv2\Contents\Binary\sfizz.dll"; Components: lv2; DestDir: "{commoncf}\LV2\sfizz.lv2\Contents\Binary"; Flags: ignoreversion Source: "sfizz.lv2\Contents\Binary\sfizz_ui.dll"; Components: lv2; DestDir: "{commoncf}\LV2\sfizz.lv2\Contents\Binary"; Flags: ignoreversion -Source: "sfizz.lv2\Contents\Resources\DefaultInstrument.sfz"; Components: lv2; DestDir: "{commoncf}\LV2\sfizz.lv2\Contents\Resources" -Source: "sfizz.lv2\Contents\Resources\DefaultScale.scl"; Components: lv2; DestDir: "{commoncf}\LV2\sfizz.lv2\Contents\Resources" -Source: "sfizz.lv2\Contents\Resources\logo.png"; Components: lv2; DestDir: "{commoncf}\LV2\sfizz.lv2\Contents\Resources" +Source: "sfizz.lv2\Contents\Resources\*"; Components: lv2; DestDir: "{commoncf}\LV2\sfizz.lv2\Contents\Resources" Source: "sfizz.lv2\manifest.ttl"; Components: lv2; DestDir: "{commoncf}\LV2\sfizz.lv2" Source: "sfizz.lv2\sfizz.ttl"; Components: lv2; DestDir: "{commoncf}\LV2\sfizz.lv2" Source: "sfizz.lv2\sfizz_ui.ttl"; Components: lv2; DestDir: "{commoncf}\LV2\sfizz.lv2" @@ -60,7 +58,7 @@ Source: "sfizz.lv2\lgpl-3.0.txt"; Components: main; DestDir: "{app}" Source: "sfizz.lv2\LICENSE.md"; Components: main; DestDir: "{app}" Source: "sfizz.vst3\desktop.ini"; Components: vst3; DestDir: "{commoncf}\VST3\sfizz.vst3" Source: "sfizz.vst3\Contents\@VST3_PACKAGE_ARCHITECTURE@-win\sfizz.vst3"; Components: vst3; DestDir: "{commoncf}\VST3\sfizz.vst3\Contents\@VST3_PACKAGE_ARCHITECTURE@-win"; Flags: ignoreversion -Source: "sfizz.vst3\Contents\Resources\logo.png"; Components: vst3; DestDir: "{commoncf}\VST3\sfizz.vst3\Contents\Resources" +Source: "sfizz.vst3\Contents\Resources\*"; Components: vst3; DestDir: "{commoncf}\VST3\sfizz.vst3\Contents\Resources" Source: "sfizz.vst3\Plugin.ico"; Components: vst3; DestDir: "{commoncf}\VST3\sfizz.vst3" Source: "sfizz.vst3\gpl-3.0.txt"; Components: main; DestDir: "{app}" ;Source: "setup\vc_redist.x64.exe"; DestDir: {tmp}; Flags: deleteafterinstall diff --git a/vst/CMakeLists.txt b/vst/CMakeLists.txt index c4b3538e..bbd2ff2e 100644 --- a/vst/CMakeLists.txt +++ b/vst/CMakeLists.txt @@ -68,10 +68,9 @@ endif() # Create the bundle (see "VST 3 Locations / Format") execute_process ( COMMAND "${CMAKE_COMMAND}" -E make_directory "${PROJECT_BINARY_DIR}/${VSTPLUGIN_BUNDLE_NAME}/Contents/Resources") -foreach(res ${EDITOR_RESOURCES}) - file (COPY "${CMAKE_CURRENT_SOURCE_DIR}/../editor/resources/${res}" - DESTINATION "${PROJECT_BINARY_DIR}/${VSTPLUGIN_BUNDLE_NAME}/Contents/Resources") -endforeach() +copy_editor_resources( + "${CMAKE_CURRENT_SOURCE_DIR}/../editor/resources" + "${PROJECT_BINARY_DIR}/${VSTPLUGIN_BUNDLE_NAME}/Contents/Resources") if(WIN32) set_target_properties(${VSTPLUGIN_PRJ_NAME} PROPERTIES SUFFIX ".vst3"