From 9f13fb96e8643880da35e9f29b5b1e66f003a3a5 Mon Sep 17 00:00:00 2001 From: Owen Green Date: Mon, 10 Sep 2018 20:15:37 +0100 Subject: [PATCH] Add real-time HPSS SC object --- release-packaging/Classes/fdRTHPSS.sc | 14 ++++ src/fdRTHPSS/CMakeLists.txt | 20 ++++++ src/fdRTHPSS/fdRTHPSS.cpp | 99 +++++++++++++++++++++++++++ 3 files changed, 133 insertions(+) create mode 100644 release-packaging/Classes/fdRTHPSS.sc create mode 100755 src/fdRTHPSS/CMakeLists.txt create mode 100644 src/fdRTHPSS/fdRTHPSS.cpp diff --git a/release-packaging/Classes/fdRTHPSS.sc b/release-packaging/Classes/fdRTHPSS.sc new file mode 100644 index 0000000..0b956e0 --- /dev/null +++ b/release-packaging/Classes/fdRTHPSS.sc @@ -0,0 +1,14 @@ +FDRTHPSS : MultiOutUGen { + *ar { arg in = 0, harmonicFilterSize = 17, percussiveFilterSize = 17, windowSize= 1024, hopSize= 256, fftSize= -1; + ^this.multiNew('audio', in.asAudioRateInput(this),harmonicFilterSize,percussiveFilterSize,windowSize, hopSize, fftSize) + } + init { arg ... theInputs; + inputs = theInputs; + channels = [ + OutputProxy(rate, this, 0), + OutputProxy(rate, this, 1) + ]; + ^channels + } + checkInputs { ^this.checkNInputs(1) } +} \ No newline at end of file diff --git a/src/fdRTHPSS/CMakeLists.txt b/src/fdRTHPSS/CMakeLists.txt new file mode 100755 index 0000000..3693881 --- /dev/null +++ b/src/fdRTHPSS/CMakeLists.txt @@ -0,0 +1,20 @@ +cmake_minimum_required(VERSION 3.3) +get_filename_component(PLUGIN ${CMAKE_CURRENT_LIST_DIR} NAME_WE) +message("Configuring ${PLUGIN}") +set(FILENAME ${PLUGIN}.cpp) + +add_library( + ${PLUGIN} + MODULE + ${FILENAME} +) + +target_include_directories( + ${PLUGIN} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/../../include +) + +target_link_libraries( + ${PLUGIN} PRIVATE FLUID_DECOMPOSITION +) + +include(${CMAKE_CURRENT_LIST_DIR}/../../scripts/target_post.cmake) diff --git a/src/fdRTHPSS/fdRTHPSS.cpp b/src/fdRTHPSS/fdRTHPSS.cpp new file mode 100644 index 0000000..8cac3cc --- /dev/null +++ b/src/fdRTHPSS/fdRTHPSS.cpp @@ -0,0 +1,99 @@ + +// A tool from the FluCoMa project, funded by the European Research Council (ERC) under the European Union’s Horizon 2020 research and innovation programme (grant agreement No 725899) + +#include "SC_PlugIn.hpp" +#include "data/FluidTensor.hpp" +#include "clients/rt/HPSSClient.hpp" + +static InterfaceTable *ft; +namespace fluid { +namespace hpss{ + class FDRTHPSS: public SCUnit + { + using AudioSignalWrapper = hpss::HPSSClient::AudioSignal; + using SignalWrapper = hpss::HPSSClient::Signal; + + // using SignalPointer = std::unique_ptr; + public: + FDRTHPSS() + { + //Order of args + //Window size, Hop size, FFT Size + + //Get the window size + const float hfilter_size = in0(1); + const float pfilter_size = in0(2); + const float window_size = in0(3); + const float hop_size = in0(4); + const float fft_size = in0(5); + + + //Oh NO! Heap allocation! Make client object + m_client = new hpss::HPSSClient(65536); + + m_client->getParams()[0].setLong(pfilter_size); + m_client->getParams()[1].setLong(hfilter_size); + m_client->getParams()[2].setLong(window_size); + m_client->getParams()[3].setLong(hop_size); + m_client->getParams()[4].setLong(fft_size); + + bool isOK; + std::string feedback; + + std::tie(isOK, feedback) = m_client->sanityCheck(); + if(!isOK) + { + Print("fdRTHPSS Error: %s",feedback.c_str()); + return; + } + + + m_client->set_host_buffer_size(bufferSize()); + m_client->reset(); + + //Work out what signals we need. For now keep it simple: + //in 0 => only audio + //out 0 => only audio + input_signals[0] = new AudioSignalWrapper(); + output_signals[0] = new AudioSignalWrapper(); + output_signals[1] = new AudioSignalWrapper(); + + mCalcFunc = make_calc_function(); + Unit* unit = this; + ClearUnitOutputs(unit,1); + } + + ~FDRTHPSS() + { + delete input_signals[0]; + delete output_signals[0]; + delete output_signals[1]; + delete m_client; + } + + private: + void next(int numsamples) + { + const float* input = in(0); + const float inscalar = in0(0); + input_signals[0]->set(const_cast(input), inscalar); + output_signals[0]->set(out(0), out0(0)); + output_signals[1]->set(out(1), out0(1)); + m_client->do_process(std::begin(input_signals),std::end(input_signals),std::begin(output_signals), std::end(output_signals),numsamples,1,2); + } + + hpss::HPSSClient* m_client; + SignalWrapper* input_signals[1]; + SignalWrapper* output_signals[2]; + }; +} +} + +PluginLoad(FluidSTFTUGen) { + ft = inTable; + registerUnit(ft, "FDRTHPSS"); +} + + + +