Source code for music21.analysis.elements
# ------------------------------------------------------------------------------
# Name: analysis/elements.py
# Purpose: Tools for analyzing general elements
#
# Authors: Michael Scott Asato Cuthbert
#
# Copyright: Copyright © 2017-22 Michael Scott Asato Cuthbert
# License: BSD, see license.txt
# ------------------------------------------------------------------------------
from __future__ import annotations
import collections
import typing as t
[docs]
def attributeCount(streamOrStreamIter, attrName='quarterLength') -> collections.Counter[t.Any]:
'''
Return a collections.Counter of attribute usage for elements in a stream
or StreamIterator
>>> bach = corpus.parse('bach/bwv324.xml')
>>> bachIter = bach.parts[0].recurse().getElementsByClass(note.Note)
>>> qlCount = analysis.elements.attributeCount(bachIter, 'quarterLength')
>>> qlCount.most_common(3)
[(1.0, 12), (2.0, 11), (4.0, 2)]
* Changed in v4: Returns a collections.Counter object.
'''
post: collections.Counter[t.Any] = collections.Counter()
for e in streamOrStreamIter:
if hasattr(e, attrName):
k = getattr(e, attrName)
post[k] += 1
return post
if __name__ == '__main__':
import music21
music21.mainTest()