def get_random_rest(self, longest_duration: Optional[int] = None) -> Rest: """ Wygeneruj pauzę z losowymi parametrami o maksymalnej długości podanej w parametrze Args: longest_duration: Najdłuższa możliwa wartość rytmiczna, która może wystąpić podana w ilości shortest_note_duration. Jeśli nie podano, skrypt zakłada że nuta o każdej długości jest dozwolona. Returns: Pauza z losowymi parametrami o maksymalnej długości wynoszącej longest_duration """ # Jeśli nie był podany parametr najdłuższej możliwej wartości rytmicznej, to zakładamy że nuta o każdej długości # jest dozwolona do wygenerowania if longest_duration is None: longest_duration = self.shortest_note_duration # Pobieramy listę dostępnych wartości rytmicznych i tworzymy listę dostępnych modyfikatorów available_mods = [] base_duration = self.get_random_duration( longest_duration=longest_duration) has_mod = np.random.choice([True, False]) rest = Rest(base_duration=base_duration) # Jeśli długość nuty jest najkrótsza jaką możemy uzyskać, to nie możemy dodać modyfikatora wydłużającego, # gdyż kropka lub podwójna kropka doda mniejszą wartość rytmiczną if base_duration >= self.shortest_note_duration: has_mod = False # Jeśli dostępne miejsce jest większej lub równej długości niż potencjalna pauza z kropką, to do dostępnych # modyfikatorów możemy dodać przedłużenie w postaci kropki if longest_duration >= rest.get_duration( self.shortest_note_duration) * 1.5: available_mods.append(RestModifier.DOT) # Jeśli dostępne miejsce jest większej lub równej długości niż potencjalna pauza z podwójną kropką, to do # dostępnych modyfikatorów możemy dodać przedłużenie w postaci podwójnej kropki. # Sprawdzamy również, czy nie jest to przedostatnia dostępna wartość rytmiczna. Jeśli tak jest, to nie możemy # dodać podwójnej kropki, gdyż skutkowałoby to dodaniem pauzy o połowę mniejszej wartości rytmicznej niż # dozwolona if longest_duration >= rest.get_duration(self.shortest_note_duration) * 1.75 \ and rest.base_duration > 2 * self.shortest_note_duration: available_mods.append(RestModifier.DOUBLE_DOT) if has_mod and len(available_mods) > 0: rest.add_modifier(np.random.choice(available_mods)) return rest
def test_get_duration_with_double_dot(self): rest = Rest() rest.add_modifier(RestModifier.DOUBLE_DOT) lengths = [64, 32, 16] for length in lengths: self.assertEqual(length / 4 + length / 8 + length / 16, rest.get_duration(length))
def test_get_duration(self): rest = Rest() lengths = [64, 32, 16, 8, 4] for length in lengths: self.assertEqual(length / 4, rest.get_duration(length))