# Twelve Tone Generator

TUI Application for composing serialism music.

Features:
- Generate 12 Tone Matrix
- Play 12 Tone rows with over 15 instruments
- Loop and/or Sequence 12 tone rows
- Generate Serialized Octave Sequences based on tone matrix
- Generate Serialized Rhythm Sequences based on tone matrix
- Save Matrices and Other Sequences for later use

## Installation Guide


## Commands

| Command  | Action  | Page  | Notes  |
|---|---|---|---|
| `P0-P11`  | Play Prime Row  | Main Page  |    |
| `I0-I11`  | Play Inversion Row  | Main Page  |    |
| `R0-R11`  | Play Retrograde Row  | Main Page  |   |
| `i0-i11`  | Play Retrograde Inversion Row  | Main Page  |   | 
| `loop <count> <P0-i11>`  | Play row X times in loop | Main Page  |   | 
| `seq <P0-i11>,<P0-i11>... `  | Play sequence of rows, comma separated  | Main Page  |   | 
| `r` OR `regen`  | Regenerate Matrix  | Main Page  |   | 
| `s` OR `settings` | Go To Settings Page  | Main Page  |   | 
| `h` OR `help`  | Open This Document  | Main Page  |   | 
| `q` OR `quit`  | Quit Application  | Main Page, Settings Page  |   | 
| Setting ID  | Edit Setting  | Settings Page  |   | 

__Advanced Commands:__
- Loop a sequence:
    - `loop <x> seq <P0-i11>,<P0-i11>`
    - Example: `loop 5 seq P0,R3,i11,I0`
- Debug
    - `debug`: Open up python console via breakpoint()

## Settings:
    
- BPM
    - Set the BPM of the overall project, between 30 - 300 BPM
- INSTRUMENT
    - Select an instrument for playback
- OCTAVE
    - Select base octave for playback
- OCTAVE_RANDOMIZATION
    - `0` Only play base octave
    - `1` Randomize octaves, increasing octave range by +1 and -1 (example: base octave = 3, octave range = 2-4)
    - `2` Randomize octaves, increasing octave range by +2 and -2 (example: base octave = 3, octave range = 1-5)
    - `3` Randomize octaves, increasing octave range by +3 and -3 (example: base octave = 1, octave range = 1-4)
        - When the range would result in an octave higher than 5 or lower than 0, it clamps range to fit 0-5
- RHYTHM_COMPLEXITY
    - `0` No Rhythmic Complexity, Will play default division
    - `1` Will play a rhythm based on sequence generated by tone matrix
    - `2` Will play a rhythm based on sequence generated by tone matrix, Including rests (if rest probability is greater than 0)
    - `3` Will play a random rhythm not based on a sequence
- DEFAULT_DIVISION
    - `0` Whole Note
    - `1` Half Note
    - `2` Quarter Note
    - `3` Eight Note
- REST_PROBABILITY
    - The probability in which a rest will occur during playback when RHYTHM_COMPLEXITY = 2
- SAVE_SETTINGS
    - Save current settings to a file, will automatically load when you restart the program 
- SAVE_MATRIX
    - Save the current tone matrix to a file, you can manually load this later
- LOAD_MATRIX
    - Load a previously saved tone matrix
