def test_repr(): class TestAnnotation(annotations.Annotation): def __init__(self): self.a = ["a", "b", "c"] self.b = np.array([[1, 2], [1, 4]]) self._c = "hidden" test_track = TestAnnotation() assert test_track.__repr__() == """TestAnnotation(a, b)""" beat_data = annotations.BeatData(np.array([1.0, 2.0])) assert beat_data.__repr__() == "BeatData(positions, times)"
def load_beats(fhandle: TextIO) -> annotations.BeatData: """Load a Guitarset beats annotation. Args: fhandle (str or file-like): File-like object or path of the jams annotation file Returns: BeatData: Beat data """ jam = jams.load(fhandle) anno = jam.search(namespace="beat_position")[0] times, values = anno.to_event_values() positions = [int(v["position"]) for v in values] return annotations.BeatData(times, np.array(positions))
def load_beats(jams_path): """Load a Guitarset beats annotation. Args: jams_path (str): Path of the jams annotation file Returns: BeatData: Beat data """ if not os.path.exists(jams_path): raise IOError("jams_path {} does not exist".format(jams_path)) jam = jams.load(jams_path) anno = jam.search(namespace="beat_position")[0] times, values = anno.to_event_values() positions = [int(v["position"]) for v in values] return annotations.BeatData(times, np.array(positions))
def load_beats(midi_path, midi=None): """Load beat data from the midi file. Args: midi_path (str): path to midi file midi (pretty_midi.PrettyMIDI): pre-loaded midi object or None if None, the midi object is loaded using midi_path Returns: annotations.BeatData: machine generated beat data """ if midi is None: midi = load_midi(midi_path) beat_times = midi.get_beats() beat_range = np.arange(0, len(beat_times)) meter = midi.time_signature_changes[0] beat_positions = 1 + np.mod(beat_range, meter.numerator) return annotations.BeatData(beat_times, beat_positions)
def load_beats(fhandle: TextIO) -> annotations.BeatData: """Load rwc beat data from a file Args: fhandle (str or file-like): File-like object or path to beats annotation file Returns: BeatData: beat data """ beat_times = [] # timestamps of beat interval beginnings beat_positions = [] # beat position inside the bar reader = csv.reader(fhandle, delimiter="\t") for line in reader: beat_times.append(float(line[0]) / 100.0) beat_positions.append(int(line[2])) beat_positions_in_bar, beat_times = _position_in_bar( np.array(beat_positions), np.array(beat_times)) return annotations.BeatData(beat_times, beat_positions_in_bar.astype(int))
def load_beat(fhandle: TextIO) -> annotations.BeatData: """Load a Dagstuhl ChoirSet beat annotation. Args: fhandle (str or file-like): File-like object or path to beat annotation file Returns: BeatData Object - the beat annotation """ times = [] positions = [] position = 0 reader = csv.reader(fhandle, delimiter=",") for line in reader: times.append(float(line[0])) raw_position = float(line[1]) if np.floor(raw_position) == raw_position: position = 1 else: position += 1 positions.append(position) return annotations.BeatData(np.array(times), np.array(positions))
def load_beats(fhandle: TextIO) -> annotations.BeatData: """Load Beatles format beat data from a file Args: fhandle (str or file-like): path or file-like object pointing to a beat annotation file Returns: BeatData: loaded beat data """ beat_times, beat_positions = [], [] dialect = csv.Sniffer().sniff(fhandle.read(1024)) fhandle.seek(0) reader = csv.reader(fhandle, dialect) for line in reader: beat_times.append(float(line[0])) beat_positions.append(line[-1]) beat_positions = _fix_newpoint(np.array(beat_positions)) # type: ignore # After fixing New Point labels convert positions to int beat_data = annotations.BeatData( np.array(beat_times), np.array([int(b) for b in beat_positions])) return beat_data
def test_beat_data(): times = np.array([1.0, 2.0]) positions = np.array([3, 4]) beat_data = annotations.BeatData(times) assert np.allclose(beat_data.times, times) assert beat_data.positions is None beat_data2 = annotations.BeatData(times, positions) assert np.allclose(beat_data2.times, times) assert np.allclose(beat_data2.positions, positions) with pytest.raises(ValueError): annotations.BeatData(None, None) with pytest.raises(TypeError): annotations.BeatData([1.0, 2.0]) with pytest.raises(TypeError): annotations.BeatData(times, [3, 4]) with pytest.raises(TypeError): annotations.BeatData(times.astype(int)) with pytest.raises(ValueError): annotations.BeatData(times, np.array([1]))
def test_beats(): beat_data_1 = [(annotations.BeatData(np.array([0.2, 0.3]), np.array([1, 2])), None)] beat_data_2 = [ (annotations.BeatData(np.array([0.5, 0.7]), np.array([2, 3])), "beats_2") ] beat_data_3 = [ (annotations.BeatData(np.array([0.0, 0.3]), np.array([1, 2])), "beats_1"), (annotations.BeatData(np.array([0.5, 0.8]), np.array([4, 3])), "beats_2"), ] beat_data_4 = ( annotations.BeatData(np.array([0.0, 0.3]), np.array([1, 2])), "beats_1", ) beat_data_5 = [ (annotations.BeatData(np.array([0.0, 0.3]), np.array([1, 2])), "beats_1"), [annotations.BeatData(np.array([0.5, 0.8]), np.array([4, 3])), "beats_2"], ] beat_data_6 = [(None, None)] beat_data_7 = [ ( annotations.EventData( np.array([[0.2, 0.3], [0.3, 0.4]]).T, ["event A", "event B"], ), None, ) ] jam_1 = jams_utils.jams_converter(beat_data=beat_data_1) jam_2 = jams_utils.jams_converter(beat_data=beat_data_2) jam_3 = jams_utils.jams_converter(beat_data=beat_data_3) jam_6 = jams_utils.jams_converter(beat_data=beat_data_6) time, duration, value, confidence = get_jam_data(jam_1, "beat", 0) assert time == [0.2, 0.3] assert duration == [0.0, 0.0] assert value == [1, 2] assert confidence == [None, None] assert jam_2.annotations[0]["sandbox"]["name"] == "beats_2" time, duration, value, confidence = get_jam_data(jam_3, "beat", 0) assert time == [0.0, 0.3] assert duration == [0.0, 0.0] assert value == [1, 2] assert confidence == [None, None] time, duration, value, confidence = get_jam_data(jam_3, "beat", 1) assert time == [0.5, 0.8] assert duration == [0.0, 0.0] assert value == [4, 3] assert confidence == [None, None] time, duration, value, confidence = get_jam_data(jam_6, "beat", 0) assert time == [] assert duration == [] assert value == [] assert confidence == [] assert type(jam_1) == jams.JAMS with pytest.raises(TypeError): jams_utils.jams_converter(beat_data=beat_data_4) with pytest.raises(TypeError): jams_utils.jams_converter(beat_data=beat_data_5) with pytest.raises(TypeError): jams_utils.jams_converter(beat_data=beat_data_7)