diff --git a/.github/workflows/nightly.yaml b/.github/workflows/nightly.yaml index a9a8d24..b6ff34b 100644 --- a/.github/workflows/nightly.yaml +++ b/.github/workflows/nightly.yaml @@ -60,7 +60,7 @@ jobs: linuxbuild: - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v3 - uses: flucoma/actions/env@main @@ -77,7 +77,7 @@ jobs: path: install/FluCoMa-SC-Linux-nightly.tar.gz release: - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 needs: [macbuild, winbuild, linuxbuild] steps: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c54d4d4..3b55f1a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -53,7 +53,7 @@ jobs: path: install/FluCoMa-SC-Windows.zip linuxbuild: - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 outputs: version: ${{ steps.get-version.outputs.version }} steps: @@ -77,7 +77,7 @@ jobs: working-directory: build/_deps/flucoma-core-src release: - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 needs: [macbuild, winbuild, linuxbuild] steps: diff --git a/include/FluidSCWrapper.hpp b/include/FluidSCWrapper.hpp index ac4ae03..0a82411 100644 --- a/include/FluidSCWrapper.hpp +++ b/include/FluidSCWrapper.hpp @@ -85,8 +85,9 @@ public: using Reportage = decltype(static_cast(x)->mReportage); Reportage* reportage = initialized ? &(static_cast(x)->mReportage) : new Reportage(); - - p.template setParameterValuesRT(verbose ? reportage: nullptr , x, inputs, alloc); + + p.template setParameterValuesRT( + verbose ? reportage : nullptr, x, inputs, p, alloc); if (constrain) p.constrainParameterValuesRT(verbose ? reportage : nullptr); if(verbose) { diff --git a/include/wrapper/ArgsFromClient.hpp b/include/wrapper/ArgsFromClient.hpp index 30a80ad..5a8b898 100644 --- a/include/wrapper/ArgsFromClient.hpp +++ b/include/wrapper/ArgsFromClient.hpp @@ -126,12 +126,13 @@ struct ParamReader auto id = fromArgs(x, args, index{}, 0); return {id >= 0 ? std::to_string(id).c_str() : "" }; } - - static auto fromArgs(Unit*,Controls& args,typename LongRuntimeMaxT::type&, int) + + static auto fromArgs(Unit*, Controls& args, typename LongRuntimeMaxT::type&, + int) { - return typename LongRuntimeMaxT::type{static_cast(args.next()), static_cast(args.next())}; + return typename LongRuntimeMaxT::type{static_cast(args.next()), + static_cast(args.next())}; } - }; // NRT case: we're decoding data from sc_msg_iter*, there will be a World*, we can't have LocalBufs @@ -329,11 +330,13 @@ struct ClientParams{ /// Grizzly enable_if hackage coming up. Need to brute force an int from incoming data into a string param for FluidDataSet / FluidLabelSet. - /// This will go away one day + /// This will go away one day - template - std::enable_if_t || Number!=0, typename T::type> - operator()(Context* x, ArgType& args, Allocator& alloc) + template + std::enable_if_t || Number != 0, + typename T::type> + operator()(Context* x, ArgType& args, Params& p, Allocator& alloc) { // Just return default if there's nothing left to grab if (args.remain() == 0) @@ -351,12 +354,25 @@ struct ClientParams{ a[i] = static_cast( ParamReader::fromArgs(x, args, a[0], 0)); - return a.value(); + /// He said "I don't like it, but I have to go along with it" + /// Make sure that the maximum for LongRuntimeMax params is + /// properly constrained *as soon as possible* + if constexpr (std::is_same_v) + { + auto param = a.value(); + index maximum = param.maxRaw(); + maximum = p.template applyConstraintToMax(maximum); + return LongRuntimeMaxParam(param(), maximum); + } + else + return a.value(); } - - template - std::enable_if_t && Number==0, typename T::type> - operator()(Context* x, ArgType& args, Allocator& alloc) + + template + std::enable_if_t && Number == 0, + typename T::type> + operator()(Context* x, ArgType& args, Params&, Allocator& alloc) { // Just return default if there's nothing left to grab if (args.remain() == 0) diff --git a/include/wrapper/NonRealtime.hpp b/include/wrapper/NonRealtime.hpp index 60a6b69..f427f5d 100644 --- a/include/wrapper/NonRealtime.hpp +++ b/include/wrapper/NonRealtime.hpp @@ -272,8 +272,8 @@ private: : NRTCommand{world, args, replyAddr, !IsNamedShared_v}, mParams{Client::getParameterDescriptors(), NRTCommand::allocator()} { - mParams.template setParameterValuesRT(nullptr, world, - *args, NRTCommand::allocator()); + mParams.template setParameterValuesRT( + nullptr, world, *args, mParams, NRTCommand::allocator()); } CommandNew(index id, World* world, FloatControlsIter& args, Unit* x) @@ -281,7 +281,7 @@ private: NRTCommand::allocator()} { mParams.template setParameterValuesRT( - nullptr, x, args, NRTCommand::allocator()); + nullptr, x, args, mParams, NRTCommand::allocator()); } static const char* name() @@ -364,8 +364,8 @@ private: if (auto ptr = get(NRTCommand::mID).lock()) { ptr->mDone.store(false, std::memory_order_release); - mParams.template setParameterValuesRT(nullptr, world, - ar, NRTCommand::allocator()); + mParams.template setParameterValuesRT( + nullptr, world, ar, mParams, NRTCommand::allocator()); mSynchronous = static_cast(ar.geti()); } // if this fails, we'll hear about it in stage2 anyway } @@ -716,7 +716,7 @@ private: if (auto ptr = get(NRTCommand::mID).lock()) { ptr->mParams.template setParameterValuesRT( - nullptr, world, ar, NRTCommand::allocator()); + nullptr, world, ar, ptr->mParams, NRTCommand::allocator()); Result result = validateParameters(ptr->mParams); ptr->mClient.setParams(ptr->mParams); } @@ -747,7 +747,7 @@ private: if (auto ptr = get(NRTCommand::mID).lock()) { ptr->mParams.template setParameterValues( - true, world, mArgs, FluidDefaultAllocator()); + true, world, mArgs, ptr->mParams, FluidDefaultAllocator()); Result result = validateParameters(ptr->mParams); ptr->mClient.setParams(ptr->mParams); } diff --git a/release-packaging/Classes/FluidBufSines.sc b/release-packaging/Classes/FluidBufSines.sc index 9fa48e1..74adc7a 100644 --- a/release-packaging/Classes/FluidBufSines.sc +++ b/release-packaging/Classes/FluidBufSines.sc @@ -1,6 +1,6 @@ FluidBufSines : FluidBufProcessor { - *kr { |source, startFrame = 0, numFrames = -1, startChan = 0, numChans = -1, sines = -1, residual = -1, bandwidth = 76, detectionThreshold = -96, birthLowThreshold = -24, birthHighThreshold = -60, minTrackLen = 15, trackingMethod = 0, trackMagRange = 15, trackFreqRange = 50, trackProb = 0.5, windowSize = 1024, hopSize = -1, fftSize = -1, trig = 1, blocking = 0| + *kr { |source, startFrame = 0, numFrames = -1, startChan = 0, numChans = -1, sines = -1, residual = -1, bandwidth = 76, detectionThreshold = -96, birthLowThreshold = -24, birthHighThreshold = -60, minTrackLen = 15, trackMethod = 0, trackMagRange = 15, trackFreqRange = 50, trackProb = 0.5, windowSize = 1024, hopSize = -1, fftSize = -1, trig = 1, blocking = 0| var maxFFTSize = if (fftSize == -1) {windowSize.nextPowerOfTwo} {fftSize}; @@ -10,10 +10,10 @@ FluidBufSines : FluidBufProcessor { source.isNil.if {"FluidBufSines: Invalid source buffer".throw}; - ^FluidProxyUgen.multiNew(\FluidBufSinesTrigger, -1, source, startFrame, numFrames, startChan, numChans, sines, residual, bandwidth, detectionThreshold,birthLowThreshold, birthHighThreshold, minTrackLen, trackingMethod, trackMagRange, trackFreqRange, trackProb, windowSize, hopSize, fftSize, maxFFTSize, trig, blocking); + ^FluidProxyUgen.multiNew(\FluidBufSinesTrigger, -1, source, startFrame, numFrames, startChan, numChans, sines, residual, bandwidth, detectionThreshold,birthLowThreshold, birthHighThreshold, minTrackLen, trackMethod, trackMagRange, trackFreqRange, trackProb, windowSize, hopSize, fftSize, maxFFTSize, trig, blocking); } - *process { |server, source, startFrame = 0, numFrames = -1, startChan = 0, numChans = -1, sines = -1, residual = -1, bandwidth = 76, detectionThreshold = -96, birthLowThreshold = -24, birthHighThreshold = -60, minTrackLen = 15, trackingMethod = 0, trackMagRange = 15, trackFreqRange = 50, trackProb = 0.5, windowSize = 1024, hopSize = -1, fftSize = -1, freeWhenDone = true, action| + *process { |server, source, startFrame = 0, numFrames = -1, startChan = 0, numChans = -1, sines = -1, residual = -1, bandwidth = 76, detectionThreshold = -96, birthLowThreshold = -24, birthHighThreshold = -60, minTrackLen = 15, trackMethod = 0, trackMagRange = 15, trackFreqRange = 50, trackProb = 0.5, windowSize = 1024, hopSize = -1, fftSize = -1, freeWhenDone = true, action| var maxFFTSize = if (fftSize == -1) {windowSize.nextPowerOfTwo} {fftSize}; @@ -26,11 +26,11 @@ FluidBufSines : FluidBufProcessor { ^this.new( server, nil, [sines, residual].select{|x| x!= -1} ).processList( - [source, startFrame, numFrames, startChan, numChans, sines, residual, bandwidth, detectionThreshold,birthLowThreshold, birthHighThreshold, minTrackLen, trackingMethod, trackMagRange, trackFreqRange, trackProb, windowSize, hopSize, fftSize,maxFFTSize,0],freeWhenDone = true,action + [source, startFrame, numFrames, startChan, numChans, sines, residual, bandwidth, detectionThreshold,birthLowThreshold, birthHighThreshold, minTrackLen, trackMethod, trackMagRange, trackFreqRange, trackProb, windowSize, hopSize, fftSize,maxFFTSize,0],freeWhenDone = true,action ); } - *processBlocking { |server, source, startFrame = 0, numFrames = -1, startChan = 0, numChans = -1, sines = -1, residual = -1, bandwidth = 76, detectionThreshold = -96, birthLowThreshold = -24, birthHighThreshold = -60, minTrackLen = 15, trackingMethod = 0, trackMagRange = 15, trackFreqRange = 50, trackProb = 0.5, windowSize = 1024, hopSize = -1, fftSize = -1, freeWhenDone = true, action| + *processBlocking { |server, source, startFrame = 0, numFrames = -1, startChan = 0, numChans = -1, sines = -1, residual = -1, bandwidth = 76, detectionThreshold = -96, birthLowThreshold = -24, birthHighThreshold = -60, minTrackLen = 15, trackMethod = 0, trackMagRange = 15, trackFreqRange = 50, trackProb = 0.5, windowSize = 1024, hopSize = -1, fftSize = -1, freeWhenDone = true, action| var maxFFTSize = if (fftSize == -1) {windowSize.nextPowerOfTwo} {fftSize}; @@ -43,7 +43,7 @@ FluidBufSines : FluidBufProcessor { ^this.new( server, nil, [sines, residual].select{|x| x!= -1} ).processList( - [source, startFrame, numFrames, startChan, numChans, sines, residual, bandwidth, detectionThreshold,birthLowThreshold, birthHighThreshold, minTrackLen, trackingMethod, trackMagRange, trackFreqRange, trackProb, windowSize, hopSize, fftSize,maxFFTSize,1],freeWhenDone,action + [source, startFrame, numFrames, startChan, numChans, sines, residual, bandwidth, detectionThreshold,birthLowThreshold, birthHighThreshold, minTrackLen, trackMethod, trackMagRange, trackFreqRange, trackProb, windowSize, hopSize, fftSize,maxFFTSize,1],freeWhenDone,action ); } diff --git a/release-packaging/Classes/FluidDataSet.sc b/release-packaging/Classes/FluidDataSet.sc index d7bd7d9..4ce9347 100644 --- a/release-packaging/Classes/FluidDataSet.sc +++ b/release-packaging/Classes/FluidDataSet.sc @@ -101,4 +101,13 @@ FluidDataSet : FluidDataObject actions[\getIds] = [nil,action]; this.prSendMsg(this.getIdsMsg(labelSet)); } + + kNearestMsg{|buffer,k| + ^this.prMakeMsg(\kNearest,id, this.prEncodeBuffer(buffer),k); + } + + kNearest{ |buffer, k, action| + actions[\kNearest] = [strings(FluidMessageResponse,_,_),action]; + this.prSendMsg(this.kNearestMsg(buffer,k)); + } } diff --git a/release-packaging/Classes/FluidKDTree.sc b/release-packaging/Classes/FluidKDTree.sc index 2f688a7..f850d7f 100644 --- a/release-packaging/Classes/FluidKDTree.sc +++ b/release-packaging/Classes/FluidKDTree.sc @@ -36,13 +36,16 @@ FluidKDTree : FluidModelObject this.prSendMsg(this.kNearestMsg(buffer,k)); } - kNearestDistMsg {|buffer| - ^this.prMakeMsg(\kNearestDist,id,this.prEncodeBuffer(buffer)); + kNearestDistMsg {|buffer, k| + k !? + {^this.prMakeMsg(\kNearestDist,id,this.prEncodeBuffer(buffer),k);} + ?? + {^this.prMakeMsg(\kNearestDist,id,this.prEncodeBuffer(buffer));} } - kNearestDist { |buffer, action| + kNearestDist { |buffer, k, action| actions[\kNearestDist] = [numbers(FluidMessageResponse,_,nil,_),action]; - this.prSendMsg(this.kNearestDistMsg(buffer)); + this.prSendMsg(this.kNearestDistMsg(buffer,k)); } kr{|trig, inputBuffer,outputBuffer, numNeighbours = 1, lookupDataSet| diff --git a/release-packaging/Classes/FluidSines.sc b/release-packaging/Classes/FluidSines.sc index 3da4a44..2c96044 100755 --- a/release-packaging/Classes/FluidSines.sc +++ b/release-packaging/Classes/FluidSines.sc @@ -1,6 +1,6 @@ FluidSines : FluidRTMultiOutUGen { - *ar { arg in = 0, bandwidth = 76, detectionThreshold = -96, birthLowThreshold = -24, birthHighThreshold = -60, minTrackLen = 15, trackingMethod = 0, trackMagRange = 15, trackFreqRange = 50, trackProb = 0.5, windowSize= 1024, hopSize= -1, fftSize= -1, maxFFTSize = -1; - ^this.multiNew('audio', in.asAudioRateInput(this), bandwidth, detectionThreshold,birthLowThreshold, birthHighThreshold, minTrackLen, trackingMethod, trackMagRange, trackFreqRange, trackProb, windowSize, hopSize, fftSize, maxFFTSize) + *ar { arg in = 0, bandwidth = 76, detectionThreshold = -96, birthLowThreshold = -24, birthHighThreshold = -60, minTrackLen = 15, trackMethod = 0, trackMagRange = 15, trackFreqRange = 50, trackProb = 0.5, windowSize= 1024, hopSize= -1, fftSize= -1, maxFFTSize = -1; + ^this.multiNew('audio', in.asAudioRateInput(this), bandwidth, detectionThreshold,birthLowThreshold, birthHighThreshold, minTrackLen, trackMethod, trackMagRange, trackFreqRange, trackProb, windowSize, hopSize, fftSize, maxFFTSize) } init { arg ... theInputs; inputs = theInputs;