diff options
-rw-r--r-- | src/descriptors.c | 17 | ||||
-rw-r--r-- | src/libxtract.c | 2 | ||||
-rw-r--r-- | src/scalar.c | 11 | ||||
-rw-r--r-- | xtract/libxtract.h | 6 | ||||
-rw-r--r-- | xtract/xtract_scalar.h | 13 |
5 files changed, 46 insertions, 3 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; +} diff --git a/xtract/libxtract.h b/xtract/libxtract.h index ce12e14..1f4a787 100644 --- a/xtract/libxtract.h +++ b/xtract/libxtract.h @@ -71,7 +71,7 @@ extern "C" { * @{ */ -#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 @@ enum xtract_features_ { XTRACT_F0, XTRACT_FAILSAFE_F0, XTRACT_WAVELET_F0, + XTRACT_MIDICENT, XTRACT_LNORM, XTRACT_FLUX, XTRACT_ATTACK_TIME, @@ -208,7 +209,8 @@ typedef enum unit_ { XTRACT_DBFS_HERTZ, XTRACT_PERCENT, XTRACT_BINS, - XTRACT_SONE + XTRACT_SONE, + XTRACT_MIDI_CENT } xtract_unit_t; /** \brief Boolean */ diff --git a/xtract/xtract_scalar.h b/xtract/xtract_scalar.h index e18aea6..4e39fd9 100644 --- a/xtract/xtract_scalar.h +++ b/xtract/xtract_scalar.h @@ -434,6 +434,19 @@ int xtract_failsafe_f0(const double *data, const int N, const void *argv, double */ 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 |