midigen

Easily generate simple midi backing tracks with matched chord voicings, swing, and randomization. Note sequences are generated via Markov chain.

Example Output

Command Line Tool

midigen --key C --chords ii9 V7 I9 vi7 --loop 5 --tempo 90 --swing 0.05 -o ii-V-i-vi.mid

Python

from midigen.notes import Note
from midigen.keys import Key, Mode
from midigen.time import TimeSignature, Measure
from midigen.sequencer import Song, Track, open_output


# Open new MIDI port
port = open_output()

# Play C minor scale
Key(Note.C, Mode.Minor).to_track().play(port)

# Create a simple ii V I vi chord progression in the key of C
key = Key(Note.C, Mode.Major)
time_signature = TimeSignature(4, 4)
tempo = 90
progression = [2, 5, 1, 6]

chords = Track.from_measures([
    Measure.from_pattern(
        pattern=[
            key.relative_key(degree).chord(
                # Default chords are base triads - try adding extensions
                extensions=[7],
                # Choose a voicing close to the root triad
                match_voicing=key.triad()
            )
        ] * time_signature.numerator,
        time_signature=time_signature,
        velocity=90
    )
    for degree in progression
])

# Play to port
chords.play(port, tempo=tempo)

# Write the song to a MIDI file
Song([chords]).to_midi('midigen.mid', tempo=tempo)