FluidPCA : FluidModelObject{ var <>numDimensions; *new {|server, numDimensions = 2| ^super.new(server,[numDimensions]).numDimensions_(numDimensions); } prGetParams{ ^[this.id, numDimensions]; } fitMsg{|dataSet| ^this.prMakeMsg(\fit,id, dataSet.id); } fit{|dataSet, action| actions[\fit] = [nil, action]; this.prSendMsg(this.fitMsg(dataSet)); } transformMsg{|sourceDataSet, destDataSet| ^this.prMakeMsg(\transform, id, sourceDataSet.id, destDataSet.id); } transform{|sourceDataSet, destDataSet, action| actions[\transform] = [numbers(FluidMessageResponse,_,1,_),action]; this.prSendMsg(this.transformMsg(sourceDataSet,destDataSet)); } fitTransformMsg{|sourceDataSet, destDataSet| ^this.prMakeMsg(\fitTransform,id, sourceDataSet.id, destDataSet.id); } fitTransform{|sourceDataSet, destDataSet, action| actions[\fitTransform] = [numbers(FluidMessageResponse,_,1,_),action]; this.prSendMsg(this.fitTransformMsg(sourceDataSet,destDataSet)); } transformPointMsg{|sourceBuffer, destBuffer| ^this.prMakeMsg(\transformPoint,id, this.prEncodeBuffer(sourceBuffer), this.prEncodeBuffer(destBuffer), ["/b_query",destBuffer.asUGenInput] ); } transformPoint{|sourceBuffer, destBuffer, action| actions[\transformPoint] = [nil,{action.value(destBuffer)}]; this.prSendMsg(this.transformPointMsg(sourceBuffer,destBuffer)); } kr{|trig, inputBuffer,outputBuffer,numDimensions| numDimensions = numDimensions ? this.numDimensions; this.numDimensions_(numDimensions); ^FluidPCAQuery.kr(trig ,this, this.prEncodeBuffer(inputBuffer), this.prEncodeBuffer(outputBuffer), this.numDimensions); } } 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); } }