Separate the editor code from VST
This commit is contained in:
parent
e2a0c521c3
commit
e2b8b21967
29 changed files with 1557 additions and 1062 deletions
2
.gitmodules
vendored
2
.gitmodules
vendored
|
|
@ -16,6 +16,6 @@
|
||||||
url = https://github.com/sfztools/vst3_public_sdk.git
|
url = https://github.com/sfztools/vst3_public_sdk.git
|
||||||
shallow = true
|
shallow = true
|
||||||
[submodule "vst/external/VST_SDK/VST3_SDK/vstgui4"]
|
[submodule "vst/external/VST_SDK/VST3_SDK/vstgui4"]
|
||||||
path = vst/external/VST_SDK/VST3_SDK/vstgui4
|
path = editor/external/vstgui4
|
||||||
url = https://github.com/sfztools/vstgui.git
|
url = https://github.com/sfztools/vstgui.git
|
||||||
shallow = true
|
shallow = true
|
||||||
|
|
|
||||||
|
|
@ -110,6 +110,7 @@ jobs:
|
||||||
env:
|
env:
|
||||||
- INSTALL_DIR="sfizz-plugins-${TRAVIS_BRANCH}-${TRAVIS_OS_NAME}-${TRAVIS_CPU_ARCH}"
|
- INSTALL_DIR="sfizz-plugins-${TRAVIS_BRANCH}-${TRAVIS_OS_NAME}-${TRAVIS_CPU_ARCH}"
|
||||||
- ENABLE_VST_PLUGIN=OFF
|
- ENABLE_VST_PLUGIN=OFF
|
||||||
|
- ENABLE_LV2_UI=OFF
|
||||||
addons:
|
addons:
|
||||||
apt:
|
apt:
|
||||||
packages:
|
packages:
|
||||||
|
|
@ -125,6 +126,7 @@ jobs:
|
||||||
env:
|
env:
|
||||||
- INSTALL_DIR="sfizz-plugins-${TRAVIS_BRANCH}-${TRAVIS_OS_NAME}-${TRAVIS_CPU_ARCH}"
|
- INSTALL_DIR="sfizz-plugins-${TRAVIS_BRANCH}-${TRAVIS_OS_NAME}-${TRAVIS_CPU_ARCH}"
|
||||||
- ENABLE_VST_PLUGIN=ON
|
- ENABLE_VST_PLUGIN=ON
|
||||||
|
- ENABLE_LV2_UI=ON
|
||||||
addons:
|
addons:
|
||||||
apt:
|
apt:
|
||||||
packages:
|
packages:
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ if [[ ${CROSS_COMPILE} == "mingw32" ]]; then
|
||||||
-DENABLE_LTO=OFF \
|
-DENABLE_LTO=OFF \
|
||||||
-DSFIZZ_JACK=OFF \
|
-DSFIZZ_JACK=OFF \
|
||||||
-DSFIZZ_VST=ON \
|
-DSFIZZ_VST=ON \
|
||||||
-DSFIZZ_STATIC_LIBSNDFILE=ON \
|
-DSFIZZ_STATIC_DEPENDENCIES=ON \
|
||||||
-DCMAKE_CXX_STANDARD=17 \
|
-DCMAKE_CXX_STANDARD=17 \
|
||||||
..
|
..
|
||||||
buildenv make -j$(nproc)
|
buildenv make -j$(nproc)
|
||||||
|
|
@ -18,7 +18,7 @@ elif [[ ${CROSS_COMPILE} == "mingw64" ]]; then
|
||||||
-DENABLE_LTO=OFF \
|
-DENABLE_LTO=OFF \
|
||||||
-DSFIZZ_JACK=OFF \
|
-DSFIZZ_JACK=OFF \
|
||||||
-DSFIZZ_VST=ON \
|
-DSFIZZ_VST=ON \
|
||||||
-DSFIZZ_STATIC_LIBSNDFILE=ON \
|
-DSFIZZ_STATIC_DEPENDENCIES=ON \
|
||||||
-DCMAKE_CXX_STANDARD=17 \
|
-DCMAKE_CXX_STANDARD=17 \
|
||||||
..
|
..
|
||||||
buildenv make -j$(nproc)
|
buildenv make -j$(nproc)
|
||||||
|
|
|
||||||
|
|
@ -7,5 +7,5 @@ mkdir -p build/${INSTALL_DIR} && cd build
|
||||||
|
|
||||||
buildenv mod-plugin-builder /usr/local/bin/cmake \
|
buildenv mod-plugin-builder /usr/local/bin/cmake \
|
||||||
-DSFIZZ_SYSTEM_PROCESSOR=armv7-a \
|
-DSFIZZ_SYSTEM_PROCESSOR=armv7-a \
|
||||||
-DCMAKE_BUILD_TYPE=Release -DSFIZZ_JACK=OFF ..
|
-DCMAKE_BUILD_TYPE=Release -DSFIZZ_JACK=OFF -DSFIZZ_LV2_UI=OFF ..
|
||||||
buildenv mod-plugin-builder make -j$(nproc)
|
buildenv mod-plugin-builder make -j$(nproc)
|
||||||
|
|
|
||||||
|
|
@ -5,9 +5,10 @@ mkdir -p build/${INSTALL_DIR} && cd build
|
||||||
cmake -DCMAKE_BUILD_TYPE=Release \
|
cmake -DCMAKE_BUILD_TYPE=Release \
|
||||||
-DSFIZZ_JACK=OFF \
|
-DSFIZZ_JACK=OFF \
|
||||||
-DSFIZZ_VST="$ENABLE_VST_PLUGIN" \
|
-DSFIZZ_VST="$ENABLE_VST_PLUGIN" \
|
||||||
|
-DSFIZZ_LV2_UI="$ENABLE_LV2_UI" \
|
||||||
-DSFIZZ_TESTS=OFF \
|
-DSFIZZ_TESTS=OFF \
|
||||||
-DSFIZZ_SHARED=OFF \
|
-DSFIZZ_SHARED=OFF \
|
||||||
-DSFIZZ_STATIC_LIBSNDFILE=ON \
|
-DSFIZZ_STATIC_DEPENDENCIES=ON \
|
||||||
-DCMAKE_CXX_STANDARD=17 \
|
-DCMAKE_CXX_STANDARD=17 \
|
||||||
..
|
..
|
||||||
make -j$(nproc)
|
make -j$(nproc)
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ cmake -DCMAKE_BUILD_TYPE=Release \
|
||||||
-DSFIZZ_JACK=OFF \
|
-DSFIZZ_JACK=OFF \
|
||||||
-DSFIZZ_TESTS=ON \
|
-DSFIZZ_TESTS=ON \
|
||||||
-DSFIZZ_SHARED=OFF \
|
-DSFIZZ_SHARED=OFF \
|
||||||
-DSFIZZ_STATIC_LIBSNDFILE=OFF \
|
-DSFIZZ_STATIC_DEPENDENCIES=OFF \
|
||||||
-DSFIZZ_LV2=OFF \
|
-DSFIZZ_LV2=OFF \
|
||||||
-DCMAKE_CXX_STANDARD=17 \
|
-DCMAKE_CXX_STANDARD=17 \
|
||||||
..
|
..
|
||||||
|
|
|
||||||
|
|
@ -19,16 +19,11 @@ include (SfizzConfig)
|
||||||
# Build Options
|
# Build Options
|
||||||
set (BUILD_TESTING OFF CACHE BOOL "Disable Abseil's tests [default: OFF]")
|
set (BUILD_TESTING OFF CACHE BOOL "Disable Abseil's tests [default: OFF]")
|
||||||
|
|
||||||
# On macOS add the needed directories for both library and jack client
|
|
||||||
if (APPLE)
|
|
||||||
include_directories (SYSTEM /usr/local/opt/libsndfile/include)
|
|
||||||
link_directories (/usr/local/opt/libsndfile/lib)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
option (ENABLE_LTO "Enable Link Time Optimization [default: ON]" ON)
|
option (ENABLE_LTO "Enable Link Time Optimization [default: ON]" ON)
|
||||||
option (SFIZZ_JACK "Enable JACK stand-alone build [default: ON]" ON)
|
option (SFIZZ_JACK "Enable JACK stand-alone build [default: ON]" ON)
|
||||||
option (SFIZZ_RENDER "Enable renderer of SMF files [default: ON]" ON)
|
option (SFIZZ_RENDER "Enable renderer of SMF files [default: ON]" ON)
|
||||||
option (SFIZZ_LV2 "Enable LV2 plug-in build [default: ON]" ON)
|
option (SFIZZ_LV2 "Enable LV2 plug-in build [default: ON]" ON)
|
||||||
|
option (SFIZZ_LV2_UI "Enable LV2 plug-in user interface [default: ON]" ON)
|
||||||
option (SFIZZ_VST "Enable VST plug-in build [default: OFF]" OFF)
|
option (SFIZZ_VST "Enable VST plug-in build [default: OFF]" OFF)
|
||||||
option (SFIZZ_AU "Enable AU plug-in build [default: OFF]" OFF)
|
option (SFIZZ_AU "Enable AU plug-in build [default: OFF]" OFF)
|
||||||
option (SFIZZ_BENCHMARKS "Enable benchmarks build [default: OFF]" OFF)
|
option (SFIZZ_BENCHMARKS "Enable benchmarks build [default: OFF]" OFF)
|
||||||
|
|
@ -36,7 +31,7 @@ option (SFIZZ_TESTS "Enable tests build [default: OFF]" OFF)
|
||||||
option (SFIZZ_DEVTOOLS "Enable developer tools build [default: OFF]" OFF)
|
option (SFIZZ_DEVTOOLS "Enable developer tools build [default: OFF]" OFF)
|
||||||
option (SFIZZ_SHARED "Enable shared library build [default: ON]" ON)
|
option (SFIZZ_SHARED "Enable shared library build [default: ON]" ON)
|
||||||
option (SFIZZ_USE_VCPKG "Assume that sfizz is build using vcpkg [default: OFF]" OFF)
|
option (SFIZZ_USE_VCPKG "Assume that sfizz is build using vcpkg [default: OFF]" OFF)
|
||||||
option (SFIZZ_STATIC_LIBSNDFILE "Link libsndfile statically [default: OFF]" OFF)
|
option (SFIZZ_STATIC_DEPENDENCIES "Link dependencies statically [default: OFF]" OFF)
|
||||||
option (SFIZZ_RELEASE_ASSERTS "Forced assertions in release builds [default: OFF]" OFF)
|
option (SFIZZ_RELEASE_ASSERTS "Forced assertions in release builds [default: OFF]" OFF)
|
||||||
|
|
||||||
# Don't use IPO in non Release builds
|
# Don't use IPO in non Release builds
|
||||||
|
|
@ -51,6 +46,10 @@ add_subdirectory (src)
|
||||||
# Optional targets
|
# Optional targets
|
||||||
add_subdirectory (clients)
|
add_subdirectory (clients)
|
||||||
|
|
||||||
|
if ((SFIZZ_LV2 AND SFIZZ_LV2_UI) OR SFIZZ_VST)
|
||||||
|
add_subdirectory (editor)
|
||||||
|
endif()
|
||||||
|
|
||||||
if (SFIZZ_LV2)
|
if (SFIZZ_LV2)
|
||||||
add_subdirectory (lv2)
|
add_subdirectory (lv2)
|
||||||
endif()
|
endif()
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,22 @@ else()
|
||||||
set (LV2PLUGIN_SPDX_LICENSE_ID "ISC")
|
set (LV2PLUGIN_SPDX_LICENSE_ID "ISC")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(SFIZZ_LV2_UI)
|
||||||
|
set(LV2PLUGIN_IF_ENABLE_UI "")
|
||||||
|
else()
|
||||||
|
set(LV2PLUGIN_IF_ENABLE_UI "#")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(WIN32)
|
||||||
|
set(LV2_UI_TYPE "WindowsUI")
|
||||||
|
elseif(APPLE)
|
||||||
|
set(LV2_UI_TYPE "CocoaUI")
|
||||||
|
elseif(HAIKU)
|
||||||
|
set(LV2_UI_TYPE "BeUI")
|
||||||
|
else()
|
||||||
|
set(LV2_UI_TYPE "X11UI")
|
||||||
|
endif()
|
||||||
|
|
||||||
if (MSVC)
|
if (MSVC)
|
||||||
set (LV2PLUGIN_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/lv2" CACHE STRING
|
set (LV2PLUGIN_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/lv2" CACHE STRING
|
||||||
"Install destination for LV2 bundle [default: ${CMAKE_INSTALL_PREFIX}/lv2}]")
|
"Install destination for LV2 bundle [default: ${CMAKE_INSTALL_PREFIX}/lv2}]")
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,11 @@ if (WIN32)
|
||||||
add_compile_definitions(_WIN32_WINNT=0x601)
|
add_compile_definitions(_WIN32_WINNT=0x601)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# Do not define macros `min` and `max`
|
||||||
|
if (WIN32)
|
||||||
|
add_compile_definitions(NOMINMAX)
|
||||||
|
endif()
|
||||||
|
|
||||||
# The variable CMAKE_SYSTEM_PROCESSOR is incorrect on Visual studio...
|
# The variable CMAKE_SYSTEM_PROCESSOR is incorrect on Visual studio...
|
||||||
# see https://gitlab.kitware.com/cmake/cmake/issues/15170
|
# see https://gitlab.kitware.com/cmake/cmake/issues/15170
|
||||||
|
|
||||||
|
|
@ -48,6 +53,7 @@ function(sfizz_enable_fast_math NAME)
|
||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
# The sndfile library
|
||||||
add_library(sfizz-sndfile INTERFACE)
|
add_library(sfizz-sndfile INTERFACE)
|
||||||
|
|
||||||
if (SFIZZ_USE_VCPKG OR CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
|
if (SFIZZ_USE_VCPKG OR CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
|
||||||
|
|
@ -59,11 +65,12 @@ else()
|
||||||
find_package(PkgConfig REQUIRED)
|
find_package(PkgConfig REQUIRED)
|
||||||
pkg_check_modules(SNDFILE "sndfile" REQUIRED)
|
pkg_check_modules(SNDFILE "sndfile" REQUIRED)
|
||||||
target_include_directories(sfizz-sndfile INTERFACE ${SNDFILE_INCLUDE_DIRS})
|
target_include_directories(sfizz-sndfile INTERFACE ${SNDFILE_INCLUDE_DIRS})
|
||||||
if (SFIZZ_STATIC_LIBSNDFILE)
|
if (SFIZZ_STATIC_DEPENDENCIES)
|
||||||
target_link_libraries(sfizz-sndfile INTERFACE ${SNDFILE_STATIC_LIBRARIES})
|
target_link_libraries(sfizz-sndfile INTERFACE ${SNDFILE_STATIC_LIBRARIES})
|
||||||
else()
|
else()
|
||||||
target_link_libraries(sfizz-sndfile INTERFACE ${SNDFILE_LIBRARIES})
|
target_link_libraries(sfizz-sndfile INTERFACE ${SNDFILE_LIBRARIES})
|
||||||
endif()
|
endif()
|
||||||
|
link_directories(${SNDFILE_LIBRARY_DIRS})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -112,12 +119,13 @@ Build using LTO: ${ENABLE_LTO}
|
||||||
Build as shared library: ${SFIZZ_SHARED}
|
Build as shared library: ${SFIZZ_SHARED}
|
||||||
Build JACK stand-alone client: ${SFIZZ_JACK}
|
Build JACK stand-alone client: ${SFIZZ_JACK}
|
||||||
Build LV2 plug-in: ${SFIZZ_LV2}
|
Build LV2 plug-in: ${SFIZZ_LV2}
|
||||||
|
Build LV2 user interface: ${SFIZZ_LV2_UI}
|
||||||
Build VST plug-in: ${SFIZZ_VST}
|
Build VST plug-in: ${SFIZZ_VST}
|
||||||
Build AU plug-in: ${SFIZZ_AU}
|
Build AU plug-in: ${SFIZZ_AU}
|
||||||
Build benchmarks: ${SFIZZ_BENCHMARKS}
|
Build benchmarks: ${SFIZZ_BENCHMARKS}
|
||||||
Build tests: ${SFIZZ_TESTS}
|
Build tests: ${SFIZZ_TESTS}
|
||||||
Use vcpkg: ${SFIZZ_USE_VCPKG}
|
Use vcpkg: ${SFIZZ_USE_VCPKG}
|
||||||
Statically link libsndfile: ${SFIZZ_STATIC_LIBSNDFILE}
|
Statically link dependencies: ${SFIZZ_STATIC_DEPENDENCIES}
|
||||||
Link libatomic: ${SFIZZ_LINK_LIBATOMIC}
|
Link libatomic: ${SFIZZ_LINK_LIBATOMIC}
|
||||||
Use clang libc++: ${USE_LIBCPP}
|
Use clang libc++: ${USE_LIBCPP}
|
||||||
Release asserts: ${SFIZZ_RELEASE_ASSERTS}
|
Release asserts: ${SFIZZ_RELEASE_ASSERTS}
|
||||||
|
|
|
||||||
16
editor/CMakeLists.txt
Normal file
16
editor/CMakeLists.txt
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
set(VSTGUI_BASEDIR "${CMAKE_CURRENT_SOURCE_DIR}/external/vstgui4")
|
||||||
|
include("cmake/Vstgui.cmake")
|
||||||
|
|
||||||
|
# editor
|
||||||
|
add_library(sfizz_editor STATIC EXCLUDE_FROM_ALL
|
||||||
|
src/editor/EditIds.h
|
||||||
|
src/editor/EditIds.cpp
|
||||||
|
src/editor/Editor.h
|
||||||
|
src/editor/Editor.cpp
|
||||||
|
src/editor/EditorController.h
|
||||||
|
src/editor/GUIComponents.h
|
||||||
|
src/editor/GUIComponents.cpp
|
||||||
|
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 absl::strings)
|
||||||
209
editor/cmake/Vstgui.cmake
Normal file
209
editor/cmake/Vstgui.cmake
Normal file
|
|
@ -0,0 +1,209 @@
|
||||||
|
add_library(sfizz-vstgui STATIC EXCLUDE_FROM_ALL
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/animation/animations.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/animation/animator.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/animation/timingfunctions.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/cbitmap.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/cbitmapfilter.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/ccolor.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/cdatabrowser.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/cdrawcontext.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/cdrawmethods.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/cdropsource.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/cfileselector.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/cfont.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/cframe.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/cgradientview.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/cgraphicspath.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/clayeredviewcontainer.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/clinestyle.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/coffscreencontext.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/controls/cautoanimation.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/controls/cbuttons.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/controls/ccolorchooser.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/controls/ccontrol.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/controls/cfontchooser.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/controls/cknob.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/controls/clistcontrol.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/controls/cmoviebitmap.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/controls/cmoviebutton.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/controls/coptionmenu.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/controls/cparamdisplay.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/controls/cscrollbar.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/controls/csearchtextedit.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/controls/csegmentbutton.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/controls/cslider.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/controls/cspecialdigit.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/controls/csplashscreen.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/controls/cstringlist.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/controls/cswitch.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/controls/ctextedit.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/controls/ctextlabel.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/controls/cvumeter.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/controls/cxypad.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/copenglview.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/cpoint.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/crect.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/crowcolumnview.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/cscrollview.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/cshadowviewcontainer.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/csplitview.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/cstring.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/ctabview.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/ctooltipsupport.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/cview.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/cviewcontainer.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/cvstguitimer.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/genericstringlistdatabrowsersource.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/common/genericoptionmenu.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/vstguidebug.cpp")
|
||||||
|
|
||||||
|
if(WIN32)
|
||||||
|
target_sources(sfizz-vstgui PRIVATE
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/common/fileresourceinputstream.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/win32/direct2d/d2dbitmap.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/win32/direct2d/d2ddrawcontext.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/win32/direct2d/d2dfont.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/win32/direct2d/d2dgraphicspath.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/win32/win32datapackage.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/win32/win32dragging.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/win32/win32frame.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/win32/win32openglview.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/win32/win32optionmenu.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/win32/win32support.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/win32/win32textedit.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/win32/winfileselector.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/win32/winstring.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/win32/wintimer.cpp")
|
||||||
|
elseif(APPLE)
|
||||||
|
target_sources(sfizz-vstgui PRIVATE
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/common/fileresourceinputstream.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/common/genericoptionmenu.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/common/generictextedit.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/mac/carbon/hiviewframe.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/mac/carbon/hiviewoptionmenu.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/mac/carbon/hiviewtextedit.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/mac/caviewlayer.mm"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/mac/cfontmac.mm"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/mac/cgbitmap.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/mac/cgdrawcontext.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/mac/cocoa/autoreleasepool.mm"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/mac/cocoa/cocoahelpers.mm"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/mac/cocoa/cocoaopenglview.mm"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/mac/cocoa/cocoatextedit.mm"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/mac/cocoa/nsviewdraggingsession.mm"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/mac/cocoa/nsviewframe.mm"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/mac/cocoa/nsviewoptionmenu.mm"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/mac/macclipboard.mm"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/mac/macfileselector.mm"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/mac/macglobals.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/mac/macstring.mm"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/mac/mactimer.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/mac/quartzgraphicspath.cpp")
|
||||||
|
else()
|
||||||
|
target_sources(sfizz-vstgui PRIVATE
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/common/fileresourceinputstream.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/common/generictextedit.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/linux/cairobitmap.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/linux/cairocontext.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/linux/cairofont.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/linux/cairogradient.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/linux/cairopath.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/linux/linuxstring.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/linux/x11fileselector.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/linux/x11frame.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/linux/x11platform.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/linux/x11timer.cpp"
|
||||||
|
"${VSTGUI_BASEDIR}/vstgui/lib/platform/linux/x11utils.cpp")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
target_include_directories(sfizz-vstgui PUBLIC "${VSTGUI_BASEDIR}")
|
||||||
|
|
||||||
|
if(WIN32)
|
||||||
|
if (NOT MSVC)
|
||||||
|
# autolinked on MSVC with pragmas
|
||||||
|
find_library(OPENGL32_LIBRARY "opengl32")
|
||||||
|
find_library(D2D1_LIBRARY "d2d1")
|
||||||
|
find_library(DWRITE_LIBRARY "dwrite")
|
||||||
|
find_library(DWMAPI_LIBRARY "dwmapi")
|
||||||
|
find_library(WINDOWSCODECS_LIBRARY "windowscodecs")
|
||||||
|
find_library(SHLWAPI_LIBRARY "shlwapi")
|
||||||
|
target_link_libraries(sfizz-vstgui PRIVATE
|
||||||
|
"${OPENGL32_LIBRARY}"
|
||||||
|
"${D2D1_LIBRARY}"
|
||||||
|
"${DWRITE_LIBRARY}"
|
||||||
|
"${DWMAPI_LIBRARY}"
|
||||||
|
"${WINDOWSCODECS_LIBRARY}"
|
||||||
|
"${SHLWAPI_LIBRARY}")
|
||||||
|
endif()
|
||||||
|
elseif(APPLE)
|
||||||
|
find_library(APPLE_COREFOUNDATION_LIBRARY "CoreFoundation")
|
||||||
|
find_library(APPLE_FOUNDATION_LIBRARY "Foundation")
|
||||||
|
find_library(APPLE_COCOA_LIBRARY "Cocoa")
|
||||||
|
find_library(APPLE_OPENGL_LIBRARY "OpenGL")
|
||||||
|
find_library(APPLE_ACCELERATE_LIBRARY "Accelerate")
|
||||||
|
find_library(APPLE_QUARTZCORE_LIBRARY "QuartzCore")
|
||||||
|
find_library(APPLE_CARBON_LIBRARY "Carbon")
|
||||||
|
find_library(APPLE_AUDIOTOOLBOX_LIBRARY "AudioToolbox")
|
||||||
|
find_library(APPLE_COREAUDIO_LIBRARY "CoreAudio")
|
||||||
|
find_library(APPLE_COREMIDI_LIBRARY "CoreMIDI")
|
||||||
|
target_link_libraries(sfizz-vstgui PRIVATE
|
||||||
|
"${APPLE_COREFOUNDATION_LIBRARY}"
|
||||||
|
"${APPLE_FOUNDATION_LIBRARY}"
|
||||||
|
"${APPLE_COCOA_LIBRARY}"
|
||||||
|
"${APPLE_OPENGL_LIBRARY}"
|
||||||
|
"${APPLE_ACCELERATE_LIBRARY}"
|
||||||
|
"${APPLE_QUARTZCORE_LIBRARY}"
|
||||||
|
"${APPLE_CARBON_LIBRARY}"
|
||||||
|
"${APPLE_AUDIOTOOLBOX_LIBRARY}"
|
||||||
|
"${APPLE_COREAUDIO_LIBRARY}"
|
||||||
|
"${APPLE_COREMIDI_LIBRARY}")
|
||||||
|
else()
|
||||||
|
find_package(X11 REQUIRED)
|
||||||
|
find_package(Freetype REQUIRED)
|
||||||
|
find_package(PkgConfig REQUIRED)
|
||||||
|
pkg_check_modules(LIBXCB REQUIRED xcb)
|
||||||
|
pkg_check_modules(LIBXCB_UTIL REQUIRED xcb-util)
|
||||||
|
pkg_check_modules(LIBXCB_CURSOR REQUIRED xcb-cursor)
|
||||||
|
pkg_check_modules(LIBXCB_KEYSYMS REQUIRED xcb-keysyms)
|
||||||
|
pkg_check_modules(LIBXCB_XKB REQUIRED xcb-xkb)
|
||||||
|
pkg_check_modules(LIBXKB_COMMON REQUIRED xkbcommon)
|
||||||
|
pkg_check_modules(LIBXKB_COMMON_X11 REQUIRED xkbcommon-x11)
|
||||||
|
pkg_check_modules(CAIRO REQUIRED cairo)
|
||||||
|
pkg_check_modules(FONTCONFIG REQUIRED fontconfig)
|
||||||
|
target_include_directories(sfizz-vstgui PRIVATE
|
||||||
|
${X11_INCLUDE_DIRS}
|
||||||
|
${FREETYPE_INCLUDE_DIRS}
|
||||||
|
${LIBXCB_INCLUDE_DIRS}
|
||||||
|
${LIBXCB_UTIL_INCLUDE_DIRS}
|
||||||
|
${LIBXCB_CURSOR_INCLUDE_DIRS}
|
||||||
|
${LIBXCB_KEYSYMS_INCLUDE_DIRS}
|
||||||
|
${LIBXCB_XKB_INCLUDE_DIRS}
|
||||||
|
${LIBXKB_COMMON_INCLUDE_DIRS}
|
||||||
|
${LIBXKB_COMMON_X11_INCLUDE_DIRS}
|
||||||
|
${CAIRO_INCLUDE_DIRS}
|
||||||
|
${FONTCONFIG_INCLUDE_DIRS})
|
||||||
|
target_link_libraries(sfizz-vstgui PRIVATE
|
||||||
|
${X11_LIBRARIES}
|
||||||
|
${FREETYPE_LIBRARIES}
|
||||||
|
${LIBXCB_LIBRARIES}
|
||||||
|
${LIBXCB_UTIL_LIBRARIES}
|
||||||
|
${LIBXCB_CURSOR_LIBRARIES}
|
||||||
|
${LIBXCB_KEYSYMS_LIBRARIES}
|
||||||
|
${LIBXCB_XKB_LIBRARIES}
|
||||||
|
${LIBXKB_COMMON_LIBRARIES}
|
||||||
|
${LIBXKB_COMMON_X11_LIBRARIES}
|
||||||
|
${CAIRO_LIBRARIES}
|
||||||
|
${FONTCONFIG_LIBRARIES})
|
||||||
|
find_library(DL_LIBRARY "dl")
|
||||||
|
if(DL_LIBRARY)
|
||||||
|
target_link_libraries(sfizz-vstgui PRIVATE "${DL_LIBRARY}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(${CMAKE_BUILD_TYPE} MATCHES "Debug")
|
||||||
|
target_compile_definitions(sfizz-vstgui PRIVATE "DEVELOPMENT")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(${CMAKE_BUILD_TYPE} MATCHES "Release")
|
||||||
|
target_compile_definitions(sfizz-vstgui PRIVATE "RELEASE")
|
||||||
|
endif()
|
||||||
32
editor/src/editor/EditIds.cpp
Normal file
32
editor/src/editor/EditIds.cpp
Normal file
|
|
@ -0,0 +1,32 @@
|
||||||
|
// 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 "EditIds.h"
|
||||||
|
|
||||||
|
EditRange EditRange::get(EditId id)
|
||||||
|
{
|
||||||
|
switch (id) {
|
||||||
|
default:
|
||||||
|
assert(false);
|
||||||
|
return {};
|
||||||
|
case EditId::Volume:
|
||||||
|
return { 0, -60, 6 };
|
||||||
|
case EditId::Polyphony:
|
||||||
|
return { 64, 1, 256 };
|
||||||
|
case EditId::Oversampling:
|
||||||
|
return { 0, 0, 3 };
|
||||||
|
case EditId::PreloadSize:
|
||||||
|
return { 8192, 1024, 65536 };
|
||||||
|
case EditId::ScalaRootKey:
|
||||||
|
return { 60, 0, 127 };
|
||||||
|
case EditId::TuningFrequency:
|
||||||
|
return { 440, 300, 500 };
|
||||||
|
case EditId::StretchTuning:
|
||||||
|
return { 0, 0, 1 };
|
||||||
|
case EditId::UIActivePanel:
|
||||||
|
return { 0, 0, 255 };
|
||||||
|
}
|
||||||
|
}
|
||||||
37
editor/src/editor/EditIds.h
Normal file
37
editor/src/editor/EditIds.h
Normal file
|
|
@ -0,0 +1,37 @@
|
||||||
|
// 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
|
||||||
|
#include <cassert>
|
||||||
|
|
||||||
|
enum class EditId : int {
|
||||||
|
SfzFile,
|
||||||
|
Volume,
|
||||||
|
Polyphony,
|
||||||
|
Oversampling,
|
||||||
|
PreloadSize,
|
||||||
|
ScalaFile,
|
||||||
|
ScalaRootKey,
|
||||||
|
TuningFrequency,
|
||||||
|
StretchTuning,
|
||||||
|
UINumCurves,
|
||||||
|
UINumMasters,
|
||||||
|
UINumGroups,
|
||||||
|
UINumRegions,
|
||||||
|
UINumPreloadedSamples,
|
||||||
|
UINumActiveVoices,
|
||||||
|
UIActivePanel,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct EditRange {
|
||||||
|
float def = 0.0;
|
||||||
|
float min = 0.0;
|
||||||
|
float max = 1.0;
|
||||||
|
constexpr EditRange() = default;
|
||||||
|
constexpr EditRange(float def, float min, float max)
|
||||||
|
: def(def), min(min), max(max) {}
|
||||||
|
static EditRange get(EditId id);
|
||||||
|
};
|
||||||
977
editor/src/editor/Editor.cpp
Normal file
977
editor/src/editor/Editor.cpp
Normal file
|
|
@ -0,0 +1,977 @@
|
||||||
|
// 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 "Editor.h"
|
||||||
|
#include "EditorController.h"
|
||||||
|
#include "EditIds.h"
|
||||||
|
#include "GUIComponents.h"
|
||||||
|
#include <absl/strings/string_view.h>
|
||||||
|
#include <cstdarg>
|
||||||
|
#include <cstdio>
|
||||||
|
|
||||||
|
#include "utility/vstgui_before.h"
|
||||||
|
#include "vstgui/vstgui.h"
|
||||||
|
#include "utility/vstgui_after.h"
|
||||||
|
|
||||||
|
using namespace VSTGUI;
|
||||||
|
|
||||||
|
const int Editor::viewWidth { 482 };
|
||||||
|
const int Editor::viewHeight { 225 };
|
||||||
|
|
||||||
|
struct Editor::Impl : EditorController::Receiver, IControlListener {
|
||||||
|
EditorController* ctrl_ = nullptr;
|
||||||
|
CFrame* frame_ = nullptr;
|
||||||
|
SharedPointer<CViewContainer> view_;
|
||||||
|
|
||||||
|
enum {
|
||||||
|
kPanelGeneral,
|
||||||
|
// kPanelControls,
|
||||||
|
kPanelSettings,
|
||||||
|
kPanelTuning,
|
||||||
|
kPanelInfo,
|
||||||
|
kNumPanels,
|
||||||
|
};
|
||||||
|
|
||||||
|
unsigned activePanel_ = 0;
|
||||||
|
CViewContainer* subPanels_[kNumPanels] = {};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
kTagLoadSfzFile,
|
||||||
|
kTagSetVolume,
|
||||||
|
kTagSetNumVoices,
|
||||||
|
kTagSetOversampling,
|
||||||
|
kTagSetPreloadSize,
|
||||||
|
kTagLoadScalaFile,
|
||||||
|
kTagSetScalaRootKey,
|
||||||
|
kTagSetTuningFrequency,
|
||||||
|
kTagSetStretchedTuning,
|
||||||
|
kTagFirstChangePanel,
|
||||||
|
kTagLastChangePanel = kTagFirstChangePanel + kNumPanels - 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
CTextLabel* sfzFileLabel_ = nullptr;
|
||||||
|
CTextLabel* scalaFileLabel_ = nullptr;
|
||||||
|
CSliderBase *volumeSlider_ = nullptr;
|
||||||
|
CTextLabel* volumeLabel_ = nullptr;
|
||||||
|
CSliderBase *numVoicesSlider_ = nullptr;
|
||||||
|
CTextLabel* numVoicesLabel_ = nullptr;
|
||||||
|
CSliderBase *oversamplingSlider_ = nullptr;
|
||||||
|
CTextLabel* oversamplingLabel_ = nullptr;
|
||||||
|
CSliderBase *preloadSizeSlider_ = nullptr;
|
||||||
|
CTextLabel* preloadSizeLabel_ = nullptr;
|
||||||
|
CSliderBase *scalaRootKeySlider_ = nullptr;
|
||||||
|
CTextLabel* scalaRootKeyLabel_ = nullptr;
|
||||||
|
CSliderBase *tuningFrequencySlider_ = nullptr;
|
||||||
|
CTextLabel* tuningFrequencyLabel_ = nullptr;
|
||||||
|
CSliderBase *stretchedTuningSlider_ = nullptr;
|
||||||
|
CTextLabel* stretchedTuningLabel_ = nullptr;
|
||||||
|
|
||||||
|
CTextLabel* infoCurvesLabel_ = nullptr;
|
||||||
|
CTextLabel* infoMastersLabel_ = nullptr;
|
||||||
|
CTextLabel* infoGroupsLabel_ = nullptr;
|
||||||
|
CTextLabel* infoRegionsLabel_ = nullptr;
|
||||||
|
CTextLabel* infoSamplesLabel_ = nullptr;
|
||||||
|
CTextLabel* infoVoicesLabel_ = nullptr;
|
||||||
|
|
||||||
|
void uiReceiveValue(EditId id, const EditValue& v) override;
|
||||||
|
|
||||||
|
void createFrameContents();
|
||||||
|
|
||||||
|
template <class Control>
|
||||||
|
void adjustMinMaxToEditRange(Control* c, EditId id)
|
||||||
|
{
|
||||||
|
const EditRange er = EditRange::get(id);
|
||||||
|
c->setMin(er.min);
|
||||||
|
c->setMax(er.max);
|
||||||
|
c->setDefaultValue(er.def);
|
||||||
|
}
|
||||||
|
|
||||||
|
void chooseSfzFile();
|
||||||
|
void chooseScalaFile();
|
||||||
|
|
||||||
|
void updateSfzFileLabel(const std::string& filePath);
|
||||||
|
void updateScalaFileLabel(const std::string& filePath);
|
||||||
|
static void updateLabelWithFileName(CTextLabel* label, const std::string& filePath);
|
||||||
|
void updateVolumeLabel(float volume);
|
||||||
|
void updateNumVoicesLabel(int numVoices);
|
||||||
|
void updateOversamplingLabel(int oversamplingLog2);
|
||||||
|
void updatePreloadSizeLabel(int preloadSize);
|
||||||
|
void updateScalaRootKeyLabel(int rootKey);
|
||||||
|
void updateTuningFrequencyLabel(float tuningFrequency);
|
||||||
|
void updateStretchedTuningLabel(float stretchedTuning);
|
||||||
|
|
||||||
|
void setActivePanel(unsigned panelId);
|
||||||
|
|
||||||
|
static void formatLabel(CTextLabel* label, const char* fmt, ...);
|
||||||
|
static void vformatLabel(CTextLabel* label, const char* fmt, va_list ap);
|
||||||
|
|
||||||
|
// IControlListener
|
||||||
|
void valueChanged(CControl* ctl) override;
|
||||||
|
void enterOrLeaveEdit(CControl* ctl, bool enter);
|
||||||
|
void controlBeginEdit(CControl* ctl) override;
|
||||||
|
void controlEndEdit(CControl* ctl) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
Editor::Editor(EditorController& ctrl)
|
||||||
|
: impl_(new Impl)
|
||||||
|
{
|
||||||
|
Impl& impl = *impl_;
|
||||||
|
|
||||||
|
impl.ctrl_ = &ctrl;
|
||||||
|
|
||||||
|
ctrl.decorate(&impl);
|
||||||
|
|
||||||
|
impl.createFrameContents();
|
||||||
|
}
|
||||||
|
|
||||||
|
Editor::~Editor()
|
||||||
|
{
|
||||||
|
Impl& impl = *impl_;
|
||||||
|
|
||||||
|
EditorController& ctrl = *impl.ctrl_;
|
||||||
|
ctrl.decorate(nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Editor::open(CFrame& frame)
|
||||||
|
{
|
||||||
|
Impl& impl = *impl_;
|
||||||
|
|
||||||
|
impl.frame_ = &frame;
|
||||||
|
frame.addView(impl.view_.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
void Editor::close()
|
||||||
|
{
|
||||||
|
Impl& impl = *impl_;
|
||||||
|
|
||||||
|
if (impl.frame_) {
|
||||||
|
impl.frame_->removeView(impl.view_.get());
|
||||||
|
impl.frame_ = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Editor::Impl::uiReceiveValue(EditId id, const EditValue& v)
|
||||||
|
{
|
||||||
|
switch (id) {
|
||||||
|
case EditId::SfzFile:
|
||||||
|
{
|
||||||
|
const std::string& value = absl::get<std::string>(v);
|
||||||
|
updateSfzFileLabel(value);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case EditId::Volume:
|
||||||
|
{
|
||||||
|
const float value = absl::get<float>(v);
|
||||||
|
if (volumeSlider_)
|
||||||
|
volumeSlider_->setValue(value);
|
||||||
|
updateVolumeLabel(value);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case EditId::Polyphony:
|
||||||
|
{
|
||||||
|
const int value = static_cast<int>(absl::get<float>(v));
|
||||||
|
if (numVoicesSlider_)
|
||||||
|
numVoicesSlider_->setValue(value);
|
||||||
|
updateNumVoicesLabel(value);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case EditId::Oversampling:
|
||||||
|
{
|
||||||
|
const int value = static_cast<int>(absl::get<float>(v));
|
||||||
|
|
||||||
|
int log2Value = 0;
|
||||||
|
for (int f = value; f > 1; f /= 2)
|
||||||
|
++log2Value;
|
||||||
|
|
||||||
|
if (oversamplingSlider_)
|
||||||
|
oversamplingSlider_->setValue(log2Value);
|
||||||
|
updateOversamplingLabel(log2Value);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case EditId::PreloadSize:
|
||||||
|
{
|
||||||
|
const int value = static_cast<int>(absl::get<float>(v));
|
||||||
|
if (preloadSizeSlider_)
|
||||||
|
preloadSizeSlider_->setValue(value);
|
||||||
|
updatePreloadSizeLabel(value);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case EditId::ScalaFile:
|
||||||
|
{
|
||||||
|
const std::string& value = absl::get<std::string>(v);
|
||||||
|
updateScalaFileLabel(value);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case EditId::ScalaRootKey:
|
||||||
|
{
|
||||||
|
const int value = static_cast<int>(absl::get<float>(v));
|
||||||
|
if (scalaRootKeySlider_)
|
||||||
|
scalaRootKeySlider_->setValue(value);
|
||||||
|
updateScalaRootKeyLabel(value);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case EditId::TuningFrequency:
|
||||||
|
{
|
||||||
|
const float value = absl::get<float>(v);
|
||||||
|
if (tuningFrequencySlider_)
|
||||||
|
tuningFrequencySlider_->setValue(value);
|
||||||
|
updateTuningFrequencyLabel(value);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case EditId::StretchTuning:
|
||||||
|
{
|
||||||
|
const float value = absl::get<float>(v);
|
||||||
|
if (stretchedTuningSlider_)
|
||||||
|
stretchedTuningSlider_->setValue(value);
|
||||||
|
updateStretchedTuningLabel(value);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case EditId::UINumCurves:
|
||||||
|
{
|
||||||
|
const int value = static_cast<int>(absl::get<float>(v));
|
||||||
|
if (CTextLabel* label = infoCurvesLabel_)
|
||||||
|
formatLabel(label, "%u", value);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case EditId::UINumMasters:
|
||||||
|
{
|
||||||
|
const int value = static_cast<int>(absl::get<float>(v));
|
||||||
|
if (CTextLabel* label = infoMastersLabel_)
|
||||||
|
formatLabel(label, "%u", value);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case EditId::UINumGroups:
|
||||||
|
{
|
||||||
|
const int value = static_cast<int>(absl::get<float>(v));
|
||||||
|
if (CTextLabel* label = infoGroupsLabel_)
|
||||||
|
formatLabel(label, "%u", value);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case EditId::UINumRegions:
|
||||||
|
{
|
||||||
|
const int value = static_cast<int>(absl::get<float>(v));
|
||||||
|
if (CTextLabel* label = infoRegionsLabel_)
|
||||||
|
formatLabel(label, "%u", value);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case EditId::UINumPreloadedSamples:
|
||||||
|
{
|
||||||
|
const int value = static_cast<int>(absl::get<float>(v));
|
||||||
|
if (CTextLabel* label = infoSamplesLabel_)
|
||||||
|
formatLabel(label, "%u", value);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case EditId::UINumActiveVoices:
|
||||||
|
{
|
||||||
|
const int value = static_cast<int>(absl::get<float>(v));
|
||||||
|
if (CTextLabel* label = infoVoicesLabel_)
|
||||||
|
formatLabel(label, "%u", value);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case EditId::UIActivePanel:
|
||||||
|
{
|
||||||
|
const int value = static_cast<int>(absl::get<float>(v));
|
||||||
|
setActivePanel(value);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Editor::Impl::createFrameContents()
|
||||||
|
{
|
||||||
|
const CRect bounds { 0.0, 0.0, viewWidth, viewHeight };
|
||||||
|
CViewContainer* view = new CViewContainer(bounds);
|
||||||
|
view_ = view;
|
||||||
|
|
||||||
|
view->setBackgroundColor(CColor(0xff, 0xff, 0xff));
|
||||||
|
|
||||||
|
SharedPointer<CBitmap> logo = new CBitmap("logo.png");
|
||||||
|
|
||||||
|
CRect bottomRow = bounds;
|
||||||
|
bottomRow.top = bottomRow.bottom - 30;
|
||||||
|
|
||||||
|
CRect topRow = bounds;
|
||||||
|
topRow.bottom = topRow.top + 30;
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
panel->setVisible(currentPanel == activePanel_);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Editor::Impl::chooseSfzFile()
|
||||||
|
{
|
||||||
|
SharedPointer<CNewFileSelector> fs(CNewFileSelector::create(frame_));
|
||||||
|
|
||||||
|
fs->setTitle("Load SFZ file");
|
||||||
|
fs->setDefaultExtension(CFileExtension("SFZ", "sfz"));
|
||||||
|
|
||||||
|
if (fs->runModal()) {
|
||||||
|
UTF8StringPtr file = fs->getSelectedFile(0);
|
||||||
|
if (file) {
|
||||||
|
std::string str(file);
|
||||||
|
ctrl_->uiSendValue(EditId::SfzFile, str);
|
||||||
|
updateSfzFileLabel(str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Editor::Impl::chooseScalaFile()
|
||||||
|
{
|
||||||
|
SharedPointer<CNewFileSelector> fs(CNewFileSelector::create(frame_));
|
||||||
|
|
||||||
|
fs->setTitle("Load Scala file");
|
||||||
|
fs->setDefaultExtension(CFileExtension("SCL", "scl"));
|
||||||
|
|
||||||
|
if (fs->runModal()) {
|
||||||
|
UTF8StringPtr file = fs->getSelectedFile(0);
|
||||||
|
if (file) {
|
||||||
|
std::string str(file);
|
||||||
|
ctrl_->uiSendValue(EditId::ScalaFile, str);
|
||||||
|
updateScalaFileLabel(str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Editor::Impl::updateSfzFileLabel(const std::string& filePath)
|
||||||
|
{
|
||||||
|
updateLabelWithFileName(sfzFileLabel_, filePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Editor::Impl::updateScalaFileLabel(const std::string& filePath)
|
||||||
|
{
|
||||||
|
updateLabelWithFileName(scalaFileLabel_, filePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Editor::Impl::updateLabelWithFileName(CTextLabel* label, const std::string& filePath)
|
||||||
|
{
|
||||||
|
if (!label)
|
||||||
|
return;
|
||||||
|
|
||||||
|
std::string fileName;
|
||||||
|
if (filePath.empty())
|
||||||
|
fileName = "<No file>";
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
label->setText(fileName.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
void Editor::Impl::updateVolumeLabel(float volume)
|
||||||
|
{
|
||||||
|
CTextLabel* label = volumeLabel_;
|
||||||
|
if (!label)
|
||||||
|
return;
|
||||||
|
|
||||||
|
char text[64];
|
||||||
|
sprintf(text, "%.1f dB", volume);
|
||||||
|
text[sizeof(text) - 1] = '\0';
|
||||||
|
label->setText(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Editor::Impl::updateNumVoicesLabel(int numVoices)
|
||||||
|
{
|
||||||
|
CTextLabel* label = numVoicesLabel_;
|
||||||
|
if (!label)
|
||||||
|
return;
|
||||||
|
|
||||||
|
char text[64];
|
||||||
|
sprintf(text, "%d", numVoices);
|
||||||
|
text[sizeof(text) - 1] = '\0';
|
||||||
|
label->setText(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Editor::Impl::updateOversamplingLabel(int oversamplingLog2)
|
||||||
|
{
|
||||||
|
CTextLabel* label = oversamplingLabel_;
|
||||||
|
if (!label)
|
||||||
|
return;
|
||||||
|
|
||||||
|
char text[64];
|
||||||
|
sprintf(text, "%dx", 1 << oversamplingLog2);
|
||||||
|
text[sizeof(text) - 1] = '\0';
|
||||||
|
label->setText(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Editor::Impl::updatePreloadSizeLabel(int preloadSize)
|
||||||
|
{
|
||||||
|
CTextLabel* label = preloadSizeLabel_;
|
||||||
|
if (!label)
|
||||||
|
return;
|
||||||
|
|
||||||
|
char text[64];
|
||||||
|
sprintf(text, "%.1f kB", preloadSize * (1.0 / 1024));
|
||||||
|
text[sizeof(text) - 1] = '\0';
|
||||||
|
label->setText(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Editor::Impl::updateScalaRootKeyLabel(int rootKey)
|
||||||
|
{
|
||||||
|
CTextLabel* label = scalaRootKeyLabel_;
|
||||||
|
if (!label)
|
||||||
|
return;
|
||||||
|
|
||||||
|
static const char *octNoteNames[12] = {
|
||||||
|
"C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B",
|
||||||
|
};
|
||||||
|
|
||||||
|
auto noteName = [](int key) -> std::string
|
||||||
|
{
|
||||||
|
int octNum;
|
||||||
|
int octNoteNum;
|
||||||
|
if (key >= 0) {
|
||||||
|
octNum = key / 12 - 1;
|
||||||
|
octNoteNum = key % 12;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
octNum = -2 - (key + 1) / -12;
|
||||||
|
octNoteNum = (key % 12 + 12) % 12;
|
||||||
|
}
|
||||||
|
return std::string(octNoteNames[octNoteNum]) + std::to_string(octNum);
|
||||||
|
};
|
||||||
|
|
||||||
|
label->setText(noteName(rootKey));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Editor::Impl::updateTuningFrequencyLabel(float tuningFrequency)
|
||||||
|
{
|
||||||
|
CTextLabel* label = tuningFrequencyLabel_;
|
||||||
|
if (!label)
|
||||||
|
return;
|
||||||
|
|
||||||
|
char text[64];
|
||||||
|
sprintf(text, "%.1f", tuningFrequency);
|
||||||
|
text[sizeof(text) - 1] = '\0';
|
||||||
|
label->setText(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Editor::Impl::updateStretchedTuningLabel(float stretchedTuning)
|
||||||
|
{
|
||||||
|
CTextLabel* label = stretchedTuningLabel_;
|
||||||
|
if (!label)
|
||||||
|
return;
|
||||||
|
|
||||||
|
char text[64];
|
||||||
|
sprintf(text, "%.3f", stretchedTuning);
|
||||||
|
text[sizeof(text) - 1] = '\0';
|
||||||
|
label->setText(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Editor::Impl::setActivePanel(unsigned panelId)
|
||||||
|
{
|
||||||
|
panelId = std::max(0, std::min(kNumPanels - 1, static_cast<int>(panelId)));
|
||||||
|
|
||||||
|
if (activePanel_ != panelId) {
|
||||||
|
subPanels_[activePanel_]->setVisible(false);
|
||||||
|
activePanel_ = panelId;
|
||||||
|
subPanels_[panelId]->setVisible(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Editor::Impl::formatLabel(CTextLabel* label, const char* fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
va_start(ap, fmt);
|
||||||
|
vformatLabel(label, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Editor::Impl::vformatLabel(CTextLabel* label, const char* fmt, va_list ap)
|
||||||
|
{
|
||||||
|
char text[256];
|
||||||
|
vsprintf(text, fmt, ap);
|
||||||
|
text[sizeof(text) - 1] = '\0';
|
||||||
|
label->setText(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Editor::Impl::valueChanged(CControl* ctl)
|
||||||
|
{
|
||||||
|
int32_t tag = ctl->getTag();
|
||||||
|
float value = ctl->getValue();
|
||||||
|
EditorController& ctrl = *ctrl_;
|
||||||
|
|
||||||
|
switch (tag) {
|
||||||
|
case kTagLoadSfzFile:
|
||||||
|
if (value != 1)
|
||||||
|
break;
|
||||||
|
|
||||||
|
Call::later([this]() { chooseSfzFile(); });
|
||||||
|
break;
|
||||||
|
|
||||||
|
case kTagLoadScalaFile:
|
||||||
|
if (value != 1)
|
||||||
|
break;
|
||||||
|
|
||||||
|
Call::later([this]() { chooseScalaFile(); });
|
||||||
|
break;
|
||||||
|
|
||||||
|
case kTagSetVolume:
|
||||||
|
ctrl.uiSendValue(EditId::Volume, value);
|
||||||
|
updateVolumeLabel(value);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case kTagSetNumVoices:
|
||||||
|
ctrl.uiSendValue(EditId::Polyphony, value);
|
||||||
|
updateNumVoicesLabel(static_cast<int>(value));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case kTagSetOversampling:
|
||||||
|
ctrl.uiSendValue(EditId::Oversampling, 1 << static_cast<int>(value));
|
||||||
|
updateOversamplingLabel(static_cast<int>(value));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case kTagSetPreloadSize:
|
||||||
|
ctrl.uiSendValue(EditId::PreloadSize, value);
|
||||||
|
updatePreloadSizeLabel(static_cast<int>(value));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case kTagSetScalaRootKey:
|
||||||
|
ctrl.uiSendValue(EditId::ScalaRootKey, value);
|
||||||
|
updateScalaRootKeyLabel(static_cast<int>(value));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case kTagSetTuningFrequency:
|
||||||
|
ctrl.uiSendValue(EditId::TuningFrequency, value);
|
||||||
|
updateTuningFrequencyLabel(value);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case kTagSetStretchedTuning:
|
||||||
|
ctrl.uiSendValue(EditId::StretchTuning, value);
|
||||||
|
updateStretchedTuningLabel(value);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
if (tag >= kTagFirstChangePanel && tag <= kTagLastChangePanel) {
|
||||||
|
int panelId = tag - kTagFirstChangePanel;
|
||||||
|
ctrl.uiSendValue(EditId::UIActivePanel, panelId);
|
||||||
|
setActivePanel(panelId);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Editor::Impl::enterOrLeaveEdit(CControl* ctl, bool enter)
|
||||||
|
{
|
||||||
|
int32_t tag = ctl->getTag();
|
||||||
|
EditId id;
|
||||||
|
|
||||||
|
switch (tag) {
|
||||||
|
case kTagSetVolume: id = EditId::Volume; break;
|
||||||
|
case kTagSetNumVoices: id = EditId::Polyphony; break;
|
||||||
|
case kTagSetOversampling: id = EditId::Oversampling; break;
|
||||||
|
case kTagSetPreloadSize: id = EditId::PreloadSize; break;
|
||||||
|
case kTagSetScalaRootKey: id = EditId::ScalaRootKey; break;
|
||||||
|
case kTagSetTuningFrequency: id = EditId::TuningFrequency; break;
|
||||||
|
case kTagSetStretchedTuning: id = EditId::StretchTuning; break;
|
||||||
|
default: return;
|
||||||
|
}
|
||||||
|
|
||||||
|
EditorController& ctrl = *ctrl_;
|
||||||
|
if (enter)
|
||||||
|
ctrl.uiBeginSend(id);
|
||||||
|
else
|
||||||
|
ctrl.uiEndSend(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Editor::Impl::controlBeginEdit(CControl* ctl)
|
||||||
|
{
|
||||||
|
enterOrLeaveEdit(ctl, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Editor::Impl::controlEndEdit(CControl* ctl)
|
||||||
|
{
|
||||||
|
enterOrLeaveEdit(ctl, false);
|
||||||
|
}
|
||||||
30
editor/src/editor/Editor.h
Normal file
30
editor/src/editor/Editor.h
Normal file
|
|
@ -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
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include <memory>
|
||||||
|
class EditorController;
|
||||||
|
|
||||||
|
#include "utility/vstgui_before.h"
|
||||||
|
#include "vstgui/lib/vstguifwd.h"
|
||||||
|
#include "utility/vstgui_after.h"
|
||||||
|
using VSTGUI::CFrame;
|
||||||
|
|
||||||
|
class Editor {
|
||||||
|
public:
|
||||||
|
static const int viewWidth;
|
||||||
|
static const int viewHeight;
|
||||||
|
|
||||||
|
explicit Editor(EditorController& ctrl);
|
||||||
|
~Editor();
|
||||||
|
|
||||||
|
void open(CFrame& frame);
|
||||||
|
void close();
|
||||||
|
|
||||||
|
private:
|
||||||
|
struct Impl;
|
||||||
|
std::unique_ptr<Impl> impl_;
|
||||||
|
};
|
||||||
43
editor/src/editor/EditorController.h
Normal file
43
editor/src/editor/EditorController.h
Normal file
|
|
@ -0,0 +1,43 @@
|
||||||
|
// 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
|
||||||
|
#include <absl/strings/string_view.h>
|
||||||
|
#include <absl/types/variant.h>
|
||||||
|
#include <cstdint>
|
||||||
|
enum class EditId : int;
|
||||||
|
typedef absl::variant<float, std::string> EditValue;
|
||||||
|
|
||||||
|
class EditorController {
|
||||||
|
public:
|
||||||
|
virtual ~EditorController() {}
|
||||||
|
|
||||||
|
// called by Editor
|
||||||
|
virtual void uiSendValue(EditId id, const EditValue& v) = 0;
|
||||||
|
virtual void uiBeginSend(EditId id) = 0;
|
||||||
|
virtual void uiEndSend(EditId id) = 0;
|
||||||
|
virtual void uiSendMIDI(const uint8_t* msg, uint32_t len) = 0;
|
||||||
|
class Receiver;
|
||||||
|
void decorate(Receiver* r) { r_ = r; }
|
||||||
|
|
||||||
|
class Receiver {
|
||||||
|
public:
|
||||||
|
virtual ~Receiver() {}
|
||||||
|
virtual void uiReceiveValue(EditId id, const EditValue& v) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
// called by DSP
|
||||||
|
void uiReceiveValue(EditId id, const EditValue& v);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Receiver* r_ = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
inline void EditorController::uiReceiveValue(EditId id, const EditValue& v)
|
||||||
|
{
|
||||||
|
if (r_)
|
||||||
|
r_->uiReceiveValue(id, v);
|
||||||
|
}
|
||||||
|
|
@ -5,7 +5,10 @@
|
||||||
// If not, contact the sfizz maintainers at https://github.com/sfztools/sfizz
|
// If not, contact the sfizz maintainers at https://github.com/sfztools/sfizz
|
||||||
|
|
||||||
#include "GUIComponents.h"
|
#include "GUIComponents.h"
|
||||||
|
|
||||||
|
#include "utility/vstgui_before.h"
|
||||||
#include "vstgui/lib/cdrawcontext.h"
|
#include "vstgui/lib/cdrawcontext.h"
|
||||||
|
#include "utility/vstgui_after.h"
|
||||||
|
|
||||||
SimpleSlider::SimpleSlider(const CRect& bounds, IControlListener* listener, int32_t tag)
|
SimpleSlider::SimpleSlider(const CRect& bounds, IControlListener* listener, int32_t tag)
|
||||||
: CSliderBase(bounds, listener, tag)
|
: CSliderBase(bounds, listener, tag)
|
||||||
|
|
@ -5,8 +5,11 @@
|
||||||
// If not, contact the sfizz maintainers at https://github.com/sfztools/sfizz
|
// If not, contact the sfizz maintainers at https://github.com/sfztools/sfizz
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "utility/vstgui_before.h"
|
||||||
#include "vstgui/lib/controls/cslider.h"
|
#include "vstgui/lib/controls/cslider.h"
|
||||||
#include "vstgui/lib/ccolor.h"
|
#include "vstgui/lib/ccolor.h"
|
||||||
|
#include "utility/vstgui_after.h"
|
||||||
|
|
||||||
using namespace VSTGUI;
|
using namespace VSTGUI;
|
||||||
|
|
||||||
9
editor/src/editor/utility/vstgui_after.h
Normal file
9
editor/src/editor/utility/vstgui_after.h
Normal file
|
|
@ -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
|
||||||
|
|
||||||
|
#if defined(__GNUC__)
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
12
editor/src/editor/utility/vstgui_before.h
Normal file
12
editor/src/editor/utility/vstgui_before.h
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
// 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
|
||||||
|
|
||||||
|
#if defined(__GNUC__)
|
||||||
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Wunused-parameter"
|
||||||
|
#pragma GCC diagnostic ignored "-Wignored-qualifiers"
|
||||||
|
#pragma GCC diagnostic ignored "-Wdeprecated-copy"
|
||||||
|
#endif
|
||||||
|
|
@ -45,7 +45,7 @@ file (MAKE_DIRECTORY ${PROJECT_BINARY_DIR})
|
||||||
configure_file (manifest.ttl.in ${PROJECT_BINARY_DIR}/manifest.ttl)
|
configure_file (manifest.ttl.in ${PROJECT_BINARY_DIR}/manifest.ttl)
|
||||||
configure_file (${PROJECT_NAME}.ttl.in ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.ttl)
|
configure_file (${PROJECT_NAME}.ttl.in ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.ttl)
|
||||||
configure_file (LICENSE.md.in ${PROJECT_BINARY_DIR}/LICENSE.md)
|
configure_file (LICENSE.md.in ${PROJECT_BINARY_DIR}/LICENSE.md)
|
||||||
if (SFIZZ_USE_VCPKG OR SFIZZ_STATIC_LIBSNDFILE OR CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
|
if (SFIZZ_USE_VCPKG OR SFIZZ_STATIC_DEPENDENCIES OR CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
|
||||||
file(COPY "lgpl-3.0.txt" DESTINATION ${PROJECT_BINARY_DIR})
|
file(COPY "lgpl-3.0.txt" DESTINATION ${PROJECT_BINARY_DIR})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,6 @@ set(VSTPLUGIN_SOURCES
|
||||||
SfizzVstController.cpp
|
SfizzVstController.cpp
|
||||||
SfizzVstEditor.cpp
|
SfizzVstEditor.cpp
|
||||||
SfizzVstState.cpp
|
SfizzVstState.cpp
|
||||||
GUIComponents.cpp
|
|
||||||
VstPluginFactory.cpp
|
VstPluginFactory.cpp
|
||||||
X11RunLoop.cpp)
|
X11RunLoop.cpp)
|
||||||
|
|
||||||
|
|
@ -26,7 +25,6 @@ set(VSTPLUGIN_HEADERS
|
||||||
SfizzVstController.h
|
SfizzVstController.h
|
||||||
SfizzVstEditor.h
|
SfizzVstEditor.h
|
||||||
SfizzVstState.h
|
SfizzVstState.h
|
||||||
GUIComponents.h
|
|
||||||
X11RunLoop.h)
|
X11RunLoop.h)
|
||||||
|
|
||||||
set(VSTPLUGIN_RESOURCES
|
set(VSTPLUGIN_RESOURCES
|
||||||
|
|
@ -40,7 +38,8 @@ if(WIN32)
|
||||||
target_sources(${VSTPLUGIN_PRJ_NAME} PRIVATE vst3.def)
|
target_sources(${VSTPLUGIN_PRJ_NAME} PRIVATE vst3.def)
|
||||||
endif()
|
endif()
|
||||||
target_link_libraries(${VSTPLUGIN_PRJ_NAME}
|
target_link_libraries(${VSTPLUGIN_PRJ_NAME}
|
||||||
PRIVATE ${PROJECT_NAME}::${PROJECT_NAME})
|
PRIVATE ${PROJECT_NAME}::${PROJECT_NAME}
|
||||||
|
PRIVATE sfizz_editor)
|
||||||
target_include_directories(${VSTPLUGIN_PRJ_NAME}
|
target_include_directories(${VSTPLUGIN_PRJ_NAME}
|
||||||
PRIVATE "${CMAKE_CURRENT_BINARY_DIR}")
|
PRIVATE "${CMAKE_CURRENT_BINARY_DIR}")
|
||||||
set_target_properties(${VSTPLUGIN_PRJ_NAME} PROPERTIES
|
set_target_properties(${VSTPLUGIN_PRJ_NAME} PROPERTIES
|
||||||
|
|
|
||||||
|
|
@ -35,15 +35,15 @@ tresult PLUGIN_API SfizzVstControllerNoUi::initialize(FUnknown* context)
|
||||||
Steinberg::String("Preload size"), pid++, nullptr,
|
Steinberg::String("Preload size"), pid++, nullptr,
|
||||||
0, Vst::ParameterInfo::kCanAutomate, Vst::kRootUnitId));
|
0, Vst::ParameterInfo::kCanAutomate, Vst::kRootUnitId));
|
||||||
parameters.addParameter(
|
parameters.addParameter(
|
||||||
kParamScalaRootKey.createParameter(
|
kParamScalaRootKeyRange.createParameter(
|
||||||
Steinberg::String("Scala root key"), pid++, nullptr,
|
Steinberg::String("Scala root key"), pid++, nullptr,
|
||||||
0, Vst::ParameterInfo::kCanAutomate, Vst::kRootUnitId));
|
0, Vst::ParameterInfo::kCanAutomate, Vst::kRootUnitId));
|
||||||
parameters.addParameter(
|
parameters.addParameter(
|
||||||
kParamTuningFrequency.createParameter(
|
kParamTuningFrequencyRange.createParameter(
|
||||||
Steinberg::String("Tuning frequency"), pid++, Steinberg::String("Hz"),
|
Steinberg::String("Tuning frequency"), pid++, Steinberg::String("Hz"),
|
||||||
0, Vst::ParameterInfo::kCanAutomate, Vst::kRootUnitId));
|
0, Vst::ParameterInfo::kCanAutomate, Vst::kRootUnitId));
|
||||||
parameters.addParameter(
|
parameters.addParameter(
|
||||||
kParamStretchedTuning.createParameter(
|
kParamStretchedTuningRange.createParameter(
|
||||||
Steinberg::String("Stretched tuning"), pid++, nullptr,
|
Steinberg::String("Stretched tuning"), pid++, nullptr,
|
||||||
0, Vst::ParameterInfo::kCanAutomate, Vst::kRootUnitId));
|
0, Vst::ParameterInfo::kCanAutomate, Vst::kRootUnitId));
|
||||||
|
|
||||||
|
|
@ -175,17 +175,17 @@ tresult PLUGIN_API SfizzVstController::setParamNormalized(Vst::ParamID tag, Vst:
|
||||||
}
|
}
|
||||||
case kPidScalaRootKey: {
|
case kPidScalaRootKey: {
|
||||||
slotI32 = &_state.scalaRootKey;
|
slotI32 = &_state.scalaRootKey;
|
||||||
value = kParamScalaRootKey.denormalize(normValue);
|
value = kParamScalaRootKeyRange.denormalize(normValue);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case kPidTuningFrequency: {
|
case kPidTuningFrequency: {
|
||||||
slotF32 = &_state.tuningFrequency;
|
slotF32 = &_state.tuningFrequency;
|
||||||
value = kParamTuningFrequency.denormalize(normValue);
|
value = kParamTuningFrequencyRange.denormalize(normValue);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case kPidStretchedTuning: {
|
case kPidStretchedTuning: {
|
||||||
slotF32 = &_state.stretchedTuning;
|
slotF32 = &_state.stretchedTuning;
|
||||||
value = kParamStretchedTuning.denormalize(normValue);
|
value = kParamStretchedTuningRange.denormalize(normValue);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -244,9 +244,9 @@ tresult PLUGIN_API SfizzVstController::setComponentState(IBStream* state)
|
||||||
setParamNormalized(kPidNumVoices, kParamNumVoicesRange.normalize(s.numVoices));
|
setParamNormalized(kPidNumVoices, kParamNumVoicesRange.normalize(s.numVoices));
|
||||||
setParamNormalized(kPidOversampling, kParamOversamplingRange.normalize(s.oversamplingLog2));
|
setParamNormalized(kPidOversampling, kParamOversamplingRange.normalize(s.oversamplingLog2));
|
||||||
setParamNormalized(kPidPreloadSize, kParamPreloadSizeRange.normalize(s.preloadSize));
|
setParamNormalized(kPidPreloadSize, kParamPreloadSizeRange.normalize(s.preloadSize));
|
||||||
setParamNormalized(kPidScalaRootKey, kParamScalaRootKey.normalize(s.scalaRootKey));
|
setParamNormalized(kPidScalaRootKey, kParamScalaRootKeyRange.normalize(s.scalaRootKey));
|
||||||
setParamNormalized(kPidTuningFrequency, kParamTuningFrequency.normalize(s.tuningFrequency));
|
setParamNormalized(kPidTuningFrequency, kParamTuningFrequencyRange.normalize(s.tuningFrequency));
|
||||||
setParamNormalized(kPidStretchedTuning, kParamStretchedTuning.normalize(s.stretchedTuning));
|
setParamNormalized(kPidStretchedTuning, kParamStretchedTuningRange.normalize(s.stretchedTuning));
|
||||||
|
|
||||||
for (StateListener* listener : _stateListeners)
|
for (StateListener* listener : _stateListeners)
|
||||||
listener->onStateChanged();
|
listener->onStateChanged();
|
||||||
|
|
|
||||||
|
|
@ -6,18 +6,18 @@
|
||||||
|
|
||||||
#include "SfizzVstEditor.h"
|
#include "SfizzVstEditor.h"
|
||||||
#include "SfizzVstState.h"
|
#include "SfizzVstState.h"
|
||||||
#include "GUIComponents.h"
|
#include "editor/Editor.h"
|
||||||
|
#include "editor/EditIds.h"
|
||||||
#if !defined(__APPLE__) && !defined(_WIN32)
|
#if !defined(__APPLE__) && !defined(_WIN32)
|
||||||
#include "X11RunLoop.h"
|
#include "X11RunLoop.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
using namespace VSTGUI;
|
using namespace VSTGUI;
|
||||||
|
|
||||||
static ViewRect sfizzUiViewRect {0, 0, 482, 225};
|
static ViewRect sfizzUiViewRect { 0, 0, Editor::viewWidth, Editor::viewHeight };
|
||||||
|
|
||||||
SfizzVstEditor::SfizzVstEditor(void *controller)
|
SfizzVstEditor::SfizzVstEditor(void *controller)
|
||||||
: VSTGUIEditor(controller, &sfizzUiViewRect),
|
: VSTGUIEditor(controller, &sfizzUiViewRect)
|
||||||
_logo("logo.png")
|
|
||||||
{
|
{
|
||||||
getController()->addSfizzStateListener(this);
|
getController()->addSfizzStateListener(this);
|
||||||
}
|
}
|
||||||
|
|
@ -45,7 +45,11 @@ bool PLUGIN_API SfizzVstEditor::open(void* parent, const VSTGUI::PlatformType& p
|
||||||
config = &x11config;
|
config = &x11config;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
createFrameContents();
|
Editor* editor = editor_.get();
|
||||||
|
if (!editor) {
|
||||||
|
editor = new Editor(*this);
|
||||||
|
editor_.reset(editor);
|
||||||
|
}
|
||||||
updateStateDisplay();
|
updateStateDisplay();
|
||||||
|
|
||||||
if (!frame->open(parent, platformType, config)) {
|
if (!frame->open(parent, platformType, config)) {
|
||||||
|
|
@ -53,6 +57,8 @@ bool PLUGIN_API SfizzVstEditor::open(void* parent, const VSTGUI::PlatformType& p
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
editor->open(*frame);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -60,121 +66,16 @@ void PLUGIN_API SfizzVstEditor::close()
|
||||||
{
|
{
|
||||||
CFrame *frame = this->frame;
|
CFrame *frame = this->frame;
|
||||||
if (frame) {
|
if (frame) {
|
||||||
frame->removeAll();
|
if (editor_)
|
||||||
|
editor_->close();
|
||||||
if (frame->getNbReference() != 1)
|
if (frame->getNbReference() != 1)
|
||||||
frame->forget ();
|
frame->forget();
|
||||||
else {
|
else
|
||||||
frame->close();
|
frame->close();
|
||||||
this->frame = nullptr;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
///
|
///
|
||||||
void SfizzVstEditor::valueChanged(CControl* ctl)
|
|
||||||
{
|
|
||||||
int32_t tag = ctl->getTag();
|
|
||||||
float value = ctl->getValue();
|
|
||||||
float valueNorm = ctl->getValueNormalized();
|
|
||||||
SfizzVstController* controller = getController();
|
|
||||||
|
|
||||||
switch (tag) {
|
|
||||||
case kTagLoadSfzFile:
|
|
||||||
if (value != 1)
|
|
||||||
break;
|
|
||||||
|
|
||||||
Call::later([this]() { chooseSfzFile(); });
|
|
||||||
break;
|
|
||||||
|
|
||||||
case kTagLoadScalaFile:
|
|
||||||
if (value != 1)
|
|
||||||
break;
|
|
||||||
|
|
||||||
Call::later([this]() { chooseScalaFile(); });
|
|
||||||
break;
|
|
||||||
|
|
||||||
case kTagSetVolume:
|
|
||||||
controller->setParamNormalized(kPidVolume, valueNorm);
|
|
||||||
controller->performEdit(kPidVolume, valueNorm);
|
|
||||||
updateVolumeLabel(value);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case kTagSetNumVoices:
|
|
||||||
controller->setParamNormalized(kPidNumVoices, valueNorm);
|
|
||||||
controller->performEdit(kPidNumVoices, valueNorm);
|
|
||||||
updateNumVoicesLabel(static_cast<int>(value));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case kTagSetOversampling:
|
|
||||||
controller->setParamNormalized(kPidOversampling, valueNorm);
|
|
||||||
controller->performEdit(kPidOversampling, valueNorm);
|
|
||||||
updateOversamplingLabel(static_cast<int>(value));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case kTagSetPreloadSize:
|
|
||||||
controller->setParamNormalized(kPidPreloadSize, valueNorm);
|
|
||||||
controller->performEdit(kPidPreloadSize, valueNorm);
|
|
||||||
updatePreloadSizeLabel(static_cast<int>(value));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case kTagSetScalaRootKey:
|
|
||||||
controller->setParamNormalized(kPidScalaRootKey, valueNorm);
|
|
||||||
controller->performEdit(kPidScalaRootKey, valueNorm);
|
|
||||||
updateScalaRootKeyLabel(static_cast<int>(value));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case kTagSetTuningFrequency:
|
|
||||||
controller->setParamNormalized(kPidTuningFrequency, valueNorm);
|
|
||||||
controller->performEdit(kPidTuningFrequency, valueNorm);
|
|
||||||
updateTuningFrequencyLabel(value);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case kTagSetStretchedTuning:
|
|
||||||
controller->setParamNormalized(kPidStretchedTuning, valueNorm);
|
|
||||||
controller->performEdit(kPidStretchedTuning, valueNorm);
|
|
||||||
updateStretchedTuningLabel(value);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
if (tag >= kTagFirstChangePanel && tag <= kTagLastChangePanel)
|
|
||||||
setActivePanel(tag - kTagFirstChangePanel);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void SfizzVstEditor::enterOrLeaveEdit(CControl* ctl, bool enter)
|
|
||||||
{
|
|
||||||
int32_t tag = ctl->getTag();
|
|
||||||
Vst::ParamID id;
|
|
||||||
|
|
||||||
switch (tag) {
|
|
||||||
case kTagSetVolume: id = kPidVolume; break;
|
|
||||||
case kTagSetNumVoices: id = kPidNumVoices; break;
|
|
||||||
case kTagSetOversampling: id = kPidOversampling; break;
|
|
||||||
case kTagSetPreloadSize: id = kPidPreloadSize; break;
|
|
||||||
case kTagSetScalaRootKey: id = kPidScalaRootKey; break;
|
|
||||||
case kTagSetTuningFrequency: id = kPidTuningFrequency; break;
|
|
||||||
case kTagSetStretchedTuning: id = kPidStretchedTuning; break;
|
|
||||||
default: return;
|
|
||||||
}
|
|
||||||
|
|
||||||
SfizzVstController* controller = getController();
|
|
||||||
if (enter)
|
|
||||||
controller->beginEdit(id);
|
|
||||||
else
|
|
||||||
controller->endEdit(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SfizzVstEditor::controlBeginEdit(CControl* ctl)
|
|
||||||
{
|
|
||||||
enterOrLeaveEdit(ctl, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SfizzVstEditor::controlEndEdit(CControl* ctl)
|
|
||||||
{
|
|
||||||
enterOrLeaveEdit(ctl, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
CMessageResult SfizzVstEditor::notify(CBaseObject* sender, const char* message)
|
CMessageResult SfizzVstEditor::notify(CBaseObject* sender, const char* message)
|
||||||
{
|
{
|
||||||
CMessageResult result = VSTGUIEditor::notify(sender, message);
|
CMessageResult result = VSTGUIEditor::notify(sender, message);
|
||||||
|
|
@ -205,20 +106,83 @@ void SfizzVstEditor::onStateChanged()
|
||||||
}
|
}
|
||||||
|
|
||||||
///
|
///
|
||||||
void SfizzVstEditor::chooseSfzFile()
|
void SfizzVstEditor::uiSendValue(EditId id, const EditValue& v)
|
||||||
{
|
{
|
||||||
SharedPointer<CNewFileSelector> fs(CNewFileSelector::create(frame));
|
if (id == EditId::SfzFile)
|
||||||
|
loadSfzFile(absl::get<std::string>(v));
|
||||||
|
else if (id == EditId::ScalaFile)
|
||||||
|
loadScalaFile(absl::get<std::string>(v));
|
||||||
|
else {
|
||||||
|
SfizzVstController* ctrl = getController();
|
||||||
|
|
||||||
fs->setTitle("Load SFZ file");
|
auto normalizeAndSet = [ctrl](Vst::ParamID pid, const SfizzParameterRange& range, float value) {
|
||||||
fs->setDefaultExtension(CFileExtension("SFZ", "sfz"));
|
float normValue = range.normalize(value);
|
||||||
|
ctrl->setParamNormalized(pid, normValue);
|
||||||
|
ctrl->performEdit(pid, normValue);
|
||||||
|
};
|
||||||
|
|
||||||
if (fs->runModal()) {
|
switch (id) {
|
||||||
UTF8StringPtr file = fs->getSelectedFile(0);
|
case EditId::Volume:
|
||||||
if (file)
|
normalizeAndSet(kPidVolume, kParamVolumeRange, absl::get<float>(v));
|
||||||
loadSfzFile(file);
|
break;
|
||||||
|
case EditId::Polyphony:
|
||||||
|
normalizeAndSet(kPidNumVoices, kParamNumVoicesRange, absl::get<float>(v));
|
||||||
|
break;
|
||||||
|
case EditId::Oversampling:
|
||||||
|
{
|
||||||
|
const int32 value = static_cast<int32>(absl::get<float>(v));
|
||||||
|
|
||||||
|
int32 log2Value = 0;
|
||||||
|
for (int32 f = value; f > 1; f /= 2)
|
||||||
|
++log2Value;
|
||||||
|
|
||||||
|
normalizeAndSet(kPidOversampling, kParamOversamplingRange, log2Value);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case EditId::PreloadSize:
|
||||||
|
normalizeAndSet(kPidPreloadSize, kParamPreloadSizeRange, absl::get<float>(v));
|
||||||
|
break;
|
||||||
|
case EditId::ScalaRootKey:
|
||||||
|
normalizeAndSet(kPidScalaRootKey, kParamScalaRootKeyRange, absl::get<float>(v));
|
||||||
|
break;
|
||||||
|
case EditId::TuningFrequency:
|
||||||
|
normalizeAndSet(kPidTuningFrequency, kParamTuningFrequencyRange, absl::get<float>(v));
|
||||||
|
break;
|
||||||
|
case EditId::StretchTuning:
|
||||||
|
normalizeAndSet(kPidStretchedTuning, kParamStretchedTuningRange, absl::get<float>(v));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EditId::UIActivePanel:
|
||||||
|
ctrl->getSfizzUiState().activePanel = static_cast<int32>(absl::get<float>(v));
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SfizzVstEditor::uiBeginSend(EditId id)
|
||||||
|
{
|
||||||
|
Vst::ParamID pid = parameterOfEditId(id);
|
||||||
|
if (pid != -1)
|
||||||
|
getController()->beginEdit(pid);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SfizzVstEditor::uiEndSend(EditId id)
|
||||||
|
{
|
||||||
|
Vst::ParamID pid = parameterOfEditId(id);
|
||||||
|
if (pid != -1)
|
||||||
|
getController()->endEdit(pid);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SfizzVstEditor::uiSendMIDI(const uint8_t* msg, uint32_t len)
|
||||||
|
{
|
||||||
|
// TODO send MIDI...
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
///
|
||||||
void SfizzVstEditor::loadSfzFile(const std::string& filePath)
|
void SfizzVstEditor::loadSfzFile(const std::string& filePath)
|
||||||
{
|
{
|
||||||
SfizzVstController* ctl = getController();
|
SfizzVstController* ctl = getController();
|
||||||
|
|
@ -233,22 +197,6 @@ void SfizzVstEditor::loadSfzFile(const std::string& filePath)
|
||||||
Vst::IAttributeList* attr = msg->getAttributes();
|
Vst::IAttributeList* attr = msg->getAttributes();
|
||||||
attr->setBinary("File", filePath.data(), filePath.size());
|
attr->setBinary("File", filePath.data(), filePath.size());
|
||||||
ctl->sendMessage(msg);
|
ctl->sendMessage(msg);
|
||||||
|
|
||||||
updateSfzFileLabel(filePath);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SfizzVstEditor::chooseScalaFile()
|
|
||||||
{
|
|
||||||
SharedPointer<CNewFileSelector> fs(CNewFileSelector::create(frame));
|
|
||||||
|
|
||||||
fs->setTitle("Load Scala file");
|
|
||||||
fs->setDefaultExtension(CFileExtension("SCL", "scl"));
|
|
||||||
|
|
||||||
if (fs->runModal()) {
|
|
||||||
UTF8StringPtr file = fs->getSelectedFile(0);
|
|
||||||
if (file)
|
|
||||||
loadScalaFile(file);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SfizzVstEditor::loadScalaFile(const std::string& filePath)
|
void SfizzVstEditor::loadScalaFile(const std::string& filePath)
|
||||||
|
|
@ -265,414 +213,6 @@ void SfizzVstEditor::loadScalaFile(const std::string& filePath)
|
||||||
Vst::IAttributeList* attr = msg->getAttributes();
|
Vst::IAttributeList* attr = msg->getAttributes();
|
||||||
attr->setBinary("File", filePath.data(), filePath.size());
|
attr->setBinary("File", filePath.data(), filePath.size());
|
||||||
ctl->sendMessage(msg);
|
ctl->sendMessage(msg);
|
||||||
|
|
||||||
updateScalaFileLabel(filePath);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SfizzVstEditor::createFrameContents()
|
|
||||||
{
|
|
||||||
SfizzVstController* controller = getController();
|
|
||||||
const SfizzUiState& uiState = controller->getSfizzUiState();
|
|
||||||
|
|
||||||
CFrame* frame = this->frame;
|
|
||||||
CRect bounds = frame->getViewSize();
|
|
||||||
|
|
||||||
frame->setBackgroundColor(CColor(0xff, 0xff, 0xff));
|
|
||||||
|
|
||||||
CRect bottomRow = bounds;
|
|
||||||
bottomRow.top = bottomRow.bottom - 30;
|
|
||||||
|
|
||||||
CRect topRow = bounds;
|
|
||||||
topRow.bottom = topRow.top + 30;
|
|
||||||
|
|
||||||
CViewContainer* panel;
|
|
||||||
_activePanel = std::max(0, std::min(kNumPanels - 1, static_cast<int>(uiState.activePanel)));
|
|
||||||
|
|
||||||
CRect topLeftLabelBox = topRow;
|
|
||||||
topLeftLabelBox.right -= 20 * kNumPanels;
|
|
||||||
|
|
||||||
// general panel
|
|
||||||
{
|
|
||||||
panel = new CViewContainer(bounds);
|
|
||||||
frame->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);
|
|
||||||
frame->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);
|
|
||||||
adjustMinMaxToRangeParam(slider, kPidVolume);
|
|
||||||
_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);
|
|
||||||
adjustMinMaxToRangeParam(slider, kPidNumVoices);
|
|
||||||
_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);
|
|
||||||
adjustMinMaxToRangeParam(slider, kPidOversampling);
|
|
||||||
_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);
|
|
||||||
adjustMinMaxToRangeParam(slider, kPidPreloadSize);
|
|
||||||
_preloadSizeSlider = slider;
|
|
||||||
label = new CTextLabel(nthColumn(2), "");
|
|
||||||
_preloadSizeLabel = label;
|
|
||||||
panel->addView(label);
|
|
||||||
|
|
||||||
_subPanels[kPanelSettings] = panel;
|
|
||||||
}
|
|
||||||
|
|
||||||
// tuning panel
|
|
||||||
{
|
|
||||||
panel = new CViewContainer(bounds);
|
|
||||||
frame->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);
|
|
||||||
adjustMinMaxToRangeParam(slider, kPidScalaRootKey);
|
|
||||||
_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);
|
|
||||||
adjustMinMaxToRangeParam(slider, kPidTuningFrequency);
|
|
||||||
_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);
|
|
||||||
adjustMinMaxToRangeParam(slider, kPidStretchedTuning);
|
|
||||||
_stretchedTuningSlider = slider;
|
|
||||||
label = new CTextLabel(nthColumn(2), "");
|
|
||||||
_stretchedTuningLabel = label;
|
|
||||||
panel->addView(label);
|
|
||||||
|
|
||||||
_subPanels[kPanelTuning] = panel;
|
|
||||||
}
|
|
||||||
|
|
||||||
// info panel
|
|
||||||
{
|
|
||||||
panel = new CViewContainer(bounds);
|
|
||||||
frame->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);
|
|
||||||
}
|
|
||||||
|
|
||||||
panel->setVisible(currentPanel == _activePanel);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SfizzVstEditor::updateStateDisplay()
|
void SfizzVstEditor::updateStateDisplay()
|
||||||
|
|
@ -686,196 +226,38 @@ void SfizzVstEditor::updateStateDisplay()
|
||||||
const SfizzPlayState& playState = controller->getSfizzPlayState();
|
const SfizzPlayState& playState = controller->getSfizzPlayState();
|
||||||
|
|
||||||
///
|
///
|
||||||
updateSfzFileLabel(state.sfzFile);
|
uiReceiveValue(EditId::SfzFile, state.sfzFile);
|
||||||
if (_volumeSlider)
|
uiReceiveValue(EditId::Volume, state.volume);
|
||||||
_volumeSlider->setValue(state.volume);
|
uiReceiveValue(EditId::Polyphony, state.numVoices);
|
||||||
updateVolumeLabel(state.volume);
|
uiReceiveValue(EditId::Oversampling, 1u << state.oversamplingLog2);
|
||||||
if (_numVoicesSlider)
|
uiReceiveValue(EditId::PreloadSize, state.preloadSize);
|
||||||
_numVoicesSlider->setValue(state.numVoices);
|
uiReceiveValue(EditId::ScalaFile, state.scalaFile);
|
||||||
updateNumVoicesLabel(state.numVoices);
|
uiReceiveValue(EditId::ScalaRootKey, state.scalaRootKey);
|
||||||
if (_oversamplingSlider)
|
uiReceiveValue(EditId::TuningFrequency, state.tuningFrequency);
|
||||||
_oversamplingSlider->setValue(state.oversamplingLog2);
|
uiReceiveValue(EditId::StretchTuning, state.stretchedTuning);
|
||||||
updateOversamplingLabel(state.oversamplingLog2);
|
|
||||||
if (_preloadSizeSlider)
|
|
||||||
_preloadSizeSlider->setValue(state.preloadSize);
|
|
||||||
updatePreloadSizeLabel(state.preloadSize);
|
|
||||||
updateScalaFileLabel(state.scalaFile);
|
|
||||||
if (_scalaRootKeySlider)
|
|
||||||
_scalaRootKeySlider->setValue(state.scalaRootKey);
|
|
||||||
updateScalaRootKeyLabel(state.scalaRootKey);
|
|
||||||
if (_tuningFrequencySlider)
|
|
||||||
_tuningFrequencySlider->setValue(state.tuningFrequency);
|
|
||||||
updateTuningFrequencyLabel(state.tuningFrequency);
|
|
||||||
if (_stretchedTuningSlider)
|
|
||||||
_stretchedTuningSlider->setValue(state.stretchedTuning);
|
|
||||||
updateStretchedTuningLabel(state.stretchedTuning);
|
|
||||||
|
|
||||||
///
|
///
|
||||||
struct InfoLabel { const uint32* src; CTextLabel* dst; };
|
uiReceiveValue(EditId::UINumCurves, playState.curves);
|
||||||
for (const auto& item : {
|
uiReceiveValue(EditId::UINumMasters, playState.masters);
|
||||||
InfoLabel{&playState.curves, _infoCurvesLabel},
|
uiReceiveValue(EditId::UINumGroups, playState.groups);
|
||||||
InfoLabel{&playState.masters, _infoMastersLabel},
|
uiReceiveValue(EditId::UINumRegions, playState.regions);
|
||||||
InfoLabel{&playState.groups, _infoGroupsLabel},
|
uiReceiveValue(EditId::UINumPreloadedSamples, playState.preloadedSamples);
|
||||||
InfoLabel{&playState.regions, _infoRegionsLabel},
|
uiReceiveValue(EditId::UINumActiveVoices, playState.activeVoices);
|
||||||
InfoLabel{&playState.preloadedSamples, _infoSamplesLabel},
|
|
||||||
InfoLabel{&playState.activeVoices, _infoVoicesLabel} })
|
|
||||||
{
|
|
||||||
if (item.dst) {
|
|
||||||
char text[64];
|
|
||||||
sprintf(text, "%u", *item.src);
|
|
||||||
text[sizeof(text) - 1] = '\0';
|
|
||||||
item.dst->setText(text);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
///
|
///
|
||||||
setActivePanel(uiState.activePanel);
|
uiReceiveValue(EditId::UIActivePanel, uiState.activePanel);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SfizzVstEditor::updateSfzFileLabel(const std::string& filePath)
|
Vst::ParamID SfizzVstEditor::parameterOfEditId(EditId id)
|
||||||
{
|
{
|
||||||
updateLabelWithFileName(_sfzFileLabel, filePath);
|
switch (id) {
|
||||||
}
|
case EditId::Volume: return kPidVolume;
|
||||||
|
case EditId::Polyphony: return kPidNumVoices;
|
||||||
void SfizzVstEditor::updateScalaFileLabel(const std::string& filePath)
|
case EditId::Oversampling: return kPidOversampling;
|
||||||
{
|
case EditId::PreloadSize: return kPidPreloadSize;
|
||||||
updateLabelWithFileName(_scalaFileLabel, filePath);
|
case EditId::ScalaRootKey: return kPidScalaRootKey;
|
||||||
}
|
case EditId::TuningFrequency: return kPidTuningFrequency;
|
||||||
|
case EditId::StretchTuning: return kPidStretchedTuning;
|
||||||
void SfizzVstEditor::updateLabelWithFileName(CTextLabel* label, const std::string& filePath)
|
default: return -1;
|
||||||
{
|
|
||||||
if (!label)
|
|
||||||
return;
|
|
||||||
|
|
||||||
std::string fileName;
|
|
||||||
if (filePath.empty())
|
|
||||||
fileName = "<No file>";
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
label->setText(fileName.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
void SfizzVstEditor::updateVolumeLabel(float volume)
|
|
||||||
{
|
|
||||||
CTextLabel* label = _volumeLabel;
|
|
||||||
if (!label)
|
|
||||||
return;
|
|
||||||
|
|
||||||
char text[64];
|
|
||||||
sprintf(text, "%.1f dB", volume);
|
|
||||||
text[sizeof(text) - 1] = '\0';
|
|
||||||
label->setText(text);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SfizzVstEditor::updateNumVoicesLabel(int numVoices)
|
|
||||||
{
|
|
||||||
CTextLabel* label = _numVoicesLabel;
|
|
||||||
if (!label)
|
|
||||||
return;
|
|
||||||
|
|
||||||
char text[64];
|
|
||||||
sprintf(text, "%d", numVoices);
|
|
||||||
text[sizeof(text) - 1] = '\0';
|
|
||||||
label->setText(text);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SfizzVstEditor::updateOversamplingLabel(int oversamplingLog2)
|
|
||||||
{
|
|
||||||
CTextLabel* label = _oversamplingLabel;
|
|
||||||
if (!label)
|
|
||||||
return;
|
|
||||||
|
|
||||||
char text[64];
|
|
||||||
sprintf(text, "%dx", 1 << oversamplingLog2);
|
|
||||||
text[sizeof(text) - 1] = '\0';
|
|
||||||
label->setText(text);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SfizzVstEditor::updatePreloadSizeLabel(int preloadSize)
|
|
||||||
{
|
|
||||||
CTextLabel* label = _preloadSizeLabel;
|
|
||||||
if (!label)
|
|
||||||
return;
|
|
||||||
|
|
||||||
char text[64];
|
|
||||||
sprintf(text, "%.1f kB", preloadSize * (1.0 / 1024));
|
|
||||||
text[sizeof(text) - 1] = '\0';
|
|
||||||
label->setText(text);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SfizzVstEditor::updateScalaRootKeyLabel(int rootKey)
|
|
||||||
{
|
|
||||||
CTextLabel* label = _scalaRootKeyLabel;
|
|
||||||
if (!label)
|
|
||||||
return;
|
|
||||||
|
|
||||||
static const char *octNoteNames[12] = {
|
|
||||||
"C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B",
|
|
||||||
};
|
|
||||||
|
|
||||||
auto noteName = [](int key) -> std::string
|
|
||||||
{
|
|
||||||
int octNum;
|
|
||||||
int octNoteNum;
|
|
||||||
if (key >= 0) {
|
|
||||||
octNum = key / 12 - 1;
|
|
||||||
octNoteNum = key % 12;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
octNum = -2 - (key + 1) / -12;
|
|
||||||
octNoteNum = (key % 12 + 12) % 12;
|
|
||||||
}
|
|
||||||
return std::string(octNoteNames[octNoteNum]) + std::to_string(octNum);
|
|
||||||
};
|
|
||||||
|
|
||||||
label->setText(noteName(rootKey));
|
|
||||||
}
|
|
||||||
|
|
||||||
void SfizzVstEditor::updateTuningFrequencyLabel(float tuningFrequency)
|
|
||||||
{
|
|
||||||
CTextLabel* label = _tuningFrequencyLabel;
|
|
||||||
if (!label)
|
|
||||||
return;
|
|
||||||
|
|
||||||
char text[64];
|
|
||||||
sprintf(text, "%.1f", tuningFrequency);
|
|
||||||
text[sizeof(text) - 1] = '\0';
|
|
||||||
label->setText(text);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SfizzVstEditor::updateStretchedTuningLabel(float stretchedTuning)
|
|
||||||
{
|
|
||||||
CTextLabel* label = _stretchedTuningLabel;
|
|
||||||
if (!label)
|
|
||||||
return;
|
|
||||||
|
|
||||||
char text[64];
|
|
||||||
sprintf(text, "%.3f", stretchedTuning);
|
|
||||||
text[sizeof(text) - 1] = '\0';
|
|
||||||
label->setText(text);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void SfizzVstEditor::setActivePanel(unsigned panelId)
|
|
||||||
{
|
|
||||||
panelId = std::max(0, std::min(kNumPanels - 1, static_cast<int>(panelId)));
|
|
||||||
|
|
||||||
getController()->getSfizzUiState().activePanel = panelId;
|
|
||||||
|
|
||||||
if (_activePanel != panelId) {
|
|
||||||
if (frame)
|
|
||||||
_subPanels[_activePanel]->setVisible(false);
|
|
||||||
|
|
||||||
_activePanel = panelId;
|
|
||||||
|
|
||||||
if (frame)
|
|
||||||
_subPanels[panelId]->setVisible(true);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,9 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "SfizzVstController.h"
|
#include "SfizzVstController.h"
|
||||||
|
#include "editor/EditorController.h"
|
||||||
#include "public.sdk/source/vst/vstguieditor.h"
|
#include "public.sdk/source/vst/vstguieditor.h"
|
||||||
|
class Editor;
|
||||||
#if !defined(__APPLE__) && !defined(_WIN32)
|
#if !defined(__APPLE__) && !defined(_WIN32)
|
||||||
namespace VSTGUI { class RunLoop; }
|
namespace VSTGUI { class RunLoop; }
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -14,7 +16,7 @@ namespace VSTGUI { class RunLoop; }
|
||||||
using namespace Steinberg;
|
using namespace Steinberg;
|
||||||
using namespace VSTGUI;
|
using namespace VSTGUI;
|
||||||
|
|
||||||
class SfizzVstEditor : public Vst::VSTGUIEditor, public IControlListener, public SfizzVstController::StateListener {
|
class SfizzVstEditor : public Vst::VSTGUIEditor, public SfizzVstController::StateListener, public EditorController {
|
||||||
public:
|
public:
|
||||||
explicit SfizzVstEditor(void *controller);
|
explicit SfizzVstEditor(void *controller);
|
||||||
~SfizzVstEditor();
|
~SfizzVstEditor();
|
||||||
|
|
@ -27,98 +29,28 @@ public:
|
||||||
return static_cast<SfizzVstController*>(Vst::VSTGUIEditor::getController());
|
return static_cast<SfizzVstController*>(Vst::VSTGUIEditor::getController());
|
||||||
}
|
}
|
||||||
|
|
||||||
// IControlListener
|
|
||||||
void valueChanged(CControl* ctl) override;
|
|
||||||
void enterOrLeaveEdit(CControl* ctl, bool enter);
|
|
||||||
void controlBeginEdit(CControl* ctl) override;
|
|
||||||
void controlEndEdit(CControl* ctl) override;
|
|
||||||
|
|
||||||
// VSTGUIEditor
|
// VSTGUIEditor
|
||||||
CMessageResult notify(CBaseObject* sender, const char* message) override;
|
CMessageResult notify(CBaseObject* sender, const char* message) override;
|
||||||
|
|
||||||
// SfizzVstController::StateListener
|
// SfizzVstController::StateListener
|
||||||
void onStateChanged() override;
|
void onStateChanged() override;
|
||||||
|
|
||||||
private:
|
protected:
|
||||||
void chooseSfzFile();
|
// EditorController
|
||||||
void loadSfzFile(const std::string& filePath);
|
void uiSendValue(EditId id, const EditValue& v) override;
|
||||||
|
void uiBeginSend(EditId id) override;
|
||||||
|
void uiEndSend(EditId id) override;
|
||||||
|
void uiSendMIDI(const uint8_t* msg, uint32_t len) override;
|
||||||
|
|
||||||
void chooseScalaFile();
|
private:
|
||||||
|
void loadSfzFile(const std::string& filePath);
|
||||||
void loadScalaFile(const std::string& filePath);
|
void loadScalaFile(const std::string& filePath);
|
||||||
|
|
||||||
void createFrameContents();
|
|
||||||
void updateStateDisplay();
|
void updateStateDisplay();
|
||||||
void updateSfzFileLabel(const std::string& filePath);
|
|
||||||
void updateScalaFileLabel(const std::string& filePath);
|
|
||||||
static void updateLabelWithFileName(CTextLabel* label, const std::string& filePath);
|
|
||||||
void updateVolumeLabel(float volume);
|
|
||||||
void updateNumVoicesLabel(int numVoices);
|
|
||||||
void updateOversamplingLabel(int oversamplingLog2);
|
|
||||||
void updatePreloadSizeLabel(int preloadSize);
|
|
||||||
void updateScalaRootKeyLabel(int rootKey);
|
|
||||||
void updateTuningFrequencyLabel(float tuningFrequency);
|
|
||||||
void updateStretchedTuningLabel(float stretchedTuning);
|
|
||||||
void setActivePanel(unsigned panelId);
|
|
||||||
|
|
||||||
template <class Control>
|
Vst::ParamID parameterOfEditId(EditId id);
|
||||||
void adjustMinMaxToRangeParam(Control* c, Vst::ParamID id)
|
|
||||||
{
|
|
||||||
auto* p = static_cast<Vst::RangeParameter*>(getController()->getParameterObject(id));
|
|
||||||
c->setMin(p->getMin());
|
|
||||||
c->setMax(p->getMax());
|
|
||||||
c->setDefaultValue(p->toPlain(p->getInfo().defaultNormalizedValue));
|
|
||||||
}
|
|
||||||
|
|
||||||
enum {
|
std::unique_ptr<Editor> editor_;
|
||||||
kPanelGeneral,
|
|
||||||
// kPanelControls,
|
|
||||||
kPanelSettings,
|
|
||||||
kPanelTuning,
|
|
||||||
kPanelInfo,
|
|
||||||
kNumPanels,
|
|
||||||
};
|
|
||||||
|
|
||||||
unsigned _activePanel = 0;
|
|
||||||
CViewContainer* _subPanels[kNumPanels] = {};
|
|
||||||
|
|
||||||
enum {
|
|
||||||
kTagLoadSfzFile,
|
|
||||||
kTagSetVolume,
|
|
||||||
kTagSetNumVoices,
|
|
||||||
kTagSetOversampling,
|
|
||||||
kTagSetPreloadSize,
|
|
||||||
kTagLoadScalaFile,
|
|
||||||
kTagSetScalaRootKey,
|
|
||||||
kTagSetTuningFrequency,
|
|
||||||
kTagSetStretchedTuning,
|
|
||||||
kTagFirstChangePanel,
|
|
||||||
kTagLastChangePanel = kTagFirstChangePanel + kNumPanels - 1,
|
|
||||||
};
|
|
||||||
|
|
||||||
CBitmap _logo;
|
|
||||||
CTextLabel* _sfzFileLabel = nullptr;
|
|
||||||
CTextLabel* _scalaFileLabel = nullptr;
|
|
||||||
CSliderBase *_volumeSlider = nullptr;
|
|
||||||
CTextLabel* _volumeLabel = nullptr;
|
|
||||||
CSliderBase *_numVoicesSlider = nullptr;
|
|
||||||
CTextLabel* _numVoicesLabel = nullptr;
|
|
||||||
CSliderBase *_oversamplingSlider = nullptr;
|
|
||||||
CTextLabel* _oversamplingLabel = nullptr;
|
|
||||||
CSliderBase *_preloadSizeSlider = nullptr;
|
|
||||||
CTextLabel* _preloadSizeLabel = nullptr;
|
|
||||||
CSliderBase *_scalaRootKeySlider = nullptr;
|
|
||||||
CTextLabel* _scalaRootKeyLabel = nullptr;
|
|
||||||
CSliderBase *_tuningFrequencySlider = nullptr;
|
|
||||||
CTextLabel* _tuningFrequencyLabel = nullptr;
|
|
||||||
CSliderBase *_stretchedTuningSlider = nullptr;
|
|
||||||
CTextLabel* _stretchedTuningLabel = nullptr;
|
|
||||||
|
|
||||||
CTextLabel* _infoCurvesLabel = nullptr;
|
|
||||||
CTextLabel* _infoMastersLabel = nullptr;
|
|
||||||
CTextLabel* _infoGroupsLabel = nullptr;
|
|
||||||
CTextLabel* _infoRegionsLabel = nullptr;
|
|
||||||
CTextLabel* _infoSamplesLabel = nullptr;
|
|
||||||
CTextLabel* _infoVoicesLabel = nullptr;
|
|
||||||
|
|
||||||
#if !defined(__APPLE__) && !defined(_WIN32)
|
#if !defined(__APPLE__) && !defined(_WIN32)
|
||||||
SharedPointer<RunLoop> _runLoop;
|
SharedPointer<RunLoop> _runLoop;
|
||||||
|
|
|
||||||
|
|
@ -289,15 +289,15 @@ void SfizzVstProcessor::processParameterChanges(Vst::IParameterChanges& pc)
|
||||||
break;
|
break;
|
||||||
case kPidScalaRootKey:
|
case kPidScalaRootKey:
|
||||||
if (pointCount > 0 && vq->getPoint(pointCount - 1, sampleOffset, value) == kResultTrue)
|
if (pointCount > 0 && vq->getPoint(pointCount - 1, sampleOffset, value) == kResultTrue)
|
||||||
_state.scalaRootKey = static_cast<int32>(kParamScalaRootKey.denormalize(value));
|
_state.scalaRootKey = static_cast<int32>(kParamScalaRootKeyRange.denormalize(value));
|
||||||
break;
|
break;
|
||||||
case kPidTuningFrequency:
|
case kPidTuningFrequency:
|
||||||
if (pointCount > 0 && vq->getPoint(pointCount - 1, sampleOffset, value) == kResultTrue)
|
if (pointCount > 0 && vq->getPoint(pointCount - 1, sampleOffset, value) == kResultTrue)
|
||||||
_state.tuningFrequency = kParamTuningFrequency.denormalize(value);
|
_state.tuningFrequency = kParamTuningFrequencyRange.denormalize(value);
|
||||||
break;
|
break;
|
||||||
case kPidStretchedTuning:
|
case kPidStretchedTuning:
|
||||||
if (pointCount > 0 && vq->getPoint(pointCount - 1, sampleOffset, value) == kResultTrue)
|
if (pointCount > 0 && vq->getPoint(pointCount - 1, sampleOffset, value) == kResultTrue)
|
||||||
_state.stretchedTuning = kParamStretchedTuning.denormalize(value);
|
_state.stretchedTuning = kParamStretchedTuningRange.denormalize(value);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -99,6 +99,6 @@ static constexpr SfizzParameterRange kParamVolumeRange(0.0, -60.0, +6.0);
|
||||||
static constexpr SfizzParameterRange kParamNumVoicesRange(64.0, 1.0, 256.0);
|
static constexpr SfizzParameterRange kParamNumVoicesRange(64.0, 1.0, 256.0);
|
||||||
static constexpr SfizzParameterRange kParamOversamplingRange(0.0, 0.0, 3.0);
|
static constexpr SfizzParameterRange kParamOversamplingRange(0.0, 0.0, 3.0);
|
||||||
static constexpr SfizzParameterRange kParamPreloadSizeRange(8192.0, 1024.0, 65536.0);
|
static constexpr SfizzParameterRange kParamPreloadSizeRange(8192.0, 1024.0, 65536.0);
|
||||||
static constexpr SfizzParameterRange kParamScalaRootKey(60.0, 0.0, 127.0);
|
static constexpr SfizzParameterRange kParamScalaRootKeyRange(60.0, 0.0, 127.0);
|
||||||
static constexpr SfizzParameterRange kParamTuningFrequency(440.0, 300.0, 500.0);
|
static constexpr SfizzParameterRange kParamTuningFrequencyRange(440.0, 300.0, 500.0);
|
||||||
static constexpr SfizzParameterRange kParamStretchedTuning(0.0, 0.0, 1.0);
|
static constexpr SfizzParameterRange kParamStretchedTuningRange(0.0, 0.0, 1.0);
|
||||||
|
|
|
||||||
|
|
@ -63,222 +63,7 @@ endfunction()
|
||||||
|
|
||||||
# --- VSTGUI ---
|
# --- VSTGUI ---
|
||||||
function(plugin_add_vstgui NAME)
|
function(plugin_add_vstgui NAME)
|
||||||
target_sources("${NAME}" PRIVATE
|
target_link_libraries("${NAME}" PRIVATE sfizz-vstgui)
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/animation/animations.cpp"
|
target_sources("${NAME}" PRIVATE "${VST3SDK_BASEDIR}/public.sdk/source/vst/vstguieditor.cpp")
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/animation/animator.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/animation/timingfunctions.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/cbitmap.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/cbitmapfilter.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/ccolor.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/cdatabrowser.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/cdrawcontext.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/cdrawmethods.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/cdropsource.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/cfileselector.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/cfont.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/cframe.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/cgradientview.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/cgraphicspath.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/clayeredviewcontainer.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/clinestyle.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/coffscreencontext.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/controls/cautoanimation.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/controls/cbuttons.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/controls/ccolorchooser.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/controls/ccontrol.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/controls/cfontchooser.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/controls/cknob.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/controls/clistcontrol.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/controls/cmoviebitmap.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/controls/cmoviebutton.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/controls/coptionmenu.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/controls/cparamdisplay.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/controls/cscrollbar.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/controls/csearchtextedit.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/controls/csegmentbutton.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/controls/cslider.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/controls/cspecialdigit.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/controls/csplashscreen.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/controls/cstringlist.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/controls/cswitch.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/controls/ctextedit.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/controls/ctextlabel.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/controls/cvumeter.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/controls/cxypad.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/copenglview.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/cpoint.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/crect.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/crowcolumnview.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/cscrollview.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/cshadowviewcontainer.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/csplitview.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/cstring.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/ctabview.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/ctooltipsupport.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/cview.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/cviewcontainer.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/cvstguitimer.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/genericstringlistdatabrowsersource.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/common/genericoptionmenu.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/vstguidebug.cpp")
|
|
||||||
|
|
||||||
if(WIN32)
|
|
||||||
target_sources("${NAME}" PRIVATE
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/common/fileresourceinputstream.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/win32/direct2d/d2dbitmap.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/win32/direct2d/d2ddrawcontext.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/win32/direct2d/d2dfont.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/win32/direct2d/d2dgraphicspath.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/win32/win32datapackage.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/win32/win32dragging.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/win32/win32frame.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/win32/win32openglview.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/win32/win32optionmenu.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/win32/win32support.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/win32/win32textedit.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/win32/winfileselector.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/win32/winstring.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/win32/wintimer.cpp")
|
|
||||||
elseif(APPLE)
|
|
||||||
target_sources("${NAME}" PRIVATE
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/common/fileresourceinputstream.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/common/genericoptionmenu.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/common/generictextedit.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/mac/carbon/hiviewframe.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/mac/carbon/hiviewoptionmenu.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/mac/carbon/hiviewtextedit.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/mac/caviewlayer.mm"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/mac/cfontmac.mm"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/mac/cgbitmap.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/mac/cgdrawcontext.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/mac/cocoa/autoreleasepool.mm"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/mac/cocoa/cocoahelpers.mm"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/mac/cocoa/cocoaopenglview.mm"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/mac/cocoa/cocoatextedit.mm"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/mac/cocoa/nsviewdraggingsession.mm"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/mac/cocoa/nsviewframe.mm"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/mac/cocoa/nsviewoptionmenu.mm"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/mac/macclipboard.mm"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/mac/macfileselector.mm"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/mac/macglobals.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/mac/macstring.mm"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/mac/mactimer.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/mac/quartzgraphicspath.cpp")
|
|
||||||
else()
|
|
||||||
target_sources("${NAME}" PRIVATE
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/common/fileresourceinputstream.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/common/generictextedit.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/linux/cairobitmap.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/linux/cairocontext.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/linux/cairofont.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/linux/cairogradient.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/linux/cairopath.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/linux/linuxstring.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/linux/x11fileselector.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/linux/x11frame.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/linux/x11platform.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/linux/x11timer.cpp"
|
|
||||||
"${VST3SDK_BASEDIR}/vstgui4/vstgui/lib/platform/linux/x11utils.cpp")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
target_include_directories("${NAME}" PRIVATE "${VST3SDK_BASEDIR}/vstgui4")
|
|
||||||
|
|
||||||
if(WIN32)
|
|
||||||
target_compile_definitions("${NAME}" PRIVATE "NOMINMAX=1")
|
|
||||||
if (NOT MSVC)
|
|
||||||
# autolinked on MSVC with pragmas
|
|
||||||
find_library(OPENGL32_LIBRARY "opengl32")
|
|
||||||
find_library(D2D1_LIBRARY "d2d1")
|
|
||||||
find_library(DWRITE_LIBRARY "dwrite")
|
|
||||||
find_library(DWMAPI_LIBRARY "dwmapi")
|
|
||||||
find_library(WINDOWSCODECS_LIBRARY "windowscodecs")
|
|
||||||
find_library(SHLWAPI_LIBRARY "shlwapi")
|
|
||||||
target_link_libraries("${NAME}" PRIVATE
|
|
||||||
"${OPENGL32_LIBRARY}"
|
|
||||||
"${D2D1_LIBRARY}"
|
|
||||||
"${DWRITE_LIBRARY}"
|
|
||||||
"${DWMAPI_LIBRARY}"
|
|
||||||
"${WINDOWSCODECS_LIBRARY}"
|
|
||||||
"${SHLWAPI_LIBRARY}")
|
|
||||||
endif()
|
|
||||||
elseif(APPLE)
|
|
||||||
find_library(APPLE_COREFOUNDATION_LIBRARY "CoreFoundation")
|
|
||||||
find_library(APPLE_FOUNDATION_LIBRARY "Foundation")
|
|
||||||
find_library(APPLE_COCOA_LIBRARY "Cocoa")
|
|
||||||
find_library(APPLE_OPENGL_LIBRARY "OpenGL")
|
|
||||||
find_library(APPLE_ACCELERATE_LIBRARY "Accelerate")
|
|
||||||
find_library(APPLE_QUARTZCORE_LIBRARY "QuartzCore")
|
|
||||||
find_library(APPLE_CARBON_LIBRARY "Carbon")
|
|
||||||
find_library(APPLE_AUDIOTOOLBOX_LIBRARY "AudioToolbox")
|
|
||||||
find_library(APPLE_COREAUDIO_LIBRARY "CoreAudio")
|
|
||||||
find_library(APPLE_COREMIDI_LIBRARY "CoreMIDI")
|
|
||||||
target_link_libraries("${NAME}" PRIVATE
|
|
||||||
"${APPLE_COREFOUNDATION_LIBRARY}"
|
|
||||||
"${APPLE_FOUNDATION_LIBRARY}"
|
|
||||||
"${APPLE_COCOA_LIBRARY}"
|
|
||||||
"${APPLE_OPENGL_LIBRARY}"
|
|
||||||
"${APPLE_ACCELERATE_LIBRARY}"
|
|
||||||
"${APPLE_QUARTZCORE_LIBRARY}"
|
|
||||||
"${APPLE_CARBON_LIBRARY}"
|
|
||||||
"${APPLE_AUDIOTOOLBOX_LIBRARY}"
|
|
||||||
"${APPLE_COREAUDIO_LIBRARY}"
|
|
||||||
"${APPLE_COREMIDI_LIBRARY}")
|
|
||||||
else()
|
|
||||||
find_package(X11 REQUIRED)
|
|
||||||
find_package(Freetype REQUIRED)
|
|
||||||
find_package(PkgConfig REQUIRED)
|
|
||||||
pkg_check_modules(LIBXCB REQUIRED xcb)
|
|
||||||
pkg_check_modules(LIBXCB_UTIL REQUIRED xcb-util)
|
|
||||||
pkg_check_modules(LIBXCB_CURSOR REQUIRED xcb-cursor)
|
|
||||||
pkg_check_modules(LIBXCB_KEYSYMS REQUIRED xcb-keysyms)
|
|
||||||
pkg_check_modules(LIBXCB_XKB REQUIRED xcb-xkb)
|
|
||||||
pkg_check_modules(LIBXKB_COMMON REQUIRED xkbcommon)
|
|
||||||
pkg_check_modules(LIBXKB_COMMON_X11 REQUIRED xkbcommon-x11)
|
|
||||||
pkg_check_modules(CAIRO REQUIRED cairo)
|
|
||||||
pkg_check_modules(FONTCONFIG REQUIRED fontconfig)
|
|
||||||
target_include_directories("${NAME}" PRIVATE
|
|
||||||
${X11_INCLUDE_DIRS}
|
|
||||||
${FREETYPE_INCLUDE_DIRS}
|
|
||||||
${LIBXCB_INCLUDE_DIRS}
|
|
||||||
${LIBXCB_UTIL_INCLUDE_DIRS}
|
|
||||||
${LIBXCB_CURSOR_INCLUDE_DIRS}
|
|
||||||
${LIBXCB_KEYSYMS_INCLUDE_DIRS}
|
|
||||||
${LIBXCB_XKB_INCLUDE_DIRS}
|
|
||||||
${LIBXKB_COMMON_INCLUDE_DIRS}
|
|
||||||
${LIBXKB_COMMON_X11_INCLUDE_DIRS}
|
|
||||||
${CAIRO_INCLUDE_DIRS}
|
|
||||||
${FONTCONFIG_INCLUDE_DIRS})
|
|
||||||
target_link_libraries("${NAME}" PRIVATE
|
|
||||||
${X11_LIBRARIES}
|
|
||||||
${FREETYPE_LIBRARIES}
|
|
||||||
${LIBXCB_LIBRARIES}
|
|
||||||
${LIBXCB_UTIL_LIBRARIES}
|
|
||||||
${LIBXCB_CURSOR_LIBRARIES}
|
|
||||||
${LIBXCB_KEYSYMS_LIBRARIES}
|
|
||||||
${LIBXCB_XKB_LIBRARIES}
|
|
||||||
${LIBXKB_COMMON_LIBRARIES}
|
|
||||||
${LIBXKB_COMMON_X11_LIBRARIES}
|
|
||||||
${CAIRO_LIBRARIES}
|
|
||||||
${FONTCONFIG_LIBRARIES})
|
|
||||||
find_library(DL_LIBRARY "dl")
|
|
||||||
if(DL_LIBRARY)
|
|
||||||
target_link_libraries("${NAME}" PRIVATE "${DL_LIBRARY}")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
target_sources("${NAME}" PRIVATE
|
|
||||||
"${VST3SDK_BASEDIR}/public.sdk/source/vst/vstguieditor.cpp")
|
|
||||||
|
|
||||||
target_include_directories("${NAME}" PRIVATE
|
|
||||||
external/steinberg/src)
|
|
||||||
|
|
||||||
target_compile_definitions("${NAME}" PRIVATE "SMTG_MODULE_IS_BUNDLE=1")
|
target_compile_definitions("${NAME}" PRIVATE "SMTG_MODULE_IS_BUNDLE=1")
|
||||||
|
|
||||||
if(${CMAKE_BUILD_TYPE} MATCHES "Debug")
|
|
||||||
target_compile_definitions("${NAME}" PRIVATE "DEVELOPMENT")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(${CMAKE_BUILD_TYPE} MATCHES "Release")
|
|
||||||
target_compile_definitions("${NAME}" PRIVATE "RELEASE")
|
|
||||||
endif()
|
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue