{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "id": "8UdXU6Bs9FQ6" }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 2, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "P80evX4s4BhX", "outputId": "c388da56-06e1-45dd-982c-594f030dd2e6" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Reading package lists... Done\n", "Building dependency tree... Done\n", "Reading state information... Done\n", "The following additional packages will be installed:\n", " fluid-soundfont-gm libevdev2 libfluidsynth3 libgudev-1.0-0 libinput-bin\n", " libinput10 libinstpatch-1.0-2 libmd4c0 libmtdev1 libqt5core5a libqt5dbus5\n", " libqt5gui5 libqt5network5 libqt5svg5 libqt5widgets5 libwacom-bin\n", " libwacom-common libwacom9 libxcb-icccm4 libxcb-image0 libxcb-keysyms1\n", " libxcb-render-util0 libxcb-util1 libxcb-xinerama0 libxcb-xinput0 libxcb-xkb1\n", " libxkbcommon-x11-0 qsynth qt5-gtk-platformtheme qttranslations5-l10n\n", " timgm6mb-soundfont\n", "Suggested packages:\n", " fluid-soundfont-gs qt5-image-formats-plugins qtwayland5 jackd\n", "The following NEW packages will be installed:\n", " fluid-soundfont-gm fluidsynth libevdev2 libfluidsynth3 libgudev-1.0-0\n", " libinput-bin libinput10 libinstpatch-1.0-2 libmd4c0 libmtdev1 libqt5core5a\n", " libqt5dbus5 libqt5gui5 libqt5network5 libqt5svg5 libqt5widgets5 libwacom-bin\n", " libwacom-common libwacom9 libxcb-icccm4 libxcb-image0 libxcb-keysyms1\n", " libxcb-render-util0 libxcb-util1 libxcb-xinerama0 libxcb-xinput0 libxcb-xkb1\n", " libxkbcommon-x11-0 qsynth qt5-gtk-platformtheme qttranslations5-l10n\n", " timgm6mb-soundfont\n", "0 upgraded, 32 newly installed, 0 to remove and 18 not upgraded.\n", "Need to get 148 MB of archives.\n", "After this operation, 207 MB of additional disk space will be used.\n", "Get:1 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 libqt5core5a amd64 5.15.3+dfsg-2ubuntu0.2 [2,006 kB]\n", "Get:2 http://archive.ubuntu.com/ubuntu jammy/main amd64 libevdev2 amd64 1.12.1+dfsg-1 [39.5 kB]\n", "Get:3 http://archive.ubuntu.com/ubuntu jammy/main amd64 libmtdev1 amd64 1.1.6-1build4 [14.5 kB]\n", "Get:4 http://archive.ubuntu.com/ubuntu jammy/main amd64 libgudev-1.0-0 amd64 1:237-2build1 [16.3 kB]\n", "Get:5 http://archive.ubuntu.com/ubuntu jammy/main amd64 libwacom-common all 2.2.0-1 [54.3 kB]\n", "Get:6 http://archive.ubuntu.com/ubuntu jammy/main amd64 libwacom9 amd64 2.2.0-1 [22.0 kB]\n", "Get:7 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 libinput-bin amd64 1.20.0-1ubuntu0.3 [19.9 kB]\n", "Get:8 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 libinput10 amd64 1.20.0-1ubuntu0.3 [131 kB]\n", "Get:9 http://archive.ubuntu.com/ubuntu jammy/universe amd64 libmd4c0 amd64 0.4.8-1 [42.0 kB]\n", "Get:10 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 libqt5dbus5 amd64 5.15.3+dfsg-2ubuntu0.2 [222 kB]\n", "Get:11 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 libqt5network5 amd64 5.15.3+dfsg-2ubuntu0.2 [731 kB]\n", "Get:12 http://archive.ubuntu.com/ubuntu jammy/main amd64 libxcb-icccm4 amd64 0.4.1-1.1build2 [11.5 kB]\n", "Get:13 http://archive.ubuntu.com/ubuntu jammy/main amd64 libxcb-util1 amd64 0.4.0-1build2 [11.4 kB]\n", "Get:14 http://archive.ubuntu.com/ubuntu jammy/main amd64 libxcb-image0 amd64 0.4.0-2 [11.5 kB]\n", "Get:15 http://archive.ubuntu.com/ubuntu jammy/main amd64 libxcb-keysyms1 amd64 0.4.0-1build3 [8,746 B]\n", "Get:16 http://archive.ubuntu.com/ubuntu jammy/main amd64 libxcb-render-util0 amd64 0.3.9-1build3 [10.3 kB]\n", "Get:17 http://archive.ubuntu.com/ubuntu jammy/main amd64 libxcb-xinerama0 amd64 1.14-3ubuntu3 [5,414 B]\n", "Get:18 http://archive.ubuntu.com/ubuntu jammy/main amd64 libxcb-xinput0 amd64 1.14-3ubuntu3 [34.3 kB]\n", "Get:19 http://archive.ubuntu.com/ubuntu jammy/main amd64 libxcb-xkb1 amd64 1.14-3ubuntu3 [32.8 kB]\n", "Get:20 http://archive.ubuntu.com/ubuntu jammy/main amd64 libxkbcommon-x11-0 amd64 1.4.0-1 [14.4 kB]\n", "Get:21 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 libqt5gui5 amd64 5.15.3+dfsg-2ubuntu0.2 [3,722 kB]\n", "Get:22 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 libqt5widgets5 amd64 5.15.3+dfsg-2ubuntu0.2 [2,561 kB]\n", "Get:23 http://archive.ubuntu.com/ubuntu jammy/universe amd64 libqt5svg5 amd64 5.15.3-1 [149 kB]\n", "Get:24 http://archive.ubuntu.com/ubuntu jammy/universe amd64 fluid-soundfont-gm all 3.1-5.3 [130 MB]\n", "Get:25 http://archive.ubuntu.com/ubuntu jammy/universe amd64 libinstpatch-1.0-2 amd64 1.1.6-1 [240 kB]\n", "Get:26 http://archive.ubuntu.com/ubuntu jammy/universe amd64 timgm6mb-soundfont all 1.3-5 [5,427 kB]\n", "Get:27 http://archive.ubuntu.com/ubuntu jammy/universe amd64 libfluidsynth3 amd64 2.2.5-1 [246 kB]\n", "Get:28 http://archive.ubuntu.com/ubuntu jammy/universe amd64 fluidsynth amd64 2.2.5-1 [27.4 kB]\n", "Get:29 http://archive.ubuntu.com/ubuntu jammy/main amd64 libwacom-bin amd64 2.2.0-1 [13.6 kB]\n", "Get:30 http://archive.ubuntu.com/ubuntu jammy/universe amd64 qsynth amd64 0.9.6-1 [305 kB]\n", "Get:31 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 qt5-gtk-platformtheme amd64 5.15.3+dfsg-2ubuntu0.2 [130 kB]\n", "Get:32 http://archive.ubuntu.com/ubuntu jammy/universe amd64 qttranslations5-l10n all 5.15.3-1 [1,983 kB]\n", "Fetched 148 MB in 8s (19.4 MB/s)\n", "debconf: unable to initialize frontend: Dialog\n", "debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 78, <> line 32.)\n", "debconf: falling back to frontend: Readline\n", "debconf: unable to initialize frontend: Readline\n", "debconf: (This frontend requires a controlling tty.)\n", "debconf: falling back to frontend: Teletype\n", "dpkg-preconfigure: unable to re-open stdin: \n", "Selecting previously unselected package libqt5core5a:amd64.\n", "(Reading database ... 120895 files and directories currently installed.)\n", "Preparing to unpack .../00-libqt5core5a_5.15.3+dfsg-2ubuntu0.2_amd64.deb ...\n", "Unpacking libqt5core5a:amd64 (5.15.3+dfsg-2ubuntu0.2) ...\n", "Selecting previously unselected package libevdev2:amd64.\n", "Preparing to unpack .../01-libevdev2_1.12.1+dfsg-1_amd64.deb ...\n", "Unpacking libevdev2:amd64 (1.12.1+dfsg-1) ...\n", "Selecting previously unselected package libmtdev1:amd64.\n", "Preparing to unpack .../02-libmtdev1_1.1.6-1build4_amd64.deb ...\n", "Unpacking libmtdev1:amd64 (1.1.6-1build4) ...\n", "Selecting previously unselected package libgudev-1.0-0:amd64.\n", "Preparing to unpack .../03-libgudev-1.0-0_1%3a237-2build1_amd64.deb ...\n", "Unpacking libgudev-1.0-0:amd64 (1:237-2build1) ...\n", "Selecting previously unselected package libwacom-common.\n", "Preparing to unpack .../04-libwacom-common_2.2.0-1_all.deb ...\n", "Unpacking libwacom-common (2.2.0-1) ...\n", "Selecting previously unselected package libwacom9:amd64.\n", "Preparing to unpack .../05-libwacom9_2.2.0-1_amd64.deb ...\n", "Unpacking libwacom9:amd64 (2.2.0-1) ...\n", "Selecting previously unselected package libinput-bin.\n", "Preparing to unpack .../06-libinput-bin_1.20.0-1ubuntu0.3_amd64.deb ...\n", "Unpacking libinput-bin (1.20.0-1ubuntu0.3) ...\n", "Selecting previously unselected package libinput10:amd64.\n", "Preparing to unpack .../07-libinput10_1.20.0-1ubuntu0.3_amd64.deb ...\n", "Unpacking libinput10:amd64 (1.20.0-1ubuntu0.3) ...\n", "Selecting previously unselected package libmd4c0:amd64.\n", "Preparing to unpack .../08-libmd4c0_0.4.8-1_amd64.deb ...\n", "Unpacking libmd4c0:amd64 (0.4.8-1) ...\n", "Selecting previously unselected package libqt5dbus5:amd64.\n", "Preparing to unpack .../09-libqt5dbus5_5.15.3+dfsg-2ubuntu0.2_amd64.deb ...\n", "Unpacking libqt5dbus5:amd64 (5.15.3+dfsg-2ubuntu0.2) ...\n", "Selecting previously unselected package libqt5network5:amd64.\n", "Preparing to unpack .../10-libqt5network5_5.15.3+dfsg-2ubuntu0.2_amd64.deb ...\n", "Unpacking libqt5network5:amd64 (5.15.3+dfsg-2ubuntu0.2) ...\n", "Selecting previously unselected package libxcb-icccm4:amd64.\n", "Preparing to unpack .../11-libxcb-icccm4_0.4.1-1.1build2_amd64.deb ...\n", "Unpacking libxcb-icccm4:amd64 (0.4.1-1.1build2) ...\n", "Selecting previously unselected package libxcb-util1:amd64.\n", "Preparing to unpack .../12-libxcb-util1_0.4.0-1build2_amd64.deb ...\n", "Unpacking libxcb-util1:amd64 (0.4.0-1build2) ...\n", "Selecting previously unselected package libxcb-image0:amd64.\n", "Preparing to unpack .../13-libxcb-image0_0.4.0-2_amd64.deb ...\n", "Unpacking libxcb-image0:amd64 (0.4.0-2) ...\n", "Selecting previously unselected package libxcb-keysyms1:amd64.\n", "Preparing to unpack .../14-libxcb-keysyms1_0.4.0-1build3_amd64.deb ...\n", "Unpacking libxcb-keysyms1:amd64 (0.4.0-1build3) ...\n", "Selecting previously unselected package libxcb-render-util0:amd64.\n", "Preparing to unpack .../15-libxcb-render-util0_0.3.9-1build3_amd64.deb ...\n", "Unpacking libxcb-render-util0:amd64 (0.3.9-1build3) ...\n", "Selecting previously unselected package libxcb-xinerama0:amd64.\n", "Preparing to unpack .../16-libxcb-xinerama0_1.14-3ubuntu3_amd64.deb ...\n", "Unpacking libxcb-xinerama0:amd64 (1.14-3ubuntu3) ...\n", "Selecting previously unselected package libxcb-xinput0:amd64.\n", "Preparing to unpack .../17-libxcb-xinput0_1.14-3ubuntu3_amd64.deb ...\n", "Unpacking libxcb-xinput0:amd64 (1.14-3ubuntu3) ...\n", "Selecting previously unselected package libxcb-xkb1:amd64.\n", "Preparing to unpack .../18-libxcb-xkb1_1.14-3ubuntu3_amd64.deb ...\n", "Unpacking libxcb-xkb1:amd64 (1.14-3ubuntu3) ...\n", "Selecting previously unselected package libxkbcommon-x11-0:amd64.\n", "Preparing to unpack .../19-libxkbcommon-x11-0_1.4.0-1_amd64.deb ...\n", "Unpacking libxkbcommon-x11-0:amd64 (1.4.0-1) ...\n", "Selecting previously unselected package libqt5gui5:amd64.\n", "Preparing to unpack .../20-libqt5gui5_5.15.3+dfsg-2ubuntu0.2_amd64.deb ...\n", "Unpacking libqt5gui5:amd64 (5.15.3+dfsg-2ubuntu0.2) ...\n", "Selecting previously unselected package libqt5widgets5:amd64.\n", "Preparing to unpack .../21-libqt5widgets5_5.15.3+dfsg-2ubuntu0.2_amd64.deb ...\n", "Unpacking libqt5widgets5:amd64 (5.15.3+dfsg-2ubuntu0.2) ...\n", "Selecting previously unselected package libqt5svg5:amd64.\n", "Preparing to unpack .../22-libqt5svg5_5.15.3-1_amd64.deb ...\n", "Unpacking libqt5svg5:amd64 (5.15.3-1) ...\n", "Selecting previously unselected package fluid-soundfont-gm.\n", "Preparing to unpack .../23-fluid-soundfont-gm_3.1-5.3_all.deb ...\n", "Unpacking fluid-soundfont-gm (3.1-5.3) ...\n", "Selecting previously unselected package libinstpatch-1.0-2:amd64.\n", "Preparing to unpack .../24-libinstpatch-1.0-2_1.1.6-1_amd64.deb ...\n", "Unpacking libinstpatch-1.0-2:amd64 (1.1.6-1) ...\n", "Selecting previously unselected package timgm6mb-soundfont.\n", "Preparing to unpack .../25-timgm6mb-soundfont_1.3-5_all.deb ...\n", "Unpacking timgm6mb-soundfont (1.3-5) ...\n", "Selecting previously unselected package libfluidsynth3:amd64.\n", "Preparing to unpack .../26-libfluidsynth3_2.2.5-1_amd64.deb ...\n", "Unpacking libfluidsynth3:amd64 (2.2.5-1) ...\n", "Selecting previously unselected package fluidsynth.\n", "Preparing to unpack .../27-fluidsynth_2.2.5-1_amd64.deb ...\n", "Unpacking fluidsynth (2.2.5-1) ...\n", "Selecting previously unselected package libwacom-bin.\n", "Preparing to unpack .../28-libwacom-bin_2.2.0-1_amd64.deb ...\n", "Unpacking libwacom-bin (2.2.0-1) ...\n", "Selecting previously unselected package qsynth.\n", "Preparing to unpack .../29-qsynth_0.9.6-1_amd64.deb ...\n", "Unpacking qsynth (0.9.6-1) ...\n", "Selecting previously unselected package qt5-gtk-platformtheme:amd64.\n", "Preparing to unpack .../30-qt5-gtk-platformtheme_5.15.3+dfsg-2ubuntu0.2_amd64.deb ...\n", "Unpacking qt5-gtk-platformtheme:amd64 (5.15.3+dfsg-2ubuntu0.2) ...\n", "Selecting previously unselected package qttranslations5-l10n.\n", "Preparing to unpack .../31-qttranslations5-l10n_5.15.3-1_all.deb ...\n", "Unpacking qttranslations5-l10n (5.15.3-1) ...\n", "Setting up libxcb-xinput0:amd64 (1.14-3ubuntu3) ...\n", "Setting up libxcb-keysyms1:amd64 (0.4.0-1build3) ...\n", "Setting up libxcb-render-util0:amd64 (0.3.9-1build3) ...\n", "Setting up libxcb-icccm4:amd64 (0.4.1-1.1build2) ...\n", "Setting up libxcb-util1:amd64 (0.4.0-1build2) ...\n", "Setting up libxcb-xkb1:amd64 (1.14-3ubuntu3) ...\n", "Setting up libxcb-image0:amd64 (0.4.0-2) ...\n", "Setting up libxcb-xinerama0:amd64 (1.14-3ubuntu3) ...\n", "Setting up qttranslations5-l10n (5.15.3-1) ...\n", "Setting up libxkbcommon-x11-0:amd64 (1.4.0-1) ...\n", "Setting up libqt5core5a:amd64 (5.15.3+dfsg-2ubuntu0.2) ...\n", "Setting up libmtdev1:amd64 (1.1.6-1build4) ...\n", "Setting up libqt5dbus5:amd64 (5.15.3+dfsg-2ubuntu0.2) ...\n", "Setting up libmd4c0:amd64 (0.4.8-1) ...\n", "Setting up fluid-soundfont-gm (3.1-5.3) ...\n", "update-alternatives: using /usr/share/sounds/sf2/FluidR3_GM.sf2 to provide /usr/share/sounds/sf2/default-GM.sf2 (default-GM.sf2) in auto mode\n", "update-alternatives: using /usr/share/sounds/sf2/FluidR3_GM.sf2 to provide /usr/share/sounds/sf3/default-GM.sf3 (default-GM.sf3) in auto mode\n", "Setting up timgm6mb-soundfont (1.3-5) ...\n", "Setting up libevdev2:amd64 (1.12.1+dfsg-1) ...\n", "Setting up libinstpatch-1.0-2:amd64 (1.1.6-1) ...\n", "Setting up libgudev-1.0-0:amd64 (1:237-2build1) ...\n", "Setting up libfluidsynth3:amd64 (2.2.5-1) ...\n", "Setting up libwacom-common (2.2.0-1) ...\n", "Setting up libwacom9:amd64 (2.2.0-1) ...\n", "Setting up libqt5network5:amd64 (5.15.3+dfsg-2ubuntu0.2) ...\n", "Setting up libinput-bin (1.20.0-1ubuntu0.3) ...\n", "Setting up fluidsynth (2.2.5-1) ...\n", "Created symlink /etc/systemd/user/default.target.wants/fluidsynth.service → /usr/lib/systemd/user/fluidsynth.service.\n", "Setting up libwacom-bin (2.2.0-1) ...\n", "Setting up libinput10:amd64 (1.20.0-1ubuntu0.3) ...\n", "Setting up libqt5gui5:amd64 (5.15.3+dfsg-2ubuntu0.2) ...\n", "Setting up libqt5widgets5:amd64 (5.15.3+dfsg-2ubuntu0.2) ...\n", "Setting up qt5-gtk-platformtheme:amd64 (5.15.3+dfsg-2ubuntu0.2) ...\n", "Setting up libqt5svg5:amd64 (5.15.3-1) ...\n", "Setting up qsynth (0.9.6-1) ...\n", "Processing triggers for hicolor-icon-theme (0.17-2) ...\n", "Processing triggers for libc-bin (2.35-0ubuntu3.1) ...\n", "/sbin/ldconfig.real: /usr/local/lib/libtbbbind.so.3 is not a symbolic link\n", "\n", "/sbin/ldconfig.real: /usr/local/lib/libtbbbind_2_0.so.3 is not a symbolic link\n", "\n", "/sbin/ldconfig.real: /usr/local/lib/libtbbbind_2_5.so.3 is not a symbolic link\n", "\n", "/sbin/ldconfig.real: /usr/local/lib/libtbbmalloc.so.2 is not a symbolic link\n", "\n", "/sbin/ldconfig.real: /usr/local/lib/libtbb.so.12 is not a symbolic link\n", "\n", "/sbin/ldconfig.real: /usr/local/lib/libtbbmalloc_proxy.so.2 is not a symbolic link\n", "\n", "Processing triggers for man-db (2.10.2-1) ...\n", "Collecting pyfluidsynth\n", " Downloading pyFluidSynth-1.3.2-py3-none-any.whl (19 kB)\n", "Requirement already satisfied: numpy in /usr/local/lib/python3.10/dist-packages (from pyfluidsynth) (1.23.5)\n", "Installing collected packages: pyfluidsynth\n", "Successfully installed pyfluidsynth-1.3.2\n", "Collecting pretty_midi\n", " Downloading pretty_midi-0.2.10.tar.gz (5.6 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m5.6/5.6 MB\u001b[0m \u001b[31m14.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25h Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n", "Requirement already satisfied: numpy>=1.7.0 in /usr/local/lib/python3.10/dist-packages (from pretty_midi) (1.23.5)\n", "Collecting mido>=1.1.16 (from pretty_midi)\n", " Downloading mido-1.3.0-py3-none-any.whl (50 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m50.3/50.3 kB\u001b[0m \u001b[31m5.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hRequirement already satisfied: six in /usr/local/lib/python3.10/dist-packages (from pretty_midi) (1.16.0)\n", "Requirement already satisfied: packaging~=23.1 in /usr/local/lib/python3.10/dist-packages (from mido>=1.1.16->pretty_midi) (23.1)\n", "Building wheels for collected packages: pretty_midi\n", " Building wheel for pretty_midi (setup.py) ... \u001b[?25l\u001b[?25hdone\n", " Created wheel for pretty_midi: filename=pretty_midi-0.2.10-py3-none-any.whl size=5592287 sha256=22bff5ef5eb5356c3b24982736b3095092aa128de352268d39c316086e3b2f8d\n", " Stored in directory: /root/.cache/pip/wheels/cd/a5/30/7b8b7f58709f5150f67f98fde4b891ebf0be9ef07a8af49f25\n", "Successfully built pretty_midi\n", "Installing collected packages: mido, pretty_midi\n", "Successfully installed mido-1.3.0 pretty_midi-0.2.10\n" ] } ], "source": [ "!sudo apt install -y fluidsynth\n", "!pip install --upgrade pyfluidsynth\n", "!pip install pretty_midi\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "id": "GTyF4vV17Pwg" }, "outputs": [], "source": [ "import collections\n", "import datetime\n", "import fluidsynth\n", "import glob\n", "import numpy as np\n", "import pathlib\n", "import pandas as pd\n", "import pretty_midi\n", "import seaborn as sns\n", "import tensorflow as tf\n", "\n", "from IPython import display\n", "from matplotlib import pyplot as plt\n", "from typing import Dict, List, Optional, Sequence, Tuple" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "id": "GLJoYrD-7to-" }, "outputs": [], "source": [ "seed = 42\n", "tf.random.set_seed(seed)\n", "np.random.seed(seed)\n", "\n", "# Sampling rate for audio playback\n", "_SAMPLING_RATE = 16000" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "wcxrruVN7Qac", "outputId": "825a8d11-ee23-47a9-ce8b-7b7ec2a799c8" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Downloading data from https://storage.googleapis.com/magentadata/datasets/maestro/v2.0.0/maestro-v2.0.0-midi.zip\n", "59243107/59243107 [==============================] - 1s 0us/step\n" ] } ], "source": [ "data_dir = pathlib.Path('data/maestro-v2.0.0')\n", "if not data_dir.exists():\n", " tf.keras.utils.get_file(\n", " 'maestro-v2.0.0-midi.zip',\n", " origin='https://storage.googleapis.com/magentadata/datasets/maestro/v2.0.0/maestro-v2.0.0-midi.zip',\n", " extract=True,\n", " cache_dir='.', cache_subdir='data',\n", " )" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "1eysVVig7SyP", "outputId": "ae6cf3d6-3d64-4b34-dc16-420f16733283" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of files: 1282\n" ] } ], "source": [ "filenames = glob.glob(str(data_dir/'**/*.mid*'))\n", "print('Number of files:', len(filenames))" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "5LJ9kc0p7UwI", "outputId": "95af9282-32fd-40d1-9adc-bbab1a1d11a2" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "data/maestro-v2.0.0/2017/MIDI-Unprocessed_056_PIANO056_MID--AUDIO-split_07-07-17_Piano-e_1-05_wav--1.midi\n" ] } ], "source": [ "sample_file = filenames[1]\n", "print(sample_file)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "id": "XjRO1oat71lx" }, "outputs": [], "source": [ "pm = pretty_midi.PrettyMIDI(sample_file)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "id": "aazQeknS7huI" }, "outputs": [], "source": [ "def display_audio(pm: pretty_midi.PrettyMIDI, seconds=30):\n", " waveform = pm.fluidsynth(fs=_SAMPLING_RATE)\n", " # Take a sample of the generated waveform to mitigate kernel resets\n", " waveform_short = waveform[:seconds*_SAMPLING_RATE]\n", " return display.Audio(waveform_short, rate=_SAMPLING_RATE)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 74 }, "id": "6h8TARy873u_", "outputId": "ad5be01f-496f-4247-dee1-0a4a30b3c4cc" }, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "display_audio(pm)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "jn49Z6iz74yA", "outputId": "b6ce5b68-de67-496b-d9ef-e25bd1eaedf7" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of instruments: 1\n", "Instrument name: Acoustic Grand Piano\n" ] } ], "source": [ "print('Number of instruments:', len(pm.instruments))\n", "instrument = pm.instruments[0]\n", "instrument_name = pretty_midi.program_to_instrument_name(instrument.program)\n", "print('Instrument name:', instrument_name)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "ZKr6Owtd74v5", "outputId": "51c53dcf-03bc-43e6-b9b0-ec1c8f91c859" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0: pitch=68, note_name=G#4, duration=0.4052\n", "1: pitch=70, note_name=A#4, duration=0.2490\n", "2: pitch=59, note_name=B3, duration=0.6010\n", "3: pitch=71, note_name=B4, duration=0.2448\n", "4: pitch=68, note_name=G#4, duration=0.3365\n", "5: pitch=63, note_name=D#4, duration=0.5562\n", "6: pitch=70, note_name=A#4, duration=0.5792\n", "7: pitch=73, note_name=C#5, duration=0.3823\n", "8: pitch=61, note_name=C#4, duration=0.6135\n", "9: pitch=56, note_name=G#3, duration=1.5927\n" ] } ], "source": [ "for i, note in enumerate(instrument.notes[:10]):\n", " note_name = pretty_midi.note_number_to_name(note.pitch)\n", " duration = note.end - note.start\n", " print(f'{i}: pitch={note.pitch}, note_name={note_name},'\n", " f' duration={duration:.4f}')" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "id": "zL6Ur9oI74td" }, "outputs": [], "source": [ "def midi_to_notes(midi_file: str) -> pd.DataFrame:\n", " pm = pretty_midi.PrettyMIDI(midi_file)\n", " instrument = pm.instruments[0]\n", " notes = collections.defaultdict(list)\n", "\n", " # Sort the notes by start time\n", " sorted_notes = sorted(instrument.notes, key=lambda note: note.start)\n", " prev_start = sorted_notes[0].start\n", "\n", " for note in sorted_notes:\n", " start = note.start\n", " end = note.end\n", " notes['pitch'].append(note.pitch)\n", " notes['start'].append(start)\n", " notes['end'].append(end)\n", " notes['step'].append(start - prev_start)\n", " notes['duration'].append(end - start)\n", " prev_start = start\n", "\n", " return pd.DataFrame({name: np.array(value) for name, value in notes.items()})" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 206 }, "id": "1Ic9oYGZ74q4", "outputId": "a416dd87-d7db-41b1-ac23-a617047f0237" }, "outputs": [ { "data": { "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
pitchstartendstepduration
0681.0083331.4135420.0000000.405208
1561.0395832.6322920.0312501.592708
2591.0531251.6541670.0135420.601042
3701.2750001.5239580.2218750.248958
4711.5083331.7531250.2333330.244792
\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "
\n", "
\n" ], "text/plain": [ " pitch start end step duration\n", "0 68 1.008333 1.413542 0.000000 0.405208\n", "1 56 1.039583 2.632292 0.031250 1.592708\n", "2 59 1.053125 1.654167 0.013542 0.601042\n", "3 70 1.275000 1.523958 0.221875 0.248958\n", "4 71 1.508333 1.753125 0.233333 0.244792" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "raw_notes = midi_to_notes(sample_file)\n", "raw_notes.head()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "ZwtHRgq374oR", "outputId": "07c37b0c-b597-4090-948f-f83fffb0c1bc" }, "outputs": [ { "data": { "text/plain": [ "array(['G#4', 'G#3', 'B3', 'A#4', 'B4', 'D#4', 'G#4', 'A#4', 'C#4', 'C#5'],\n", " dtype='" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_piano_roll(raw_notes, count=100)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 289 }, "id": "2OrEm8Gv8CXS", "outputId": "b8189e78-9bcd-49a2-8c6d-ff436eb86e63" }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABlAAAAGJCAYAAAD14n69AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAADYW0lEQVR4nOy9fZQlVX3v/T2nkBnodgZpEAaame47cxoIRjE4gW4aBDHhosPKvXrzXHEMrfKEUSNR0ZvEZ4kxxgRf8qIxremX3MAySpa51+hivEajIGGmOzIaTVR0OKM9uVM4Q6SBM3QLJOmu549tzalTZ++qvat2vZ3z/ax1Vvc5p2rv3/7t39uuOlVV8zzPAyGEEEIIIYQQQgghhBBCCDlBvWgBCCGEEEIIIYQQQgghhBBCygZPoBBCCCGEEEIIIYQQQgghhITgCRRCCCGEEEIIIYQQQgghhJAQPIFCCCGEEEIIIYQQQgghhBASgidQCCGEEEIIIYQQQgghhBBCQvAECiGEEEIIIYQQQgghhBBCSAieQCGEEEIIIYQQQgghhBBCCAnBEyiEEEIIIYQQQgghhBBCCCEheAKFEEIIIYQQQgghhBBCCCEkBE+gEEIIIYQQQnKjVqvhzW9+s7X2vvrVr6JWq+GrX/2qtTaL5rWvfS0GBweLFoMQQgghhJC+hydQCCGEEEIIIbF8+tOfRq1Ww9/8zd90ffeCF7wAtVoN9957b9d3W7duxcTERB4iWuFHP/oR3vOe9+Bb3/pW0aIQQgghhBBCCoYnUAghhBBCCCGxTE5OAgD27dvX8fnx48fxne98ByeddBL279/f8d2RI0dw5MiRE/tWgR/96Ef4nd/5HZ5AIYQQQgghhPAECiGEEEIIISSec845B6Ojo10nUBYXF+F5Hn75l3+56zv/fZVOoJjyk5/8pGgRCCGEEEIIIRnBEyiEEEIIIYQQLSYnJ/HNb34TTz311InP9u/fj4suugjXXXcd/uEf/gHr6+sd39VqNVx++eVdbX32s5/F8573PGzYsAEXXXQR/vZv/7Zrm29+85u47rrrsGnTJgwODuKaa67BP/zDP2jJ+rWvfQ3/+T//Z2zevBmnnnoqXvziF3ddIRPmq1/9Knbu3AkAeN3rXodarYZarYY77rgDAHDVVVfhec97Hr7xjW/gyiuvxKmnnor/7//7/wAAn/vc5/Dyl78c55xzDjZs2IDt27fjd3/3d7G2tiaV7WUvexme85znYGBgAM9//vPxkY98JFK2b33rWzjzzDNx1VVXYWVlRUsHhBBCCCGEkHTwBAohhBBCCCFEi8nJSfz7v/87vva1r534bP/+/ZiYmMDExARarRa+853vdHx3wQUXYGhoqKOdffv24U1vehNe9apX4YMf/CCefvppvPKVr8Ty8vKJbb773e/iiiuuwD/90z/hN37jN3DbbbdhaWkJV111VUf/Mu655x5ceeWVOH78OH77t38bv//7v48nnngCL3nJS/DAAw8o97vwwgvx3ve+FwBw88034xOf+AQ+8YlP4MorrzyxzfLyMq677jpcfPHF+PCHP4yrr74aAHDHHXdgcHAQt956Kz7ykY/gkksuwbvf/W781m/9Vkcff/d3f4crr7wSDz74IN7ylrfgD//wD3H11Vdj7969SrkOHDiAl7zkJXjhC1+IL3zhC3zAPCGEEEIIITlxUtECEEIIIYQQQqpB8DkoV111Ff7jP/4DX/va1zA1NYXt27fjrLPOwr59+/D85z8fTz75JL797W/j9a9/fVc73/ve9/Dggw9i+/btAICrr74aL3jBC3DXXXfhzW9+MwDgXe96F/793/8d+/btw3/6T/8JAHDjjTfi/PPPx2/8xm/gvvvuk8roeR7e8IY34Oqrr8YXvvAF1Go1AMCePXtw0UUX4V3vehe+9KUvSfc966yzcN111+Hd7343xsfH8ZrXvKZrm2PHjuHP/uzPsGfPno7PP/WpT+GUU0458f4Nb3gD3vCGN+BjH/sY3ve+92HDhg1YW1vDnj17sGXLFnzrW9/Caaed1iG3jP379+NlL3sZrrjiCvzv//2/sWHDBul2hBBCCCGEEPvwChRCCCGEEEKIFhdeeCGGhoZOPNvkn/7pn7C6uoqJiQkAwMTExInbZC0uLmJtbU36/JOXvvSlJ06eAMDzn/98bNq0CT/84Q8BAGtra/jSl76E//Jf/suJkycAsGXLFrz61a/Gvn37cPz4camM3/rWt9BsNvHqV78ay8vLePTRR/Hoo49idXUV11xzDf7+7/++4zZjpmzYsAGve93ruj4Pnjx58skn8eijj+KKK67AT37yE3z/+98HIG5JtrS0hLe+9a0dJ08AnDjRE+Tee+/Ftddei2uuuQaf+cxnePKEEEIIIYSQnOEV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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_piano_roll(raw_notes)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "id": "6WFFdXGB8CUe" }, "outputs": [], "source": [ "def plot_distributions(notes: pd.DataFrame, drop_percentile=2.5):\n", " plt.figure(figsize=[15, 5])\n", " plt.subplot(1, 3, 1)\n", " sns.histplot(notes, x=\"pitch\", bins=20)\n", "\n", " plt.subplot(1, 3, 2)\n", " max_step = np.percentile(notes['step'], 100 - drop_percentile)\n", " sns.histplot(notes, x=\"step\", bins=np.linspace(0, max_step, 21))\n", "\n", " plt.subplot(1, 3, 3)\n", " max_duration = np.percentile(notes['duration'], 100 - drop_percentile)\n", " sns.histplot(notes, x=\"duration\", bins=np.linspace(0, max_duration, 21))" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 420 }, "id": "cQjtdi1d8JCz", "outputId": "d5f3b3f2-9757-4b95-82f2-c2a9412098ae" }, "outputs": [ { "data": { "image/png": "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00Z9+vTR//t//8+H0XquoZ/L81auXKmgoCANHz7cuwGaoCF9XLZs2QXjcEREhA+jRWO1lLHGW/i8eG7Lli26++67lZCQoKCgIL3zzjvf22bTpk267rrrFB4erquuukrLli3zepyBrKHHcNOmTRc9f7Lb7b4JOMDk5eXp+uuvV7t27RQbG6vhw4fr4MGD39vOjL+DJN0C2M6dO/WHP/xBvXr1cts+depUvf/++1q1apU2b96sr776SiNGjPBTlN7TvXt3lZaWupa//e1vrrKWcgy++eYb3XTTTQoNDdVf/vIX7d+/X88++6wuu+wyV5158+bphRde0OLFi7Vjxw61adNG6enpOnv2rB8jN9fOnTvd3gvr16+XJP3sZz+T1HLeD0899ZQWLVqkl156ScXFxXrqqac0b948vfjii646LeH90Nz86U9/Uk5OjmbNmqVPP/1UvXv3Vnp6usrLyy9af9u2bbrnnns0btw4ffbZZxo+fLiGDx+uvXv3+jjyhmloP8+cOaMrrrhCTz75pKxWq4+j9UxD+7hp0ybdc889+vjjj1VYWKjExEQNGjRIX375pY8j/+Ea2seYmBj9/ve/V2FhoT7//HPdf//9uv/++7Vu3TofR94wDe3neceOHdODDz6oW265xUeRes6TPlosFrfx+IsvvvBhxGiMljLWeAufl8Y5ffq0evfurYULF/6g+kePHtXQoUN12223affu3ZoyZYr+53/+J+DHDm9q6DE87+DBg27vw9jYWC9FGNg2b96srKwsbd++XevXr1dNTY0GDRqk06dPX7KNaX8HDQSkkydPGldffbWxfv1648c//rExefJkwzAMo7Ky0ggNDTVWrVrlqltcXGxIMgoLC/0UrflmzZpl9O7d+6JlLeUYGIZhTJ8+3bj55psvWV5fX29YrVbj6aefdm2rrKw0wsPDjTfeeMMXIfrF5MmTjSuvvNKor69vUe+HoUOHGmPHjnXbNmLECGPUqFGGYbTc90NTd8MNNxhZWVmu9bq6OiMhIcHIy8u7aP2f//znxtChQ922paamGr/61a+8GmdjNbSf/6lTp07G/PnzvRidORrTR8MwjNraWqNdu3bG8uXLvRViozW2j4ZhGNdee60xY8YMb4RnGk/6WVtba9x4443G//7v/xqZmZnGsGHDfBCp5xrax6VLlxpRUVE+ig5mayljjbfw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Hz7c32EAAHDR5N6NN96o0tJSRUVF+ScowCQh/g4AgLuOHTv6OwQAAAAAaJSamhqFhoZ61DYsLExWq9XkiADf40o3wMcGDBig7OxsZWdnKyoqSh06dNDMmTNlGIYk91tDO3fuLEn66U9/qqCgINe6JL3//vu6/vrrFRERoQ4dOuinP/2p2+ucOXNGY8eOVbt27ZSUlKRXXnnFF90DAASQP//5z+rZs6ciIyPVvn17paWladq0aVq+fLneffddBQUFKSgoSJs2bZIkHT9+XD//+c8VHR2tmJgYDRs2TMeOHXPt7/wVcrNnz1bHjh1lsVj061//WufOnfNPBwEApjh9+rTuvfdetW3bVvHx8Xr22Wfdyi929010dLSWLVsmSTp27JiCgoL0pz/9ST/+8Y8VERGhFStW6Ouvv9Y999yjH/3oR2rdurV69uypN954w7WP++67T5s3b9bzzz/vGpOOHTt20dtL33rrLXXv3l3h4eHq3LnzBTF27txZTzzxBOdACCgk3QA/WL58uUJCQvTJJ5/o+eef13PPPaf//d//vaDezp07JUlLly5VaWmpa/2DDz7QT3/6Uw0ZMkSfffaZCgoKdMMNN7i1ffbZZ9WvXz999tln+s1vfqOJEyfq4MGD3u8cACAglJaW6p577tHYsWNVXFysTZs2acSIEZo1a5Z+/vOf684771RpaalKS0t14403qqamRunp6WrXrp3++te/auvWrWrbtq3uvPNOt6RaQUGBa39vvPGG3n77bc2ePduPPQUANNa0adO0efNmvfvuu/roo4+0adMmffrppw3ez8MPP6zJkyeruLhY6enpOnv2rPr27asPPvhAe/fu1YQJEzRmzBh98sknkqTnn39eNptN48ePd41JiYmJF+y3qKhIP//5zzVy5Ejt2bNHjz76qGbOnOlK+p3HORACDbeXAn6QmJio+fPnKygoSF27dtWePXs0f/58jR8/3q3e+VtNo6Oj3S6vfvzxxzVy5Ei3k5zevXu7tR0yZIh+85vfSJKmT5+u+fPn6+OPP1bXrl291S0AQAApLS1VbW2tRowYoU6dOkmSevbsKUmKjIyU0+l0G1tef/111dfX63//938VFBQk6dt/+kRHR2vTpk0aNGiQpG9v+XnttdfUunVrde/eXXPmzNG0adM0d+5cBQfz/1wAaGpOnTqlJUuW6PXXX9fAgQMlfXuRwOWXX97gfU2ZMkUjRoxw2/bggw+6fp40aZLWrVunN998UzfccIOioqIUFham1q1bf+ftpM8995wGDhyomTNnSpKuueYa7d+/X08//bTuu+8+Vz3OgRBo+GYE+EH//v1dJzSSZLPZdOjQIdXV1f2g9rt373YNiJfSq1cv189BQUGyWq0qLy/3LGAAQJPTu3dvDRw4UD179tTPfvYzvfrqq/rmm28uWf/vf/+7Dh8+rHbt2qlt27Zq27atYmJidPbsWR05csRtv61bt3at22w2nTp1SsePH/dqfwAA3nHkyBGdO3dOqamprm0xMTEeJar69evntl5XV6e5c+eqZ8+eiomJUdu2bbVu3TqVlJQ0aL/FxcW66aab3LbddNNNF5xDcQ6EQMOVbkATFBkZ+b11/nvS0qCgINXX13srJABAgGnVqpXWr1+vbdu26aOPPtKLL76o3//+99qxY8dF6586dUp9+/bVihUrLijjIT8A0LIFBQW55qA+r6am5oJ6bdq0cVt/+umn9fzzz2vBggXq2bOn2rRpoylTpnhtLlDOgRBouNIN8IP/PuHZvn27rr76arVq1eqCuqGhoRdcAderVy8VFBR4NUYAQNMXFBSkm266SbNnz9Znn32msLAwrV69WmFhYReMLdddd50OHTqk2NhYXXXVVW5LVFSUq97f//53VVdXu9a3b9+utm3bXnQOHgBA4LvyyisVGhrqdo7yzTff6B//+IdrvWPHjiotLXWtHzp0SGfOnPnefW/dulXDhg3T6NGj1bt3b11xxRVu+5V00THpv6WkpGjr1q0X7Puaa6656DkUEChIugF+UFJSopycHB08eFBvvPGGXnzxRU2ePPmidTt37qyCggLZ7XbXbUGzZs3SG2+8oVmzZqm4uFh79uzRU0895csuAAAC3I4dO/TEE09o165dKikp0dtvv61///vfSklJUefOnfX555/r4MGDqqioUE1NjUaNGqUOHTpo2LBh+utf/6qjR49q06ZN+u1vf6t//etfrv2eO3dO48aN0/79+/Xhhx9q1qxZys7OZj43AGii2rZtq3HjxmnatGnauHGj9u7dq/vuu8/t7/rtt9+ul156SZ999pl27dqlX//61xdcVXYxV199teuq6+LiYv3qV79SWVmZW53OnTtrx44dOnbsmCoqKi56ZdoDDzyggoICzZ07V//4xz+0fPlyvfTSS27zxQGBiG9HgB/ce++9qq6u1g033KCsrCxNnjxZEyZMuGjdZ599VuvXr1diYqKuvfZaSdKAAQO0atUqvffee+rTp49uv/121xOAAACQJIvFoi1btmjIkCG65pprNGPGDD377LMaPHiwxo8fr65du6pfv37q2LGjtm7dqtatW2vLli1KSkrSiBEjlJKSonHjxuns2bOyWCyu/Q4cOFBXX321br31Vv3iF7/QT37yEz366KP+6ygAoNGefvpp3XLLLbr77ruVlpamm2++WX379nWVP/vss0pMTNQtt9yiX/7yl3rwwQfd5ve8lBkzZui6665Tenq6BgwYIKvVquHDh7vVefDBB9WqVSt169ZNHTt2vOh8b9ddd53efPNNrVy5Uj169NAjjzyiOXPmuD1EAQhEQcZ/35gNwKsGDBigPn36aMGCBf4OBQCABrnvvvtUWVmpd955x9+hAAAABDyudAMAAAAAAABMRtINAAAAAAAAMBm3lwIAAAAAAAAm40o3AAAAAAAAwGQk3QAAAAAAAACTkXQDAAAAAAAATEbSDQAAAAAAADAZSTcAAAAAAADAZCTdAAAAAAAAAJORdAMAAAAAAABMRtINAAAAAAAAMBlJNwAAAAAAAMBk/z+sJ9jttqcnzwAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_distributions(raw_notes)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "id": "_HrSph2l8I_E" }, "outputs": [], "source": [ "def notes_to_midi(\n", " notes: pd.DataFrame,\n", " out_file: str,\n", " instrument_name: str,\n", " velocity: int = 100, # note loudness\n", ") -> pretty_midi.PrettyMIDI:\n", "\n", " pm = pretty_midi.PrettyMIDI()\n", " instrument = pretty_midi.Instrument(\n", " program=pretty_midi.instrument_name_to_program(\n", " instrument_name))\n", "\n", " prev_start = 0\n", " for i, note in notes.iterrows():\n", " start = float(prev_start + note['step'])\n", " end = float(start + note['duration'])\n", " note = pretty_midi.Note(\n", " velocity=velocity,\n", " pitch=int(note['pitch']),\n", " start=start,\n", " end=end,\n", " )\n", " instrument.notes.append(note)\n", " prev_start = start\n", "\n", " pm.instruments.append(instrument)\n", " pm.write(out_file)\n", " return pm" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "id": "36PDwmdM8I8W" }, "outputs": [], "source": [ "example_file = 'example.midi'\n", "example_pm = notes_to_midi(\n", " raw_notes, out_file=example_file, instrument_name=instrument_name)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 74 }, "id": "wbdtcurB8I5k", "outputId": "adff79bc-21dd-4c3e-cbee-ea2309ac7a06" }, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "display_audio(example_pm)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "id": "tmusgxE08PvY" }, "outputs": [], "source": [ "num_files = 5\n", "all_notes = []\n", "for f in filenames[:num_files]:\n", " notes = midi_to_notes(f)\n", " all_notes.append(notes)\n", "\n", "all_notes = pd.concat(all_notes)\n", "\n" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "IpjIKp0W8PsI", "outputId": "be20eada-4dc4-40ad-bbc3-0d2ae2dfc414" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of notes parsed: 17744\n" ] } ], "source": [ "n_notes = len(all_notes)\n", "print('Number of notes parsed:', n_notes)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "id": "tcXGxo-I8Pov" }, "outputs": [], "source": [ "key_order = ['pitch', 'step', 'duration']\n", "train_notes = np.stack([all_notes[key] for key in key_order], axis=1)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Z-HzraBt8PkR", "outputId": "4abbc353-a2cc-49e5-ddfe-d2a05d380100" }, "outputs": [ { "data": { "text/plain": [ "TensorSpec(shape=(3,), dtype=tf.float64, name=None)" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "notes_ds = tf.data.Dataset.from_tensor_slices(train_notes)\n", "notes_ds.element_spec" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "id": "d4KNRvOD8WBm" }, "outputs": [], "source": [ "def create_sequences(\n", " dataset: tf.data.Dataset,\n", " seq_length: int,\n", " vocab_size = 128,\n", ") -> tf.data.Dataset:\n", " \"\"\"Returns TF Dataset of sequence and label examples.\"\"\"\n", " seq_length = seq_length+1\n", "\n", " # Take 1 extra for the labels\n", " windows = dataset.window(seq_length, shift=1, stride=1,\n", " drop_remainder=True)\n", "\n", " # `flat_map` flattens the\" dataset of datasets\" into a dataset of tensors\n", " flatten = lambda x: x.batch(seq_length, drop_remainder=True)\n", " sequences = windows.flat_map(flatten)\n", "\n", " # Normalize note pitch\n", " def scale_pitch(x):\n", " x = x/[vocab_size,1.0,1.0]\n", " return x\n", "\n", " # Split the labels\n", " def split_labels(sequences):\n", " inputs = sequences[:-1]\n", " labels_dense = sequences[-1]\n", " labels = {key:labels_dense[i] for i,key in enumerate(key_order)}\n", "\n", " return scale_pitch(inputs), labels\n", "\n", " return sequences.map(split_labels, num_parallel_calls=tf.data.AUTOTUNE)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "ifjazhkn8V9G", "outputId": "59b844b6-f92f-4e3d-b82e-61e11b99a7a5" }, "outputs": [ { "data": { "text/plain": [ "(TensorSpec(shape=(25, 3), dtype=tf.float64, name=None),\n", " {'pitch': TensorSpec(shape=(), dtype=tf.float64, name=None),\n", " 'step': TensorSpec(shape=(), dtype=tf.float64, name=None),\n", " 'duration': TensorSpec(shape=(), dtype=tf.float64, name=None)})" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "seq_length = 25\n", "vocab_size = 128\n", "seq_ds = create_sequences(notes_ds, seq_length, vocab_size)\n", "seq_ds.element_spec" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "DqpYgaX18V5N", "outputId": "075044bf-8f63-4935-979e-157b9ffb9bf5" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "sequence shape: (25, 3)\n", "sequence elements (first 10): tf.Tensor(\n", "[[0.59375 0. 0.071875 ]\n", " [0.5390625 0.00104167 0.05208333]\n", " [0.5 0.00520833 0.053125 ]\n", " [0.4453125 0.00833333 0.046875 ]\n", " [0.5390625 0.21354167 0.034375 ]\n", " [0.5 0. 0.05 ]\n", " [0.59375 0. 0.05104167]\n", " [0.4453125 0.00104167 0.053125 ]\n", " [0.5 0.371875 0.053125 ]\n", " [0.59375 0.00104167 0.0625 ]], shape=(10, 3), dtype=float64)\n", "\n", "target: {'pitch': , 'step': , 'duration': }\n" ] } ], "source": [ "for seq, target in seq_ds.take(1):\n", " print('sequence shape:', seq.shape)\n", " print('sequence elements (first 10):', seq[0: 10])\n", " print()\n", " print('target:', target)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "id": "LjsBrZXe8cMi" }, "outputs": [], "source": [ "batch_size = 64\n", "buffer_size = n_notes - seq_length # the number of items in the dataset\n", "train_ds = (seq_ds\n", " .shuffle(buffer_size)\n", " .batch(batch_size, drop_remainder=True)\n", " .cache()\n", " .prefetch(tf.data.experimental.AUTOTUNE))" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "EWrmjg-v8cKK", "outputId": "feca9d1b-ca9e-4f08-9197-427effc6fb80" }, "outputs": [ { "data": { "text/plain": [ "(TensorSpec(shape=(64, 25, 3), dtype=tf.float64, name=None),\n", " {'pitch': TensorSpec(shape=(64,), dtype=tf.float64, name=None),\n", " 'step': TensorSpec(shape=(64,), dtype=tf.float64, name=None),\n", " 'duration': TensorSpec(shape=(64,), dtype=tf.float64, name=None)})" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train_ds.element_spec" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "id": "QgKQs8Cp8cH1" }, "outputs": [], "source": [ "def mse_with_positive_pressure(y_true: tf.Tensor, y_pred: tf.Tensor):\n", " mse = (y_true - y_pred) ** 2\n", " positive_pressure = 10 * tf.maximum(-y_pred, 0.0)\n", " return tf.reduce_mean(mse + positive_pressure)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "KXKMqe7z8cEq", "outputId": "a2f50821-cc23-4d3c-b9bd-4bd017ee2439" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model: \"model\"\n", "__________________________________________________________________________________________________\n", " Layer (type) Output Shape Param # Connected to \n", "==================================================================================================\n", " input_1 (InputLayer) [(None, 25, 3)] 0 [] \n", " \n", " lstm (LSTM) (None, 128) 67584 ['input_1[0][0]'] \n", " \n", " duration (Dense) (None, 1) 129 ['lstm[0][0]'] \n", " \n", " pitch (Dense) (None, 128) 16512 ['lstm[0][0]'] \n", " \n", " step (Dense) (None, 1) 129 ['lstm[0][0]'] \n", " \n", "==================================================================================================\n", "Total params: 84354 (329.51 KB)\n", "Trainable params: 84354 (329.51 KB)\n", "Non-trainable params: 0 (0.00 Byte)\n", "__________________________________________________________________________________________________\n" ] } ], "source": [ "input_shape = (seq_length, 3)\n", "learning_rate = 0.005\n", "\n", "inputs = tf.keras.Input(input_shape)\n", "x = tf.keras.layers.LSTM(128)(inputs)\n", "\n", "outputs = {\n", " 'pitch': tf.keras.layers.Dense(128, name='pitch')(x),\n", " 'step': tf.keras.layers.Dense(1, name='step')(x),\n", " 'duration': tf.keras.layers.Dense(1, name='duration')(x),\n", "}\n", "\n", "model = tf.keras.Model(inputs, outputs)\n", "\n", "loss = {\n", " 'pitch': tf.keras.losses.SparseCategoricalCrossentropy(\n", " from_logits=True),\n", " 'step': mse_with_positive_pressure,\n", " 'duration': mse_with_positive_pressure,\n", "}\n", "\n", "optimizer = tf.keras.optimizers.Adam(learning_rate=learning_rate)\n", "\n", "model.compile(loss=loss, optimizer=optimizer)\n", "\n", "model.summary()" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Zx05T_Rp8j4Q", "outputId": "eda780ed-0f70-40a5-8603-0ebeb90f2b39" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "276/276 [==============================] - 17s 24ms/step - loss: 5.0208 - duration_loss: 0.1338 - pitch_loss: 4.8559 - step_loss: 0.0311\n" ] }, { "data": { "text/plain": [ "{'loss': 5.020809173583984,\n", " 'duration_loss': 0.13375774025917053,\n", " 'pitch_loss': 4.8559160232543945,\n", " 'step_loss': 0.031137656420469284}" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "losses = model.evaluate(train_ds, return_dict=True)\n", "losses" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "id": "HlFGhQ6M8j1r" }, "outputs": [], "source": [ "model.compile(\n", " loss=loss,\n", " loss_weights={\n", " 'pitch': 0.05,\n", " 'step': 1.0,\n", " 'duration':1.0,\n", " },\n", " optimizer=optimizer,\n", ")" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "gyOsQbNn8jz0", "outputId": "dd5932e8-05a3-4a53-ff39-3fae3c431308" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "276/276 [==============================] - 6s 17ms/step - loss: 0.4077 - duration_loss: 0.1338 - pitch_loss: 4.8559 - step_loss: 0.0311\n" ] }, { "data": { "text/plain": [ "{'loss': 0.4076911509037018,\n", " 'duration_loss': 0.13375774025917053,\n", " 'pitch_loss': 4.8559160232543945,\n", " 'step_loss': 0.031137656420469284}" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.evaluate(train_ds, return_dict=True)" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "id": "_CX7wBuZ8jxy" }, "outputs": [], "source": [ "callbacks = [\n", " tf.keras.callbacks.ModelCheckpoint(\n", " filepath='./training_checkpoints/ckpt_{epoch}',\n", " save_weights_only=True),\n", " tf.keras.callbacks.EarlyStopping(\n", " monitor='loss',\n", " patience=5,\n", " verbose=1,\n", " restore_best_weights=True),\n", "]" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "WsAE82108jua", "outputId": "1eb06560-c252-4103-b727-9910a2186e52" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/50\n", "276/276 [==============================] - 14s 41ms/step - loss: 0.3227 - duration_loss: 0.0862 - pitch_loss: 4.1751 - step_loss: 0.0278\n", "Epoch 2/50\n", "276/276 [==============================] - 12s 45ms/step - loss: 0.3047 - duration_loss: 0.0823 - pitch_loss: 3.9569 - step_loss: 0.0246\n", "Epoch 3/50\n", "276/276 [==============================] - 12s 44ms/step - loss: 0.2992 - duration_loss: 0.0808 - pitch_loss: 3.8803 - step_loss: 0.0244\n", "Epoch 4/50\n", "276/276 [==============================] - 13s 48ms/step - loss: 0.2957 - duration_loss: 0.0805 - pitch_loss: 3.8175 - step_loss: 0.0244\n", "Epoch 5/50\n", "276/276 [==============================] - 12s 44ms/step - loss: 0.2929 - duration_loss: 0.0795 - pitch_loss: 3.7917 - step_loss: 0.0239\n", "Epoch 6/50\n", "276/276 [==============================] - 12s 44ms/step - loss: 0.2908 - duration_loss: 0.0788 - pitch_loss: 3.7624 - step_loss: 0.0239\n", "Epoch 7/50\n", "276/276 [==============================] - 14s 51ms/step - loss: 0.2883 - duration_loss: 0.0779 - pitch_loss: 3.7422 - step_loss: 0.0232\n", "Epoch 8/50\n", "276/276 [==============================] - 13s 46ms/step - loss: 0.2862 - duration_loss: 0.0776 - pitch_loss: 3.7249 - step_loss: 0.0224\n", "Epoch 9/50\n", "276/276 [==============================] - 19s 69ms/step - loss: 0.2870 - duration_loss: 0.0774 - pitch_loss: 3.7197 - step_loss: 0.0236\n", "Epoch 10/50\n", "276/276 [==============================] - 12s 44ms/step - loss: 0.2842 - duration_loss: 0.0766 - pitch_loss: 3.6995 - step_loss: 0.0226\n", "Epoch 11/50\n", "276/276 [==============================] - 12s 45ms/step - loss: 0.2826 - duration_loss: 0.0757 - pitch_loss: 3.6895 - step_loss: 0.0224\n", "Epoch 12/50\n", "276/276 [==============================] - 12s 42ms/step - loss: 0.2818 - duration_loss: 0.0761 - pitch_loss: 3.6835 - step_loss: 0.0215\n", "Epoch 13/50\n", "276/276 [==============================] - 14s 50ms/step - loss: 0.2795 - duration_loss: 0.0751 - pitch_loss: 3.6725 - step_loss: 0.0208\n", "Epoch 14/50\n", "276/276 [==============================] - 13s 48ms/step - loss: 0.2793 - duration_loss: 0.0746 - pitch_loss: 3.6657 - step_loss: 0.0214\n", "Epoch 15/50\n", "276/276 [==============================] - 12s 45ms/step - loss: 0.2771 - duration_loss: 0.0740 - pitch_loss: 3.6701 - step_loss: 0.0196\n", "Epoch 16/50\n", "276/276 [==============================] - 14s 52ms/step - loss: 0.2771 - duration_loss: 0.0738 - pitch_loss: 3.6571 - step_loss: 0.0205\n", "Epoch 17/50\n", "276/276 [==============================] - 12s 45ms/step - loss: 0.2759 - duration_loss: 0.0736 - pitch_loss: 3.6453 - step_loss: 0.0200\n", "Epoch 18/50\n", "276/276 [==============================] - 12s 45ms/step - loss: 0.2741 - duration_loss: 0.0727 - pitch_loss: 3.6368 - step_loss: 0.0196\n", "Epoch 19/50\n", "276/276 [==============================] - 11s 41ms/step - loss: 0.2720 - duration_loss: 0.0722 - pitch_loss: 3.6271 - step_loss: 0.0184\n", "Epoch 20/50\n", "276/276 [==============================] - 14s 51ms/step - loss: 0.2722 - duration_loss: 0.0722 - pitch_loss: 3.6205 - step_loss: 0.0190\n", "Epoch 21/50\n", "276/276 [==============================] - 12s 44ms/step - loss: 0.2708 - duration_loss: 0.0719 - pitch_loss: 3.6173 - step_loss: 0.0180\n", "Epoch 22/50\n", "276/276 [==============================] - 12s 45ms/step - loss: 0.2677 - duration_loss: 0.0709 - pitch_loss: 3.6021 - step_loss: 0.0167\n", "Epoch 23/50\n", "276/276 [==============================] - 12s 44ms/step - loss: 0.2651 - duration_loss: 0.0697 - pitch_loss: 3.5895 - step_loss: 0.0160\n", "Epoch 24/50\n", "276/276 [==============================] - 12s 45ms/step - loss: 0.2636 - duration_loss: 0.0687 - pitch_loss: 3.5760 - step_loss: 0.0161\n", "Epoch 25/50\n", "276/276 [==============================] - 12s 45ms/step - loss: 0.2600 - duration_loss: 0.0676 - pitch_loss: 3.5618 - step_loss: 0.0143\n", "Epoch 26/50\n", "276/276 [==============================] - 12s 44ms/step - loss: 0.2587 - duration_loss: 0.0667 - pitch_loss: 3.5527 - step_loss: 0.0144\n", "Epoch 27/50\n", "276/276 [==============================] - 12s 45ms/step - loss: 0.2562 - duration_loss: 0.0649 - pitch_loss: 3.5443 - step_loss: 0.0141\n", "Epoch 28/50\n", "276/276 [==============================] - 12s 44ms/step - loss: 0.2550 - duration_loss: 0.0641 - pitch_loss: 3.5399 - step_loss: 0.0139\n", "Epoch 29/50\n", "276/276 [==============================] - 12s 45ms/step - loss: 0.2603 - duration_loss: 0.0667 - pitch_loss: 3.5656 - step_loss: 0.0154\n", "Epoch 30/50\n", "276/276 [==============================] - 11s 42ms/step - loss: 0.2555 - duration_loss: 0.0644 - pitch_loss: 3.5318 - step_loss: 0.0145\n", "Epoch 31/50\n", "276/276 [==============================] - 12s 44ms/step - loss: 0.2549 - duration_loss: 0.0639 - pitch_loss: 3.5218 - step_loss: 0.0149\n", "Epoch 32/50\n", "276/276 [==============================] - 12s 44ms/step - loss: 0.2511 - duration_loss: 0.0618 - pitch_loss: 3.5122 - step_loss: 0.0137\n", "Epoch 33/50\n", "276/276 [==============================] - 12s 44ms/step - loss: 0.2558 - duration_loss: 0.0647 - pitch_loss: 3.5160 - step_loss: 0.0153\n", "Epoch 34/50\n", "276/276 [==============================] - 12s 44ms/step - loss: 0.2512 - duration_loss: 0.0630 - pitch_loss: 3.4960 - step_loss: 0.0135\n", "Epoch 35/50\n", "276/276 [==============================] - 12s 44ms/step - loss: 0.2439 - duration_loss: 0.0577 - pitch_loss: 3.4700 - step_loss: 0.0126\n", "Epoch 36/50\n", "276/276 [==============================] - 14s 50ms/step - loss: 0.2490 - duration_loss: 0.0600 - pitch_loss: 3.4660 - step_loss: 0.0157\n", "Epoch 37/50\n", "276/276 [==============================] - 12s 43ms/step - loss: 0.2441 - duration_loss: 0.0587 - pitch_loss: 3.4499 - step_loss: 0.0130\n", "Epoch 38/50\n", "276/276 [==============================] - 12s 45ms/step - loss: 0.2455 - duration_loss: 0.0592 - pitch_loss: 3.4704 - step_loss: 0.0128\n", "Epoch 39/50\n", "276/276 [==============================] - 12s 44ms/step - loss: 0.2444 - duration_loss: 0.0592 - pitch_loss: 3.4366 - step_loss: 0.0134\n", "Epoch 40/50\n", "276/276 [==============================] - 12s 45ms/step - loss: 0.2364 - duration_loss: 0.0532 - pitch_loss: 3.4152 - step_loss: 0.0124\n", "Epoch 41/50\n", "276/276 [==============================] - 12s 45ms/step - loss: 0.2349 - duration_loss: 0.0517 - pitch_loss: 3.4171 - step_loss: 0.0123\n", "Epoch 42/50\n", "276/276 [==============================] - 13s 46ms/step - loss: 0.2489 - duration_loss: 0.0618 - pitch_loss: 3.4786 - step_loss: 0.0132\n", "Epoch 43/50\n", "276/276 [==============================] - 12s 45ms/step - loss: 0.2396 - duration_loss: 0.0567 - pitch_loss: 3.4111 - step_loss: 0.0123\n", "Epoch 44/50\n", "276/276 [==============================] - 12s 44ms/step - loss: 0.2323 - duration_loss: 0.0503 - pitch_loss: 3.3994 - step_loss: 0.0120\n", "Epoch 45/50\n", "276/276 [==============================] - 14s 49ms/step - loss: 0.2330 - duration_loss: 0.0516 - pitch_loss: 3.3868 - step_loss: 0.0121\n", "Epoch 46/50\n", "276/276 [==============================] - 12s 45ms/step - loss: 0.2301 - duration_loss: 0.0484 - pitch_loss: 3.3779 - step_loss: 0.0128\n", "Epoch 47/50\n", "276/276 [==============================] - 12s 45ms/step - loss: 0.2290 - duration_loss: 0.0481 - pitch_loss: 3.3812 - step_loss: 0.0118\n", "Epoch 48/50\n", "276/276 [==============================] - 12s 45ms/step - loss: 0.2509 - duration_loss: 0.0626 - pitch_loss: 3.5011 - step_loss: 0.0132\n", "Epoch 49/50\n", "276/276 [==============================] - 12s 45ms/step - loss: 0.2470 - duration_loss: 0.0603 - pitch_loss: 3.4742 - step_loss: 0.0130\n", "Epoch 50/50\n", "276/276 [==============================] - 12s 43ms/step - loss: 0.2404 - duration_loss: 0.0570 - pitch_loss: 3.4128 - step_loss: 0.0128\n", "CPU times: user 13min 28s, sys: 35.6 s, total: 14min 3s\n", "Wall time: 14min 57s\n" ] } ], "source": [ "%%time\n", "epochs = 50\n", "\n", "history = model.fit(\n", " train_ds,\n", " epochs=epochs,\n", " callbacks=callbacks,\n", ")" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 430 }, "id": "KZ6u433y8jrf", "outputId": "8fb59db5-b55b-4a66-a901-2a2ae81e3433" }, "outputs": [ { "data": { "image/png": "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73frsvZ+N9azYsZJt0REROTwGFiIiIjI4TGwNEKlUmHu3LlQqVRSl9Iu8H63Lt7v1sX73bp4v1uXve93m5h0S0RERG0be1iIiIjI4TGwEBERkcNjYCEiIiKHx8BCREREDo+BpRGLFy9GREQE1Go14uPjsWvXLqlLahO2bNmCO+64A8HBwRAEAT/99FOd10VRxJw5cxAUFARXV1ckJibi+PHj0hTr5ObNm4cBAwbA09MTHTt2xPjx45GVlVXnmurqakybNg1+fn7w8PDAPffcg4KCAokqdm5LlixBv379LJtnJSQk4Pfff7e8znttX/Pnz4cgCHj22Wctz/Ge284rr7wCQRDqPKKioiyv2/NeM7Bcx+rVq5GUlIS5c+ciIyMD0dHRGDNmDAoLC6UuzelVVlYiOjoaixcvrvf1N998Ex988AGWLl2KnTt3wt3dHWPGjEF1dXUrV+r8UlNTMW3aNOzYsQObNm2CwWDA6NGjUVlZabnmueeewy+//ILvvvsOqampyMvLw9133y1h1c6rU6dOmD9/PtLT07Fnzx6MGDEC48aNw6FDhwDwXtvT7t278dFHH6Ffv351nuc9t63evXsjPz/f8ti2bZvlNbvea5EaNHDgQHHatGmWfzYajWJwcLA4b948CatqewCIa9assfyzyWQSAwMDxbfeesvyXElJiahSqcRvvvlGggrblsLCQhGAmJqaKopi7b11cXERv/vuO8s1R44cEQGIaWlpUpXZpvj4+IjLly/nvbaj8vJysVu3buKmTZvEYcOGic8884woivzzbWtz584Vo6Oj633N3veaPSwN0Ov1SE9PR2JiouU5mUyGxMREpKWlSVhZ23f69Glotdo6916j0SA+Pp733gZKS0sBAL6+vgCA9PR0GAyGOvc7KioKYWFhvN8tZDQasWrVKlRWViIhIYH32o6mTZuGsWPH1rm3AP9828Px48cRHByMzp0746GHHkJ2djYA+9/rNnH4oT0UFRXBaDQiICCgzvMBAQE4evSoRFW1D1qtFgDqvffm16h5TCYTnn32Wdx4443o06cPgNr7rVQq4e3tXeda3u/mO3DgABISElBdXQ0PDw+sWbMGvXr1QmZmJu+1HaxatQoZGRnYvXv3Na/xz7dtxcfHY8WKFejRowfy8/Px6quvYujQoTh48KDd7zUDC1E7Mm3aNBw8eLDOmDPZXo8ePZCZmYnS0lJ8//33mDRpElJTU6Uuq03KycnBM888g02bNkGtVktdTpt36623Wv57v379EB8fj/DwcHz77bdwdXW162dzSKgB/v7+kMvl18xuLigoQGBgoERVtQ/m+8t7b1vTp0/Hr7/+is2bN6NTp06W5wMDA6HX61FSUlLnet7v5lMqlejatStiY2Mxb948REdH4/333+e9toP09HQUFhaif//+UCgUUCgUSE1NxQcffACFQoGAgADeczvy9vZG9+7dceLECbv/+WZgaYBSqURsbCySk5Mtz5lMJiQnJyMhIUHCytq+yMhIBAYG1rn3ZWVl2LlzJ+99M4iiiOnTp2PNmjX4888/ERkZWef12NhYuLi41LnfWVlZyM7O5v22EZPJBJ1Ox3ttByNHjsSBAweQmZlpecTFxeGhhx6y/Hfec/upqKjAyZMnERQUZP8/3y2ettuGrVq1SlSpVOKKFSvEw4cPi0888YTo7e0tarVaqUtzeuXl5eLevXvFvXv3igDEd955R9y7d6949uxZURRFcf78+aK3t7f4888/i/v37xfHjRsnRkZGipcuXZK4cuczZcoUUaPRiCkpKWJ+fr7lUVVVZbnmySefFMPCwsQ///xT3LNnj5iQkCAmJCRIWLXzmjlzppiamiqePn1a3L9/vzhz5kxREARx48aNoijyXreGq1cJiSLvuS09//zzYkpKinj69Glx+/btYmJioujv7y8WFhaKomjfe83A0ogPP/xQDAsLE5VKpThw4EBxx44dUpfUJmzevFkEcM1j0qRJoijWLm2ePXu2GBAQIKpUKnHkyJFiVlaWtEU7qfruMwDxs88+s1xz6dIlcerUqaKPj4/o5uYm3nXXXWJ+fr50RTuxf/7zn2J4eLioVCrFDh06iCNHjrSEFVHkvW4Nfw8svOe2M2HCBDEoKEhUKpViSEiIOGHCBPHEiROW1+15rwVRFMWW99MQERER2Q/nsBAREZHDY2AhIiIih8fAQkRERA6PgYWIiIgcHgMLEREROTwGFiIiInJ4DCxERETk8BhYiIiIyOExsBAREZHDY2AhIiIih8fAQkRERA6PgYWIiIgc3v8HFr1QdyMNXHkAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(history.epoch, history.history['loss'], label='total loss')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "id": "r93tXyG18s-u" }, "outputs": [], "source": [ "def predict_next_note(\n", " notes: np.ndarray,\n", " keras_model: tf.keras.Model,\n", " temperature: float = 1.0) -> int:\n", " \"\"\"Generates a note IDs using a trained sequence model.\"\"\"\n", "\n", " assert temperature > 0\n", "\n", " # Add batch dimension\n", " inputs = tf.expand_dims(notes, 0)\n", "\n", " predictions = model.predict(inputs)\n", " pitch_logits = predictions['pitch']\n", " step = predictions['step']\n", " duration = predictions['duration']\n", "\n", " pitch_logits /= temperature\n", " pitch = tf.random.categorical(pitch_logits, num_samples=1)\n", " pitch = tf.squeeze(pitch, axis=-1)\n", " duration = tf.squeeze(duration, axis=-1)\n", " step = tf.squeeze(step, axis=-1)\n", "\n", " # `step` and `duration` values should be non-negative\n", " step = tf.maximum(0, step)\n", " duration = tf.maximum(0, duration)\n", "\n", " return int(pitch), float(step), float(duration)" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "TjCLDNuI8s7K", "outputId": "a706df0d-0a43-4fe4-a20e-332ad02c56c8" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1/1 [==============================] - 1s 558ms/step\n", "1/1 [==============================] - 0s 25ms/step\n", "1/1 [==============================] - 0s 21ms/step\n", "1/1 [==============================] - 0s 24ms/step\n", "1/1 [==============================] - 0s 22ms/step\n", "1/1 [==============================] - 0s 22ms/step\n", "1/1 [==============================] - 0s 41ms/step\n", "1/1 [==============================] - 0s 31ms/step\n", "1/1 [==============================] - 0s 32ms/step\n", "1/1 [==============================] - 0s 33ms/step\n", "1/1 [==============================] - 0s 34ms/step\n", "1/1 [==============================] - 0s 32ms/step\n", "1/1 [==============================] - 0s 36ms/step\n", "1/1 [==============================] - 0s 34ms/step\n", "1/1 [==============================] - 0s 33ms/step\n", "1/1 [==============================] - 0s 32ms/step\n", "1/1 [==============================] - 0s 31ms/step\n", "1/1 [==============================] - 0s 31ms/step\n", "1/1 [==============================] - 0s 34ms/step\n", "1/1 [==============================] - 0s 33ms/step\n", "1/1 [==============================] - 0s 34ms/step\n", "1/1 [==============================] - 0s 33ms/step\n", "1/1 [==============================] - 0s 33ms/step\n", "1/1 [==============================] - 0s 37ms/step\n", "1/1 [==============================] - 0s 37ms/step\n", "1/1 [==============================] - 0s 41ms/step\n", "1/1 [==============================] - 0s 32ms/step\n", "1/1 [==============================] - 0s 33ms/step\n", "1/1 [==============================] - 0s 34ms/step\n", "1/1 [==============================] - 0s 34ms/step\n", "1/1 [==============================] - 0s 37ms/step\n", "1/1 [==============================] - 0s 36ms/step\n", "1/1 [==============================] - 0s 37ms/step\n", "1/1 [==============================] - 0s 23ms/step\n", "1/1 [==============================] - 0s 22ms/step\n", "1/1 [==============================] - 0s 49ms/step\n", "1/1 [==============================] - 0s 25ms/step\n", "1/1 [==============================] - 0s 27ms/step\n", "1/1 [==============================] - 0s 29ms/step\n", "1/1 [==============================] - 0s 28ms/step\n", "1/1 [==============================] - 0s 30ms/step\n", "1/1 [==============================] - 0s 26ms/step\n", "1/1 [==============================] - 0s 27ms/step\n", "1/1 [==============================] - 0s 28ms/step\n", "1/1 [==============================] - 0s 31ms/step\n", "1/1 [==============================] - 0s 25ms/step\n", "1/1 [==============================] - 0s 29ms/step\n", "1/1 [==============================] - 0s 31ms/step\n", "1/1 [==============================] - 0s 31ms/step\n", "1/1 [==============================] - 0s 24ms/step\n", "1/1 [==============================] - 0s 26ms/step\n", "1/1 [==============================] - 0s 24ms/step\n", "1/1 [==============================] - 0s 26ms/step\n", "1/1 [==============================] - 0s 28ms/step\n", "1/1 [==============================] - 0s 28ms/step\n", "1/1 [==============================] - 0s 32ms/step\n", "1/1 [==============================] - 0s 28ms/step\n", "1/1 [==============================] - 0s 26ms/step\n", "1/1 [==============================] - 0s 25ms/step\n", "1/1 [==============================] - 0s 30ms/step\n", "1/1 [==============================] - 0s 28ms/step\n", "1/1 [==============================] - 0s 33ms/step\n", "1/1 [==============================] - 0s 29ms/step\n", "1/1 [==============================] - 0s 26ms/step\n", "1/1 [==============================] - 0s 28ms/step\n", "1/1 [==============================] - 0s 39ms/step\n", "1/1 [==============================] - 0s 31ms/step\n", "1/1 [==============================] - 0s 25ms/step\n", "1/1 [==============================] - 0s 26ms/step\n", "1/1 [==============================] - 0s 25ms/step\n", "1/1 [==============================] - 0s 25ms/step\n", "1/1 [==============================] - 0s 27ms/step\n", "1/1 [==============================] - 0s 31ms/step\n", "1/1 [==============================] - 0s 27ms/step\n", "1/1 [==============================] - 0s 27ms/step\n", "1/1 [==============================] - 0s 24ms/step\n", "1/1 [==============================] - 0s 26ms/step\n", "1/1 [==============================] - 0s 26ms/step\n", "1/1 [==============================] - 0s 24ms/step\n", "1/1 [==============================] - 0s 32ms/step\n", "1/1 [==============================] - 0s 31ms/step\n", "1/1 [==============================] - 0s 39ms/step\n", "1/1 [==============================] - 0s 32ms/step\n", "1/1 [==============================] - 0s 31ms/step\n", "1/1 [==============================] - 0s 28ms/step\n", "1/1 [==============================] - 0s 26ms/step\n", "1/1 [==============================] - 0s 27ms/step\n", "1/1 [==============================] - 0s 31ms/step\n", "1/1 [==============================] - 0s 26ms/step\n", "1/1 [==============================] - 0s 28ms/step\n", "1/1 [==============================] - 0s 30ms/step\n", "1/1 [==============================] - 0s 36ms/step\n", "1/1 [==============================] - 0s 34ms/step\n", "1/1 [==============================] - 0s 27ms/step\n", "1/1 [==============================] - 0s 26ms/step\n", "1/1 [==============================] - 0s 28ms/step\n", "1/1 [==============================] - 0s 33ms/step\n", "1/1 [==============================] - 0s 31ms/step\n", "1/1 [==============================] - 0s 33ms/step\n", "1/1 [==============================] - 0s 26ms/step\n", "1/1 [==============================] - 0s 69ms/step\n", "1/1 [==============================] - 0s 27ms/step\n", "1/1 [==============================] - 0s 36ms/step\n", "1/1 [==============================] - 0s 32ms/step\n", "1/1 [==============================] - 0s 48ms/step\n", "1/1 [==============================] - 0s 36ms/step\n", "1/1 [==============================] - 0s 35ms/step\n", "1/1 [==============================] - 0s 26ms/step\n", "1/1 [==============================] - 0s 27ms/step\n", "1/1 [==============================] - 0s 30ms/step\n", "1/1 [==============================] - 0s 33ms/step\n", "1/1 [==============================] - 0s 33ms/step\n", "1/1 [==============================] - 0s 41ms/step\n", "1/1 [==============================] - 0s 39ms/step\n", "1/1 [==============================] - 0s 37ms/step\n", "1/1 [==============================] - 0s 41ms/step\n", "1/1 [==============================] - 0s 38ms/step\n", "1/1 [==============================] - 0s 38ms/step\n", "1/1 [==============================] - 0s 39ms/step\n", "1/1 [==============================] - 0s 35ms/step\n" ] } ], "source": [ "temperature = 2.0\n", "num_predictions = 120\n", "\n", "sample_notes = np.stack([raw_notes[key] for key in key_order], axis=1)\n", "\n", "# The initial sequence of notes; pitch is normalized similar to training\n", "# sequences\n", "input_notes = (\n", " sample_notes[:seq_length] / np.array([vocab_size, 1, 1]))\n", "\n", "generated_notes = []\n", "prev_start = 0\n", "for _ in range(num_predictions):\n", " pitch, step, duration = predict_next_note(input_notes, model, temperature)\n", " start = prev_start + step\n", " end = start + duration\n", " input_note = (pitch, step, duration)\n", " generated_notes.append((*input_note, start, end))\n", " input_notes = np.delete(input_notes, 0, axis=0)\n", " input_notes = np.append(input_notes, np.expand_dims(input_note, 0), axis=0)\n", " prev_start = start\n", "\n", "generated_notes = pd.DataFrame(\n", " generated_notes, columns=(*key_order, 'start', 'end'))" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 363 }, "id": "_VNguuhU8s5F", "outputId": "b7a1d8fc-c26c-47c4-b573-a9e83056cbc0" }, "outputs": [ { "data": { "text/html": [ "\n", "
\n", "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
pitchstepdurationstartend
0610.1374860.4473030.1374860.584789
1960.2098480.3520040.3473340.699338
2960.2287300.3957370.5760640.971800
3810.2349880.4108940.8110521.221946
4910.2348530.4063171.0459051.452222
5860.2360360.4075661.2819411.689507
6650.2367970.4113491.5187391.930088
7890.2363230.4060151.7550622.161077
8510.2353290.3926451.9903912.383036
9890.2392920.3974352.2296832.627118
\n", "
\n", "
\n", "\n", "
\n", " \n", "\n", " \n", "\n", " \n", "
\n", "\n", "\n", "
\n", " \n", "\n", "\n", "\n", " \n", "
\n", "
\n", "
\n" ], "text/plain": [ " pitch step duration start end\n", "0 61 0.137486 0.447303 0.137486 0.584789\n", "1 96 0.209848 0.352004 0.347334 0.699338\n", "2 96 0.228730 0.395737 0.576064 0.971800\n", "3 81 0.234988 0.410894 0.811052 1.221946\n", "4 91 0.234853 0.406317 1.045905 1.452222\n", "5 86 0.236036 0.407566 1.281941 1.689507\n", "6 65 0.236797 0.411349 1.518739 1.930088\n", "7 89 0.236323 0.406015 1.755062 2.161077\n", "8 51 0.235329 0.392645 1.990391 2.383036\n", "9 89 0.239292 0.397435 2.229683 2.627118" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "generated_notes.head(10)" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 74 }, "id": "CbsIztKt8yvG", "outputId": "40ae49f7-3c44-44c2-961a-9080d93371af" }, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "out_file = 'output.mid'\n", "out_pm = notes_to_midi(\n", " generated_notes, out_file=out_file, instrument_name=instrument_name)\n", "display_audio(out_pm)" ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 17 }, "id": "xa5WXi-_8ysp", "outputId": "17a08ca7-dc5d-4aa0-f721-6888f917c96d" }, "outputs": [ { "data": { "application/javascript": "\n async function download(id, filename, size) {\n if (!google.colab.kernel.accessAllowed) {\n return;\n }\n const div = document.createElement('div');\n const label = document.createElement('label');\n label.textContent = `Downloading \"${filename}\": `;\n div.appendChild(label);\n const progress = document.createElement('progress');\n progress.max = size;\n div.appendChild(progress);\n document.body.appendChild(div);\n\n const buffers = [];\n let downloaded = 0;\n\n const channel = await google.colab.kernel.comms.open(id);\n // Send a message to notify the kernel that we're ready.\n channel.send({})\n\n for await (const message of channel.messages) {\n // Send a message to notify the kernel that we're ready.\n channel.send({})\n if (message.buffers) {\n for (const buffer of message.buffers) {\n buffers.push(buffer);\n downloaded += buffer.byteLength;\n progress.value = downloaded;\n }\n }\n }\n const blob = new Blob(buffers, {type: 'application/binary'});\n const a = document.createElement('a');\n a.href = window.URL.createObjectURL(blob);\n a.download = filename;\n div.appendChild(a);\n a.click();\n div.remove();\n }\n ", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": "download(\"download_4812e287-f583-4ff6-bd47-35a60e941b6c\", \"output.mid\", 777)", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from google.colab import files\n", "files.download(out_file)" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 288 }, "id": "wO0PpWLZ8yqN", "outputId": "5dba0290-c2ae-460f-e744-c98b80491c8b" }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABlkAAAGJCAYAAAAJ91V3AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABShklEQVR4nO3dfZjVdZ038PfMIGDAgJryLBEPShhS5ipKPiBJ6Hrlau1lay0ad2IpraJr2eVDVhvm1uZTqIQrbGm7da/aXfdmW4qWZj4llVEsmq4OCJYbM0IrujD3H+dmZGTAmcM5c86Zeb2u61xnztP3fM4539/39zvnM9/vp661tbU1AAAAAAAAdEl9pQMAAAAAAACoRZIsAAAAAAAARZBkAQAAAAAAKIIkCwAAAAAAQBEkWQAAAAAAAIogyQIAAAAAAFAESRYAAAAAAIAiSLIAAAAAAAAUQZIFAAAAAACgCJIsAABAVamrq8u5555bsvbuvffe1NXV5d577y1Zm5V2xhlnZODAgZUOAwAAej1JFgAAoCS+9a1vpa6uLnfccccOtx188MGpq6vL8uXLd7ht//33zxFHHNEdIZbE2rVr85nPfCYrVqyodCgAAECFSbIAAAAlMX369CTJ/fff3+76lpaWPPHEE+nTp08eeOCBdrc999xzee6559oeWwvWrl2bK664QpIFAACQZAEAAEpjxIgRGTt27A5JlgcffDCtra35wAc+sMNt2y7XUpKlq/70pz9VOgQAAKBMJFkAAICSmT59eh5//PH893//d9t1DzzwQCZPnpzZs2fnZz/7WbZu3drutrq6uhx55JE7tHXnnXfmoIMOSr9+/TJ58uTcddddO9zn8ccfz+zZs9PY2JiBAwfmuOOOy89+9rNOxfrQQw/lve99bwYPHpw3velNOfroo3eYafN69957bw499NAkyZlnnpm6urrU1dVl6dKlSZJjjjkmBx10UB577LEcddRRedOb3pRPf/rTSZLvfOc7OfHEEzNixIj069cv48aNy+c+97ls2bKlw9hOOOGE7LXXXhkwYECmTJmSa665ZpexrVixIvvuu2+OOeaYbNy4sVPvAQAAsHskWQAAgJKZPn16Xn311Tz00ENt1z3wwAM54ogjcsQRR6S5uTlPPPFEu9sOPPDA7LPPPu3auf/++/Pxj388p512Wq666qq8/PLLOfXUU/Piiy+23efXv/513v3ud+cXv/hFLrroolx66aV5+umnc8wxx7R7/o7cc889Oeqoo9LS0pLLL788X/jCF7Jhw4bMmDEjDz/88E4fN2nSpHz2s59Nkpx11ln5+te/nq9//es56qij2u7z4osvZvbs2Zk6dWquvvrqHHvssUmSpUuXZuDAgVmwYEGuueaaHHLIIbnsssvyqU99qt1z/PCHP8xRRx2VlStX5m/+5m/y5S9/Occee2y+973v7TSuRx55JDNmzMg73vGOfP/738/AgQN3+foBAIDS6FPpAAAAgJ5j+7osxxxzTP7nf/4nDz30UObMmZNx48Zl6NChuf/++zNlypS89NJL+dWvfpWPfOQjO7Tzm9/8JitXrsy4ceOSJMcee2wOPvjgfPOb38y5556bJLnkkkvy6quv5v77789b3/rWJMlf//Vf54ADDshFF12U++67r8MYW1tbc/bZZ+fYY4/N97///dTV1SVJ5s2bl8mTJ+eSSy7Jv//7v3f42KFDh2b27Nm57LLLMm3atHzoQx/a4T7r1q3LjTfemHnz5rW7/rbbbsuee+7Zdvnss8/O2WefnUWLFuXzn/98+vXrly1btmTevHkZPnx4VqxYkSFDhrSLuyMPPPBATjjhhLz73e/Ov/7rv6Zfv34d3g8AACg9M1kAAICSmTRpUvbZZ5+2Wiu/+MUvsmnTphxxxBFJkiOOOKJtSa4HH3wwW7Zs6bAey8yZM9sSLEkyZcqUNDY25ne/+12SZMuWLfn3f//3nHzyyW0JliQZPnx4/uqv/ir3339/WlpaOoxxxYoVWb16df7qr/4qL774Yv7whz/kD3/4QzZt2pTjjjsuP/7xj9stadZV/fr1y5lnnrnD9dsnWF566aX84Q9/yLvf/e786U9/ym9/+9skheXPnn766Zx33nntEixJ2pJB21u+fHlmzZqV4447LrfffrsECwAAdDMzWQAAgJKpq6vLEUcc0ZaoeOCBB7Lffvtl/PjxSQpJluuvvz5J2pItHSVZ9t9//x2u22uvvfLHP/4xSfL73/8+f/rTn3LAAQfscL9JkyZl69atee655zJ58uQdbl+9enWSZM6cOTt9Hc3Nzdlrr73e6OV2aOTIkenbt+8O1//617/OJZdcknvuuWeHBFBzc3OS5KmnnkqSHHTQQW/4PC+//HJOPPHEHHLIIfnWt76VPn18vQMAgO7mKBwAACip6dOn57vf/W5+9atftdVj2eaII47I3/7t32bNmjW5//77M2LEiHYzUbZpaGjosO2dLZnVFdtmqfz93/99pk6d2uF9dqemyfYzVrbZsGFDjj766DQ2Nuazn/1sxo0bl/79++fnP/95PvnJTxY1c6Zfv3454YQT8p3vfCd33XVX/vzP/7zomAEAgOJIsgAAACW1fV2WBx54IOedd17bbYccckj69euXe++9Nw899FBOOOGEop5j3333zZve9KasWrVqh9t++9vfpr6+PqNHj+7wsduWIWtsbMzMmTO7/NwdLdv1Ru699968+OKLuf3223PUUUe1Xf/00093GNsTTzzxhrHV1dXl1ltvzfve97584AMfyPe///0cc8wxXY4NAAAonposAABASb3rXe9K//79c+utt2bNmjXtZrL069cv73znO/PVr341mzZt6nCpsM5oaGjI8ccfn+985zt55pln2q5fv359brvttkyfPj2NjY0dPvaQQw7JuHHj8qUvfSkbN27c4fbf//73u3zuAQMGJCnMTulKvEn7mTivvPJKFi1a1O5+73znOzN27NhcffXVO7Tf0Syevn375vbbb8+hhx6ak046KQ8//HCnYwIAAHafmSwAAEBJ9e3bN4ceemh+8pOfpF+/fjnkkEPa3X7EEUfky1/+cpKO67F01uc///n88Ic/zPTp0/Pxj388ffr0yU033ZTNmzfnqquu2unj6uvrs2TJksyePTuTJ0/OmWeemZEjR2bNmjVZvnx5Ghsb893vfnenjx83blyGDBmSG2+8MYMGDcqAAQNy2GGHZezYsTt9zBFHHJG99torc+bMySc+8YnU1dXl61//+g6Jk/r6+txwww056aSTMnXq1Jx55pkZPnx4fvvb3+bXv/51fvCDH+zQ9p577pnvfe97mTFjRmbPnp377ruvUzVdAACA3WcmCwAAUHLbkifblgfb3pFHHpkkGTRoUA4++OCin2Py5Mn5yU9+koMOOigLFy7MFVdckTFjxmT58uU57LDDdvnYY445Jg8++GDe9a535frrr8/8+fOzdOnSDBs2LOeff/4uH7vHHntk2bJlaWhoyNlnn50PfvCDue+++3b5mH322Sff+973Mnz48FxyySX50pe+lPe85z0dJoNmzZqV5cuXZ+LEifnyl7+cBQsW5O67785J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112XzJlTXFvLliXz57/W1uLFydy5pY0XAAAAqoXv1ABUg7rW1tbWSgdRaS0tLRk8eHCam5vT2NhY6XDoJZqakjFjCgdw5dDQkDzzTDJqVHnaBwAAgErxnRqAcuts3sByYVAhq1eX72AwSbZsSZ58snztAwAAQKX4Tg1AtajqJMtnPvOZ1NXVtTsdeOCBbbe//PLLOeecc7LPPvtk4MCBOfXUU7N+/foKRgydN2FCYQry9hoaklWrko0bu3ZatarjtsaP777XAwAAAN3Fd2oAqkVVJ1mSZPLkyXn++efbTvfff3/bbeeff36++93v5tvf/nbuu+++rF27NqecckoFo4XOGzWqsMZrQ0PhckNDctNNycSJyYABXTtNnNhxW6Y1AwAA0BP5Tg1Atajqmiyf+cxncuedd2bFihU73Nbc3Jx99903t912W97//vcnSX77299m0qRJefDBB3P44Yd3+nnUZKGSmpoKU5DHj9/9A7hStgUAAADVzndqAMqls3mDPt0YU1FWr16dESNGpH///pk2bVoWLlyY/fffP4899lheffXVzJw5s+2+Bx54YPbff/83TLJs3rw5mzdvbrvc0tJS1tcAuzJqVOkO3krZFgAAAFQ736kBqLSqXi7ssMMOy9KlS3PXXXflhhtuyNNPP513v/vdeemll7Ju3br07ds3Q4YMafeYoUOHZt26dbtsd+HChRk8eHDbafTo0WV8FQAAAAAAQE9U1TNZZs+e3fb3lClTcthhh2XMmDH51re+lT333LPodi+++OIsWLCg7XJLS4tECwAAAAAA0CVVPZPl9YYMGZKJEyfmySefzLBhw/LKK69kw4YN7e6zfv36DBs2bJft9OvXL42Nje1OAAC9RVNTsnx54bya2gIAAIBaU1NJlo0bN+app57K8OHDc8ghh2SPPfbI3Xff3Xb7qlWr8uyzz2batGkVjBIAoHotWZKMGZPMmFE4X7Qo2bSpuNOiRe3buvnmSr86AAAA6F51ra2trZUOYmcuvPDCnHTSSRkzZkzWrl2byy+/PCtWrMjKlSuz77775mMf+1j+7d/+LUuXLk1jY2Pmz5+fJPnpT3/apedpaWnJ4MGD09zcbFYLANBjNTUVkiFbt5an/YaG5JlnFIwFAACg9nU2b1DVNVmamprywQ9+MC+++GL23XffTJ8+PT/72c+y7777Jkm+8pWv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nHTSSRkxYkTq6upy5513tru9tbU1l112WYYPH54999wzM2fOzOrVqysTLLBTb7Qtn3HGGTvso9/73vdWJligQwsXLsyhhx6aQYMGZb/99svJJ5+cVatWtbvPyy+/nHPOOSf77LNPBg4cmFNPPTXr16+vUMTA63VmOz7mmGN22CefffbZFYoY6MgNN9yQKVOmpLGxMY2NjZk2bVq+//3vt91e7ftjSZZe7F/+5V+yYMGCXH755fn5z3+egw8+OLNmzcoLL7xQ6dCALpg8eXKef/75ttP9999f6ZCAXdi0aVMOPvjgfPWrX+3w9quuuirXXnttbrzxxjz00EMZMGBAZs2alZdffrmbIwV25Y225SR573vf224f/c1vfrMbIwTeyH333ZdzzjknP/vZz/LDH/4wr776ao4//vhs2rSp7T7nn39+vvvd7+bb3/527rvvvqxduzannHJKBaMGtteZ7ThJPvrRj7bbJ1911VUVihjoyKhRo3LllVfmsccey6OPPpoZM2bkfe97X379618nqf79cV1ra2trpYOgMg477LAceuihuf7665MkW7duzejRozN//vx86lOfqnB0QGd85jOfyZ133pkVK1ZUOhSgCHV1dbnjjjty8sknJynMYhkxYkQuuOCCXHjhhUmS5ubmDB06NEuXLs1pp51WwWiBnXn9tpwUZrJs2LBhhxkuQPX6/e9/n/322y/33XdfjjrqqDQ3N2fffffNbbfdlve///1Jkt/+9reZNGlSHnzwwRx++OEVjhh4vddvx0lhJsvUqVNz9dVXVzY4oEv23nvv/P3f/33e//73V/3+2EyWXuqVV17JY489lpkzZ7ZdV19fn5kzZ+bBBx+sYGRAV61evTojRozIW9/61px++ul59tlnKx0SUKSnn34669ata7d/Hjx4cA477DD7Z6hB9957b/bbb78ccMAB+djHPpYXX3yx0iEBu9Dc3Jyk8KNOkjz22GN59dVX2+2XDzzwwOy///72y1ClXr8db3PrrbfmzW9+cw466KBcfPHF+dOf/lSJ8IBO2LJlS/75n/85mzZtyrRp02pif9yn0gFQGX/4wx+yZcuWDB06tN31Q4cOzW9/+9sKRQV01WGHHZalS5fmgAMOyPPPP58rrrgi7373u/PEE09k0KBBlQ4P6KJ169YlSYf75223AbXhve99b0455ZSMHTs2Tz31VD796U9n9uzZefDBB9PQ0FDp8IDX2bp1a84777wceeSROeigg5IU9st9+/bNkCFD2t3XfhmqU0fbcZL81V/9VcaMGZMRI0bkl7/8ZT75yU9m1apVuf322ysYLfB6v/rVrzJt2rS8/PLLGThwYO6444687W1vy4oVK6p+fyzJAlDDZs+e3fb3lClTcthhh2XMmDH51re+lblz51YwMgDo3bZf3u/tb397pkyZknHjxuXee+/NcccdV8HIgI6cc845eeKJJ9Q3hBq2s+34rLPOavv77W9/e4YPH57jjjsuTz31VMaNG9fdYQI7ccABB2TFihVpbm7O//7f/ztz5szJfffdV+mwOsVyYb3Um9/85jQ0NGT9+vXtrl+/fn2GDRtWoaiA3TVkyJBMnDgxTz75ZKVDAYqwbR9s/ww9z1vf+ta8+c1vto+GKnTuuefme9/7XpYvX55Ro0a1XT9s2LC88sor2bBhQ7v72y9D9dnZdtyRww47LEnsk6HK9O3bN+PHj88hhxyShQsX5uCDD84111xTE/tjSZZeqm/fvjnkkENy9913t123devW3H333Zk2bVoFIwN2x8aNG/PUU09l+PDhlQ4FKMLYsWMzbNiwdvvnlpaWPPTQQ/bPUOOampry4osv2kdDFWltbc25556bO+64I/fcc0/Gjh3b7vZDDjkke+yxR7v98qpVq/Lss8/aL0OVeKPtuCMrVqxIEvtkqHJbt27N5s2ba2J/bLmwXmzBggWZM2dO3vWud+XP/uzPcvXVV2fTpk0588wzKx0a0EkXXnhhTjrppIwZMyZr167N5ZdfnoaGhnzwgx+sdGjATmzcuLHdf809/fTTWbFiRfbee+/sv//+Oe+88/L5z38+EyZMyNixY3PppZdmxIgROfnkkysXNLCDXW3Le++9d6644oqceuqpGTZsWJ566qlcdNFFGT9+fGbNmlXBqIHtnXPOObntttvyne98J4MGDWpb133w4MHZc889M3jw4MydOzcLFizI3nvvncbGxsyfPz/Tpk3L4YcfXuHogeSNt+Onnnoqt912W0444YTss88++eUvf5nzzz8/Rx11VKZMmVLh6IFtLr744syePTv7779/Xnrppdx22225995784Mf/KAm9sd1ra2trZUOgsq5/vrr8/d///dZt25dpk6dmmuvvbZt2iRQ/U477bT8+Mc/zosvvph9990306dPz9/93d9ZVxaq2L333ptjjz12h+vnzJmTpUuXprW1NZdffnkWL16cDRs2ZPr06Vm0aFEmTpxYgWiBndnVtnzDDTfk5JNPzuOPP54NGzZkxIgROf744/O5z30uQ4cOrUC0QEfq6uo6vP6WW27JGWeckSR5+eWXc8EFF+Sb3/xmNm/enFmzZmXRokVVszwJ9HZvtB0/99xz+dCHPpQnnngimzZtyujRo/MXf/EXueSSS9LY2NjN0QI7M3fu3Nx99915/vnnM3jw4EyZMiWf/OQn8573vCdJ9e+PJVkAAAAAAACKoCYLAAAAAABAESRZAAAAAAAAiiDJAgAAAAAAUARJFgAAAAAAgCJIsgAAAAAAABRBkgUAAAAAAKAIkiwAAAAAAABFkGQBAAAAAAAogiQLAABQ084444ycfPLJ3f68S5cuTV1dXerq6nLeeed16jFnnHFG22PuvPPOssYHAACUX59KBwAAALAzdXV1u7z98ssvzzXXXJPW1tZuiqi9xsbGrFq1KgMGDOjU/a+55ppceeWVGT58eJkjAwAAuoMkCwAAULWef/75tr//5V/+JZdddllWrVrVdt3AgQMzcODASoSWpJAEGjZsWKfvP3jw4AwePLiMEQEAAN3JcmEAAEDVGjZsWNtp8ODBbUmNbaeBAwfusFzYMccck/nz5+e8887LXnvtlaFDh+ZrX/taNm3alDPPPDODBg3K+PHj8/3vf7/dcz3xxBOZPXt2Bg4cmKFDh+bDH/5w/vCHP3Q55kWLFmXChAnp379/hg4dmve///27+zYAAABVSpIFAADocZYtW5Y3v/nNefjhhzN//vx87GMfywc+8IEcccQR+fnPf57jjz8+H/7wh/OnP/0pSbJhw4bMmDEj73jHO/Loo4/mrrvuyvr16/OXf/mXXXreRx99NJ/4xCfy2c9+NqtWrcpdd92Vo446qhwvEQAAqAKWCwMAAHqcgw8+OJdcckmS5OKLL86VV16ZN7/5zfnoRz+aJLnssstyww035Je//GUOP/zwXH/99XnHO96RL3zhC21t/OM//mNGjx6d//iP/8jEiRM79bzPPvtsBgwYkD//8z/PoEGDMmbMmLzjHe8o/QsEAACqgpksAABAjzNlypS2vxsaGrLPPvvk7W9/e9t1Q4cOTZK88MILSZJf/OIXWb58eVuNl4EDB+bAAw9Mkjz11FOdft73vOc9GTNmTN761rfmwx/+cG699da22TIAAEDPI8kCAAD0OHvssUe7y3V1de2uq6urS5Js3bo1SbJx48acdNJJWbFiRbvT6tWru7Tc16BBg/Lzn/883/zmNzN8+PBcdtllOfjgg7Nhw4bdf1EAAEDVsVwYAADQ673zne/Mv/7rv+Ytb3lL+vTZva9Jffr0ycyZMzNz5sxcfvnlGTJkSO65556ccsopJYoWAACoFmayAAAAvd4555yT//qv/8oHP/jBPPLII3nqqafygx/8IGeeeWa2bNnS6Xa+973v5dprr82KFSvyn//5n/mnf/qnbN26NQcccEAZowcAACpFkgUAAOj1RowYkQceeCBbtmzJ8ccfn7e//e0577zzMmTIkNTXd/5r05AhQ3L77bdnxowZmTRpUm688cZ885vfzOTJk8sYPQAAUCl1ra2trZUOAgAAoNYsXbo05513XlH1Vurq6nLHHXfk5JNPLnlcAABA9zGTBQAAoEjNzc0ZOHBgPvnJT3bq/meffXYGDhxY5qgAAIDuYiYLAABAEV566aWsX78+SWGZsDe/+c1v+JgXXnghLS0tSZLhw4dnwIABZY0RAAAoL0kWAAAAAACAIlguDAAAAAAAoAiSLAAAAAAAAEWQZAEAAAAAACiCJAsAAAAAAEARJFkAAAAAAACKIMkCAAAAAABQBEkWAAAAAACAIkiyAAAAAAAAFOH/ARhBzOA8nfpYAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_piano_roll(generated_notes)" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 425 }, "id": "tEhO4RN_83Kb", "outputId": "f64cd26e-54cc-46a7-e442-3448c0736131" }, "outputs": [ { "data": { "image/png": "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mgEAgtaPP/6owYMHKywsTH//+9/15Zdf6qmnnlL79u0dbRYuXKhFixZp2bJlKigoUJs2bTRs2DDV1tb6sHIAAAAAvsbXMwEAQeuJJ55QUlKSli9f7tiWmprq+LcxRrm5uZozZ45GjRolSXr55ZcVFxendevWady4cc1eMwAAAAD/wJlmAICg9eabb2rgwIH69a9/rc6dO6tfv3564YUXHPuLi4tVXl6uzMxMx7bo6Gilp6crPz+/0WPW1dXJbrc7LQAAAACCD6EZACBoffvtt1q6dKm6d++uDRs26I477tBdd92llStXSpLKy8slSXFxcU794uLiHPuscnJyFB0d7ViSkpK8OwgAAAAAPuFWaNa1a1cdPHjwtO1VVVXq2rVrk4sCAASv5pxDGhoa1L9/fz322GPq16+fpk6dqttuu03Lli1z+5hZWVmqrq52LKWlpR6sGADgCXxeAQB4gluh2f79+3Xy5MnTttfV1en7779vclEAgODVnHNIQkKCLrroIqdtPXv2VElJiSQpPj5eklRRUeHUpqKiwrHPKjw8XFFRUU4LAMC/8HkFAOAJLv0QwJtvvun494YNGxQdHe1YP3nypPLy8pSSkuKx4gAAwcMXc8jgwYO1Z88ep21ff/21unTpIumnHwWIj49XXl6e+vbtK0my2+0qKCjQHXfc4dFaAADex+cVAIAnuRSajR49WpJks9k0ceJEp31hYWFKSUnRU0895bHiAADBwxdzyKxZszRo0CA99thjuvnmm7Vt2zY9//zzev755x21zJw5U4888oi6d++u1NRUzZ07V4mJiY56AQCBg88rAABPcik0a2hokPTT/8xv375dHTt29EpRAIDg44s55NJLL9Xrr7+urKwsZWdnKzU1Vbm5uRo/fryjzX333aejR49q6tSpqqqq0hVXXKH169crIiLC6/UBADyLzysAAE9yKTQ7pbi42NN1AABaiOaeQ2644QbdcMMNZ9xvs9mUnZ2t7OzsZqwKAOBNfF4BAHiCW6GZJOXl5SkvL08HDhxw/I/OKS+99FKTCwMABC/mEACAtzHXAACayq3QbMGCBcrOztbAgQOVkJAgm83m6boAAEGKOQQA4G3MNQAAT3ArNFu2bJlWrFihW2+91dP1AACCHHMIAMDbmGsAAJ4Q4k6n48ePa9CgQZ6uBQDQAjCHAAC8jbkGAOAJboVm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AAAAAABYtJjQ7PHHH5fNZtPMmTMd22prazVt2jR16NBBbdu21dixY1VRUeG7Is/ioYceks1mc1rS0tIc+wNtPJL0/fffa8KECerQoYMiIyPVq1cv7dixw7HfGKN58+YpISFBkZGRyszM1N69e31Y8c9LSUk57TGy2WyaNm2apMB8jE6ePKm5c+cqNTVVkZGR6tatmx5++GH9+2+IBNrjdPjwYc2cOVNdunRRZGSkBg0apO3btzv2+/t4tmzZohtvvFGJiYmy2Wxat26d0/5zqf/QoUMaP368oqKiFBMToylTpujIkSPNOIrgtWTJEqWkpCgiIkLp6enatm3bz7Z/7bXXlJaWpoiICPXq1Ut/+9vfnPb7+9+jlafHP2nSpNNeU4cPH+7NITSJK+P/4osvNHbsWMfckZub2+Rj+pKnx3629z3+xpXxv/DCC7ryyivVvn17tW/fXpmZmae1D+bn/rmMP9Ce+77m6dfeYOeN1+pg5unnd0vgyn22du1aDRw4UDExMWrTpo369u2rP//5z81Yre+5+15nzZo1stlsGj16tPeKMy3Atm3bTEpKiundu7eZMWOGY/vvf/97k5SUZPLy8syOHTvM5ZdfbgYNGuS7Qs9i/vz55uKLLzZlZWWO5V//+pdjf6CN59ChQ6ZLly5m0qRJpqCgwHz77bdmw4YNZt++fY42jz/+uImOjjbr1q0zn376qfnVr35lUlNTTU1NjQ8rP7MDBw44PT4bN240kswHH3xgjAm8x8gYYx599FHToUMH8/bbb5vi4mLz2muvmbZt25pnn33W0SbQHqebb77ZXHTRRWbz5s1m7969Zv78+SYqKsp89913xhj/H8/f/vY38+CDD5q1a9caSeb111932n8u9Q8fPtz06dPHbN261fzjH/8wF1xwgbnllluaeSTBZ82aNaZ169bmpZdeMl988YW57bbbTExMjKmoqGi0/UcffWRatWplFi5caL788kszZ84cExYWZj7//HNHG3//e/x33hj/xIkTzfDhw51eWw8dOtRcQ3KJq+Pftm2bueeee8wrr7xi4uPjzTPPPNPkY/qKN8Z+tvc9/sTV8f/2t781S5YsMTt37jRFRUVm0qRJJjo62jEPGRPcz/1zGX8gPfd9zRuvvcHMG69Xwcwbz+9g5+p99sEHH5i1a9eaL7/80uzbt8/k5uaaVq1amfXr1zdz5b7h7nud4uJic/7555srr7zSjBo1ymv1BX1odvjwYdO9e3ezceNGc/XVVztCs6qqKhMWFmZee+01R9uioiIjyeTn5/uo2p83f/5806dPn0b3BeJ47r//fnPFFVeccX9DQ4OJj483f/zjHx3bqqqqTHh4uHnllVeao8QmmzFjhunWrZtpaGgIyMfIGGNGjhxpJk+e7LRtzJgxZvz48caYwHucjh07Zlq1amXefvttp+39+/c3Dz74YMCNxxqanUv9X375pZFktm/f7mjz97//3dhsNvP99983W+3B6LLLLjPTpk1zrJ88edIkJiaanJycRtvffPPNZuTIkU7b0tPTze23326MCbznl6fHb8xPH5y9+UbIk1wd/7/r0qVLox/EmnLM5uSNsf/c+x5/09TH6cSJE6Zdu3Zm5cqVxpjgf+5bWcdvTGA9933NG6+9wcwbr1fBzBvP72Dnibm7X79+Zs6cOd4oz++4c3+dOHHCDBo0yPzv//6v1+eLoP965rRp0zRy5EhlZmY6bS8sLFR9fb3T9rS0NCUnJys/P7+5yzxne/fuVWJiorp27arx48erpKREUmCO580339TAgQP161//Wp07d1a/fv30wgsvOPYXFxervLzcaUzR0dFKT0/32zH9u+PHj+svf/mLJk+eLJvNFpCPkSQNGjRIeXl5+vrrryVJn376qT788EONGDFCUuA9TidOnNDJkycVERHhtD0yMlIffvhhwI3H6lzqz8/PV0xMjAYOHOhok5mZqZCQEBUUFDR7zcHi+PHjKiwsdLrvQ0JClJmZeca/nfz8/NPmp2HDhjnaB9LfozfGf8qmTZvUuXNn9ejRQ3fccYcOHjzo+QE0kTvj98UxvcGbdZ7pfY8/8cT4jx07pvr6esXGxkoK/ue+lXX8pwTCc9/XvPnaG4wC5XXVX3jz+R2smnqfGWOUl5enPXv26KqrrvJmqX7B3fsrOztbnTt31pQpU7xeY1CHZmvWrNEnn3yinJyc0/aVl5erdevWiomJcdoeFxen8vLyZqrQNenp6VqxYoXWr1+vpUuXqri4WFdeeaUOHz4ckOP59ttvtXTpUnXv3l0bNmzQHXfcobvuuksrV66UJEfdcXFxTv38eUz/bt26daqqqtKkSZMkBebfnCQ98MADGjdunNLS0hQWFqZ+/fpp5syZGj9+vKTAe5zatWun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fbskafny5SorK3Osv/POO7rpppt0/fXXa+fOncrLy9Nll13m1Pepp57SwIEDtXPnTv3hD3/QHXfcoT179nh/cAAAv1BWVqZbbrlFkydPVlFRkTZt2qQxY8Zo/vz5uvnmmzV8+HCVlZWprKxMgwYNUn19vYYNG6Z27drpH//4hz766CO1bdtWw4cPdwrF8vLyHMd75ZVXtHbtWi1YsMCHIwUANNW9996rzZs364033tC7776rTZs26ZNPPnH5OA888IBmzJihoqIiDRs2TLW1tRowYIDeeecd7d69W1OnTtWtt96qbdu2SZKeffZZZWRk6LbbbnPMSUlJSacdt7CwUDfffLPGjRunzz//XA899JDmzp3rCO1O4TMQfMIA8Jirr77a9OzZ0zQ0NDi23X///aZnz57GGGO6dOlinnnmGcc+Seb11193OkZGRoYZP378GW+jS5cuZsKECY71hoYG07lzZ7N06VLPDAIA4PcKCwuNJLN///7T9k2cONGMGjXKaduf//xn06NHD6f5qa6uzkRGRpoNGzY4+sXGxpqjR4862ixdutS0bdvWnDx50jsDAQB41eHDh03r1q3Nq6++6th28OBBExkZaWbMmGGMafwzSXR0tFm+fLkxxpji4mIjyeTm5p719kaOHGnuvvtux/rVV1/tuJ1TPvjgAyPJ/Pjjj8YYY37729+aX/7yl05t7r33XnPRRRc51vkMBF/hTDPAwy6//HLZbDbHekZGhvbu3auTJ0+eU/9du3Zp6NChP9umd+/ejn/bbDbFx8frwIED7hUMAAg4ffr00dChQ9WrVy/9+te/1gsvvKAff/zxjO0//fRT7du3T+3atVPbtm3Vtm1bxcbGqra2Vt98843Tcc877zzHekZGho4cOaLS0lKvjgcA4B3ffPONjh8/rvT0dMe22NhY9ejRw+VjDRw40Gn95MmTevjhh9WrVy/Fxsaqbdu22rBhg0pKSlw6blFRkQYPHuy0bfDgwad9huIzEHyBHwIA/ExkZORZ21gvummz2dTQ0OCtkgAAfqZVq1bauHGjPv74Y7377rtavHixHnzwQRUUFDTa/siRIxowYIBWrVp12j5+pAYAWjabzea4BvMp9fX1p7Vr06aN0/of//hHPfvss8rNzVWvXr3Upk0bzZw502vXwuQzEHyBM80AD7N+YNm6dau6d++uVq1andY2LCzstDPQevfurby8PK/WCAAIfDabTYMHD9aCBQu0c+dOtW7dWq+//rpat2592tzSv39/7d27V507d9YFF1zgtERHRzvaffrpp6qpqXGsb926VW3btm30GjQAAP/XrVs3hYWFOX1G+fHHH/X111871jt16qSysjLH+t69e3Xs2LGzHvujjz7SqFGjNGHCBPXp00ddu3Z1Oq6kRuckq549e+qjjz467dgXXnhho5+hgOZEaAZ4WElJiWbPnq09e/bolVde0eLFizVjxoxG26akpCgvL0/l5eWOr9XMnz9fr7zyiubPn6+ioiJ9/vnneuKJJ5pzCAAAP1dQUKDHHntMO3bsUElJidauXat//etf6tmzp1JSUvTZZ59pz549qqysVH19vcaPH6+OHTtq1KhR+sc//qHi4mJt2rRJd911l7777jvHcY8fP64pU6boyy+/1N/+9jfNnz9f06dPV0gIbxkBIBC1bdtWU6ZM0b333qv3339fu3fv1qRJk5xe16+99lo999xz2rlzp3bs2KHf//73p53V1Zju3bs7znouKirS7bffroqKCqc2KSkpKigo0P79+1VZWdnomWF333238vLy9PDDD+vrr7/WypUr9dxzz+mee+5p+h0ANBHvgAAP+8///E/V1NTosssu07Rp0zRjxgxNnTq10bZPPfWUNm7cqKSkJPXr10+SNGTIEL322mt688031bdvX1177bWOX6ABAECSoqKitGXLFl1//fW68MILNWfOHD311FMaMWKEbrvtNvXo0UMDBw5Up06d9NFHH+m8887Tli1blJycrDFjxqhnz56aMmWKamtrFRUV5Tju0KFD1b17d1111VX6zW9+o1/96ld66KGHfDdQAECT/fGPf9SVV16pG2+8UZmZmbriiis0YMAAx/6nnnpKSUlJuvLKK/Xb3/5W99xzj9P1Lc9kzpw56t+/v4YNG6YhQ4YoPj5eo0ePdmpzzz33qFWrVrrooovUqVOnRq931r9/f7366qtas2aNLrnkEs2bN0/Z2dmaNGlSU4cONJnNWL+8DMBtQ4YMUd++fZWbm+vrUgAAcMmkSZNUVVWldevW+boUAAAAv8CZZgAAAAAAAIAFoRkAAAAAAABgwdczAQAAAAAAAAvONAMAAAAAAAAsCM0AAAAAAAAAC0IzAAAAAAAAwILQDAAAAAAAALAgNAMAAAAAAAAsCM0AAAAAAAAAC0IzAAAAAAAAwILQDAAAAAAAALAgNAMAAAAAAAAs/j8F6cfjyPC6xgAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_distributions(generated_notes)" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "id": "LrjpEOq683Hj" }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 47, "metadata": { "id": "_e8Nqtyj83EZ" }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "id": "WjqliKpkjqoc" }, "source": [ "### モデルの保存" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "id": "WVlagcDD8s2J" }, "outputs": [], "source": [ "# モデルの保存\n", "model.save('model/')" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "id": "_aSythGz8jpD" }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "id": "2JHPGiX4js9m" }, "source": [ "### モデルのファインチューニング" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "H8DoQca5juaN" }, "outputs": [], "source": [ "# モデルのロード\n", "model = load_model('model/')\n", "\n", "# モデルの再コンパイル\n", "model.compile(\n", " loss=loss,\n", " optimizer=tf.keras.optimizers.Adam(learning_rate=learning_rate)\n", ")\n", "\n", "# ファインチューニングのための訓練\n", "# ここでは、既存のtrain_dsを使用していますが、新しいデータセットを使用することもできます。\n", "model.fit(train_ds, epochs=additional_epochs)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "yEBbjZhpjvT6" }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "g77RjW0ujvPl" }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "4skPIJo7jvJ5" }, "outputs": [], "source": [] } ], "metadata": { "colab": { "provenance": [] }, "kernelspec": { "display_name": "Python 3", "name": "python3" }, "language_info": { "name": "python" } }, "nbformat": 4, "nbformat_minor": 0 }