From 6878125b924267cddc3b952ad9600e2f5ac86a72 Mon Sep 17 00:00:00 2001 From: redtide Date: Sat, 20 May 2023 12:37:22 +0200 Subject: [PATCH 1/2] CMake definitions and format rearrangement - Rename some SFIZZ_ prefixed definitions where possible to permit some modules to be generic and be reused in other projects, keep project' information in the same place and more explicit - Fixed non-compliant code formatting --- .github/workflows/build.yml | 2 +- CMakeLists.txt | 98 +++++++++++++++++++------------------ clients/sfizz_jack.man.in | 4 +- clients/sfizz_render.man.in | 4 +- cmake/SfizzConfig.cmake | 31 ++++++------ cmake/SfizzDeps.cmake | 8 +-- cmake/SfizzFaust.cmake | 2 +- src/CMakeLists.txt | 2 +- 8 files changed, 79 insertions(+), 72 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 126083cf..43855535 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -308,7 +308,7 @@ jobs: -D CMAKE_BUILD_TYPE=${{ env.build_type }} -D CMAKE_CXX_STANDARD=17 -D ENABLE_LTO=OFF - -D SFIZZ_STATIC_DEPENDENCIES=ON + -D SFIZZ_SNDFILE_STATIC=ON -D SFIZZ_JACK=OFF ) ${{ matrix.platform }}-w64-mingw32-cmake "${options[@]}" diff --git a/CMakeLists.txt b/CMakeLists.txt index 6ba56bf6..a1312714 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,77 +1,81 @@ -if (WIN32) - cmake_minimum_required (VERSION 3.15) +if(WIN32) + cmake_minimum_required(VERSION 3.15) cmake_policy(SET CMP0091 NEW) else() - cmake_minimum_required (VERSION 3.5) - if (POLICY CMP0069) + cmake_minimum_required(VERSION 3.5) + if(POLICY CMP0069) cmake_policy(SET CMP0069 NEW) endif() endif() -project (libsfizz VERSION 1.2.2 LANGUAGES CXX C) -set (PROJECT_DESCRIPTION "A library to load SFZ description files and use them to render music.") +project(libsfizz + LANGUAGES CXX C + VERSION 1.2.2 +) +set(PROJECT_DESCRIPTION "A library to load SFZ description files and use them to render music.") +set(PROJECT_REPOSITORY https://github.com/sfztools/sfizz) # External configuration CMake scripts -set (CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};${CMAKE_CURRENT_SOURCE_DIR}/cmake") -include (BuildType) +set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};${CMAKE_CURRENT_SOURCE_DIR}/cmake") +include(BuildType) # Build Options -include (OptionEx) +include(OptionEx) -set (BUILD_TESTING OFF CACHE BOOL "Disable Abseil's tests [default: OFF]") +set(BUILD_TESTING OFF CACHE BOOL "Disable Abseil's tests [default: OFF]") -option_ex (ENABLE_LTO "Enable Link Time Optimization" ON) -option_ex (SFIZZ_JACK "Enable JACK stand-alone build" CMAKE_SYSTEM_NAME STREQUAL "Linux") -option_ex (SFIZZ_RENDER "Enable renderer of SMF files" ON) -option_ex (SFIZZ_BENCHMARKS "Enable benchmarks build" OFF) -option_ex (SFIZZ_TESTS "Enable tests build" OFF) -option_ex (SFIZZ_DEMOS "Enable feature demos build" OFF) -option_ex (SFIZZ_DEVTOOLS "Enable developer tools build" OFF) -option_ex (SFIZZ_SHARED "Enable shared library build" ON) -option_ex (SFIZZ_USE_SNDFILE "Enable use of the sndfile library" OFF) -option_ex (SFIZZ_USE_VCPKG "Assume that sfizz is build using vcpkg" OFF) -option_ex (SFIZZ_USE_SYSTEM_ABSEIL "Use Abseil libraries preinstalled on system" OFF) -option_ex (SFIZZ_USE_SYSTEM_GHC_FS "Use GHC Filesystem libraries preinstalled on system" OFF) -option_ex (SFIZZ_USE_SYSTEM_SIMDE "Use SIMDe libraries preinstalled on system" OFF) -option_ex (SFIZZ_USE_SYSTEM_KISS_FFT "Use KISS FFT libraries preinstalled on system" OFF) -option_ex (SFIZZ_USE_SYSTEM_PUGIXML "Use pugixml libraries preinstalled on system" OFF) -option_ex (SFIZZ_USE_SYSTEM_CXXOPTS "Use CXXOPTS libraries preinstalled on system" OFF) -option_ex (SFIZZ_USE_SYSTEM_CATCH "Use Catch libraries preinstalled on system" OFF) -option_ex (SFIZZ_STATIC_DEPENDENCIES "Link dependencies statically" OFF) -option_ex (SFIZZ_RELEASE_ASSERTS "Forced assertions in release builds" OFF) -option_ex (SFIZZ_PROFILE_BUILD "Profile the build time" OFF) +option_ex(ENABLE_LTO "Enable Link Time Optimization" ON) +option_ex(SFIZZ_JACK "Enable JACK stand-alone build" CMAKE_SYSTEM_NAME STREQUAL "Linux") +option_ex(SFIZZ_RENDER "Enable renderer of SMF files" ON) +option_ex(SFIZZ_BENCHMARKS "Enable benchmarks build" OFF) +option_ex(SFIZZ_TESTS "Enable tests build" OFF) +option_ex(SFIZZ_DEMOS "Enable feature demos build" OFF) +option_ex(SFIZZ_DEVTOOLS "Enable developer tools build" OFF) +option_ex(SFIZZ_SHARED "Enable shared library build" ON) +option_ex(SFIZZ_USE_SNDFILE "Enable use of the sndfile library" OFF) +option_ex(SFIZZ_USE_VCPKG "Assume that sfizz is build using vcpkg" OFF) +option_ex(SFIZZ_USE_SYSTEM_ABSEIL "Use Abseil libraries preinstalled on system" OFF) +option_ex(SFIZZ_USE_SYSTEM_GHC_FS "Use GHC Filesystem libraries preinstalled on system" OFF) +option_ex(SFIZZ_USE_SYSTEM_SIMDE "Use SIMDe libraries preinstalled on system" OFF) +option_ex(SFIZZ_USE_SYSTEM_KISS_FFT "Use KISS FFT libraries preinstalled on system" OFF) +option_ex(SFIZZ_USE_SYSTEM_PUGIXML "Use pugixml libraries preinstalled on system" OFF) +option_ex(SFIZZ_USE_SYSTEM_CXXOPTS "Use CXXOPTS libraries preinstalled on system" OFF) +option_ex(SFIZZ_USE_SYSTEM_CATCH "Use Catch libraries preinstalled on system" OFF) +option_ex(SFIZZ_RELEASE_ASSERTS "Forced assertions in release builds" OFF) +option_ex(SFIZZ_PROFILE_BUILD "Profile the build time" OFF) +option_ex(SFIZZ_SNDFILE_STATIC "Link the sndfile library statically" OFF) -# The fixed number of controller parameters -set(MIDI_CC_MAX 512 CACHE STRING "Maximum amount of Control Change Messages") +# Continuous Controller count (0 to 511) +set(MIDI_CC_COUNT 512 CACHE STRING "Maximum number of managed Control Change messages") -include (SfizzConfig) -include (SfizzDeps) -include (SfizzFaust) +include(SfizzConfig) +include(SfizzDeps) +include(SfizzFaust) # Don't use IPO in non Release builds -include (CheckIPO) +include(CheckIPO) # Add the static library targets and sources -add_subdirectory (src) +add_subdirectory(src) # Optional targets -add_subdirectory (clients) +add_subdirectory(clients) -if (SFIZZ_BENCHMARKS) - add_subdirectory (benchmarks) +if(SFIZZ_BENCHMARKS) + add_subdirectory(benchmarks) endif() -if (SFIZZ_TESTS) - enable_testing () - add_subdirectory (tests) +if(SFIZZ_TESTS) + enable_testing() + add_subdirectory(tests) endif() -if (SFIZZ_DEMOS) - add_subdirectory (demos) +if(SFIZZ_DEMOS) + add_subdirectory(demos) endif() -if (SFIZZ_DEVTOOLS) - add_subdirectory (devtools) +if(SFIZZ_DEVTOOLS) + add_subdirectory(devtools) endif() show_build_info_if_needed() diff --git a/clients/sfizz_jack.man.in b/clients/sfizz_jack.man.in index 35815adc..207c4393 100644 --- a/clients/sfizz_jack.man.in +++ b/clients/sfizz_jack.man.in @@ -32,6 +32,6 @@ Quit .SH SEE ALSO sfizz_render(1) .SH BUGS -See the main repository at @SFIZZ_REPOSITORY@. +See the main repository at @PROJECT_REPOSITORY@. .SH AUTHOR -Contributors can be seen on the main repository at @SFIZZ_REPOSITORY@. +Contributors can be seen on the main repository at @PROJECT_REPOSITORY@. diff --git a/clients/sfizz_render.man.in b/clients/sfizz_render.man.in index 73a12e12..16776196 100644 --- a/clients/sfizz_render.man.in +++ b/clients/sfizz_render.man.in @@ -25,6 +25,6 @@ Show help .SH SEE ALSO sfizz_jack(1) .SH BUGS -See the main repository at @SFIZZ_REPOSITORY@. +See the main repository at @PROJECT_REPOSITORY@. .SH AUTHOR -Contributors can be seen on the main repository at @SFIZZ_REPOSITORY@. +Contributors can be seen on the main repository at @PROJECT_REPOSITORY@. diff --git a/cmake/SfizzConfig.cmake b/cmake/SfizzConfig.cmake index 7ce4d8b9..b734c12b 100644 --- a/cmake/SfizzConfig.cmake +++ b/cmake/SfizzConfig.cmake @@ -123,13 +123,10 @@ if(USE_LIBCPP) add_link_options(-lc++abi) # New command on CMake master, not in 3.12 release endif() -set(SFIZZ_REPOSITORY https://github.com/sfztools/sfizz) include(GNUInstallDirs) if(PROJECT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) set(PROJECT_IS_MAIN TRUE) -else() - set(PROJECT_IS_MAIN FALSE) endif() # Don't show build information when building a different project @@ -137,7 +134,7 @@ function(show_build_info_if_needed) if(PROJECT_IS_MAIN) message(STATUS " Project name: ${PROJECT_NAME} -CMAKE_CXX_STANDARD: ${CMAKE_CXX_STANDARD} +C++ standard version: ${CMAKE_CXX_STANDARD} Build type: ${CMAKE_BUILD_TYPE} Build processor: ${PROJECT_SYSTEM_PROCESSOR} Build using LTO: ${ENABLE_LTO} @@ -148,9 +145,11 @@ Build benchmarks: ${SFIZZ_BENCHMARKS} Build tests: ${SFIZZ_TESTS} Build demos: ${SFIZZ_DEMOS} Build devtools: ${SFIZZ_DEVTOOLS} + Use sndfile: ${SFIZZ_USE_SNDFILE} +Statically link sndfile: ${SFIZZ_SNDFILE_STATIC} + Use vcpkg: ${SFIZZ_USE_VCPKG} -Statically link dependencies: ${SFIZZ_STATIC_DEPENDENCIES} Use clang libc++: ${USE_LIBCPP} Release asserts: ${SFIZZ_RELEASE_ASSERTS} @@ -163,24 +162,28 @@ Use system pugixml: ${SFIZZ_USE_SYSTEM_PUGIXML} Use system simde: ${SFIZZ_USE_SYSTEM_SIMDE}") if(CMAKE_PROJECT_NAME STREQUAL "sfizz") message(STATUS " -Build AU plug-in: ${SFIZZ_AU} -Build LV2 plug-in: ${SFIZZ_LV2} -Build LV2 user interface: ${SFIZZ_LV2_UI} -Build VST plug-in: ${SFIZZ_VST} - Use system lv2: ${SFIZZ_USE_SYSTEM_LV2} Use system vst3sdk sources: ${SFIZZ_USE_SYSTEM_VST3SDK} -LV2 plugin-side CC automation ${SFIZZ_LV2_PSA} +Build AU plug-in: ${PLUGIN_AU} +Build LV2 plug-in: ${PLUGIN_LV2} +Build LV2 user interface: ${PLUGIN_LV2_UI} +LV2 plugin-side CC automation ${PLUGIN_LV2_PSA} +Build Pure Data plug-in: ${PLUGIN_PUREDATA} +Build VST plug-in: ${PLUGIN_VST} + +AU destination directory: ${AU_PLUGIN_INSTALL_DIR} LV2 destination directory: ${LV2PLUGIN_INSTALL_DIR} +Pd destination directory: ${PD_PLUGIN_INSTALL_DIR} VST destination directory: ${VSTPLUGIN_INSTALL_DIR}") endif() message(STATUS " Install prefix: ${CMAKE_INSTALL_PREFIX} -Compiler CXX debug flags: ${CMAKE_CXX_FLAGS_DEBUG} -Compiler CXX release flags: ${CMAKE_CXX_FLAGS_RELEASE} -Compiler CXX min size flags: ${CMAKE_CXX_FLAGS_MINSIZEREL} +CXX Debug flags: ${CMAKE_CXX_FLAGS_DEBUG} +CXX Release flags: ${CMAKE_CXX_FLAGS_RELEASE} +CXX MinSize flags: ${CMAKE_CXX_FLAGS_MINSIZEREL} +CXX RelWithDebInfo flags: ${CMAKE_CXX_FLAGS_RELWITHDEBINFO} ") endif() endfunction() diff --git a/cmake/SfizzDeps.cmake b/cmake/SfizzDeps.cmake index 3b15bbda..c76e216a 100644 --- a/cmake/SfizzDeps.cmake +++ b/cmake/SfizzDeps.cmake @@ -26,8 +26,8 @@ if(OPENMP_FOUND) $<$:${SFIZZ_OpenMP_CXX_OPTIONS}>) endif() +# FIXME: remove UI libs which was used by plugins only # Find macOS system libraries -# TODO: remove UI libs which was used by plugins only if(APPLE) find_library(APPLE_COREFOUNDATION_LIBRARY "CoreFoundation") find_library(APPLE_FOUNDATION_LIBRARY "Foundation") @@ -122,7 +122,7 @@ if(SFIZZ_USE_SNDFILE OR SFIZZ_DEMOS OR SFIZZ_DEVTOOLS OR SFIZZ_BENCHMARKS) find_package(PkgConfig REQUIRED) pkg_check_modules(SNDFILE "sndfile" REQUIRED) target_include_directories(sfizz_sndfile INTERFACE ${SNDFILE_INCLUDE_DIRS}) - if(SFIZZ_STATIC_DEPENDENCIES) + if(SFIZZ_SNDFILE_STATIC) target_link_libraries(sfizz_sndfile INTERFACE ${SNDFILE_STATIC_LIBRARIES}) else() target_link_libraries(sfizz_sndfile INTERFACE ${SNDFILE_LIBRARIES}) @@ -212,7 +212,7 @@ add_library(sfizz::hiir_polyphase_iir2designer ALIAS sfizz_hiir_polyphase_iir2de target_link_libraries(sfizz_hiir_polyphase_iir2designer PUBLIC sfizz::hiir) # The kissfft library -if (SFIZZ_USE_SYSTEM_KISS_FFT) +if(SFIZZ_USE_SYSTEM_KISS_FFT) find_path(KISSFFT_INCLUDE_DIR "kiss_fft.h" PATH_SUFFIXES "kissfft") find_path(KISSFFTR_INCLUDE_DIR "kiss_fftr.h" PATH_SUFFIXES "kissfft") find_library(KISSFFT_FFTR_LIBRARY "kiss_fftr_float" KISSFFTR_INCLUDE_DIR) @@ -284,7 +284,7 @@ else() add_library(sfizz_filesystem_impl STATIC "${CMAKE_CURRENT_BINARY_DIR}/fs_std_impl.cpp") target_include_directories(sfizz_filesystem_impl PUBLIC ${SFIZZ_FILESYSTEM_INCLUDE_DIR}) # Add the needed linker option for GCC 8 - if (CMAKE_CXX_COMPILER_ID MATCHES "GNU" + if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 8.0 AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9.0) target_link_libraries(sfizz_filesystem_impl PUBLIC stdc++fs) diff --git a/cmake/SfizzFaust.cmake b/cmake/SfizzFaust.cmake index a69ee115..a723bcf9 100644 --- a/cmake/SfizzFaust.cmake +++ b/cmake/SfizzFaust.cmake @@ -60,7 +60,7 @@ function(add_faust_command INPUT OUTPUT) if(_FAUST_SUPERCLASS_NAME) list(APPEND _cmd "--scn" "${_FAUST_SUPERCLASS_NAME}") endif() - if (_FAUST_IMPORT_DIRS) + if(_FAUST_IMPORT_DIRS) foreach(_dir IN LISTS _FAUST_IMPORT_DIRS) if(NOT IS_ABSOLUTE "${_dir}") set(_dir "${CMAKE_CURRENT_SOURCE_DIR}/${_dir}") diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 11edc55b..76a6b718 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -310,7 +310,7 @@ sfizz_enable_fast_math(sfizz_internal) # Check that sfizz and cmake-side definitions are matching file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/sfizz_match_definitions.cpp" " #include \"Config.h\" -static_assert(sfz::config::numCCs == ${MIDI_CC_MAX}, \"MIDI_CC_MAX did not match\"); +static_assert(sfz::config::numCCs == ${MIDI_CC_COUNT}, \"MIDI_CC_COUNT did not match\"); ") add_library(sfizz_match_definitions STATIC "${CMAKE_CURRENT_BINARY_DIR}/sfizz_match_definitions.cpp") target_link_libraries(sfizz_match_definitions PRIVATE sfizz::internal) From 0a8f4e0ebf102e2d919f276867043a1ed24610a3 Mon Sep 17 00:00:00 2001 From: redtide Date: Sat, 20 May 2023 14:02:32 +0200 Subject: [PATCH 2/2] Generate src/sfizz/Config.h with CMake currently only necessary to customize the MIDI_CC_COUNT value. Removed the previous sfizz_match_definitions.cpp checking file generation. --- cmake/SfizzConfig.cmake | 4 + src/CMakeLists.txt | 9 -- src/Config.h.in | 184 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 188 insertions(+), 9 deletions(-) create mode 100644 src/Config.h.in diff --git a/cmake/SfizzConfig.cmake b/cmake/SfizzConfig.cmake index b734c12b..f4d515b2 100644 --- a/cmake/SfizzConfig.cmake +++ b/cmake/SfizzConfig.cmake @@ -129,6 +129,10 @@ if(PROJECT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) set(PROJECT_IS_MAIN TRUE) endif() +# Generate Config.h +configure_file("${PROJECT_SOURCE_DIR}/src/Config.h.in" + "${PROJECT_SOURCE_DIR}/src/sfizz/Config.h" @ONLY) + # Don't show build information when building a different project function(show_build_info_if_needed) if(PROJECT_IS_MAIN) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 76a6b718..e1abe869 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -306,15 +306,6 @@ if(SFIZZ_IMPLEMENT_CXX17_ALIGNED_NEW_SUPPORT) endif() sfizz_enable_fast_math(sfizz_internal) -# TODO: sfz::config::numCCs generated with CMake -# Check that sfizz and cmake-side definitions are matching -file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/sfizz_match_definitions.cpp" " -#include \"Config.h\" -static_assert(sfz::config::numCCs == ${MIDI_CC_COUNT}, \"MIDI_CC_COUNT did not match\"); -") -add_library(sfizz_match_definitions STATIC "${CMAKE_CURRENT_BINARY_DIR}/sfizz_match_definitions.cpp") -target_link_libraries(sfizz_match_definitions PRIVATE sfizz::internal) - # Sfizz static library add_library(sfizz_static STATIC sfizz/sfizz_wrapper.cpp sfizz/sfizz.cpp sfizz/sfizz_private.hpp) add_library(sfizz::static ALIAS sfizz_static) diff --git a/src/Config.h.in b/src/Config.h.in new file mode 100644 index 00000000..1d89dfac --- /dev/null +++ b/src/Config.h.in @@ -0,0 +1,184 @@ +// 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 +#ifdef _WIN32 +// There's a spurious min/max function in MSVC that makes everything go badly... +#ifndef NOMINMAX +#define NOMINMAX 1 +#endif +#define _SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING +#endif +#include "absl/strings/string_view.h" +#include +#include + +namespace sfz { + +enum ExtendedCCs { + pitchBend = 128, + channelAftertouch = 129, + polyphonicAftertouch = 130, + noteOnVelocity = 131, + noteOffVelocity = 132, + keyboardNoteNumber = 133, + keyboardNoteGate = 134, + unipolarRandom = 135, + bipolarRandom = 136, + alternate = 137, + keydelta = 140, + absoluteKeydelta = 141, +}; + +namespace config { + constexpr float defaultSampleRate { 48000 }; + constexpr float maxSampleRate { 192000 }; + constexpr int defaultSamplesPerBlock { 1024 }; + constexpr int maxBlockSize { 8192 }; + constexpr int bufferPoolSize { 6 }; + constexpr int stereoBufferPoolSize { 4 }; + constexpr int indexBufferPoolSize { 4 }; + constexpr int preloadSize { 8192 }; + constexpr bool loadInRam { false }; + constexpr int loggerQueueSize { 256 }; + constexpr int voiceLoggerQueueSize { 256 }; + constexpr bool loggingEnabled { false }; + constexpr size_t maxChannels { 32 }; + constexpr int numBackgroundThreads { 4 }; + constexpr unsigned fileClearingPeriod { 5 }; // in seconds + constexpr int numVoices { 64 }; + constexpr unsigned maxVoices { 256 }; + constexpr unsigned smoothingSteps { 512 }; + constexpr uint16_t xfadeSmoothing { 5 }; + constexpr uint16_t gainSmoothing { 0 }; + constexpr unsigned powerTableSizeExponent { 11 }; + constexpr int maxFilePromises { maxVoices }; + constexpr int allSoundOffCC { 120 }; + constexpr int resetCC { 121 }; + constexpr int allNotesOffCC { 123 }; + constexpr int omniOffCC { 124 }; + constexpr int omniOnCC { 125 }; + constexpr int centPerSemitone { 100 }; + constexpr float virtuallyZero { 0.001f }; + constexpr float fastReleaseDuration { 0.01f }; + constexpr char defineCharacter { '$' }; + constexpr float A440 { 440.0 }; + constexpr size_t powerHistoryLength { 16 }; + constexpr size_t powerFollowerStep { 512 }; + constexpr float powerFollowerAttackTime { 5e-3f }; + constexpr float powerFollowerReleaseTime { 200e-3f }; + constexpr uint16_t numCCs { @MIDI_CC_COUNT@ }; + constexpr int maxCurves { 256 }; + constexpr int fileChunkSize { 1024 }; + constexpr int processChunkSize { 16 }; + constexpr unsigned int defaultAlignment { 16 }; + constexpr int filtersInPool { maxVoices * 2 }; + constexpr int excessFileFrames { 64 }; + constexpr int maxLFOSubs { 8 }; + constexpr int maxLFOSteps { 128 }; + /** + * @brief The threshold for age stealing. + * In percentage of the voice's max age. + */ + constexpr float stealingAgeCoeff { 0.5f }; + /** + * @brief The threshold for power stealing. + * In percentage of the sum of all powers. + */ + constexpr float stealingPowerCoeff { 0.5f }; + constexpr int filtersPerVoice { 2 }; + constexpr int eqsPerVoice { 3 }; + constexpr int oscillatorsPerVoice { 9 }; + constexpr float uniformNoiseBounds { 1.0f }; + constexpr float noiseVariance { 0.25f }; + /** + Minimum interval in frames between recomputations of coefficients of the + modulated filter. The lower, the more CPU resources are consumed. + */ + constexpr int filterControlInterval { 16 }; + /** + Amplitude below which an exponential releasing envelope is considered as + finished. + */ + constexpr float egReleaseThreshold = 1e-4; + /** + Duration of a linear transition user to smooth cases of otherwise + immediate level transitions. (eg. decay->sustain or release->off) + */ + constexpr float egTransitionTime = 50e-3; + /** + Default metadata for MIDIName documents + */ + const absl::string_view midnamManufacturer { "The Sfizz authors" }; + const absl::string_view midnamModel { "Sfizz" }; + /** + Limit of how many "fxN" buses are accepted (in SFZv2, maximum is 4) + */ + constexpr int maxEffectBuses { 256 }; + // Wavetable constants; amplitude values are matched to reference + static constexpr unsigned tableSize = 1024; + static constexpr double tableRefSampleRate = 44100.0 * 1.1; // +10% aliasing permissivity + /** + Default wave amplitudes, adjusted for consistent RMS among all waves. + (except square curiously, but it's to match ARIA) + */ + static constexpr double amplitudeSine = 1.0; + static constexpr double amplitudeTriangle = 1.0; + static constexpr double amplitudeSaw = 0.8164965809277261; // sqrt(2)/sqrt(3) + static constexpr double amplitudeSquare = 0.8164965809277261; // should have been sqrt(2)? + /** + Frame count high limit, for automatically loading a sound file as wavetable. + Set to 3000 according to Cakewalk. + */ + static constexpr unsigned wavetableMaxFrames = 3000; + /** + Background file loading + */ + static constexpr int backgroundLoaderPthreadPriority = 50; // expressed in % + /** + @brief Ratio to target under which smoothing is considered as completed + */ + static constexpr float smoothingShortcutThreshold = 5e-3; + // loop crossfade settings + static constexpr int loopXfadeCurve = 2; // 0: linear + // 1: use curves 5 & 6 + // 2: use S-shaped curve + /** + * @brief Overflow voices in the engine, relative to the required voices. + * These are additional voices that more or less hold the "dying" voices + * due to engine polyphony being reached. + */ + static constexpr float overflowVoiceMultiplier { 1.5f }; + static_assert(overflowVoiceMultiplier >= 1.0f, "This needs to add voices"); + /** + * @brief Minimum number of overflow voices to add + * + */ + static constexpr int minOverflowVoices { 4 }; + + /** + * @brief The smoothing time constant per "smooth" steps + */ + constexpr float smoothTauPerStep { 3e-3 }; + /** + * @brief If a value below this threshold is given to `ampeg_sustain`, the envelope will free-run + * and the voice will release itself at the end of the decay stage. + */ + constexpr float sustainFreeRunningThreshold { 0.0032f }; + /** + * @brief Number of frames offset between the end of a block and the beginning of the next + * detected as a shift in the playhead position + * + */ + constexpr int playheadMovedFrames { 16 }; + /** + * @brief Max number of voices to start on release pedal up + * + */ + constexpr unsigned delayedReleaseVoices { 16 }; +} // namespace config + +} // namespace sfz