# 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

PIP: `pipx install atonatui`
ARCH: `yay -S python-atonatui`

## Main Page

The main page consists of a 12 Tone Matrix. 

The only part of the main page that really needs explaining is the tri-colored table below the matrix. 
- The TONE row contains the tones of P0 row. 
- RTHM is the rhythmic division assigned to a given note.
- OCTV is the octave assigned to a given note.

The rhythmic division and octave will always be the same for their associated note, the order just changes when you play a row other than P0.

When you do begin playback, this tri-colored table will be replaced with the row that is currently being played.

## Commands

| Command  | Action  | Page  |
|---|---|---|
| `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

# Upcoming Features
- Support independent generation, saving, and loading for rhythm and octave rows
- Support loading of custom soundfonts
- Support custom input of Tone Row + Rhythm and Octave rows
- Output rows to midi
- Up arrow functionality so users can rerun commands easily
