Read & Write

Pypianoroll currently supports reading from and writing to MIDI files.

Functions

pypianoroll.read(path: Union[str, pathlib.Path], **kwargs) → pypianoroll.multitrack.Multitrack[source]

Read a MIDI file into a Multitrack object.

Parameters

See also

pypianoroll.write()

Write a Multitrack object to a MIDI file.

pypianoroll.load()

Load a NPZ file into a Multitrack object.

pypianoroll.write(path: str, multitrack: Multitrack)[source]

Write a Multitrack object to a MIDI file.

Parameters

See also

pypianoroll.read()

Read a MIDI file into a Multitrack object.

pypianoroll.save()

Save a Multitrack object to a NPZ file.

pypianoroll.from_pretty_midi(midi: pretty_midi.pretty_midi.PrettyMIDI, resolution: int = 24, mode: str = 'max', algorithm: str = 'normal', collect_onsets_only: bool = False, first_beat_time: Optional[float] = None) → pypianoroll.multitrack.Multitrack[source]

Return a Multitrack object converted from a PrettyMIDI object.

Parse a pretty_midi.PrettyMIDI object. The data type of the resulting piano rolls is automatically determined (int if ‘mode’ is ‘sum’ and np.uint8 if mode is ‘max’).

Parameters
  • midi (pretty_midi.PrettyMIDI) – PrettyMIDI object to parse.

  • mode ({'max', 'sum'}) – Merging strategy for duplicate notes. Defaults to ‘max’.

  • algorithm ({'normal', 'strict', 'custom'}) – Algorithm for finding the location of the first beat (see Notes). Defaults to ‘normal’.

  • collect_onsets_only (bool) – True to collect only the onset of the notes (i.e. note on events) in all tracks, where the note off and duration information are discarded. False to parse regular piano rolls. Defaults to False.

  • first_beat_time (float, optional) – Location of the first beat, in sec. Required and only effective when using ‘custom’ algorithm.

Returns

Converted Multitrack object.

Return type

pypianoroll.Multitrack

Notes

There are three algorithms for finding the location of the first beat:

  • ‘normal’ : Estimate the location of the first beat using pretty_midi.PrettyMIDI.estimate_beat_start().

  • ‘strict’ : Set the location of the first beat to the time of the first time signature change. Raise a RuntimeError if no time signature change is found.

  • ‘custom’ : Set the location of the first beat to the value of argument first_beat_time. Raise a ValueError if first_beat_time is not given.

If an incomplete beat before the first beat is found, an additional beat will be added before the (estimated) beat starting time. However, notes before the (estimated) beat starting time for more than one beat are dropped.

pypianoroll.to_pretty_midi(multitrack: Multitrack, default_tempo: Optional[float] = None, default_velocity: int = 64) → pretty_midi.pretty_midi.PrettyMIDI[source]

Return a Multitrack object as a PrettyMIDI object.

Parameters
  • default_tempo (int) – Default tempo to use. Defaults to the first element of attribute tempo.

  • default_velocity (int) – Default velocity to assign to binarized tracks. Defaults to 64.

Returns

Converted PrettyMIDI object.

Return type

pretty_midi.PrettyMIDI

Notes

  • Tempo changes are not supported.

  • Time signature changes are not supported.

  • The velocities of the converted piano rolls will be clipped to [0, 127].

  • Adjacent nonzero values of the same pitch will be considered a single note with their mean as its velocity.

Note

Writing the tempo array and downbeat array to tempo change and time signature change events are not supported yet.