예제 #1
0
 def get_chord(self, root, is_major):
     third = root + 4 if is_major else root + 3
     fifth = root + 7
     return Chord(
         [self.get_note(root),
          self.get_note(third),
          self.get_note(fifth)])
예제 #2
0
    def get_real_universe_dist(cls, U, V):
        zero_hit = (Chord([Note('c0')]), 0)
        if len(U) == 0:
            U = [zero_hit]
        if len(V) == 0:
            V = [zero_hit]

        # sum(dist(u,v) for all u,v)
        total_sum = 0
        for u in U:
            for v in V:
                total_sum += cls.get_real_pairwise_dist(u, v)

        normed_sum = total_sum / (len(U) * len(V))
        return normed_sum
예제 #3
0
def generate_song(
    notes_per_chord,
    num_repeats,
    note_time=0.25,
    prog_intervals=(7, 2, -4j, 5)
):
    # generate a random major key
    root = Note(rand.choice(Note.NOTES))
    scale_notes = Scale(root, 'major')

    octave = 3
    progression = Chord.progression(
        Scale(
            root,
            [int(p.real + p.imag) for p in prog_intervals]
        ),
        octave
    )
    for i, z in enumerate(prog_intervals):
        if z.imag != 0:
            # TODO: cannot have a repeated chord be minor
            progression[i] = major_to_minor(progression[i])

    # generates a melody for the progression
    low_octave = 4
    prev_note = rand.choice(list(scale_notes)).at_octave(low_octave)
    melody = []
    for _ in range(notes_per_chord * len(progression) * num_repeats):
        note_dist = int(round(rand.gauss(0, 2)))
        prev_note = scale_notes.transpose(prev_note, note_dist)
        melody.append(prev_note)

    # build up the HLR from the melody progression
    song = []
    t = 0
    for i in range(num_repeats):
        for chord in progression:
            song.append(
                (t*note_time, chord, note_time*notes_per_chord)
            )
            t += notes_per_chord

    for i in range(len(melody)):
        note = melody[i]
        song.append((i*note_time, Chord([note]), note_time))

    return song
예제 #4
0
    def get_hlr_from_latent(self, latent):
        song = []
        t = 0
        for i in range(self.num_repeats):
            for j in range(self.num_chords):
                chord_root = latent[2 * j]
                is_major = latent[2 * j + 1]
                chord = self.get_chord(chord_root, is_major)
                song.append((t * self.time_per_note, chord,
                             self.time_per_note * self.notes_per_chord))
                t += self.notes_per_chord

        num_melody_notes = self.num_repeats * self.num_chords
        num_melody_notes *= self.notes_per_chord
        offset = 2 * self.num_chords
        for i in range(num_melody_notes):
            song.append((i * self.time_per_note,
                         Chord([self.get_note(latent[offset + i])]),
                         self.time_per_note))

        return song
예제 #5
0
def major_to_minor(chord):
    root = chord.notes[0]
    third = chord.notes[1]
    minor_third = third.transpose(-1)
    fifth = chord.notes[2]
    return Chord([root, minor_third, fifth])