diff NNLSChroma.cpp @ 85:ccc0d4b3f867 consonance

implemented consonance
author matthiasm
date Thu, 25 Nov 2010 02:26:52 +0900
parents 05e6b8a2fdcd
children e5c16976513d
line wrap: on
line diff
--- a/NNLSChroma.cpp	Wed Nov 24 21:58:42 2010 +0900
+++ b/NNLSChroma.cpp	Thu Nov 25 02:26:52 2010 +0900
@@ -227,8 +227,8 @@
 NNLSChroma::getRemainingFeatures()
 {
     
-    float consonancepattern[] = {0,-1,-1,1,1,1,-1,1,1,1,-1,-1};
-    for (int i = 0; i< 12,++i) cerr << consonancepattern[i]<< cerr; 
+    float consonancepattern[24] = {0,-1,-1,1,1,1,-1,1,1,1,-1,-1,1,-1,-1,1,1,1,-1,1,1,1,-1,-1};
+    for (int i = 0; i< 12; ++i) cerr << consonancepattern[i]<< endl; 
     if (debug_on) cerr << "--> getRemainingFeatures" << endl;
     FeatureSet fsOut;
     if (m_logSpectrum.size() == 0) return fsOut;
@@ -274,6 +274,7 @@
         f2.timestamp = f1.timestamp;
         f2.values.push_back(0.0); f2.values.push_back(0.0); // set lower edge to zero
 		
+		
         if (m_tuneLocal) {
             intShift = floor(m_localTuning[count] * 3);
             floatShift = m_localTuning[count] * 3 - intShift; // floatShift is a really bad name for this
@@ -334,7 +335,8 @@
         Feature f4; // treble chromagram
         Feature f5; // bass chromagram
         Feature f6; // treble and bass chromagram
-	
+	    Feature consonance;
+	    
         f3.hasTimestamp = true;
         f3.timestamp = f2.timestamp;
 	        
@@ -347,6 +349,9 @@
         f6.hasTimestamp = true;
         f6.timestamp = f2.timestamp;
 	        
+        consonance.hasTimestamp = true;
+        consonance.timestamp = f2.timestamp;
+	    
         float b[nNote];
 	
         bool some_b_greater_zero = false;
@@ -420,7 +425,20 @@
         } else {
             for (int i = 0; i < 84; ++i) f3.values.push_back(0);
         }
-			
+		
+        float notesum = 0;
+        
+        consonance.values.push_back(0);
+        for (int iSemitone = 0; iSemitone < 84-24; ++iSemitone) {            
+            notesum += f3.values[iSemitone];
+            float tempconsonance = 0;
+            for (int jSemitone = 1; jSemitone < 24; ++jSemitone) {
+                tempconsonance += f3.values[iSemitone+jSemitone] * (consonancepattern[jSemitone]);
+            }
+            consonance.values[0] += (f3.values[iSemitone] * tempconsonance);
+        }
+        if (notesum > 0) consonance.values[0] /= (notesum * notesum);
+		
         f4.values = chroma; 
         f5.values = basschroma;
         chroma.insert(chroma.begin(), basschroma.begin(), basschroma.end()); // just stack the both chromas 
@@ -483,6 +501,7 @@
         fsOut[m_outputChroma].push_back(f4);
         fsOut[m_outputBassChroma].push_back(f5);
         fsOut[m_outputBothChroma].push_back(f6);
+        fsOut[m_outputConsonance].push_back(consonance);
         count++;
     }
     cerr << "done." << endl;