Original music21 feature extractors.
A twelve element feature that reports the fraction of all chord motion of music21.harmony.Harmony objects that move up by i-half-steps. (a half-step motion down would be stored in i = 11). i = 0 is always 0.0 since consecutive chords on the same pitch are ignored (unless there are 0 or 1 harmonies, in which case it is 1)
Sample test on Dylan’s Blowing In The Wind (not included), showing all motion is 3rds, 6ths, or especially 4ths and 5ths.
s = corpus.parse(‘demos/BlowinInTheWind’) fe = features.native.ChordBassMotionFeature(s) fe.extract().vector
[0.0, 0.0, 0.0, 0.0416..., 0.0416..., 0.166..., 0.0, 0.54166..., 0.0, 0.0, 0.2083... 0.0]
For comparison, the Beatles Here Comes the Sun has more tone motion
[0.0, 0.05..., 0.14..., 0.03..., 0.06..., 0.3..., 0.008..., 0.303..., 0.0, 0.0, 0.07..., 0.008...]
Post 1990s music has a lot more semitone motion.
ChordBassMotionFeature bases
ChordBassMotionFeature methods
Methods inherited from FeatureExtractor:
composer’s popularity today, as measured by the number of Google search results (log-10)
>>> s = corpus.parse('mozart/k155', 2)
>>> fe = features.native.ComposerPopularity(s)
>>> fe.extract().vector[0] > 6.0
True
ComposerPopularity bases
ComposerPopularity methods
Methods inherited from FeatureExtractor:
Percentage of all simultaneities that are diminished seventh chords.
>>> s = corpus.parse('bwv66.6')
>>> fe = features.native.DiminishedSeventhSimultaneityPrevalence(s)
>>> fe.extract().vector
[0.0]
DiminishedSeventhSimultaneityPrevalence bases
DiminishedSeventhSimultaneityPrevalence methods
Methods inherited from FeatureExtractor:
Percentage of all simultaneities that are diminished triads.
>>> s = corpus.parse('bwv66.6')
>>> fe = features.native.DiminishedTriadSimultaneityPrevalence(s)
>>> fe.extract().vector
[0.018867924528...]
DiminishedTriadSimultaneityPrevalence bases
DiminishedTriadSimultaneityPrevalence methods
Methods inherited from FeatureExtractor:
Percentage of all simultaneities that are dominant seventh.
>>> s = corpus.parse('bwv66.6')
>>> fe = features.native.DominantSeventhSimultaneityPrevalence(s)
>>> fe.extract().vector
[0.075...]
DominantSeventhSimultaneityPrevalence bases
DominantSeventhSimultaneityPrevalence methods
Methods inherited from FeatureExtractor:
>>> s = corpus.parse('bwv66.6')
>>> fe = features.native.FirstBeatAttackPrevalence(s)
>>> f = fe.extract()
>>> f.vector
[0]
TODO: That seems to be a bug!!!
FirstBeatAttackPrevalence bases
FirstBeatAttackPrevalence methods
Methods inherited from FeatureExtractor:
Percentage of all triads that are spelled incorrectly.
example:
Mozart k155 movement 2 has a single instance of an incorrectly spelled triad (m. 17, where the C# of an A-major chord has a lower neighbor B# thus temporarily creating an incorrectly spelled A-minor chord).
We would expect highly chromatic music such as Reger or Wagner to have a higher percentage, or automatically rendered MIDI transcriptions (which don’t distinguish between D# and Eb).
>>> s = corpus.parse('bwv66.6')
>>> fe = features.native.IncorrectlySpelledTriadPrevalence(s)
>>> fe.extract().vector
[0.02...]
IncorrectlySpelledTriadPrevalence bases
IncorrectlySpelledTriadPrevalence methods
Methods inherited from FeatureExtractor:
Return a bolean if one or more Parts end with a Landini-like cadential figure.
LandiniCadence bases
LandiniCadence methods
Methods inherited from FeatureExtractor:
language of text as a number the number is the index of text.LanguageDetector.languageCodes + 1 or 0 if there is no language.
Detect that the language of a Handel aria is Italian.
>>> s = corpus.parse('handel/rinaldo/lascia_chio_pianga')
>>> fe = features.native.LanguageFeature(s)
>>> fe.extract().vector
[3]
LanguageFeature bases
LanguageFeature methods
Methods inherited from FeatureExtractor:
Percentage of all simultaneities that are major triads.
>>> s = corpus.parse('bwv66.6')
>>> fe = features.native.MajorTriadSimultaneityPrevalence(s)
>>> fe.extract().vector
[0.45...]
MajorTriadSimultaneityPrevalence bases
MajorTriadSimultaneityPrevalence methods
Methods inherited from FeatureExtractor:
Percentage of all simultaneities that are minor triads.
>>> s = corpus.parse('bwv66.6')
>>> fe = features.native.MinorTriadSimultaneityPrevalence(s)
>>> fe.extract().vector # same as major in this work
[0.226...]
MinorTriadSimultaneityPrevalence bases
MinorTriadSimultaneityPrevalence methods
Methods inherited from FeatureExtractor:
>>> s = corpus.parse('bwv66.6')
>>> fe = features.native.MostCommonNoteQuarterLength(s)
>>> fe.extract().vector
[1.0]
MostCommonNoteQuarterLength bases
MostCommonNoteQuarterLength methods
Methods inherited from FeatureExtractor:
>>> s = corpus.parse('bwv66.6')
>>> fe = features.native.MostCommonNoteQuarterLengthPrevalence(s)
>>> fe.extract().vector
[0.60...]
MostCommonNoteQuarterLengthPrevalence bases
MostCommonNoteQuarterLengthPrevalence methods
Methods inherited from FeatureExtractor:
Fraction of all pitch class simultaneities that are the most common simultaneity.
>>> s = corpus.parse('bwv66.6')
>>> fe = features.native.MostCommonPitchClassSetSimultaneityPrevalence(s)
>>> fe.extract().vector
[0.132...]
MostCommonPitchClassSetSimultaneityPrevalence bases
MostCommonPitchClassSetSimultaneityPrevalence methods
Methods inherited from FeatureExtractor:
Fraction of all set class simultaneities that the most common simultaneity occupies.
>>> s = corpus.parse('bwv66.6')
>>> fe = features.native.MostCommonSetClassSimultaneityPrevalence(s)
>>> fe.extract().vector
[0.679...]
>>> s2 = corpus.parse('schoenberg/opus19', 6)
>>> fe2 = features.native.MostCommonSetClassSimultaneityPrevalence(s2)
>>> fe2.extract().vector
[0.184...]
MostCommonSetClassSimultaneityPrevalence bases
MostCommonSetClassSimultaneityPrevalence methods
Methods inherited from FeatureExtractor:
Extends the jSymbolic QualityFeature to automatically find mode
Set to 0 if the key signature indicates that a recording is major, set to 1 if it indicates that it is minor. A Music21 addition: if no key mode is found in the piece, analyze the piece to discover what mode it is most likely in.
Example: Handel, Rinaldo Aria (musicxml) is explicitly encoded as being in Major:
>>> s = corpus.parse('handel/rinaldo/lascia_chio_pianga')
>>> fe = features.native.QualityFeature(s)
>>> f = fe.extract()
>>> f.vector
[0]
now we will try it with the last movement of Schoenberg’s opus 19 which has no mode explicitly encoded in the musicxml but which our analysis routines believe (having very little to go on) fits the profile of e-minor best.
>>> schoenberg19mvmt6= corpus.parse('schoenberg/opus19', 6)
>>> fe2 = features.native.QualityFeature(schoenberg19mvmt6)
>>> f2 = fe2.extract()
>>> f2.vector
[1]
QualityFeature bases
QualityFeature methods
Methods inherited from FeatureExtractor:
Difference between the longest and shortest quarter lengths.
>>> s = corpus.parse('bwv66.6')
>>> fe = features.native.RangeOfNoteQuarterLengths(s)
>>> fe.extract().vector
[1.5]
RangeOfNoteQuarterLengths bases
RangeOfNoteQuarterLengths methods
Methods inherited from FeatureExtractor:
>>> s = corpus.parse('bwv66.6')
>>> fe = features.native.TonalCertainty(s)
>>> f = fe.extract()
>>> f.vector
[1.26...]
TonalCertainty bases
TonalCertainty methods
Methods inherited from FeatureExtractor:
Gives the proportion of all simultaneities which form triads (major, minor, diminished, or augmented)
>>> s = corpus.parse('bwv66.6')
>>> fe = features.native.TriadSimultaneityPrevalence(s)
>>> fe.extract().vector
[0.71698...]
>>> s2 = corpus.parse('schoenberg/opus19', 2)
>>> fe2 = features.native.TriadSimultaneityPrevalence(s2)
>>> fe2.extract().vector
[0.022727...]
TriadSimultaneityPrevalence bases
TriadSimultaneityPrevalence methods
Methods inherited from FeatureExtractor:
>>> s = corpus.parse('bwv66.6')
>>> fe = features.native.UniqueNoteQuarterLengths(s)
>>> fe.extract().vector
[3]
UniqueNoteQuarterLengths bases
UniqueNoteQuarterLengths methods
Methods inherited from FeatureExtractor:
Number of unique pitch class simultaneities.
>>> s = corpus.parse('bwv66.6')
>>> fe = features.native.UniquePitchClassSetSimultaneities(s)
>>> fe.extract().vector
[25]
UniquePitchClassSetSimultaneities bases
UniquePitchClassSetSimultaneities methods
Methods inherited from FeatureExtractor:
Number of unique set class simultaneities.
>>> s = corpus.parse('bwv66.6')
>>> fe = features.native.UniqueSetClassSimultaneities(s)
>>> fe.extract().vector
[12]
UniqueSetClassSimultaneities bases
UniqueSetClassSimultaneities methods
Methods inherited from FeatureExtractor: