changeset 205:f6fcf3bec020

Add xtract_midicent() convenience function to convert from frequency to MIDI cent
author Jamie Bullock <jamie@jamiebullock.com>
date Tue, 11 Mar 2014 18:14:45 +0000
parents f262144347e7
children c6488df9e5c0
files src/descriptors.c src/libxtract.c src/scalar.c xtract/libxtract.h xtract/xtract_scalar.h
diffstat 5 files changed, 46 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/descriptors.c	Fri Mar 07 22:14:55 2014 +0000
+++ b/src/descriptors.c	Tue Mar 11 18:14:45 2014 +0000
@@ -88,6 +88,7 @@
         case XTRACT_F0:
         case XTRACT_FAILSAFE_F0:
         case XTRACT_WAVELET_F0:
+        case XTRACT_MIDICENT:
             *argv_min = XTRACT_SR_LOWER_LIMIT;
             *argv_max = XTRACT_SR_UPPER_LIMIT;
             *argv_def = XTRACT_SR_DEFAULT;
@@ -230,6 +231,7 @@
         case XTRACT_F0:
         case XTRACT_FAILSAFE_F0:
         case XTRACT_WAVELET_F0:
+        case XTRACT_MIDICENT:
             *argv_donor = XTRACT_ANY;
             break;
         case XTRACT_MFCC:
@@ -380,6 +382,7 @@
             break;
         case XTRACT_ATTACK_TIME:
         case XTRACT_DECAY_TIME:
+        case XTRACT_MIDICENT:
         default:
             *data_format = XTRACT_NO_DATA;
             break;
@@ -620,6 +623,13 @@
                    "Extract the fundamental frequency of an audio signal (wavelet method)");
             strcpy(author, "Antoine Schmitt");
             break;
+        case XTRACT_MIDICENT:
+                strcpy(name, "midicent");
+                strcpy(p_name, "Frequency to MIDI Cent conversion");
+                strcpy(desc, "Convert frequency in Hertz to Pitch in MIDI cents");
+                strcpy(p_desc, "Convert frequency in Hertz to Pitch in MIDI cents");
+                strcpy(author, "Jamie Bullock");
+                break;
         case XTRACT_TONALITY:
             strcpy(name, "tonality");
             strcpy(p_name, "Tonality");
@@ -993,6 +1003,7 @@
         case XTRACT_F0:
         case XTRACT_FAILSAFE_F0:
         case XTRACT_WAVELET_F0:
+        case XTRACT_MIDICENT:
         case XTRACT_FLATNESS_DB:
         case XTRACT_TONALITY:
             *argc = 1;
@@ -1117,6 +1128,7 @@
         case XTRACT_F0:
         case XTRACT_FAILSAFE_F0:
         case XTRACT_WAVELET_F0:
+        case XTRACT_MIDICENT:
         case XTRACT_FLUX:
         case XTRACT_LNORM:
         case XTRACT_NONZERO_COUNT:
@@ -1195,6 +1207,7 @@
         case XTRACT_F0:
         case XTRACT_FAILSAFE_F0:
         case XTRACT_WAVELET_F0:
+        case XTRACT_MIDICENT:
         case XTRACT_NONZERO_COUNT:
         case XTRACT_AUTOCORRELATION:
         case XTRACT_AMDF:
@@ -1270,6 +1283,10 @@
                 *result_min = 0.0;
                 *result_max = XTRACT_SR_UPPER_LIMIT / 2.0;
                 break;
+            case XTRACT_MIDICENT:
+                *result_unit = XTRACT_MIDI_CENT;
+                *result_min = 0.0;
+                *result_max = 12700;
             case XTRACT_ZCR:
                 *result_unit = XTRACT_HERTZ;
                 *result_min = 0.0;
--- a/src/libxtract.c	Fri Mar 07 22:14:55 2014 +0000
+++ b/src/libxtract.c	Tue Mar 11 18:14:45 2014 +0000
@@ -36,7 +36,6 @@
     xtract_spectral_mean,
     xtract_spectral_variance,
     xtract_spectral_standard_deviation,
-    /* xtract_spectral_average_deviation, */
     xtract_spectral_skewness,
     xtract_spectral_kurtosis,
     xtract_spectral_centroid,
@@ -69,6 +68,7 @@
     xtract_f0,
     xtract_failsafe_f0,
     xtract_wavelet_f0,
+    xtract_midicent,
     /* xtract_delta.h */
     xtract_lnorm,
     xtract_flux,
--- a/src/scalar.c	Fri Mar 07 22:14:55 2014 +0000
+++ b/src/scalar.c	Tue Mar 11 18:14:45 2014 +0000
@@ -983,4 +983,15 @@
     return XTRACT_SUCCESS;
 }
 
+int xtract_midicent(const double *data, const int N, const void *argv, double *result)
+{
+    double f0 = *(double *)argv;
+    double note = 0.0;
+    
+    note = 69 + log(f0 / 440.f) * 17.31234;
+    note *= 100;
+    note = round(note);
+    
+    return XTRACT_SUCCESS;
+}
 
--- a/xtract/libxtract.h	Fri Mar 07 22:14:55 2014 +0000
+++ b/xtract/libxtract.h	Tue Mar 11 18:14:45 2014 +0000
@@ -71,7 +71,7 @@
   * @{
   */
 
-#define XTRACT_FEATURES 60
+#define XTRACT_FEATURES 61
     
 /** \brief Enumeration of features, elements are used as indixes to an array of pointers to feature extracton functions */
 enum xtract_features_ {
@@ -117,6 +117,7 @@
     XTRACT_F0,
     XTRACT_FAILSAFE_F0,
     XTRACT_WAVELET_F0,
+    XTRACT_MIDICENT,
     XTRACT_LNORM,
     XTRACT_FLUX,
     XTRACT_ATTACK_TIME,
@@ -208,7 +209,8 @@
     XTRACT_DBFS_HERTZ,
     XTRACT_PERCENT,
     XTRACT_BINS,
-    XTRACT_SONE
+    XTRACT_SONE,
+    XTRACT_MIDI_CENT
 } xtract_unit_t;
 
 /** \brief Boolean */
--- a/xtract/xtract_scalar.h	Fri Mar 07 22:14:55 2014 +0000
+++ b/xtract/xtract_scalar.h	Tue Mar 11 18:14:45 2014 +0000
@@ -434,6 +434,19 @@
  */
 int xtract_wavelet_f0(const double *data, const int N, const void *argv, double *result);
 
+    
+/** \brief Convenience function to convert a frequency in Hertz to a "pitch" value in MIDI cents
+ *
+ * \param *data: not used
+ * \param N: not used
+ * \param *argv: a pointer to a double-precision floating point value representing a frequency in Hertz
+ * \param *result: a pointer to a double-precision floating point value representing a "pitch" in MIDI cents
+ * \return if *argv value causes a *result within the range 0..127, XTRACT_SUCCESS will be returned, otherwise XTRACT_ARGUMENT_ERROR
+ *
+ */
+int xtract_midicent(const double *data, const int N, const void *argv, double *result);
+
+    
 /** \brief Extract the number of non-zero elements in an input vector
  * 
  * \param *data: a pointer to the first element in an array of doubles