aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJamie Bullock <jamie@jamiebullock.com>2014-03-11 18:14:45 +0000
committerJamie Bullock <jamie@jamiebullock.com>2014-03-11 18:14:45 +0000
commitc7e8efcbea13ca27f1b6f5619f05e1f79d36ba55 (patch)
tree71f8135a795027a386f4e91f4c773346a0d09d5c /src
parent14c4d07be16ce3ba36d28eeef507afdc1afed8f6 (diff)
downloadLibXtract-c7e8efcbea13ca27f1b6f5619f05e1f79d36ba55.tar.gz
LibXtract-c7e8efcbea13ca27f1b6f5619f05e1f79d36ba55.tar.bz2
LibXtract-c7e8efcbea13ca27f1b6f5619f05e1f79d36ba55.zip
Add xtract_midicent() convenience function to convert from frequency to MIDI cent
Diffstat (limited to 'src')
-rw-r--r--src/descriptors.c17
-rw-r--r--src/libxtract.c2
-rw-r--r--src/scalar.c11
3 files changed, 29 insertions, 1 deletions
diff --git a/src/descriptors.c b/src/descriptors.c
index 044f3d4..efcf02d 100644
--- a/src/descriptors.c
+++ b/src/descriptors.c
@@ -88,6 +88,7 @@ xtract_function_descriptor_t *xtract_make_descriptors(void)
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 @@ xtract_function_descriptor_t *xtract_make_descriptors(void)
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 @@ xtract_function_descriptor_t *xtract_make_descriptors(void)
break;
case XTRACT_ATTACK_TIME:
case XTRACT_DECAY_TIME:
+ case XTRACT_MIDICENT:
default:
*data_format = XTRACT_NO_DATA;
break;
@@ -620,6 +623,13 @@ xtract_function_descriptor_t *xtract_make_descriptors(void)
"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 @@ xtract_function_descriptor_t *xtract_make_descriptors(void)
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 @@ xtract_function_descriptor_t *xtract_make_descriptors(void)
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 @@ xtract_function_descriptor_t *xtract_make_descriptors(void)
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 @@ xtract_function_descriptor_t *xtract_make_descriptors(void)
*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;
diff --git a/src/libxtract.c b/src/libxtract.c
index 99162fb..624e8cd 100644
--- a/src/libxtract.c
+++ b/src/libxtract.c
@@ -36,7 +36,6 @@ int(*xtract[])(const double *, const int, const void *, double *) =
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 @@ int(*xtract[])(const double *, const int, const void *, double *) =
xtract_f0,
xtract_failsafe_f0,
xtract_wavelet_f0,
+ xtract_midicent,
/* xtract_delta.h */
xtract_lnorm,
xtract_flux,
diff --git a/src/scalar.c b/src/scalar.c
index 2e93934..4ae3f16 100644
--- a/src/scalar.c
+++ b/src/scalar.c
@@ -983,4 +983,15 @@ int xtract_wavelet_f0(const double *data, const int N, const void *argv, double
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;
+}