示例#1
0
    def test_MinorThirdScalarTransform_is_applicable(self):
        fileloader.load(constants.TEST_MIDI + 'min3_scalar.mid', False)
        sequence = sequences.soprano

        config.chord_progression[0] = chords.parse('C-')
        ks_detector.detect_and_set_key_signatures()

        self.assertTrue(transforms.MinorThirdScalarTransform.applicable_at(0, sequence))
        self.assertFalse(transforms.MinorThirdScalarTransform.applicable_at(2, sequence))
示例#2
0
    def test_MajorThird_set_musicality(self):
        fileloader.load(constants.TEST_MIDI + 'linear_motion.mid', False)
        sequence = sequences.soprano
        
        config.chord_progression[0] = chords.parse('C')
        ks_detector.detect_and_set_key_signatures()

        trans = transforms.MajorThirdScalarTransform(6 * config.resolution, sequence)
        self.assertEqual(trans.intrinsic_musicality, vars.MAJOR_THIRD_SCALAR_CONTINUES_LINEARITY)
示例#3
0
    def test_WholeStepNeighborTransform_is_applicable(self):
        fileloader.load(constants.TEST_MIDI + 'neighbor.mid', False)
        sequence = sequences.soprano

        config.chord_progression[0] = chords.parse('C')
        ks_detector.detect_and_set_key_signatures()

        self.assertTrue(transforms.WholeStepNeighborTransform.applicable_at(0, sequence))
        self.assertTrue(
            transforms.WholeStepNeighborTransform.applicable_at(2 * config.resolution, sequence))
示例#4
0
    def test_WholeStepNeighborTransform_intermediate_pitch(self):
        fileloader.load(constants.TEST_MIDI + 'neighbor.mid', False)
        sequence = sequences.soprano
        
        config.chord_progression[0] = chords.parse('C')
        ks_detector.detect_and_set_key_signatures()

        trans = transforms.WholeStepNeighborTransform(0, sequence)
        whole_step_above = sequence[0].midi() + 2

        self.assertEqual(trans.intermediate_pitch, whole_step_above)
示例#5
0
    def test_ArpeggialTransform_intermediate_pitch(self):
        fileloader.load(constants.TEST_MIDI + 'arpeggial.mid', False)
        sequence = sequences.soprano

        config.chord_progression[0] = chords.parse('C')
        ks_detector.detect_and_set_key_signatures()

        trans = transforms.ArpeggialTransform(0, sequence)
        major_third_above = sequence[0].midi() + 4

        self.assertEqual(trans.intermediate_pitch, major_third_above)
示例#6
0
    def test_MajorThirdScalarTransform_intermediate_pitch(self):
        fileloader.load(constants.TEST_MIDI + 'maj3_scalar.mid', False)
        sequence = sequences.soprano

        config.chord_progression[0] = chords.parse('C')
        ks_detector.detect_and_set_key_signatures()

        trans = transforms.MajorThirdScalarTransform(0, sequence)
        pitch_should_be = sequence[0].midi() + 2

        self.assertEqual(trans.intermediate_pitch, pitch_should_be)
示例#7
0
def __load_example(file_name):
    """
    Effectively a wrapper around __load_midi, but gets the file name for the example from examples.py first.

    :param file_name: name of the example
    """
    example = examples.ALL.get(file_name)
    __load_midi(example.file_name())
    example.load_chord_progression()
    ks_detector.detect_and_set_key_signatures()
    phrasing.detect_and_set_measure_phrasing()
示例#8
0
    def test_ArpeggialTransform_is_applicable(self):
        fileloader.load(constants.TEST_MIDI + 'arpeggial.mid', False)
        sequence = sequences.soprano

        config.chord_progression[0] = chords.parse('C')
        config.chord_progression[5 * config.resolution] = chords.parse('A-')
        ks_detector.detect_and_set_key_signatures()

        self.assertTrue(transforms.ArpeggialTransform.applicable_at(0, sequence))
        self.assertTrue(
            transforms.ArpeggialTransform.applicable_at(4 * config.resolution, sequence))
示例#9
0
    def test_ApproachTransform_intermediate_pitch(self):
        fileloader.load(constants.TEST_MIDI + 'approach.mid', False)
        sequence = sequences.soprano
        
        config.chord_progression[0] = chords.parse('A')
        config.chord_progression[config.resolution] = chords.parse('D')
        ks_detector.detect_and_set_key_signatures()

        trans = transforms.ApproachTransform(0, sequence)
        c_sharp_below = sequence[0].midi() - 8

        self.assertEqual(trans.intermediate_pitch, c_sharp_below)
示例#10
0
    def test__JoinTransform_crosses_bar_line(self):
        fileloader.load(constants.TEST_MIDI + '2beat_join.mid', False)
        sequence = sequences.soprano
        
        config.chord_progression[0] = chords.parse('C')
        ks_detector.detect_and_set_key_signatures()

        over_bar_line = transforms.JoinTransform(2, config.resolution * 3, sequence)
        inside_bar = transforms.JoinTransform(2, config.resolution * 2, sequence)

        self.assertTrue(over_bar_line.crosses_bar_line())
        self.assertFalse(inside_bar.crosses_bar_line())
示例#11
0
    def test__is_syncopation(self):
        fileloader.load(constants.TEST_MIDI + '2beat_join.mid', False)
        sequence = sequences.soprano

        config.chord_progression[0] = chords.parse('C')
        ks_detector.detect_and_set_key_signatures()

        syncopation = transforms.JoinTransform(2, config.resolution, sequence)
        nonsyncopated = transforms.JoinTransform(2, 0, sequence)

        self.assertTrue(syncopation.is_syncopation())
        self.assertFalse(nonsyncopated.is_syncopation())
示例#12
0
    def test_ArpeggialTransform_set_musicality(self):
        fileloader.load(constants.TEST_MIDI + 'arpeggial.mid', False)
        sequence = sequences.soprano
        
        config.chord_progression[0] = chords.parse('C')
        config.chord_progression[5 * config.resolution] = chords.parse('A-')
        ks_detector.detect_and_set_key_signatures()

        weaker_trans = transforms.ArpeggialTransform(0, sequence)
        stronger_trans = transforms.ArpeggialTransform(config.resolution * 4, sequence)

        self.assertEqual(weaker_trans.intrinsic_musicality, vars.ARPEGGIAL_SAME_CHORD)
        self.assertEqual(stronger_trans.intrinsic_musicality, vars.ARPEGGIAL_NEW_CHORD)
示例#13
0
    def test_MajorThirdScalarTransform_Neighbor_synergy(self):
        fileloader.load(constants.TEST_MIDI + 'neighbor.mid', False)
        sequence = sequences.soprano
        scalar_sequence = sequences.RootSequence(read_pattern(constants.TEST_MIDI + 'maj3_scalar.mid')[0])

        config.chord_progression[0] = chords.parse('C')
        ks_detector.detect_and_set_key_signatures()

        scalar_trans = transforms.MajorThirdScalarTransform(0, scalar_sequence)
        dom_neighbor_trans = transforms.HalfStepNeighborTransform(0, sequence)
        subdom_neighbor_trans = transforms.HalfStepNeighborTransform(config.resolution * 4, sequence)

        self.assertEqual(scalar_trans.synergy(dom_neighbor_trans), vars.EIGHTH_NOTE_DOMINANT)
        self.assertEqual(scalar_trans.synergy(subdom_neighbor_trans), vars.EIGHTH_NOTE_SUBDOMINANT)
示例#14
0
    def test_MajorThirdScalarTransform_Scalar_synergy(self):
        fileloader.load(constants.TEST_MIDI + 'maj3_scalar.mid', False)
        sequence = sequences.soprano
        
        config.chord_progression[0] = chords.parse('C')
        ks_detector.detect_and_set_key_signatures()

        scalar_trans = transforms.MajorThirdScalarTransform(0, sequence)
        same_trans = transforms.MajorThirdScalarTransform(0, sequence)
        join = transforms.JoinTransform(2, 0, sequence)
        join3 = transforms.JoinTransform(3, 0, sequence)

        self.assertEqual(scalar_trans.synergy(same_trans), vars.EIGHTH_NOTE_SAME)
        self.assertEqual(scalar_trans.synergy(join), 0.0)
        self.assertEqual(join.synergy(join), vars.JOIN_SAME)
        self.assertEqual(join.synergy(join3), 0.0)
示例#15
0
    def test_ApproachTransform_is_applicable(self):
        fileloader.load(constants.TEST_MIDI + 'approach.mid', False)
        sequence = sequences.soprano

        config.chord_progression[0] = chords.parse('A')
        config.chord_progression[config.resolution] = chords.parse('D')
        config.chord_progression[config.resolution * 4] = chords.parse('E')
        config.chord_progression[config.resolution * 5] = chords.parse('F')
        config.chord_progression[config.resolution * 6] = chords.parse('A')
        ks_detector.detect_and_set_key_signatures()

        self.assertTrue(transforms.ApproachTransform.applicable_at(0, sequence))
        self.assertTrue(
            transforms.ApproachTransform.applicable_at(4 * config.resolution, sequence))
        self.assertFalse(
            transforms.ApproachTransform.applicable_at(6 * config.resolution, sequence))
示例#16
0
    def test_ApproachTransform_set_musicality(self):
        fileloader.load(constants.TEST_MIDI + 'approach.mid', False)
        sequence = sequences.soprano
        
        config.chord_progression[0] = chords.parse('A')
        config.chord_progression[config.resolution] = chords.parse('D')
        config.chord_progression[config.resolution * 5] = chords.parse('F')
        config.chord_progression[config.resolution * 6] = chords.parse('A')
        ks_detector.detect_and_set_key_signatures()
        ks = config.key_signatures

        weaker_trans = transforms.ApproachTransform(11 * config.resolution, sequence)
        stronger_trans = transforms.ApproachTransform(0, sequence)
        strong_trans = transforms.ApproachTransform(4 * config.resolution, sequence)

        self.assertEqual(vars.APPROACH_DEFAULT_MUSICALITY, weaker_trans.intrinsic_musicality)
        self.assertEqual(vars.APPROACH_NEW_CHORD_ROOT, stronger_trans.intrinsic_musicality)
        self.assertEqual(vars.APPROACH_KEY_CHANGE, strong_trans.intrinsic_musicality)
示例#17
0
    def test__EighthNoteTransform_causes_flickering(self):
        fileloader.load(constants.TEST_MIDI + 'flicker.mid', False)
        sequence = sequences.soprano

        c = config

        config.chord_progression[0] = chords.parse('C')
        ks_detector.detect_and_set_key_signatures()

        transform1 = transforms.WholeStepNeighborTransform((1 * config.resolution * 4) +
                                                           (1 * config.resolution), sequence)

        transform2 = transforms.HalfStepNeighborTransform((2 * config.resolution * 4) +
                                                          (1 * config.resolution), sequence)

        transform3 = transforms.HalfStepNeighborTransform((2 * config.resolution * 4) +
                                                          (1 * config.resolution), sequence)

        self.assertTrue(transform1.causes_flickering())
        self.assertTrue(transform2.causes_flickering())
        self.assertTrue(transform3.causes_flickering())
示例#18
0
def load(file_name, manual_signature_entry):
    """
    Tries to load the file specified, and initializes manual time+key signature entry if required. If the file type
    specified isn't supported, complains and exits.

    :param file_name: name of the file we're trying to parse
    :param manual_signature_entry: should we make the client manually enter time+key signature data?
    """
    if file_name in examples.ALL.keys():
        __load_example(file_name)
    elif REGEX_MIDI.match(file_name):
        __load_midi(file_name)
    else:
        print 'Unsupported file type provided'
        exit(1)

    if manual_signature_entry:
        __init_manual_signature_entry()
        ks_detector.detect_and_set_key_signatures()
        phrasing.detect_and_set_measure_phrasing()

    config.name = file_name