From 54ce464bf8857cc1153637caec32ec3ba0336a65 Mon Sep 17 00:00:00 2001 From: Owen Green Date: Thu, 13 Sep 2018 22:45:28 +0100 Subject: [PATCH] Add real time transient segmenter, correct small mistake in SC for rt transient extractor --- .../Classes/FluidSliceTransients.sc | 5 + release-packaging/Classes/FluidTransients.sc | 2 +- .../Classes/FluidSliceTransients.schelp | 6 + src/FluidSliceTransients/CMakeLists.txt | 20 ++++ .../FluidSliceTransients.cpp | 107 ++++++++++++++++++ 5 files changed, 139 insertions(+), 1 deletion(-) create mode 100644 release-packaging/Classes/FluidSliceTransients.sc create mode 100644 release-packaging/HelpSource/Classes/FluidSliceTransients.schelp create mode 100755 src/FluidSliceTransients/CMakeLists.txt create mode 100644 src/FluidSliceTransients/FluidSliceTransients.cpp diff --git a/release-packaging/Classes/FluidSliceTransients.sc b/release-packaging/Classes/FluidSliceTransients.sc new file mode 100644 index 0000000..4861870 --- /dev/null +++ b/release-packaging/Classes/FluidSliceTransients.sc @@ -0,0 +1,5 @@ +FluidSliceTransients : UGen { + *ar { arg in = 0, order = 20, blocksize = 256, padding = 128, skew = 0.0, threshFwd = 3.0, threshBack = 1.1, winSize=14, debounce=25; + ^this.multiNew('audio', in.asAudioRateInput(this), order, blocksize, padding, skew,threshFwd ,threshBack, winSize, debounce) + } +} \ No newline at end of file diff --git a/release-packaging/Classes/FluidTransients.sc b/release-packaging/Classes/FluidTransients.sc index ef245f6..d38721b 100644 --- a/release-packaging/Classes/FluidTransients.sc +++ b/release-packaging/Classes/FluidTransients.sc @@ -1,6 +1,6 @@ FluidTransients : MultiOutUGen { *ar { arg in = 0, order = 20, blocksize = 256, padding = 128, skew = 0.0, threshFwd = 3.0, threshBack = 1.1, winSize=14, debounce=25; - ^this.multiNew('audio', in.asAudioRateInput(this), order, blocksize, padding, skew,threshFwd ,threshBack, winSize) + ^this.multiNew('audio', in.asAudioRateInput(this), order, blocksize, padding, skew,threshFwd ,threshBack, winSize,debounce) } init { arg ... theInputs; inputs = theInputs; diff --git a/release-packaging/HelpSource/Classes/FluidSliceTransients.schelp b/release-packaging/HelpSource/Classes/FluidSliceTransients.schelp new file mode 100644 index 0000000..5d1ce7a --- /dev/null +++ b/release-packaging/HelpSource/Classes/FluidSliceTransients.schelp @@ -0,0 +1,6 @@ +s.reboot; +b = Buffer.cueSoundFile(s,"/Users/owen/Desktop/denoise_stn/sources/01-mix.wav",0,1); + + +b.query +x = {FluidSliceTransients.ar(DiskIn.ar(1,b.bufnum))}.play; diff --git a/src/FluidSliceTransients/CMakeLists.txt b/src/FluidSliceTransients/CMakeLists.txt new file mode 100755 index 0000000..3693881 --- /dev/null +++ b/src/FluidSliceTransients/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/FluidSliceTransients/FluidSliceTransients.cpp b/src/FluidSliceTransients/FluidSliceTransients.cpp new file mode 100644 index 0000000..55abd65 --- /dev/null +++ b/src/FluidSliceTransients/FluidSliceTransients.cpp @@ -0,0 +1,107 @@ + +// 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/TransientSlice.hpp" + +static InterfaceTable *ft; +namespace fluid { +namespace segmentation{ + class FluidSliceTransients: public SCUnit + { + using audio_client = TransientsSlice; + using AudioSignalWrapper = audio_client::AudioSignal; + using SignalWrapper = audio_client::Signal; + + // using SignalPointer = std::unique_ptr; + public: + FluidSliceTransients() + { + m_client = new audio_client(65536); + setParams(true); + bool isOK; + std::string feedback; + + std::tie(isOK, feedback) = m_client->sanityCheck(); + if(!isOK) + { + Print("FluidSliceTransients 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(); + + mCalcFunc = make_calc_function(); + Unit* unit = this; + ClearUnitOutputs(unit,1); + } + + ~FluidSliceTransients() + { + delete input_signals[0]; + delete output_signals[0]; + delete m_client; + } + + private: + + void setParams(bool instantiation) + { + assert(m_client); + for(size_t i = 0; i < m_client->getParams().size(); ++i) + { + parameter::Instance& p = m_client->getParams()[i]; + + if(!instantiation && p.getDescriptor().instantiation()) + continue; + + switch(p.getDescriptor().getType()) + { + case parameter::Type::Long: + p.setLong(in0(i+1)); + p.checkRange(); + break; + case parameter::Type::Float: + p.setFloat(in0(i+1)); + p.checkRange(); + break; + case parameter::Type::Buffer: +// p.setBuffer( in0(i+1)); + break; + default: + break; + } + } + } + + + void next(int numsamples) + { + setParams(false); + 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)); + m_client->do_process(std::begin(input_signals),std::end(input_signals),std::begin(output_signals), std::end(output_signals),numsamples,1,1); + } + + audio_client* m_client; + SignalWrapper* input_signals[1]; + SignalWrapper* output_signals[1]; + }; +} +} + +PluginLoad(FluidSTFTUGen) { + ft = inTable; + registerUnit(ft, "FluidSliceTransients"); +}