From dc3157c5ebdd8da8ab22fb886b5e06ff7444d635 Mon Sep 17 00:00:00 2001 From: Pierre Alexandre Tremblay Date: Mon, 21 Dec 2020 15:57:45 +0000 Subject: [PATCH] UMAP: added KR and example testing --- release-packaging/Classes/FluidUMAP.sc | 21 ++++++++++-- .../HelpSource/Classes/FluidUMAP.schelp | 34 +++++++++++++++---- src/FluidManipulation/FluidManipulation.cpp | 2 +- 3 files changed, 47 insertions(+), 10 deletions(-) diff --git a/release-packaging/Classes/FluidUMAP.sc b/release-packaging/Classes/FluidUMAP.sc index 48a9cbb..9a2835d 100644 --- a/release-packaging/Classes/FluidUMAP.sc +++ b/release-packaging/Classes/FluidUMAP.sc @@ -1,4 +1,4 @@ -FluidUMAP : FluidModelObject { +FluidUMAP : FluidRealTimeModel { var <>numDimensions, <>numNeighbours, <>minDist, <>iterations, <>learnRate; @@ -17,7 +17,8 @@ FluidUMAP : FluidModelObject { this.numNeighbours, this.minDist, this.iterations, - this.learnRate + this.learnRate, + -1,-1 ] } @@ -62,6 +63,22 @@ FluidUMAP : FluidModelObject { this.prSendMsg(this.transformPointMsg(sourceBuffer,destBuffer)); } + kr{|trig, inputBuffer,outputBuffer,numDimensions| + + numDimensions = numDimensions ? this.numDimensions; + this.numDimensions_(numDimensions); + + ^FluidProxyUgen.kr(this.class.name.asString++'/query', K2A.ar(trig), + id, + this.numDimensions, + this.numNeighbours, + this.minDist, + this.iterations, + this.learnRate, + this.prEncodeBuffer(inputBuffer), + this.prEncodeBuffer(outputBuffer)); + } + // not implemented cols {|action|} size { |action|} diff --git a/release-packaging/HelpSource/Classes/FluidUMAP.schelp b/release-packaging/HelpSource/Classes/FluidUMAP.schelp index 699bf22..16774e0 100644 --- a/release-packaging/HelpSource/Classes/FluidUMAP.schelp +++ b/release-packaging/HelpSource/Classes/FluidUMAP.schelp @@ -190,8 +190,8 @@ w.front; ~normalized.dump{|x| ~normalizedDict = x["data"]; { - t = Window("old material", Rect(728, 64, 200, 200)); - t.drawFunc = { + z = Window("old material", Rect(728, 64, 200, 200)); + z.drawFunc = { Pen.use { ~normalizedDict.keysValuesDo{|key, val| Pen.fillColor = Color.new(~colours[key.asSymbol][0], ~colours[key.asSymbol][1],~colours[key.asSymbol][2]); @@ -200,8 +200,8 @@ w.front; }; }; }; - t.refresh; - t.front; + z.refresh; + z.front; }.defer; }; }); @@ -218,15 +218,35 @@ w.front; ) //retrieve the 3D original -~raw.getPoint("entry50",~sourcePoint) +~raw.getPoint("entry49",~sourcePoint) //retrieve the fitTransformed point as the most accurate point -~reduced.getPoint("entry50",~original, {~original.getn(0,2,{|x|x.postln})}) +~reduced.getPoint("entry49",~original, {~original.getn(0,2,{|x|x.postln})}) //retreive the transformed point, via the standardizer ~standardizer.transformPoint(~sourcePoint,~standed); ~umap.transformPoint(~standed, ~umaped, {~umaped.getn(0,2,{|x|x.postln})}) - //poking at the data structure within ~umap.dump{|x|x.keys.do{|i|"%: %\n".postf(i,x[i]);}} +// one can also retrieve in control rate with Server Side Queries +// Let's map our learned UMAP dimensions to the controls of a processor + +( +{ + var trig = Impulse.kr(1); + var point = WhiteNoise.kr(1.dup(3)); + var inputPoint = LocalBuf(3); + var standPoint = LocalBuf(3); + var outputPoint = LocalBuf(2); + var cue1, cue2; + Poll.kr(trig, point, [\pointX,\pointY,\pointZ]); + point.collect{ |p,i| BufWr.kr([p],inputPoint,i)}; + cue1 = ~standardizer.kr(trig,inputPoint,standPoint); + Poll.kr(cue1,BufRd.kr(1,standPoint,(0..2),interpolation:0),[\stdX,\stdY, \stdZ]); + cue2 = ~umap.kr(cue1, standPoint, outputPoint); + Poll.kr(cue2,BufRd.kr(1,outputPoint,[0,1],interpolation:0),[\newDimA,\newDimB]); + Silent.ar; +}.play; +) + :: diff --git a/src/FluidManipulation/FluidManipulation.cpp b/src/FluidManipulation/FluidManipulation.cpp index 7b23652..9442611 100644 --- a/src/FluidManipulation/FluidManipulation.cpp +++ b/src/FluidManipulation/FluidManipulation.cpp @@ -38,7 +38,7 @@ PluginLoad(FluidSTFTUGen) makeSCWrapper("FluidStandardize",ft); makeSCWrapper("FluidPCA",ft); makeSCWrapper("FluidMDS",ft); - makeSCWrapper("FluidUMAP",ft); + makeSCWrapper("FluidUMAP",ft); makeSCWrapper("FluidAudioTransport",ft); makeSCWrapper("FluidBufAudioTransp",ft); makeSCWrapper("FluidDataSetWr", ft);