Mercurial > hg > libxtract
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