Initial commit
This commit is contained in:
commit
04a1f6e018
15
LICENSE
Normal file
15
LICENSE
Normal file
@ -0,0 +1,15 @@
|
||||
ISC License
|
||||
|
||||
Copyright (c) 2019, acidvegas <acid.vegas@acid.vegas>
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software for any
|
||||
purpose with or without fee is hereby granted, provided that the above
|
||||
copyright notice and this permission notice appear in all copies.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
78
mzk/constants.py
Normal file
78
mzk/constants.py
Normal file
@ -0,0 +1,78 @@
|
||||
#!/usr/bin/env python
|
||||
# mzk music theory helper - developed by acidvegas in python (https://acid.vegas/mzk)
|
||||
# constants.py
|
||||
|
||||
circle = ''' major
|
||||
|
||||
C
|
||||
F G
|
||||
♮
|
||||
1♭ 1♯
|
||||
a
|
||||
B♭ d c D
|
||||
2♭ 2♯
|
||||
g minor b
|
||||
|
||||
|
||||
E♭ 3♭ c f♯ 3♯ A
|
||||
|
||||
|
||||
f c♯
|
||||
4♭ 4
|
||||
A♭ b♭ g♯ E
|
||||
e♭/d♯
|
||||
5♭/7♯ 7♭/5♯
|
||||
6♭/6♯
|
||||
D♭ B
|
||||
G♭/F♯
|
||||
C♯ C♭'''
|
||||
|
||||
colors = {
|
||||
'gray' : '\033[0;90m',
|
||||
'red' : '\033[0;91m',
|
||||
'green' : '\033[0;92m',
|
||||
'reset' : '\033[0m'
|
||||
}
|
||||
|
||||
intervals = {
|
||||
'unison' : {'semitones':0, 'short_name':'P1' },
|
||||
'minor_second' : {'semitones':1, 'short_name':'m2' },
|
||||
'major_second' : {'semitones':2, 'short_name':'M2' },
|
||||
'minor_third' : {'semitones':3, 'short_name':'m3' },
|
||||
'major_third' : {'semitones':4, 'short_name':'M3' },
|
||||
'perfect_fourth' : {'semitones':5, 'short_name':'P4' },
|
||||
'augmented_fourth' : {'semitones':6, 'short_name':'+4' },
|
||||
'diminished_fifth' : {'semitones':6, 'short_name':'d5' },
|
||||
'perfect_fifth' : {'semitones':7, 'short_name':'P5' },
|
||||
'minor_sixth' : {'semitones':8, 'short_name':'m6' },
|
||||
'major_sixth' : {'semitones':9, 'short_name':'M6' },
|
||||
'minor_seventh' : {'semitones':10, 'short_name':'m7' },
|
||||
'major_seventh' : {'semitones':11, 'short_name':'M7' },
|
||||
'perfect_octave' : {'semitones':12, 'short_name':'8va'}
|
||||
}
|
||||
|
||||
notes = ('A', 'A#', 'B', 'C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#' )
|
||||
numerals = ('I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X', 'XI', 'XII' )
|
||||
scale_degrees = ('tonic','supertonic','mediant','subdominant','dominant''submediant','subtonic')
|
||||
|
||||
scales = {
|
||||
'algerian' : '2131131',
|
||||
'aeolian' : '2122122',
|
||||
'blues' : '321132',
|
||||
'chromatic' : '1111111',
|
||||
'dorian' : '2122212',
|
||||
'half_whole_diminished' : '12121212',
|
||||
'harmonic_minor' : '2122131',
|
||||
'ionian' : '2212221',
|
||||
'locrian' : '1221222',
|
||||
'lydian' : '2221221',
|
||||
'major' : '2212221',
|
||||
'major_pentatonic' : '22323',
|
||||
'melodic_minor' : '2122221',
|
||||
'mixolydian' : '2212212',
|
||||
'natural_minor' : '2122122',
|
||||
'persian' : '1311231',
|
||||
'phrygian' : '1222122',
|
||||
'whole_half_diminished' : '21212121',
|
||||
'whole_tone' : '2222222'
|
||||
}
|
153
mzk/functions.py
Normal file
153
mzk/functions.py
Normal file
@ -0,0 +1,153 @@
|
||||
#!/usr/bin/env python
|
||||
# mzk music theory helper - developed by acidvegas in python (https://acid.vegas/mzk)
|
||||
# functions.py
|
||||
|
||||
import constants
|
||||
|
||||
def generate_notes(key):
|
||||
notes = ['A','A#','B','C','C#','D','D#','E','F','F#','G','G#']
|
||||
while notes[0] != key:
|
||||
notes.append(notes.pop(0))
|
||||
return notes
|
||||
|
||||
def generate_scale(string, scale_notes, full=False):
|
||||
notes = generate_notes(string.upper())*2 if full else generate_notes(string.upper())
|
||||
notes.append(notes[0]) # add root note to the end
|
||||
for index,note in enumerate(notes):
|
||||
if note in scale_notes:
|
||||
notes[index] = notes[index].center(5, '-')
|
||||
else:
|
||||
notes[index] = '-'*5
|
||||
return notes
|
||||
|
||||
def get_pattern(pattern):
|
||||
new_pattern = list()
|
||||
for step in pattern:
|
||||
if step == '1' : new_pattern.append('H')
|
||||
elif step == '2' : new_pattern.append('W')
|
||||
elif step == '3' : new_pattern.append('WH')
|
||||
return ' '.join(new_pattern)
|
||||
|
||||
def scale(type, key):
|
||||
last = 0
|
||||
notes = generate_notes(key)
|
||||
scale_notes = [notes[0],]
|
||||
for step in scales[type]:
|
||||
last += int(step)
|
||||
if last >= len(notes):
|
||||
last -= len(notes)
|
||||
scale_notes.append(notes[last])
|
||||
return scale_notes
|
||||
|
||||
def print_chord():
|
||||
# todo: finish this
|
||||
print('◯ ⬤ ')
|
||||
print('''╳ ╳ ╳ ╳ ╳ ╳
|
||||
┌───┬───┬───┬───┬───┐
|
||||
│ │ │ │ │ │
|
||||
├───┼───┼───┼───┼───┤
|
||||
│ │ │ │ │ │
|
||||
├───┼───┼───┼───┼───┤
|
||||
│ │ │ │ │ │
|
||||
├───┼───┼───┼───┼───┤
|
||||
│ │ │ │ │ │
|
||||
├───┼───┼───┼───┼───┤
|
||||
│ │ │ │ │ │
|
||||
└───┴───┴───┴───┴───┘
|
||||
E A D G B e''')
|
||||
|
||||
def print_circle_of_fifths():
|
||||
'''
|
||||
definition:
|
||||
the relationship among the 12 tones of the chromatic scale, their corresponding key signatures, & the associated major/minor keys
|
||||
|
||||
accidentals:
|
||||
sharps - F, C, G, D, A, E, B
|
||||
flats - B, E, A, D, G, C, F
|
||||
|
||||
intervals:
|
||||
unison
|
||||
perfect fifth
|
||||
major sencond
|
||||
major sixth
|
||||
major third
|
||||
major seventh
|
||||
augmented fourth
|
||||
minor second
|
||||
minor sixth
|
||||
minor third
|
||||
minor seventh
|
||||
perfect fourth
|
||||
'''
|
||||
circle = constants.circle.replace('\n',' \n') + ' ' # todo: fix this
|
||||
for note in ('major','C','F','B♭','E♭','A♭','D♭','C♯','G♭/F♯','B','C♭','E','A','D','G'): # todo: reverse
|
||||
circle = circle.replace(f' {note} ', f' \033[91m{note}\033[0m ')
|
||||
for item in ('♮','1♭','2♭','3♭','4♭','5♭/7♯','6♭/6♯','7♭/5♯','4','3♯','2♯','1♯'):
|
||||
circle = circle.replace(f' {item} ', f' \033[90m{item}\033[0m ')
|
||||
for note in ('minor','a','d','g','c','f','b♭','e♭/d♯','g♯','c♯','f♯','b','c'):
|
||||
circle = circle.replace(f' {note} ', f' \033[92m{note}\033[0m ')
|
||||
print(circle)
|
||||
#print(print_circle_of_fifths.__doc__)
|
||||
|
||||
def print_intervals():
|
||||
'''
|
||||
definition:
|
||||
the distance between two notes or pitches
|
||||
|
||||
note:
|
||||
semitone - half step
|
||||
tone - whole step (b to c & e to f is a tone)
|
||||
|
||||
types:
|
||||
harmonic interval - notes played simultaneously
|
||||
melodic interval - notes played successively
|
||||
|
||||
makeup:
|
||||
quantity - distance between two notes
|
||||
quality - number of semitones between notes
|
||||
|
||||
qualities:
|
||||
major/minor - 2nds, 3rds, 6ths, 7ths
|
||||
perfect - 4ths, 5ths, octaves
|
||||
diminished - minor/perfect - 1 semitone
|
||||
augmented - major/perfect + 1 semitone
|
||||
'''
|
||||
print(' I N T E R V A L S ')
|
||||
print('┌───────────┬──────────────────┬───────┐')
|
||||
print('│ semitones │ quality │ short │')
|
||||
print('├───────────┼──────────────────┼───────┤')
|
||||
for interval, info in constants.intervals.items():
|
||||
print('│ {0} │ {1} │ {2} │'.format(str(info['semitones']).rjust(9), interval.ljust(16), info['short_name'].ljust(5)))
|
||||
print('└───────────┴──────────────────┴───────┘')
|
||||
#print(print_intervals.__doc__)
|
||||
|
||||
def print_scale(root, type, full=False):
|
||||
frets = (24,147) if full else (12,75)
|
||||
print(f'{root.upper()} {type.upper()} SCALE'.center(frets[1]))
|
||||
print(' ┌' + '┬'.join('─'*5 for x in range(frets[0])) + '┐')
|
||||
print('0 │' + '│'.join(str(x).center(5) for x in range(1,frets[0]+1)) + '│')
|
||||
print(' ├' + '┼'.join('─'*5 for x in range(frets[0])) + '┤')
|
||||
scale_notes = scale(type, root)
|
||||
for string in ('eBGDAE'):
|
||||
string_notes = generate_scale(string, scale_notes, full)
|
||||
print(string + ' │' + '│'.join(note.center(5, '-') for note in string_notes[1:]) + '│')
|
||||
print(' └' + '┴'.join('─'*5 for x in range(frets[0])) + '┘')
|
||||
print((', '.join(scale_notes) + ' / ' + get_pattern(scales[type])).rjust(frets[1]))
|
||||
|
||||
def print_scales():
|
||||
'''
|
||||
definition:
|
||||
any set of musical notes ordered by fundamental frequency or pitch
|
||||
|
||||
note:
|
||||
1 - half step
|
||||
2 - whole step
|
||||
3 - whole step half step'''
|
||||
print(' S C A L E S ')
|
||||
print('┌───────────────────────┬─────────────────┐')
|
||||
print('│ name │ intervals │')
|
||||
print('├───────────────────────┼─────────────────┤')
|
||||
for name, pattern in constants.scales.items():
|
||||
print(f'│ {name.ljust(21)} │ {get_pattern(pattern).rjust(15)} │')
|
||||
print('└───────────────────────┴─────────────────┘')
|
||||
#print(print_scales.__doc__)
|
6
mzk/main.py
Normal file
6
mzk/main.py
Normal file
@ -0,0 +1,6 @@
|
||||
#!/usr/bin/env python
|
||||
# mzk music theory helper - developed by acidvegas in python (https://acid.vegas/mzk)
|
||||
# main.py
|
||||
|
||||
import argparser
|
||||
import sys
|
Loading…
Reference in New Issue
Block a user