Exemple #1
0
    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
Exemple #2
0
    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))
Exemple #3
0
    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))