Esempio n. 1
0
def test_set_tempo(measure_list, meter):
    track = Track(to_add=measure_list, instrument=INSTRUMENT, meter=meter)
    track.tempo = int(TEMPO_QPM / 2)
    expected_starts = [0.0, 2 * DUR, DUR * 4, DUR * 6]
    for measure in track:
        for note in measure:
            assert note.duration == pytest.approx(DUR * 2)
        assert [note.start for note in measure] == expected_starts
Esempio n. 2
0
def test_track_section_map(section):
    # Case: falsey track.name, not added to map
    section_name = ''
    section.name = section_name
    track = Track(to_add=section)
    assert not track.section_map
    # Case: has track.name, added to map
    section_name = 'section'
    section.name = section_name
    track = Track(to_add=section)
    assert track.section_map
    assert track.section_map[section_name] == section
Esempio n. 3
0
def test_song_insert_remove_getitem(track):
    empty_track_list = []
    song = Song(to_add=empty_track_list)
    assert len(song) == 0

    # Insert a single track at the front of the Song track_list
    song.insert(0, track)
    track_front = song[0]
    assert track_front == track

    # Insert a list of 2 tracks at the front of the Song track_list
    empty_track_list = []
    song = Song(to_add=empty_track_list)
    track_1 = Track.copy(track)
    track_1_name = 'track_1_name'
    track_1.name = track_1_name
    track_2 = Track.copy(track)
    track_2_name = 'track_2_name'
    track_2.name = track_2_name
    track_list = [track_1, track_2]
    song.insert(0, track_list)
    assert song[0].name == track_1_name
    assert song[1].name == track_2_name
    assert len(song) == 2
    assert song.track_map[track_1_name] == track_1
    assert song.track_map[track_2_name] == track_2

    # After removing a measure, the new front note is the one added second to most recently
    song.remove((0, 1))
    assert len(song) == 1
    assert song[0] == track_2
    assert song.track_map[track_2_name] == track_2

    # Insert and remove 2 Tracks
    song = Song(to_add=empty_track_list)
    track_1 = Track.copy(track)
    track_2 = Track.copy(track)
    track_1.name = track_1_name
    track_2.name = track_2_name
    track_list = [track_1, track_2]
    song.insert(0, track_list)
    assert len(song) == 2
    song.remove((1, 2))
    assert len(song) == 1
    assert song[0] == track_1
    assert song.track_map[track_1.name] == track_1
    song.remove((0, 1))
    assert len(song) == 0
    assert not song.track_list
    assert not song.track_map
Esempio n. 4
0
def test_track(performance_attrs, measure_list, meter, swing, section):
    # Test: List[Measure] and no instrument or performance_attrs
    # Expect a Track with measures, no instrument, no pa and Notes not having reassigned instrument or pa
    track = Track(to_add=measure_list, name=TRACK_NAME)
    assert track.measure_list == measure_list
    assert track.name == TRACK_NAME
    assert track.instrument == Track.DEFAULT_INSTRUMENT
    assert track._meter is None
    assert track._swing is None
    assert track._performance_attrs is None

    # Test: Section and no instrument or performance_attrs
    # Expect a Track with measures, no instrument, no pa and Notes not having reassigned instrument or pa
    track = Track(to_add=section)
    assert track.measure_list == section.measure_list
    assert track.instrument == Track.DEFAULT_INSTRUMENT
    assert track._meter is None
    assert track._swing is None
    assert track._performance_attrs is None

    # Test: List[Measure] with instrument, meter, swing and performance_attrs
    # Expect a Track with measures and all other attributes
    track = Track(to_add=measure_list,
                  instrument=INSTRUMENT,
                  meter=meter,
                  swing=swing,
                  performance_attrs=performance_attrs)
    assert track.measure_list == measure_list
    assert track.instrument == INSTRUMENT
    assert track._meter == meter
    assert track._swing == swing
    assert track._performance_attrs == performance_attrs

    # Test: List[Measure] with instrument, meter, swing and performance_attrs
    # Expect a Track with measures and all other attributes
    track = Track(to_add=section,
                  instrument=INSTRUMENT,
                  meter=meter,
                  swing=swing,
                  performance_attrs=performance_attrs)
    assert track.measure_list == section.measure_list
    assert track.instrument == INSTRUMENT
    assert track._meter == meter
    assert track._swing == swing
    assert track._performance_attrs == performance_attrs
Esempio n. 5
0
def test_init_set_get_instrument(measure_list, section):
    track = Track(to_add=measure_list, instrument=INSTRUMENT)
    for measure in track:
        for note in measure:
            assert note.instrument == INSTRUMENT
    assert track.get_attr('instrument') == [1, 1, 1, 1] + [1, 1, 1, 1]
    assert track.instrument == INSTRUMENT

    new_instrument = INSTRUMENT + 1
    track.instrument = new_instrument
    for measure in track:
        for note in measure:
            assert note.instrument == new_instrument
    assert track.instrument == new_instrument
    assert track.get_attr('instrument') == [
        new_instrument, new_instrument, new_instrument, new_instrument,
        new_instrument, new_instrument, new_instrument, new_instrument
    ]
Esempio n. 6
0
    def copy(source: 'Song') -> 'Song':
        track_list = None
        if source.track_list:
            track_list = [Track.copy(track) for track in source.track_list]

        return Song(to_add=track_list,
                    name=source.name,
                    meter=source._meter,
                    swing=source._swing,
                    performance_attrs=source._performance_attrs)
Esempio n. 7
0
    def add_track(self,
                  track_name: str = None,
                  instrument: Union[float, int] = None) -> Track:
        validate_type('track_name', track_name, str)
        validate_type_choice('instrument', instrument, (float, int))

        track_name = track_name or str(self._next_track)
        track = Track(meter=self.meter,
                      swing=self.swing, name=track_name,
                      instrument=instrument)
        self.append(track)
        self.num_tracks += 1
        self._track_name_idx_map[track_name] = self._next_track
        self._next_track += 1
        return track
Esempio n. 8
0
                  beat_note_dur=BEAT_DUR,
                  tempo=TEMPO_QPM)
    swing = Swing(swing_range=SWING_RANGE)
    measure = Measure(num_notes=NUM_NOTES,
                      meter=meter,
                      swing=swing,
                      mn=DEFAULT_NOTE_CONFIG())
    for i in range(NUM_NOTES):
        measure[i].instrument = INSTRUMENT_1_ID
        measure[i].start = (i % NUM_NOTES) * DUR
        measure[i].duration = DUR
        measure[i].amplitude = BASE_AMP
        measure[i].pitch = PITCH
    measure.apply_swing()
    track = Track(to_add=[measure],
                  name='ostinato',
                  instrument=INSTRUMENT_1_ID)
    song = Song(to_add=[track], name=SONG_NAME)

    orchestra = CSoundOrchestra(instruments=INSTRUMENTS,
                                sampling_rate=SR,
                                ksmps=KSMPS,
                                num_channels=NCHNLS)

    # Play song with CSD player
    player = CSoundCSDPlayer(csound_orchestra=orchestra, song=song)
    player.set_score_header_lines(SCORE_HEADER_LINES)
    player.play()
    # Comment this out to test code below it
    # player.loop()
Esempio n. 9
0
def track(measure_list, performance_attrs):
    return Track(to_add=measure_list,
                 name=TRACK_NAME,
                 performance_attrs=performance_attrs)