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
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
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)
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\ + '"!' )