Update RT HPSS fr new threshold parameters; updated .sc and .schelp; purged C++ of raw pointers

nix
Owen Green 7 years ago
parent 494b64f1ba
commit e05dda9bc3

@ -1,12 +1,20 @@
FluidHPSS : MultiOutUGen { FluidHPSS : MultiOutUGen {
*ar { arg in = 0, percussiveFilterSize = 17, harmonicFilterSize = 17, percussiveThreshold = 50, harmonicThreshold = 50, windowSize= 1024, hopSize= 256, fftSize= -1; *ar { arg in = 0, percussiveFilterSize = 17, harmonicFilterSize=17, harmonicBinaryMask=0, percussiveBinaryMask=0,
^this.multiNew('audio', in.asAudioRateInput(this),harmonicFilterSize,percussiveFilterSize,percussiveThreshold,harmonicThreshold,windowSize, hopSize, fftSize) percussiveThreshFreq1=0, percussiveThreshAmp1=0,percussiveThreshFreq2=1.0, percussiveThreshAmp2=0,
harmonicThreshFreq1=0, harmonicThreshAmp1=0, harmonicThreshFreq2=1.0, harmonicThreshAmp2=0,
windowSize= 1024, hopSize= 256, fftSize= -1;
^this.multiNew('audio', in.asAudioRateInput(this), percussiveFilterSize, harmonicFilterSize,
harmonicBinaryMask,percussiveBinaryMask,
percussiveThreshFreq1, percussiveThreshAmp1,percussiveThreshFreq2, percussiveThreshAmp2,
harmonicThreshFreq1, harmonicThreshAmp1, harmonicThreshFreq2, harmonicThreshAmp2,
windowSize, hopSize, fftSize)
} }
init { arg ... theInputs; init { arg ... theInputs;
inputs = theInputs; inputs = theInputs;
channels = [ channels = [
OutputProxy(rate, this, 0), OutputProxy(rate, this, 0),
OutputProxy(rate, this, 1) OutputProxy(rate, this, 1),
OutputProxy(rate, this, 2)
]; ];
^channels ^channels
} }

@ -12,31 +12,25 @@ namespace hpss{
{ {
using AudioSignalWrapper = hpss::HPSSClient<double, float>::AudioSignal; using AudioSignalWrapper = hpss::HPSSClient<double, float>::AudioSignal;
using SignalWrapper = hpss::HPSSClient<double, float>::Signal<float>; using SignalWrapper = hpss::HPSSClient<double, float>::Signal<float>;
using SignalPointer = std::unique_ptr<SignalWrapper>;
// using SignalPointer = std::unique_ptr<signal_wrapper>; using ClientPointer = std::unique_ptr<hpss::HPSSClient<double,float>>;
template <size_t N>
using SignalArray = std::array<SignalPointer,N>;
public: public:
FDRTHPSS() FDRTHPSS()
{ {
//Order of args //Order of args
//psize hszie pthresh hthresh Window size, Hop size, FFT Size //psize hszie pthresh hthresh 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 //Oh NO! Heap allocation! Make client object
m_client = new hpss::HPSSClient<double,float>(65536); mClient = ClientPointer(new hpss::HPSSClient<double,float>(65536));
setParams(true); setParams(true);
bool isOK; bool isOK;
std::string feedback; std::string feedback;
std::tie(isOK, feedback) = m_client->sanityCheck(); std::tie(isOK, feedback) = mClient->sanityCheck();
if(!isOK) if(!isOK)
{ {
Print("fdRTHPSS Error: %s",feedback.c_str()); Print("fdRTHPSS Error: %s",feedback.c_str());
@ -44,37 +38,30 @@ namespace hpss{
} }
m_client->set_host_buffer_size(bufferSize()); mClient->set_host_buffer_size(bufferSize());
m_client->reset(); mClient->reset();
//Work out what signals we need. For now keep it simple: //Work out what signals we need. For now keep it simple:
//in 0 => only audio input_signals[0] = SignalPointer(new AudioSignalWrapper());
//out 0 => only audio output_signals[0] = SignalPointer(new AudioSignalWrapper());
input_signals[0] = new AudioSignalWrapper(); output_signals[1] = SignalPointer(new AudioSignalWrapper());
output_signals[0] = new AudioSignalWrapper(); output_signals[2] = SignalPointer(new AudioSignalWrapper());
output_signals[1] = new AudioSignalWrapper();
mCalcFunc = make_calc_function<FDRTHPSS,&FDRTHPSS::next>(); mCalcFunc = make_calc_function<FDRTHPSS,&FDRTHPSS::next>();
Unit* unit = this; Unit* unit = this;
ClearUnitOutputs(unit,1); ClearUnitOutputs(unit,1);
} }
~FDRTHPSS() ~FDRTHPSS() {}
{
delete input_signals[0];
delete output_signals[0];
delete output_signals[1];
delete m_client;
}
private: private:
void setParams(bool instantiation) void setParams(bool instantiation)
{ {
assert(m_client); assert(mClient);
for(size_t i = 0; i < m_client->getParams().size(); ++i) for(size_t i = 0; i < mClient->getParams().size(); ++i)
{ {
parameter::Instance& p = m_client->getParams()[i]; parameter::Instance& p = mClient->getParams()[i];
if(!instantiation && p.getDescriptor().instantiation()) if(!instantiation && p.getDescriptor().instantiation())
continue; continue;
switch(p.getDescriptor().getType()) switch(p.getDescriptor().getType())
@ -84,8 +71,25 @@ namespace hpss{
p.checkRange(); p.checkRange();
break; break;
case parameter::Type::Float: case parameter::Type::Float:
{
//We need to constrain threshold (normalised) frequency pairs at runtime.
std::string attrname = p.getDescriptor().getName();
auto constraint = paramConstraints.find(attrname);
if(constraint != paramConstraints.end())
{
double limit = parameter::lookupParam(constraint->second.param, mClient->getParams()).getFloat();
if(!constraint->second.condition(in0(i+1),limit))
{
return;
}
}
p.setFloat(in0(i+1)); p.setFloat(in0(i+1));
p.checkRange(); p.checkRange();
}
break; break;
case parameter::Type::Buffer: case parameter::Type::Buffer:
// p.setBuffer( in0(i+1)); // p.setBuffer( in0(i+1));
@ -104,12 +108,26 @@ namespace hpss{
input_signals[0]->set(const_cast<float*>(input), inscalar); input_signals[0]->set(const_cast<float*>(input), inscalar);
output_signals[0]->set(out(0), out0(0)); output_signals[0]->set(out(0), out0(0));
output_signals[1]->set(out(1), out0(1)); 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); output_signals[2]->set(out(2), out0(2));
mClient->do_process(std::begin(input_signals),std::end(input_signals),std::begin(output_signals), std::end(output_signals),numsamples,1,3);
} }
hpss::HPSSClient<double, float>* m_client; struct Constraint{
SignalWrapper* input_signals[1]; std::string param;
SignalWrapper* output_signals[2]; std::function<bool(double, double)> condition;
};
std::map<std::string, Constraint> paramConstraints{
{"pthreshf1",{"pthreshf2", std::less<double>()}},
{"hthreshf1",{"hthreshf2", std::less<double>()}},
{"pthreshf2",{"pthreshf1", std::greater<double>()}},
{"hthreshf2",{"hthreshf1", std::greater<double>()}}
};
ClientPointer mClient;
SignalArray<1> input_signals;
SignalArray<3> output_signals;
}; };
} }
} }

Loading…
Cancel
Save