Source code for muspy.inputs.note

"""Note-based representation input interface."""
from operator import attrgetter

import numpy as np
from numpy import ndarray

from ..classes import Note, Track
from ..music import DEFAULT_RESOLUTION, Music


[docs]def from_note_representation( array: ndarray, resolution: int = DEFAULT_RESOLUTION, program: int = 0, is_drum: bool = False, use_start_end: bool = False, encode_velocity: bool = True, default_velocity: int = 64, ) -> Music: """Decode note-based representation into a Music object. Parameters ---------- array : ndarray Array in note-based representation to decode. Will be casted to integer if not of integer type. resolution : int Time steps per quarter note. Defaults to `muspy.DEFAULT_RESOLUTION`. program : int, optional Program number according to General MIDI specification [1]. Acceptable values are 0 to 127. Defaults to 0 (Acoustic Grand Piano). is_drum : bool, optional A boolean indicating if it is a percussion track. Defaults to False. use_start_end : bool Whether to use 'start' and 'end' to encode the timing rather than 'time' and 'duration'. Defaults to False. encode_velocity : bool Whether to encode note velocities. Defaults to True. default_velocity : int Default velocity value to use when decoding if `encode_velocity` is False. Defaults to 64. Returns ------- :class:`muspy.Music` Decoded Music object. References ---------- [1] https://www.midi.org/specifications/item/gm-level-1-sound-set """ if not np.issubdtype(array.dtype, np.integer): array = array.astype(np.int) notes = [] velocity = default_velocity for note_tuple in array: if encode_velocity: velocity = note_tuple[3] if use_start_end: duration = note_tuple[2] - note_tuple[0] else: duration = note_tuple[2] notes.append( Note( time=note_tuple[0], pitch=note_tuple[1], duration=duration, velocity=velocity, ) ) # Sort the notes notes.sort(key=attrgetter("time", "pitch", "duration", "velocity")) # Create the Track and Music objects track = Track(program=program, is_drum=is_drum, notes=notes) music = Music(resolution=resolution, tracks=[track]) return music