summaryrefslogtreecommitdiff
path: root/rotord/src/nodes_audio_analysis.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'rotord/src/nodes_audio_analysis.cpp')
-rw-r--r--rotord/src/nodes_audio_analysis.cpp22
1 files changed, 21 insertions, 1 deletions
diff --git a/rotord/src/nodes_audio_analysis.cpp b/rotord/src/nodes_audio_analysis.cpp
index 6ec1188..ad6f5ad 100644
--- a/rotord/src/nodes_audio_analysis.cpp
+++ b/rotord/src/nodes_audio_analysis.cpp
@@ -178,9 +178,29 @@ namespace Rotor{
}
//sort and convert to features
std::sort(totals.begin(),totals.end(),sortsegments);
+ vector<float> bucketoffsets;
+ for (auto t:totals) bucketoffsets.push_back(0.0f);
+ if (parameters["levels"]->value>0.0f&&parameters["levels"]->value<totals.size()){
+ //use bucketoffsets to redistribute into smaller number of buckets
+ int numbertoredistribute=totals.size()-((int)parameters["levels"]->value);
+ int numberperbin=ceil((float)numbertoredistribute/totals.size());
+ int added=0;
+ for (int j=0;j<numbertoredistribute-numberperbin;j+=numberperbin){
+ int numbertoadd=min(numbertoredistribute-added,numberperbin);
+ bucketoffsets[j]=numbertoadd;
+ added+=numbertoadd;
+ }
+ if (numbertoredistribute>0) {
+ cerr<<"reducing number of levels by "<<numbertoredistribute<<", offsets:"<<endl;
+ for (auto o:bucketoffsets) {
+ cerr<<o<<":";
+ }
+ cerr<<endl;
+ }
+ }
for (i=0;i<totals.size();i++){
vampHost::feature f;
- f.values.push_back((float)i);
+ f.values.push_back((float)i+bucketoffsets[i]);
features[times[totals[i].first]]=f;
}
}