예제 #1
0
    def test_basic_plf(self):
        array = [(0, 'A:0'), (Fraction(1, 2), 'C:5'), (Position(3, 4), 'G:4'),
                 (1, 'A:5')]
        f = PiecewiseLinearPitchFunction(array)

        assert DiatonicPitch.parse('A:0').chromatic_distance == f.eval(0)
        assert DiatonicPitch.parse('C:5').chromatic_distance == f.eval(0.5)
        assert DiatonicPitch.parse('G:4').chromatic_distance == f.eval(
            Fraction(3, 4))
        assert DiatonicPitch.parse('A:5').chromatic_distance == f.eval(
            Position(1))

        assert DiatonicPitch.parse(
            'A:0').chromatic_distance == f.eval_as_chromatic_distance(0)
        assert DiatonicPitch.parse(
            'C:5').chromatic_distance == f.eval_as_chromatic_distance(0.5)
        assert DiatonicPitch.parse(
            'G:4').chromatic_distance == f.eval_as_chromatic_distance(
                Fraction(3, 4))
        assert DiatonicPitch.parse(
            'A:5').chromatic_distance == f.eval_as_chromatic_distance(
                Position(1))

        print(f.eval_as_frequency(0))
        assert ChromaticScale.A0 == f.eval_as_frequency(0)

        print(
            ChromaticScale.index_to_location(
                DiatonicPitch.parse('C:5').chromatic_distance))
        print(
            ChromaticScale.get_frequency(
                ChromaticScale.index_to_location(
                    DiatonicPitch.parse('C:5').chromatic_distance)))
        print(f.eval_as_frequency(0.5))
        assert math.isclose(
            ChromaticScale.get_frequency(
                ChromaticScale.index_to_location(
                    DiatonicPitch.parse('C:5').chromatic_distance)),
            f.eval_as_frequency(0.5))

        print(f.eval(0.25))  # 34.5
        print(f.eval_as_nearest_pitch(0.25))
        assert math.isclose(
            ChromaticScale.A0 * math.pow(ChromaticScale.SEMITONE_RATIO,
                                         f.eval(0.25) - 9),
            f.eval_as_frequency(0.25))

        assert 'A#:2' == str(f.eval_as_nearest_pitch(0.25))

        pitches = f.eval_as_pitch(0.25)
        assert 'A#:2' == str(pitches[0])
        assert 'B:2' == str(pitches[1])
예제 #2
0
 def test_frequencies(self):
     assert is_close(ChromaticScale.get_frequency((4, 9)), 440.0), \
         "Error A:4 = {0} should be 440.0".format(ChromaticScale.get_frequency((4, 9)))
     assert is_close(ChromaticScale.get_frequency((4, 0)), 261.625565301), \
         "Error C:4 = {0} should be 261.625565301".format(ChromaticScale.get_frequency((4, 0)))