If it doesn’t fit anywhere else in the common directory, you’ll find it here…


music21.common.misc.cleanedFlatNotation(music_str: str) str

Returns a copy of the given string where each occurrence of a flat note specified with a ‘b’ is replaced by a ‘-‘.

music_str is a string containing a note specified (for example in a chord)

Returns a new string with flats only specified with ‘-‘.

>>> common.cleanedFlatNotation('Cb')
music21.common.misc.defaultDeepcopy(obj: Any, memo=None, *, ignoreAttributes: Iterable[str] = ())

Unfortunately, it is not possible to do something like:

def __deepcopy__(self, memo):
    if self._noDeepcopy:
        return self.__class__()
        copy.deepcopy(self, memo, ignore__deepcopy__=True)

Or, else: return NotImplemented

so that’s what this is for:

def __deepcopy__(self, memo):
    if self._noDeepcopy:
        return self.__class__()
        return common.defaultDeepcopy(self, memo)

Does a deepcopy of the state returned by __reduce_ex__ for protocol 4.

  • Changed in v9: callInit is removed, replaced with ignoreAttributes. uses __reduce_ex__ internally.

music21.common.misc.flattenList(originalList: Iterable[Iterable[_T]]) list[_T]

Flatten a list of lists into a flat list

but not a list of lists of lists…

>>> l = [[1, 2, 3], [4, 5], [6]]
>>> common.flattenList(l)
[1, 2, 3, 4, 5, 6]

Given a list of missing module names, returns a nicely-formatted message to the user that gives instructions on how to expand music21 with optional packages.

>>> print(common.getMissingImportStr(['matplotlib']))
Certain music21 functions might need the optional package matplotlib;
if you run into errors, install it by following the instructions at
>>> print(common.getMissingImportStr(['matplotlib', 'numpy']))
Certain music21 functions might need these optional packages: matplotlib, numpy;
if you run into errors, install them by following the instructions at
music21.common.misc.getPlatform() str

Return the name of the platform, where platforms are divided between ‘win’ (for Windows), ‘darwin’ (for MacOS X), and ‘nix’ for (GNU/Linux and other variants).

Does not discern between Linux/FreeBSD, etc.

Lowercase names are for backwards compatibility – this existed before the platform module.

music21.common.misc.macOSVersion() tuple[int, int, int]

On a Mac returns the current version as a tuple of (currently 3) ints, such as: (10, 5, 6) for 10.5.6.

On other systems, returns (0, 0, 0)


utility method that replicates the previous behavior of lists of pitches.

May be moved in v8 or later to a common.testing or test.X module.

music21.common.misc.runningInNotebook() bool

return bool if we are running under Jupyter Notebook (not IPython terminal) or Google Colabatory (colab).

Methods based on:

(No tests provided here, since results will differ depending on environment)

music21.common.misc.runningUnderIPython() bool

DEPRECATED in v9: use runningInNotebook() instead

music21.common.misc.sortModules(moduleList: Iterable[Any]) list[object]

Sort a list of imported module names such that most recently modified is first. In ties, last access time is used then module name

Will return a different order each time depending on the last mod time

music21.common.misc.unique(originalList: Iterable, *, key: Callable | None = None) list

Return a List of unique items from an iterable, preserving order. (unlike casting to a set and back)

(And why is this not already in Python?)

>>> common.misc.unique([3, 2, 4, 3, 2, 5])
[3, 2, 4, 5]

Works on any iterable, but order might not be preserved for sets, etc.

>>> common.misc.unique(range(5))
[0, 1, 2, 3, 4]

If key is a function then use that to get the value:

>>> s = converter.parse('tinyNotation: c4 E d C f# e a')
>>> common.misc.unique(s.recurse().notes, key=lambda n:
 [<music21.note.Note C>,
  <music21.note.Note E>,
  <music21.note.Note D>,
  <music21.note.Note F#>,
  <music21.note.Note A>]