Skip to content

mjkaufer/jamnetic-algorhythms

master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.

Jamnetic Algorhythms

Using genetica algorithms to improvise over midi

Demo

Setup

Must use python 3.6

  • Run pip install -r requirements.txt (or pip3 if you don't have a virtualenv set up)
  • Run python main.py or python3 main.py
  • The pieces will be written out to /pieces
    • To change the piece being generated, modify the piece_num variable to represent the index you want

To add your own pieces, observe minor_swing.py and replace the mxl file with your musicxml file, and the chord progression with a corresponding chord progression. Then, import your new python file into main.py

Algorithm Thoughts

  • GAs for jazz standard - all of me
    • melody only tho, but maintain info about chord progressions
  • Mutation = take random note in a measure, maybe for 4 random measures
    • (should we weight based on note length or nah)
    • (or maybe weight based on 'strength' of note position, i.e. notes that fall on beat 1 weighted higher than beats on & of 2)
      1. 0.25 probability of picking a random chord tone / note in the key?
      • maybe consider whether or not it's on strong beat
      • add any domain knowledge, or nah?
    • 2a. 0.125 probability of copying a random note already in the measure
    • 2b. 0.125 probability of transposing up/down a whole note
      • 0.5 up, 0.5 down
    • 3a. 0.25 (1 - quanta/4) probability of becoming leading note, chromatic up or down depending on beat?
      • quanta = 1 for quarter note, .5 for eighth, etc.
    • 3b. 0.25 * (quanta/4) probability of becoming split
      • 0.5 prob of even split
      • 0.25 of triplet
      • 0.25 of dotted and
        • 0.5 of short beat first
        • 0.5 of long beat first
      • apply rules 1,2,4, 7 to new notes
      • apply some min/max, where quanta turns to 0 if it's sixteenth note, also no triplet splitting
      1. 0.05 probability of picking note from bar with same chord progression
      • if no such bars exist, we reweight and ignore this possibility
      1. 0.05 probability of shifting all notes
      • 0.5 of going to right, 0.5 of going to left
      1. 0.05 probability of shuffling notes
      • 0.5 of just shuffling notes themselves
      • 0.5 of shuffling notes + rhythmic structure
      1. 0.05 probability of dropping note
      1. 0.05 probability of swapping notes
  • Crossover ideas
    • split/join
      • Take half of bar and combine to half of other bar
      • probably better to add whole measures
      • alternate every measure?
      • take first half from one and second from other?
  • reduce
    • pick pieces w/ highest fitness, leave in some wonky ones, bc "that's jazz"
  • fitness function
    • dock points for no note variation
    • dock points for all notes identical to original
    • dock points for having 0 notes from chord progression
    • dock points for only having notes from chord progression
    • dock points for too many jumps
    • dock points if first note is an ugly interval off chord root (half step, 6 half steps, ignoring notes where it should belong like a maj7 / m7b5) Other thoughts
  • add inversions to chords
  • consider weighting everything based on quanta & 1-quanta
  • have a corpus of jazz standards to borrow phrases from
  • add different improvs of all of me to the initial population
  • dock points if duration is wonky number
  • plus points for repitition of musical phrases / rhythmic combinations?

About

๐Ÿ› ๐ŸŽผ Using genetic algorithms to improvise over jazz standards

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages