Modes

Here we demonstrate some of the capabilities of the Key class.

from pyabc2 import Key
mode_abbrs = ["ion", "dor", "phr", "lyd", "mix", "aeo", "loc"]

modes = [Key(f"G{m}") for m in mode_abbrs]
modes
[Key(tonic=G, mode='Ionian'),
 Key(tonic=G, mode='Dorian'),
 Key(tonic=G, mode='Phrygian'),
 Key(tonic=G, mode='Lydian'),
 Key(tonic=G, mode='Mixolydian'),
 Key(tonic=G, mode='Aeolian'),
 Key(tonic=G, mode='Locrian')]

Relatives

[
    modes[0].relative(abbr)
    for abbr in mode_abbrs
]
[Key(tonic=G, mode='Ionian'),
 Key(tonic=A, mode='Dorian'),
 Key(tonic=B, mode='Phrygian'),
 Key(tonic=C, mode='Lydian'),
 Key(tonic=D, mode='Mixolydian'),
 Key(tonic=E, mode='Aeolian'),
 Key(tonic=F#, mode='Locrian')]
modes[0].relative_minor
Key(tonic=E, mode='Minor')
modes[-1].relative_major
Key(tonic=Ab, mode='Major')

Scale

Various representations of notes in the scale.

for m in modes:
    m.print_scale()
G  A  B  C  D  E  F#
G  A  Bb C  D  E  F 
G  Ab Bb C  D  Eb F 
G  A  B  C# D  E  F#
G  A  B  C  D  E  F 
G  A  Bb C  D  Eb F 
G  Ab Bb C  Db Eb F 
for m in modes:
    m.print_scale_degrees_wrt_major()
1  2  3  4  5  6  7 
1  2  b3 4  5  6  b7
1  b2 b3 4  5  b6 b7
1  2  3  #4 5  6  7 
1  2  3  4  5  6  b7
1  2  b3 4  5  b6 b7
1  b2 b3 4  b5 b6 b7
for m in modes:
    m.print_intervals()
W W H W W W H
W H W W W H W
H W W W H W W
W W W H W W H
W W H W W H W
W H W W H W W
H W W H W W W
for m in modes:
    m.print_intervals(fmt="-")
|--|--|-|--|--|--|-
|--|-|--|--|--|-|--
|-|--|--|--|-|--|--
|--|--|--|-|--|--|-
|--|--|-|--|--|-|--
|--|-|--|--|-|--|--
|-|--|--|-|--|--|--
for m in modes:
    m.print_scale_chromatic_values()
0  2  4  5  7  9  11
0  2  3  5  7  9  10
0  1  3  5  7  8  10
0  2  4  6  7  9  11
0  2  4  5  7  9  10
0  2  3  5  7  8  10
0  1  3  5  6  8  10
from fractions import Fraction

from pyabc2 import Tune

abc = """\
T: G modes
K: G
"""
for m in modes:
    abc += f"P: {m.mode}\n"
    abc += " ".join(
        pc.to_pitch(octave=4 if pc.nat in "GAB" else 5)
        .to_note(duration=Fraction("1/4"))
        .to_abc(key=Key("G"))
        for pc in m.scale
    ) + " |\n"
abc += "|]"

print(abc)

Tune(abc)
T: G modes
K: G
P: Ionian
G2 A2 B2 c2 d2 e2 f2 |
P: Dorian
G2 A2 _B2 c2 d2 e2 =f2 |
P: Phrygian
G2 _A2 _B2 c2 d2 _e2 =f2 |
P: Lydian
G2 A2 B2 ^c2 d2 e2 f2 |
P: Mixolydian
G2 A2 B2 c2 d2 e2 =f2 |
P: Aeolian
G2 A2 _B2 c2 d2 _e2 =f2 |
P: Locrian
G2 _A2 _B2 c2 _d2 _e2 =f2 |
|]
Tune(title='G modes', key=Gmaj, type='?')

Chromatic

for m in modes:
    m.print_chromatic_scale_degrees()
1  #1 2  #2 3  4  #4 5  #5 6  #6 7 
1  #1 2  3  #3 4  #4 5  #5 6  7  #7
1  2  #2 3  #3 4  #4 5  6  #6 7  #7
1  #1 2  #2 3  #3 4  5  #5 6  #6 7 
1  #1 2  #2 3  4  #4 5  #5 6  7  #7
1  #1 2  3  #3 4  #4 5  6  #6 7  #7
1  2  #2 3  #3 4  5  #5 6  #6 7  #7
for m in modes:
    m.print_chromatic_scale_degrees(acc_fmt="#/b")
1     #1/b2 2     #2/b3 3     4     #4/b5 5     #5/b6 6     #6/b7 7    
1     #1/b2 2     3     #3/b4 4     #4/b5 5     #5/b6 6     7     #7/b1
1     2     #2/b3 3     #3/b4 4     #4/b5 5     6     #6/b7 7     #7/b1
1     #1/b2 2     #2/b3 3     #3/b4 4     5     #5/b6 6     #6/b7 7    
1     #1/b2 2     #2/b3 3     4     #4/b5 5     #5/b6 6     7     #7/b1
1     #1/b2 2     3     #3/b4 4     #4/b5 5     6     #6/b7 7     #7/b1
1     2     #2/b3 3     #3/b4 4     5     #5/b6 6     #6/b7 7     #7/b1