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
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
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
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
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 ]
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)
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
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()
def track(measure_list, performance_attrs): return Track(to_add=measure_list, name=TRACK_NAME, performance_attrs=performance_attrs)