public string Format(ChordClass chordClass)
        {
            string pitchClassString = chordClass.PitchClass.PitchClass switch
            {
                PitchClass a when a.Equals(PitchClass.A) => "A",
                PitchClass b when b.Equals(PitchClass.B) => "B",
                PitchClass c when c.Equals(PitchClass.C) => "C",
                PitchClass d when d.Equals(PitchClass.D) => "D",
                PitchClass e when e.Equals(PitchClass.E) => "E",
                PitchClass f when f.Equals(PitchClass.F) => "F",
                PitchClass g when g.Equals(PitchClass.G) => "G",
                _ => throw new InvalidOperationException()
            };

            string accidentalString = chordClass.PitchClass.Accidental switch
            {
                Accidental flat when flat.Equals(Accidental.Flat) => "b",
                Accidental sharp when sharp.Equals(Accidental.Sharp) => "#",
                Accidental natural when natural.Equals(Accidental.Natural) => string.Empty,
                _ => throw new InvalidOperationException()
            };

            string patternString = chordClass switch
            {
                ChordClass major when major.Pattern.Equals(TriadPattern.Major) => string.Empty,
                ChordClass minor when minor.Pattern.Equals(TriadPattern.Minor) => "m",
                ChordClass sus2 when sus2.Pattern.Equals(TriadPattern.SuspendedSecond) => "sus2",
                ChordClass sus4 when sus4.Pattern.Equals(TriadPattern.SuspendedFourth) => "sus4",
                _ => throw new InvalidOperationException()
            };

            return($"{pitchClassString}{accidentalString}{patternString}");
        }
    }
}
Example #2
0
        public void Format_WithSuspendedSecondChordNoAdditionalTones_ShouldReturnPitchClassInUpperCaseWithAccidental(PitchClass pitchClass, Accidental accidental, string expectedValue)
        {
            // ARRANGE
            var westernChordStringFormatter = new WesternChordStringFormatter();
            var chordClass = new ChordClass(new PitchClassWithAccidental(pitchClass, accidental), TriadPattern.SuspendedSecond, ImmutableList <ChordAddedNote> .Empty);

            // ACT
            string actualValue = westernChordStringFormatter.Format(chordClass);

            // ASSERT
            actualValue.Should().Be(expectedValue);
        }
Example #3
0
        public void Format_WithUnknownTriadPattern_ShouldThrowInvalidOperationException()
        {
            // ARRANGE
            var pitchClass   = PitchClass.A;
            var accidental   = Accidental.Natural;
            var triadPattern =
                (TriadPattern)typeof(TriadPattern).GetConstructors(BindingFlags.CreateInstance | BindingFlags.Instance | BindingFlags.NonPublic)
                .First(c => c.GetParameters().FirstOrDefault()?.ParameterType == typeof(int))
                .Invoke(new object[] { -3 });
            var westernChordStringFormatter = new WesternChordStringFormatter();
            var chordClass = new ChordClass(new PitchClassWithAccidental(pitchClass, accidental), triadPattern, ImmutableList <ChordAddedNote> .Empty);

            // ACT
            Action format = () => westernChordStringFormatter.Format(chordClass);

            // ASSERT
            format.Should().ThrowExactly <InvalidOperationException>();
        }