Example #1
0
    def generate_interval(self) -> (Interval, Pitch, Pitch):
        # Generate first random pitch
        pitch_generator = PitchGenerator(scale=self._scale,
                                         lowest_pitch=self._lowest_pitch,
                                         highest_pitch=self._highest_pitch,
                                         possible_detune=0)
        pitch1 = pitch_generator.generate_pitch()

        # Generate second random pitch
        possible_pitches = list()
        for pitch in self._scale.get_pitches(from_pitch=self._lowest_pitch,
                                             to_pitch=self._highest_pitch):
            interval = Interval.from_pitches(
                from_pitch=Pitch.lower(pitch1, pitch),
                to_pitch=Pitch.higher(pitch1, pitch))
            if self._largest_interval.get_cents()\
                    >= interval.get_cents()\
                    >= self._smallest_interval.get_cents():
                possible_pitches.append(pitch)
        pitch2 = random.choice(possible_pitches)

        # Return interval and pitches
        output_pitch1 = Pitch.from_pitch(pitch=Pitch.lower(pitch1, pitch2),
                                         detune=random.uniform(
                                             -self._possible_detune / 2,
                                             self._possible_detune / 2))
        output_pitch2 = Pitch.from_pitch(pitch=Pitch.higher(pitch1, pitch2),
                                         detune=random.uniform(
                                             -self._possible_detune / 2,
                                             self._possible_detune / 2))
        output_interval = Interval.from_pitches(from_pitch=output_pitch1,
                                                to_pitch=output_pitch2)
        return output_interval, output_pitch1, output_pitch2
Example #2
0
 def __init__(self,
              scale=Scale('12-TET (A=440Hz)'),
              lowest_pitch=Pitch.from_midi(21),
              highest_pitch=Pitch.from_midi(108),
              possible_detune=1.0,
              smallest_interval=Interval.from_name('unison'),
              largest_interval=Interval.from_name('octave')):
     self._scale = scale
     self._lowest_pitch = lowest_pitch
     self._highest_pitch = highest_pitch
     self._possible_detune = possible_detune
     self._smallest_interval = smallest_interval
     self._largest_interval = largest_interval
Example #3
0
    def generate_chord(self) -> Chord:
        # Get all available pitches
        available_pitches = self._scale.get_pitches(
            from_pitch=self._lowest_pitch, to_pitch=self._highest_pitch)

        chosen_pitches = list()
        for i in range(self._chord_size):
            # Choose random pitch
            new_pitch = random.choice(available_pitches)
            chosen_pitches.append(new_pitch)

            # Remove unavailable pitches from list
            new_available_pitches = list()
            for pitch in available_pitches:
                if self._smallest_interval.get_cents()\
                        <= abs(Interval.from_pitches(
                            pitch,
                            new_pitch
                        ).get_cents())\
                        <= self._largest_interval.get_cents():
                    new_available_pitches.append(pitch)
            available_pitches = new_available_pitches

        # Return chord
        return Chord(chosen_pitches)
Example #4
0
 def largest_interval_changed(self):
     self.exercise.set_largest_interval(
         Interval.from_cents(
             int(self.setting_window.get_setting("largest_interval"))
         )
     )
    def __init__(self, scale_type=None):
        """
        List of avaliable musical intervals.
        """
        self._intervals = list()
        self._detune = 0.0

        if scale_type == None:
            pass

        elif scale_type == 'Whole Tone Fractions':
            self._intervals.append(Interval.from_cents(200.00))  # 1
            self._intervals.append(Interval.from_cents(100.00))  # 1/2
            self._intervals.append(Interval.from_cents(50.00))  # 1/4
            self._intervals.append(Interval.from_cents(25.00))  # 1/8
            self._intervals.append(Interval.from_cents(12.50))  # 1/16
            self._intervals.append(Interval.from_cents(6.25))  # 1/32
            self._intervals.append(Interval.from_cents(3.125))  # 1/64
            self._intervals.append(Interval.from_cents(0))
        elif scale_type == 'Thirds':
            self._intervals.append(Interval.from_cents(400.00))  # 12-TET M3
            self._intervals.append(Interval.from_cents(386.31))  # 5:4
            self._intervals.append(Interval.from_cents(350.00))  # 24-TET m3+1
            self._intervals.append(Interval.from_cents(315.64))  # 6:5
            self._intervals.append(Interval.from_cents(300.00))  # 12-TET m3
        elif scale_type == 'Fifths':
            self._intervals.append(
                Interval.from_cents(737.59))  # Meantone wulf's
            self._intervals.append(Interval.from_cents(701.96))  # 3:2
            self._intervals.append(Interval.from_cents(700.00))  # TET-12 P5
            self._intervals.append(Interval.from_cents(696.77))  # TET-31 P5
            self._intervals.append(
                Interval.from_cents(678.45))  # Pythagorean wulf's

        # Raise error
        else:
            raise RuntimeError(
                '[Scale::__init__()] Unknown scale type "'\
                + scale_type\
                + '"!'
            )