Easily generate simple midi backing tracks with matched chord voicings, swing, and randomization. Note sequences are generated via Markov chain.
midigen --key C --chords ii9 V7 I9 vi7 --loop 5 --tempo 90 --swing 0.05 -o ii-V-i-vi.mid
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)
# make 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 the base triad - try adding extensions
extensions=[7],
# pick 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)