Source code for motif.feature_extractors.melodia
"""Melodia feature extractor.
"""
import numpy as np
from motif.core import FeatureExtractor
from motif.feature_extractors import utils
[docs]class MelodiaFeatures(FeatureExtractor):
'''Melodia feature extractor
Attributes
----------
ref_hz : float
Reference frequency (Hz) for converting to cents.
'''
def __init__(self, ref_hz=55.0):
'''Init method
Parameters
----------
ref_hz : float
Reference frequency (Hz) for converting to cents.
'''
self.ref_hz = ref_hz
FeatureExtractor.__init__(self)
[docs] def get_feature_vector(self, times, freqs_hz, salience, sample_rate):
"""Get feature vector for a contour.
Parameters
----------
times : np.array
Contour times
freqs_hz : np.array
Contour frequencies (Hz)
salience : np.array
Contour salience
sample_rate : float
Contour sample rate.
Returns
-------
feature_vector : np.array
Feature vector.
"""
freqs_cents = utils.hz_to_cents(freqs_hz, ref_hz=self.ref_hz)
features = [
utils.get_contour_onset(times),
utils.get_contour_offset(times),
utils.get_contour_duration(times),
utils.get_mean(freqs_cents),
utils.get_std(freqs_cents),
utils.get_mean(salience),
utils.get_std(salience),
utils.get_sum(salience),
utils.vibrato_essentia(freqs_cents, sample_rate) # dimension 4
]
return np.concatenate(features)
@property
def feature_names(self):
"""Get feature names.
Returns
-------
feature_names : list
List of feature names.
"""
feature_names = [
'onset',
'offset',
'duration',
'pitch mean (cents)',
'pitch stddev (cents)',
'salience mean',
'salience stdev',
'salience total',
'vibrato',
'vibrato rate',
'vibrato extent (cents)',
'vibrato coverage'
]
return feature_names
@classmethod
[docs] def get_id(cls):
""" The FeatureExtractor identifier
Returns
-------
id : string
class identifier
"""
return 'melodia'