Merge remote-tracking branch 'origin/pr/25' into feature/named+rolling

nix
Pierre Alexandre Tremblay 4 years ago
commit f63ae2cab3

@ -1,169 +1,229 @@
#pragma once #pragma once
#include <SC_PlugIn.hpp> #include <SC_PlugIn.hpp>
namespace fluid{ namespace fluid {
namespace client{ namespace client {
namespace impl{ namespace impl {
template <typename Client, class Wrapper>
struct RealTimeBase
{ template <typename Client, class Wrapper>
using HostVector = FluidTensorView<float, 1>; struct RealTimeBase
using Params = typename Client::ParamSetType; {
template<typename T, bool> using IOMapFn = void (RealTimeBase::*)(SCUnit&, Client&);
struct doExpectedCount; using HostVector = FluidTensorView<float, 1>;
using Params = typename Client::ParamSetType;
template<typename T> template <typename T, bool>
struct doExpectedCount<T, false> struct doExpectedCount;
{
static void count(const T& d,FloatControlsIter& c,Result& status) template <typename T>
{ struct doExpectedCount<T, false>
if(!status.ok()) return; {
static void count(const T& d, FloatControlsIter& c, Result& status)
if(c.remain()) {
{ if (!status.ok()) return;
index statedSize = d.fixedSize;
if (c.remain())
if(c.remain() < statedSize)
status = {Result::Status::kError,"Ran out of arguments at ", d.name};
//fastforward
for(index i=0; i < statedSize; ++i) c.next();
}
}
};
template<typename T>
struct doExpectedCount<T, true>
{
static void count(const T& d,FloatControlsIter& c,Result& status)
{
if(!status.ok()) return;
if(c.remain())
{
index statedSize = 1;
if(c.remain() < statedSize)
status = {Result::Status::kError,"Ran out of arguments at ", d.name};
//fastforward
for(index i=0; i < statedSize; ++i) c.next();
}
}
};
template<size_t N, typename T>
struct ExpectedCount{
void operator ()(const T& descriptor,FloatControlsIter& c, Result& status)
{ {
doExpectedCount<T,IsSharedClientRef<typename T::type>::value>::count(descriptor,c,status); index statedSize = d.fixedSize;
if (c.remain() < statedSize)
status = {Result::Status::kError, "Ran out of arguments at ", d.name};
// fastforward
for (index i = 0; i < statedSize; ++i) c.next();
} }
}; }
};
Result expectedSize(FloatControlsIter& controls) template <typename T>
struct doExpectedCount<T, true>
{
static void count(const T& d, FloatControlsIter& c, Result& status)
{ {
if(controls.size() < Client::getParameterDescriptors().count()) if (!status.ok()) return;
if (c.remain())
{ {
return {Result::Status::kError,"Fewer parameters than exepected. Got ", controls.size(), "expect at least", Client::getParameterDescriptors().count()}; index statedSize = 1;
if (c.remain() < statedSize)
status = {Result::Status::kError, "Ran out of arguments at ", d.name};
// fastforward
for (index i = 0; i < statedSize; ++i) c.next();
} }
Result countScan;
Client::getParameterDescriptors().template iterate<ExpectedCount>(
std::forward<FloatControlsIter&>(controls),
std::forward<Result&>(countScan));
return countScan;
} }
};
template <size_t N, typename T>
struct ExpectedCount
{
void operator()(const T& descriptor, FloatControlsIter& c, Result& status)
{
doExpectedCount<T, IsSharedClientRef<typename T::type>::value>::count(
descriptor, c, status);
}
};
// static index ControlOffset(Unit* unit) { return unit->mSpecialIndex + 1; } Result expectedSize(FloatControlsIter& controls)
// static index ControlSize(Unit* unit) { return static_cast<index>(unit->mNumInputs) - unit->mSpecialIndex - 1 -(IsModel_t<Client>::value ? 1 : 0); } {
if (controls.size() < Client::getParameterDescriptors().count())
void init(SCUnit& unit, Client& client, FloatControlsIter& controls)
{ {
assert(!(client.audioChannelsOut() > 0 && client.controlChannelsOut() > 0) &&"Client can't have both audio and control outputs"); return {Result::Status::kError, "Fewer parameters than exepected. Got ",
// consoltr.reset(unit.mInBuf + unit.mSpecialIndex + 1); controls.size(), "expect at least",
client.sampleRate(unit.fullSampleRate()); Client::getParameterDescriptors().count()};
mInputConnections.reserve(asUnsigned(client.audioChannelsIn())); }
mOutputConnections.reserve(asUnsigned(client.audioChannelsOut()));
mAudioInputs.reserve(asUnsigned(client.audioChannelsIn()));
mOutputs.reserve(asUnsigned(
std::max(client.audioChannelsOut(), client.controlChannelsOut())));
Result countScan;
Client::getParameterDescriptors().template iterate<ExpectedCount>(
std::forward<FloatControlsIter&>(controls),
std::forward<Result&>(countScan));
return countScan;
}
Result r; void init(SCUnit& unit, Client& client, FloatControlsIter& controls)
if(!(r = expectedSize(controls)).ok()) {
{ assert(!(client.audioChannelsOut() > 0 &&
// mCalcFunc = Wrapper::getInterfaceTable()->fClearUnitOutputs; client.controlChannelsOut().count > 0) &&
std::cout "Client can't have both audio and control outputs");
<< "ERROR: " << Wrapper::getName() client.sampleRate(unit.fullSampleRate());
<< " wrong number of arguments." mInputConnections.reserve(asUnsigned(client.audioChannelsIn()));
<< r.message() mOutputConnections.reserve(asUnsigned(client.audioChannelsOut()));
<< std::endl;
return;
}
Result r;
if (!(r = expectedSize(controls)).ok())
{
std::cout << "ERROR: " << Wrapper::getName()
<< " wrong number of arguments." << r.message() << std::endl;
return;
}
if (client.audioChannelsIn())
{
mAudioInputs.reserve(asUnsigned(client.audioChannelsIn()));
for (index i = 0; i < client.audioChannelsIn(); ++i) for (index i = 0; i < client.audioChannelsIn(); ++i)
{ {
mInputConnections.emplace_back(unit.isAudioRateIn(static_cast<int>(i))); mInputConnections.emplace_back(unit.isAudioRateIn(static_cast<int>(i)));
mAudioInputs.emplace_back(nullptr, 0, 0); mAudioInputs.emplace_back(nullptr, 0, 0);
} }
mInputMapper = &RealTimeBase::mapAudioInputs;
}
else if (client.controlChannelsIn())
{
mControlInputBuffer.resize(unit.mSpecialIndex + 1);
mAudioInputs.emplace_back(mControlInputBuffer);
mInputMapper = &RealTimeBase::mapControlInputs;
}
index outputSize = client.controlChannelsOut().size > 0
? std::max(client.audioChannelsOut(),
client.controlChannelsOut().size)
: unit.mSpecialIndex + 1;
mOutputs.reserve(asUnsigned(outputSize));
if (client.audioChannelsOut())
{
for (index i = 0; i < client.audioChannelsOut(); ++i) for (index i = 0; i < client.audioChannelsOut(); ++i)
{ {
mOutputConnections.emplace_back(true); mOutputConnections.emplace_back(true);
mOutputs.emplace_back(nullptr, 0, 0); mOutputs.emplace_back(nullptr, 0, 0);
} }
for (index i = 0; i < client.controlChannelsOut(); ++i) mOutMapperPre = &RealTimeBase::mapAudioOutputs;
{ mOutMapperPost = &RealTimeBase::mapNoOp;
mOutputs.emplace_back(nullptr, 0, 0); }
else
{
index totalControlOutputs =
client.controlChannelsOut().count * outputSize;
mControlOutputBuffer.resize(totalControlOutputs);
for (index i = 0; i < client.controlChannelsOut().count; ++i)
{
mOutputs.emplace_back(
mControlOutputBuffer(fluid::Slice(i * outputSize, outputSize)));
} }
}
mOutMapperPre = &RealTimeBase::mapNoOp;
void next(SCUnit& unit, Client& client,Params& params,FloatControlsIter& controls,bool updateParams = true) mOutMapperPost = &RealTimeBase::mapControlOutputs;
{ }
bool trig = IsModel_t<Client>::value ? !mPrevTrig && unit.in0(0) > 0 : false; }
mPrevTrig = trig; void mapNoOp(SCUnit&, Client&) {}
if(updateParams) void mapAudioInputs(SCUnit& unit, Client& client)
{ {
for (index i = 0; i < client.audioChannelsIn(); ++i)
{
assert(i <= std::numeric_limits<int>::max());
if (mInputConnections[asUnsigned(i)])
mAudioInputs[asUnsigned(i)].reset(
const_cast<float*>(unit.in(static_cast<int>(i))), 0,
unit.fullBufferSize());
}
}
void mapAudioOutputs(SCUnit& unit, Client& client)
{
for (index i = 0; i < client.audioChannelsOut(); ++i)
{
assert(i <= std::numeric_limits<int>::max());
if (mOutputConnections[asUnsigned(i)])
mOutputs[asUnsigned(i)].reset(unit.out(static_cast<int>(i)), 0,
unit.fullBufferSize());
}
}
void mapControlInputs(SCUnit& unit, Client& client)
{
for (index i = 0; i < unit.mSpecialIndex + 1; ++i)
{
assert(i <= std::numeric_limits<int>::max());
mControlInputBuffer[asUnsigned(i)] = unit.in0(static_cast<int>(i));
}
}
void mapControlOutputs(SCUnit& unit, Client& client)
{
for (index i = 0; i < mControlOutputBuffer.size(); ++i)
{
assert(i <= std::numeric_limits<int>::max());
unit.out0(static_cast<int>(i)) = mControlOutputBuffer(i);
}
}
void next(SCUnit& unit, Client& client, Params& params,
FloatControlsIter& controls, bool updateParams = true)
{
bool trig =
IsModel_t<Client>::value ? !mPrevTrig && unit.in0(0) > 0 : false;
mPrevTrig = trig;
if (updateParams)
{
Wrapper::setParams(&unit, params, controls); Wrapper::setParams(&unit, params, controls);
params.constrainParameterValuesRT(nullptr); params.constrainParameterValuesRT(nullptr);
} }
for (index i = 0; i < client.audioChannelsIn(); ++i) (this->*mInputMapper)(unit, client);
{ (this->*mOutMapperPre)(unit, client);
assert(i <= std::numeric_limits<int>::max()); client.process(mAudioInputs, mOutputs, mContext);
if (mInputConnections[asUnsigned(i)]) (this->*mOutMapperPost)(unit, client);
mAudioInputs[asUnsigned(i)].reset(const_cast<float*>(unit.in(static_cast<int>(i))), 0,unit.fullBufferSize()); }
}
private:
for (index i = 0; i < client.audioChannelsOut(); ++i) std::vector<bool> mInputConnections;
{ std::vector<bool> mOutputConnections;
assert(i <= std::numeric_limits<int>::max()); std::vector<HostVector> mAudioInputs;
if (mOutputConnections[asUnsigned(i)]) std::vector<HostVector> mOutputs;
mOutputs[asUnsigned(i)].reset(unit.out(static_cast<int>(i)), 0, FluidTensor<float, 1> mControlInputBuffer;
unit.fullBufferSize()); FluidTensor<float, 1> mControlOutputBuffer;
} FluidContext mContext;
bool mPrevTrig;
for (index i = 0; i < client.controlChannelsOut(); ++i) IOMapFn mInputMapper;
{ IOMapFn mOutMapperPre;
assert(i <= std::numeric_limits<int>::max()); IOMapFn mOutMapperPost;
mOutputs[asUnsigned(i)].reset(unit.out(static_cast<int>(i)), 0, 1); };
} } // namespace impl
client.process(mAudioInputs, mOutputs, mContext); } // namespace client
} } // namespace fluid
private:
std::vector<bool> mInputConnections;
std::vector<bool> mOutputConnections;
std::vector<HostVector> mAudioInputs;
std::vector<HostVector> mOutputs;
FluidContext mContext;
bool mPrevTrig;
};
}
}
}

@ -1,13 +1,12 @@
FluidKDTree : FluidRealTimeModel FluidKDTree : FluidModelObject
{ {
var neighbours,radius,lookup; var neighbours,radius;
*new{ |server, numNeighbours = 1, radius = 0, lookupDataSet| *new{ |server, numNeighbours = 1, radius = 0|
^super.new(server,[numNeighbours,radius,lookupDataSet ? -1]) ^super.new(server,[numNeighbours,radius ? -1])
.numNeighbours_(numNeighbours) .numNeighbours_(numNeighbours)
.radius_(radius) .radius_(radius);
.lookupDataSet_(lookupDataSet);
} }
numNeighbours_{|k|neighbours = k.asInteger; } numNeighbours_{|k|neighbours = k.asInteger; }
@ -16,10 +15,7 @@ FluidKDTree : FluidRealTimeModel
radius_{|r| radius = r.asUGenInput;} radius_{|r| radius = r.asUGenInput;}
radius{ ^radius; } radius{ ^radius; }
lookupDataSet_{|ds| lookup = ds ? -1; } prGetParams{^[this.id, this.numNeighbours,this.radius];}
lookupDataSet{|ds| ^ (lookup ? -1) }
prGetParams{^[this.numNeighbours,this.radius,this.lookupDataSet,-1,-1];}
fitMsg{ |dataSet| ^this.prMakeMsg(\fit,this.id,dataSet.id);} fitMsg{ |dataSet| ^this.prMakeMsg(\fit,this.id,dataSet.id);}
@ -47,16 +43,26 @@ FluidKDTree : FluidRealTimeModel
} }
kr{|trig, inputBuffer,outputBuffer, numNeighbours = 1, lookupDataSet| kr{|trig, inputBuffer,outputBuffer, numNeighbours = 1, lookupDataSet|
this.numNeighbours_(numNeighbours); /* this.numNeighbours_(numNeighbours);
lookupDataSet = lookupDataSet ? -1; lookupDataSet = lookupDataSet ? -1;
this.lookupDataSet_(lookupDataSet); this.lookupDataSet_(lookupDataSet);*/
^FluidKDTreeQuery.kr(K2A.ar(trig), ^FluidKDTreeQuery.kr(trig,
this, this.numNeighbours, this.radius, this.lookupDataSet.asUGenInput, this, numNeighbours, this.radius,lookupDataSet.asUGenInput,
this.prEncodeBuffer(inputBuffer), inputBuffer,outputBuffer);
this.prEncodeBuffer(outputBuffer));
} }
} }
FluidKDTreeQuery : FluidRTQuery {} FluidKDTreeQuery : FluidRTMultiOutUGen
{
*kr{ |trig, tree, numNeighbours, radius,lookupDataSet, inputBuffer, outputBuffer |
^this.multiNew('control',trig, tree.asUGenInput, numNeighbours, radius,lookupDataSet!?(_.asUGenInput)??{-1}, inputBuffer.asUGenInput, outputBuffer.asUGenInput)
}
init { arg ... theInputs;
inputs = theInputs;
^this.initOutputs(1, rate);
}
}

@ -1,4 +1,4 @@
FluidKMeans : FluidRealTimeModel { FluidKMeans : FluidModelObject {
var clusters, maxiter; var clusters, maxiter;
@ -14,7 +14,7 @@ FluidKMeans : FluidRealTimeModel {
maxIter_{|i| maxiter = i.asInteger} maxIter_{|i| maxiter = i.asInteger}
maxIter{ ^maxiter } maxIter{ ^maxiter }
prGetParams{^[this.numClusters,this.maxIter,-1,-1];} prGetParams{^[this.id,this.numClusters,this.maxIter];}
fitMsg{ |dataSet| ^this.prMakeMsg(\fit,id,dataSet.id);} fitMsg{ |dataSet| ^this.prMakeMsg(\fit,id,dataSet.id);}
@ -111,11 +111,21 @@ FluidKMeans : FluidRealTimeModel {
} }
kr{|trig, inputBuffer,outputBuffer| kr{|trig, inputBuffer,outputBuffer|
^FluidKMeansQuery.kr(K2A.ar(trig), ^FluidKMeansQuery.kr(trig,
this, clusters, maxiter, this,
this.prEncodeBuffer(inputBuffer), this.prEncodeBuffer(inputBuffer),
this.prEncodeBuffer(outputBuffer)); this.prEncodeBuffer(outputBuffer));
} }
} }
FluidKMeansQuery : FluidRTQuery {} FluidKMeansQuery : FluidRTMultiOutUGen {
*kr{ |trig, model,inputBuffer, outputBuffer |
^this.multiNew('control',trig, model.asUGenInput,inputBuffer.asUGenInput, outputBuffer.asUGenInput)
}
init { arg ... theInputs;
inputs = theInputs;
^this.initOutputs(1, rate);
}
}

@ -1,4 +1,4 @@
FluidKNNClassifier : FluidRealTimeModel { FluidKNNClassifier : FluidModelObject {
var <>numNeighbours, <>weight; var <>numNeighbours, <>weight;
@ -8,7 +8,7 @@ FluidKNNClassifier : FluidRealTimeModel {
.weight_(weight); .weight_(weight);
} }
prGetParams{^[this.numNeighbours,this.weight,-1,-1];} prGetParams{^[this.id,this.numNeighbours,this.weight];}
fitMsg{|dataSet, labelSet| fitMsg{|dataSet, labelSet|
^this.prMakeMsg(\fit, id, dataSet.id, labelSet.id) ^this.prMakeMsg(\fit, id, dataSet.id, labelSet.id)
@ -38,7 +38,7 @@ FluidKNNClassifier : FluidRealTimeModel {
} }
kr{|trig, inputBuffer,outputBuffer| kr{|trig, inputBuffer,outputBuffer|
^FluidKNNClassifierQuery.kr(K2A.ar(trig), ^FluidKNNClassifierQuery.kr(trig,
this, this.numNeighbours, this.weight, this, this.numNeighbours, this.weight,
this.prEncodeBuffer(inputBuffer), this.prEncodeBuffer(inputBuffer),
this.prEncodeBuffer(outputBuffer)); this.prEncodeBuffer(outputBuffer));
@ -46,4 +46,17 @@ FluidKNNClassifier : FluidRealTimeModel {
} }
FluidKNNClassifierQuery : FluidRTQuery {} FluidKNNClassifierQuery : FluidRTMultiOutUGen {
*kr{ |trig, model,numNeighbours = 3, weight = 1,inputBuffer, outputBuffer |
^this.multiNew('control',trig, model.asUGenInput,
numNeighbours,weight,
inputBuffer.asUGenInput, outputBuffer.asUGenInput)
}
init { arg ... theInputs;
inputs = theInputs;
^this.initOutputs(1, rate);
}
}

@ -1,4 +1,4 @@
FluidKNNRegressor : FluidRealTimeModel { FluidKNNRegressor : FluidModelObject {
var <>numNeighbours, <>weight; var <>numNeighbours, <>weight;
@ -8,7 +8,7 @@ FluidKNNRegressor : FluidRealTimeModel {
.weight_(weight); .weight_(weight);
} }
prGetParams{^[this.numNeighbours,this.weight,-1,-1];} prGetParams{^[this.id,this.numNeighbours,this.weight,-1,-1];}
fitMsg{|sourceDataSet, targetDataSet| fitMsg{|sourceDataSet, targetDataSet|
^this.prMakeMsg(\fit,this.id,sourceDataSet.id,targetDataSet.id) ^this.prMakeMsg(\fit,this.id,sourceDataSet.id,targetDataSet.id)
@ -45,4 +45,16 @@ FluidKNNRegressor : FluidRealTimeModel {
} }
} }
FluidKNNRegressorQuery : FluidRTQuery {} FluidKNNRegressorQuery : FluidRTMultiOutUGen {
*kr{ |trig, model,numNeighbours = 3, weight = 1,inputBuffer, outputBuffer |
^this.multiNew('control',trig, model.asUGenInput,
numNeighbours,weight,
inputBuffer.asUGenInput, outputBuffer.asUGenInput)
}
init { arg ... theInputs;
inputs = theInputs;
^this.initOutputs(1, rate);
}
}

@ -1,4 +1,4 @@
FluidMLPRegressor : FluidRealTimeModel { FluidMLPRegressor : FluidModelObject {
const <identity = 0; const <identity = 0;
const <sigmoid = 1; const <sigmoid = 1;
@ -23,7 +23,7 @@ FluidMLPRegressor : FluidRealTimeModel {
} }
prGetParams{ prGetParams{
^[this.hidden.size] ++ this.hidden ++ [this.activation, this.outputActivation, this.tapIn, this.tapOut, this.maxIter, this.learnRate, this.momentum, this.batchSize, this.validation, -1, -1] ^[this.id, this.hidden.size] ++ this.hidden ++ [this.activation, this.outputActivation, this.tapIn, this.tapOut, this.maxIter, this.learnRate, this.momentum, this.batchSize, this.validation]
} }
clearMsg{ ^this.prMakeMsg(\clear, id) } clearMsg{ ^this.prMakeMsg(\clear, id) }
@ -72,17 +72,28 @@ FluidMLPRegressor : FluidRealTimeModel {
this.tapIn_(tapIn).tapOut_(tapOut); this.tapIn_(tapIn).tapOut_(tapOut);
params = this.prGetParams.drop(-2) ++ [this.prEncodeBuffer(inputBuffer), params = [this.prEncodeBuffer(inputBuffer),
this.prEncodeBuffer(outputBuffer)]; this.prEncodeBuffer(outputBuffer),this.tapIn,this.tapOut];
^FluidMLPRegressorQuery.kr(K2A.ar(trig),this, *params); ^FluidMLPRegressorQuery.kr(trig,this, *params);
} }
} }
FluidMLPRegressorQuery : FluidRTQuery {} FluidMLPRegressorQuery : FluidRTMultiOutUGen {
*kr{ |trig, model, inputBuffer,outputBuffer, tapIn = 0, tapOut = -1|
^this.multiNew('control',trig, model.asUGenInput,
tapIn, tapOut,
inputBuffer.asUGenInput, outputBuffer.asUGenInput)
}
init { arg ... theInputs;
inputs = theInputs;
^this.initOutputs(1, rate);
}
}
FluidMLPClassifier : FluidRealTimeModel { FluidMLPClassifier : FluidModelObject {
const <identity = 0; const <identity = 0;
const <sigmoid = 1; const <sigmoid = 1;
@ -103,7 +114,7 @@ FluidMLPClassifier : FluidRealTimeModel {
} }
prGetParams{ prGetParams{
^[ this.hidden.size] ++ this.hidden ++ [this.activation, this.maxIter, this.learnRate, this.momentum, this.batchSize, this.validation, -1, -1]; ^[this.id, this.hidden.size] ++ this.hidden ++ [this.activation, this.maxIter, this.learnRate, this.momentum, this.batchSize, this.validation];
} }
clearMsg{ ^this.prMakeMsg(\clear,id) } clearMsg{ ^this.prMakeMsg(\clear,id) }
@ -142,11 +153,21 @@ FluidMLPClassifier : FluidRealTimeModel {
kr{|trig, inputBuffer,outputBuffer| kr{|trig, inputBuffer,outputBuffer|
var params = this.prGetParams.drop(-2) ++ [this.prEncodeBuffer(inputBuffer), var params = [this.prEncodeBuffer(inputBuffer),
this.prEncodeBuffer(outputBuffer)]; this.prEncodeBuffer(outputBuffer)];
^FluidMLPClassifierQuery.kr(K2A.ar(trig),this, *params); ^FluidMLPClassifierQuery.kr(trig,this, *params);
} }
} }
FluidMLPClassifierQuery : FluidRTQuery {} FluidMLPClassifierQuery : FluidRTMultiOutUGen {
*kr{ |trig, model, inputBuffer,outputBuffer|
^this.multiNew('control',trig, model.asUGenInput,
inputBuffer.asUGenInput, outputBuffer.asUGenInput)
}
init { arg ... theInputs;
inputs = theInputs;
^this.initOutputs(1, rate);
}
}

@ -1,4 +1,4 @@
FluidNormalize : FluidRealTimeModel { FluidNormalize : FluidModelObject {
var <>min, <>max, <>invert; var <>min, <>max, <>invert;
@ -8,7 +8,7 @@ FluidNormalize : FluidRealTimeModel {
} }
prGetParams{ prGetParams{
^[this.min,this.max,this.invert,-1,-1]; ^[this.id, this.min,this.max,this.invert,-1,-1];
} }
@ -52,7 +52,7 @@ FluidNormalize : FluidRealTimeModel {
this.prSendMsg(this.transformPointMsg(sourceBuffer, destBuffer)); this.prSendMsg(this.transformPointMsg(sourceBuffer, destBuffer));
} }
kr{|trig, inputBuffer,outputBuffer,min,max,invert| kr{|trig, inputBuffer,outputBuffer,min = 0 ,max = 1,invert = 0|
min = min ? this.min; min = min ? this.min;
max = max ? this.max; max = max ? this.max;
@ -60,11 +60,24 @@ FluidNormalize : FluidRealTimeModel {
this.min_(min).max_(max).invert_(invert); this.min_(min).max_(max).invert_(invert);
^FluidNormalizeQuery.kr( K2A.ar(trig), ^FluidNormalizeQuery.kr(trig,
this, this.min, this.max, this.invert, this.prEncodeBuffer(inputBuffer), this.prEncodeBuffer(outputBuffer)); this, this.prEncodeBuffer(inputBuffer), this.prEncodeBuffer(outputBuffer), this.min, this.max, this.invert);
} }
} }
FluidNormalizeQuery : FluidRTQuery {} FluidNormalizeQuery : FluidRTMultiOutUGen {
*kr{ |trig, model,inputBuffer,outputBuffer,min = 0 ,max = 1,invert = 0|
inputBuffer.asUGenInput.postln;
^this.multiNew('control',trig, model.asUGenInput,
min,max,invert,
inputBuffer.asUGenInput, outputBuffer.asUGenInput)
}
init { arg ... theInputs;
inputs = theInputs;
^this.initOutputs(1, rate);
}
}

@ -1,4 +1,4 @@
FluidPCA : FluidRealTimeModel{ FluidPCA : FluidModelObject{
var <>numDimensions; var <>numDimensions;
@ -7,7 +7,7 @@ FluidPCA : FluidRealTimeModel{
} }
prGetParams{ prGetParams{
^[numDimensions,-1,-1]; ^[this.id, numDimensions];
} }
fitMsg{|dataSet| fitMsg{|dataSet|
@ -55,9 +55,20 @@ FluidPCA : FluidRealTimeModel{
numDimensions = numDimensions ? this.numDimensions; numDimensions = numDimensions ? this.numDimensions;
this.numDimensions_(numDimensions); this.numDimensions_(numDimensions);
^FluidPCAQuery.kr(K2A.ar(trig),this, this.numDimensions, this.prEncodeBuffer(inputBuffer), this.prEncodeBuffer(outputBuffer)); ^FluidPCAQuery.kr(trig ,this, this.prEncodeBuffer(inputBuffer), this.prEncodeBuffer(outputBuffer), this.numDimensions);
} }
} }
FluidPCAQuery : FluidRTQuery {} FluidPCAQuery : FluidRTMultiOutUGen {
*kr{ |trig, model, inputBuffer,outputBuffer,numDimensions|
^this.multiNew('control',trig, model.asUGenInput,
numDimensions,
inputBuffer.asUGenInput, outputBuffer.asUGenInput)
}
init { arg ... theInputs;
inputs = theInputs;
^this.initOutputs(1, rate);
}
}

@ -1,4 +1,4 @@
FluidRobustScale : FluidRealTimeModel { FluidRobustScale : FluidModelObject {
var <>low, <>high, <>invert; var <>low, <>high, <>invert;
@ -8,7 +8,7 @@ FluidRobustScale : FluidRealTimeModel {
} }
prGetParams{ prGetParams{
^[this.low,this.high,this.invert,-1,-1]; ^[this.id,this.low,this.high,this.invert];
} }
@ -52,18 +52,27 @@ FluidRobustScale : FluidRealTimeModel {
this.prSendMsg(this.transformPointMsg(sourceBuffer, destBuffer)); this.prSendMsg(this.transformPointMsg(sourceBuffer, destBuffer));
} }
kr{|trig, inputBuffer,outputBuffer,low,high,invert| kr{|trig, inputBuffer,outputBuffer,invert|
low = low ? this.low;
high = high ? this.high;
invert = invert ? this.invert; invert = invert ? this.invert;
this.low_(low).high_(high).invert_(invert); // this.invert_(invert);
^FluidRobustScaleQuery.kr(K2A.ar(trig),this, this.low, this.high, this.invert, this.prEncodeBuffer(inputBuffer), this.prEncodeBuffer(outputBuffer)); ^FluidRobustScaleQuery.kr(trig,this, this.prEncodeBuffer(inputBuffer), this.prEncodeBuffer(outputBuffer), invert,);
} }
} }
FluidRobustScaleQuery : FluidRTQuery {} FluidRobustScaleQuery : FluidRTMultiOutUGen {
*kr{ |trig, model, inputBuffer,outputBuffer,invert|
^this.multiNew('control',trig, model.asUGenInput,
invert,
inputBuffer.asUGenInput, outputBuffer.asUGenInput)
}
init { arg ... theInputs;
inputs = theInputs;
^this.initOutputs(1, rate);
}
}

@ -1,4 +1,4 @@
FluidStandardize : FluidRealTimeModel { FluidStandardize : FluidModelObject {
var <>invert; var <>invert;
@ -7,7 +7,7 @@ FluidStandardize : FluidRealTimeModel {
} }
prGetParams{ prGetParams{
^[this.invert, -1, 1]; ^[this.id, this.invert];
} }
fitMsg{|dataSet| fitMsg{|dataSet|
@ -52,8 +52,19 @@ FluidStandardize : FluidRealTimeModel {
invert = invert ? this.invert; invert = invert ? this.invert;
this.invert_(invert); this.invert_(invert);
^FluidStandardizeQuery.kr(K2A.ar(trig),this, this.invert, this.prEncodeBuffer(inputBuffer), this.prEncodeBuffer(outputBuffer)); ^FluidStandardizeQuery.kr(trig,this, this.prEncodeBuffer(inputBuffer), this.prEncodeBuffer(outputBuffer), this.invert);
} }
} }
FluidStandardizeQuery : FluidRTQuery {} FluidStandardizeQuery : FluidRTMultiOutUGen {
*kr{ |trig, model,inputBuffer,outputBuffer,invert = 0|
^this.multiNew('control',trig, model.asUGenInput,
invert,
inputBuffer.asUGenInput, outputBuffer.asUGenInput)
}
init { arg ... theInputs;
inputs = theInputs;
^this.initOutputs(1, rate);
}
}

@ -0,0 +1,51 @@
FluidStats : MultiOutUGen {
var <channels;
*kr { arg inputs;
// ^super.new.rate_('control').inputs_(inputs.asArray++0).initOutputs(inputs.asArray.size);
^this.new1('control',inputs);
}
init {arg ...theInputs;
inputs = theInputs ++ 0;
^this.initOutputs(inputs.asArray.size - 1,rate);
}
checkInputs {
/* if(inputs.any.rate != 'control') {
^"input array input is not control rate";
};*/
this.specialIndex = (inputs.size - 2).min(0);
this.specialIndex.postln;
^this.checkValidInputs;
}
initOutputs{|numChans,rate|
if(numChans.isNil or: {numChans < 1})
{
Error("No input channels").throw
};
channels = Array.fill(numChans * 2, { |i|
// Array.fill(numChans,{ |j|
OutputProxy('control',this,i);
});
// });
^channels;
}
// synthIndex_ { arg index;
// synthIndex = index;
// channels.do{
// arg outputGroup;
// outputGroup.do{
// arg output;
// output.synthIndex_(index);
// }
// }
// }
numOutputs { ^(channels.size); }
}

@ -1,4 +1,4 @@
FluidUMAP : FluidRealTimeModel { FluidUMAP : FluidModelObject {
var <>numDimensions, <>numNeighbours, <>minDist, <>iterations, <>learnRate; var <>numDimensions, <>numNeighbours, <>minDist, <>iterations, <>learnRate;
@ -13,12 +13,12 @@ FluidUMAP : FluidRealTimeModel {
prGetParams{ prGetParams{
^[ ^[
this.id,
this.numDimensions, this.numDimensions,
this.numNeighbours, this.numNeighbours,
this.minDist, this.minDist,
this.iterations, this.iterations,
this.learnRate, this.learnRate,
-1,-1
] ]
} }
@ -68,13 +68,8 @@ FluidUMAP : FluidRealTimeModel {
numDimensions = numDimensions ? this.numDimensions; numDimensions = numDimensions ? this.numDimensions;
this.numDimensions_(numDimensions); this.numDimensions_(numDimensions);
^FluidUMAPQuery.kr(K2A.ar(trig), ^FluidUMAPQuery.kr(trig,
this, this,
this.numDimensions,
this.numNeighbours,
this.minDist,
this.iterations,
this.learnRate,
this.prEncodeBuffer(inputBuffer), this.prEncodeBuffer(inputBuffer),
this.prEncodeBuffer(outputBuffer)); this.prEncodeBuffer(outputBuffer));
} }
@ -84,4 +79,14 @@ FluidUMAP : FluidRealTimeModel {
size { |action|} size { |action|}
} }
FluidUMAPQuery : FluidRTQuery {} FluidUMAPQuery : FluidRTMultiOutUGen {
*kr{ |trig, model, inputBuffer,outputBuffer|
^this.multiNew('control',trig, model.asUGenInput,
inputBuffer.asUGenInput, outputBuffer.asUGenInput)
}
init { arg ... theInputs;
inputs = theInputs;
^this.initOutputs(1, rate);
}
}

@ -29,18 +29,43 @@ PluginLoad(FluidSTFTUGen)
makeSCWrapper<NRTThreadedDataSetClient>("FluidDataSet",ft); makeSCWrapper<NRTThreadedDataSetClient>("FluidDataSet",ft);
makeSCWrapper<NRTThreadedDataSetQueryClient>("FluidDataSetQuery",ft); makeSCWrapper<NRTThreadedDataSetQueryClient>("FluidDataSetQuery",ft);
makeSCWrapper<NRTThreadedLabelSetClient>("FluidLabelSet",ft); makeSCWrapper<NRTThreadedLabelSetClient>("FluidLabelSet",ft);
makeSCWrapper<RTKDTreeClient>("FluidKDTree",ft);
makeSCWrapper<RTKMeansClient>("FluidKMeans",ft); makeSCWrapper<NRTThreadedKDTreeClient>("FluidKDTree",ft);
makeSCWrapper<RTKNNClassifierClient>("FluidKNNClassifier",ft); makeSCWrapper<RTKDTreeQueryClient>("FluidKDTreeQuery",ft);
makeSCWrapper<RTKNNRegressorClient>("FluidKNNRegressor",ft);
makeSCWrapper<RTNormalizeClient>("FluidNormalize",ft); makeSCWrapper<NRTThreadedKMeansClient>("FluidKMeans",ft);
makeSCWrapper<RTRobustScaleClient>("FluidRobustScale",ft); makeSCWrapper<RTKMeansQueryClient>("FluidKMeansQuery",ft);
makeSCWrapper<RTStandardizeClient>("FluidStandardize",ft);
makeSCWrapper<RTPCAClient>("FluidPCA",ft); makeSCWrapper<NRTThreadedKNNClassifierClient>("FluidKNNClassifier",ft);
makeSCWrapper<RTKNNClassifierQueryClient>("FluidKNNClassifierQuery",ft);
makeSCWrapper<NRTThreadedKNNRegressorClient>("FluidKNNRegressor",ft);
makeSCWrapper<RTKNNRegressorQueryClient>("FluidKNNRegressorQuery",ft);
makeSCWrapper<NRTThreadedNormalizeClient>("FluidNormalize",ft);
makeSCWrapper<RTNormalizeQueryClient>("FluidNormalizeQuery",ft);
makeSCWrapper<NRTThreadedRobustScaleClient>("FluidRobustScale",ft);
makeSCWrapper<RTRobustScaleQueryClient>("FluidRobustScaleQuery",ft);
makeSCWrapper<NRTThreadedStandardizeClient>("FluidStandardize",ft);
makeSCWrapper<RTStandardizeQueryClient>("FluidStandardizeQuery",ft);
makeSCWrapper<NRTThreadedPCAClient>("FluidPCA",ft);
makeSCWrapper<RTPCAQueryClient>("FluidPCAQuery",ft);
makeSCWrapper<NRTThreadedMDSClient>("FluidMDS",ft); makeSCWrapper<NRTThreadedMDSClient>("FluidMDS",ft);
makeSCWrapper<RTUMAPClient>("FluidUMAP",ft);
makeSCWrapper<NRTThreadedUMAPClient>("FluidUMAP",ft);
makeSCWrapper<RTUMAPQueryClient>("FluidUMAPQuery",ft);
makeSCWrapper<NRTThreadedDataSetWriter>("FluidDataSetWr", ft); makeSCWrapper<NRTThreadedDataSetWriter>("FluidDataSetWr", ft);
makeSCWrapper<RTMLPRegressorClient>("FluidMLPRegressor",ft);
makeSCWrapper<RTMLPClassifierClient>("FluidMLPClassifier",ft); makeSCWrapper<NRTThreadedMLPRegressorClient>("FluidMLPRegressor",ft);
makeSCWrapper<RTMLPRegressorQueryClient>("FluidMLPRegressorQuery",ft);
makeSCWrapper<NRTThreadedMLPClassifierClient>("FluidMLPClassifier",ft);
makeSCWrapper<RTMLPClassifierQueryClient>("FluidMLPClassifierQuery",ft);
makeSCWrapper<NRTThreadedGridClient>("FluidGrid",ft); makeSCWrapper<NRTThreadedGridClient>("FluidGrid",ft);
} }

@ -0,0 +1,22 @@
# Part of the Fluid Corpus Manipulation Project (http://www.flucoma.org/)
# Copyright 2017-2019 University of Huddersfield.
# Licensed under the BSD-3 License.
# See license.md file in the project root for full license information.
# This project has received funding from the European Research Council (ERC)
# under the European Unions Horizon 2020 research and innovation programme
# (grant agreement No 725899).
cmake_minimum_required(VERSION 3.11)
get_filename_component(PLUGIN ${CMAKE_CURRENT_LIST_DIR} NAME_WE)
message("Configuring ${PLUGIN}")
set(FILENAME ${PLUGIN}.cpp)
add_library(
${PLUGIN}
MODULE
${FILENAME}
)
include(${CMAKE_CURRENT_LIST_DIR}/../../scripts/target_post.cmake)

@ -0,0 +1,22 @@
/*
Part of the Fluid Corpus Manipulation Project (http://www.flucoma.org/)
Copyright 2017-2019 University of Huddersfield.
Licensed under the BSD-3 License.
See license.md file in the project root for full license information.
This project has received funding from the European Research Council (ERC)
under the European Unions Horizon 2020 research and innovation programme
(grant agreement No 725899).
*/
#include <clients/rt/RunningStatsClient.hpp>
#include <FluidSCWrapper.hpp>
static InterfaceTable *ft;
PluginLoad(FluidStatsUGen)
{
ft = inTable;
using namespace fluid::client;
makeSCWrapper<RunningStatsClient>("FluidStats", ft);
}
Loading…
Cancel
Save