From 536215d99d66df7156eeef375a89959313c674f4 Mon Sep 17 00:00:00 2001 From: tremblap Date: Tue, 27 Aug 2024 16:27:11 +0100 Subject: [PATCH] clang_formatted --- include/algorithms/public/VoiceAllocator.hpp | 89 +++++++++-------- include/algorithms/util/PartialTracking.hpp | 59 ++++++------ .../clients/common/FluidNRTClientWrapper.hpp | 90 +++++++++--------- include/clients/rt/VoiceAllocatorClient.hpp | 95 +++++++++++-------- 4 files changed, 179 insertions(+), 154 deletions(-) diff --git a/include/algorithms/public/VoiceAllocator.hpp b/include/algorithms/public/VoiceAllocator.hpp index 21f3eb8f9..93c99b98b 100644 --- a/include/algorithms/public/VoiceAllocator.hpp +++ b/include/algorithms/public/VoiceAllocator.hpp @@ -22,9 +22,8 @@ class VoiceAllocator public: VoiceAllocator(index nVoices, Allocator& alloc) - : mTracking(alloc), mVoices{ nVoices }, - mFreeVoices(alloc), mActiveVoices(alloc), - mActiveVoiceData(0, alloc) + : mTracking(alloc), mVoices{nVoices}, mFreeVoices(alloc), + mActiveVoices(alloc), mActiveVoiceData(0, alloc) {} void init(index nVoices, Allocator& alloc) @@ -34,12 +33,17 @@ class VoiceAllocator while (!mFreeVoices.empty()) { mFreeVoices.pop(); } for (index i = 0; i < nVoices; ++i) { mFreeVoices.push(i); } mActiveVoiceData.resize(nVoices); - for (VoicePeak each : mActiveVoiceData) { each = { 0, 0, 0 }; } + for (VoicePeak each : mActiveVoiceData) { each = {0, 0, 0}; } mTracking.init(); mInitialized = true; } - void processFrame(vector incomingVoices, vector& outgoingVoices, index minTrackLen, double birthLowTreshold, double birthHighTreshold, index trackMethod, double trackMagRange, double trackFreqRange, double trackProb, index sortMethod, Allocator& alloc) + void processFrame(vector incomingVoices, + vector& outgoingVoices, index minTrackLen, + double birthLowTreshold, double birthHighTreshold, + index trackMethod, double trackMagRange, + double trackFreqRange, double trackProb, index sortMethod, + Allocator& alloc) { assert(mInitialized); @@ -49,100 +53,111 @@ class VoiceAllocator if (voice.logMag > maxAmp) { maxAmp = voice.logMag; } } - mTracking.processFrame(incomingVoices, maxAmp, minTrackLen, birthLowTreshold, birthHighTreshold, trackMethod, trackMagRange, trackFreqRange, trackProb, alloc); + mTracking.processFrame(incomingVoices, maxAmp, minTrackLen, + birthLowTreshold, birthHighTreshold, trackMethod, + trackMagRange, trackFreqRange, trackProb, alloc); outgoingVoices = mTracking.getActiveVoices(alloc); outgoingVoices = sortVoices(outgoingVoices, sortMethod); - if (outgoingVoices.size() > mVoices) - outgoingVoices.resize(mVoices); + if (outgoingVoices.size() > mVoices) outgoingVoices.resize(mVoices); outgoingVoices = assignVoices(outgoingVoices, alloc); mTracking.prune(); } - void reset() {mInitialized = false;} + void reset() { mInitialized = false; } bool initialized() const { return mInitialized; } private: - - vector sortVoices(vector& incomingVoices, index sortingMethod) + vector sortVoices(vector& incomingVoices, + index sortingMethod) { switch (sortingMethod) { - case 0: //lowest + case 0: // lowest std::sort(incomingVoices.begin(), incomingVoices.end(), - [](const VoicePeak& voice1, const VoicePeak& voice2) - { return voice1.freq < voice2.freq; }); + [](const VoicePeak& voice1, const VoicePeak& voice2) { + return voice1.freq < voice2.freq; + }); break; - case 1: //loudest + case 1: // loudest std::sort(incomingVoices.begin(), incomingVoices.end(), - [](const VoicePeak& voice1, const VoicePeak& voice2) - { return voice1.logMag > voice2.logMag; }); + [](const VoicePeak& voice1, const VoicePeak& voice2) { + return voice1.logMag > voice2.logMag; + }); break; } return incomingVoices; } - vector assignVoices(vector& incomingVoices, Allocator& alloc) + vector assignVoices(vector& incomingVoices, + Allocator& alloc) { - //move released to free + // move released to free for (index existing = 0; existing < mActiveVoiceData.size(); ++existing) { - if (mActiveVoiceData[existing].state == algorithm::VoiceState::kReleaseState) + if (mActiveVoiceData[existing].state == + algorithm::VoiceState::kReleaseState) mActiveVoiceData[existing].state = algorithm::VoiceState::kFreeState; } - //handle existing voices - killing or sustaining + // handle existing voices - killing or sustaining for (index existing = 0; existing < mActiveVoices.size(); ++existing) { bool killVoice = true; for (index incoming = 0; incoming < incomingVoices.size(); ++incoming) { - //remove incoming voice events & allows corresponding voice to live if it already exists - if (mActiveVoiceData[mActiveVoices[existing]].voiceID == incomingVoices[incoming].voiceID) + // remove incoming voice events & allows corresponding voice to live if + // it already exists + if (mActiveVoiceData[mActiveVoices[existing]].voiceID == + incomingVoices[incoming].voiceID) { killVoice = false; - mActiveVoiceData[mActiveVoices[existing]] = incomingVoices[incoming]; //update freq/mag - mActiveVoiceData[mActiveVoices[existing]].state = algorithm::VoiceState::kSustainState; + mActiveVoiceData[mActiveVoices[existing]] = + incomingVoices[incoming]; // update freq/mag + mActiveVoiceData[mActiveVoices[existing]].state = + algorithm::VoiceState::kSustainState; incomingVoices.erase(incomingVoices.begin() + incoming); break; } } - if (killVoice) //voice off + if (killVoice) // voice off { - mActiveVoiceData[mActiveVoices[existing]].state = algorithm::VoiceState::kReleaseState; + mActiveVoiceData[mActiveVoices[existing]].state = + algorithm::VoiceState::kReleaseState; mFreeVoices.push(mActiveVoices[existing]); mActiveVoices.erase(mActiveVoices.begin() + existing); --existing; } } - //handle new voice allocation + // handle new voice allocation for (index incoming = 0; incoming < incomingVoices.size(); ++incoming) { - if (!mFreeVoices.empty()) //voice on + if (!mFreeVoices.empty()) // voice on { index newVoiceIndex = mFreeVoices.front(); mFreeVoices.pop(); mActiveVoices.push_back(newVoiceIndex); algorithm::VoiceState prevState = mActiveVoiceData[newVoiceIndex].state; mActiveVoiceData[newVoiceIndex] = incomingVoices[incoming]; - if (prevState == algorithm::VoiceState::kReleaseState) //mark as stolen - mActiveVoiceData[newVoiceIndex].state = algorithm::VoiceState::kStolenState; + if (prevState == algorithm::VoiceState::kReleaseState) // mark as stolen + mActiveVoiceData[newVoiceIndex].state = + algorithm::VoiceState::kStolenState; } } return mActiveVoiceData; } - PartialTracking mTracking; - index mVoices; - rt::queue mFreeVoices; - rt::deque mActiveVoices; - vector mActiveVoiceData; + PartialTracking mTracking; + index mVoices; + rt::queue mFreeVoices; + rt::deque mActiveVoices; + vector mActiveVoiceData; - bool mInitialized{ false }; + bool mInitialized{false}; }; } // namespace algorithm } // namespace fluid diff --git a/include/algorithms/util/PartialTracking.hpp b/include/algorithms/util/PartialTracking.hpp index 4e3228e54..6ccfb3fa7 100644 --- a/include/algorithms/util/PartialTracking.hpp +++ b/include/algorithms/util/PartialTracking.hpp @@ -25,13 +25,12 @@ Capability through Linear Programming". Proceedings of DAFx-2018. namespace fluid { namespace algorithm { -enum class VoiceState -{ - kFreeState, - kAttackState, - kSustainState, - kReleaseState, - kStolenState +enum class VoiceState { + kFreeState, + kAttackState, + kSustainState, + kReleaseState, + kStolenState }; struct SinePeak @@ -43,10 +42,10 @@ struct SinePeak struct VoicePeak { - double freq; - double logMag; - index voiceID; - VoiceState state; + double freq; + double logMag; + index voiceID; + VoiceState state; }; struct SineTrack @@ -56,8 +55,8 @@ struct SineTrack SineTrack(rt::vector&& p, index s, index e, bool a, bool ass, index t) - : peaks{p}, startFrame{s}, endFrame{e}, active{a}, assigned{ass}, trackId{ - t} + : peaks{p}, startFrame{s}, endFrame{e}, active{a}, assigned{ass}, + trackId{t} {} rt::vector peaks; @@ -154,22 +153,24 @@ class PartialTracking // todo - refactor this function with the one above vector getActiveVoices(Allocator& alloc) { - vector voicePeaks(0, alloc); - index latencyFrame = mCurrentFrame - mMinTrackLength; - if (latencyFrame < 0) return voicePeaks; - for (auto&& track : mTracks) - { - if (track.startFrame > latencyFrame) continue; - if (track.endFrame >= 0 && track.endFrame <= latencyFrame) continue; - if (track.endFrame >= 0 && - track.endFrame - track.startFrame < mMinTrackLength) - continue; - voicePeaks.push_back({track.peaks[asUnsigned(latencyFrame - track.startFrame)].freq, - pow(10, track.peaks[asUnsigned(latencyFrame - track.startFrame)].logMag / 20), - track.trackId, - VoiceState::kAttackState}); - } - return voicePeaks; + vector voicePeaks(0, alloc); + index latencyFrame = mCurrentFrame - mMinTrackLength; + if (latencyFrame < 0) return voicePeaks; + for (auto&& track : mTracks) + { + if (track.startFrame > latencyFrame) continue; + if (track.endFrame >= 0 && track.endFrame <= latencyFrame) continue; + if (track.endFrame >= 0 && + track.endFrame - track.startFrame < mMinTrackLength) + continue; + voicePeaks.push_back( + {track.peaks[asUnsigned(latencyFrame - track.startFrame)].freq, + pow(10, + track.peaks[asUnsigned(latencyFrame - track.startFrame)].logMag / + 20), + track.trackId, VoiceState::kAttackState}); + } + return voicePeaks; } private: diff --git a/include/clients/common/FluidNRTClientWrapper.hpp b/include/clients/common/FluidNRTClientWrapper.hpp index d27b2cadc..3eefd870b 100644 --- a/include/clients/common/FluidNRTClientWrapper.hpp +++ b/include/clients/common/FluidNRTClientWrapper.hpp @@ -141,8 +141,9 @@ struct AddPadding static constexpr size_t value = HasFFT && HasControlOut ? 2 : HasFFT && !HasControlOut ? 1 - : !HasFFT && HasControlOut && !HasControlIn ? 3 - : 0; + : !HasFFT && HasControlOut && !HasControlIn + ? 3 + : 0; // static constexpr size_t value = std::conditional_t, StreamingControl>(); - + using ParamDescType = ParamType; using ParamSetType = ParameterSet; using ParamSetViewType = ParameterSetView; @@ -230,8 +231,8 @@ class NRTClientWrapper : public OfflineIn, public OfflineOut NRTClientWrapper(NRTClientWrapper&& x) - : mParams{std::move(x.mParams)}, - mNRTContext{std::move(x.mNRTContext)}, mClient{std::move(x.mClient)} + : mParams{std::move(x.mParams)}, mNRTContext{std::move(x.mNRTContext)}, + mClient{std::move(x.mClient)} { mRealTimeParams = RTParamSetViewType(RTClient::getParameterDescriptors(), @@ -592,12 +593,12 @@ struct StreamingControl std::fill_n(std::back_inserter(inputData), inputBuffers.size(), HostMatrix(nChans, paddedLength)); - std::vector outputData; + std::vector outputData; outputData.reserve(outputBuffers.size()); std::fill_n(std::back_inserter(outputData), outputBuffers.size(), HostMatrix(nChans * maxFeatures, nAnalysisFrames)); - double sampleRate{0}; + double sampleRate{0}; // Copy input data for (index i = 0; i < nChans; ++i) { @@ -630,10 +631,9 @@ struct StreamingControl inputData[asUnsigned(k)].row(i)(Slice(t, controlRate))); } - for(auto& out: outputData) + for (auto& out : outputData) { - outputs.push_back( - out.col(j)(Slice(i * maxFeatures, maxFeatures))); + outputs.push_back(out.col(j)(Slice(i * maxFeatures, maxFeatures))); } client.process(inputs, outputs, c); @@ -661,11 +661,11 @@ struct StreamingControl for (index i = 0; i < nFeatures; ++i) { for (index j = 0; j < nChans; ++j) - thisOutput.samps(i + j * nFeatures) <<= - outs.second->row(i + j * maxFeatures)(Slice(latencyHops, keepHops)); + thisOutput.samps(i + j * nFeatures) <<= outs.second->row( + i + j * maxFeatures)(Slice(latencyHops, keepHops)); } } - + return {}; } }; @@ -689,17 +689,19 @@ struct ControlControl index totalPadding = startPadding + userPadding.first; index paddedLength = nFrames + totalPadding; - + std::fill_n(std::back_inserter(inputData), inputBuffers.size(), HostMatrix(nChans, paddedLength)); std::vector outputData; outputData.reserve(outputBuffers.size()); - std::fill_n(std::back_inserter(outputData), outputBuffers.size(), - HostMatrix(nChans * maxFeatures, paddedLength));// TODO: check padded behaviour for output + std::fill_n( + std::back_inserter(outputData), outputBuffers.size(), + HostMatrix(nChans * maxFeatures, + paddedLength)); // TODO: check padded behaviour for output + + double sampleRate{0}; - double sampleRate{0}; - // Copy input data (strangely by time series so we have to iterate later) for (index i = 0; i < nChans; ++i) { @@ -713,13 +715,13 @@ struct ControlControl } } - std::vector inputs(inputBuffers.size(), {nullptr, 0, 0}); - std::vector outputs(outputBuffers.size(), {nullptr, 0, 0}); - - FluidTask* task = c.task(); + std::vector inputs(inputBuffers.size(), {nullptr, 0, 0}); + std::vector outputs(outputBuffers.size(), {nullptr, 0, 0}); + + FluidTask* task = c.task(); - // run the algorithm - client.reset(c); + // run the algorithm + client.reset(c); for (index i = 0; i < nFrames; ++i) // iterate each frame as time series { @@ -729,25 +731,24 @@ struct ControlControl outputs[j] = outputData[j].col(i); client.process(inputs, outputs, c); - - if (task && !task->processUpdate( - static_cast(i), - static_cast(nFrames))) - break; + + if (task && !task->processUpdate(static_cast(i), + static_cast(nFrames))) + break; } // copy to outbuf - for (index i = 0; i < asSigned(outputBuffers.size()); ++i) - { - if (!outputBuffers[asUnsigned(i)]) continue; - BufferAdaptor::Access thisOutput(outputBuffers[asUnsigned(i)]); - Result r = thisOutput.resize(nFrames, nChans, sampleRate); - if (!r.ok()) return r; - for (index j = 0; j < nChans; ++j) - thisOutput.samps(j) <<= - outputData[asUnsigned(i)].row(j)(Slice(startPadding, nFrames)); - } - + for (index i = 0; i < asSigned(outputBuffers.size()); ++i) + { + if (!outputBuffers[asUnsigned(i)]) continue; + BufferAdaptor::Access thisOutput(outputBuffers[asUnsigned(i)]); + Result r = thisOutput.resize(nFrames, nChans, sampleRate); + if (!r.ok()) return r; + for (index j = 0; j < nChans; ++j) + thisOutput.samps(j) <<= + outputData[asUnsigned(i)].row(j)(Slice(startPadding, nFrames)); + } + return {}; } }; @@ -1022,10 +1023,7 @@ class NRTThreadingAdaptor : public OfflineIn, public OfflineOut state = kDoneStillProcessing; mThreadedTask->mState = kDoneStillProcessing; } - else - { - mThreadedTask = nullptr; - } + else { mThreadedTask = nullptr; } } return state; @@ -1123,8 +1121,8 @@ class NRTThreadingAdaptor : public OfflineIn, public OfflineOut }; ThreadedTask(ClientPointer client, NRTJob& job, bool synchronous) - : mProcessParams(job.mParams), mState(kNoProcess), - mClient(client), mContext{mTask}, mCallback{job.mCallback} + : mProcessParams(job.mParams), mState(kNoProcess), mClient(client), + mContext{mTask}, mCallback{job.mCallback} { assert(mClient.get() != nullptr); // right? diff --git a/include/clients/rt/VoiceAllocatorClient.hpp b/include/clients/rt/VoiceAllocatorClient.hpp index 32e8d47a0..21eb50d46 100644 --- a/include/clients/rt/VoiceAllocatorClient.hpp +++ b/include/clients/rt/VoiceAllocatorClient.hpp @@ -17,8 +17,8 @@ under the European Union’s Horizon 2020 research and innovation programme #include "../common/ParameterConstraints.hpp" #include "../common/ParameterSet.hpp" #include "../common/ParameterTypes.hpp" -#include "../../data/TensorTypes.hpp" #include "../../algorithms/public/VoiceAllocator.hpp" +#include "../../data/TensorTypes.hpp" namespace fluid { namespace client { @@ -39,22 +39,27 @@ enum VoiceAllocatorParamIndex { }; constexpr auto VoiceAllocatorParams = defineParameters( - LongParamRuntimeMax( "numVoices", "Number of Voices", 1, Min(1)), - EnumParam("prioritisedVoices", "Prioritised Voice Quality", 0, "Lowest Frequency", "Loudest Magnitude"), - FloatParam("birthLowThreshold", "Track Birth Low Frequency Threshold", -24, Min(-144), Max(0)), - FloatParam("birthHighThreshold", "Track Birth High Frequency Threshold", -60, Min(-144), Max(0)), + LongParamRuntimeMax("numVoices", "Number of Voices", 1, Min(1)), + EnumParam("prioritisedVoices", "Prioritised Voice Quality", 0, + "Lowest Frequency", "Loudest Magnitude"), + FloatParam("birthLowThreshold", "Track Birth Low Frequency Threshold", -24, + Min(-144), Max(0)), + FloatParam("birthHighThreshold", "Track Birth High Frequency Threshold", + -60, Min(-144), Max(0)), LongParam("minTrackLen", "Minimum Track Length", 1, Min(1)), - FloatParam("trackMagRange", "Tracking Magnitude Range (dB)", 15., Min(1.), Max(200.)), - FloatParam("trackFreqRange", "Tracking Frequency Range (Hz)", 50., Min(1.), Max(10000.)), - FloatParam("trackProb", "Tracking Matching Probability", 0.5, Min(0.0), Max(1.0)) - ); + FloatParam("trackMagRange", "Tracking Magnitude Range (dB)", 15., Min(1.), + Max(200.)), + FloatParam("trackFreqRange", "Tracking Frequency Range (Hz)", 50., Min(1.), + Max(10000.)), + FloatParam("trackProb", "Tracking Matching Probability", 0.5, Min(0.0), + Max(1.0))); class VoiceAllocatorClient : public FluidBaseClient, public ControlIn, ControlOut { - using VoicePeak = algorithm::VoicePeak; - using SinePeak = algorithm::SinePeak; + using VoicePeak = algorithm::VoicePeak; + using SinePeak = algorithm::SinePeak; public: using ParamDescType = decltype(VoiceAllocatorParams); @@ -76,8 +81,8 @@ class VoiceAllocatorClient : public FluidBaseClient, } VoiceAllocatorClient(ParamSetViewType& p, FluidContext& c) - : mParams(p), mVoiceAllocator(get().max(), c.allocator()), - mSizeTracker{ 0 } + : mParams(p), mVoiceAllocator(get().max(), c.allocator()), + mSizeTracker{0} { controlChannelsIn(2); controlChannelsOut({3, get(), get().max()}); @@ -94,29 +99,35 @@ class VoiceAllocatorClient : public FluidBaseClient, if (!output[0].data() && !output[1].data()) return; if (!mVoiceAllocator.initialized() || mSizeTracker.changed(get())) { - controlChannelsOut({ 4, get() }); //update the dynamic out size + controlChannelsOut({4, get()}); // update the dynamic out size mVoiceAllocator.init(get(), c.allocator()); } - rt::vector incomingVoices(0, c.allocator()); + rt::vector incomingVoices(0, c.allocator()); rt::vector outgoingVoices(0, c.allocator()); for (index i = 0; i < input[0].size(); ++i) { - if (input[1].row(i) != 0 && input[0].row(i) != 0) - { - double logMag = 20 * log10(std::max(static_cast(input[1].row(i)), algorithm::epsilon)); - incomingVoices.push_back({ input[0].row(i), logMag, false }); - } + if (input[1].row(i) != 0 && input[0].row(i) != 0) + { + double logMag = + 20 * log10(std::max(static_cast(input[1].row(i)), + algorithm::epsilon)); + incomingVoices.push_back({input[0].row(i), logMag, false}); + } } - mVoiceAllocator.processFrame(incomingVoices, outgoingVoices, get(), get(), get(), 0, get(), get(), get(), get(), c.allocator()); + mVoiceAllocator.processFrame( + incomingVoices, outgoingVoices, get(), + get(), get(), 0, + get(), get(), get(), + get(), c.allocator()); for (index i = 0; i < static_cast(get()); ++i) { - output[2].row(i) = static_cast(outgoingVoices[i].state); - output[1].row(i) = outgoingVoices[i].logMag; - output[0].row(i) = outgoingVoices[i].freq; + output[2].row(i) = static_cast(outgoingVoices[i].state); + output[1].row(i) = outgoingVoices[i].logMag; + output[0].row(i) = outgoingVoices[i].freq; } } @@ -126,10 +137,7 @@ class VoiceAllocatorClient : public FluidBaseClient, return {}; } - void reset(FluidContext&) - { - clear(); - } + void reset(FluidContext&) { clear(); } static auto getMessageDescriptors() { @@ -139,8 +147,8 @@ class VoiceAllocatorClient : public FluidBaseClient, index latency() const { return 0; } private: - algorithm::VoiceAllocator mVoiceAllocator; - ParameterTrackChanges mSizeTracker; + algorithm::VoiceAllocator mVoiceAllocator; + ParameterTrackChanges mSizeTracker; }; } // namespace voiceallocator @@ -148,17 +156,20 @@ class VoiceAllocatorClient : public FluidBaseClient, using VoiceAllocatorClient = ClientWrapper; -auto constexpr NRTVoiceAllocatorParams = makeNRTParams( - InputBufferParam("frequencies", "Source F Buffer"), - InputBufferParam("magnitudes", "Source M Buffer"), - BufferParam("freqed", "dest f Buffer"), - BufferParam("magned", "dest m Buffer"), - BufferParam("voiced", "dest v Buffer") - ); - -using NRTVoiceAllocatorClient = NRTDualControlAdaptor; - -using NRTThreadedVoiceAllocatorClient = NRTThreadingAdaptor; +auto constexpr NRTVoiceAllocatorParams = + makeNRTParams( + InputBufferParam("frequencies", "Source F Buffer"), + InputBufferParam("magnitudes", "Source M Buffer"), + BufferParam("freqed", "dest f Buffer"), + BufferParam("magned", "dest m Buffer"), + BufferParam("voiced", "dest v Buffer")); + +using NRTVoiceAllocatorClient = + NRTDualControlAdaptor; + +using NRTThreadedVoiceAllocatorClient = + NRTThreadingAdaptor; } // namespace client } // namespace fluid