54 lines
1.7 KiB
Python
54 lines
1.7 KiB
Python
# minimal counting function used for review
|
|
|
|
chromatic_scale = ['A', 'A#', 'B', 'C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#']
|
|
note_value = {e:i for i, e in enumerate(chromatic_scale)}
|
|
seven_chord_interval_name = {
|
|
'M7#5':(4,4,3),
|
|
'M7':(4,3,4),
|
|
'7':(4,3,3),
|
|
'mM7':(3,4,4),
|
|
'm7':(3,4,3),
|
|
'm7b5':(3,3,4),
|
|
'dim7':(3,3,3),
|
|
}
|
|
major_scale_intervals = [2,2,1,2,2,2,1]
|
|
|
|
def get_major_scale(root):
|
|
scale = []
|
|
scale.append(root)
|
|
root_index = note_value[root]
|
|
for interval in major_scale_intervals:
|
|
root_index = (root_index + interval) % 12
|
|
scale.append(chromatic_scale[root_index])
|
|
return scale
|
|
|
|
def get_number_of_half_steps(note1, note2):
|
|
return min(abs(note_value[note1] - note_value[note2]), 12 - abs(note_value[note1] - note_value[note2]))
|
|
|
|
def _construct_chord(root, interval_type=(4,3,3)):
|
|
chord = []
|
|
chord.append(root)
|
|
root_index = note_value[root]
|
|
for interval in interval_type:
|
|
root_index = (root_index + interval) % 12
|
|
chord.append(chromatic_scale[root_index])
|
|
return chord
|
|
|
|
words=""
|
|
|
|
while words != "quit":
|
|
words = input("Enter a note or chord: ")
|
|
notes = words.split(" ")
|
|
if notes[0][1:] in seven_chord_interval_name.keys():
|
|
# construct dominant 7 chord
|
|
chord = _construct_chord(notes[0][0],seven_chord_interval_name[notes[0][1:]])
|
|
print(chord,get_major_scale(notes[0][0]))
|
|
else:
|
|
# calculate the interval between notes
|
|
res=[]
|
|
for i in range(len(notes)-1):
|
|
if notes[i] not in note_value or notes[i+1] not in note_value:
|
|
print("Invalid note")
|
|
break
|
|
res.append(get_number_of_half_steps(notes[i], notes[i+1]))
|
|
print(res) |