From 515b8620743a5b3237ba0593ed843ce51439fcd8 Mon Sep 17 00:00:00 2001 From: Owen Green Date: Wed, 22 Aug 2018 10:11:34 +0100 Subject: [PATCH 1/4] fdGain: Add rough and ready real-time processor port --- fdGain/CMakeLists.txt | 119 ++++++++++++++++++ fdGain/fdGain.cpp | 93 ++++++++++++++ .../fdGain/HelpSource/Classes/FDGain.schelp | 4 + release-packaging/fdGain/classes/fdGain.sc | 6 + 4 files changed, 222 insertions(+) create mode 100755 fdGain/CMakeLists.txt create mode 100644 fdGain/fdGain.cpp create mode 100644 release-packaging/fdGain/HelpSource/Classes/FDGain.schelp create mode 100644 release-packaging/fdGain/classes/fdGain.sc diff --git a/fdGain/CMakeLists.txt b/fdGain/CMakeLists.txt new file mode 100755 index 0000000..e9a35d0 --- /dev/null +++ b/fdGain/CMakeLists.txt @@ -0,0 +1,119 @@ +####### original SC Cmake file starts here +cmake_minimum_required (VERSION 3.1) +get_filename_component(PROJECT ${CMAKE_SOURCE_DIR} NAME_WE) #automatically sets project name from the filename +message(STATUS "Project name is ${PROJECT}") +project (${PROJECT}) + +####### added the eingenmf +set(FLUID_DECOMP_DIR ~/fluid_decomposition) +set(FILENAME "fdGain.cpp") #specify the .cpp file here + +set(CMAKE_CXX_STANDARD 11) +set (CMAKE_CXX_STANDARD_REQUIRED ON) + +add_library( +${PROJECT} +MODULE +${FILENAME} +"${FLUID_DECOMP_DIR}/3rdparty/HISSTools_FFT/HISSTools_FFT.cpp" +) + +add_custom_command( + TARGET + ${PROJECT} + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy $ "../../release-packaging/${PROJECT}/plugins" +) + +include_directories( + "${FLUID_DECOMP_DIR}" + "${FLUID_DECOMP_DIR}/include" + "${FLUID_DECOMP_DIR}/3rdparty" +) + + +include_directories(${SC_PATH}/include/plugin_interface) +include_directories(${SC_PATH}/include/common) +include_directories(${SC_PATH}/common) + +set(CMAKE_SHARED_MODULE_PREFIX "") +if(APPLE OR WIN32) +set(CMAKE_SHARED_MODULE_SUFFIX ".scx") +endif() + +option(SUPERNOVA "Build plugins for supernova" OFF) +if (SUPERNOVA) + include_directories(${SC_PATH}/external_libraries/nova-tt) + # actually just boost.atomic + include_directories(${SC_PATH}/external_libraries/boost) + include_directories(${SC_PATH}/external_libraries/boost_lockfree) + include_directories(${SC_PATH}/external_libraries/boost-lockfree) +endif() + +option(CPP11 "Build with c++11." ON) + +if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + set(CMAKE_COMPILER_IS_CLANG 1) +endif() + +if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_CLANG) + add_definitions(-fvisibility=hidden) + + include (CheckCCompilerFlag) + include (CheckCXXCompilerFlag) + + CHECK_C_COMPILER_FLAG(-msse HAS_SSE) + CHECK_CXX_COMPILER_FLAG(-msse HAS_CXX_SSE) + + if (HAS_SSE) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse") + endif() + if (HAS_CXX_SSE) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse") + endif() + + CHECK_C_COMPILER_FLAG(-msse2 HAS_SSE2) + CHECK_CXX_COMPILER_FLAG(-msse2 HAS_CXX_SSE2) + + if (HAS_SSE2) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse2") + endif() + if (HAS_CXX_SSE2) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse2") + endif() + + CHECK_C_COMPILER_FLAG(-mfpmath=sse HAS_FPMATH_SSE) + CHECK_CXX_COMPILER_FLAG(-mfpmath=sse HAS_CXX_FPMATH_SSE) + + if (HAS_FPMATH_SSE) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfpmath=sse") + endif() + if (HAS_CXX_FPMATH_SSE) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpmath=sse") + endif() + + if(NATIVE) + add_definitions(-march=native) + endif() + + if(CPP11) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") + if(CMAKE_COMPILER_IS_CLANG) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") + endif() + endif() +endif() +if(MINGW) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mstackrealign") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mstackrealign") +endif() + +####### added the fluid_decomposition + +if(SUPERNOVA) + add_library(${PROJECT}_supernova MODULE ${FILENAME}) + set_property(TARGET ${PROJECT}_supernova + PROPERTY COMPILE_DEFINITIONS SUPERNOVA) +endif() + +target_link_libraries (${PROJECT} "-framework Accelerate") diff --git a/fdGain/fdGain.cpp b/fdGain/fdGain.cpp new file mode 100644 index 0000000..555ed46 --- /dev/null +++ b/fdGain/fdGain.cpp @@ -0,0 +1,93 @@ +// FD_BufNMF, an NRT buffer NMF Processor +// 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/GainClient.hpp" + +//Using statements for fluidtensor +using fluid::FluidTensor; +using fluid::FluidTensorView; +using fluid::audio::GainAudioClient; + + +static InterfaceTable *ft; + +using client_type = GainAudioClient; +using signal_type = client_type::signal_type; +using audio_signal= client_type::audio_signal; +using scalar_signal = client_type::scalar_signal; + +class FDGain: public SCUnit +{ +public: + FDGain() + { + //Same calc function, all day, every day + + //Get the chunk size, as we need that set buffers + const float chunk_size = in0(1); + + //Oh NO! Heap allocation! Make client object + if(chunk_size) + m_client = new client_type(chunk_size); + else + m_client = new client_type(1024); + + 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 + //in 1 => a or k + input_signals[0] = new audio_signal(); + output_signals[0] = new audio_signal(); + + if(isAudioRateIn(2)) + input_signals[1] = new audio_signal(); + else + input_signals[1] = new scalar_signal(); + + +// set_calc_function(); + mCalcFunc = make_calc_function(); + +// + Unit* unit = this; + ClearUnitOutputs(unit,1); + + } + + ~FDGain() + { + delete input_signals[0]; + delete input_signals[1]; + delete output_signals[0]; + delete m_client; + } + +private: + + void next(int numsamples) + { + input_signals[0]->set(const_cast(in(0)), in0(0)); + input_signals[1]->set(const_cast(in(2)), in0(2)); + output_signals[0]->set(out(0), out0(0)); + + m_client->do_process(input_signals,output_signals,numsamples,2,1); + } + + client_type* m_client; + signal_type* input_signals[2]; + signal_type* output_signals[1]; +}; + +PluginLoad(BoringMixer2UGens) { + ft = inTable; + registerUnit(ft, "FDGain"); +} + + + + diff --git a/release-packaging/fdGain/HelpSource/Classes/FDGain.schelp b/release-packaging/fdGain/HelpSource/Classes/FDGain.schelp new file mode 100644 index 0000000..0124754 --- /dev/null +++ b/release-packaging/fdGain/HelpSource/Classes/FDGain.schelp @@ -0,0 +1,4 @@ +//Ar modulator +{FDGain.ar(WhiteNoise.ar,64,SinOsc.ar(2))}.play +//Kr modulator +{FDGain.ar(WhiteNoise.ar,64,SinOsc.kr(2))}.play \ No newline at end of file diff --git a/release-packaging/fdGain/classes/fdGain.sc b/release-packaging/fdGain/classes/fdGain.sc new file mode 100644 index 0000000..e1beb47 --- /dev/null +++ b/release-packaging/fdGain/classes/fdGain.sc @@ -0,0 +1,6 @@ +fdGain: UGen { + *ar { arg in = 0, framesize=64, gain=1.0; + ^this.multiNew('audio', in.asAudioRateInput(this),framesize, gain) + } +} + From e1601709175de96b8e65abc0bc72b0d735c45fb2 Mon Sep 17 00:00:00 2001 From: Owen Green Date: Wed, 22 Aug 2018 10:13:18 +0100 Subject: [PATCH 2/4] Ignore all plugins and build directories --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 625e389..ace5497 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ build +**/build/* **/.DS_Store release-packaging/fdNMF/classes -release-packaging/fdNMF/plugins +release-packaging/*/plugins From b2153532e201bb201e37ac76391f45db842438a2 Mon Sep 17 00:00:00 2001 From: Owen Green Date: Thu, 23 Aug 2018 13:10:06 +0100 Subject: [PATCH 3/4] fdGain: Add TODO for const_cast code smell --- fdGain/fdGain.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/fdGain/fdGain.cpp b/fdGain/fdGain.cpp index 555ed46..09f4a81 100644 --- a/fdGain/fdGain.cpp +++ b/fdGain/fdGain.cpp @@ -71,6 +71,7 @@ private: void next(int numsamples) { + //TODO: Remove const_cast code smell by making input_signal type for const input_signals[0]->set(const_cast(in(0)), in0(0)); input_signals[1]->set(const_cast(in(2)), in0(2)); output_signals[0]->set(out(0), out0(0)); From e7f19f5bf17cce54e43333b73e961937d7e08489 Mon Sep 17 00:00:00 2001 From: Owen Green Date: Thu, 23 Aug 2018 15:15:08 +0100 Subject: [PATCH 4/4] Updated gitignore to admit SC classes in release package --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index ace5497..568f43e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ build **/build/* **/.DS_Store -release-packaging/fdNMF/classes release-packaging/*/plugins