From 92de97592827098e12cab4d5920f802b551cf482 Mon Sep 17 00:00:00 2001 From: Owen Green Date: Tue, 11 Sep 2018 17:18:29 +0100 Subject: [PATCH] Add real time sines --- release-packaging/Classes/fdRTSines.sc | 14 ++ .../HelpSource/Classes/FDRTSines.schelp | 4 + src/fdRTSines/CMakeLists.txt | 20 +++ src/fdRTSines/fdRTSines.cpp | 128 ++++++++++++++++++ 4 files changed, 166 insertions(+) create mode 100644 release-packaging/Classes/fdRTSines.sc create mode 100644 release-packaging/HelpSource/Classes/FDRTSines.schelp create mode 100755 src/fdRTSines/CMakeLists.txt create mode 100644 src/fdRTSines/fdRTSines.cpp diff --git a/release-packaging/Classes/fdRTSines.sc b/release-packaging/Classes/fdRTSines.sc new file mode 100644 index 0000000..fe46599 --- /dev/null +++ b/release-packaging/Classes/fdRTSines.sc @@ -0,0 +1,14 @@ +FDRTSines : MultiOutUGen { + *ar { arg in = 0, bandwidth = 76, threshold = 0.7, minTrackLen = 15, magnitudeWeight = 0.1, frequencyWeight = 1.0, windowSize= 2048, hopSize= 512, fftSize= 8192; + ^this.multiNew('audio', in.asAudioRateInput(this), bandwidth, threshold, minTrackLen, magnitudeWeight,frequencyWeight ,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/release-packaging/HelpSource/Classes/FDRTSines.schelp b/release-packaging/HelpSource/Classes/FDRTSines.schelp new file mode 100644 index 0000000..45e2088 --- /dev/null +++ b/release-packaging/HelpSource/Classes/FDRTSines.schelp @@ -0,0 +1,4 @@ +s.reboot; +b = Buffer.cueSoundFile(s,"/Users/owen/Box Sync/FluCoMa/Test files/SMS test files/Test Files/PAs 24 bit files/maxou-FR-a-k.wav.wav",0,1); +b.query +x = {FDRTSines.ar(DiskIn.ar(1,b.bufnum))}.play; diff --git a/src/fdRTSines/CMakeLists.txt b/src/fdRTSines/CMakeLists.txt new file mode 100755 index 0000000..3693881 --- /dev/null +++ b/src/fdRTSines/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/fdRTSines/fdRTSines.cpp b/src/fdRTSines/fdRTSines.cpp new file mode 100644 index 0000000..ba73d10 --- /dev/null +++ b/src/fdRTSines/fdRTSines.cpp @@ -0,0 +1,128 @@ + +// 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/SinesClient.hpp" + +static InterfaceTable *ft; +namespace fluid { +namespace stn{ + class FDRTSines: public SCUnit + { + using AudioSignalWrapper = stn::SinesClient::AudioSignal; + using SignalWrapper = stn::SinesClient::Signal; + + // using SignalPointer = std::unique_ptr; + public: + FDRTSines() + { + //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 stn::SinesClient(65536); + setParams(); + +// 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); + } + + ~FDRTSines() + { + delete input_signals[0]; + delete output_signals[0]; + delete output_signals[1]; + delete m_client; + } + + private: + + void setParams() + { + assert(m_client); + for(size_t i = 0; i < m_client->getParams().size(); ++i) + { + parameter::Instance& p = m_client->getParams()[i]; + switch(p.getDescriptor().getType()) + { + case parameter::Type::Long: + p.setLong(in0(i+1)); + break; + case parameter::Type::Float: + p.setFloat(in0(i+1)); + break; + case parameter::Type::Buffer: +// p.setBuffer( in0(i+1)); + break; + default: + break; + } + } + } + + + void next(int numsamples) + { + setParams(); + 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); + } + + stn::SinesClient* m_client; + SignalWrapper* input_signals[1]; + SignalWrapper* output_signals[2]; + }; +} +} + +PluginLoad(FluidSTFTUGen) { + ft = inTable; + registerUnit(ft, "FDRTSines"); +} + + + +