From 328453e61a8992729c0ecc661ad324b63af6b41d Mon Sep 17 00:00:00 2001 From: Tim Redfern Date: Wed, 11 Dec 2013 13:49:45 +0000 Subject: tweaking intensity segmenter --- rotord/src/nodes_audio_analysis.cpp | 137 +++++++++++++++++++++++++----------- 1 file changed, 96 insertions(+), 41 deletions(-) (limited to 'rotord/src') diff --git a/rotord/src/nodes_audio_analysis.cpp b/rotord/src/nodes_audio_analysis.cpp index 1bc82e6..96244d0 100644 --- a/rotord/src/nodes_audio_analysis.cpp +++ b/rotord/src/nodes_audio_analysis.cpp @@ -113,6 +113,9 @@ namespace Rotor{ bool sortseggrps(std::pair > > i,std::pair > > j){ return (i.first i,pair j){ + return (i.first0) list+=","; + list +=toString(s.second[j]); + } + cerr<<"group "< times; auto g=++analysers["segmenter"].features.begin(); for (auto f=analysers["segmenter"].features.begin();g!=analysers["segmenter"].features.end();f++,g++,i++){ - cerr<<"segment "<first<<" to "<first<first); //integrate tempo and intensity algorithmically double tempo=0; @@ -190,8 +199,7 @@ namespace Rotor{ if (tempo>max_tempo) max_tempo=tempo; if (tempofirst; @@ -207,7 +215,21 @@ namespace Rotor{ if (intensity>max_intensity) max_intensity=intensity; if (intensityfirst<<" to "<first<<" average tempo: "<value)+(intensity*parameters["intensity_weight"]->value)<> totals; vector totalsmap; @@ -298,56 +320,89 @@ nned to retrieve total intensity by segment std::sort(seggrps.begin(),seggrps.end(),sortseggrps); //possible mergers will be with groups with adjacent intensity if (((int)parameters["levels"]->value)>0) { - while (seggrps.size()>(int)parameters["levels"]->value){ - //reduce similarity groups - //decide the best 2 to merge - vector diffs; - for (int j=0;j(int)parameters["levels"]->value){ + while (seggrps.size()>(int)parameters["levels"]->value){ + //reduce similarity groups + //decide the best 2 to merge + vector diffs; + for (int j=0;jvalue,(int)totalsmap.size())) { - //split groups - //calculate standard deviation of intensity variation - vector devs; - for (int j=0;jvalue,(int)totalsmap.size())){ + while (seggrps.size()value,(int)totalsmap.size())) { + //split groups + //calculate standard deviation of intensity variation + vector devs; + for (int j=0;jdevs[largest]) largest=j; + //sanity check: if there are any groups that can be split they will have larger SD than singleton groups + //sort members of the group + std::sort(seggrps[largest].second.begin(),seggrps[largest].second.end(),sortgroupmembers); + //create a new group + std::pair > > newgroup; + for (int j=seggrps[largest].second.size();j>seggrps[largest].second.size()/2;j--) { + newgroup.second.push_back(seggrps[largest].second[j]); + seggrps[largest].second.erase(seggrps[largest].second.begin()+j); } - dev/=seggrps[j].second.size(); - devs.push_back(pow(dev,0.5)); + + //refresh averages for the 2 groups + double avg=0.0f; + for (auto p:seggrps[largest].second) avg+=p.first; + avg/=seggrps[largest].second.size(); + seggrps[largest].first=avg; + + avg=0.0f; + for (auto p:newgroup.second) avg+=p.first; + avg/=newgroup.second.size(); + newgroup.first=avg; + + //add the new group + seggrps.push_back(newgroup); } - //find group with largest standard deviation - int largest=0; - for (int j=1;jdevs[largest]) largest=j; - //sanity check: if there are any groups that can be split they will have larger SD than singleton groups - //TODO actually split group + + } + cerr<<"similaritity groups split, "< outputvalues; for (int j=0;j0) list+=","; + list +=toString(seggrps[j].second[k].second); } + cerr<<"output value: "<