aiexperiments-ai-duet/server/magenta/music/sequences_lib_test.py
2016-11-17 07:33:16 +03:00

216 lines
8.3 KiB
Python

# Copyright 2016 Google Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Tests for sequences_lib."""
import copy
# internal imports
import tensorflow as tf
from magenta.common import testing_lib as common_testing_lib
from magenta.music import sequences_lib
from magenta.music import testing_lib
from magenta.protobuf import music_pb2
class SequencesLibTest(tf.test.TestCase):
def setUp(self):
self.steps_per_quarter = 4
self.note_sequence = common_testing_lib.parse_test_proto(
music_pb2.NoteSequence,
"""
time_signatures: {
numerator: 4
denominator: 4}
tempos: {
qpm: 60}""")
self.expected_quantized_sequence = sequences_lib.QuantizedSequence()
self.expected_quantized_sequence.qpm = 60.0
self.expected_quantized_sequence.steps_per_quarter = self.steps_per_quarter
def testEq(self):
left_hand = sequences_lib.QuantizedSequence()
left_hand.qpm = 123.0
left_hand.steps_per_quarter = 7
left_hand.time_signature = sequences_lib.TimeSignature(7, 8)
testing_lib.add_quantized_track(
left_hand, 0,
[(12, 100, 0, 40), (11, 100, 1, 2)])
testing_lib.add_quantized_track(
left_hand, 2,
[(55, 100, 4, 6), (14, 120, 4, 10)])
testing_lib.add_quantized_track(
left_hand, 3,
[(1, 10, 0, 6), (2, 50, 20, 21), (0, 101, 17, 21)])
testing_lib.add_quantized_chords(
left_hand, [('Cmaj7', 1), ('G9', 2)])
right_hand = sequences_lib.QuantizedSequence()
right_hand.qpm = 123.0
right_hand.steps_per_quarter = 7
right_hand.time_signature = sequences_lib.TimeSignature(7, 8)
testing_lib.add_quantized_track(
right_hand, 0,
[(11, 100, 1, 2), (12, 100, 0, 40)])
testing_lib.add_quantized_track(
right_hand, 2,
[(14, 120, 4, 10), (55, 100, 4, 6)])
testing_lib.add_quantized_track(
right_hand, 3,
[(0, 101, 17, 21), (2, 50, 20, 21), (1, 10, 0, 6)])
testing_lib.add_quantized_chords(
right_hand, [('G9', 2), ('Cmaj7', 1)])
self.assertEqual(left_hand, right_hand)
def testNotEq(self):
left_hand = sequences_lib.QuantizedSequence()
left_hand.bpm = 123.0
left_hand.steps_per_beat = 7
left_hand.time_signature = sequences_lib.TimeSignature(7, 8)
testing_lib.add_quantized_track(
left_hand, 0,
[(12, 100, 0, 40), (11, 100, 1, 2)])
testing_lib.add_quantized_track(
left_hand, 2,
[(55, 100, 4, 6), (15, 120, 4, 10)])
testing_lib.add_quantized_track(
left_hand, 3,
[(1, 10, 0, 6), (2, 50, 20, 21), (0, 101, 17, 21)])
testing_lib.add_quantized_chords(
left_hand, [('Cmaj7', 1), ('G9', 2)])
right_hand = sequences_lib.QuantizedSequence()
right_hand.bpm = 123.0
right_hand.steps_per_beat = 7
right_hand.time_signature = sequences_lib.TimeSignature(7, 8)
testing_lib.add_quantized_track(
right_hand, 0,
[(11, 100, 1, 2), (12, 100, 0, 40)])
testing_lib.add_quantized_track(
right_hand, 2,
[(14, 120, 4, 10), (55, 100, 4, 6)])
testing_lib.add_quantized_track(
right_hand, 3,
[(0, 101, 17, 21), (2, 50, 20, 21), (1, 10, 0, 6)])
testing_lib.add_quantized_chords(
right_hand, [('G9', 2), ('C7', 1)])
self.assertNotEqual(left_hand, right_hand)
def testFromNoteSequence(self):
testing_lib.add_track(
self.note_sequence, 0,
[(12, 100, 0.01, 10.0), (11, 55, 0.22, 0.50), (40, 45, 2.50, 3.50),
(55, 120, 4.0, 4.01), (52, 99, 4.75, 5.0)])
testing_lib.add_chords(
self.note_sequence,
[('B7', 0.22), ('Em9', 4.0)])
testing_lib.add_quantized_track(
self.expected_quantized_sequence, 0,
[(12, 100, 0, 40), (11, 55, 1, 2), (40, 45, 10, 14),
(55, 120, 16, 17), (52, 99, 19, 20)])
testing_lib.add_quantized_chords(
self.expected_quantized_sequence,
[('B7', 1), ('Em9', 16)])
quantized = sequences_lib.QuantizedSequence()
quantized.from_note_sequence(self.note_sequence, self.steps_per_quarter)
self.assertEqual(self.expected_quantized_sequence, quantized)
def testFromNoteSequence_TimeSignatureChange(self):
testing_lib.add_track(
self.note_sequence, 0,
[(12, 100, 0.01, 10.0), (11, 55, 0.22, 0.50), (40, 45, 2.50, 3.50),
(55, 120, 4.0, 4.01), (52, 99, 4.75, 5.0)])
del self.note_sequence.time_signatures[:]
quantized = sequences_lib.QuantizedSequence()
quantized.from_note_sequence(self.note_sequence, self.steps_per_quarter)
# Single time signature.
self.note_sequence.time_signatures.add(numerator=4, denominator=4)
quantized.from_note_sequence(self.note_sequence, self.steps_per_quarter)
# Multiple time signatures with no change.
self.note_sequence.time_signatures.add(numerator=4, denominator=4)
quantized.from_note_sequence(self.note_sequence, self.steps_per_quarter)
# Time signature change.
self.note_sequence.time_signatures.add(numerator=2, denominator=4)
with self.assertRaises(sequences_lib.MultipleTimeSignatureException):
quantized.from_note_sequence(self.note_sequence, self.steps_per_quarter)
def testRounding(self):
testing_lib.add_track(
self.note_sequence, 1,
[(12, 100, 0.01, 0.24), (11, 100, 0.22, 0.55), (40, 100, 0.50, 0.75),
(41, 100, 0.689, 1.18), (44, 100, 1.19, 1.69), (55, 100, 4.0, 4.01)])
testing_lib.add_quantized_track(
self.expected_quantized_sequence, 1,
[(12, 100, 0, 1), (11, 100, 1, 2), (40, 100, 2, 3),
(41, 100, 3, 5), (44, 100, 5, 7), (55, 100, 16, 17)])
quantized = sequences_lib.QuantizedSequence()
quantized.from_note_sequence(self.note_sequence, self.steps_per_quarter)
self.assertEqual(self.expected_quantized_sequence, quantized)
def testMultiTrack(self):
testing_lib.add_track(
self.note_sequence, 0,
[(12, 100, 1.0, 4.0), (19, 100, 0.95, 3.0)])
testing_lib.add_track(
self.note_sequence, 3,
[(12, 100, 1.0, 4.0), (19, 100, 2.0, 5.0)])
testing_lib.add_track(
self.note_sequence, 7,
[(12, 100, 1.0, 5.0), (19, 100, 2.0, 4.0), (24, 100, 3.0, 3.5)])
testing_lib.add_quantized_track(
self.expected_quantized_sequence, 0,
[(12, 100, 4, 16), (19, 100, 4, 12)])
testing_lib.add_quantized_track(
self.expected_quantized_sequence, 3,
[(12, 100, 4, 16), (19, 100, 8, 20)])
testing_lib.add_quantized_track(
self.expected_quantized_sequence, 7,
[(12, 100, 4, 20), (19, 100, 8, 16), (24, 100, 12, 14)])
quantized = sequences_lib.QuantizedSequence()
quantized.from_note_sequence(self.note_sequence, self.steps_per_quarter)
self.assertEqual(self.expected_quantized_sequence, quantized)
def testStepsPerBar(self):
quantized = sequences_lib.QuantizedSequence()
quantized.from_note_sequence(self.note_sequence, self.steps_per_quarter)
self.assertEqual(16, quantized.steps_per_bar())
self.note_sequence.time_signatures[0].numerator = 6
self.note_sequence.time_signatures[0].denominator = 8
quantized.from_note_sequence(self.note_sequence, self.steps_per_quarter)
self.assertEqual(12.0, quantized.steps_per_bar())
def testDeepcopy(self):
quantized = sequences_lib.QuantizedSequence()
testing_lib.add_track(
self.note_sequence, 0,
[(12, 100, 0.01, 10.0), (11, 55, 0.22, 0.50), (40, 45, 2.50, 3.50),
(55, 120, 4.0, 4.01), (52, 99, 4.75, 5.0)])
quantized.from_note_sequence(self.note_sequence, self.steps_per_quarter)
quantized_copy = copy.deepcopy(quantized)
self.assertEqual(quantized, quantized_copy)
testing_lib.add_quantized_track(
quantized, 1,
[(12, 100, 4, 20), (19, 100, 8, 16), (24, 100, 12, 14)])
self.assertNotEqual(quantized, quantized_copy)
if __name__ == '__main__':
tf.test.main()