Source code for music21.analysis.pitchAnalysis

# ------------------------------------------------------------------------------
# Name:         analysis/pitchAnalysis.py
# Purpose:      Tools for analyzing pitches
#
# Authors:      Michael Scott Asato Cuthbert
#
# Copyright:    Copyright © 2017 Michael Scott Asato Cuthbert
# License:      BSD, see license.txt
# ------------------------------------------------------------------------------
from __future__ import annotations

import collections

[docs] def pitchAttributeCount(s, pitchAttr='name'): ''' Return a collections.Counter of pitch class usage (count) by selecting an attribute of the Pitch object. * Changed in v4: Returns a collections.Counter object. >>> bach = corpus.parse('bach/bwv324.xml') >>> pcCount = analysis.pitchAnalysis.pitchAttributeCount(bach, 'pitchClass') >>> for n in sorted(pcCount): ... print(f'{n:2d}: {pcCount[n]:2d}') 0: 3 2: 26 3: 3 4: 13 6: 15 7: 13 9: 17 11: 14 List in most common order: >>> nameCount = analysis.pitchAnalysis.pitchAttributeCount(bach, 'name') >>> for n, count in nameCount.most_common(3): ... print(f'{n:>2s}: {nameCount[n]:2d}') D: 26 A: 17 F#: 15 >>> nameOctaveCount = analysis.pitchAnalysis.pitchAttributeCount(bach, 'nameWithOctave') >>> for n in sorted(nameOctaveCount): ... print(f'{n:>3s}: {nameOctaveCount[n]:2d}') A2: 2 A3: 5 A4: 10 B2: 3 B3: 4 B4: 7 C3: 2 C5: 1 D#3: 1 D#4: 2 ... ''' post = collections.Counter() for p in s.pitches: k = getattr(p, pitchAttr) post[k] += 1 return post
if __name__ == '__main__': import music21 music21.mainTest()