# 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.

# Description:
# Libraries for using TensorFlow with music and art.

package(
    default_visibility = ["//magenta:__subpackages__"],
)

licenses(["notice"])  # Apache 2.0

# The Magenta public API.
py_library(
    name = "music",
    deps = [
        ":constants",
        ":melodies_lib",
        ":midi_io",
        ":note_sequence_io",
        ":sequence_generator",
        ":sequence_generator_bundle",
        ":sequences_lib",
        ":testing_lib",
    ],
)

py_library(
    name = "chord_symbols_lib",
    srcs = ["chord_symbols_lib.py"],
    srcs_version = "PY2AND3",
    deps = [
        "@music21//:music21",
        # tensorflow dep
    ],
)

py_test(
    name = "chord_symbols_lib_test",
    srcs = ["chord_symbols_lib_test.py"],
    srcs_version = "PY2AND3",
    deps = [
        ":chord_symbols_lib",
        # tensorflow dep
    ],
)

py_library(
    name = "chords_lib",
    srcs = ["chords_lib.py"],
    srcs_version = "PY2AND3",
    deps = [
        ":chord_symbols_lib",
        ":constants",
        ":events_lib",
        "//magenta/pipelines:statistics",
        "//magenta/protobuf:music_py_pb2",
    ],
)

py_test(
    name = "chords_lib_test",
    srcs = ["chords_lib_test.py"],
    srcs_version = "PY2AND3",
    deps = [
        ":chord_symbols_lib",
        ":chords_lib",
        ":melodies_lib",
        ":sequences_lib",
        ":testing_lib",
        # tensorflow dep
    ],
)

py_library(
    name = "constants",
    srcs = ["constants.py"],
    srcs_version = "PY2AND3",
)

py_library(
    name = "events_lib",
    srcs = ["events_lib.py"],
    srcs_version = "PY2AND3",
    deps = [
        ":constants",
        "//magenta/common:sequence_example_lib",
        # numpy dep
    ],
)

py_test(
    name = "events_lib_test",
    srcs = ["events_lib_test.py"],
    srcs_version = "PY2AND3",
    deps = [
        ":events_lib",
        # tensorflow dep
    ],
)

py_library(
    name = "lead_sheets_lib",
    srcs = ["lead_sheets_lib.py"],
    srcs_version = "PY2AND3",
    deps = [
        ":chords_lib",
        ":constants",
        ":events_lib",
        ":melodies_lib",
        "//magenta/pipelines:statistics",
        "//magenta/protobuf:music_py_pb2",
    ],
)

py_test(
    name = "lead_sheets_lib_test",
    srcs = ["lead_sheets_lib_test.py"],
    srcs_version = "PY2AND3",
    deps = [
        ":chords_lib",
        ":constants",
        ":lead_sheets_lib",
        ":melodies_lib",
        ":sequences_lib",
        ":testing_lib",
        # tensorflow dep
    ],
)

py_library(
    name = "melodies_lib",
    srcs = ["melodies_lib.py"],
    srcs_version = "PY2AND3",
    deps = [
        ":constants",
        ":events_lib",
        "//magenta/pipelines:statistics",
        "//magenta/protobuf:music_py_pb2",
        # numpy dep
    ],
)

py_test(
    name = "melodies_lib_test",
    srcs = ["melodies_lib_test.py"],
    srcs_version = "PY2AND3",
    deps = [
        ":constants",
        ":melodies_lib",
        ":sequences_lib",
        ":testing_lib",
        "//magenta/common:sequence_example_lib",
        # tensorflow dep
    ],
)

py_library(
    name = "midi_io",
    srcs = ["midi_io.py"],
    srcs_version = "PY2AND3",
    deps = [
        "//magenta/protobuf:music_py_pb2",
        "@midi//:midi",
        "@pretty_midi//:pretty_midi",
        # tensorflow dep
    ],
)

py_test(
    name = "midi_io_test",
    srcs = ["midi_io_test.py"],
    data = ["//magenta/testdata"],
    srcs_version = "PY2AND3",
    deps = [
        ":midi_io",
        # tensorflow dep
    ],
)

py_library(
    name = "note_sequence_io",
    srcs = ["note_sequence_io.py"],
    srcs_version = "PY2AND3",
    deps = [
        "//magenta/protobuf:music_py_pb2",
        # tensorflow dep
    ],
)

py_test(
    name = "note_sequence_io_test",
    srcs = ["note_sequence_io_test.py"],
    srcs_version = "PY2AND3",
    deps = [
        ":note_sequence_io",
        # tensorflow dep
    ],
)

py_library(
    name = "sequences_lib",
    srcs = ["sequences_lib.py"],
)

py_test(
    name = "sequences_lib_test",
    srcs = ["sequences_lib_test.py"],
    srcs_version = "PY2AND3",
    deps = [
        ":sequences_lib",
        ":testing_lib",
        "//magenta/common:testing_lib",
        "//magenta/protobuf:music_py_pb2",
        # tensorflow dep
    ],
)

py_library(
    name = "testing_lib",
    srcs = ["testing_lib.py"],
    deps = [
        ":sequences_lib",
        "//magenta/protobuf:music_py_pb2",
    ],
)

py_library(
    name = "sequence_generator_bundle",
    srcs = ["sequence_generator_bundle.py"],
    deps = [
        "@protobuf//:protobuf_python",
        "//magenta/protobuf:generator_py_pb2",
        # tensorflow dep
    ],
)

py_library(
    name = "sequence_generator",
    srcs = ["sequence_generator.py"],
    deps = [
        "//magenta/protobuf:generator_py_pb2",
        # tensorflow dep
    ],
)

py_test(
    name = "sequence_generator_test",
    srcs = ["sequence_generator_test.py"],
    deps = [
        ":sequence_generator",
        "//magenta/protobuf:generator_py_pb2",
        # tensorflow dep
    ],
)

py_library(
    name = "pretty_music21",
    srcs = ["pretty_music21.py"],
    deps = [
        "@music21//:music21",
    ],
)

py_library(
    name = "music21_to_note_sequence_io",
    srcs = ["music21_to_note_sequence_io.py"],
    deps = [
        ":pretty_music21",
        "//magenta/protobuf:music_py_pb2",
    ],
)

py_library(
    name = "music_xml_io",
    srcs = ["music_xml_io.py"],
    deps = [
        ":music21_to_note_sequence_io",
    ],
)

py_test(
    name = "pretty_music21_test",
    size = "medium",
    srcs = ["pretty_music21_test.py"],
    deps = [
        ":pretty_music21",
        "@music21//:music21",
        # tensorflow dep
    ],
)

py_test(
    name = "music21_to_note_sequence_io_test",
    size = "small",
    srcs = ["music21_to_note_sequence_io_test.py"],
    data = [
        "testdata/bach-one_phrase-4_voices.xml",
    ],
    deps = [
        ":music21_to_note_sequence_io",
        # tensorflow dep
    ],
)

py_test(
    name = "music_xml_io_test",
    size = "small",
    srcs = ["music_xml_io_test.py"],
    data = [
        "testdata/bach-one_phrase-4_voices.xml",
    ],
    deps = [
        ":music_xml_io",
        # tensorflow dep
    ],
)