use super::Degree;
use crate::types::{Cents, Note, Steps};
use std::fmt;
#[derive(Copy, Clone, PartialOrd, PartialEq, Debug)]
pub enum PerfectQuality {
TripleDiminished,
DoubleDiminished,
Diminished,
Perfect,
Augmented,
DoubleAugmented,
TripleAugmented,
}
#[derive(Copy, Clone, PartialOrd, PartialEq, Debug)]
pub enum MajorQuality {
TripleDiminished,
DoubleDiminished,
Diminished,
Major,
Minor,
Augmented,
DoubleAugmented,
TripleAugmented,
}
impl fmt::Display for PerfectQuality {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match *self {
PerfectQuality::TripleDiminished => write!(f, "ddd"),
PerfectQuality::DoubleDiminished => write!(f, "dd"),
PerfectQuality::Diminished => write!(f, "d"),
PerfectQuality::Perfect => write!(f, "P"),
PerfectQuality::Augmented => write!(f, "A"),
PerfectQuality::DoubleAugmented => write!(f, "AA"),
PerfectQuality::TripleAugmented => write!(f, "AAA"),
}
}
}
impl fmt::Display for MajorQuality {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match *self {
MajorQuality::TripleDiminished => write!(f, "ddd"),
MajorQuality::DoubleDiminished => write!(f, "dd"),
MajorQuality::Diminished => write!(f, "d"),
MajorQuality::Major => write!(f, "M"),
MajorQuality::Minor => write!(f, "m"),
MajorQuality::Augmented => write!(f, "A"),
MajorQuality::DoubleAugmented => write!(f, "AA"),
MajorQuality::TripleAugmented => write!(f, "AA"),
}
}
}
#[derive(Copy, Clone, PartialOrd, PartialEq, Debug)]
pub enum Interval {
First(PerfectQuality),
Second(MajorQuality),
Third(MajorQuality),
Fourth(PerfectQuality),
Fifth(PerfectQuality),
Sixth(MajorQuality),
Seventh(MajorQuality),
Octave(PerfectQuality),
Ninth(MajorQuality),
Tenth(MajorQuality),
Eleventh(PerfectQuality),
Twelfth(PerfectQuality),
Thirteenth(MajorQuality),
Fourteenth(MajorQuality),
}
impl Interval {
pub fn degree(&self) -> Degree {
match *self {
Interval::First(_) => Degree::Tonic,
Interval::Second(_) => Degree::Supertonic,
Interval::Third(_) => Degree::Mediant,
Interval::Fourth(_) => Degree::Subdominant,
Interval::Fifth(_) => Degree::Dominant,
Interval::Sixth(_) => Degree::Submediant,
Interval::Seventh(_) => Degree::Subtonic,
Interval::Octave(_) => Degree::Tonic,
Interval::Ninth(_) => Degree::Supertonic,
Interval::Tenth(_) => Degree::Mediant,
Interval::Eleventh(_) => Degree::Subdominant,
Interval::Twelfth(_) => Degree::Dominant,
Interval::Thirteenth(_) => Degree::Submediant,
Interval::Fourteenth(_) => Degree::Subtonic,
}
}
pub fn steps(&self) -> Steps {
fn ptou(base: u16, q: PerfectQuality) -> Steps {
let steps = match q {
PerfectQuality::TripleDiminished => 9,
PerfectQuality::DoubleDiminished => 10,
PerfectQuality::Diminished => 11,
PerfectQuality::Perfect => 12,
PerfectQuality::Augmented => 13,
PerfectQuality::DoubleAugmented => 14,
PerfectQuality::TripleAugmented => 15,
} + base as i16;
Steps::from((steps % 12) as u16)
}
fn mtou(base: u16, q: MajorQuality) -> Steps {
let steps = match q {
MajorQuality::TripleDiminished => 8,
MajorQuality::DoubleDiminished => 9,
MajorQuality::Diminished => 10,
MajorQuality::Minor => 11,
MajorQuality::Major => 12,
MajorQuality::Augmented => 13,
MajorQuality::DoubleAugmented => 14,
MajorQuality::TripleAugmented => 15,
} + base as i16;
Steps::from((steps % 12) as u16)
}
match *self {
Interval::First(q) => ptou(0, q),
Interval::Second(q) => mtou(2, q),
Interval::Third(q) => mtou(4, q),
Interval::Fourth(q) => ptou(5, q),
Interval::Fifth(q) => ptou(7, q),
Interval::Sixth(q) => mtou(9, q),
Interval::Seventh(q) => mtou(11, q),
Interval::Octave(q) => ptou(12, q),
Interval::Ninth(q) => mtou(14, q),
Interval::Tenth(q) => mtou(16, q),
Interval::Eleventh(q) => ptou(17, q),
Interval::Twelfth(q) => ptou(19, q),
Interval::Thirteenth(q) => mtou(21, q),
Interval::Fourteenth(q) => mtou(23, q),
}
}
#[rustfmt::skip]
pub fn distance(l: Note, r: Note) -> Option<Interval> {
use super::{Accidental::*, Interval::*, Note::*};
match (l, r) {
(C(DoubleFlat), C(DoubleFlat)) => Some(First(PerfectQuality::Perfect)),
(C(DoubleFlat), C(Flat)) => Some(First(PerfectQuality::Augmented)),
(C(DoubleFlat), C(Natural)) => Some(First(PerfectQuality::DoubleAugmented)),
(C(DoubleFlat), D(DoubleFlat)) => Some(Second(MajorQuality::Major)),
(C(DoubleFlat), D(Flat)) => Some(Second(MajorQuality::Augmented)),
(C(DoubleFlat), D(Natural)) => Some(Second(MajorQuality::DoubleAugmented)),
(C(DoubleFlat), E(DoubleFlat)) => Some(Third(MajorQuality::Major)),
(C(DoubleFlat), E(Flat)) => Some(Third(MajorQuality::Augmented)),
(C(DoubleFlat), E(Natural)) => Some(Third(MajorQuality::DoubleAugmented)),
(C(DoubleFlat), F(DoubleFlat)) => Some(Fourth(PerfectQuality::Perfect)),
(C(DoubleFlat), F(Flat)) => Some(Fourth(PerfectQuality::Augmented)),
(C(DoubleFlat), F(Natural)) => Some(Fourth(PerfectQuality::DoubleAugmented)),
(C(DoubleFlat), G(DoubleFlat)) => Some(Fifth(PerfectQuality::Perfect)),
(C(DoubleFlat), G(Flat)) => Some(Fifth(PerfectQuality::Augmented)),
(C(DoubleFlat), G(Natural)) => Some(Fifth(PerfectQuality::DoubleAugmented)),
(C(DoubleFlat), A(DoubleFlat)) => Some(Sixth(MajorQuality::Major)),
(C(DoubleFlat), A(Flat)) => Some(Sixth(MajorQuality::Augmented)),
(C(DoubleFlat), A(Natural)) => Some(Sixth(MajorQuality::DoubleAugmented)),
(C(DoubleFlat), B(DoubleFlat)) => Some(Seventh(MajorQuality::Major)),
(C(DoubleFlat), B(Flat)) => Some(Sixth(MajorQuality::Augmented)),
(C(DoubleFlat), B(Natural)) => Some(Seventh(MajorQuality::DoubleAugmented)),
(C(Flat), C(DoubleFlat)) => Some(First(PerfectQuality::Diminished)),
(C(Flat), C(Flat)) => Some(First(PerfectQuality::Perfect)),
(C(Flat), C(Natural)) => Some(First(PerfectQuality::Augmented)),
(C(Flat), D(DoubleFlat)) => Some(Second(MajorQuality::Minor)),
(C(Flat), D(Flat)) => Some(Second(MajorQuality::Major)),
(C(Flat), D(Natural)) => Some(Second(MajorQuality::Augmented)),
(C(Flat), E(DoubleFlat)) => Some(Third(MajorQuality::Minor)),
(C(Flat), E(Flat)) => Some(Third(MajorQuality::Major)),
(C(Flat), E(Natural)) => Some(Third(MajorQuality::Augmented)),
(C(Flat), F(DoubleFlat)) => Some(Fourth(PerfectQuality::Diminished)),
(C(Flat), F(Flat)) => Some(Fourth(PerfectQuality::Perfect)),
(C(Flat), F(Natural)) => Some(Fourth(PerfectQuality::Augmented)),
(C(Flat), G(DoubleFlat)) => Some(Fifth(PerfectQuality::Diminished)),
(C(Flat), G(Flat)) => Some(Fifth(PerfectQuality::Perfect)),
(C(Flat), G(Natural)) => Some(Fifth(PerfectQuality::Augmented)),
(C(Flat), A(DoubleFlat)) => Some(Sixth(MajorQuality::Minor)),
(C(Flat), A(Flat)) => Some(Sixth(MajorQuality::Major)),
(C(Flat), A(Natural)) => Some(Sixth(MajorQuality::Augmented)),
(C(Flat), B(DoubleFlat)) => Some(Seventh(MajorQuality::Minor)),
(C(Flat), B(Flat)) => Some(Seventh(MajorQuality::Major)),
(C(Flat), B(Natural)) => Some(Seventh(MajorQuality::Augmented)),
(C(Natural), C(DoubleFlat)) => Some(First(PerfectQuality::DoubleDiminished)),
(C(Natural), C(Flat)) => Some(First(PerfectQuality::Diminished)),
(C(Natural), C(Natural)) => Some(First(PerfectQuality::Perfect)),
(C(Natural), C(Sharp)) => Some(First(PerfectQuality::Augmented)),
(C(Natural), C(DoubleSharp)) => Some(First(PerfectQuality::DoubleAugmented)),
(C(Natural), D(DoubleFlat)) => Some(Second(MajorQuality::Diminished)),
(C(Natural), D(Flat)) => Some(Second(MajorQuality::Minor)),
(C(Natural), D(Natural)) => Some(Second(MajorQuality::Major)),
(C(Natural), D(Sharp)) => Some(Second(MajorQuality::Augmented)),
(C(Natural), D(DoubleSharp)) => Some(Second(MajorQuality::DoubleAugmented)),
(C(Natural), E(DoubleFlat)) => Some(Third(MajorQuality::Diminished)),
(C(Natural), E(Flat)) => Some(Third(MajorQuality::Minor)),
(C(Natural), E(Natural)) => Some(Third(MajorQuality::Major)),
(C(Natural), E(Sharp)) => Some(Third(MajorQuality::Augmented)),
(C(Natural), E(DoubleSharp)) => Some(Third(MajorQuality::DoubleAugmented)),
(C(Natural), F(DoubleFlat)) => Some(Fourth(PerfectQuality::DoubleDiminished)),
(C(Natural), F(Flat)) => Some(Fourth(PerfectQuality::Diminished)),
(C(Natural), F(Natural)) => Some(Fourth(PerfectQuality::Perfect)),
(C(Natural), F(Sharp)) => Some(Fourth(PerfectQuality::Augmented)),
(C(Natural), F(DoubleSharp)) => Some(Fourth(PerfectQuality::DoubleAugmented)),
(C(Natural), G(DoubleFlat)) => Some(Fifth(PerfectQuality::DoubleDiminished)),
(C(Natural), G(Flat)) => Some(Fifth(PerfectQuality::Diminished)),
(C(Natural), G(Natural)) => Some(Fifth(PerfectQuality::Perfect)),
(C(Natural), G(Sharp)) => Some(Fifth(PerfectQuality::Augmented)),
(C(Natural), G(DoubleSharp)) => Some(Fifth(PerfectQuality::DoubleAugmented)),
(C(Natural), A(DoubleFlat)) => Some(Sixth(MajorQuality::Diminished)),
(C(Natural), A(Flat)) => Some(Sixth(MajorQuality::Minor)),
(C(Natural), A(Natural)) => Some(Sixth(MajorQuality::Major)),
(C(Natural), A(Sharp)) => Some(Sixth(MajorQuality::Augmented)),
(C(Natural), A(DoubleSharp)) => Some(Sixth(MajorQuality::DoubleAugmented)),
(C(Natural), B(DoubleFlat)) => Some(Seventh(MajorQuality::Diminished)),
(C(Natural), B(Flat)) => Some(Seventh(MajorQuality::Minor)),
(C(Natural), B(Natural)) => Some(Seventh(MajorQuality::Major)),
(C(Natural), B(Sharp)) => Some(Seventh(MajorQuality::Augmented)),
(C(Sharp), C(Natural)) => Some(First(PerfectQuality::Diminished)),
(C(Sharp), C(Sharp)) => Some(First(PerfectQuality::Perfect)),
(C(Sharp), C(DoubleSharp)) => Some(First(PerfectQuality::Augmented)),
(C(Sharp), D(Natural)) => Some(Second(MajorQuality::Minor)),
(C(Sharp), D(Sharp)) => Some(Second(MajorQuality::Major)),
(C(Sharp), D(DoubleSharp)) => Some(Second(MajorQuality::Augmented)),
(C(Sharp), E(Natural)) => Some(Third(MajorQuality::Minor)),
(C(Sharp), E(Sharp)) => Some(Third(MajorQuality::Major)),
(C(Sharp), F(Natural)) => Some(Fourth(PerfectQuality::Diminished)),
(C(Sharp), E(DoubleSharp)) => Some(Third(MajorQuality::Augmented)),
(C(Sharp), F(Sharp)) => Some(Fourth(PerfectQuality::Perfect)),
(C(Sharp), F(DoubleSharp)) => Some(Fourth(PerfectQuality::Augmented)),
(C(Sharp), G(Natural)) => Some(Fifth(PerfectQuality::Diminished)),
(C(Sharp), G(Sharp)) => Some(Fifth(PerfectQuality::Perfect)),
(C(Sharp), G(DoubleSharp)) => Some(Fifth(PerfectQuality::Augmented)),
(C(Sharp), A(Natural)) => Some(Sixth(MajorQuality::Minor)),
(C(Sharp), A(Sharp)) => Some(Sixth(MajorQuality::Major)),
(C(Sharp), A(DoubleSharp)) => Some(Sixth(MajorQuality::Augmented)),
(C(Sharp), B(Natural)) => Some(Seventh(MajorQuality::Minor)),
(C(Sharp), B(Sharp)) => Some(Seventh(MajorQuality::Major)),
(C(Sharp), B(DoubleSharp)) => Some(Seventh(MajorQuality::Augmented)),
(C(DoubleSharp), C(Natural)) => Some(First(PerfectQuality::DoubleDiminished)),
(C(DoubleSharp), C(Sharp)) => Some(First(PerfectQuality::Diminished)),
(C(DoubleSharp), C(DoubleSharp)) => Some(First(PerfectQuality::Perfect)),
(C(DoubleSharp), D(Natural)) => Some(Second(MajorQuality::Diminished)),
(C(DoubleSharp), D(Sharp)) => Some(Second(MajorQuality::Minor)),
(C(DoubleSharp), D(DoubleSharp)) => Some(Second(MajorQuality::Major)),
(C(DoubleSharp), E(Natural)) => Some(Third(MajorQuality::Diminished)),
(C(DoubleSharp), E(Sharp)) => Some(Third(MajorQuality::Minor)),
(C(DoubleSharp), E(DoubleSharp)) => Some(Third(MajorQuality::Major)),
(C(DoubleSharp), F(Natural)) => Some(Fourth(PerfectQuality::DoubleDiminished)),
(C(DoubleSharp), F(Sharp)) => Some(Fourth(PerfectQuality::Diminished)),
(C(DoubleSharp), F(DoubleSharp)) => Some(Fourth(PerfectQuality::Perfect)),
(C(DoubleSharp), G(Natural)) => Some(Fifth(PerfectQuality::DoubleDiminished)),
(C(DoubleSharp), G(Sharp)) => Some(Fifth(PerfectQuality::Diminished)),
(C(DoubleSharp), G(DoubleSharp)) => Some(Fifth(PerfectQuality::Perfect)),
(C(DoubleSharp), A(Natural)) => Some(Sixth(MajorQuality::Diminished)),
(C(DoubleSharp), A(Sharp)) => Some(Sixth(MajorQuality::Minor)),
(C(DoubleSharp), A(DoubleSharp)) => Some(Sixth(MajorQuality::Major)),
(C(DoubleSharp), B(Natural)) => Some(Seventh(MajorQuality::Diminished)),
(C(DoubleSharp), B(Sharp)) => Some(Seventh(MajorQuality::Minor)),
(C(DoubleSharp), B(DoubleSharp)) => Some(Seventh(MajorQuality::Major)),
(D(DoubleFlat), D(DoubleFlat)) => Some(First(PerfectQuality::Perfect)),
(D(DoubleFlat), D(Flat)) => Some(First(PerfectQuality::Augmented)),
(D(DoubleFlat), D(Natural)) => Some(First(PerfectQuality::DoubleAugmented)),
(D(DoubleFlat), E(DoubleFlat)) => Some(Second(MajorQuality::Major)),
(D(DoubleFlat), E(Flat)) => Some(Second(MajorQuality::Augmented)),
(D(DoubleFlat), E(Natural)) => Some(Second(MajorQuality::DoubleAugmented)),
(D(DoubleFlat), F(DoubleFlat)) => Some(Third(MajorQuality::Minor)),
(D(DoubleFlat), F(Flat)) => Some(Third(MajorQuality::Major)),
(D(DoubleFlat), F(Natural)) => Some(Third(MajorQuality::Augmented)),
(D(DoubleFlat), G(DoubleFlat)) => Some(Fourth(PerfectQuality::Perfect)),
(D(DoubleFlat), G(Flat)) => Some(Fourth(PerfectQuality::Augmented)),
(D(DoubleFlat), G(Natural)) => Some(Fourth(PerfectQuality::DoubleAugmented)),
(D(DoubleFlat), A(DoubleFlat)) => Some(Fifth(PerfectQuality::Perfect)),
(D(DoubleFlat), A(Flat)) => Some(Fifth(PerfectQuality::Augmented)),
(D(DoubleFlat), A(Natural)) => Some(Fifth(PerfectQuality::DoubleAugmented)),
(D(DoubleFlat), B(DoubleFlat)) => Some(Sixth(MajorQuality::Major)),
(D(DoubleFlat), B(Flat)) => Some(Sixth(MajorQuality::Augmented)),
(D(DoubleFlat), B(Natural)) => Some(Sixth(MajorQuality::DoubleAugmented)),
(D(DoubleFlat), C(DoubleFlat)) => Some(Seventh(MajorQuality::Minor)),
(D(DoubleFlat), C(Flat)) => Some(Seventh(MajorQuality::Major)),
(D(DoubleFlat), C(Natural)) => Some(Seventh(MajorQuality::Augmented)),
(D(Flat), D(DoubleFlat)) => Some(First(PerfectQuality::Diminished)),
(D(Flat), D(Flat)) => Some(First(PerfectQuality::Perfect)),
(D(Flat), D(Natural)) => Some(First(PerfectQuality::Augmented)),
(D(Flat), E(DoubleFlat)) => Some(Second(MajorQuality::Minor)),
(D(Flat), E(Flat)) => Some(Second(MajorQuality::Major)),
(D(Flat), E(Natural)) => Some(Second(MajorQuality::Augmented)),
(D(Flat), F(DoubleFlat)) => Some(Third(MajorQuality::Diminished)),
(D(Flat), F(Flat)) => Some(Third(MajorQuality::Minor)),
(D(Flat), F(Natural)) => Some(Third(MajorQuality::Major)),
(D(Flat), G(DoubleFlat)) => Some(Fourth(PerfectQuality::Diminished)),
(D(Flat), G(Flat)) => Some(Fourth(PerfectQuality::Perfect)),
(D(Flat), G(Natural)) => Some(Fourth(PerfectQuality::Augmented)),
(D(Flat), A(DoubleFlat)) => Some(Fifth(PerfectQuality::Diminished)),
(D(Flat), A(Flat)) => Some(Fifth(PerfectQuality::Perfect)),
(D(Flat), A(Natural)) => Some(Fifth(PerfectQuality::Augmented)),
(D(Flat), B(DoubleFlat)) => Some(Sixth(MajorQuality::Minor)),
(D(Flat), B(Flat)) => Some(Sixth(MajorQuality::Major)),
(D(Flat), B(Natural)) => Some(Sixth(MajorQuality::Augmented)),
(D(Flat), C(DoubleFlat)) => Some(Seventh(MajorQuality::Diminished)),
(D(Flat), C(Flat)) => Some(Seventh(MajorQuality::Minor)),
(D(Flat), C(Natural)) => Some(Seventh(MajorQuality::Major)),
(D(Natural), D(DoubleFlat)) => Some(First(PerfectQuality::DoubleDiminished)),
(D(Natural), D(Flat)) => Some(First(PerfectQuality::Diminished)),
(D(Natural), D(Natural)) => Some(First(PerfectQuality::Perfect)),
(D(Natural), D(Sharp)) => Some(First(PerfectQuality::Augmented)),
(D(Natural), D(DoubleSharp)) => Some(First(PerfectQuality::DoubleAugmented)),
(D(Natural), E(DoubleFlat)) => Some(Second(MajorQuality::Diminished)),
(D(Natural), E(Flat)) => Some(Second(MajorQuality::Minor)),
(D(Natural), E(Natural)) => Some(Second(MajorQuality::Major)),
(D(Natural), E(Sharp)) => Some(Second(MajorQuality::Augmented)),
(D(Natural), E(DoubleSharp)) => Some(Second(MajorQuality::DoubleAugmented)),
(D(Natural), F(DoubleFlat)) => Some(Third(MajorQuality::DoubleDiminished)),
(D(Natural), F(Flat)) => Some(Third(MajorQuality::Diminished)),
(D(Natural), F(Natural)) => Some(Third(MajorQuality::Minor)),
(D(Natural), F(Sharp)) => Some(Third(MajorQuality::Major)),
(D(Natural), F(DoubleSharp)) => Some(Third(MajorQuality::Augmented)),
(D(Natural), G(DoubleFlat)) => Some(Fourth(PerfectQuality::DoubleDiminished)),
(D(Natural), G(Flat)) => Some(Fourth(PerfectQuality::Diminished)),
(D(Natural), G(Natural)) => Some(Fourth(PerfectQuality::Perfect)),
(D(Natural), G(Sharp)) => Some(Fourth(PerfectQuality::Augmented)),
(D(Natural), G(DoubleSharp)) => Some(Fourth(PerfectQuality::DoubleAugmented)),
(D(Natural), A(DoubleFlat)) => Some(Fifth(PerfectQuality::DoubleDiminished)),
(D(Natural), A(Flat)) => Some(Fifth(PerfectQuality::Diminished)),
(D(Natural), A(Natural)) => Some(Fifth(PerfectQuality::Perfect)),
(D(Natural), A(Sharp)) => Some(Fifth(PerfectQuality::Augmented)),
(D(Natural), A(DoubleSharp)) => Some(Fifth(PerfectQuality::DoubleAugmented)),
(D(Natural), B(DoubleFlat)) => Some(Sixth(MajorQuality::Diminished)),
(D(Natural), B(Flat)) => Some(Sixth(MajorQuality::Minor)),
(D(Natural), B(Natural)) => Some(Sixth(MajorQuality::Major)),
(D(Natural), B(Sharp)) => Some(Sixth(MajorQuality::Augmented)),
(D(Natural), B(DoubleSharp)) => Some(Sixth(MajorQuality::DoubleAugmented)),
(D(Natural), C(Flat)) => Some(Seventh(MajorQuality::Diminished)),
(D(Natural), C(DoubleFlat)) => Some(Seventh(MajorQuality::DoubleDiminished)),
(D(Natural), C(Natural)) => Some(Seventh(MajorQuality::Minor)),
(D(Natural), C(Sharp)) => Some(Seventh(MajorQuality::Major)),
(D(Natural), C(DoubleSharp)) => Some(Seventh(MajorQuality::Augmented)),
(D(Sharp), D(Natural)) => Some(First(PerfectQuality::Diminished)),
(D(Sharp), D(Sharp)) => Some(First(PerfectQuality::Perfect)),
(D(Sharp), D(DoubleSharp)) => Some(First(PerfectQuality::Augmented)),
(D(Sharp), E(Natural)) => Some(Second(MajorQuality::Minor)),
(D(Sharp), E(Sharp)) => Some(Second(MajorQuality::Major)),
(D(Sharp), E(DoubleSharp)) => Some(Second(MajorQuality::Augmented)),
(D(Sharp), F(Natural)) => Some(Third(MajorQuality::Diminished)),
(D(Sharp), F(Sharp)) => Some(Third(MajorQuality::Minor)),
(D(Sharp), F(DoubleSharp)) => Some(Third(MajorQuality::Major)),
(D(Sharp), G(Natural)) => Some(Fourth(PerfectQuality::Diminished)),
(D(Sharp), G(Sharp)) => Some(Fourth(PerfectQuality::Perfect)),
(D(Sharp), G(DoubleSharp)) => Some(Fourth(PerfectQuality::Augmented)),
(D(Sharp), A(Natural)) => Some(Fifth(PerfectQuality::Diminished)),
(D(Sharp), A(Sharp)) => Some(Fifth(PerfectQuality::Perfect)),
(D(Sharp), A(DoubleSharp)) => Some(Fifth(PerfectQuality::Augmented)),
(D(Sharp), B(Natural)) => Some(Sixth(MajorQuality::Minor)),
(D(Sharp), B(Sharp)) => Some(Sixth(MajorQuality::Major)),
(D(Sharp), B(DoubleSharp)) => Some(Sixth(MajorQuality::Augmented)),
(D(Sharp), C(Natural)) => Some(Seventh(MajorQuality::Diminished)),
(D(Sharp), C(Sharp)) => Some(Seventh(MajorQuality::Minor)),
(D(Sharp), C(DoubleSharp)) => Some(Seventh(MajorQuality::Major)),
(D(DoubleSharp), D(Natural)) => Some(First(PerfectQuality::DoubleDiminished)),
(D(DoubleSharp), D(Sharp)) => Some(First(PerfectQuality::Diminished)),
(D(DoubleSharp), D(DoubleSharp)) => Some(First(PerfectQuality::Perfect)),
(D(DoubleSharp), E(Natural)) => Some(Second(MajorQuality::Diminished)),
(D(DoubleSharp), E(Sharp)) => Some(Second(MajorQuality::Minor)),
(D(DoubleSharp), E(DoubleSharp)) => Some(Second(MajorQuality::Major)),
(D(DoubleSharp), F(Natural)) => Some(Third(MajorQuality::DoubleDiminished)),
(D(DoubleSharp), F(Sharp)) => Some(Third(MajorQuality::Diminished)),
(D(DoubleSharp), F(DoubleSharp)) => Some(Third(MajorQuality::Minor)),
(D(DoubleSharp), G(Natural)) => Some(Fourth(PerfectQuality::DoubleDiminished)),
(D(DoubleSharp), G(Sharp)) => Some(Fourth(PerfectQuality::Diminished)),
(D(DoubleSharp), G(DoubleSharp)) => Some(Fourth(PerfectQuality::Perfect)),
(D(DoubleSharp), A(Natural)) => Some(Fifth(PerfectQuality::DoubleDiminished)),
(D(DoubleSharp), A(Sharp)) => Some(Fifth(PerfectQuality::Diminished)),
(D(DoubleSharp), A(DoubleSharp)) => Some(Fifth(PerfectQuality::Perfect)),
(D(DoubleSharp), B(Natural)) => Some(Sixth(MajorQuality::Diminished)),
(D(DoubleSharp), B(Sharp)) => Some(Sixth(MajorQuality::Minor)),
(D(DoubleSharp), B(DoubleSharp)) => Some(Sixth(MajorQuality::Major)),
(D(DoubleSharp), C(Natural)) => Some(Seventh(MajorQuality::DoubleDiminished)),
(D(DoubleSharp), C(Sharp)) => Some(Seventh(MajorQuality::Diminished)),
(D(DoubleSharp), C(DoubleSharp)) => Some(Seventh(MajorQuality::Minor)),
(E(DoubleFlat), E(DoubleFlat)) => Some(First(PerfectQuality::Perfect)),
(E(DoubleFlat), E(Flat)) => Some(First(PerfectQuality::Augmented)),
(E(DoubleFlat), E(Natural)) => Some(First(PerfectQuality::DoubleAugmented)),
(E(DoubleFlat), F(DoubleFlat)) => Some(Second(MajorQuality::Minor)),
(E(DoubleFlat), F(Flat)) => Some(Second(MajorQuality::Major)),
(E(DoubleFlat), F(Natural)) => Some(Second(MajorQuality::Augmented)),
(E(DoubleFlat), G(DoubleFlat)) => Some(Third(MajorQuality::Minor)),
(E(DoubleFlat), G(Flat)) => Some(Third(MajorQuality::Major)),
(E(DoubleFlat), G(Natural)) => Some(Third(MajorQuality::Augmented)),
(E(DoubleFlat), A(DoubleFlat)) => Some(Fourth(PerfectQuality::Perfect)),
(E(DoubleFlat), A(Flat)) => Some(Fourth(PerfectQuality::Augmented)),
(E(DoubleFlat), A(Natural)) => Some(Fourth(PerfectQuality::DoubleAugmented)),
(E(DoubleFlat), B(DoubleFlat)) => Some(Fifth(PerfectQuality::Perfect)),
(E(DoubleFlat), B(Flat)) => Some(Fifth(PerfectQuality::Augmented)),
(E(DoubleFlat), B(Natural)) => Some(Fifth(PerfectQuality::DoubleAugmented)),
(E(DoubleFlat), C(DoubleFlat)) => Some(Sixth(MajorQuality::Minor)),
(E(DoubleFlat), C(Flat)) => Some(Sixth(MajorQuality::Major)),
(E(DoubleFlat), C(Natural)) => Some(Sixth(MajorQuality::Augmented)),
(E(DoubleFlat), D(DoubleFlat)) => Some(Seventh(MajorQuality::Minor)),
(E(DoubleFlat), D(Flat)) => Some(Seventh(MajorQuality::Major)),
(E(DoubleFlat), D(Natural)) => Some(Seventh(MajorQuality::Augmented)),
(E(Flat), E(DoubleFlat)) => Some(First(PerfectQuality::Diminished)),
(E(Flat), E(Flat)) => Some(First(PerfectQuality::Perfect)),
(E(Flat), E(Natural)) => Some(First(PerfectQuality::Augmented)),
(E(Flat), F(DoubleFlat)) => Some(Second(MajorQuality::Diminished)),
(E(Flat), F(Flat)) => Some(Second(MajorQuality::Minor)),
(E(Flat), F(Natural)) => Some(Second(MajorQuality::Major)),
(E(Flat), G(DoubleFlat)) => Some(Third(MajorQuality::Diminished)),
(E(Flat), G(Flat)) => Some(Third(MajorQuality::Minor)),
(E(Flat), G(Natural)) => Some(Third(MajorQuality::Major)),
(E(Flat), A(DoubleFlat)) => Some(Fourth(PerfectQuality::Diminished)),
(E(Flat), A(Flat)) => Some(Fourth(PerfectQuality::Perfect)),
(E(Flat), A(Natural)) => Some(Fourth(PerfectQuality::Augmented)),
(E(Flat), B(DoubleFlat)) => Some(Fifth(PerfectQuality::Diminished)),
(E(Flat), B(Flat)) => Some(Fifth(PerfectQuality::Perfect)),
(E(Flat), B(Natural)) => Some(Fifth(PerfectQuality::Augmented)),
(E(Flat), C(DoubleFlat)) => Some(Sixth(MajorQuality::Diminished)),
(E(Flat), C(Flat)) => Some(Sixth(MajorQuality::Minor)),
(E(Flat), C(Natural)) => Some(Sixth(MajorQuality::Major)),
(E(Flat), D(DoubleFlat)) => Some(Seventh(MajorQuality::Diminished)),
(E(Flat), D(Flat)) => Some(Seventh(MajorQuality::Minor)),
(E(Flat), D(Natural)) => Some(Seventh(MajorQuality::Major)),
(E(Natural), E(DoubleFlat)) => Some(First(PerfectQuality::DoubleDiminished)),
(E(Natural), E(Flat)) => Some(First(PerfectQuality::Diminished)),
(E(Natural), E(Natural)) => Some(First(PerfectQuality::Perfect)),
(E(Natural), E(Sharp)) => Some(First(PerfectQuality::Augmented)),
(E(Natural), E(DoubleSharp)) => Some(First(PerfectQuality::DoubleAugmented)),
(E(Natural), F(DoubleFlat)) => Some(Second(MajorQuality::DoubleDiminished)),
(E(Natural), F(Flat)) => Some(Second(MajorQuality::Diminished)),
(E(Natural), F(Natural)) => Some(Second(MajorQuality::Minor)),
(E(Natural), F(Sharp)) => Some(Second(MajorQuality::Major)),
(E(Natural), F(DoubleSharp)) => Some(Second(MajorQuality::Augmented)),
(E(Natural), G(DoubleFlat)) => Some(Third(MajorQuality::DoubleDiminished)),
(E(Natural), G(Flat)) => Some(Third(MajorQuality::Diminished)),
(E(Natural), G(Natural)) => Some(Third(MajorQuality::Minor)),
(E(Natural), G(Sharp)) => Some(Third(MajorQuality::Major)),
(E(Natural), G(DoubleSharp)) => Some(Third(MajorQuality::Augmented)),
(E(Natural), A(DoubleFlat)) => Some(Fourth(PerfectQuality::DoubleDiminished)),
(E(Natural), A(Flat)) => Some(Fourth(PerfectQuality::Diminished)),
(E(Natural), A(Natural)) => Some(Fourth(PerfectQuality::Perfect)),
(E(Natural), A(Sharp)) => Some(Fourth(PerfectQuality::Augmented)),
(E(Natural), A(DoubleSharp)) => Some(Fourth(PerfectQuality::DoubleAugmented)),
(E(Natural), B(DoubleFlat)) => Some(Fifth(PerfectQuality::DoubleDiminished)),
(E(Natural), B(Flat)) => Some(Fifth(PerfectQuality::Diminished)),
(E(Natural), B(Natural)) => Some(Fifth(PerfectQuality::Perfect)),
(E(Natural), B(Sharp)) => Some(Fifth(PerfectQuality::Augmented)),
(E(Natural), B(DoubleSharp)) => Some(Fifth(PerfectQuality::DoubleAugmented)),
(E(Natural), C(DoubleFlat)) => Some(Sixth(MajorQuality::DoubleDiminished)),
(E(Natural), C(Flat)) => Some(Sixth(MajorQuality::Diminished)),
(E(Natural), C(Natural)) => Some(Sixth(MajorQuality::Minor)),
(E(Natural), C(Sharp)) => Some(Sixth(MajorQuality::Major)),
(E(Natural), C(DoubleSharp)) => Some(Sixth(MajorQuality::Augmented)),
(E(Natural), D(DoubleFlat)) => Some(Seventh(MajorQuality::DoubleDiminished)),
(E(Natural), D(Flat)) => Some(Seventh(MajorQuality::Diminished)),
(E(Natural), D(Natural)) => Some(Seventh(MajorQuality::Minor)),
(E(Natural), D(Sharp)) => Some(Seventh(MajorQuality::Major)),
(E(Natural), D(DoubleSharp)) => Some(Seventh(MajorQuality::Augmented)),
(E(Sharp), E(Natural)) => Some(First(PerfectQuality::Diminished)),
(E(Sharp), E(Sharp)) => Some(First(PerfectQuality::Perfect)),
(E(Sharp), E(DoubleSharp)) => Some(First(PerfectQuality::Augmented)),
(E(Sharp), F(Natural)) => Some(Second(MajorQuality::Diminished)),
(E(Sharp), F(Sharp)) => Some(Second(MajorQuality::Minor)),
(E(Sharp), F(DoubleSharp)) => Some(Second(MajorQuality::Major)),
(E(Sharp), G(Natural)) => Some(Third(MajorQuality::Diminished)),
(E(Sharp), G(Sharp)) => Some(Third(MajorQuality::Minor)),
(E(Sharp), G(DoubleSharp)) => Some(Third(MajorQuality::Major)),
(E(Sharp), A(Natural)) => Some(Fourth(PerfectQuality::Diminished)),
(E(Sharp), A(Sharp)) => Some(Fourth(PerfectQuality::Perfect)),
(E(Sharp), A(DoubleSharp)) => Some(Fourth(PerfectQuality::Augmented)),
(E(Sharp), B(Natural)) => Some(Fifth(PerfectQuality::Diminished)),
(E(Sharp), B(Sharp)) => Some(Fifth(PerfectQuality::Perfect)),
(E(Sharp), B(DoubleSharp)) => Some(Fifth(PerfectQuality::Augmented)),
(E(Sharp), C(Natural)) => Some(Sixth(MajorQuality::Diminished)),
(E(Sharp), C(Sharp)) => Some(Sixth(MajorQuality::Minor)),
(E(Sharp), C(DoubleSharp)) => Some(Sixth(MajorQuality::Major)),
(E(Sharp), D(Natural)) => Some(Seventh(MajorQuality::Diminished)),
(E(Sharp), D(Sharp)) => Some(Seventh(MajorQuality::Minor)),
(E(Sharp), D(DoubleSharp)) => Some(Seventh(MajorQuality::Major)),
(E(DoubleSharp), E(Natural)) => Some(First(PerfectQuality::DoubleDiminished)),
(E(DoubleSharp), E(Sharp)) => Some(First(PerfectQuality::Diminished)),
(E(DoubleSharp), E(DoubleSharp)) => Some(First(PerfectQuality::Perfect)),
(E(DoubleSharp), F(Natural)) => Some(Second(MajorQuality::DoubleDiminished)),
(E(DoubleSharp), F(Sharp)) => Some(Second(MajorQuality::Diminished)),
(E(DoubleSharp), F(DoubleSharp)) => Some(Second(MajorQuality::Minor)),
(E(DoubleSharp), G(Natural)) => Some(Third(MajorQuality::DoubleDiminished)),
(E(DoubleSharp), G(Sharp)) => Some(Third(MajorQuality::Diminished)),
(E(DoubleSharp), G(DoubleSharp)) => Some(Third(MajorQuality::Minor)),
(E(DoubleSharp), A(Natural)) => Some(Fourth(PerfectQuality::DoubleDiminished)),
(E(DoubleSharp), A(Sharp)) => Some(Fourth(PerfectQuality::Diminished)),
(E(DoubleSharp), A(DoubleSharp)) => Some(Fourth(PerfectQuality::Perfect)),
(E(DoubleSharp), B(Natural)) => Some(Fifth(PerfectQuality::DoubleDiminished)),
(E(DoubleSharp), B(Sharp)) => Some(Fifth(PerfectQuality::Diminished)),
(E(DoubleSharp), B(DoubleSharp)) => Some(Fifth(PerfectQuality::Perfect)),
(E(DoubleSharp), C(Natural)) => Some(Sixth(MajorQuality::DoubleDiminished)),
(E(DoubleSharp), C(Sharp)) => Some(Sixth(MajorQuality::Diminished)),
(E(DoubleSharp), C(DoubleSharp)) => Some(Sixth(MajorQuality::Minor)),
(E(DoubleSharp), D(Natural)) => Some(Seventh(MajorQuality::DoubleDiminished)),
(E(DoubleSharp), D(Sharp)) => Some(Seventh(MajorQuality::Diminished)),
(E(DoubleSharp), D(DoubleSharp)) => Some(Seventh(MajorQuality::Minor)),
(F(DoubleFlat), F(DoubleFlat)) => Some(First(PerfectQuality::Perfect)),
(F(DoubleFlat), F(Flat)) => Some(First(PerfectQuality::Augmented)),
(F(DoubleFlat), F(Natural)) => Some(First(PerfectQuality::DoubleAugmented)),
(F(DoubleFlat), G(DoubleFlat)) => Some(Second(MajorQuality::Major)),
(F(DoubleFlat), G(Flat)) => Some(Second(MajorQuality::Augmented)),
(F(DoubleFlat), G(Natural)) => Some(Second(MajorQuality::DoubleAugmented)),
(F(DoubleFlat), A(DoubleFlat)) => Some(Third(MajorQuality::Major)),
(F(DoubleFlat), A(Flat)) => Some(Third(MajorQuality::Augmented)),
(F(DoubleFlat), A(Natural)) => Some(Third(MajorQuality::DoubleAugmented)),
(F(DoubleFlat), B(DoubleFlat)) => Some(Fourth(PerfectQuality::Augmented)),
(F(DoubleFlat), B(Flat)) => Some(Fourth(PerfectQuality::DoubleAugmented)),
(F(DoubleFlat), B(Natural)) => Some(Fourth(PerfectQuality::TripleAugmented)),
(F(DoubleFlat), C(DoubleFlat)) => Some(Fifth(PerfectQuality::Perfect)),
(F(DoubleFlat), C(Flat)) => Some(Fifth(PerfectQuality::Augmented)),
(F(DoubleFlat), C(Natural)) => Some(Fifth(PerfectQuality::DoubleAugmented)),
(F(DoubleFlat), D(DoubleFlat)) => Some(Sixth(MajorQuality::Major)),
(F(DoubleFlat), D(Flat)) => Some(Sixth(MajorQuality::Augmented)),
(F(DoubleFlat), D(Natural)) => Some(Sixth(MajorQuality::DoubleAugmented)),
(F(DoubleFlat), E(DoubleFlat)) => Some(Seventh(MajorQuality::Major)),
(F(DoubleFlat), E(Flat)) => Some(Seventh(MajorQuality::Augmented)),
(F(DoubleFlat), E(Natural)) => Some(Seventh(MajorQuality::DoubleAugmented)),
(F(Flat), F(DoubleFlat)) => Some(First(PerfectQuality::Diminished)),
(F(Flat), F(Flat)) => Some(First(PerfectQuality::Perfect)),
(F(Flat), F(Natural)) => Some(First(PerfectQuality::Augmented)),
(F(Flat), G(DoubleFlat)) => Some(Second(MajorQuality::Minor)),
(F(Flat), G(Flat)) => Some(Second(MajorQuality::Major)),
(F(Flat), G(Natural)) => Some(Second(MajorQuality::Augmented)),
(F(Flat), A(DoubleFlat)) => Some(Third(MajorQuality::Minor)),
(F(Flat), A(Flat)) => Some(Third(MajorQuality::Major)),
(F(Flat), A(Natural)) => Some(Third(MajorQuality::Augmented)),
(F(Flat), B(DoubleFlat)) => Some(Fourth(PerfectQuality::Perfect)),
(F(Flat), B(Flat)) => Some(Fourth(PerfectQuality::Augmented)),
(F(Flat), B(Natural)) => Some(Fourth(PerfectQuality::DoubleAugmented)),
(F(Flat), C(DoubleFlat)) => Some(Fifth(PerfectQuality::Diminished)),
(F(Flat), C(Flat)) => Some(Fifth(PerfectQuality::Perfect)),
(F(Flat), C(Natural)) => Some(Fifth(PerfectQuality::Augmented)),
(F(Flat), D(DoubleFlat)) => Some(Sixth(MajorQuality::Minor)),
(F(Flat), D(Flat)) => Some(Sixth(MajorQuality::Major)),
(F(Flat), D(Natural)) => Some(Sixth(MajorQuality::Augmented)),
(F(Flat), E(DoubleFlat)) => Some(Seventh(MajorQuality::Minor)),
(F(Flat), E(Flat)) => Some(Seventh(MajorQuality::Major)),
(F(Flat), E(Natural)) => Some(Seventh(MajorQuality::Augmented)),
(F(Natural), F(DoubleFlat)) => Some(First(PerfectQuality::DoubleDiminished)),
(F(Natural), F(Flat)) => Some(First(PerfectQuality::Diminished)),
(F(Natural), F(Natural)) => Some(First(PerfectQuality::Perfect)),
(F(Natural), F(Sharp)) => Some(First(PerfectQuality::Augmented)),
(F(Natural), F(DoubleSharp)) => Some(First(PerfectQuality::DoubleAugmented)),
(F(Natural), G(DoubleFlat)) => Some(Second(MajorQuality::Diminished)),
(F(Natural), G(Flat)) => Some(Second(MajorQuality::Minor)),
(F(Natural), G(Natural)) => Some(Second(MajorQuality::Major)),
(F(Natural), G(Sharp)) => Some(Second(MajorQuality::Augmented)),
(F(Natural), G(DoubleSharp)) => Some(Second(MajorQuality::DoubleAugmented)),
(F(Natural), A(DoubleFlat)) => Some(Third(MajorQuality::Diminished)),
(F(Natural), A(Flat)) => Some(Third(MajorQuality::Minor)),
(F(Natural), A(Natural)) => Some(Third(MajorQuality::Major)),
(F(Natural), A(Sharp)) => Some(Third(MajorQuality::Augmented)),
(F(Natural), A(DoubleSharp)) => Some(Third(MajorQuality::DoubleAugmented)),
(F(Natural), B(DoubleFlat)) => Some(Fourth(PerfectQuality::Diminished)),
(F(Natural), B(Flat)) => Some(Fourth(PerfectQuality::Perfect)),
(F(Natural), B(Natural)) => Some(Fourth(PerfectQuality::Augmented)),
(F(Natural), B(Sharp)) => Some(Fourth(PerfectQuality::DoubleAugmented)),
(F(Natural), B(DoubleSharp)) => Some(Fourth(PerfectQuality::TripleAugmented)),
(F(Natural), C(DoubleFlat)) => Some(Fifth(PerfectQuality::DoubleDiminished)),
(F(Natural), C(Flat)) => Some(Fifth(PerfectQuality::Diminished)),
(F(Natural), C(Natural)) => Some(Fifth(PerfectQuality::Perfect)),
(F(Natural), C(Sharp)) => Some(Fifth(PerfectQuality::Augmented)),
(F(Natural), C(DoubleSharp)) => Some(Fifth(PerfectQuality::DoubleAugmented)),
(F(Natural), D(DoubleFlat)) => Some(Sixth(MajorQuality::Diminished)),
(F(Natural), D(Flat)) => Some(Sixth(MajorQuality::Minor)),
(F(Natural), D(Natural)) => Some(Sixth(MajorQuality::Major)),
(F(Natural), D(Sharp)) => Some(Sixth(MajorQuality::Augmented)),
(F(Natural), D(DoubleSharp)) => Some(Sixth(MajorQuality::DoubleAugmented)),
(F(Natural), E(DoubleFlat)) => Some(Seventh(MajorQuality::Diminished)),
(F(Natural), E(Flat)) => Some(Seventh(MajorQuality::Minor)),
(F(Natural), E(Natural)) => Some(Seventh(MajorQuality::Major)),
(F(Natural), E(Sharp)) => Some(Seventh(MajorQuality::Augmented)),
(F(Natural), E(DoubleSharp)) => Some(Seventh(MajorQuality::DoubleAugmented)),
(F(Sharp), F(Natural)) => Some(First(PerfectQuality::Diminished)),
(F(Sharp), F(Sharp)) => Some(First(PerfectQuality::Perfect)),
(F(Sharp), F(DoubleSharp)) => Some(First(PerfectQuality::Augmented)),
(F(Sharp), G(Natural)) => Some(Second(MajorQuality::Minor)),
(F(Sharp), G(Sharp)) => Some(Second(MajorQuality::Major)),
(F(Sharp), G(DoubleSharp)) => Some(Second(MajorQuality::Augmented)),
(F(Sharp), A(Natural)) => Some(Third(MajorQuality::Minor)),
(F(Sharp), A(Sharp)) => Some(Third(MajorQuality::Major)),
(F(Sharp), A(DoubleSharp)) => Some(Third(MajorQuality::Augmented)),
(F(Sharp), B(Natural)) => Some(Fourth(PerfectQuality::Perfect)),
(F(Sharp), B(Sharp)) => Some(Fourth(PerfectQuality::Augmented)),
(F(Sharp), B(DoubleSharp)) => Some(Fourth(PerfectQuality::DoubleAugmented)),
(F(Sharp), C(Natural)) => Some(Fifth(PerfectQuality::Diminished)),
(F(Sharp), C(Sharp)) => Some(Fifth(PerfectQuality::Perfect)),
(F(Sharp), C(DoubleSharp)) => Some(Fifth(PerfectQuality::Augmented)),
(F(Sharp), D(Natural)) => Some(Sixth(MajorQuality::Minor)),
(F(Sharp), D(Sharp)) => Some(Sixth(MajorQuality::Major)),
(F(Sharp), D(DoubleSharp)) => Some(Sixth(MajorQuality::Augmented)),
(F(Sharp), E(Natural)) => Some(Seventh(MajorQuality::Minor)),
(F(Sharp), E(Sharp)) => Some(Seventh(MajorQuality::Major)),
(F(Sharp), E(DoubleSharp)) => Some(Seventh(MajorQuality::Augmented)),
(F(DoubleSharp), F(Natural)) => Some(First(PerfectQuality::DoubleDiminished)),
(F(DoubleSharp), F(Sharp)) => Some(First(PerfectQuality::Diminished)),
(F(DoubleSharp), F(DoubleSharp)) => Some(First(PerfectQuality::Perfect)),
(F(DoubleSharp), G(Natural)) => Some(Second(MajorQuality::Diminished)),
(F(DoubleSharp), G(Sharp)) => Some(Second(MajorQuality::Minor)),
(F(DoubleSharp), G(DoubleSharp)) => Some(Second(MajorQuality::Major)),
(F(DoubleSharp), A(Natural)) => Some(Third(MajorQuality::Diminished)),
(F(DoubleSharp), A(Sharp)) => Some(Third(MajorQuality::Minor)),
(F(DoubleSharp), A(DoubleSharp)) => Some(Third(MajorQuality::Major)),
(F(DoubleSharp), B(Natural)) => Some(Fourth(PerfectQuality::Diminished)),
(F(DoubleSharp), B(Sharp)) => Some(Fourth(PerfectQuality::Perfect)),
(F(DoubleSharp), B(DoubleSharp)) => Some(Fourth(PerfectQuality::Augmented)),
(F(DoubleSharp), C(Natural)) => Some(Fifth(PerfectQuality::DoubleDiminished)),
(F(DoubleSharp), C(Sharp)) => Some(Fifth(PerfectQuality::Diminished)),
(F(DoubleSharp), C(DoubleSharp)) => Some(Fifth(PerfectQuality::Perfect)),
(F(DoubleSharp), D(Natural)) => Some(Sixth(MajorQuality::Diminished)),
(F(DoubleSharp), D(Sharp)) => Some(Sixth(MajorQuality::Minor)),
(F(DoubleSharp), D(DoubleSharp)) => Some(Sixth(MajorQuality::Major)),
(F(DoubleSharp), E(Natural)) => Some(Seventh(MajorQuality::Diminished)),
(F(DoubleSharp), E(Sharp)) => Some(Seventh(MajorQuality::Minor)),
(F(DoubleSharp), E(DoubleSharp)) => Some(Seventh(MajorQuality::Major)),
(G(DoubleFlat), G(DoubleFlat)) => Some(First(PerfectQuality::Perfect)),
(G(DoubleFlat), G(Flat)) => Some(First(PerfectQuality::Augmented)),
(G(DoubleFlat), G(Natural)) => Some(First(PerfectQuality::DoubleAugmented)),
(G(DoubleFlat), A(DoubleFlat)) => Some(Second(MajorQuality::Major)),
(G(DoubleFlat), A(Flat)) => Some(Second(MajorQuality::Augmented)),
(G(DoubleFlat), A(Natural)) => Some(Second(MajorQuality::DoubleAugmented)),
(G(DoubleFlat), B(DoubleFlat)) => Some(Third(MajorQuality::Major)),
(G(DoubleFlat), B(Flat)) => Some(Third(MajorQuality::Augmented)),
(G(DoubleFlat), B(Natural)) => Some(Third(MajorQuality::DoubleAugmented)),
(G(DoubleFlat), C(DoubleFlat)) => Some(Fourth(PerfectQuality::Perfect)),
(G(DoubleFlat), C(Flat)) => Some(Fourth(PerfectQuality::Augmented)),
(G(DoubleFlat), C(Natural)) => Some(Fourth(PerfectQuality::DoubleAugmented)),
(G(DoubleFlat), D(DoubleFlat)) => Some(Fifth(PerfectQuality::Perfect)),
(G(DoubleFlat), D(Flat)) => Some(Fifth(PerfectQuality::Augmented)),
(G(DoubleFlat), D(Natural)) => Some(Fifth(PerfectQuality::DoubleAugmented)),
(G(DoubleFlat), E(DoubleFlat)) => Some(Sixth(MajorQuality::Major)),
(G(DoubleFlat), E(Flat)) => Some(Sixth(MajorQuality::Augmented)),
(G(DoubleFlat), E(Natural)) => Some(Sixth(MajorQuality::DoubleAugmented)),
(G(DoubleFlat), F(DoubleFlat)) => Some(Seventh(MajorQuality::Minor)),
(G(DoubleFlat), F(Flat)) => Some(Seventh(MajorQuality::Major)),
(G(DoubleFlat), F(Natural)) => Some(Seventh(MajorQuality::Augmented)),
(G(Flat), G(DoubleFlat)) => Some(First(PerfectQuality::Diminished)),
(G(Flat), G(Flat)) => Some(First(PerfectQuality::Perfect)),
(G(Flat), G(Natural)) => Some(First(PerfectQuality::Augmented)),
(G(Flat), A(DoubleFlat)) => Some(Second(MajorQuality::Minor)),
(G(Flat), A(Flat)) => Some(Second(MajorQuality::Major)),
(G(Flat), A(Natural)) => Some(Second(MajorQuality::Augmented)),
(G(Flat), B(DoubleFlat)) => Some(Third(MajorQuality::Minor)),
(G(Flat), B(Flat)) => Some(Third(MajorQuality::Major)),
(G(Flat), B(Natural)) => Some(Third(MajorQuality::Augmented)),
(G(Flat), C(DoubleFlat)) => Some(Fourth(PerfectQuality::Diminished)),
(G(Flat), C(Flat)) => Some(Fourth(PerfectQuality::Perfect)),
(G(Flat), C(Natural)) => Some(Fourth(PerfectQuality::Augmented)),
(G(Flat), D(DoubleFlat)) => Some(Fifth(PerfectQuality::Diminished)),
(G(Flat), D(Flat)) => Some(Fifth(PerfectQuality::Perfect)),
(G(Flat), D(Natural)) => Some(Fifth(PerfectQuality::Augmented)),
(G(Flat), E(DoubleFlat)) => Some(Sixth(MajorQuality::Minor)),
(G(Flat), E(Flat)) => Some(Sixth(MajorQuality::Major)),
(G(Flat), E(Natural)) => Some(Sixth(MajorQuality::Augmented)),
(G(Flat), F(DoubleFlat)) => Some(Seventh(MajorQuality::Diminished)),
(G(Flat), F(Flat)) => Some(Seventh(MajorQuality::Minor)),
(G(Flat), F(Natural)) => Some(Seventh(MajorQuality::Major)),
(G(Natural), G(DoubleFlat)) => Some(First(PerfectQuality::DoubleDiminished)),
(G(Natural), G(Flat)) => Some(First(PerfectQuality::Diminished)),
(G(Natural), G(Natural)) => Some(First(PerfectQuality::Perfect)),
(G(Natural), G(Sharp)) => Some(First(PerfectQuality::Augmented)),
(G(Natural), G(DoubleSharp)) => Some(First(PerfectQuality::DoubleAugmented)),
(G(Natural), A(DoubleFlat)) => Some(Second(MajorQuality::Diminished)),
(G(Natural), A(Flat)) => Some(Second(MajorQuality::Minor)),
(G(Natural), A(Natural)) => Some(Second(MajorQuality::Major)),
(G(Natural), A(Sharp)) => Some(Second(MajorQuality::Augmented)),
(G(Natural), A(DoubleSharp)) => Some(Second(MajorQuality::DoubleAugmented)),
(G(Natural), B(DoubleFlat)) => Some(Third(MajorQuality::Diminished)),
(G(Natural), B(Flat)) => Some(Third(MajorQuality::Minor)),
(G(Natural), B(Natural)) => Some(Third(MajorQuality::Major)),
(G(Natural), B(Sharp)) => Some(Third(MajorQuality::Augmented)),
(G(Natural), B(DoubleSharp)) => Some(Third(MajorQuality::DoubleAugmented)),
(G(Natural), C(DoubleFlat)) => Some(Fourth(PerfectQuality::DoubleDiminished)),
(G(Natural), C(Flat)) => Some(Fourth(PerfectQuality::Diminished)),
(G(Natural), C(Natural)) => Some(Fourth(PerfectQuality::Perfect)),
(G(Natural), C(Sharp)) => Some(Fourth(PerfectQuality::Augmented)),
(G(Natural), C(DoubleSharp)) => Some(Fourth(PerfectQuality::DoubleAugmented)),
(G(Natural), D(DoubleFlat)) => Some(Fifth(PerfectQuality::DoubleDiminished)),
(G(Natural), D(Flat)) => Some(Fifth(PerfectQuality::Diminished)),
(G(Natural), D(Natural)) => Some(Fifth(PerfectQuality::Perfect)),
(G(Natural), D(Sharp)) => Some(Fifth(PerfectQuality::Augmented)),
(G(Natural), D(DoubleSharp)) => Some(Fifth(PerfectQuality::DoubleAugmented)),
(G(Natural), E(DoubleFlat)) => Some(Sixth(MajorQuality::Diminished)),
(G(Natural), E(Flat)) => Some(Sixth(MajorQuality::Minor)),
(G(Natural), E(Natural)) => Some(Sixth(MajorQuality::Major)),
(G(Natural), E(Sharp)) => Some(Sixth(MajorQuality::Augmented)),
(G(Natural), E(DoubleSharp)) => Some(Sixth(MajorQuality::DoubleAugmented)),
(G(Natural), F(DoubleFlat)) => Some(Seventh(MajorQuality::DoubleDiminished)),
(G(Natural), F(Flat)) => Some(Seventh(MajorQuality::Diminished)),
(G(Natural), F(Natural)) => Some(Seventh(MajorQuality::Minor)),
(G(Natural), F(Sharp)) => Some(Seventh(MajorQuality::Major)),
(G(Natural), F(DoubleSharp)) => Some(Seventh(MajorQuality::Augmented)),
(G(Sharp), G(Natural)) => Some(First(PerfectQuality::Diminished)),
(G(Sharp), G(Sharp)) => Some(First(PerfectQuality::Perfect)),
(G(Sharp), G(DoubleSharp)) => Some(First(PerfectQuality::Augmented)),
(G(Sharp), A(Natural)) => Some(Second(MajorQuality::Minor)),
(G(Sharp), A(Sharp)) => Some(Second(MajorQuality::Major)),
(G(Sharp), A(DoubleSharp)) => Some(Second(MajorQuality::Augmented)),
(G(Sharp), B(Natural)) => Some(Third(MajorQuality::Minor)),
(G(Sharp), B(Sharp)) => Some(Third(MajorQuality::Major)),
(G(Sharp), B(DoubleSharp)) => Some(Third(MajorQuality::Augmented)),
(G(Sharp), C(Natural)) => Some(Fourth(PerfectQuality::Diminished)),
(G(Sharp), C(Sharp)) => Some(Fourth(PerfectQuality::Perfect)),
(G(Sharp), C(DoubleSharp)) => Some(Fourth(PerfectQuality::Augmented)),
(G(Sharp), D(Natural)) => Some(Fifth(PerfectQuality::Diminished)),
(G(Sharp), D(Sharp)) => Some(Fifth(PerfectQuality::Perfect)),
(G(Sharp), D(DoubleSharp)) => Some(Fifth(PerfectQuality::Augmented)),
(G(Sharp), E(Natural)) => Some(Sixth(MajorQuality::Minor)),
(G(Sharp), E(Sharp)) => Some(Sixth(MajorQuality::Major)),
(G(Sharp), E(DoubleSharp)) => Some(Sixth(MajorQuality::Augmented)),
(G(Sharp), F(Natural)) => Some(Seventh(MajorQuality::Diminished)),
(G(Sharp), F(Sharp)) => Some(Seventh(MajorQuality::Minor)),
(G(Sharp), F(DoubleSharp)) => Some(Seventh(MajorQuality::Major)),
(G(DoubleSharp), G(Natural)) => Some(First(PerfectQuality::DoubleDiminished)),
(G(DoubleSharp), G(Sharp)) => Some(First(PerfectQuality::Diminished)),
(G(DoubleSharp), G(DoubleSharp)) => Some(First(PerfectQuality::Perfect)),
(G(DoubleSharp), A(Natural)) => Some(Second(MajorQuality::Diminished)),
(G(DoubleSharp), A(Sharp)) => Some(Second(MajorQuality::Minor)),
(G(DoubleSharp), A(DoubleSharp)) => Some(Second(MajorQuality::Major)),
(G(DoubleSharp), B(Natural)) => Some(Third(MajorQuality::Diminished)),
(G(DoubleSharp), B(Sharp)) => Some(Third(MajorQuality::Minor)),
(G(DoubleSharp), B(DoubleSharp)) => Some(Third(MajorQuality::Major)),
(G(DoubleSharp), C(Natural)) => Some(Fourth(PerfectQuality::DoubleDiminished)),
(G(DoubleSharp), C(Sharp)) => Some(Fourth(PerfectQuality::Diminished)),
(G(DoubleSharp), C(DoubleSharp)) => Some(Fourth(PerfectQuality::Perfect)),
(G(DoubleSharp), D(Natural)) => Some(Fifth(PerfectQuality::DoubleDiminished)),
(G(DoubleSharp), D(Sharp)) => Some(Fifth(PerfectQuality::Diminished)),
(G(DoubleSharp), D(DoubleSharp)) => Some(Fifth(PerfectQuality::Perfect)),
(G(DoubleSharp), E(Natural)) => Some(Sixth(MajorQuality::Diminished)),
(G(DoubleSharp), E(Sharp)) => Some(Sixth(MajorQuality::Minor)),
(G(DoubleSharp), E(DoubleSharp)) => Some(Sixth(MajorQuality::Major)),
(G(DoubleSharp), F(Natural)) => Some(Seventh(MajorQuality::DoubleDiminished)),
(G(DoubleSharp), F(Sharp)) => Some(Seventh(MajorQuality::Diminished)),
(G(DoubleSharp), F(DoubleSharp)) => Some(Seventh(MajorQuality::Minor)),
(A(DoubleFlat), A(DoubleFlat)) => Some(First(PerfectQuality::Perfect)),
(A(DoubleFlat), A(Flat)) => Some(First(PerfectQuality::Augmented)),
(A(DoubleFlat), A(Natural)) => Some(First(PerfectQuality::DoubleAugmented)),
(A(DoubleFlat), B(DoubleFlat)) => Some(Second(MajorQuality::Major)),
(A(DoubleFlat), B(Flat)) => Some(Second(MajorQuality::Augmented)),
(A(DoubleFlat), B(Natural)) => Some(Second(MajorQuality::DoubleAugmented)),
(A(DoubleFlat), C(DoubleFlat)) => Some(Third(MajorQuality::Minor)),
(A(DoubleFlat), C(Flat)) => Some(Third(MajorQuality::Major)),
(A(DoubleFlat), C(Natural)) => Some(Third(MajorQuality::Augmented)),
(A(DoubleFlat), D(DoubleFlat)) => Some(Fourth(PerfectQuality::Perfect)),
(A(DoubleFlat), D(Flat)) => Some(Fourth(PerfectQuality::Augmented)),
(A(DoubleFlat), D(Natural)) => Some(Fourth(PerfectQuality::DoubleAugmented)),
(A(DoubleFlat), E(DoubleFlat)) => Some(Fifth(PerfectQuality::Perfect)),
(A(DoubleFlat), E(Flat)) => Some(Fifth(PerfectQuality::Augmented)),
(A(DoubleFlat), E(Natural)) => Some(Fifth(PerfectQuality::DoubleAugmented)),
(A(DoubleFlat), F(DoubleFlat)) => Some(Sixth(MajorQuality::Minor)),
(A(DoubleFlat), F(Flat)) => Some(Sixth(MajorQuality::Major)),
(A(DoubleFlat), F(Natural)) => Some(Sixth(MajorQuality::Augmented)),
(A(DoubleFlat), G(DoubleFlat)) => Some(Seventh(MajorQuality::Minor)),
(A(DoubleFlat), G(Flat)) => Some(Seventh(MajorQuality::Major)),
(A(DoubleFlat), G(Natural)) => Some(Seventh(MajorQuality::Augmented)),
(A(Flat), A(DoubleFlat)) => Some(First(PerfectQuality::Diminished)),
(A(Flat), A(Flat)) => Some(First(PerfectQuality::Perfect)),
(A(Flat), A(Natural)) => Some(First(PerfectQuality::Augmented)),
(A(Flat), B(DoubleFlat)) => Some(Second(MajorQuality::Minor)),
(A(Flat), B(Flat)) => Some(Second(MajorQuality::Major)),
(A(Flat), B(Natural)) => Some(Second(MajorQuality::Augmented)),
(A(Flat), C(DoubleFlat)) => Some(Third(MajorQuality::Diminished)),
(A(Flat), C(Flat)) => Some(Third(MajorQuality::Minor)),
(A(Flat), C(Natural)) => Some(Third(MajorQuality::Major)),
(A(Flat), D(DoubleFlat)) => Some(Fourth(PerfectQuality::Diminished)),
(A(Flat), D(Flat)) => Some(Fourth(PerfectQuality::Perfect)),
(A(Flat), D(Natural)) => Some(Fourth(PerfectQuality::Augmented)),
(A(Flat), E(DoubleFlat)) => Some(Fifth(PerfectQuality::Diminished)),
(A(Flat), E(Flat)) => Some(Fifth(PerfectQuality::Perfect)),
(A(Flat), E(Natural)) => Some(Fifth(PerfectQuality::Augmented)),
(A(Flat), F(DoubleFlat)) => Some(Sixth(MajorQuality::Diminished)),
(A(Flat), F(Flat)) => Some(Sixth(MajorQuality::Minor)),
(A(Flat), F(Natural)) => Some(Sixth(MajorQuality::Major)),
(A(Flat), G(DoubleFlat)) => Some(Seventh(MajorQuality::Diminished)),
(A(Flat), G(Flat)) => Some(Seventh(MajorQuality::Minor)),
(A(Flat), G(Natural)) => Some(Seventh(MajorQuality::Major)),
(A(Natural), A(DoubleFlat)) => Some(First(PerfectQuality::DoubleDiminished)),
(A(Natural), A(Flat)) => Some(First(PerfectQuality::Diminished)),
(A(Natural), A(Natural)) => Some(First(PerfectQuality::Perfect)),
(A(Natural), A(Sharp)) => Some(First(PerfectQuality::Augmented)),
(A(Natural), A(DoubleSharp)) => Some(First(PerfectQuality::DoubleAugmented)),
(A(Natural), B(DoubleFlat)) => Some(Second(MajorQuality::Diminished)),
(A(Natural), B(Flat)) => Some(Second(MajorQuality::Minor)),
(A(Natural), B(Natural)) => Some(Second(MajorQuality::Major)),
(A(Natural), B(Sharp)) => Some(Second(MajorQuality::Augmented)),
(A(Natural), B(DoubleSharp)) => Some(Second(MajorQuality::DoubleAugmented)),
(A(Natural), C(DoubleFlat)) => Some(Third(MajorQuality::DoubleDiminished)),
(A(Natural), C(Flat)) => Some(Third(MajorQuality::Diminished)),
(A(Natural), C(Natural)) => Some(Third(MajorQuality::Minor)),
(A(Natural), C(Sharp)) => Some(Third(MajorQuality::Major)),
(A(Natural), C(DoubleSharp)) => Some(Third(MajorQuality::Augmented)),
(A(Natural), D(DoubleFlat)) => Some(Fourth(PerfectQuality::DoubleDiminished)),
(A(Natural), D(Flat)) => Some(Fourth(PerfectQuality::Diminished)),
(A(Natural), D(Natural)) => Some(Fourth(PerfectQuality::Perfect)),
(A(Natural), D(Sharp)) => Some(Fourth(PerfectQuality::Augmented)),
(A(Natural), D(DoubleSharp)) => Some(Fourth(PerfectQuality::DoubleAugmented)),
(A(Natural), E(DoubleFlat)) => Some(Fifth(PerfectQuality::DoubleDiminished)),
(A(Natural), E(Flat)) => Some(Fifth(PerfectQuality::Diminished)),
(A(Natural), E(Natural)) => Some(Fifth(PerfectQuality::Perfect)),
(A(Natural), E(Sharp)) => Some(Fifth(PerfectQuality::Augmented)),
(A(Natural), E(DoubleSharp)) => Some(Fifth(PerfectQuality::DoubleAugmented)),
(A(Natural), F(DoubleFlat)) => Some(Sixth(MajorQuality::DoubleDiminished)),
(A(Natural), F(Flat)) => Some(Sixth(MajorQuality::Diminished)),
(A(Natural), F(Natural)) => Some(Sixth(MajorQuality::Minor)),
(A(Natural), F(Sharp)) => Some(Sixth(MajorQuality::Major)),
(A(Natural), F(DoubleSharp)) => Some(Sixth(MajorQuality::Augmented)),
(A(Natural), G(DoubleFlat)) => Some(Seventh(MajorQuality::DoubleDiminished)),
(A(Natural), G(Flat)) => Some(Seventh(MajorQuality::Diminished)),
(A(Natural), G(Natural)) => Some(Seventh(MajorQuality::Minor)),
(A(Natural), G(Sharp)) => Some(Seventh(MajorQuality::Major)),
(A(Natural), G(DoubleSharp)) => Some(Seventh(MajorQuality::Augmented)),
(A(Sharp), A(Natural)) => Some(First(PerfectQuality::Diminished)),
(A(Sharp), A(Sharp)) => Some(First(PerfectQuality::Perfect)),
(A(Sharp), A(DoubleSharp)) => Some(First(PerfectQuality::Augmented)),
(A(Sharp), B(Natural)) => Some(Second(MajorQuality::Minor)),
(A(Sharp), B(Sharp)) => Some(Second(MajorQuality::Major)),
(A(Sharp), B(DoubleSharp)) => Some(Second(MajorQuality::Augmented)),
(A(Sharp), C(Natural)) => Some(Third(MajorQuality::Diminished)),
(A(Sharp), C(Sharp)) => Some(Third(MajorQuality::Minor)),
(A(Sharp), C(DoubleSharp)) => Some(Third(MajorQuality::Major)),
(A(Sharp), D(Natural)) => Some(Fourth(PerfectQuality::Diminished)),
(A(Sharp), D(Sharp)) => Some(Fourth(PerfectQuality::Perfect)),
(A(Sharp), D(DoubleSharp)) => Some(Fourth(PerfectQuality::Augmented)),
(A(Sharp), E(Natural)) => Some(Fifth(PerfectQuality::Diminished)),
(A(Sharp), E(Sharp)) => Some(Fifth(PerfectQuality::Perfect)),
(A(Sharp), E(DoubleSharp)) => Some(Fifth(PerfectQuality::Augmented)),
(A(Sharp), F(Natural)) => Some(Sixth(MajorQuality::Diminished)),
(A(Sharp), F(Sharp)) => Some(Sixth(MajorQuality::Minor)),
(A(Sharp), F(DoubleSharp)) => Some(Sixth(MajorQuality::Major)),
(A(Sharp), G(Natural)) => Some(Seventh(MajorQuality::Diminished)),
(A(Sharp), G(Sharp)) => Some(Seventh(MajorQuality::Minor)),
(A(Sharp), G(DoubleSharp)) => Some(Seventh(MajorQuality::Major)),
(A(DoubleSharp), A(Natural)) => Some(First(PerfectQuality::DoubleDiminished)),
(A(DoubleSharp), A(Sharp)) => Some(First(PerfectQuality::Diminished)),
(A(DoubleSharp), A(DoubleSharp)) => Some(First(PerfectQuality::Perfect)),
(A(DoubleSharp), B(Natural)) => Some(Second(MajorQuality::Diminished)),
(A(DoubleSharp), B(Sharp)) => Some(Second(MajorQuality::Minor)),
(A(DoubleSharp), B(DoubleSharp)) => Some(Second(MajorQuality::Major)),
(A(DoubleSharp), C(Natural)) => Some(Third(MajorQuality::DoubleDiminished)),
(A(DoubleSharp), C(Sharp)) => Some(Third(MajorQuality::Diminished)),
(A(DoubleSharp), C(DoubleSharp)) => Some(Third(MajorQuality::Minor)),
(A(DoubleSharp), D(Natural)) => Some(Fourth(PerfectQuality::DoubleDiminished)),
(A(DoubleSharp), D(Sharp)) => Some(Fourth(PerfectQuality::Diminished)),
(A(DoubleSharp), D(DoubleSharp)) => Some(Fourth(PerfectQuality::Perfect)),
(A(DoubleSharp), E(Natural)) => Some(Fifth(PerfectQuality::DoubleDiminished)),
(A(DoubleSharp), E(Sharp)) => Some(Fifth(PerfectQuality::Diminished)),
(A(DoubleSharp), E(DoubleSharp)) => Some(Fifth(PerfectQuality::Perfect)),
(A(DoubleSharp), F(Natural)) => Some(Sixth(MajorQuality::DoubleDiminished)),
(A(DoubleSharp), F(Sharp)) => Some(Sixth(MajorQuality::Diminished)),
(A(DoubleSharp), F(DoubleSharp)) => Some(Sixth(MajorQuality::Minor)),
(A(DoubleSharp), G(Natural)) => Some(Seventh(MajorQuality::DoubleDiminished)),
(A(DoubleSharp), G(Sharp)) => Some(Seventh(MajorQuality::Diminished)),
(A(DoubleSharp), G(DoubleSharp)) => Some(Seventh(MajorQuality::Minor)),
(B(DoubleFlat), B(DoubleFlat)) => Some(First(PerfectQuality::Perfect)),
(B(DoubleFlat), B(Flat)) => Some(First(PerfectQuality::Augmented)),
(B(DoubleFlat), B(Natural)) => Some(First(PerfectQuality::DoubleAugmented)),
(B(DoubleFlat), C(DoubleFlat)) => Some(Second(MajorQuality::Minor)),
(B(DoubleFlat), C(Flat)) => Some(Second(MajorQuality::Major)),
(B(DoubleFlat), C(Natural)) => Some(Second(MajorQuality::Augmented)),
(B(DoubleFlat), D(DoubleFlat)) => Some(Third(MajorQuality::Minor)),
(B(DoubleFlat), D(Flat)) => Some(Third(MajorQuality::Major)),
(B(DoubleFlat), D(Natural)) => Some(Third(MajorQuality::Augmented)),
(B(DoubleFlat), E(DoubleFlat)) => Some(Fourth(PerfectQuality::Perfect)),
(B(DoubleFlat), E(Flat)) => Some(Fourth(PerfectQuality::Augmented)),
(B(DoubleFlat), E(Natural)) => Some(Fourth(PerfectQuality::DoubleAugmented)),
(B(DoubleFlat), F(DoubleFlat)) => Some(Fifth(PerfectQuality::Diminished)),
(B(DoubleFlat), F(Flat)) => Some(Fifth(PerfectQuality::Perfect)),
(B(DoubleFlat), F(Natural)) => Some(Fifth(PerfectQuality::Augmented)),
(B(DoubleFlat), G(DoubleFlat)) => Some(Sixth(MajorQuality::Minor)),
(B(DoubleFlat), G(Flat)) => Some(Sixth(MajorQuality::Major)),
(B(DoubleFlat), G(Natural)) => Some(Sixth(MajorQuality::Augmented)),
(B(DoubleFlat), A(DoubleFlat)) => Some(Seventh(MajorQuality::Minor)),
(B(DoubleFlat), A(Flat)) => Some(Seventh(MajorQuality::Major)),
(B(DoubleFlat), A(Natural)) => Some(Seventh(MajorQuality::Augmented)),
(B(Flat), B(DoubleFlat)) => Some(First(PerfectQuality::Diminished)),
(B(Flat), B(Flat)) => Some(First(PerfectQuality::Perfect)),
(B(Flat), B(Natural)) => Some(First(PerfectQuality::Augmented)),
(B(Flat), C(DoubleFlat)) => Some(Second(MajorQuality::Diminished)),
(B(Flat), C(Flat)) => Some(Second(MajorQuality::Minor)),
(B(Flat), C(Natural)) => Some(Second(MajorQuality::Major)),
(B(Flat), D(DoubleFlat)) => Some(Third(MajorQuality::Diminished)),
(B(Flat), D(Flat)) => Some(Third(MajorQuality::Minor)),
(B(Flat), D(Natural)) => Some(Third(MajorQuality::Major)),
(B(Flat), E(DoubleFlat)) => Some(Fourth(PerfectQuality::Diminished)),
(B(Flat), E(Flat)) => Some(Fourth(PerfectQuality::Perfect)),
(B(Flat), E(Natural)) => Some(Fourth(PerfectQuality::Augmented)),
(B(Flat), F(DoubleFlat)) => Some(Fifth(PerfectQuality::DoubleDiminished)),
(B(Flat), F(Flat)) => Some(Fifth(PerfectQuality::Diminished)),
(B(Flat), F(Natural)) => Some(Fifth(PerfectQuality::Perfect)),
(B(Flat), G(DoubleFlat)) => Some(Sixth(MajorQuality::Diminished)),
(B(Flat), G(Flat)) => Some(Sixth(MajorQuality::Minor)),
(B(Flat), G(Natural)) => Some(Sixth(MajorQuality::Major)),
(B(Flat), A(DoubleFlat)) => Some(Seventh(MajorQuality::Diminished)),
(B(Flat), A(Flat)) => Some(Seventh(MajorQuality::Minor)),
(B(Flat), A(Natural)) => Some(Seventh(MajorQuality::Major)),
(B(Natural), B(DoubleFlat)) => Some(First(PerfectQuality::DoubleDiminished)),
(B(Natural), B(Flat)) => Some(First(PerfectQuality::Diminished)),
(B(Natural), B(Natural)) => Some(First(PerfectQuality::Perfect)),
(B(Natural), B(Sharp)) => Some(First(PerfectQuality::Augmented)),
(B(Natural), B(DoubleSharp)) => Some(First(PerfectQuality::DoubleAugmented)),
(B(Natural), C(DoubleFlat)) => Some(Second(MajorQuality::DoubleDiminished)),
(B(Natural), C(Flat)) => Some(Second(MajorQuality::Diminished)),
(B(Natural), C(Natural)) => Some(Second(MajorQuality::Minor)),
(B(Natural), C(Sharp)) => Some(Second(MajorQuality::Major)),
(B(Natural), C(DoubleSharp)) => Some(Second(MajorQuality::Augmented)),
(B(Natural), D(DoubleFlat)) => Some(Third(MajorQuality::DoubleDiminished)),
(B(Natural), D(Flat)) => Some(Third(MajorQuality::Diminished)),
(B(Natural), D(Natural)) => Some(Third(MajorQuality::Minor)),
(B(Natural), D(Sharp)) => Some(Third(MajorQuality::Major)),
(B(Natural), D(DoubleSharp)) => Some(Third(MajorQuality::Augmented)),
(B(Natural), E(DoubleFlat)) => Some(Fourth(PerfectQuality::DoubleDiminished)),
(B(Natural), E(Flat)) => Some(Fourth(PerfectQuality::Diminished)),
(B(Natural), E(Natural)) => Some(Fourth(PerfectQuality::Perfect)),
(B(Natural), E(Sharp)) => Some(Fourth(PerfectQuality::Augmented)),
(B(Natural), E(DoubleSharp)) => Some(Fourth(PerfectQuality::DoubleAugmented)),
(B(Natural), F(DoubleFlat)) => Some(Fifth(PerfectQuality::TripleDiminished)),
(B(Natural), F(Flat)) => Some(Fifth(PerfectQuality::DoubleDiminished)),
(B(Natural), F(Natural)) => Some(Fifth(PerfectQuality::Diminished)),
(B(Natural), F(Sharp)) => Some(Fifth(PerfectQuality::Perfect)),
(B(Natural), F(DoubleSharp)) => Some(Fifth(PerfectQuality::Augmented)),
(B(Natural), G(DoubleFlat)) => Some(Sixth(MajorQuality::DoubleDiminished)),
(B(Natural), G(Flat)) => Some(Sixth(MajorQuality::Diminished)),
(B(Natural), G(Natural)) => Some(Sixth(MajorQuality::Minor)),
(B(Natural), G(Sharp)) => Some(Sixth(MajorQuality::Major)),
(B(Natural), G(DoubleSharp)) => Some(Sixth(MajorQuality::Augmented)),
(B(Natural), A(DoubleFlat)) => Some(Seventh(MajorQuality::DoubleDiminished)),
(B(Natural), A(Flat)) => Some(Seventh(MajorQuality::Diminished)),
(B(Natural), A(Natural)) => Some(Seventh(MajorQuality::Minor)),
(B(Natural), A(Sharp)) => Some(Seventh(MajorQuality::Major)),
(B(Natural), A(DoubleSharp)) => Some(Seventh(MajorQuality::Augmented)),
(B(Sharp), B(Natural)) => Some(First(PerfectQuality::Diminished)),
(B(Sharp), B(Sharp)) => Some(First(PerfectQuality::Perfect)),
(B(Sharp), B(DoubleSharp)) => Some(First(PerfectQuality::Augmented)),
(B(Sharp), C(Natural)) => Some(Second(MajorQuality::Diminished)),
(B(Sharp), C(Sharp)) => Some(Second(MajorQuality::Minor)),
(B(Sharp), C(DoubleSharp)) => Some(Second(MajorQuality::Major)),
(B(Sharp), D(Natural)) => Some(Third(MajorQuality::Diminished)),
(B(Sharp), D(Sharp)) => Some(Third(MajorQuality::Minor)),
(B(Sharp), D(DoubleSharp)) => Some(Third(MajorQuality::Major)),
(B(Sharp), E(Natural)) => Some(Fourth(PerfectQuality::Diminished)),
(B(Sharp), E(Sharp)) => Some(Fourth(PerfectQuality::Perfect)),
(B(Sharp), E(DoubleSharp)) => Some(Fourth(PerfectQuality::Augmented)),
(B(Sharp), F(Natural)) => Some(Fifth(PerfectQuality::DoubleDiminished)),
(B(Sharp), F(Sharp)) => Some(Fifth(PerfectQuality::Diminished)),
(B(Sharp), F(DoubleSharp)) => Some(Fifth(PerfectQuality::Perfect)),
(B(Sharp), G(Natural)) => Some(Sixth(MajorQuality::Diminished)),
(B(Sharp), G(Sharp)) => Some(Sixth(MajorQuality::Minor)),
(B(Sharp), G(DoubleSharp)) => Some(Sixth(MajorQuality::Major)),
(B(Sharp), A(Natural)) => Some(Seventh(MajorQuality::Diminished)),
(B(Sharp), A(Sharp)) => Some(Seventh(MajorQuality::Minor)),
(B(Sharp), A(DoubleSharp)) => Some(Seventh(MajorQuality::Major)),
(B(DoubleSharp), B(Natural)) => Some(First(PerfectQuality::DoubleDiminished)),
(B(DoubleSharp), B(Sharp)) => Some(First(PerfectQuality::Diminished)),
(B(DoubleSharp), B(DoubleSharp)) => Some(First(PerfectQuality::Perfect)),
(B(DoubleSharp), C(Natural)) => Some(Second(MajorQuality::DoubleDiminished)),
(B(DoubleSharp), C(Sharp)) => Some(Second(MajorQuality::Diminished)),
(B(DoubleSharp), C(DoubleSharp)) => Some(Second(MajorQuality::Minor)),
(B(DoubleSharp), D(Natural)) => Some(Third(MajorQuality::DoubleDiminished)),
(B(DoubleSharp), D(Sharp)) => Some(Third(MajorQuality::Diminished)),
(B(DoubleSharp), D(DoubleSharp)) => Some(Third(MajorQuality::Minor)),
(B(DoubleSharp), E(Natural)) => Some(Fourth(PerfectQuality::DoubleDiminished)),
(B(DoubleSharp), E(Sharp)) => Some(Fourth(PerfectQuality::Diminished)),
(B(DoubleSharp), E(DoubleSharp)) => Some(Fourth(PerfectQuality::Perfect)),
(B(DoubleSharp), F(Natural)) => Some(Fifth(PerfectQuality::TripleDiminished)),
(B(DoubleSharp), F(Sharp)) => Some(Fifth(PerfectQuality::DoubleDiminished)),
(B(DoubleSharp), F(DoubleSharp)) => Some(Fifth(PerfectQuality::Diminished)),
(B(DoubleSharp), G(Natural)) => Some(Sixth(MajorQuality::DoubleDiminished)),
(B(DoubleSharp), G(Sharp)) => Some(Sixth(MajorQuality::Diminished)),
(B(DoubleSharp), G(DoubleSharp)) => Some(Sixth(MajorQuality::Minor)),
(B(DoubleSharp), A(Natural)) => Some(Seventh(MajorQuality::DoubleDiminished)),
(B(DoubleSharp), A(Sharp)) => Some(Seventh(MajorQuality::Diminished)),
(B(DoubleSharp), A(DoubleSharp)) => Some(Seventh(MajorQuality::Minor)),
(_, _) => None
}
}
pub fn cents(&self) -> Cents {
self.steps().cents()
}
}
impl fmt::Display for Interval {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match *self {
Interval::First(q) => write!(f, "{}1", q),
Interval::Second(q) => write!(f, "{}2", q),
Interval::Third(q) => write!(f, "{}3", q),
Interval::Fourth(q) => write!(f, "{}4", q),
Interval::Fifth(q) => write!(f, "{}5", q),
Interval::Sixth(q) => write!(f, "{}6", q),
Interval::Seventh(q) => write!(f, "{}7", q),
Interval::Octave(q) => write!(f, "{}8", q),
Interval::Ninth(q) => write!(f, "{}9", q),
Interval::Tenth(q) => write!(f, "{}10", q),
Interval::Eleventh(q) => write!(f, "{}11", q),
Interval::Twelfth(q) => write!(f, "{}12", q),
Interval::Thirteenth(q) => write!(f, "{}13", q),
Interval::Fourteenth(q) => write!(f, "{}14", q),
}
}
}
#[cfg(test)]
mod tests {
use crate::types::interval::{MajorQuality::*, PerfectQuality::*};
use crate::types::{
Accidental, Accidental::*, Interval, Interval::*, MajorQuality, Note,
Note::*, PerfectQuality, PitchClass, Steps,
};
#[test]
#[rustfmt::skip]
fn test_all_distances() {
let flats = [
A(Natural), B(DoubleFlat), B(Flat), B(Natural), C(Flat), C(Natural), D(DoubleFlat),
D(Flat), D(Natural), E(Flat), E(Natural), F(Flat), F(Natural), G(Flat), G(Natural),
A(DoubleFlat), A(Flat)
];
let sharps = [
A(Natural), A(Sharp), B(Natural), B(Sharp), C(Natural), C(Sharp), C(DoubleSharp),
D(Natural), D(Sharp), D(DoubleSharp), E(Natural), E(Sharp), F(Sharp), F(DoubleSharp),
G(Natural), G(Sharp), G(DoubleSharp),
];
fn test(notes: [Note;17]) {
for l in notes.iter() {
for r in notes.iter() {
if let Some(interval) = Interval::distance(*l, *r) {
let steps = Steps::distance(&l.pitch_class(), &r.pitch_class());
assert_eq!(interval.steps(), steps,
"Interval::distance({}, {}) = {} {} Expected: {}",
l, r, interval, interval.steps(), steps,
);
println!("Interval::distance({}, {}) = {} {}", l, r, interval, steps);
} else {
println!("Interval::distance({}, {}) = None", l, r);
}
}
}
}
test(sharps);
test(flats);
}
#[test]
fn test_interval_distance() {
fn test(l: Note, r: Note, expect: Option<Interval>) {
let result = Interval::distance(l, r);
assert_eq!(
result, expect,
"Interval::distance({}, {}) = {:?} Expected: {:?}",
l, r, result, expect
);
}
test(
C(Natural),
F(Natural),
Some(Fourth(PerfectQuality::Perfect)),
);
test(F(Natural), C(Natural), Some(Fifth(PerfectQuality::Perfect)));
test(
D(Natural),
B(DoubleFlat),
Some(Sixth(MajorQuality::Diminished)),
);
test(
A(Flat),
F(DoubleFlat),
Some(Sixth(MajorQuality::Diminished)),
);
test(
G(Sharp),
F(Natural),
Some(Seventh(MajorQuality::Diminished)),
);
}
}