summaryrefslogtreecommitdiff
path: root/rotord/src
diff options
context:
space:
mode:
Diffstat (limited to 'rotord/src')
-rw-r--r--rotord/src/nodes_audio_analysis.cpp63
1 files changed, 49 insertions, 14 deletions
diff --git a/rotord/src/nodes_audio_analysis.cpp b/rotord/src/nodes_audio_analysis.cpp
index eff7a37..7efb0f8 100644
--- a/rotord/src/nodes_audio_analysis.cpp
+++ b/rotord/src/nodes_audio_analysis.cpp
@@ -290,35 +290,68 @@ nned to retrieve total intensity by segment
*/
// segment group_intensity seg_intense segment
vector<pair<double,vector<pair<double,int> > > > seggrps;
+ vector<pair<double,vector<pair<double,int> > > > oldgrps;
for (i=0;i<totalsmap.size();i++){
vector<pair<double,int> > data;
data.push_back(make_pair(totalsmap[i],i));
- seggrps.push_back(make_pair(totalsmap[i],data));
+ oldgrps.push_back(make_pair(totalsmap[i],data));
}
+
for (auto s:similarities){
+ //similarities is a collection of similarity groups in no particular order, referring to segment nos
+ //at this point seggrps is in segment order
if (s.second.size()>1){
for (int j=s.second.size()-1;j>0;j--){
- seggrps[s.second[0]].second.push_back(make_pair(totalsmap[s.second[j]],s.second[j]));
- //keep running average// should be by area?
- //seggrps[s.second[0]].first+=(totalsmap[s.second[j]]*(1.0/max(1,(int)seggrps[s.second[0]].second.size()-1)));
- //double div=seggrps[s.second[0]].second.size()==1?1.0:((double)seggrps[s.second[0]].second.size()-1/(double)seggrps[s.second[0]].second.size());
- //neat! this gives 1,1/2,2/3,3/4..
- //seggrps[s.second[0]].first*=div;
+ oldgrps[s.second[0]].second.push_back(make_pair(totalsmap[s.second[j]],s.second[j]));
+ //keep running average// should be by area?
+ //seggrps[s.second[0]].first+=(totalsmap[s.second[j]]*(1.0/max(1,(int)seggrps[s.second[0]].second.size()-1)));
+ //double div=seggrps[s.second[0]].second.size()==1?1.0:((double)seggrps[s.second[0]].second.size()-1/(double)seggrps[s.second[0]].second.size());
+ //neat! this gives 1,1/2,2/3,3/4..
+ //seggrps[s.second[0]].first*=div;
+
+ //seggrps.erase(seggrps.begin()+s.second[j]);
+ //after this has happened, seggrpgs indexing can be invalid
+
+ }
+
//easier is to
double avg=0.0f;
- for (auto p:seggrps[s.second[0]].second) avg+=p.first;
- avg/=seggrps[s.second[0]].second.size();
- seggrps[s.second[0]].first=avg;
+ for (auto p:oldgrps[s.second[0]].second) avg+=p.first;
+ avg/=oldgrps[s.second[0]].second.size();
+ oldgrps[s.second[0]].first=avg;
- seggrps.erase(seggrps.begin()+s.second[j]);
- }
}
+ seggrps.push_back(oldgrps[s.second[0]]);
}
+
cerr<<"similarities assigned, "<<(totalsmap.size()-seggrps.size())<<" segments merged"<<endl;
+
+ i=0;
+ for (auto s:seggrps) {
+ string list="";
+ for (int j=0;j<s.second.size();j++){
+ if (j>0) list+=",";
+ list +=toString(s.second[j].second);
+ }
+ cerr<<"segment "<<i<<" ["<<list<<"]"<<endl;
+ i++;
+ }
//sort the contents by intensity
std::sort(seggrps.begin(),seggrps.end(),sortseggrps);
+ cerr<<"groups sorted by intensity:"<<endl;
//possible mergers will be with groups with adjacent intensity
+ i=0;
+ for (auto s:seggrps) {
+ string list="";
+ for (int j=0;j<s.second.size();j++){
+ if (j>0) list+=",";
+ list +=toString(s.second[j].second);
+ }
+ cerr<<"segment "<<i<<" ["<<list<<"]"<<endl;
+ i++;
+ }
+
if (((int)parameters["levels"]->value)>0) {
if (seggrps.size()>(int)parameters["levels"]->value){
while (seggrps.size()>(int)parameters["levels"]->value){
@@ -353,7 +386,7 @@ nned to retrieve total intensity by segment
double avg=0.0;
double dev=0.0;
for (int k=0;k<seggrps[j].second.size();k++){
- avg+=k<seggrps[j].second[k].first;
+ avg+=seggrps[j].second[k].first;
}
avg/=seggrps[j].second.size();
for (int k=0;k<seggrps[j].second.size();k++){
@@ -370,7 +403,8 @@ nned to retrieve total intensity by segment
std::sort(seggrps[largest].second.begin(),seggrps[largest].second.end(),sortgroupmembers);
//create a new group
std::pair<double,vector<pair<double,int> > > newgroup;
- for (int j=seggrps[largest].second.size();j>seggrps[largest].second.size()/2;j--) {
+ cerr<<"splitting group "<<largest<<" with "<<seggrps[largest].second.size()<<" segments: new group will have "<<seggrps[largest].second.size()-(seggrps[largest].second.size()/2)<<" segments"<<endl;
+ for (int j=seggrps[largest].second.size()-1;j>(seggrps[largest].second.size()/2)-1;j--) {
newgroup.second.push_back(seggrps[largest].second[j]);
seggrps[largest].second.erase(seggrps[largest].second.begin()+j);
}
@@ -388,6 +422,7 @@ nned to retrieve total intensity by segment
//add the new group
seggrps.push_back(newgroup);
+ cerr<<" added new group with "<<newgroup.second.size()<<" segments"<<endl;
}
cerr<<"similaritity groups split, "<<seggrps.size()<<" levels total"<<endl;
//seggrps are now out of order