Add real time sines

nix
Owen Green 7 years ago
parent cd26246a04
commit 92de975928

@ -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) }
}

@ -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;

@ -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)

@ -0,0 +1,128 @@
// A tool from the FluCoMa project, funded by the European Research Council (ERC) under the European Unions 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<double, float>::AudioSignal;
using SignalWrapper = stn::SinesClient<double, float>::Signal<float>;
// using SignalPointer = std::unique_ptr<signal_wrapper>;
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<double,float>(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<FDRTSines,&FDRTSines::next>();
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<float*>(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<double, float>* m_client;
SignalWrapper* input_signals[1];
SignalWrapper* output_signals[2];
};
}
}
PluginLoad(FluidSTFTUGen) {
ft = inTable;
registerUnit<fluid::stn::FDRTSines>(ft, "FDRTSines");
}
Loading…
Cancel
Save