├── code ├── random_pitch_class_pattern.py ├── pressing_scales_common_tones.py ├── get_two_triad_combos.py ├── bright_dark.py ├── pitch_class_subsets.py ├── scale_change_rules.py └── pressing_modes.py ├── mode_brightness_darkness.xlsx ├── figures ├── scale_modes_bright_dark.png ├── 7_note_pressing_scale_network.png ├── all_with_8_harmonic_maj-min.png └── major_harmonic-maj_harmonic-min.png ├── tables ├── all_seven_note_modes_sorted_dark_to_bright.csv ├── all_six_note_triad_combos.csv ├── dom7_extensions_brightness_sorted_aggregated.csv ├── pruned_bd_digraph.csv ├── dom7_extensions_brightness_sorted.csv ├── common_tone_matrix.csv ├── final_sorted_pitch_class_brightness.csv └── all_two_triads_ranked.csv ├── LICENSE └── readme.md /code/random_pitch_class_pattern.py: -------------------------------------------------------------------------------- 1 | #specify the brightness pattern you want and optionally scale type 2 | 3 | 4 | -------------------------------------------------------------------------------- /mode_brightness_darkness.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TylerMclaughlin/computational_harmony_v2/HEAD/mode_brightness_darkness.xlsx -------------------------------------------------------------------------------- /figures/scale_modes_bright_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TylerMclaughlin/computational_harmony_v2/HEAD/figures/scale_modes_bright_dark.png -------------------------------------------------------------------------------- /figures/7_note_pressing_scale_network.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TylerMclaughlin/computational_harmony_v2/HEAD/figures/7_note_pressing_scale_network.png -------------------------------------------------------------------------------- /figures/all_with_8_harmonic_maj-min.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TylerMclaughlin/computational_harmony_v2/HEAD/figures/all_with_8_harmonic_maj-min.png -------------------------------------------------------------------------------- /figures/major_harmonic-maj_harmonic-min.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TylerMclaughlin/computational_harmony_v2/HEAD/figures/major_harmonic-maj_harmonic-min.png -------------------------------------------------------------------------------- /tables/all_seven_note_modes_sorted_dark_to_bright.csv: -------------------------------------------------------------------------------- 1 | ,root,scale_type,common_name,brightness,contains_root,notes 2 | 18,E,harmonic_minor,Mixolydian #1,2,False,"[4, 6, 7, 9, 11, 0, 3]" 3 | 8,E,melodic_minor,Ionian #1,3,False,"[4, 6, 7, 9, 11, 1, 3]" 4 | 14,Bb,melodic_minor,Phrygian b1,9,False,"[10, 0, 1, 3, 5, 7, 9]" 5 | 29,F,harmonic_major,Aeolian b1,10,False,"[5, 7, 9, 10, 0, 1, 4]" 6 | 23,Eb,harmonic_minor,Altered b7,-5,True,"[3, 5, 6, 8, 10, 11, 2]" 7 | 31,Eb,harmonic_major,Locrian b7,-4,True,"[3, 5, 7, 8, 10, 11, 2]" 8 | 15,Eb,melodic_minor,Altered,-4,True,"[3, 5, 6, 8, 10, 0, 2]" 9 | 30,Bb,harmonic_major,Phrygian b4,-3,True,"[10, 0, 2, 3, 5, 6, 9]" 10 | 6,Eb,major,Locrian,-3,True,"[3, 5, 7, 8, 10, 0, 2]" 11 | 22,C,harmonic_minor,Locrian #6,-2,True,"[0, 2, 3, 5, 7, 8, 11]" 12 | 5,Bb,major,Phrygian,-2,True,"[10, 0, 2, 3, 5, 7, 9]" 13 | 13,F,melodic_minor,Aeolian b5,-2,True,"[5, 7, 8, 10, 0, 2, 4]" 14 | 28,C,harmonic_major,Dorian b5,-1,True,"[0, 2, 4, 5, 7, 8, 11]" 15 | 21,G,harmonic_minor,Phrygian #3,-1,True,"[7, 9, 10, 0, 2, 3, 6]" 16 | 4,F,major,Aeolian,-1,True,"[5, 7, 9, 10, 0, 2, 4]" 17 | 12,C,melodic_minor,Dorian b2,-1,True,"[0, 2, 3, 5, 7, 9, 11]" 18 | 27,G,harmonic_major,Mixolydian b2,0,True,"[7, 9, 11, 0, 2, 3, 6]" 19 | 20,D,harmonic_minor,Harmonic Minor,0,True,"[2, 4, 5, 7, 9, 10, 1]" 20 | 3,C,major,Dorian,0,True,"[0, 2, 4, 5, 7, 9, 11]" 21 | 11,G,melodic_minor,Mixolydian b6,0,True,"[7, 9, 10, 0, 2, 4, 6]" 22 | 26,D,harmonic_major,Harmonic major,1,True,"[2, 4, 6, 7, 9, 10, 1]" 23 | 19,A,harmonic_minor,Dorian #4,1,True,"[9, 11, 0, 2, 4, 5, 8]" 24 | 2,G,major,Mixolydian,1,True,"[7, 9, 11, 0, 2, 4, 6]" 25 | 10,D,melodic_minor,Melodic Minor,1,True,"[2, 4, 5, 7, 9, 11, 1]" 26 | 25,A,harmonic_major,Lydian b3,2,True,"[9, 11, 1, 2, 4, 5, 8]" 27 | 1,D,major,Ionian,2,True,"[2, 4, 6, 7, 9, 11, 1]" 28 | 9,A,melodic_minor,Lydian Dominant,2,True,"[9, 11, 0, 2, 4, 6, 8]" 29 | 17,B,harmonic_minor,Ionian #5,3,True,"[11, 1, 2, 4, 6, 7, 10]" 30 | 0,A,major,Lydian,3,True,"[9, 11, 1, 2, 4, 6, 8]" 31 | 16,F#,harmonic_minor,Lydian #2,4,True,"[6, 8, 9, 11, 1, 2, 5]" 32 | 7,B,melodic_minor,Lydian #5,4,True,"[11, 1, 2, 4, 6, 8, 10]" 33 | 24,F#,harmonic_major,Lydian #5 #2,5,True,"[6, 8, 10, 11, 1, 2, 5]" 34 | -------------------------------------------------------------------------------- /code/pressing_scales_common_tones.py: -------------------------------------------------------------------------------- 1 | note_names = ['C','C#','D','Eb','E','F','F#','G','Ab','A','Bb','B'] 2 | 3 | major = [0,2,4,5,7,9,11] 4 | melodic_minor = [0,2,3,5,7,9,11] 5 | harmonic_major = [0,2,4,5,7,8,11] 6 | harmonic_minor = [0,2,3,5,7,8,11] 7 | # symmetric 8 | octatonic = [0,1,3,4,6,7,9,10] 9 | augmented = [0,3,4,7,8,11] 10 | wholetone = [0,2,4,6,8,10] 11 | 12 | 13 | def transpose(scale, n): 14 | return [(x + n) % 12 for x in scale] 15 | 16 | def n_common_tones(scale_a, scale_b): 17 | inters = set(scale_a).intersection( set(scale_b)) 18 | return len(inters) 19 | 20 | def build_scale_dict(): 21 | 22 | scale_dict = {} 23 | for degree, note in enumerate(note_names): 24 | scale_dict[(note_names[degree], 'major')] = transpose(major, degree) 25 | scale_dict[(note_names[degree], 'melodic_minor')] =\ 26 | transpose(melodic_minor, degree) 27 | scale_dict[(note_names[degree], 'harmonic_major')] =\ 28 | transpose(harmonic_major, degree) 29 | scale_dict[(note_names[degree], 'harmonic_minor')] =\ 30 | transpose(harmonic_minor, degree) 31 | if note in ['C', 'F', 'G']: 32 | scale_dict[(note_names[degree], 'octatonic')] =\ 33 | transpose(octatonic, degree) 34 | if note in ['C', 'F', 'G', 'Bb']: 35 | scale_dict[(note_names[degree], 'augmented')] =\ 36 | transpose(augmented, degree) 37 | if note in ['C', 'F']: 38 | scale_dict[(note_names[degree], 'wholetone')] =\ 39 | transpose(wholetone, degree) 40 | return scale_dict 41 | 42 | scale_dict = build_scale_dict() 43 | 44 | minor_pentatonic = [0, 3, 5, 7, 10] 45 | 46 | def print_minor_penta_intersections(): 47 | penta_dist = {} 48 | for scale, notes in scale_dict.items(): 49 | penta_dist[scale] = n_common_tones(notes, minor_pentatonic) 50 | 51 | for i in reversed(range(6)): 52 | print(i) 53 | sub_dict = {k : v for k,v in penta_dist.items() if v == i} 54 | print(sub_dict) 55 | 56 | def print_minor_penta_perfect_fits(): 57 | """ only perfect overlaps 58 | [0, 3, 5, 7] overlapping scales, [0, 3, 7, 10] overlapping scales, etc. 59 | """ 60 | for r in range(0,5): 61 | penta_sub = [x for i, x in enumerate(minor_pentatonic) if i!=r] 62 | penta_dist = {} 63 | for scale, notes in scale_dict.items(): 64 | penta_dist[scale] = n_common_tones(notes, penta_sub) 65 | sub_dict = {k : v for k,v in penta_dist.items() if v == 4} 66 | print(penta_sub) 67 | for x in sub_dict.keys(): 68 | print(x) 69 | 70 | 71 | -------------------------------------------------------------------------------- /tables/all_six_note_triad_combos.csv: -------------------------------------------------------------------------------- 1 | ,lower,offset,upper,mode,parent_scale_type,brightness,mean_brightness 2 | 0,dim,- 3,maj,Altered b7,harmonic_minor,[-5],-5.0 3 | 1,aug,+ 6,min,Altered b7,harmonic_minor,[-5],-5.0 4 | 2,dim,+ 1,min,Altered b7; Altered,harmonic_minor; melodic_minor,"[-5, -4]",-4.5 5 | 3,aug,+ 3,min,Altered,melodic_minor,[-4],-4.0 6 | 4,aug,+ 6,maj,Altered,melodic_minor,[-4],-4.0 7 | 5,dim,- 2,dim,Altered,melodic_minor,[-4],-4.0 8 | 6,dim,+ 1,maj,Locrian b7; Locrian,harmonic_major; major,"[-4, -3]",-3.5 9 | 7,aug,+ 3,maj,Phrygian b4,harmonic_major,[-3],-3.0 10 | 8,min,- 2,dim,Phrygian b4,harmonic_major,[-3],-3.0 11 | 9,min,+ 1,min,Phrygian b4,harmonic_major,[-3],-3.0 12 | 10,dim,+ 1,aug,Locrian b7; Locrian #6,harmonic_major; harmonic_minor,"[-4, -2]",-3.0 13 | 11,dim,- 2,min,Locrian; Locrian #6,major; harmonic_minor,"[-3, -2]",-2.5 14 | 12,dim,+ 2,dim,Aeolian b5,melodic_minor,[-2],-2.0 15 | 13,aug,- 5,dim,Phrygian b4; Phrygian #3,harmonic_major; harmonic_minor,"[-3, -1]",-2.0 16 | 14,min,+ 1,maj,Phrygian,major,[-2],-2.0 17 | 15,min,- 2,min,Phrygian; Dorian b2,major; melodic_minor,"[-2, -1]",-1.5 18 | 16,dim,- 2,maj,Aeolian b5; Dorian b5,melodic_minor; harmonic_major,"[-2, -1]",-1.5 19 | 17,maj,+ 1,maj,Phrygian #3,harmonic_minor,[-1],-1.0 20 | 18,aug,- 2,min,Phrygian #3,harmonic_minor,[-1],-1.0 21 | 19,min,+ 1,aug,Dorian b2,melodic_minor,[-1],-1.0 22 | 20,dim,+ 2,min,Dorian b5,harmonic_major,[-1],-1.0 23 | 21,maj,- 2,min,Phrygian #3; Mixolydian b2,harmonic_minor; harmonic_major,"[-1, 0]",-0.5 24 | 22,min,- 2,maj,Aeolian; Dorian,major; major,"[-1, 0]",-0.5 25 | 23,min,+ 2,dim,Aeolian; Harmonic Minor,major; harmonic_minor,"[-1, 0]",-0.5 26 | 24,min,+ 5,dim,Harmonic Minor,harmonic_minor,[0],0.0 27 | 25,min,- 4,dim,Harmonic Minor,harmonic_minor,[0],0.0 28 | 26,aug,- 5,min,Mixolydian b6,melodic_minor,[0],0.0 29 | 27,aug,- 2,maj,Mixolydian b6,melodic_minor,[0],0.0 30 | 28,aug,+ 3,dim,Altered b7; Lydian #5 #2,harmonic_minor; harmonic_major,"[-5, 5]",0.0 31 | 29,maj,+ 1,aug,Mixolydian b2,harmonic_major,[0],0.0 32 | 30,maj,+ 2,dim,Mixolydian b6; Harmonic major,melodic_minor; harmonic_major,"[0, 1]",0.5 33 | 31,min,- 1,dim,Harmonic Minor; Melodic Minor,harmonic_minor; melodic_minor,"[0, 1]",0.5 34 | 32,min,+ 2,min,Dorian; Melodic Minor,major; melodic_minor,"[0, 1]",0.5 35 | 33,maj,- 2,maj,Mixolydian b6; Mixolydian,melodic_minor; major,"[0, 1]",0.5 36 | 34,maj,+ 5,dim,Harmonic major,harmonic_major,[1],1.0 37 | 35,maj,- 4,dim,Harmonic major,harmonic_major,[1],1.0 38 | 36,min,+ 2,aug,Dorian #4,harmonic_minor,[1],1.0 39 | 37,maj,+ 2,min,Mixolydian; Ionian,major; major,"[1, 2]",1.5 40 | 38,maj,- 1,dim,Harmonic major; Ionian,harmonic_major; major,"[1, 2]",1.5 41 | 39,min,+ 2,maj,Dorian #4; Lydian b3,harmonic_minor; harmonic_major,"[1, 2]",1.5 42 | 40,min,- 1,min,Lydian b3,harmonic_major,[2],2.0 43 | 41,maj,+ 2,aug,Lydian Dominant,melodic_minor,[2],2.0 44 | 42,aug,- 1,dim,Harmonic major; Ionian #5,harmonic_major; harmonic_minor,"[1, 3]",2.0 45 | 43,maj,+ 2,maj,Lydian Dominant; Lydian,melodic_minor; major,"[2, 3]",2.5 46 | 44,aug,+ 2,min,Ionian #5,harmonic_minor,[3],3.0 47 | 45,maj,- 1,min,Lydian,major,[3],3.0 48 | 46,maj,- 1,maj,Lydian #2,harmonic_minor,[4],4.0 49 | 47,maj,+ 3,dim,Lydian #2,harmonic_minor,[4],4.0 50 | 48,aug,- 1,min,Lydian #5,melodic_minor,[4],4.0 51 | 49,aug,+ 2,maj,Lydian #5,melodic_minor,[4],4.0 52 | 50,dim,+ 4,maj,Lydian #5 #2,harmonic_major,[5],5.0 53 | -------------------------------------------------------------------------------- /code/get_two_triad_combos.py: -------------------------------------------------------------------------------- 1 | import os 2 | import numpy as np 3 | import pandas as pd 4 | 5 | pd.set_option('display.max_rows', 1000) 6 | pd.set_option('display.max_columns', 10) 7 | 8 | atoms = {'maj' : [0,4, 7], 'min' : [0, 3, 7], 'dim' : [0, 3, 6], 'aug' : [0, 4, 8]} 9 | 10 | 11 | bright_dark_csv = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'all_seven_note_modes_sorted_dark_to_bright.csv') 12 | bd = pd.read_csv(bright_dark_csv) 13 | 14 | bd = bd[bd.contains_root == True] 15 | bd['notes'] = bd['notes'].apply(eval) 16 | 17 | 18 | list_of_dicts = [] 19 | for a_lower, ns_lower in atoms.items(): 20 | for a_upper, ns_upper in atoms.items(): 21 | for t in range(12): 22 | transp = sorted([(n + t) % 12 for n in ns_upper]) 23 | pitches = sorted(list(set(ns_lower + transp))) 24 | if t > 6: 25 | t_printable = '- ' + str(12 - t) 26 | else: 27 | t_printable = '+ ' + str(t) 28 | for index, row in bd.iterrows(): 29 | m_set = set(row['notes']) 30 | # because bright dark csv is in D 31 | pitches_in_d = set([(p + 2) % 12 for p in pitches]) 32 | if set(pitches_in_d).issubset(m_set): 33 | brightness = row['brightness'] 34 | mode_name = row['common_name'] 35 | scale_type = row['scale_type'] 36 | d = {'lower' : a_lower, 'offset' : t_printable,\ 37 | 'upper' : a_upper, 'pitches' : pitches,\ 38 | 'n_pitch_classes' : len(pitches), 'brightness' : brightness,\ 39 | 'parent_scale_type' : scale_type, 'mode' : mode_name } 40 | list_of_dicts.append(d) 41 | 42 | def aggregate_chords(df): 43 | df = (df.groupby(['lower','offset','upper']) 44 | .agg({'mode': lambda x: "; ".join(x),'parent_scale_type':lambda x: "; ".join(x),\ 45 | 'brightness': lambda x: x.tolist()}).reset_index()) 46 | #.agg({'mode': lambda x: x.tolist(),'parent_scale_type':lambda x: x.tolist(),\ 47 | # 'brightness': lambda x: x.tolist()}).reset_index()) 48 | df['n_compatible_modes'] = [np.array(x).shape[0] for x in df.brightness.values] 49 | #df['mean_brightness'] = np.mean(df['brightness'].tolist(), axis=1) 50 | df['mean_brightness'] = [np.array(x).mean() for x in df.brightness.values] 51 | df.drop(columns = ['n_compatible_modes'], inplace = True) 52 | df = df.sort_values(by=['mean_brightness'], ascending= True).reset_index(drop = True) 53 | return df 54 | 55 | all_2_triads = pd.DataFrame(list_of_dicts) 56 | print(all_2_triads) 57 | # drop duplicates. workaround is because lists are unhashable 58 | all_2_triads_dedup = all_2_triads.loc[all_2_triads.astype(str).drop_duplicates(subset = ['pitches', 'mode']).index] 59 | 60 | six_note_chords = all_2_triads_dedup[all_2_triads_dedup['n_pitch_classes'] == 6] 61 | agg = aggregate_chords(six_note_chords) 62 | agg.to_csv('all_six_note_triad_combos.csv') 63 | #print(agg) 64 | #print(six_note_chords.sort_values(by = 'brightness').reset_index()) 65 | 66 | all_11th_like = all_2_triads[all_2_triads.offset.isin(['- 1', '- 2', '- 3'])] 67 | all_11th_like = all_11th_like[all_11th_like['n_pitch_classes'] == 6] 68 | agg = aggregate_chords(all_11th_like) 69 | #print(agg) 70 | 71 | -------------------------------------------------------------------------------- /tables/dom7_extensions_brightness_sorted_aggregated.csv: -------------------------------------------------------------------------------- 1 | ,extensions (pitch classes),compatible modes,parent scale types,brightness 2 | 0,[],Altered; Phrygian b4; Phrygian #3; Mixolydian b2; Mixolydian b6; Mixolydian; Lydian Dominant,melodic_minor; harmonic_major; harmonic_minor; harmonic_major; melodic_minor; major; melodic_minor,"[-4, -3, -1, 0, 0, 1, 2]" 3 | 1,[7],Phrygian b4; Phrygian #3; Mixolydian b2; Mixolydian b6; Mixolydian; Lydian Dominant,harmonic_major; harmonic_minor; harmonic_major; melodic_minor; major; melodic_minor,"[-3, -1, 0, 0, 1, 2]" 4 | 2,"[5, 7]",Phrygian #3; Mixolydian b2; Mixolydian b6; Mixolydian,harmonic_minor; harmonic_major; melodic_minor; major,"[-1, 0, 0, 1]" 5 | 3,[5],Phrygian #3; Mixolydian b2; Mixolydian b6; Mixolydian,harmonic_minor; harmonic_major; melodic_minor; major,"[-1, 0, 0, 1]" 6 | 4,[1],Altered; Phrygian b4; Phrygian #3; Mixolydian b2,melodic_minor; harmonic_major; harmonic_minor; harmonic_major,"[-4, -3, -1, 0]" 7 | 5,[8],Altered; Phrygian b4; Phrygian #3; Mixolydian b6,melodic_minor; harmonic_major; harmonic_minor; melodic_minor,"[-4, -3, -1, 0]" 8 | 6,"[2, 7]",Mixolydian b6; Mixolydian; Lydian Dominant,melodic_minor; major; melodic_minor,"[0, 1, 2]" 9 | 7,[2],Mixolydian b6; Mixolydian; Lydian Dominant,melodic_minor; major; melodic_minor,"[0, 1, 2]" 10 | 8,"[7, 9]",Mixolydian b2; Mixolydian; Lydian Dominant,harmonic_major; major; melodic_minor,"[0, 1, 2]" 11 | 9,[9],Mixolydian b2; Mixolydian; Lydian Dominant,harmonic_major; major; melodic_minor,"[0, 1, 2]" 12 | 10,"[1, 7]",Phrygian b4; Phrygian #3; Mixolydian b2,harmonic_major; harmonic_minor; harmonic_major,"[-3, -1, 0]" 13 | 11,"[7, 8]",Phrygian b4; Phrygian #3; Mixolydian b6,harmonic_major; harmonic_minor; melodic_minor,"[-3, -1, 0]" 14 | 12,"[1, 8]",Altered; Phrygian b4; Phrygian #3,melodic_minor; harmonic_major; harmonic_minor,"[-4, -3, -1]" 15 | 13,"[1, 5, 7]",Phrygian #3; Mixolydian b2,harmonic_minor; harmonic_major,"[-1, 0]" 16 | 14,"[1, 5]",Phrygian #3; Mixolydian b2,harmonic_minor; harmonic_major,"[-1, 0]" 17 | 15,"[2, 5, 7]",Mixolydian b6; Mixolydian,melodic_minor; major,"[0, 1]" 18 | 16,"[2, 5]",Mixolydian b6; Mixolydian,melodic_minor; major,"[0, 1]" 19 | 17,"[5, 7, 8]",Phrygian #3; Mixolydian b6,harmonic_minor; melodic_minor,"[-1, 0]" 20 | 18,"[5, 7, 9]",Mixolydian b2; Mixolydian,harmonic_major; major,"[0, 1]" 21 | 19,"[5, 8]",Phrygian #3; Mixolydian b6,harmonic_minor; melodic_minor,"[-1, 0]" 22 | 20,"[5, 9]",Mixolydian b2; Mixolydian,harmonic_major; major,"[0, 1]" 23 | 21,[6],Altered; Lydian Dominant,melodic_minor; melodic_minor,"[-4, 2]" 24 | 22,"[2, 7, 9]",Mixolydian; Lydian Dominant,major; melodic_minor,"[1, 2]" 25 | 23,"[2, 9]",Mixolydian; Lydian Dominant,major; melodic_minor,"[1, 2]" 26 | 24,"[1, 7, 8]",Phrygian b4; Phrygian #3,harmonic_major; harmonic_minor,"[-3, -1]" 27 | 25,"[1, 3, 8]",Altered; Phrygian b4,melodic_minor; harmonic_major,"[-4, -3]" 28 | 26,"[1, 3]",Altered; Phrygian b4,melodic_minor; harmonic_major,"[-4, -3]" 29 | 27,"[3, 8]",Altered; Phrygian b4,melodic_minor; harmonic_major,"[-4, -3]" 30 | 28,[3],Altered; Phrygian b4,melodic_minor; harmonic_major,"[-4, -3]" 31 | 29,"[1, 5, 7, 9]",Mixolydian b2,harmonic_major,[0] 32 | 30,"[1, 5, 9]",Mixolydian b2,harmonic_major,[0] 33 | 31,"[1, 7, 9]",Mixolydian b2,harmonic_major,[0] 34 | 32,"[1, 9]",Mixolydian b2,harmonic_major,[0] 35 | 33,"[2, 5, 7, 8]",Mixolydian b6,melodic_minor,[0] 36 | 34,"[2, 5, 8]",Mixolydian b6,melodic_minor,[0] 37 | 35,"[2, 7, 8]",Mixolydian b6,melodic_minor,[0] 38 | 36,"[2, 8]",Mixolydian b6,melodic_minor,[0] 39 | 37,"[1, 5, 7, 8]",Phrygian #3,harmonic_minor,[-1] 40 | 38,"[1, 5, 8]",Phrygian #3,harmonic_minor,[-1] 41 | 39,"[2, 5, 7, 9]",Mixolydian,major,[1] 42 | 40,"[2, 5, 9]",Mixolydian,major,[1] 43 | 41,"[2, 6, 7, 9]",Lydian Dominant,melodic_minor,[2] 44 | 42,"[2, 6, 7]",Lydian Dominant,melodic_minor,[2] 45 | 43,"[2, 6, 9]",Lydian Dominant,melodic_minor,[2] 46 | 44,"[2, 6]",Lydian Dominant,melodic_minor,[2] 47 | 45,"[6, 7, 9]",Lydian Dominant,melodic_minor,[2] 48 | 46,"[6, 7]",Lydian Dominant,melodic_minor,[2] 49 | 47,"[6, 9]",Lydian Dominant,melodic_minor,[2] 50 | 48,"[1, 3, 7, 8]",Phrygian b4,harmonic_major,[-3] 51 | 49,"[1, 3, 7]",Phrygian b4,harmonic_major,[-3] 52 | 50,"[3, 7, 8]",Phrygian b4,harmonic_major,[-3] 53 | 51,"[3, 7]",Phrygian b4,harmonic_major,[-3] 54 | 52,"[1, 3, 6, 8]",Altered,melodic_minor,[-4] 55 | 53,"[1, 3, 6]",Altered,melodic_minor,[-4] 56 | 54,"[1, 6, 8]",Altered,melodic_minor,[-4] 57 | 55,"[1, 6]",Altered,melodic_minor,[-4] 58 | 56,"[3, 6, 8]",Altered,melodic_minor,[-4] 59 | 57,"[3, 6]",Altered,melodic_minor,[-4] 60 | 58,"[6, 8]",Altered,melodic_minor,[-4] 61 | -------------------------------------------------------------------------------- /code/bright_dark.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | from pressing_modes import pruned_bd 3 | from pressing_scales_common_tones import scale_dict 4 | 5 | #print(pruned_bd) 6 | 7 | # arrange manually 8 | rel_scales = {k : v for k, v in scale_dict.items() if k in pruned_bd.columns} 9 | #print(len(rel_scales)) 10 | 11 | def absolute_brightness(notes): 12 | # subtract 2 because everything relative to d dorian. we want the root to be zero 13 | notes = [(n - 2)%12 for n in notes] 14 | return sum(notes) 15 | 16 | def build_abs_brightness(): 17 | list_of_dicts = [] 18 | for s, ns in rel_scales.items(): 19 | root = s[0] 20 | scale_type = s[1] 21 | ab = absolute_brightness(ns) - 36 # 36 is the brightness of C 22 | contains_root = (2 in ns) 23 | scale_entry = {'root' : root, 'scale_type' : scale_type, 'brightness' : ab, 'contains_root' : contains_root, 'notes' : ns} 24 | list_of_dicts.append(scale_entry) 25 | df = pd.DataFrame(list_of_dicts) 26 | return df 27 | 28 | bd = build_abs_brightness() 29 | 30 | 31 | common_names = [] 32 | common_names.append({'root' : 'A', 'scale_type' : 'major', 'common_name' : 'Lydian'}) 33 | common_names.append({'root' : 'D', 'scale_type' : 'major', 'common_name' : 'Ionian'}) 34 | common_names.append({'root' : 'G', 'scale_type' : 'major', 'common_name' : 'Mixolydian'}) 35 | common_names.append({'root' : 'C', 'scale_type' : 'major', 'common_name' : 'Dorian'}) 36 | common_names.append({'root' : 'F', 'scale_type' : 'major', 'common_name' : 'Aeolian'}) 37 | common_names.append({'root' : 'Bb', 'scale_type' : 'major', 'common_name' : 'Phrygian'}) 38 | common_names.append({'root' : 'Eb', 'scale_type' : 'major', 'common_name' : 'Locrian'}) 39 | 40 | common_names.append({'root' : 'B', 'scale_type' : 'melodic_minor', 'common_name' : 'Lydian #5'}) 41 | common_names.append({'root' : 'E', 'scale_type' : 'melodic_minor', 'common_name' : 'Ionian #1'}) 42 | common_names.append({'root' : 'A', 'scale_type' : 'melodic_minor', 'common_name' : 'Lydian Dominant'}) 43 | common_names.append({'root' : 'D', 'scale_type' : 'melodic_minor', 'common_name' : 'Melodic Minor'}) 44 | common_names.append({'root' : 'G', 'scale_type' : 'melodic_minor', 'common_name' : 'Mixolydian b6'}) 45 | common_names.append({'root' : 'C', 'scale_type' : 'melodic_minor', 'common_name' : 'Dorian b2'}) 46 | common_names.append({'root' : 'F', 'scale_type' : 'melodic_minor', 'common_name' : 'Aeolian b5'}) 47 | common_names.append({'root' : 'Bb', 'scale_type' : 'melodic_minor', 'common_name' : 'Phrygian b1'}) 48 | common_names.append({'root' : 'Eb', 'scale_type' : 'melodic_minor', 'common_name' : 'Altered'}) 49 | 50 | common_names.append({'root' : 'F#', 'scale_type' : 'harmonic_minor', 'common_name' : 'Lydian #2'}) 51 | common_names.append({'root' : 'B', 'scale_type' : 'harmonic_minor', 'common_name' : 'Ionian #5'}) 52 | common_names.append({'root' : 'E', 'scale_type' : 'harmonic_minor', 'common_name' : 'Mixolydian #1'}) 53 | common_names.append({'root' : 'A', 'scale_type' : 'harmonic_minor', 'common_name' : 'Dorian #4'}) 54 | common_names.append({'root' : 'D', 'scale_type' : 'harmonic_minor', 'common_name' : 'Harmonic Minor'}) 55 | common_names.append({'root' : 'G', 'scale_type' : 'harmonic_minor', 'common_name' : 'Phrygian #3'}) 56 | common_names.append({'root' : 'C', 'scale_type' : 'harmonic_minor', 'common_name' : 'Locrian #6'}) 57 | common_names.append({'root' : 'Eb', 'scale_type' : 'harmonic_minor', 'common_name' : 'Altered b7'}) 58 | 59 | common_names.append({'root' : 'F#', 'scale_type' : 'harmonic_major', 'common_name' : 'Lydian #5 #2'}) 60 | common_names.append({'root' : 'A', 'scale_type' : 'harmonic_major', 'common_name' : 'Lydian b3'}) 61 | common_names.append({'root' : 'D', 'scale_type' : 'harmonic_major', 'common_name' : 'Harmonic major'}) 62 | common_names.append({'root' : 'G', 'scale_type' : 'harmonic_major', 'common_name' : 'Mixolydian b2'}) 63 | common_names.append({'root' : 'C', 'scale_type' : 'harmonic_major', 'common_name' : 'Dorian b5'}) 64 | common_names.append({'root' : 'F', 'scale_type' : 'harmonic_major', 'common_name' : 'Aeolian b1'}) 65 | common_names.append({'root' : 'Bb', 'scale_type' : 'harmonic_major', 'common_name' : 'Phrygian b4'}) 66 | common_names.append({'root' : 'Eb', 'scale_type' : 'harmonic_major', 'common_name' : 'Locrian b7'}) 67 | 68 | cdf = pd.DataFrame(common_names) 69 | 70 | bd = pd.merge(cdf, bd, on = ['root', 'scale_type'], how = 'inner' ) 71 | 72 | bd.sort_values(by = ['contains_root','brightness', 'scale_type'], inplace = True) 73 | 74 | bd.to_csv('all_seven_note_modes_sorted_dark_to_bright.csv') 75 | print(bd) 76 | 77 | 78 | -------------------------------------------------------------------------------- /tables/pruned_bd_digraph.csv: -------------------------------------------------------------------------------- 1 | ,,"('C', 'major')","('D', 'major')","('Eb', 'major')","('F', 'major')","('G', 'major')","('A', 'major')","('Bb', 'major')","('C', 'melodic_minor')","('C', 'harmonic_major')","('C', 'harmonic_minor')","('D', 'melodic_minor')","('D', 'harmonic_major')","('D', 'harmonic_minor')","('Eb', 'melodic_minor')","('Eb', 'harmonic_major')","('Eb', 'harmonic_minor')","('E', 'melodic_minor')","('E', 'harmonic_minor')","('F', 'melodic_minor')","('F', 'harmonic_major')","('F#', 'harmonic_major')","('F#', 'harmonic_minor')","('G', 'melodic_minor')","('G', 'harmonic_major')","('G', 'harmonic_minor')","('A', 'melodic_minor')","('A', 'harmonic_major')","('A', 'harmonic_minor')","('Bb', 'melodic_minor')","('Bb', 'harmonic_major')","('B', 'melodic_minor')","('B', 'harmonic_minor')" 2 | C,major,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 3 | D,major,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 4 | Eb,major,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 5 | F,major,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 6 | G,major,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 7 | A,major,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0 8 | Bb,major,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0 9 | C,melodic_minor,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 10 | C,harmonic_major,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 11 | C,harmonic_minor,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 12 | D,melodic_minor,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 13 | D,harmonic_major,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 14 | D,harmonic_minor,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 15 | Eb,melodic_minor,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 16 | Eb,harmonic_major,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 17 | Eb,harmonic_minor,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 18 | E,melodic_minor,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 19 | E,harmonic_minor,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 20 | F,melodic_minor,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 21 | F,harmonic_major,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0 22 | F#,harmonic_major,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0 23 | F#,harmonic_minor,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0 24 | G,melodic_minor,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 25 | G,harmonic_major,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 26 | G,harmonic_minor,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0 27 | A,melodic_minor,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0 28 | A,harmonic_major,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0 29 | A,harmonic_minor,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 30 | Bb,melodic_minor,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 31 | Bb,harmonic_major,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 32 | B,melodic_minor,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0 33 | B,harmonic_minor,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0 34 | -------------------------------------------------------------------------------- /code/pitch_class_subsets.py: -------------------------------------------------------------------------------- 1 | import os 2 | import numpy as np 3 | import pandas as pd 4 | from itertools import chain, combinations 5 | 6 | pd.set_option('display.max_rows', 1000) 7 | 8 | bright_dark_csv = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'all_seven_note_modes_sorted_dark_to_bright.csv') 9 | bd = pd.read_csv(bright_dark_csv) 10 | 11 | # keep things simple for now and only include scales containing D. 12 | bd = bd[bd.contains_root == True] 13 | bd['notes'] = bd['notes'].apply(eval) 14 | 15 | atoms = {'min7' : [0, 3, 7, 10], 'maj7' : [0, 4, 7, 11], 'dom7' : [0, 4, 7, 10 ], 'min7b5' : [0, 3, 6, 10], \ 16 | 'augMaj7' : [0, 4, 8, 11], 'minMaj7' : [0, 3, 7, 11], 'fabe' : [0, 4, 6, 11], \ 17 | 'min9' : [0, 3, 7, 10, 2], '9' : [0, 2, 4, 7, 10] , 'maj9' : [0, 2, 4, 7, 11]} 18 | 19 | def get_brightness(atom_name, notes): 20 | notes_rooted = [(n + 2) % 12 for n in notes] 21 | df_list = [] 22 | for t in range(12): 23 | transposed = [(n + t) % 12 for n in notes_rooted] 24 | if t > 6: 25 | t_printable = '- ' + str(12 - t) 26 | else: 27 | t_printable = '+ ' + str(t) 28 | t_set = set(transposed) 29 | for index, row in bd.iterrows(): 30 | m_set = set(row['notes']) 31 | if t_set.issubset(m_set): 32 | brightness = row['brightness'] 33 | mode_name = row['common_name'] 34 | scale_type = row['scale_type'] 35 | #print(f'{t_printable} {atom_name}: {brightness}, {scale}') 36 | df_list.append({'offset' : t_printable, 'atom_name' : atom_name, 'brightness' : brightness, 'parent_scale_type' : scale_type, 'mode' : mode_name }) 37 | return df_list 38 | 39 | def atoms_to_brightness(atoms): 40 | dfs = [] 41 | for a, ns in atoms.items(): 42 | df_list = get_brightness(a, ns) 43 | dfs.extend(df_list) 44 | out = pd.DataFrame(dfs) 45 | 46 | out.brightness = out.brightness.astype(int) 47 | return out 48 | 49 | 50 | def build_standard_4note_chord_brightness(atoms): 51 | out = atoms_to_brightness(atoms) 52 | out.sort_values(by = ['brightness', 'parent_scale_type'], inplace = True ) 53 | print(out) 54 | out.to_csv('final_sorted_pitch_class_brightness.csv') 55 | 56 | 57 | def get_dom7_exts_deprecated(): 58 | # this is incomplete because it's too tedious! use powerset instead 59 | dom7_atoms = {'7' : [], '7b5' : [6], '75' : [7], '7#5' : [8], 60 | '75#11' : [6,7], '7#11b13' : [6,8], '75b13' : [7,8], 61 | '7#115b13' : [6,7,8], 62 | '7b9' : [1], '7b5b9' : [1,6], '75b9' : [1,7], '7#5b9' : [1,8], '75b9#11' : [1,6,7], 63 | '7b9#11b13' : [1,6,8], '75b9b13' : [1,7,8], '7#115b13' : [6,7,8]} 64 | 65 | def powerset(iterable): 66 | "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)" 67 | s = list(iterable) 68 | return chain.from_iterable(combinations(s, r) for r in range(len(s)+1)) 69 | 70 | def get_all_dom7_exts(): 71 | n137 = [0, 4, 10] 72 | eligible_pitches = set(range(12)).difference(set(n137)) 73 | lp = list(powerset(eligible_pitches)) 74 | return lp 75 | 76 | def rank_dom7_exts(): 77 | all_dom7_exts = get_all_dom7_exts() 78 | print(all_dom7_exts) 79 | print(len(all_dom7_exts)) 80 | # 512... wow! of course, most of these aren't going to be in any scales examined. 81 | # ok for now, just name the chords by the list. 82 | dom7_atoms = {(str(list(x))) : sorted(list(x) + [0, 4, 10]) for x in all_dom7_exts} 83 | dom7_exts_ranked = atoms_to_brightness(dom7_atoms) 84 | dom7_exts_ranked = dom7_exts_ranked[dom7_exts_ranked.offset == '+ 0'] 85 | dom7_exts_ranked.sort_values(by = ['brightness', 'parent_scale_type'], inplace = True ) 86 | print(dom7_exts_ranked) 87 | dom7_exts_ranked.to_csv('dom7_extensions_brightness_sorted.csv') 88 | 89 | 90 | def aggregate_df_by_chord(df, save_as): 91 | df = (df.groupby(['atom_name']) 92 | .agg({'mode': lambda x: "; ".join(x),'parent_scale_type':lambda x: "; ".join(x),\ 93 | 'brightness': lambda x: x.tolist()}).reset_index()) 94 | #.agg({'mode': lambda x: x.tolist(),'parent_scale_type':lambda x: x.tolist(),\ 95 | # 'brightness': lambda x: x.tolist()}).reset_index()) 96 | df['n_compatible_modes'] = [np.array(x).shape[0] for x in df.brightness.values] 97 | #df['mean_brightness'] = np.mean(df['brightness'].tolist(), axis=1) 98 | df['mean_brightness'] = [abs(np.array(x).mean()) for x in df.brightness.values] 99 | df = df.sort_values(by=['n_compatible_modes', 'mean_brightness'], ascending=[False, True]).drop(columns=['n_compatible_modes', 'mean_brightness']) 100 | #df = df.sort_values(by='n_compatible_modes', ascending=False).drop(columns='n_compatible_modes') 101 | df.rename(columns = {'atom_name' : 'extensions (pitch classes)', 'mode' : 'compatible modes', 'parent_scale_type' : 'parent scale types'}, inplace = True) 102 | df = df.reset_index() 103 | df = df.drop(columns = 'index') 104 | print(df.to_markdown()) 105 | df.to_csv(save_as) 106 | 107 | if __name__ == '__main__': 108 | if not os.path.exists('dom7_extensions_brightness_sorted.csv'): 109 | rank_dom7_exts() 110 | dom7_ext_sorted = pd.read_csv('dom7_extensions_brightness_sorted.csv') 111 | aggregate_df_by_chord(dom7_ext_sorted, save_as = 'dom7_extensions_brightness_sorted_aggregated.csv') 112 | -------------------------------------------------------------------------------- /tables/dom7_extensions_brightness_sorted.csv: -------------------------------------------------------------------------------- 1 | ,offset,atom_name,brightness,parent_scale_type,mode 2 | 0,+ 0,[],-4,melodic_minor,Altered 3 | 49,+ 0,[1],-4,melodic_minor,Altered 4 | 98,+ 0,[3],-4,melodic_minor,Altered 5 | 140,+ 0,[6],-4,melodic_minor,Altered 6 | 196,+ 0,[8],-4,melodic_minor,Altered 7 | 245,+ 0,"[1, 3]",-4,melodic_minor,Altered 8 | 273,+ 0,"[1, 6]",-4,melodic_minor,Altered 9 | 301,+ 0,"[1, 8]",-4,melodic_minor,Altered 10 | 392,+ 0,"[3, 6]",-4,melodic_minor,Altered 11 | 406,+ 0,"[3, 8]",-4,melodic_minor,Altered 12 | 483,+ 0,"[6, 8]",-4,melodic_minor,Altered 13 | 539,+ 0,"[1, 3, 6]",-4,melodic_minor,Altered 14 | 553,+ 0,"[1, 3, 8]",-4,melodic_minor,Altered 15 | 595,+ 0,"[1, 6, 8]",-4,melodic_minor,Altered 16 | 686,+ 0,"[3, 6, 8]",-4,melodic_minor,Altered 17 | 735,+ 0,"[1, 3, 6, 8]",-4,melodic_minor,Altered 18 | 1,+ 0,[],-3,harmonic_major,Phrygian b4 19 | 50,+ 0,[1],-3,harmonic_major,Phrygian b4 20 | 99,+ 0,[3],-3,harmonic_major,Phrygian b4 21 | 154,+ 0,[7],-3,harmonic_major,Phrygian b4 22 | 197,+ 0,[8],-3,harmonic_major,Phrygian b4 23 | 246,+ 0,"[1, 3]",-3,harmonic_major,Phrygian b4 24 | 280,+ 0,"[1, 7]",-3,harmonic_major,Phrygian b4 25 | 302,+ 0,"[1, 8]",-3,harmonic_major,Phrygian b4 26 | 399,+ 0,"[3, 7]",-3,harmonic_major,Phrygian b4 27 | 407,+ 0,"[3, 8]",-3,harmonic_major,Phrygian b4 28 | 497,+ 0,"[7, 8]",-3,harmonic_major,Phrygian b4 29 | 546,+ 0,"[1, 3, 7]",-3,harmonic_major,Phrygian b4 30 | 554,+ 0,"[1, 3, 8]",-3,harmonic_major,Phrygian b4 31 | 602,+ 0,"[1, 7, 8]",-3,harmonic_major,Phrygian b4 32 | 693,+ 0,"[3, 7, 8]",-3,harmonic_major,Phrygian b4 33 | 742,+ 0,"[1, 3, 7, 8]",-3,harmonic_major,Phrygian b4 34 | 2,+ 0,[],-1,harmonic_minor,Phrygian #3 35 | 51,+ 0,[1],-1,harmonic_minor,Phrygian #3 36 | 112,+ 0,[5],-1,harmonic_minor,Phrygian #3 37 | 155,+ 0,[7],-1,harmonic_minor,Phrygian #3 38 | 198,+ 0,[8],-1,harmonic_minor,Phrygian #3 39 | 259,+ 0,"[1, 5]",-1,harmonic_minor,Phrygian #3 40 | 281,+ 0,"[1, 7]",-1,harmonic_minor,Phrygian #3 41 | 303,+ 0,"[1, 8]",-1,harmonic_minor,Phrygian #3 42 | 420,+ 0,"[5, 7]",-1,harmonic_minor,Phrygian #3 43 | 448,+ 0,"[5, 8]",-1,harmonic_minor,Phrygian #3 44 | 498,+ 0,"[7, 8]",-1,harmonic_minor,Phrygian #3 45 | 567,+ 0,"[1, 5, 7]",-1,harmonic_minor,Phrygian #3 46 | 581,+ 0,"[1, 5, 8]",-1,harmonic_minor,Phrygian #3 47 | 603,+ 0,"[1, 7, 8]",-1,harmonic_minor,Phrygian #3 48 | 700,+ 0,"[5, 7, 8]",-1,harmonic_minor,Phrygian #3 49 | 749,+ 0,"[1, 5, 7, 8]",-1,harmonic_minor,Phrygian #3 50 | 3,+ 0,[],0,harmonic_major,Mixolydian b2 51 | 52,+ 0,[1],0,harmonic_major,Mixolydian b2 52 | 113,+ 0,[5],0,harmonic_major,Mixolydian b2 53 | 156,+ 0,[7],0,harmonic_major,Mixolydian b2 54 | 224,+ 0,[9],0,harmonic_major,Mixolydian b2 55 | 260,+ 0,"[1, 5]",0,harmonic_major,Mixolydian b2 56 | 282,+ 0,"[1, 7]",0,harmonic_major,Mixolydian b2 57 | 322,+ 0,"[1, 9]",0,harmonic_major,Mixolydian b2 58 | 421,+ 0,"[5, 7]",0,harmonic_major,Mixolydian b2 59 | 462,+ 0,"[5, 9]",0,harmonic_major,Mixolydian b2 60 | 518,+ 0,"[7, 9]",0,harmonic_major,Mixolydian b2 61 | 568,+ 0,"[1, 5, 7]",0,harmonic_major,Mixolydian b2 62 | 588,+ 0,"[1, 5, 9]",0,harmonic_major,Mixolydian b2 63 | 616,+ 0,"[1, 7, 9]",0,harmonic_major,Mixolydian b2 64 | 714,+ 0,"[5, 7, 9]",0,harmonic_major,Mixolydian b2 65 | 756,+ 0,"[1, 5, 7, 9]",0,harmonic_major,Mixolydian b2 66 | 4,+ 0,[],0,melodic_minor,Mixolydian b6 67 | 77,+ 0,[2],0,melodic_minor,Mixolydian b6 68 | 114,+ 0,[5],0,melodic_minor,Mixolydian b6 69 | 157,+ 0,[7],0,melodic_minor,Mixolydian b6 70 | 199,+ 0,[8],0,melodic_minor,Mixolydian b6 71 | 329,+ 0,"[2, 5]",0,melodic_minor,Mixolydian b6 72 | 350,+ 0,"[2, 7]",0,melodic_minor,Mixolydian b6 73 | 371,+ 0,"[2, 8]",0,melodic_minor,Mixolydian b6 74 | 422,+ 0,"[5, 7]",0,melodic_minor,Mixolydian b6 75 | 449,+ 0,"[5, 8]",0,melodic_minor,Mixolydian b6 76 | 499,+ 0,"[7, 8]",0,melodic_minor,Mixolydian b6 77 | 623,+ 0,"[2, 5, 7]",0,melodic_minor,Mixolydian b6 78 | 637,+ 0,"[2, 5, 8]",0,melodic_minor,Mixolydian b6 79 | 665,+ 0,"[2, 7, 8]",0,melodic_minor,Mixolydian b6 80 | 701,+ 0,"[5, 7, 8]",0,melodic_minor,Mixolydian b6 81 | 763,+ 0,"[2, 5, 7, 8]",0,melodic_minor,Mixolydian b6 82 | 5,+ 0,[],1,major,Mixolydian 83 | 78,+ 0,[2],1,major,Mixolydian 84 | 115,+ 0,[5],1,major,Mixolydian 85 | 158,+ 0,[7],1,major,Mixolydian 86 | 225,+ 0,[9],1,major,Mixolydian 87 | 330,+ 0,"[2, 5]",1,major,Mixolydian 88 | 351,+ 0,"[2, 7]",1,major,Mixolydian 89 | 378,+ 0,"[2, 9]",1,major,Mixolydian 90 | 423,+ 0,"[5, 7]",1,major,Mixolydian 91 | 463,+ 0,"[5, 9]",1,major,Mixolydian 92 | 519,+ 0,"[7, 9]",1,major,Mixolydian 93 | 624,+ 0,"[2, 5, 7]",1,major,Mixolydian 94 | 644,+ 0,"[2, 5, 9]",1,major,Mixolydian 95 | 672,+ 0,"[2, 7, 9]",1,major,Mixolydian 96 | 715,+ 0,"[5, 7, 9]",1,major,Mixolydian 97 | 770,+ 0,"[2, 5, 7, 9]",1,major,Mixolydian 98 | 6,+ 0,[],2,melodic_minor,Lydian Dominant 99 | 79,+ 0,[2],2,melodic_minor,Lydian Dominant 100 | 141,+ 0,[6],2,melodic_minor,Lydian Dominant 101 | 159,+ 0,[7],2,melodic_minor,Lydian Dominant 102 | 226,+ 0,[9],2,melodic_minor,Lydian Dominant 103 | 343,+ 0,"[2, 6]",2,melodic_minor,Lydian Dominant 104 | 352,+ 0,"[2, 7]",2,melodic_minor,Lydian Dominant 105 | 379,+ 0,"[2, 9]",2,melodic_minor,Lydian Dominant 106 | 476,+ 0,"[6, 7]",2,melodic_minor,Lydian Dominant 107 | 490,+ 0,"[6, 9]",2,melodic_minor,Lydian Dominant 108 | 520,+ 0,"[7, 9]",2,melodic_minor,Lydian Dominant 109 | 651,+ 0,"[2, 6, 7]",2,melodic_minor,Lydian Dominant 110 | 658,+ 0,"[2, 6, 9]",2,melodic_minor,Lydian Dominant 111 | 673,+ 0,"[2, 7, 9]",2,melodic_minor,Lydian Dominant 112 | 728,+ 0,"[6, 7, 9]",2,melodic_minor,Lydian Dominant 113 | 777,+ 0,"[2, 6, 7, 9]",2,melodic_minor,Lydian Dominant 114 | -------------------------------------------------------------------------------- /code/scale_change_rules.py: -------------------------------------------------------------------------------- 1 | from pressing_scales_common_tones import major, melodic_minor, harmonic_major, harmonic_minor 2 | import pandas as pd 3 | import numpy as np 4 | import networkx as nx 5 | import matplotlib.pyplot as plt 6 | 7 | class JazzScale(): 8 | def __init__(self, root_number, scale_type): 9 | self.root = root_number % 12 10 | self.scale_type = scale_type 11 | assert scale_type in ['major', 'melodic_minor', 'harmonic_minor', 'harmonic_major' ] 12 | # transpose pitch classes 13 | self.update_scale_notes() 14 | 15 | def __eq__(self, other): 16 | if self.notes == other.notes: 17 | return True 18 | else: 19 | return False 20 | 21 | def update_scale_notes(self): 22 | if self.scale_type == 'major': 23 | self.notes = major 24 | elif self.scale_type == 'melodic_minor': 25 | self.notes = melodic_minor 26 | elif self.scale_type == 'harmonic_major': 27 | self.notes = harmonic_major 28 | elif self.scale_type == 'harmonic_minor': 29 | self.notes = harmonic_minor 30 | else: 31 | raise ValueError('scale type note ') 32 | 33 | self.notes = sorted([(x + self.root) % 12 for x in self.notes]) 34 | 35 | def modulate(self, transp, new_scale_type): 36 | self.root = (self.root + transp) % 12 37 | self.scale_type = new_scale_type 38 | self.update_scale_notes() 39 | 40 | 41 | # (scale type, type of change), : [ allowable transitions.] 42 | 43 | scale_rules = {('major', 'dark') : [(5, 'major'), (0, 'harmonic_major'), (0, 'melodic_minor')], 44 | ('melodic_minor', 'dark') : [(-2,'major'), (0, 'harmonic_minor') ], 45 | ('harmonic_major', 'dark') : [(5,'melodic_minor'), (0, 'harmonic_minor') ], 46 | ('harmonic_minor', 'dark') : [(3,'major'), (3, 'harmonic_major') ], 47 | ('major', 'bright') : [(-5, 'major'), (2, 'melodic_minor'), (-3, 'harmonic_minor')], 48 | ('melodic_minor', 'bright') : [(0, 'major'), (-5, 'harmonic_major')], 49 | ('harmonic_major', 'bright') : [(0, 'major'), (-3, 'harmonic_minor')], 50 | ('harmonic_minor', 'bright') : [(0, 'melodic_minor'), (0, 'harmonic_major')] 51 | } 52 | 53 | 54 | def build_dark_adjacency(): 55 | colnames = [] 56 | for scale in ['major', 'melodic_minor', 'harmonic_major', 'harmonic_minor']: 57 | for root in range(12): 58 | colnames.append((root, scale)) 59 | A = np.zeros((len(colnames), len(colnames)), dtype = int) 60 | for i, x in enumerate(colnames): 61 | possible_maps = scale_rules[(x[1], 'dark')] 62 | for j, y in enumerate(colnames): 63 | root_diff = (y[0] - x[0]) % 12 64 | if (root_diff, y[1]) in possible_maps: 65 | A[i,j] = 1 66 | 67 | A = pd.DataFrame(A, index = colnames, columns = colnames) 68 | return A 69 | 70 | 71 | def cycle_multiples(): 72 | A = build_dark_adjacency() 73 | powers = [A] 74 | An = A 75 | plt.matshow(An) 76 | plt.savefig(f'An_{0}.png') 77 | #plt.matshow(An) 78 | for c in range(36): 79 | An = A.dot(An) 80 | plt.matshow(An) 81 | plt.savefig(f'An_{c + 1}.png') 82 | powers.append(An) 83 | if An.to_numpy().trace() != 0: 84 | print(f'cycle detected for length {c}') 85 | print(An) 86 | diag = np.diagonal(An) 87 | print(diag.nonzero()) 88 | 89 | 90 | def dot_adj_vector(scale_index, max_dots = 12): 91 | vs = [] 92 | A = build_dark_adjacency() 93 | source_vec = np.zeros(A.shape[0]) 94 | # one-hot encode 95 | source_vec[scale_index] = 1 96 | new_vec = source_vec 97 | vs.append(new_vec) 98 | for d in range(max_dots + 1): 99 | new_vec = A.T.dot(new_vec) 100 | vs.append(new_vec) 101 | return vs 102 | 103 | 104 | def get_cycles(max_cycles): 105 | A = build_dark_adjacency() 106 | G = nx.from_pandas_adjacency(A, create_using = nx.DiGraph) 107 | basis = nx.cycle_basis(G, root = (0, 'major')) 108 | #edges = nx.find_cycle(G, source = (0, 'major'), orientation = 'original') 109 | return basis 110 | #cycles = nx.simple_cycles(G) 111 | #n_cycles_found = 0 112 | #for i, x in enumerate(cycles): 113 | # if x[0] == (0, 'major'): 114 | # print(f'cycle number {i}:') 115 | # print(f'{x}') 116 | # n_cycles_found += 1 117 | # if n_cycles_found > max_cycles: 118 | # return cycles 119 | #return cycles 120 | 121 | #A = build_dark_adjacency() 122 | 123 | 124 | 125 | # the scale matrices wee built before were subset to those neighboring the 7 modes starting on C. 126 | # these rules or a proper adjacency matrix would allow one to look for cycles without using the notes. 127 | 128 | # go from major to major via dark paths only. 129 | def find_cycles(start_scale, current_scale = None, history = []): 130 | """ 131 | start and current are a list of root and scale_type. 132 | """ 133 | if len(history) > 40: 134 | print('depth of 40 exceeded') 135 | return 136 | if current_scale is None: 137 | current_scale = start_scale 138 | # a list of allowable transitions 139 | eligible_rules = scale_rules[(start_scale.scale_type, 'dark')] 140 | for rule in eligible_rules: 141 | new_root = current_scale.root + rule[0] 142 | new_scale_type = rule[1] 143 | proposed_new_scale = JazzScale(new_root, new_scale_type) 144 | print(proposed_new_scale.scale_type) 145 | if proposed_new_scale == start_scale: 146 | print(f'{len(history)} cycle found with history: {history}') 147 | else: 148 | history.append((proposed_new_scale.root, proposed_new_scale.scale_type)) 149 | find_cycles(start_scale, proposed_new_scale, history) 150 | 151 | #if __name__ == "__main__": 152 | # A = build_dark_adjacency() 153 | # G = nx.from_pandas_adjacency(A, create_using = nx.DiGraph) 154 | # find_all_cycles(G, source=(0, 'major'), cycle_length_limit = 12) 155 | #x = JazzScale(0, 'major') 156 | #find_cycles(x) 157 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Creative Commons Legal Code 2 | 3 | CC0 1.0 Universal 4 | 5 | CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE 6 | LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN 7 | ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS 8 | INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES 9 | REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS 10 | PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM 11 | THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED 12 | HEREUNDER. 13 | 14 | Statement of Purpose 15 | 16 | The laws of most jurisdictions throughout the world automatically confer 17 | exclusive Copyright and Related Rights (defined below) upon the creator 18 | and subsequent owner(s) (each and all, an "owner") of an original work of 19 | authorship and/or a database (each, a "Work"). 20 | 21 | Certain owners wish to permanently relinquish those rights to a Work for 22 | the purpose of contributing to a commons of creative, cultural and 23 | scientific works ("Commons") that the public can reliably and without fear 24 | of later claims of infringement build upon, modify, incorporate in other 25 | works, reuse and redistribute as freely as possible in any form whatsoever 26 | and for any purposes, including without limitation commercial purposes. 27 | These owners may contribute to the Commons to promote the ideal of a free 28 | culture and the further production of creative, cultural and scientific 29 | works, or to gain reputation or greater distribution for their Work in 30 | part through the use and efforts of others. 31 | 32 | For these and/or other purposes and motivations, and without any 33 | expectation of additional consideration or compensation, the person 34 | associating CC0 with a Work (the "Affirmer"), to the extent that he or she 35 | is an owner of Copyright and Related Rights in the Work, voluntarily 36 | elects to apply CC0 to the Work and publicly distribute the Work under its 37 | terms, with knowledge of his or her Copyright and Related Rights in the 38 | Work and the meaning and intended legal effect of CC0 on those rights. 39 | 40 | 1. Copyright and Related Rights. A Work made available under CC0 may be 41 | protected by copyright and related or neighboring rights ("Copyright and 42 | Related Rights"). Copyright and Related Rights include, but are not 43 | limited to, the following: 44 | 45 | i. the right to reproduce, adapt, distribute, perform, display, 46 | communicate, and translate a Work; 47 | ii. moral rights retained by the original author(s) and/or performer(s); 48 | iii. publicity and privacy rights pertaining to a person's image or 49 | likeness depicted in a Work; 50 | iv. rights protecting against unfair competition in regards to a Work, 51 | subject to the limitations in paragraph 4(a), below; 52 | v. rights protecting the extraction, dissemination, use and reuse of data 53 | in a Work; 54 | vi. database rights (such as those arising under Directive 96/9/EC of the 55 | European Parliament and of the Council of 11 March 1996 on the legal 56 | protection of databases, and under any national implementation 57 | thereof, including any amended or successor version of such 58 | directive); and 59 | vii. other similar, equivalent or corresponding rights throughout the 60 | world based on applicable law or treaty, and any national 61 | implementations thereof. 62 | 63 | 2. Waiver. To the greatest extent permitted by, but not in contravention 64 | of, applicable law, Affirmer hereby overtly, fully, permanently, 65 | irrevocably and unconditionally waives, abandons, and surrenders all of 66 | Affirmer's Copyright and Related Rights and associated claims and causes 67 | of action, whether now known or unknown (including existing as well as 68 | future claims and causes of action), in the Work (i) in all territories 69 | worldwide, (ii) for the maximum duration provided by applicable law or 70 | treaty (including future time extensions), (iii) in any current or future 71 | medium and for any number of copies, and (iv) for any purpose whatsoever, 72 | including without limitation commercial, advertising or promotional 73 | purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each 74 | member of the public at large and to the detriment of Affirmer's heirs and 75 | successors, fully intending that such Waiver shall not be subject to 76 | revocation, rescission, cancellation, termination, or any other legal or 77 | equitable action to disrupt the quiet enjoyment of the Work by the public 78 | as contemplated by Affirmer's express Statement of Purpose. 79 | 80 | 3. Public License Fallback. Should any part of the Waiver for any reason 81 | be judged legally invalid or ineffective under applicable law, then the 82 | Waiver shall be preserved to the maximum extent permitted taking into 83 | account Affirmer's express Statement of Purpose. In addition, to the 84 | extent the Waiver is so judged Affirmer hereby grants to each affected 85 | person a royalty-free, non transferable, non sublicensable, non exclusive, 86 | irrevocable and unconditional license to exercise Affirmer's Copyright and 87 | Related Rights in the Work (i) in all territories worldwide, (ii) for the 88 | maximum duration provided by applicable law or treaty (including future 89 | time extensions), (iii) in any current or future medium and for any number 90 | of copies, and (iv) for any purpose whatsoever, including without 91 | limitation commercial, advertising or promotional purposes (the 92 | "License"). The License shall be deemed effective as of the date CC0 was 93 | applied by Affirmer to the Work. Should any part of the License for any 94 | reason be judged legally invalid or ineffective under applicable law, such 95 | partial invalidity or ineffectiveness shall not invalidate the remainder 96 | of the License, and in such case Affirmer hereby affirms that he or she 97 | will not (i) exercise any of his or her remaining Copyright and Related 98 | Rights in the Work or (ii) assert any associated claims and causes of 99 | action with respect to the Work, in either case contrary to Affirmer's 100 | express Statement of Purpose. 101 | 102 | 4. Limitations and Disclaimers. 103 | 104 | a. No trademark or patent rights held by Affirmer are waived, abandoned, 105 | surrendered, licensed or otherwise affected by this document. 106 | b. Affirmer offers the Work as-is and makes no representations or 107 | warranties of any kind concerning the Work, express, implied, 108 | statutory or otherwise, including without limitation warranties of 109 | title, merchantability, fitness for a particular purpose, non 110 | infringement, or the absence of latent or other defects, accuracy, or 111 | the present or absence of errors, whether or not discoverable, all to 112 | the greatest extent permissible under applicable law. 113 | c. Affirmer disclaims responsibility for clearing rights of other persons 114 | that may apply to the Work or any use thereof, including without 115 | limitation any person's Copyright and Related Rights in the Work. 116 | Further, Affirmer disclaims responsibility for obtaining any necessary 117 | consents, permissions or other rights required for any use of the 118 | Work. 119 | d. Affirmer understands and acknowledges that Creative Commons is not a 120 | party to this document and has no duty or obligation with respect to 121 | this CC0 or use of the Work. 122 | -------------------------------------------------------------------------------- /code/pressing_modes.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | import numpy as np 3 | import networkx as nx 4 | import matplotlib.pyplot as plt 5 | from pressing_scales_common_tones import scale_dict 6 | 7 | def is_brighter(a, b): 8 | assert(len(a) == len(b)) 9 | a_only = set(a).difference(set(b)) 10 | b_only = set(b).difference(set(a)) 11 | assert(len(a_only) == len(b_only) == 1) 12 | if ((list(a_only)[0] - list(b_only)[0]) % 12) < 6: 13 | return 1 14 | else: 15 | return 0 16 | 17 | def get_modes(scale_type): 18 | # do everything in D. 19 | modes = [] 20 | for s, ns in scale_dict.items(): 21 | if s[1] == scale_type: 22 | if 2 in ns: 23 | modes.append(ns) 24 | return modes 25 | 26 | def get_max_intersection(modes): 27 | max_intersection = 0 28 | for x in modes: 29 | for y in modes: 30 | if set(x) == set(y): 31 | continue 32 | mode_intersection = set(x).intersection(set(y)) 33 | if len(mode_intersection) > max_intersection: 34 | max_intersection = len(mode_intersection) 35 | return max_intersection 36 | 37 | def test_int_altered(): 38 | a = get_modes('melodic_minor') 39 | print(a) 40 | mi = get_max_intersection(a) 41 | print(mi) 42 | 43 | 44 | def order_dark_bright(scale_type): 45 | modes = get_modes(scale_type) 46 | 47 | #test_int_altered() 48 | #print(get_modes('major')) 49 | 50 | # 51 | four_7scale_colors = ['#94A0B2', '#2D2828', '#D2C8BC', '#35608D'] 52 | 53 | def color_node_list(row_names, colors): 54 | node_colors = [] 55 | for r in row_names: 56 | if r[1] == 'major': 57 | node_colors.append(colors[0]) 58 | elif r[1] == 'melodic_minor': 59 | node_colors.append(colors[1]) 60 | elif r[1] == 'harmonic_minor': 61 | node_colors.append(colors[2]) 62 | elif r[1] == 'harmonic_major': 63 | node_colors.append(colors[3]) 64 | return node_colors 65 | 66 | def build_seven_note_mode_subnetwork(): 67 | # first, we only care about 7 diatonic modes and the neighboring pressing scales 68 | seven_diatonic_modes = {k : v for k,v in scale_dict.items() if k[1] == 'major' if 2 in v } 69 | #print(seven_diatonic_modes) 70 | seven_note_nondiatonic = {k : v for k,v in scale_dict.items() if len(v) == 7 if k[1] != 'major'} 71 | #print(seven_note_nondiatonic) 72 | rel_scale_dict = {**seven_diatonic_modes, **seven_note_nondiatonic} 73 | n_row = len(rel_scale_dict.keys()) 74 | common_tone_mat = np.zeros((n_row, n_row)) 75 | bd_mat = np.zeros((n_row, n_row)) 76 | row_names = [] 77 | col_names = [] 78 | for i, (k_i, v_i) in enumerate(rel_scale_dict.items()): 79 | #row_names.append("_".join([k_i[0], k_i[1] ]) 80 | row_names.append(k_i) 81 | for j, (k_j, v_j) in enumerate(rel_scale_dict.items()): 82 | if len(col_names) < n_row: 83 | col_names.append(k_j) 84 | int_size = len(set(v_i).intersection(set(v_j))) 85 | common_tone_mat[i, j] = int_size 86 | # if scale a darker than b 87 | if int_size == 6: 88 | bd_mat[i,j] = is_brighter(v_i, v_j) 89 | ct_df = pd.DataFrame(common_tone_mat, columns=col_names, index=pd.MultiIndex.from_tuples(row_names)) 90 | bd_df = pd.DataFrame(bd_mat, columns=col_names, index=pd.MultiIndex.from_tuples(row_names)) 91 | return ct_df, bd_df 92 | 93 | ct_df, bd_df = build_seven_note_mode_subnetwork() 94 | 95 | ct_df.to_csv('common_tone_matrix.csv') 96 | 97 | 98 | def prune_non_major_adjacent_nodes(df): 99 | bad_columns = [] 100 | bad_rows = [] 101 | for col in df.columns: 102 | is_good = False 103 | for row in df.index: 104 | if row[1] == 'major': 105 | if df[col].loc[row] != 0: 106 | is_good = True 107 | # Because 'Eb_harmonic_minor', 'F#_harmonic_major' are missing via distance but contain D. 108 | if (not is_good) and (2 not in scale_dict[col]) : 109 | #if not is_good: 110 | bad_columns.append(col) 111 | for row in df.index: 112 | is_good = False 113 | for col in df.columns: 114 | if col[1] == 'major': 115 | if df[col].loc[row] != 0: 116 | is_good = True 117 | if (not is_good) and (2 not in scale_dict[row]) : 118 | #if not is_good: 119 | bad_rows.append(row) 120 | #print(bad_columns) 121 | #print(bad_rows) 122 | bad_int = set(bad_columns).intersection(set(bad_rows)) 123 | #print(f'pruning the following nodes: {bad_int}') 124 | return df.drop(columns = bad_int, index = bad_int) 125 | 126 | 127 | def plot_ct_df(): 128 | six_df = ct_df[ct_df == 6].fillna(0) 129 | #print(ct_df[ct_df == 6]) 130 | plot_graph(six_df) 131 | 132 | def validate_pruned_selection(pruned_df): 133 | """ 134 | Checks to make sure the note D (2) is in all modes, except for two odd melodic minor scales. 135 | """ 136 | scales_missing_D = [] 137 | for c in pruned_df.columns: 138 | if 2 not in scale_dict[c]: 139 | scales_missing_D.append(c) 140 | print(f'scales missing D in pruned matrix are: {scales_missing_D}.') 141 | 142 | def find_missing_scales(pruned_df): 143 | with_d = {k : v for k,v in scale_dict.items() if (2 in v)} 144 | with_d_list = set([k[0] + '_' + k[1] for k in with_d.keys()]) 145 | pruned_col_list = set([sn[0] + '_' + sn[1] for sn in pruned_df.columns]) 146 | missing_scales = with_d_list.difference(pruned_col_list) 147 | print(f'scales in scale_dict with D missing from pruned graph: {missing_scales}') 148 | 149 | 150 | def plot_bd_df(scale_types_drop = None): 151 | #print(ct_df[ct_df == 6]) 152 | pruned_bd = prune_non_major_adjacent_nodes(bd_df) 153 | validate_pruned_selection(pruned_bd) 154 | find_missing_scales(pruned_bd) 155 | if scale_types_drop is not None: 156 | drop_cols = [c for c in pruned_bd.columns if c[1] in scale_types_drop] 157 | pruned_bd.drop(columns = drop_cols, index = drop_cols, inplace = True) 158 | #print(pruned_bd) 159 | plot_graph(pruned_bd, digraph = True) 160 | 161 | 162 | def plot_graph(df, digraph = False): 163 | node_colors = color_node_list(df.columns, four_7scale_colors) 164 | if digraph: 165 | G = nx.from_pandas_adjacency(df, create_using=nx.DiGraph) 166 | #sorted_modes = list(nx.topological_sort(G)) 167 | #print(len(sorted_modes)) 168 | #print(sorted_modes) 169 | else: 170 | G = nx.from_pandas_adjacency(df) 171 | nx.draw_kamada_kawai(G, node_color = node_colors, node_size = 500, with_labels = True ) 172 | #major_nodes = [k for k in df.columns if (k[1] == 'major' )] 173 | #major_notes = ['Eb','Bb', 'F','C','G','D','A'] 174 | #pos_dict = { (n,'major') : (i *1000, i*1000) for i, n in enumerate(major_notes)} 175 | #nx.draw(G, node_color = node_colors, with_labels = True, pos=nx.spring_layout(G, pos = pos_dict, fixed = major_nodes)) 176 | #nx.draw(G, node_color = node_colors, with_labels = True) 177 | plt.show() 178 | 179 | # useful for constructing the bright dark plot 180 | pruned_bd = prune_non_major_adjacent_nodes(bd_df) 181 | pruned_bd.to_csv('pruned_bd_digraph.csv') 182 | 183 | #plot_ct_df() 184 | #plot_bd_df(['melodic_minor']) 185 | #plot_bd_df(['major']) 186 | #plot_bd_df(['harmonic_major']) 187 | #plot_bd_df(['harmonic_major', 'harmonic_minor']) 188 | if __name__ == '__main__': 189 | plot_bd_df() 190 | -------------------------------------------------------------------------------- /tables/common_tone_matrix.csv: -------------------------------------------------------------------------------- 1 | ,,"('C', 'major')","('D', 'major')","('Eb', 'major')","('F', 'major')","('G', 'major')","('A', 'major')","('Bb', 'major')","('C', 'melodic_minor')","('C', 'harmonic_major')","('C', 'harmonic_minor')","('C#', 'melodic_minor')","('C#', 'harmonic_major')","('C#', 'harmonic_minor')","('D', 'melodic_minor')","('D', 'harmonic_major')","('D', 'harmonic_minor')","('Eb', 'melodic_minor')","('Eb', 'harmonic_major')","('Eb', 'harmonic_minor')","('E', 'melodic_minor')","('E', 'harmonic_major')","('E', 'harmonic_minor')","('F', 'melodic_minor')","('F', 'harmonic_major')","('F', 'harmonic_minor')","('F#', 'melodic_minor')","('F#', 'harmonic_major')","('F#', 'harmonic_minor')","('G', 'melodic_minor')","('G', 'harmonic_major')","('G', 'harmonic_minor')","('Ab', 'melodic_minor')","('Ab', 'harmonic_major')","('Ab', 'harmonic_minor')","('A', 'melodic_minor')","('A', 'harmonic_major')","('A', 'harmonic_minor')","('Bb', 'melodic_minor')","('Bb', 'harmonic_major')","('Bb', 'harmonic_minor')","('B', 'melodic_minor')","('B', 'harmonic_major')","('B', 'harmonic_minor')" 2 | C,major,7.0,5.0,4.0,6.0,6.0,4.0,5.0,6.0,6.0,5.0,2.0,3.0,3.0,6.0,4.0,5.0,3.0,4.0,3.0,4.0,4.0,5.0,5.0,5.0,4.0,3.0,3.0,4.0,5.0,5.0,4.0,3.0,3.0,3.0,5.0,5.0,6.0,4.0,4.0,3.0,3.0,3.0,4.0 3 | D,major,5.0,7.0,2.0,4.0,6.0,6.0,3.0,4.0,4.0,3.0,3.0,3.0,4.0,6.0,6.0,5.0,2.0,3.0,3.0,6.0,4.0,5.0,3.0,4.0,3.0,4.0,4.0,5.0,5.0,5.0,4.0,3.0,3.0,4.0,5.0,5.0,4.0,3.0,3.0,3.0,5.0,5.0,6.0 4 | Eb,major,4.0,2.0,7.0,5.0,3.0,2.0,6.0,5.0,5.0,6.0,4.0,4.0,3.0,3.0,3.0,4.0,6.0,6.0,5.0,2.0,3.0,3.0,6.0,4.0,5.0,3.0,4.0,3.0,4.0,4.0,5.0,5.0,5.0,4.0,3.0,3.0,4.0,5.0,5.0,4.0,3.0,3.0,3.0 5 | F,major,6.0,4.0,5.0,7.0,5.0,3.0,6.0,5.0,5.0,4.0,3.0,3.0,3.0,5.0,5.0,6.0,4.0,4.0,3.0,3.0,3.0,4.0,6.0,6.0,5.0,2.0,3.0,3.0,6.0,4.0,5.0,3.0,4.0,3.0,4.0,4.0,5.0,5.0,5.0,4.0,3.0,3.0,4.0 6 | G,major,6.0,6.0,3.0,5.0,7.0,5.0,4.0,5.0,5.0,4.0,3.0,3.0,4.0,5.0,5.0,4.0,3.0,3.0,3.0,5.0,5.0,6.0,4.0,4.0,3.0,3.0,3.0,4.0,6.0,6.0,5.0,2.0,3.0,3.0,6.0,4.0,5.0,3.0,4.0,3.0,4.0,4.0,5.0 7 | A,major,4.0,6.0,2.0,3.0,5.0,7.0,2.0,3.0,4.0,3.0,4.0,4.0,5.0,5.0,5.0,4.0,3.0,3.0,4.0,5.0,5.0,4.0,3.0,3.0,3.0,5.0,5.0,6.0,4.0,4.0,3.0,3.0,3.0,4.0,6.0,6.0,5.0,2.0,3.0,3.0,6.0,4.0,5.0 8 | Bb,major,5.0,3.0,6.0,6.0,4.0,2.0,7.0,6.0,4.0,5.0,3.0,4.0,3.0,4.0,4.0,5.0,5.0,5.0,4.0,3.0,3.0,4.0,5.0,5.0,4.0,3.0,3.0,3.0,5.0,5.0,6.0,4.0,4.0,3.0,3.0,3.0,4.0,6.0,6.0,5.0,2.0,3.0,3.0 9 | C,melodic_minor,6.0,4.0,5.0,5.0,5.0,3.0,6.0,7.0,5.0,6.0,2.0,4.0,3.0,5.0,3.0,4.0,4.0,5.0,4.0,4.0,4.0,5.0,4.0,4.0,3.0,4.0,3.0,4.0,4.0,6.0,5.0,4.0,3.0,3.0,4.0,4.0,5.0,5.0,5.0,4.0,2.0,3.0,3.0 10 | C,harmonic_major,6.0,4.0,5.0,5.0,5.0,4.0,4.0,5.0,7.0,6.0,3.0,3.0,3.0,5.0,3.0,4.0,4.0,5.0,4.0,3.0,4.0,4.0,6.0,4.0,5.0,3.0,4.0,4.0,4.0,4.0,3.0,4.0,4.0,4.0,5.0,5.0,6.0,3.0,3.0,2.0,4.0,3.0,4.0 11 | C,harmonic_minor,5.0,3.0,6.0,4.0,4.0,3.0,5.0,6.0,6.0,7.0,3.0,4.0,3.0,4.0,2.0,3.0,5.0,6.0,5.0,3.0,4.0,4.0,5.0,3.0,4.0,4.0,4.0,4.0,3.0,5.0,4.0,5.0,4.0,4.0,4.0,4.0,5.0,4.0,4.0,3.0,3.0,3.0,3.0 12 | C#,melodic_minor,2.0,3.0,4.0,3.0,3.0,4.0,3.0,2.0,3.0,3.0,7.0,5.0,6.0,2.0,4.0,3.0,5.0,3.0,4.0,4.0,5.0,4.0,4.0,4.0,5.0,4.0,4.0,3.0,4.0,3.0,4.0,4.0,6.0,5.0,4.0,3.0,3.0,4.0,4.0,5.0,5.0,5.0,4.0 13 | C#,harmonic_major,3.0,3.0,4.0,3.0,3.0,4.0,4.0,4.0,3.0,4.0,5.0,7.0,6.0,3.0,3.0,3.0,5.0,3.0,4.0,4.0,5.0,4.0,3.0,4.0,4.0,6.0,4.0,5.0,3.0,4.0,4.0,4.0,4.0,3.0,4.0,4.0,4.0,5.0,5.0,6.0,3.0,3.0,2.0 14 | C#,harmonic_minor,3.0,4.0,3.0,3.0,4.0,5.0,3.0,3.0,3.0,3.0,6.0,6.0,7.0,3.0,4.0,3.0,4.0,2.0,3.0,5.0,6.0,5.0,3.0,4.0,4.0,5.0,3.0,4.0,4.0,4.0,4.0,3.0,5.0,4.0,5.0,4.0,4.0,4.0,4.0,5.0,4.0,4.0,3.0 15 | D,melodic_minor,6.0,6.0,3.0,5.0,5.0,5.0,4.0,5.0,5.0,4.0,2.0,3.0,3.0,7.0,5.0,6.0,2.0,4.0,3.0,5.0,3.0,4.0,4.0,5.0,4.0,4.0,4.0,5.0,4.0,4.0,3.0,4.0,3.0,4.0,4.0,6.0,5.0,4.0,3.0,3.0,4.0,4.0,5.0 16 | D,harmonic_major,4.0,6.0,3.0,5.0,5.0,5.0,4.0,3.0,3.0,2.0,4.0,3.0,4.0,5.0,7.0,6.0,3.0,3.0,3.0,5.0,3.0,4.0,4.0,5.0,4.0,3.0,4.0,4.0,6.0,4.0,5.0,3.0,4.0,4.0,4.0,4.0,3.0,4.0,4.0,4.0,5.0,5.0,6.0 17 | D,harmonic_minor,5.0,5.0,4.0,6.0,4.0,4.0,5.0,4.0,4.0,3.0,3.0,3.0,3.0,6.0,6.0,7.0,3.0,4.0,3.0,4.0,2.0,3.0,5.0,6.0,5.0,3.0,4.0,4.0,5.0,3.0,4.0,4.0,4.0,4.0,3.0,5.0,4.0,5.0,4.0,4.0,4.0,4.0,5.0 18 | Eb,melodic_minor,3.0,2.0,6.0,4.0,3.0,3.0,5.0,4.0,4.0,5.0,5.0,5.0,4.0,2.0,3.0,3.0,7.0,5.0,6.0,2.0,4.0,3.0,5.0,3.0,4.0,4.0,5.0,4.0,4.0,4.0,5.0,4.0,4.0,3.0,4.0,3.0,4.0,4.0,6.0,5.0,4.0,3.0,3.0 19 | Eb,harmonic_major,4.0,3.0,6.0,4.0,3.0,3.0,5.0,5.0,5.0,6.0,3.0,3.0,2.0,4.0,3.0,4.0,5.0,7.0,6.0,3.0,3.0,3.0,5.0,3.0,4.0,4.0,5.0,4.0,3.0,4.0,4.0,6.0,4.0,5.0,3.0,4.0,4.0,4.0,4.0,3.0,4.0,4.0,4.0 20 | Eb,harmonic_minor,3.0,3.0,5.0,3.0,3.0,4.0,4.0,4.0,4.0,5.0,4.0,4.0,3.0,3.0,3.0,3.0,6.0,6.0,7.0,3.0,4.0,3.0,4.0,2.0,3.0,5.0,6.0,5.0,3.0,4.0,4.0,5.0,3.0,4.0,4.0,4.0,4.0,3.0,5.0,4.0,5.0,4.0,4.0 21 | E,melodic_minor,4.0,6.0,2.0,3.0,5.0,5.0,3.0,4.0,3.0,3.0,4.0,4.0,5.0,5.0,5.0,4.0,2.0,3.0,3.0,7.0,5.0,6.0,2.0,4.0,3.0,5.0,3.0,4.0,4.0,5.0,4.0,4.0,4.0,5.0,4.0,4.0,3.0,4.0,3.0,4.0,4.0,6.0,5.0 22 | E,harmonic_major,4.0,4.0,3.0,3.0,5.0,5.0,3.0,4.0,4.0,4.0,5.0,5.0,6.0,3.0,3.0,2.0,4.0,3.0,4.0,5.0,7.0,6.0,3.0,3.0,3.0,5.0,3.0,4.0,4.0,5.0,4.0,3.0,4.0,4.0,6.0,4.0,5.0,3.0,4.0,4.0,4.0,4.0,3.0 23 | E,harmonic_minor,5.0,5.0,3.0,4.0,6.0,4.0,4.0,5.0,4.0,4.0,4.0,4.0,5.0,4.0,4.0,3.0,3.0,3.0,3.0,6.0,6.0,7.0,3.0,4.0,3.0,4.0,2.0,3.0,5.0,6.0,5.0,3.0,4.0,4.0,5.0,3.0,4.0,4.0,4.0,4.0,3.0,5.0,4.0 24 | F,melodic_minor,5.0,3.0,6.0,6.0,4.0,3.0,5.0,4.0,6.0,5.0,4.0,3.0,3.0,4.0,4.0,5.0,5.0,5.0,4.0,2.0,3.0,3.0,7.0,5.0,6.0,2.0,4.0,3.0,5.0,3.0,4.0,4.0,5.0,4.0,4.0,4.0,5.0,4.0,4.0,3.0,4.0,3.0,4.0 25 | F,harmonic_major,5.0,4.0,4.0,6.0,4.0,3.0,5.0,4.0,4.0,3.0,4.0,4.0,4.0,5.0,5.0,6.0,3.0,3.0,2.0,4.0,3.0,4.0,5.0,7.0,6.0,3.0,3.0,3.0,5.0,3.0,4.0,4.0,5.0,4.0,3.0,4.0,4.0,6.0,4.0,5.0,3.0,4.0,4.0 26 | F,harmonic_minor,4.0,3.0,5.0,5.0,3.0,3.0,4.0,3.0,5.0,4.0,5.0,4.0,4.0,4.0,4.0,5.0,4.0,4.0,3.0,3.0,3.0,3.0,6.0,6.0,7.0,3.0,4.0,3.0,4.0,2.0,3.0,5.0,6.0,5.0,3.0,4.0,4.0,5.0,3.0,4.0,4.0,4.0,4.0 27 | F#,melodic_minor,3.0,4.0,3.0,2.0,3.0,5.0,3.0,4.0,3.0,4.0,4.0,6.0,5.0,4.0,3.0,3.0,4.0,4.0,5.0,5.0,5.0,4.0,2.0,3.0,3.0,7.0,5.0,6.0,2.0,4.0,3.0,5.0,3.0,4.0,4.0,5.0,4.0,4.0,4.0,5.0,4.0,4.0,3.0 28 | F#,harmonic_major,3.0,4.0,4.0,3.0,3.0,5.0,3.0,3.0,4.0,4.0,4.0,4.0,3.0,4.0,4.0,4.0,5.0,5.0,6.0,3.0,3.0,2.0,4.0,3.0,4.0,5.0,7.0,6.0,3.0,3.0,3.0,5.0,3.0,4.0,4.0,5.0,4.0,3.0,4.0,4.0,6.0,4.0,5.0 29 | F#,harmonic_minor,4.0,5.0,3.0,3.0,4.0,6.0,3.0,4.0,4.0,4.0,3.0,5.0,4.0,5.0,4.0,4.0,4.0,4.0,5.0,4.0,4.0,3.0,3.0,3.0,3.0,6.0,6.0,7.0,3.0,4.0,3.0,4.0,2.0,3.0,5.0,6.0,5.0,3.0,4.0,4.0,5.0,3.0,4.0 30 | G,melodic_minor,5.0,5.0,4.0,6.0,6.0,4.0,5.0,4.0,4.0,3.0,4.0,3.0,4.0,4.0,6.0,5.0,4.0,3.0,3.0,4.0,4.0,5.0,5.0,5.0,4.0,2.0,3.0,3.0,7.0,5.0,6.0,2.0,4.0,3.0,5.0,3.0,4.0,4.0,5.0,4.0,4.0,4.0,5.0 31 | G,harmonic_major,5.0,5.0,4.0,4.0,6.0,4.0,5.0,6.0,4.0,5.0,3.0,4.0,4.0,4.0,4.0,3.0,4.0,4.0,4.0,5.0,5.0,6.0,3.0,3.0,2.0,4.0,3.0,4.0,5.0,7.0,6.0,3.0,3.0,3.0,5.0,3.0,4.0,4.0,5.0,4.0,3.0,4.0,4.0 32 | G,harmonic_minor,4.0,4.0,5.0,5.0,5.0,3.0,6.0,5.0,3.0,4.0,4.0,4.0,4.0,3.0,5.0,4.0,5.0,4.0,4.0,4.0,4.0,5.0,4.0,4.0,3.0,3.0,3.0,3.0,6.0,6.0,7.0,3.0,4.0,3.0,4.0,2.0,3.0,5.0,6.0,5.0,3.0,4.0,4.0 33 | Ab,melodic_minor,3.0,3.0,5.0,3.0,2.0,3.0,4.0,4.0,4.0,5.0,4.0,4.0,3.0,4.0,3.0,4.0,4.0,6.0,5.0,4.0,3.0,3.0,4.0,4.0,5.0,5.0,5.0,4.0,2.0,3.0,3.0,7.0,5.0,6.0,2.0,4.0,3.0,5.0,3.0,4.0,4.0,5.0,4.0 34 | Ab,harmonic_major,3.0,3.0,5.0,4.0,3.0,3.0,4.0,3.0,4.0,4.0,6.0,4.0,5.0,3.0,4.0,4.0,4.0,4.0,3.0,4.0,4.0,4.0,5.0,5.0,6.0,3.0,3.0,2.0,4.0,3.0,4.0,5.0,7.0,6.0,3.0,3.0,3.0,5.0,3.0,4.0,4.0,5.0,4.0 35 | Ab,harmonic_minor,3.0,4.0,4.0,3.0,3.0,4.0,3.0,3.0,4.0,4.0,5.0,3.0,4.0,4.0,4.0,4.0,3.0,5.0,4.0,5.0,4.0,4.0,4.0,4.0,5.0,4.0,4.0,3.0,3.0,3.0,3.0,6.0,6.0,7.0,3.0,4.0,3.0,4.0,2.0,3.0,5.0,6.0,5.0 36 | A,melodic_minor,5.0,5.0,3.0,4.0,6.0,6.0,3.0,4.0,5.0,4.0,4.0,4.0,5.0,4.0,4.0,3.0,4.0,3.0,4.0,4.0,6.0,5.0,4.0,3.0,3.0,4.0,4.0,5.0,5.0,5.0,4.0,2.0,3.0,3.0,7.0,5.0,6.0,2.0,4.0,3.0,5.0,3.0,4.0 37 | A,harmonic_major,5.0,5.0,3.0,4.0,4.0,6.0,3.0,4.0,5.0,4.0,3.0,4.0,4.0,6.0,4.0,5.0,3.0,4.0,4.0,4.0,4.0,3.0,4.0,4.0,4.0,5.0,5.0,6.0,3.0,3.0,2.0,4.0,3.0,4.0,5.0,7.0,6.0,3.0,3.0,3.0,5.0,3.0,4.0 38 | A,harmonic_minor,6.0,4.0,4.0,5.0,5.0,5.0,4.0,5.0,6.0,5.0,3.0,4.0,4.0,5.0,3.0,4.0,4.0,4.0,4.0,3.0,5.0,4.0,5.0,4.0,4.0,4.0,4.0,5.0,4.0,4.0,3.0,3.0,3.0,3.0,6.0,6.0,7.0,3.0,4.0,3.0,4.0,2.0,3.0 39 | Bb,melodic_minor,4.0,3.0,5.0,5.0,3.0,2.0,6.0,5.0,3.0,4.0,4.0,5.0,4.0,4.0,4.0,5.0,4.0,4.0,3.0,4.0,3.0,4.0,4.0,6.0,5.0,4.0,3.0,3.0,4.0,4.0,5.0,5.0,5.0,4.0,2.0,3.0,3.0,7.0,5.0,6.0,2.0,4.0,3.0 40 | Bb,harmonic_major,4.0,3.0,5.0,5.0,4.0,3.0,6.0,5.0,3.0,4.0,4.0,5.0,4.0,3.0,4.0,4.0,6.0,4.0,5.0,3.0,4.0,4.0,4.0,4.0,3.0,4.0,4.0,4.0,5.0,5.0,6.0,3.0,3.0,2.0,4.0,3.0,4.0,5.0,7.0,6.0,3.0,3.0,3.0 41 | Bb,harmonic_minor,3.0,3.0,4.0,4.0,3.0,3.0,5.0,4.0,2.0,3.0,5.0,6.0,5.0,3.0,4.0,4.0,5.0,3.0,4.0,4.0,4.0,4.0,3.0,5.0,4.0,5.0,4.0,4.0,4.0,4.0,5.0,4.0,4.0,3.0,3.0,3.0,3.0,6.0,6.0,7.0,3.0,4.0,3.0 42 | B,melodic_minor,3.0,5.0,3.0,3.0,4.0,6.0,2.0,2.0,4.0,3.0,5.0,3.0,4.0,4.0,5.0,4.0,4.0,4.0,5.0,4.0,4.0,3.0,4.0,3.0,4.0,4.0,6.0,5.0,4.0,3.0,3.0,4.0,4.0,5.0,5.0,5.0,4.0,2.0,3.0,3.0,7.0,5.0,6.0 43 | B,harmonic_major,3.0,5.0,3.0,3.0,4.0,4.0,3.0,3.0,3.0,3.0,5.0,3.0,4.0,4.0,5.0,4.0,3.0,4.0,4.0,6.0,4.0,5.0,3.0,4.0,4.0,4.0,4.0,3.0,4.0,4.0,4.0,5.0,5.0,6.0,3.0,3.0,2.0,4.0,3.0,4.0,5.0,7.0,6.0 44 | B,harmonic_minor,4.0,6.0,3.0,4.0,5.0,5.0,3.0,3.0,4.0,3.0,4.0,2.0,3.0,5.0,6.0,5.0,3.0,4.0,4.0,5.0,3.0,4.0,4.0,4.0,4.0,3.0,5.0,4.0,5.0,4.0,4.0,4.0,4.0,5.0,4.0,4.0,3.0,3.0,3.0,3.0,6.0,6.0,7.0 45 | -------------------------------------------------------------------------------- /tables/final_sorted_pitch_class_brightness.csv: -------------------------------------------------------------------------------- 1 | ,offset,atom_name,brightness,parent_scale_type,mode 2 | 24,+ 6,min7,-5,harmonic_minor,Altered b7 3 | 66,- 3,maj7,-5,harmonic_minor,Altered b7 4 | 99,- 4,dom7,-5,harmonic_minor,Altered b7 5 | 124,+ 3,min7b5,-5,harmonic_minor,Altered b7 6 | 131,+ 6,min7b5,-5,harmonic_minor,Altered b7 7 | 165,+ 4,augMaj7,-5,harmonic_minor,Altered b7 8 | 186,+ 1,minMaj7,-5,harmonic_minor,Altered b7 9 | 203,- 3,minMaj7,-5,harmonic_minor,Altered b7 10 | 234,- 3,fabe,-5,harmonic_minor,Altered b7 11 | 250,+ 6,min9,-5,harmonic_minor,Altered b7 12 | 18,+ 5,min7,-4,harmonic_major,Locrian b7 13 | 46,+ 1,maj7,-4,harmonic_major,Locrian b7 14 | 88,+ 5,dom7,-4,harmonic_major,Locrian b7 15 | 100,- 4,dom7,-4,harmonic_major,Locrian b7 16 | 125,+ 3,min7b5,-4,harmonic_major,Locrian b7 17 | 158,+ 1,augMaj7,-4,harmonic_major,Locrian b7 18 | 178,- 3,augMaj7,-4,harmonic_major,Locrian b7 19 | 198,+ 6,minMaj7,-4,harmonic_major,Locrian b7 20 | 235,- 3,fabe,-4,harmonic_major,Locrian b7 21 | 283,+ 1,maj9,-4,harmonic_major,Locrian b7 22 | 12,+ 3,min7,-4,melodic_minor,Altered 23 | 94,+ 6,dom7,-4,melodic_minor,Altered 24 | 101,- 4,dom7,-4,melodic_minor,Altered 25 | 112,+ 0,min7b5,-4,melodic_minor,Altered 26 | 148,- 2,min7b5,-4,melodic_minor,Altered 27 | 166,+ 4,augMaj7,-4,melodic_minor,Altered 28 | 187,+ 1,minMaj7,-4,melodic_minor,Altered 29 | 222,+ 4,fabe,-4,melodic_minor,Altered 30 | 271,+ 6,9,-4,melodic_minor,Altered 31 | 274,- 4,9,-4,melodic_minor,Altered 32 | 0,+ 0,min7,-3,harmonic_major,Phrygian b4 33 | 62,- 4,maj7,-3,harmonic_major,Phrygian b4 34 | 70,+ 0,dom7,-3,harmonic_major,Phrygian b4 35 | 82,+ 3,dom7,-3,harmonic_major,Phrygian b4 36 | 149,- 2,min7b5,-3,harmonic_major,Phrygian b4 37 | 167,+ 4,augMaj7,-3,harmonic_major,Phrygian b4 38 | 174,- 4,augMaj7,-3,harmonic_major,Phrygian b4 39 | 188,+ 1,minMaj7,-3,harmonic_major,Phrygian b4 40 | 223,+ 4,fabe,-3,harmonic_major,Phrygian b4 41 | 295,- 4,maj9,-3,harmonic_major,Phrygian b4 42 | 13,+ 3,min7,-3,major,Locrian 43 | 19,+ 5,min7,-3,major,Locrian 44 | 36,- 2,min7,-3,major,Locrian 45 | 47,+ 1,maj7,-3,major,Locrian 46 | 58,+ 6,maj7,-3,major,Locrian 47 | 102,- 4,dom7,-3,major,Locrian 48 | 113,+ 0,min7b5,-3,major,Locrian 49 | 226,+ 6,fabe,-3,major,Locrian 50 | 244,+ 3,min9,-3,major,Locrian 51 | 256,- 2,min9,-3,major,Locrian 52 | 275,- 4,9,-3,major,Locrian 53 | 284,+ 1,maj9,-3,major,Locrian 54 | 292,+ 6,maj9,-3,major,Locrian 55 | 14,+ 3,min7,-2,harmonic_minor,Locrian #6 56 | 59,+ 6,maj7,-2,harmonic_minor,Locrian #6 57 | 89,+ 5,dom7,-2,harmonic_minor,Locrian #6 58 | 114,+ 0,min7b5,-2,harmonic_minor,Locrian #6 59 | 126,+ 3,min7b5,-2,harmonic_minor,Locrian #6 60 | 159,+ 1,augMaj7,-2,harmonic_minor,Locrian #6 61 | 199,+ 6,minMaj7,-2,harmonic_minor,Locrian #6 62 | 207,- 2,minMaj7,-2,harmonic_minor,Locrian #6 63 | 227,+ 6,fabe,-2,harmonic_minor,Locrian #6 64 | 245,+ 3,min9,-2,harmonic_minor,Locrian #6 65 | 1,+ 0,min7,-2,major,Phrygian 66 | 20,+ 5,min7,-2,major,Phrygian 67 | 37,- 2,min7,-2,major,Phrygian 68 | 48,+ 1,maj7,-2,major,Phrygian 69 | 63,- 4,maj7,-2,major,Phrygian 70 | 83,+ 3,dom7,-2,major,Phrygian 71 | 137,- 5,min7b5,-2,major,Phrygian 72 | 214,+ 1,fabe,-2,major,Phrygian 73 | 247,+ 5,min9,-2,major,Phrygian 74 | 257,- 2,min9,-2,major,Phrygian 75 | 265,+ 3,9,-2,major,Phrygian 76 | 285,+ 1,maj9,-2,major,Phrygian 77 | 296,- 4,maj9,-2,major,Phrygian 78 | 21,+ 5,min7,-2,melodic_minor,Aeolian b5 79 | 103,- 4,dom7,-2,melodic_minor,Aeolian b5 80 | 106,- 2,dom7,-2,melodic_minor,Aeolian b5 81 | 115,+ 0,min7b5,-2,melodic_minor,Aeolian b5 82 | 118,+ 2,min7b5,-2,melodic_minor,Aeolian b5 83 | 170,+ 6,augMaj7,-2,melodic_minor,Aeolian b5 84 | 190,+ 3,minMaj7,-2,melodic_minor,Aeolian b5 85 | 228,+ 6,fabe,-2,melodic_minor,Aeolian b5 86 | 276,- 4,9,-2,melodic_minor,Aeolian b5 87 | 277,- 2,9,-2,melodic_minor,Aeolian b5 88 | 6,+ 2,min7,-1,harmonic_major,Dorian b5 89 | 67,- 2,maj7,-1,harmonic_major,Dorian b5 90 | 76,+ 2,dom7,-1,harmonic_major,Dorian b5 91 | 90,+ 5,dom7,-1,harmonic_major,Dorian b5 92 | 116,+ 0,min7b5,-1,harmonic_major,Dorian b5 93 | 171,+ 6,augMaj7,-1,harmonic_major,Dorian b5 94 | 179,- 2,augMaj7,-1,harmonic_major,Dorian b5 95 | 191,+ 3,minMaj7,-1,harmonic_major,Dorian b5 96 | 229,+ 6,fabe,-1,harmonic_major,Dorian b5 97 | 298,- 2,maj9,-1,harmonic_major,Dorian b5 98 | 38,- 2,min7,-1,harmonic_minor,Phrygian #3 99 | 49,+ 1,maj7,-1,harmonic_minor,Phrygian #3 100 | 71,+ 0,dom7,-1,harmonic_minor,Phrygian #3 101 | 138,- 5,min7b5,-1,harmonic_minor,Phrygian #3 102 | 150,- 2,min7b5,-1,harmonic_minor,Phrygian #3 103 | 175,- 4,augMaj7,-1,harmonic_minor,Phrygian #3 104 | 189,+ 1,minMaj7,-1,harmonic_minor,Phrygian #3 105 | 194,+ 5,minMaj7,-1,harmonic_minor,Phrygian #3 106 | 215,+ 1,fabe,-1,harmonic_minor,Phrygian #3 107 | 258,- 2,min9,-1,harmonic_minor,Phrygian #3 108 | 2,+ 0,min7,-1,major,Aeolian 109 | 22,+ 5,min7,-1,major,Aeolian 110 | 25,- 5,min7,-1,major,Aeolian 111 | 50,+ 3,maj7,-1,major,Aeolian 112 | 64,- 4,maj7,-1,major,Aeolian 113 | 107,- 2,dom7,-1,major,Aeolian 114 | 119,+ 2,min7b5,-1,major,Aeolian 115 | 230,- 4,fabe,-1,major,Aeolian 116 | 238,+ 0,min9,-1,major,Aeolian 117 | 248,+ 5,min9,-1,major,Aeolian 118 | 278,- 2,9,-1,major,Aeolian 119 | 286,+ 3,maj9,-1,major,Aeolian 120 | 297,- 4,maj9,-1,major,Aeolian 121 | 3,+ 0,min7,-1,melodic_minor,Dorian b2 122 | 84,+ 3,dom7,-1,melodic_minor,Dorian b2 123 | 91,+ 5,dom7,-1,melodic_minor,Dorian b2 124 | 139,- 5,min7b5,-1,melodic_minor,Dorian b2 125 | 142,- 3,min7b5,-1,melodic_minor,Dorian b2 126 | 160,+ 1,augMaj7,-1,melodic_minor,Dorian b2 127 | 208,- 2,minMaj7,-1,melodic_minor,Dorian b2 128 | 216,+ 1,fabe,-1,melodic_minor,Dorian b2 129 | 266,+ 3,9,-1,melodic_minor,Dorian b2 130 | 268,+ 5,9,-1,melodic_minor,Dorian b2 131 | 30,- 3,min7,0,harmonic_major,Mixolydian b2 132 | 54,+ 5,maj7,0,harmonic_major,Mixolydian b2 133 | 72,+ 0,dom7,0,harmonic_major,Mixolydian b2 134 | 105,- 3,dom7,0,harmonic_major,Mixolydian b2 135 | 140,- 5,min7b5,0,harmonic_major,Mixolydian b2 136 | 161,+ 1,augMaj7,0,harmonic_major,Mixolydian b2 137 | 169,+ 5,augMaj7,0,harmonic_major,Mixolydian b2 138 | 209,- 2,minMaj7,0,harmonic_major,Mixolydian b2 139 | 217,+ 1,fabe,0,harmonic_major,Mixolydian b2 140 | 289,+ 5,maj9,0,harmonic_major,Mixolydian b2 141 | 23,+ 5,min7,0,harmonic_minor,Harmonic Minor 142 | 65,- 4,maj7,0,harmonic_minor,Harmonic Minor 143 | 95,- 5,dom7,0,harmonic_minor,Harmonic Minor 144 | 120,+ 2,min7b5,0,harmonic_minor,Harmonic Minor 145 | 130,+ 5,min7b5,0,harmonic_minor,Harmonic Minor 146 | 162,+ 3,augMaj7,0,harmonic_minor,Harmonic Minor 147 | 182,+ 0,minMaj7,0,harmonic_minor,Harmonic Minor 148 | 202,- 4,minMaj7,0,harmonic_minor,Harmonic Minor 149 | 231,- 4,fabe,0,harmonic_minor,Harmonic Minor 150 | 249,+ 5,min9,0,harmonic_minor,Harmonic Minor 151 | 4,+ 0,min7,0,major,Dorian 152 | 7,+ 2,min7,0,major,Dorian 153 | 26,- 5,min7,0,major,Dorian 154 | 51,+ 3,maj7,0,major,Dorian 155 | 68,- 2,maj7,0,major,Dorian 156 | 92,+ 5,dom7,0,major,Dorian 157 | 143,- 3,min7b5,0,major,Dorian 158 | 218,+ 3,fabe,0,major,Dorian 159 | 239,+ 0,min9,0,major,Dorian 160 | 251,- 5,min9,0,major,Dorian 161 | 269,+ 5,9,0,major,Dorian 162 | 287,+ 3,maj9,0,major,Dorian 163 | 299,- 2,maj9,0,major,Dorian 164 | 27,- 5,min7,0,melodic_minor,Mixolydian b6 165 | 73,+ 0,dom7,0,melodic_minor,Mixolydian b6 166 | 108,- 2,dom7,0,melodic_minor,Mixolydian b6 167 | 121,+ 2,min7b5,0,melodic_minor,Mixolydian b6 168 | 127,+ 4,min7b5,0,melodic_minor,Mixolydian b6 169 | 176,- 4,augMaj7,0,melodic_minor,Mixolydian b6 170 | 195,+ 5,minMaj7,0,melodic_minor,Mixolydian b6 171 | 232,- 4,fabe,0,melodic_minor,Mixolydian b6 172 | 259,+ 0,9,0,melodic_minor,Mixolydian b6 173 | 279,- 2,9,0,melodic_minor,Mixolydian b6 174 | 15,+ 4,min7,1,harmonic_major,Harmonic major 175 | 42,+ 0,maj7,1,harmonic_major,Harmonic major 176 | 85,+ 4,dom7,1,harmonic_major,Harmonic major 177 | 96,- 5,dom7,1,harmonic_major,Harmonic major 178 | 122,+ 2,min7b5,1,harmonic_major,Harmonic major 179 | 154,+ 0,augMaj7,1,harmonic_major,Harmonic major 180 | 177,- 4,augMaj7,1,harmonic_major,Harmonic major 181 | 196,+ 5,minMaj7,1,harmonic_major,Harmonic major 182 | 233,- 4,fabe,1,harmonic_major,Harmonic major 183 | 280,+ 0,maj9,1,harmonic_major,Harmonic major 184 | 5,+ 0,min7,1,harmonic_minor,Dorian #4 185 | 52,+ 3,maj7,1,harmonic_minor,Dorian #4 186 | 77,+ 2,dom7,1,harmonic_minor,Dorian #4 187 | 117,+ 0,min7b5,1,harmonic_minor,Dorian #4 188 | 144,- 3,min7b5,1,harmonic_minor,Dorian #4 189 | 180,- 2,augMaj7,1,harmonic_minor,Dorian #4 190 | 192,+ 3,minMaj7,1,harmonic_minor,Dorian #4 191 | 200,- 5,minMaj7,1,harmonic_minor,Dorian #4 192 | 219,+ 3,fabe,1,harmonic_minor,Dorian #4 193 | 240,+ 0,min9,1,harmonic_minor,Dorian #4 194 | 8,+ 2,min7,1,major,Mixolydian 195 | 28,- 5,min7,1,major,Mixolydian 196 | 31,- 3,min7,1,major,Mixolydian 197 | 55,+ 5,maj7,1,major,Mixolydian 198 | 69,- 2,maj7,1,major,Mixolydian 199 | 74,+ 0,dom7,1,major,Mixolydian 200 | 128,+ 4,min7b5,1,major,Mixolydian 201 | 236,- 2,fabe,1,major,Mixolydian 202 | 241,+ 2,min9,1,major,Mixolydian 203 | 252,- 5,min9,1,major,Mixolydian 204 | 260,+ 0,9,1,major,Mixolydian 205 | 290,+ 5,maj9,1,major,Mixolydian 206 | 300,- 2,maj9,1,major,Mixolydian 207 | 9,+ 2,min7,1,melodic_minor,Melodic Minor 208 | 93,+ 5,dom7,1,melodic_minor,Melodic Minor 209 | 97,- 5,dom7,1,melodic_minor,Melodic Minor 210 | 145,- 3,min7b5,1,melodic_minor,Melodic Minor 211 | 151,- 1,min7b5,1,melodic_minor,Melodic Minor 212 | 163,+ 3,augMaj7,1,melodic_minor,Melodic Minor 213 | 183,+ 0,minMaj7,1,melodic_minor,Melodic Minor 214 | 220,+ 3,fabe,1,melodic_minor,Melodic Minor 215 | 270,+ 5,9,1,melodic_minor,Melodic Minor 216 | 272,- 5,9,1,melodic_minor,Melodic Minor 217 | 39,- 1,min7,2,harmonic_major,Lydian b3 218 | 60,- 5,maj7,2,harmonic_major,Lydian b3 219 | 78,+ 2,dom7,2,harmonic_major,Lydian b3 220 | 109,- 1,dom7,2,harmonic_major,Lydian b3 221 | 146,- 3,min7b5,2,harmonic_major,Lydian b3 222 | 164,+ 3,augMaj7,2,harmonic_major,Lydian b3 223 | 172,- 5,augMaj7,2,harmonic_major,Lydian b3 224 | 184,+ 0,minMaj7,2,harmonic_major,Lydian b3 225 | 221,+ 3,fabe,2,harmonic_major,Lydian b3 226 | 293,- 5,maj9,2,harmonic_major,Lydian b3 227 | 10,+ 2,min7,2,major,Ionian 228 | 16,+ 4,min7,2,major,Ionian 229 | 32,- 3,min7,2,major,Ionian 230 | 43,+ 0,maj7,2,major,Ionian 231 | 56,+ 5,maj7,2,major,Ionian 232 | 98,- 5,dom7,2,major,Ionian 233 | 152,- 1,min7b5,2,major,Ionian 234 | 224,+ 5,fabe,2,major,Ionian 235 | 242,+ 2,min9,2,major,Ionian 236 | 253,- 3,min9,2,major,Ionian 237 | 273,- 5,9,2,major,Ionian 238 | 281,+ 0,maj9,2,major,Ionian 239 | 291,+ 5,maj9,2,major,Ionian 240 | 33,- 3,min7,2,melodic_minor,Lydian Dominant 241 | 75,+ 0,dom7,2,melodic_minor,Lydian Dominant 242 | 79,+ 2,dom7,2,melodic_minor,Lydian Dominant 243 | 129,+ 4,min7b5,2,melodic_minor,Lydian Dominant 244 | 132,+ 6,min7b5,2,melodic_minor,Lydian Dominant 245 | 181,- 2,augMaj7,2,melodic_minor,Lydian Dominant 246 | 201,- 5,minMaj7,2,melodic_minor,Lydian Dominant 247 | 237,- 2,fabe,2,melodic_minor,Lydian Dominant 248 | 261,+ 0,9,2,melodic_minor,Lydian Dominant 249 | 262,+ 2,9,2,melodic_minor,Lydian Dominant 250 | 11,+ 2,min7,3,harmonic_minor,Ionian #5 251 | 57,+ 5,maj7,3,harmonic_minor,Ionian #5 252 | 86,+ 4,dom7,3,harmonic_minor,Ionian #5 253 | 123,+ 2,min7b5,3,harmonic_minor,Ionian #5 254 | 153,- 1,min7b5,3,harmonic_minor,Ionian #5 255 | 155,+ 0,augMaj7,3,harmonic_minor,Ionian #5 256 | 197,+ 5,minMaj7,3,harmonic_minor,Ionian #5 257 | 204,- 3,minMaj7,3,harmonic_minor,Ionian #5 258 | 225,+ 5,fabe,3,harmonic_minor,Ionian #5 259 | 243,+ 2,min9,3,harmonic_minor,Ionian #5 260 | 17,+ 4,min7,3,major,Lydian 261 | 34,- 3,min7,3,major,Lydian 262 | 40,- 1,min7,3,major,Lydian 263 | 44,+ 0,maj7,3,major,Lydian 264 | 61,- 5,maj7,3,major,Lydian 265 | 80,+ 2,dom7,3,major,Lydian 266 | 133,+ 6,min7b5,3,major,Lydian 267 | 210,+ 0,fabe,3,major,Lydian 268 | 246,+ 4,min9,3,major,Lydian 269 | 254,- 3,min9,3,major,Lydian 270 | 263,+ 2,9,3,major,Lydian 271 | 282,+ 0,maj9,3,major,Lydian 272 | 294,- 5,maj9,3,major,Lydian 273 | 35,- 3,min7,4,harmonic_minor,Lydian #2 274 | 45,+ 0,maj7,4,harmonic_minor,Lydian #2 275 | 110,- 1,dom7,4,harmonic_minor,Lydian #2 276 | 134,+ 6,min7b5,4,harmonic_minor,Lydian #2 277 | 147,- 3,min7b5,4,harmonic_minor,Lydian #2 278 | 173,- 5,augMaj7,4,harmonic_minor,Lydian #2 279 | 185,+ 0,minMaj7,4,harmonic_minor,Lydian #2 280 | 193,+ 4,minMaj7,4,harmonic_minor,Lydian #2 281 | 211,+ 0,fabe,4,harmonic_minor,Lydian #2 282 | 255,- 3,min9,4,harmonic_minor,Lydian #2 283 | 41,- 1,min7,4,melodic_minor,Lydian #5 284 | 81,+ 2,dom7,4,melodic_minor,Lydian #5 285 | 87,+ 4,dom7,4,melodic_minor,Lydian #5 286 | 135,+ 6,min7b5,4,melodic_minor,Lydian #5 287 | 141,- 4,min7b5,4,melodic_minor,Lydian #5 288 | 156,+ 0,augMaj7,4,melodic_minor,Lydian #5 289 | 205,- 3,minMaj7,4,melodic_minor,Lydian #5 290 | 212,+ 0,fabe,4,melodic_minor,Lydian #5 291 | 264,+ 2,9,4,melodic_minor,Lydian #5 292 | 267,+ 4,9,4,melodic_minor,Lydian #5 293 | 29,- 4,min7,5,harmonic_major,Lydian #5 #2 294 | 53,+ 4,maj7,5,harmonic_major,Lydian #5 #2 295 | 104,- 4,dom7,5,harmonic_major,Lydian #5 #2 296 | 111,- 1,dom7,5,harmonic_major,Lydian #5 #2 297 | 136,+ 6,min7b5,5,harmonic_major,Lydian #5 #2 298 | 157,+ 0,augMaj7,5,harmonic_major,Lydian #5 #2 299 | 168,+ 4,augMaj7,5,harmonic_major,Lydian #5 #2 300 | 206,- 3,minMaj7,5,harmonic_major,Lydian #5 #2 301 | 213,+ 0,fabe,5,harmonic_major,Lydian #5 #2 302 | 288,+ 4,maj9,5,harmonic_major,Lydian #5 #2 303 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Brightness Scores for 28 Jazz Modes and 18 Rules for Modulation 2 | 3 | This computational music theory project assigns a brightness score for all 28 modes derived from four jazz scales: major, melodic minor, harmonic minor, and harmonic major. 4 | 5 | I constructed scale networks to visualize the interrelations between the 28 modes. From these networks I found 18 "rules" for modulation that allow for maximally smooth voice leading. 6 | 7 | Other applications and experiments found in this code repository include characterizing and ranking the brightness of 1) [all combinations of two triads](tables/all_two_triads_ranked.csv), 2), [all combinations of two triads resulting in 6 unique pitch classes](tables/all_two_triads_ranked.csv), 3) [all 7th chords added to a root note](tables/final_sorted_pitch_class_brightness.csv), and 4) [all 59 possible dominant 7th chord extensions](tables/dom7_extensions_brightness_sorted_aggregated.csv) (for these three applications, I am only considering chords that are subsets of at least one of the 28 modes derived from the four parent scale types.) 8 | 9 | All results were obtained using python code in this repository. 10 | Scale network figures were generated with networkx and calculations were done with numpy and pandas. 11 | 12 | **TLDR**: I defined a formula for calculating the brightness score for any 7 note mode, where locrian has a brightness score of -3, dorian 0, and lydian +3. Dorian, mixolydian b6, harmonic minor mode, and mixolydian b2 are neutral harmonic centers of the brightness/darkness spectrum for major, melodic minor, harmonic minor, and harmonic major, respectively. By starting at the neutral centers and progressively enumerating jazz modes, "rootless" modes are encountered before all 7 traditional modes are enumerated for all scales except major. Network analysis finds 18 "rules" for modulation, allowing composers to transition from one scale or mode to another while sharpening or flattening a single note by one half step ("maximally smooth voice leading"). Major scales are the most harmonically versatile of the four scale types, with more options for maximally smooth voice leading. 13 | 14 | ## History 15 | 16 | This repo started when I tried [answering my own question](https://music.stackexchange.com/questions/67293/ranking-dominant-chord-alterations-by-dissonance) about ranking dominant 7th extensions by dissonance. I learned the notion of dissonance is hard to define and complicated, but I also started to appreciate brightness and darkness as a second axis or property that may be used for thinking about harmonies and scales. 17 | 18 | This project is a completely refactored version of my earlier project titled ["Network Theory of Jazz Scales"](https://github.com/TylerMclaughlin/computational-harmony). Aside from many implementation details, the biggest change is the representation of scale networks as directed graphs, where the directed edges convey whether a given scale transition is bright-to-dark or dark-to-bright (arrows now point from bright-to-dark). The symmetry between darkness and brightness in music theory underlies the increasingly shared concept of "negative harmony", discovered by Ernst Levy in 1985 and popularized by Jacob Collier. 19 | 20 | ## Defining brightness and darkness. 21 | 22 | You may be familiar with the concept in music theory about major scale modes that the locrian mode is darkest, lydian is brightest, and dorian is neutral. This is related to the circle of fifths, where going up a fourth is considered a transition from bright to dark because a note is flattened (made darker relative to the previous scale). I was able to generalize the notion of brightness beyond major modes to the modes of melodic minor, harmonic minor, and harmonic major with the following simple equation: 23 | 24 | ```brightness = sum (pitch classes (mode_x)) - sum (pitch classes (Dorian))``` 25 | 26 | Under this formula, locrian has a brightness score of -3, dorian (neutral) has a brightness score of 0, and lydian has a brightness score of +3. 27 | 28 | ### Examples 29 | 30 | **dorian** is **neutral** by definition because (0 + 2 + 3 + 5 + 7 + 9 + 10) - (0 + 2 + 3 + 5 + 7 + 9 + 10) = 36 - 36 = 0. 31 | 32 | **mixolydian b6** is **neutral** because (0 + 2 + 4 + 5 + 7 + 8 + 10) - (0 + 2 + 3 + 5 + 7 + 9 + 10) = 36 - 36 = 0. 33 | 34 | **locrian** is **dark** because (0 + 1 + 3 + 5 + 6 + 8 + 10) - (0 + 2 + 3 + 5 + 7 + 9 + 10) = 33 - 36 = -3, a negative brightness score. 35 | 36 | **lydian** is **bright** because (0 + 2 + 4 + 6 + 7 + 9 + 11) - (0 + 2 + 3 + 5 + 7 + 9 + 10) = 39 - 36 = +3, a positive brightness score. 37 | 38 | ### Why choose dorian as the neutral center? 39 | 40 | Redditor u/IronAndAero asked about why dorian is the center and if this is a circular argument. 41 | The assumption that dorian is neutral is based around how the 7 major scale modes have dorian as the center when sorted by brightness, i.e., `DARKEST` `locrian` `phrygian` `aeolian` `**dorian**` `mixolydian` `ionian` `lydian` `BRIGHTEST`. Dorian also has bright and dark properties, with the #6 and b3. Below, you'll see that the other 3 scale types are also balanced around a center, and this center happens to be the exact same center (same score) as for the major scale. If you were to argue that ionian was the real center, for example, then you'd have to conclude that on average, these 28 jazz modes are skewed towards sounding dark. While I doubt harmony is skewed like this, it may be the case. But even if the scales are naturally skewed bright or dark, you can still treat brightness/darkness as "relative to all the other modes". Under this "relative" formulation, dorian will still remain at the center of the spectrum. 42 | 43 | ## Results 44 | 45 | ### Scale modes arranged along the brightness/darkness spectrum 46 | 47 | I am considering scales close to C major and all of its modes. By "close" I mean sharing 6 out of 7 common tones. Because dorian is the most 'neutral' mode of the major scale (neutral in terms of brightness and darkness), I also tabulated whether the root D of the dorian mode is in these scales. The following diagram assigns a brightness or darkness score to each of the modes, with positive values indicating brighter modes and negative, darker. 48 | 49 | ![modes_spreadsheet](figures/scale_modes_bright_dark.png) 50 | 51 | 52 | These results are similar to a circle of fifths which has been generalized to three other jazz scale types. 53 | You can see that for all parent scale types except major, the complete generalized circle of fifths requires passing through modes that lack the dorian root D. These rootless modes are transposed duplicates of other modes. Altered scales have their rootless mode at the extremes of bright and dark (locrian and lydian), whereras for harmonic scales, the rootless modes occur at less extreme ends of the spectrum. 54 | 55 | Another interesting observation is that there is a staggered pattern of the three unique diminished seventh chords (considered equivalent under inversion) in the harmonic major and harmonic minor scales. 56 | 57 | Perhaps the most useful finding (for negative harmony and jazz composition) is that the neutral modes of the four scale types are dorian (the second mode of the major scale), mixolydian b6 (the fifth mode of the melodic minor scale), harmonic minor (the first mode of the eponymous parent scale), and mixolydian b2 (the fifth mode of the harmonic major scale). 58 | These modes can thus be used as a reference point for composing with brightness and darkness. 59 | 60 | The idea that dorian, mixolydian b6, harmonic minor, and mixolydian b2 appear to be neutral harmonic centers of these scales is to my knowledge, not proposed in the music theory literature. 61 | Perhaps one could argue for systematic renaming of scales according to their graph-theoretical properties and apparent harmonic symmetry; however, the etymological origins of the names of scales most likely predate computers and graph theory, and musicians benefit from having conventions for communicating ideas. Further, musicians are used to having many names for the same chord (for example "min7b5" and "half-diminished" refer to the same thing). Perhaps a new set of names should be proposed. 62 | 63 | ### Directed graphs of scales 64 | 65 | Arrows between scales represent sharing 6 common tones and pointing from bright to dark. 66 | 67 | #### Major, harmonic major, and harmonic minor scales near C major 68 | 69 | By plotting all 3 scale types (everything but the melodic minor modes) you can see the structure of the scale network in a fairly elegant layout. 70 | 71 | ![7 note pressing scale_network](figures/major_harmonic-maj_harmonic-min.png) 72 | 73 | If you add the melodic minor modes (below) you can see the network becomes more complex in the sense that there are many overlapping edges. These graphs cannot be drawn without overlapping edges (graph theoreticians would say they are nonplanar graphs). 74 | 75 | #### Network of 30 scales near C major 76 | 77 | Network comprised of 7 harmonic minor, 7 harmonic major, and 9 melodic minor scales. 78 | 79 | ![30 scales](figures/7_note_pressing_scale_network.png) 80 | 81 | #### Full cycle of 32 scales near C major and all 28 modes 82 | 83 | After adding F# harmonic minor and Eb harmonic major, two scales maximally distant from D dorian that contain the root D, a complete, large-scale cycle emerges. Adding these two scales now includes the altered b7 mode and lydian #5 #2 mode, meaning all 28 modes are now represented. 84 | 85 | ![32 scale cycle](figures/all_with_8_harmonic_maj-min.png) 86 | 87 | ### 18 scale transition rules for maximally smooth voice leading 88 | 89 | By inspecting the scale networks and considering the relationships between the roots of the scales, the networks are composed of 9 types of bright-to-dark transitions, or equivalently, 9 types of edges (rules 1-9). The 9 *dark-to-bright* transitions (rules 10-18) can be easily derived by inverting the bright-to-dark transitions (by imagining the arrows point in the opposite direction). 90 | 91 | Smooth voice leading is defined as transitioning between chords or scales by changing only a few notes by a small amount. The 18 "maximally" smooth voice leading rules I have tabulated describe transitions where a single note is sharpened or flattened to transition to a new scale. Smooth and maximally smooth voice leading is described in more detail in prior work by Dmitri Tymoczko in 2004 and Joseph Strauss in 2005 (see [References](#References)). 92 | 93 | rule | starting scale | bright or dark | # semitones | destination scale 94 | ---- | -------------- | -------------- | ----------- | ------------ 95 | 1 | major | dark | 5 | major 96 | 2 | major | dark | 0 | harmonic major 97 | 3 | major | dark | 0 | melodic minor 98 | 4 | melodic minor | dark | -2 | major 99 | 5 | melodic minor | dark | 0 | harmonic minor 100 | 6 | harmonic major | dark | 5 | melodic minor 101 | 7 | harmonic major | dark | 0 | harmonic minor 102 | 8 | harmonic minor | dark | 3 | major 103 | 9 | harmonic minor | dark | 3 | harmonic major 104 | 10 | major | bright | -5 | major 105 | 11 | major | bright | 2 | melodic minor 106 | 12 | major | bright | -3 | harmonic minor 107 | 13 | melodic minor | bright | 0 | major 108 | 14 | melodic minor | bright | -5 | harmonic major 109 | 15 | harmonic major | bright | 0 | major 110 | 16 | harmonic major | bright | -3 | harmonic minor 111 | 17 | harmonic minor | bright | 0 | melodic minor 112 | 18 | harmonic minor | bright | 0 | harmonic major 113 | 114 | According to these rules, for every major scale, you can transition to 3 scales by flattening one note a single half step (3 maximally smooth bright-to-dark transitions). 115 | For the three other scale types--melodic minor, harmonic minor, and harmonic major, you can transition to only two other scales by flattening a single note. 116 | Surprisingly yet satisfyingly, for *dark-to-bright* transitions with *sharpening* a single note (rules 10-18), the number of transitions from each starting scale type is identical to that for the *bright-to-dark* transitions, although the destination scale types are different. In other words, the transitions have nuanced yet symmetric properties. 117 | Overall, the finding that there are more rules starting from major scale than the 3 other scale types suggests melodic minor, harmonic minor, and harmonic major scales are less versatile in terms of voice leading opportunities. This may be part of why they are perceived as more dissonant than the major scales (this dissonance is from my own personal experience, citation needed). The maximal evenness property of major scales (or rather that the notes of the major scale are more evenly distributed throughout pitch space than the three other seven note scales) seems to be what allows for more voice leading options, I have not rigorously investigated this although Richard Cohn talks about this in his book 'Audacious Euphony" (thanks Ian Campbell). 118 | 119 | These maximally smooth scale transitions could be used as rules for creating generative jazz compostions with a hidden markov model, for example, using the dictionary I have constructed in [this python file](code/scale_change_rules.py). Or they may assist with choosing modulations in traditional jazz composition. 120 | 121 | 122 | ## References 123 | 124 | Cohn, Richard. Audacious Euphony: Chromatic Harmony and the Triad's Second Nature. OUP USA, 2012. 125 | 126 | Levy, Ernst. A theory of harmony. Suny Press, 1985. 127 | 128 | Tymoczko, Dmitri. "Scale networks and Debussy." Journal of Music Theory 48.2 (2004): 219-294. 129 | 130 | Straus, Joseph N. "Voice leading in set-class space." Journal of Music Theory 49.1 (2005): 45-108. 131 | -------------------------------------------------------------------------------- /tables/all_two_triads_ranked.csv: -------------------------------------------------------------------------------- 1 | ,extensions (pitch classes),compatible modes,parent scale types,brightness 2 | 0,"[0, 3, 6]__[0, 3, 6]",Altered b7; Locrian b7; Altered; Locrian; Locrian #6; Aeolian b5; Dorian b5; Dorian #4; Lydian b3; Lydian #2; Lydian #5 #2,harmonic_minor; harmonic_major; melodic_minor; major; harmonic_minor; melodic_minor; harmonic_major; harmonic_minor; harmonic_major; harmonic_minor; harmonic_major,"[-5, -4, -4, -3, -2, -2, -1, 1, 2, 4, 5]" 3 | 1,"[0, 3, 7]__[0, 3, 7]",Phrygian b4; Phrygian; Aeolian; Dorian b2; Harmonic Minor; Dorian; Dorian #4; Melodic Minor; Lydian b3; Lydian #2,harmonic_major; major; major; melodic_minor; harmonic_minor; major; harmonic_minor; melodic_minor; harmonic_major; harmonic_minor,"[-3, -2, -1, -1, 0, 0, 1, 1, 2, 4]" 4 | 2,"[0, 4, 7]__[0, 4, 7]",Phrygian b4; Phrygian #3; Mixolydian b2; Mixolydian b6; Harmonic major; Mixolydian; Ionian; Lydian Dominant; Lydian; Lydian #2,harmonic_major; harmonic_minor; harmonic_major; melodic_minor; harmonic_major; major; major; melodic_minor; major; harmonic_minor,"[-3, -1, 0, 0, 1, 1, 2, 2, 3, 4]" 5 | 3,"[0, 4, 8]__[0, 4, 8]",Altered b7; Altered; Phrygian b4; Phrygian #3; Mixolydian b6; Harmonic major; Ionian #5; Lydian #5; Lydian #5 #2,harmonic_minor; melodic_minor; harmonic_major; harmonic_minor; melodic_minor; harmonic_major; harmonic_minor; melodic_minor; harmonic_major,"[-5, -4, -3, -1, 0, 1, 3, 4, 5]" 6 | 4,"[0, 4, 8]__[4, 8, 0]",Altered b7; Altered; Phrygian b4; Phrygian #3; Mixolydian b6; Harmonic major; Ionian #5; Lydian #5; Lydian #5 #2,harmonic_minor; melodic_minor; harmonic_major; harmonic_minor; melodic_minor; harmonic_major; harmonic_minor; melodic_minor; harmonic_major,"[-5, -4, -3, -1, 0, 1, 3, 4, 5]" 7 | 5,"[0, 4, 8]__[8, 0, 4]",Altered b7; Altered; Phrygian b4; Phrygian #3; Mixolydian b6; Harmonic major; Ionian #5; Lydian #5; Lydian #5 #2,harmonic_minor; melodic_minor; harmonic_major; harmonic_minor; melodic_minor; harmonic_major; harmonic_minor; melodic_minor; harmonic_major,"[-5, -4, -3, -1, 0, 1, 3, 4, 5]" 8 | 6,"[0, 3, 6]__[3, 6, 9]",Altered b7; Locrian b7; Locrian #6; Dorian b5; Dorian #4; Lydian b3; Lydian #2; Lydian #5 #2,harmonic_minor; harmonic_major; harmonic_minor; harmonic_major; harmonic_minor; harmonic_major; harmonic_minor; harmonic_major,"[-5, -4, -2, -1, 1, 2, 4, 5]" 9 | 7,"[0, 3, 6]__[6, 9, 0]",Altered b7; Locrian b7; Locrian #6; Dorian b5; Dorian #4; Lydian b3; Lydian #2; Lydian #5 #2,harmonic_minor; harmonic_major; harmonic_minor; harmonic_major; harmonic_minor; harmonic_major; harmonic_minor; harmonic_major,"[-5, -4, -2, -1, 1, 2, 4, 5]" 10 | 8,"[0, 3, 6]__[9, 0, 3]",Altered b7; Locrian b7; Locrian #6; Dorian b5; Dorian #4; Lydian b3; Lydian #2; Lydian #5 #2,harmonic_minor; harmonic_major; harmonic_minor; harmonic_major; harmonic_minor; harmonic_major; harmonic_minor; harmonic_major,"[-5, -4, -2, -1, 1, 2, 4, 5]" 11 | 9,"[0, 4, 7]__[4, 7, 10]",Phrygian b4; Phrygian #3; Mixolydian b2; Mixolydian b6; Mixolydian; Lydian Dominant,harmonic_major; harmonic_minor; harmonic_major; melodic_minor; major; melodic_minor,"[-3, -1, 0, 0, 1, 2]" 12 | 10,"[0, 3, 7]__[3, 7, 10]",Phrygian b4; Phrygian; Aeolian; Dorian b2; Dorian; Dorian #4,harmonic_major; major; major; melodic_minor; major; harmonic_minor,"[-3, -2, -1, -1, 0, 1]" 13 | 11,"[0, 3, 7]__[9, 0, 3]",Dorian b2; Dorian; Dorian #4; Melodic Minor; Lydian b3; Lydian #2,melodic_minor; major; harmonic_minor; melodic_minor; harmonic_major; harmonic_minor,"[-1, 0, 1, 1, 2, 4]" 14 | 12,"[0, 3, 6]__[3, 6, 10]",Altered; Locrian; Locrian #6; Aeolian b5; Dorian b5; Dorian #4,melodic_minor; major; harmonic_minor; melodic_minor; harmonic_major; harmonic_minor,"[-4, -3, -2, -2, -1, 1]" 15 | 13,"[0, 4, 7]__[9, 0, 4]",Mixolydian b2; Mixolydian; Ionian; Lydian Dominant; Lydian; Lydian #2,harmonic_major; major; major; melodic_minor; major; harmonic_minor,"[0, 1, 2, 2, 3, 4]" 16 | 14,"[0, 3, 6]__[8, 0, 3]",Altered b7; Locrian b7; Altered; Locrian; Aeolian b5; Lydian #5 #2,harmonic_minor; harmonic_major; melodic_minor; major; melodic_minor; harmonic_major,"[-5, -4, -4, -3, -2, 5]" 17 | 15,"[0, 4, 7]__[0, 4, 8]",Phrygian b4; Phrygian #3; Mixolydian b6; Harmonic major,harmonic_major; harmonic_minor; melodic_minor; harmonic_major,"[-3, -1, 0, 1]" 18 | 16,"[0, 4, 7]__[4, 8, 0]",Phrygian b4; Phrygian #3; Mixolydian b6; Harmonic major,harmonic_major; harmonic_minor; melodic_minor; harmonic_major,"[-3, -1, 0, 1]" 19 | 17,"[0, 4, 7]__[8, 0, 4]",Phrygian b4; Phrygian #3; Mixolydian b6; Harmonic major,harmonic_major; harmonic_minor; melodic_minor; harmonic_major,"[-3, -1, 0, 1]" 20 | 18,"[0, 4, 8]__[0, 4, 7]",Phrygian b4; Phrygian #3; Mixolydian b6; Harmonic major,harmonic_major; harmonic_minor; melodic_minor; harmonic_major,"[-3, -1, 0, 1]" 21 | 19,"[0, 4, 8]__[5, 8, 0]",Phrygian #3; Mixolydian b6; Harmonic major; Ionian #5,harmonic_minor; melodic_minor; harmonic_major; harmonic_minor,"[-1, 0, 1, 3]" 22 | 20,"[0, 3, 7]__[8, 0, 3]",Phrygian b4; Phrygian; Aeolian; Harmonic Minor,harmonic_major; major; major; harmonic_minor,"[-3, -2, -1, 0]" 23 | 21,"[0, 3, 7]__[11, 3, 7]",Harmonic Minor; Melodic Minor; Lydian b3; Lydian #2,harmonic_minor; melodic_minor; harmonic_major; harmonic_minor,"[0, 1, 2, 4]" 24 | 22,"[0, 3, 7]__[3, 7, 11]",Harmonic Minor; Melodic Minor; Lydian b3; Lydian #2,harmonic_minor; melodic_minor; harmonic_major; harmonic_minor,"[0, 1, 2, 4]" 25 | 23,"[0, 3, 7]__[7, 11, 3]",Harmonic Minor; Melodic Minor; Lydian b3; Lydian #2,harmonic_minor; melodic_minor; harmonic_major; harmonic_minor,"[0, 1, 2, 4]" 26 | 24,"[0, 4, 8]__[8, 0, 3]",Altered b7; Altered; Phrygian b4; Lydian #5 #2,harmonic_minor; melodic_minor; harmonic_major; harmonic_major,"[-5, -4, -3, 5]" 27 | 25,"[0, 4, 8]__[9, 0, 4]",Altered b7; Ionian #5; Lydian #5; Lydian #5 #2,harmonic_minor; harmonic_minor; melodic_minor; harmonic_major,"[-5, 3, 4, 5]" 28 | 26,"[0, 4, 7]__[4, 7, 11]",Harmonic major; Ionian; Lydian; Lydian #2,harmonic_major; major; major; harmonic_minor,"[1, 2, 3, 4]" 29 | 27,"[0, 4, 8]__[1, 4, 8]",Altered b7; Altered; Phrygian b4; Phrygian #3,harmonic_minor; melodic_minor; harmonic_major; harmonic_minor,"[-5, -4, -3, -1]" 30 | 28,"[0, 4, 8]__[4, 8, 11]",Harmonic major; Ionian #5; Lydian #5; Lydian #5 #2,harmonic_major; harmonic_minor; melodic_minor; harmonic_major,"[1, 3, 4, 5]" 31 | 29,"[0, 3, 7]__[5, 9, 0]",Dorian b2; Dorian; Melodic Minor,melodic_minor; major; melodic_minor,"[-1, 0, 1]" 32 | 30,"[0, 3, 7]__[7, 10, 2]",Aeolian; Dorian; Dorian #4,major; major; harmonic_minor,"[-1, 0, 1]" 33 | 31,"[0, 4, 7]__[5, 8, 0]",Phrygian #3; Mixolydian b6; Harmonic major,harmonic_minor; melodic_minor; harmonic_major,"[-1, 0, 1]" 34 | 32,"[0, 3, 6]__[10, 2, 6]",Aeolian b5; Dorian b5; Dorian #4,melodic_minor; harmonic_major; harmonic_minor,"[-2, -1, 1]" 35 | 33,"[0, 3, 6]__[2, 6, 10]",Aeolian b5; Dorian b5; Dorian #4,melodic_minor; harmonic_major; harmonic_minor,"[-2, -1, 1]" 36 | 34,"[0, 3, 6]__[2, 6, 9]",Dorian b5; Dorian #4; Lydian b3,harmonic_major; harmonic_minor; harmonic_major,"[-1, 1, 2]" 37 | 35,"[0, 3, 6]__[6, 10, 2]",Aeolian b5; Dorian b5; Dorian #4,melodic_minor; harmonic_major; harmonic_minor,"[-2, -1, 1]" 38 | 36,"[0, 3, 7]__[5, 8, 0]",Phrygian; Aeolian; Harmonic Minor,major; major; harmonic_minor,"[-2, -1, 0]" 39 | 37,"[0, 3, 7]__[7, 11, 2]",Harmonic Minor; Melodic Minor; Lydian b3,harmonic_minor; melodic_minor; harmonic_major,"[0, 1, 2]" 40 | 38,"[0, 4, 7]__[5, 9, 0]",Mixolydian b2; Mixolydian; Ionian,harmonic_major; major; major,"[0, 1, 2]" 41 | 39,"[0, 4, 7]__[7, 10, 2]",Mixolydian b6; Mixolydian; Lydian Dominant,melodic_minor; major; melodic_minor,"[0, 1, 2]" 42 | 40,"[0, 3, 6]__[0, 4, 8]",Altered b7; Altered; Lydian #5 #2,harmonic_minor; melodic_minor; harmonic_major,"[-5, -4, 5]" 43 | 41,"[0, 3, 6]__[4, 8, 0]",Altered b7; Altered; Lydian #5 #2,harmonic_minor; melodic_minor; harmonic_major,"[-5, -4, 5]" 44 | 42,"[0, 3, 6]__[8, 0, 4]",Altered b7; Altered; Lydian #5 #2,harmonic_minor; melodic_minor; harmonic_major,"[-5, -4, 5]" 45 | 43,"[0, 3, 6]__[9, 0, 4]",Altered b7; Lydian #2; Lydian #5 #2,harmonic_minor; harmonic_minor; harmonic_major,"[-5, 4, 5]" 46 | 44,"[0, 4, 7]__[1, 4, 7]",Phrygian b4; Phrygian #3; Mixolydian b2,harmonic_major; harmonic_minor; harmonic_major,"[-3, -1, 0]" 47 | 45,"[0, 4, 7]__[10, 1, 4]",Phrygian b4; Phrygian #3; Mixolydian b2,harmonic_major; harmonic_minor; harmonic_major,"[-3, -1, 0]" 48 | 46,"[0, 4, 7]__[7, 10, 1]",Phrygian b4; Phrygian #3; Mixolydian b2,harmonic_major; harmonic_minor; harmonic_major,"[-3, -1, 0]" 49 | 47,"[0, 4, 8]__[0, 3, 6]",Altered b7; Altered; Lydian #5 #2,harmonic_minor; melodic_minor; harmonic_major,"[-5, -4, 5]" 50 | 48,"[0, 4, 8]__[2, 5, 8]",Mixolydian b6; Harmonic major; Ionian #5,melodic_minor; harmonic_major; harmonic_minor,"[0, 1, 3]" 51 | 49,"[0, 4, 8]__[4, 7, 10]",Phrygian b4; Phrygian #3; Mixolydian b6,harmonic_major; harmonic_minor; melodic_minor,"[-3, -1, 0]" 52 | 50,"[0, 4, 8]__[6, 9, 0]",Altered b7; Lydian #5; Lydian #5 #2,harmonic_minor; melodic_minor; harmonic_major,"[-5, 4, 5]" 53 | 51,"[0, 3, 7]__[7, 10, 1]",Phrygian b4; Phrygian; Dorian b2,harmonic_major; major; melodic_minor,"[-3, -2, -1]" 54 | 52,"[0, 4, 7]__[7, 11, 2]",Harmonic major; Ionian; Lydian,harmonic_major; major; major,"[1, 2, 3]" 55 | 53,"[0, 3, 6]__[0, 3, 7]",Dorian #4; Lydian b3; Lydian #2,harmonic_minor; harmonic_major; harmonic_minor,"[1, 2, 4]" 56 | 54,"[0, 3, 6]__[5, 9, 0]",Locrian b7; Locrian #6; Dorian b5,harmonic_major; harmonic_minor; harmonic_major,"[-4, -2, -1]" 57 | 55,"[0, 3, 7]__[0, 3, 6]",Dorian #4; Lydian b3; Lydian #2,harmonic_minor; harmonic_major; harmonic_minor,"[1, 2, 4]" 58 | 56,"[0, 3, 7]__[3, 6, 9]",Dorian #4; Lydian b3; Lydian #2,harmonic_minor; harmonic_major; harmonic_minor,"[1, 2, 4]" 59 | 57,"[0, 3, 7]__[6, 9, 0]",Dorian #4; Lydian b3; Lydian #2,harmonic_minor; harmonic_major; harmonic_minor,"[1, 2, 4]" 60 | 58,"[0, 4, 8]__[10, 1, 4]",Altered; Phrygian b4; Phrygian #3,melodic_minor; harmonic_major; harmonic_minor,"[-4, -3, -1]" 61 | 59,"[0, 4, 8]__[8, 11, 2]",Harmonic major; Ionian #5; Lydian #5,harmonic_major; harmonic_minor; melodic_minor,"[1, 3, 4]" 62 | 60,"[0, 3, 6]__[5, 8, 0]",Locrian b7; Locrian; Aeolian b5,harmonic_major; major; melodic_minor,"[-4, -3, -2]" 63 | 61,"[0, 3, 6]__[6, 10, 1]",Altered; Locrian; Locrian #6,melodic_minor; major; harmonic_minor,"[-4, -3, -2]" 64 | 62,"[0, 4, 7]__[6, 9, 0]",Lydian Dominant; Lydian; Lydian #2,melodic_minor; major; harmonic_minor,"[2, 3, 4]" 65 | 63,"[0, 3, 6]__[11, 3, 6]",Lydian b3; Lydian #2; Lydian #5 #2,harmonic_major; harmonic_minor; harmonic_major,"[2, 4, 5]" 66 | 64,"[0, 3, 6]__[6, 9, 1]",Altered b7; Locrian b7; Locrian #6,harmonic_minor; harmonic_major; harmonic_minor,"[-5, -4, -2]" 67 | 65,"[0, 4, 8]__[3, 6, 9]",Altered b7; Lydian #5 #2,harmonic_minor; harmonic_major,"[-5, 5]" 68 | 66,"[0, 4, 8]__[9, 0, 3]",Altered b7; Lydian #5 #2,harmonic_minor; harmonic_major,"[-5, 5]" 69 | 67,"[0, 3, 7]__[0, 4, 7]",Phrygian b4; Lydian #2,harmonic_major; harmonic_minor,"[-3, 4]" 70 | 68,"[0, 3, 7]__[10, 2, 5]",Aeolian; Dorian,major; major,"[-1, 0]" 71 | 69,"[0, 3, 7]__[11, 2, 5]",Harmonic Minor; Melodic Minor,harmonic_minor; melodic_minor,"[0, 1]" 72 | 70,"[0, 3, 7]__[2, 5, 8]",Aeolian; Harmonic Minor,major; harmonic_minor,"[-1, 0]" 73 | 71,"[0, 3, 7]__[2, 5, 9]",Dorian; Melodic Minor,major; melodic_minor,"[0, 1]" 74 | 72,"[0, 4, 7]__[0, 3, 7]",Phrygian b4; Lydian #2,harmonic_major; harmonic_minor,"[-3, 4]" 75 | 73,"[0, 4, 7]__[10, 1, 5]",Phrygian #3; Mixolydian b2,harmonic_minor; harmonic_major,"[-1, 0]" 76 | 74,"[0, 4, 7]__[10, 2, 5]",Mixolydian b6; Mixolydian,melodic_minor; major,"[0, 1]" 77 | 75,"[0, 4, 7]__[2, 5, 8]",Mixolydian b6; Harmonic major,melodic_minor; harmonic_major,"[0, 1]" 78 | 76,"[0, 3, 6]__[10, 2, 5]",Aeolian b5; Dorian b5,melodic_minor; harmonic_major,"[-2, -1]" 79 | 77,"[0, 3, 7]__[10, 1, 5]",Phrygian; Dorian b2,major; melodic_minor,"[-2, -1]" 80 | 78,"[0, 3, 7]__[2, 6, 9]",Dorian #4; Lydian b3,harmonic_minor; harmonic_major,"[1, 2]" 81 | 79,"[0, 4, 7]__[11, 2, 5]",Harmonic major; Ionian,harmonic_major; major,"[1, 2]" 82 | 80,"[0, 4, 7]__[2, 5, 9]",Mixolydian; Ionian,major; major,"[1, 2]" 83 | 81,"[0, 4, 7]__[1, 4, 8]",Phrygian b4; Phrygian #3,harmonic_major; harmonic_minor,"[-3, -1]" 84 | 82,"[0, 4, 8]__[1, 4, 7]",Phrygian b4; Phrygian #3,harmonic_major; harmonic_minor,"[-3, -1]" 85 | 83,"[0, 4, 8]__[11, 2, 5]",Harmonic major; Ionian #5,harmonic_major; harmonic_minor,"[1, 3]" 86 | 84,"[0, 4, 8]__[5, 8, 11]",Harmonic major; Ionian #5,harmonic_major; harmonic_minor,"[1, 3]" 87 | 85,"[0, 4, 8]__[7, 10, 1]",Phrygian b4; Phrygian #3,harmonic_major; harmonic_minor,"[-3, -1]" 88 | 86,"[0, 3, 6]__[10, 1, 5]",Locrian; Locrian #6,major; harmonic_minor,"[-3, -2]" 89 | 87,"[0, 4, 7]__[2, 6, 9]",Lydian Dominant; Lydian,melodic_minor; major,"[2, 3]" 90 | 88,"[0, 3, 6]__[1, 5, 9]",Locrian b7; Locrian #6,harmonic_major; harmonic_minor,"[-4, -2]" 91 | 89,"[0, 3, 6]__[11, 3, 7]",Lydian b3; Lydian #2,harmonic_major; harmonic_minor,"[2, 4]" 92 | 90,"[0, 3, 6]__[3, 7, 11]",Lydian b3; Lydian #2,harmonic_major; harmonic_minor,"[2, 4]" 93 | 91,"[0, 3, 6]__[5, 9, 1]",Locrian b7; Locrian #6,harmonic_major; harmonic_minor,"[-4, -2]" 94 | 92,"[0, 3, 6]__[7, 11, 3]",Lydian b3; Lydian #2,harmonic_major; harmonic_minor,"[2, 4]" 95 | 93,"[0, 3, 6]__[9, 1, 5]",Locrian b7; Locrian #6,harmonic_major; harmonic_minor,"[-4, -2]" 96 | 94,"[0, 3, 7]__[11, 3, 6]",Lydian b3; Lydian #2,harmonic_major; harmonic_minor,"[2, 4]" 97 | 95,"[0, 3, 6]__[1, 5, 8]",Locrian b7; Locrian,harmonic_major; major,"[-4, -3]" 98 | 96,"[0, 3, 6]__[1, 4, 8]",Altered b7; Altered,harmonic_minor; melodic_minor,"[-5, -4]" 99 | 97,"[0, 3, 7]__[5, 8, 11]",Harmonic Minor,harmonic_minor,[0] 100 | 98,"[0, 3, 7]__[8, 11, 2]",Harmonic Minor,harmonic_minor,[0] 101 | 99,"[0, 3, 7]__[8, 11, 3]",Harmonic Minor,harmonic_minor,[0] 102 | 100,"[0, 4, 7]__[1, 5, 9]",Mixolydian b2,harmonic_major,[0] 103 | 101,"[0, 4, 7]__[5, 9, 1]",Mixolydian b2,harmonic_major,[0] 104 | 102,"[0, 4, 7]__[9, 1, 4]",Mixolydian b2,harmonic_major,[0] 105 | 103,"[0, 4, 7]__[9, 1, 5]",Mixolydian b2,harmonic_major,[0] 106 | 104,"[0, 4, 8]__[10, 2, 5]",Mixolydian b6,melodic_minor,[0] 107 | 105,"[0, 4, 8]__[7, 10, 2]",Mixolydian b6,melodic_minor,[0] 108 | 106,"[0, 3, 6]__[2, 5, 9]",Dorian b5,harmonic_major,[-1] 109 | 107,"[0, 3, 6]__[3, 7, 10]",Dorian #4,harmonic_minor,[1] 110 | 108,"[0, 3, 6]__[7, 10, 2]",Dorian #4,harmonic_minor,[1] 111 | 109,"[0, 3, 7]__[1, 5, 9]",Dorian b2,melodic_minor,[-1] 112 | 110,"[0, 3, 7]__[10, 2, 6]",Dorian #4,harmonic_minor,[1] 113 | 111,"[0, 3, 7]__[2, 6, 10]",Dorian #4,harmonic_minor,[1] 114 | 112,"[0, 3, 7]__[3, 6, 10]",Dorian #4,harmonic_minor,[1] 115 | 113,"[0, 3, 7]__[5, 9, 1]",Dorian b2,melodic_minor,[-1] 116 | 114,"[0, 3, 7]__[6, 10, 2]",Dorian #4,harmonic_minor,[1] 117 | 115,"[0, 3, 7]__[9, 1, 5]",Dorian b2,melodic_minor,[-1] 118 | 116,"[0, 4, 7]__[1, 5, 8]",Phrygian #3,harmonic_minor,[-1] 119 | 117,"[0, 4, 7]__[4, 8, 11]",Harmonic major,harmonic_major,[1] 120 | 118,"[0, 4, 7]__[5, 8, 11]",Harmonic major,harmonic_major,[1] 121 | 119,"[0, 4, 7]__[8, 11, 2]",Harmonic major,harmonic_major,[1] 122 | 120,"[0, 4, 8]__[1, 5, 8]",Phrygian #3,harmonic_minor,[-1] 123 | 121,"[0, 4, 8]__[10, 1, 5]",Phrygian #3,harmonic_minor,[-1] 124 | 122,"[0, 4, 8]__[4, 7, 11]",Harmonic major,harmonic_major,[1] 125 | 123,"[0, 4, 8]__[7, 11, 2]",Harmonic major,harmonic_major,[1] 126 | 124,"[0, 3, 6]__[11, 2, 6]",Lydian b3,harmonic_major,[2] 127 | 125,"[0, 3, 6]__[2, 5, 8]",Aeolian b5,melodic_minor,[-2] 128 | 126,"[0, 3, 6]__[7, 11, 2]",Lydian b3,harmonic_major,[2] 129 | 127,"[0, 3, 7]__[1, 5, 8]",Phrygian,major,[-2] 130 | 128,"[0, 3, 7]__[11, 2, 6]",Lydian b3,harmonic_major,[2] 131 | 129,"[0, 4, 7]__[10, 2, 6]",Lydian Dominant,melodic_minor,[2] 132 | 130,"[0, 4, 7]__[2, 6, 10]",Lydian Dominant,melodic_minor,[2] 133 | 131,"[0, 4, 7]__[6, 10, 2]",Lydian Dominant,melodic_minor,[2] 134 | 132,"[0, 3, 7]__[0, 4, 8]",Phrygian b4,harmonic_major,[-3] 135 | 133,"[0, 3, 7]__[1, 4, 7]",Phrygian b4,harmonic_major,[-3] 136 | 134,"[0, 3, 7]__[1, 4, 8]",Phrygian b4,harmonic_major,[-3] 137 | 135,"[0, 3, 7]__[10, 1, 4]",Phrygian b4,harmonic_major,[-3] 138 | 136,"[0, 3, 7]__[4, 7, 10]",Phrygian b4,harmonic_major,[-3] 139 | 137,"[0, 3, 7]__[4, 8, 0]",Phrygian b4,harmonic_major,[-3] 140 | 138,"[0, 3, 7]__[8, 0, 4]",Phrygian b4,harmonic_major,[-3] 141 | 139,"[0, 4, 7]__[11, 2, 6]",Lydian,major,[3] 142 | 140,"[0, 4, 7]__[3, 7, 10]",Phrygian b4,harmonic_major,[-3] 143 | 141,"[0, 4, 7]__[8, 0, 3]",Phrygian b4,harmonic_major,[-3] 144 | 142,"[0, 4, 8]__[0, 3, 7]",Phrygian b4,harmonic_major,[-3] 145 | 143,"[0, 4, 8]__[2, 5, 9]",Ionian #5,harmonic_minor,[3] 146 | 144,"[0, 4, 8]__[3, 7, 10]",Phrygian b4,harmonic_major,[-3] 147 | 145,"[0, 4, 8]__[5, 9, 0]",Ionian #5,harmonic_minor,[3] 148 | 146,"[0, 3, 6]__[0, 4, 7]",Lydian #2,harmonic_minor,[4] 149 | 147,"[0, 3, 6]__[10, 1, 4]",Altered,melodic_minor,[-4] 150 | 148,"[0, 3, 6]__[4, 7, 11]",Lydian #2,harmonic_minor,[4] 151 | 149,"[0, 3, 7]__[4, 7, 11]",Lydian #2,harmonic_minor,[4] 152 | 150,"[0, 3, 7]__[9, 0, 4]",Lydian #2,harmonic_minor,[4] 153 | 151,"[0, 4, 7]__[0, 3, 6]",Lydian #2,harmonic_minor,[4] 154 | 152,"[0, 4, 7]__[11, 3, 6]",Lydian #2,harmonic_minor,[4] 155 | 153,"[0, 4, 7]__[11, 3, 7]",Lydian #2,harmonic_minor,[4] 156 | 154,"[0, 4, 7]__[3, 6, 9]",Lydian #2,harmonic_minor,[4] 157 | 155,"[0, 4, 7]__[3, 7, 11]",Lydian #2,harmonic_minor,[4] 158 | 156,"[0, 4, 7]__[7, 11, 3]",Lydian #2,harmonic_minor,[4] 159 | 157,"[0, 4, 7]__[9, 0, 3]",Lydian #2,harmonic_minor,[4] 160 | 158,"[0, 4, 8]__[11, 2, 6]",Lydian #5,melodic_minor,[4] 161 | 159,"[0, 4, 8]__[2, 6, 9]",Lydian #5,melodic_minor,[4] 162 | 160,"[0, 4, 8]__[3, 6, 10]",Altered,melodic_minor,[-4] 163 | 161,"[0, 4, 8]__[6, 10, 1]",Altered,melodic_minor,[-4] 164 | 162,"[0, 3, 6]__[4, 8, 11]",Lydian #5 #2,harmonic_major,[5] 165 | 163,"[0, 3, 6]__[8, 11, 3]",Lydian #5 #2,harmonic_major,[5] 166 | 164,"[0, 3, 6]__[9, 1, 4]",Altered b7,harmonic_minor,[-5] 167 | 165,"[0, 4, 8]__[11, 3, 6]",Lydian #5 #2,harmonic_major,[5] 168 | 166,"[0, 4, 8]__[6, 9, 1]",Altered b7,harmonic_minor,[-5] 169 | 167,"[0, 4, 8]__[8, 11, 3]",Lydian #5 #2,harmonic_major,[5] 170 | 168,"[0, 4, 8]__[9, 1, 4]",Altered b7,harmonic_minor,[-5] 171 | --------------------------------------------------------------------------------