public void Reports_Nothing_For_Too_Low_Pitch()
        {
            var pitch = new Note(100);
            var ts    = new TunedString(pitch, 1);

            Assert.Empty(ts.FindAllPositionsFor(pitch.Flatten()));
        }
        public void Reports_Nothing_For_Too_High_Pitch()
        {
            var pitch = new Note(20);
            var ts    = new TunedString(pitch, 1);

            Assert.Empty(ts.FindAllPositionsFor(new Note(220)));
        }
        public void Reports_Single_Position_For_Specific_Pitch()
        {
            var pitch = new Note(100);
            var ts    = new TunedString(pitch, 1);

            Assert.Single(ts.FindAllPositionsFor(pitch.Sharpen()));
        }
        public void Tuning_On_Single_String_Is_Self_Consistent()
        {
            var s = new TunedString(new Note(40), 6);

            Assert.Equal(new Note(45), s.PitchAt(5));
            Assert.Equal(new Note(52), s.PitchAt(12));
        }
        public void Tuning_Can_Be_Changed()
        {
            var s = new TunedString(new Note(40), 6);

            s.TuneTo(new Note(45));

            Assert.Equal(new Note(45), s.PitchAt(0));
        }
        public void Each_Fret_Increases_Pitch_By_Semitone()
        {
            var s = new TunedString(new Note(40), 6);

            for (int i = 0; i < 12; ++i)
            {
                Assert.Equal(s.PitchAt(i + 1), s.PitchAt(i) + new Interval(1));
            }
        }
        public void Reports_Pitches_Relative_To_Open()
        {
            var ts = new TunedString(new Note(100), 1);

            Assert.True(ts.PitchAt(0).Degree < ts.PitchAt(5).Degree);
        }