diff --git a/xybrid/nodelib/instrumentcore.h b/xybrid/nodelib/instrumentcore.h index ee8e0d3..54308d7 100644 --- a/xybrid/nodelib/instrumentcore.h +++ b/xybrid/nodelib/instrumentcore.h @@ -3,11 +3,26 @@ #include #include #include +#ifdef WITH_BOOST +#include +#include +using boost::container::pmr::polymorphic_allocator; +template , + class Pred = std::equal_to> + using unordered_map = std::unordered_map>>; +template , + class Pred = std::equal_to> +using unordered_multimap = std::unordered_multimap>>; +#else + using std::pmr::unordered_map; + using std::pmr::unordered_multimap; +#endif #include #include "nodelib/basics.h" - #include "data/node.h" - #include "util/mem.h" namespace Xybrid::Data { @@ -91,8 +106,8 @@ namespace Xybrid::NodeLib { double volume = 1.0; double pan = 0.0; - std::pmr::unordered_map activeNotes = {16, Util::ralloc}; - std::pmr::unordered_multimap activeTweens = {16, Util::ralloc}; + unordered_map activeNotes = {16, Util::ralloc}; + unordered_multimap activeTweens = {16, Util::ralloc}; std::function paramFilter; std::unordered_map> globalParam; diff --git a/xybrid/nodelib/svfilter.cpp b/xybrid/nodelib/svfilter.cpp index a027ff2..5c1e5ba 100644 --- a/xybrid/nodelib/svfilter.cpp +++ b/xybrid/nodelib/svfilter.cpp @@ -10,7 +10,7 @@ using namespace Xybrid::Audio; template class Xybrid::NodeLib::GenericSVFilter; template class Xybrid::NodeLib::GenericSVFilter; - +/* template void GenericSVFilter
::process(DT in, double cutoff, double resonance, int ovs) { if (ovs <= 0) return; @@ -28,3 +28,4 @@ void GenericSVFilter
::process(DT in, double cutoff, double resonance, int ov } notch = high+low; } +*/ diff --git a/xybrid/nodelib/svfilter.h b/xybrid/nodelib/svfilter.h index 70fa803..bb962dd 100644 --- a/xybrid/nodelib/svfilter.h +++ b/xybrid/nodelib/svfilter.h @@ -2,8 +2,10 @@ #include #include - #include "data/audioframe.h" +#include "nodelib/basics.h" +#include "audio/audioengine.h" +using namespace Xybrid::Audio; namespace Xybrid::NodeLib { /// 12db Chamberlin State Variable Filter @@ -23,7 +25,22 @@ namespace Xybrid::NodeLib { inline GenericSVFilter
(const GenericSVFilter
& o) { std::memcpy(static_cast(this), static_cast(&o), sizeof(o)); } inline GenericSVFilter
& operator=(const GenericSVFilter
& o) { std::memcpy(static_cast(this), static_cast(&o), sizeof(o)); return *this; } - void process(DT in, double cutoff, double resonance, int oversamp = DEFAULT_OVERSAMP); + void process(DT in, double cutoff, double resonance, int oversamp = DEFAULT_OVERSAMP) { + if (oversamp <= 0) return; + cutoff = std::max(cutoff, 1.0); + resonance = std::max(resonance, 0.01); + + double f = 2.0 * std::sin(PI * cutoff / (audioEngine->curSampleRate() * oversamp)); + double q = std::sqrt(1.0 - std::atan(std::sqrt(resonance)) * 2.0 / PI); + double damp = std::sqrt(q); + + for (int i = 0; i < oversamp; i++) { + low += band*f; + high = in*damp - low - band*q; + band += high*f; + } + notch = high+low; + } inline void reset() { low = 0.0; high = 0.0; band = 0.0; notch = 0.0; } inline void normalize(double m) { if constexpr (std::is_arithmetic_v
) { @@ -48,7 +65,7 @@ namespace Xybrid::NodeLib { extern template void Xybrid::NodeLib::GenericSVFilter::process(double, double, double, int); /// 12db Chamberlin State Variable Filter - typedef GenericSVFilter SVFilter; + typedef GenericSVFilter SVFilter; /// 12db Chamberlin State Variable Filter (mono version) typedef GenericSVFilter SVFilterM; } diff --git a/xybrid/nodes/effect/svf.h b/xybrid/nodes/effect/svf.h index cd67c6f..bebdb9d 100644 --- a/xybrid/nodes/effect/svf.h +++ b/xybrid/nodes/effect/svf.h @@ -16,7 +16,6 @@ #include "data/node.h" #include "data/audioframe.h" - #include "nodelib/svfilter.h" #include "nodelib/param.h" diff --git a/xybrid/nodes/gadget/quicklevel.h b/xybrid/nodes/gadget/quicklevel.h index 1de334d..431543e 100644 --- a/xybrid/nodes/gadget/quicklevel.h +++ b/xybrid/nodes/gadget/quicklevel.h @@ -4,7 +4,7 @@ #include "data/node.h" #include "data/audioframe.h" - +#include namespace Xybrid::Gadgets { class QuickLevel : public Data::Node { QContiguousCache buf; diff --git a/xybrid/util/mem.cpp b/xybrid/util/mem.cpp index adc350e..e16f309 100644 --- a/xybrid/util/mem.cpp +++ b/xybrid/util/mem.cpp @@ -2,7 +2,7 @@ using namespace Xybrid::Util; -std::pmr::synchronized_pool_resource Xybrid::Util::rpool; // instantiate +synchronized_pool_resource Xybrid::Util::rpool; // instantiate decltype(Xybrid::Util::ralloc) Xybrid::Util::ralloc(&rpool); namespace { @@ -15,7 +15,7 @@ void Xybrid::Util::reserveInitialPool() { const constexpr size_t rsize = 1024*1024*128; size_t bsize = rpool.options().largest_required_pool_block; - std::vector allocs; + vector allocs; for (size_t ts = 0; ts < rsize; ts += bsize) { allocs.push_back(rpool.allocate(bsize)); } diff --git a/xybrid/util/mem.h b/xybrid/util/mem.h index 75736d2..4463d7b 100644 --- a/xybrid/util/mem.h +++ b/xybrid/util/mem.h @@ -3,12 +3,32 @@ #include #include #include +#ifdef WITH_BOOST +#include +#include +#include +#include +using boost::container::pmr::synchronized_pool_resource; +using boost::container::pmr::polymorphic_allocator; +using boost::container::vector; +#else #include +using std::pmr::synchronized_pool_resource; +using std::pmr::polymorphic_allocator; +#endif #include - +#ifdef WITH_BOOST + template , + class Pred = std::equal_to> + using unordered_set = std::unordered_set>; +#else + using std::pmr::unordered_set; + using std::vector; +#endif namespace Xybrid::Util { - extern std::pmr::synchronized_pool_resource rpool; - extern std::pmr::polymorphic_allocator ralloc; + extern synchronized_pool_resource rpool; + extern polymorphic_allocator ralloc; void reserveInitialPool(); @@ -18,7 +38,7 @@ namespace Xybrid::Util { std::list pages; std::deque avail; - std::pmr::unordered_set used = {rpool}; + unordered_set used = {rpool}; void newPage() { auto p = pages.emplace_back(); diff --git a/xybrid/xybrid.pro b/xybrid/xybrid.pro index 75f0fac..003945b 100644 --- a/xybrid/xybrid.pro +++ b/xybrid/xybrid.pro @@ -26,7 +26,7 @@ DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x050F00 DISTFILES += ../.astylerc -CONFIG += c++20 +CONFIG += c++2a # use all optimizations that won't generally interfere with debugging QMAKE_CXXFLAGS_DEBUG += -Og @@ -49,12 +49,12 @@ freebsd-clang { macx: { DEFINES += WITH_BOOST - LIBS += -L/usr/local/Cellar/boost/1.70.0/lib/ -lboost_math_tr1 + LIBS += -L/Users/rachel/.nix-profile/lib -lboost_container -lboost_math_tr1 LIBS += -framework OpenGL LIBS += -framework Foundation SOURCES += HEADERS += - QMAKE_CXXFLAGS += -g -I/usr/local/Cellar/boost/1.70.0/include/ + QMAKE_CXXFLAGS += -g -I/nix/store/gp7ascpyzsprb2i79kl5a22rmyawwscb-boost-1.77.0-dev/include }