{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "4.4 Learning Billie Jean.ipynb", "provenance": [], "collapsed_sections": [], "toc_visible": true, "include_colab_link": true }, "kernelspec": { "name": "python3", "display_name": "Python 3" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "metadata": { "id": "43_89uOEoRGh", "colab_type": "text" }, "source": [ "#4.4 Learning Billie Jean\n", "Let's work with an actual song. In this notebook we'll learn how to use Markov chains to learn patterns from actual songs and generate new material. We will read in music from the song Billi Jean, train a Markov model, and resynthesize Billie Jean using the trained Markov model. Things get weird quickly..." ] }, { "cell_type": "markdown", "metadata": { "id": "z8qlvAmBownS", "colab_type": "text" }, "source": [ "## Step 1: Setup\n", "Install external libraries and import them into your notebok session" ] }, { "cell_type": "code", "metadata": { "id": "FQR9wI2woycP", "colab_type": "code", "colab": {} }, "source": [ "# install external libraries for sound playback\n", "from IPython.display import clear_output\n", "!pip install -q git+https://github.com/davidkant/mai#egg=mai;\n", "!apt-get -qq update\n", "!apt-get -qq install -y libfluidsynth1\n", "!apt-get install lame\n", "!git clone https://github.com/davidkant/mai.git\n", "clear_output()" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "pnALZR3Sp0yx", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "outputId": "ca1115f3-1047-4f4e-c214-1c3f825cba99" }, "source": [ "# imports\n", "import mai\n", "import random\n", "import pretty_midi\n", "import matplotlib.pyplot as plt\n", "import copy\n", "import IPython.display" ], "execution_count": 2, "outputs": [ { "output_type": "stream", "text": [ "Using TensorFlow backend.\n" ], "name": "stderr" } ] }, { "cell_type": "markdown", "metadata": { "id": "pRkghRsEEqE1", "colab_type": "text" }, "source": [ "We'll also define a function here for plotting. Don't worry about understanding this cell." ] }, { "cell_type": "code", "metadata": { "id": "NBpnxXijEwaD", "colab_type": "code", "colab": {} }, "source": [ "def plot_melodies(original_pitches, new_pitcjes, num_notes=45):\n", " \"\"\"Plot original melody and new melody.\"\"\"\n", " plt.figure(figsize=(9,3))\n", " plt.plot(original_pitches[0:num_notes])\n", " plt.scatter(range(num_notes), original_pitches[0:num_notes])\n", " plt.plot(new_pitches[0:num_notes])\n", " plt.scatter(range(num_notes), new_pitches[0:num_notes])\n", " plt.ylim([min(original_pitches)-1, max(original_pitches)+1])\n", " plt.xlabel('time (in numbe of notes)')\n", " plt.ylabel('pitch')\n", " plt.title(\"original melody (blue) and new melody (orange)\");" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "BgZQ_gcFqFoO", "colab_type": "text" }, "source": [ "## Step 2: Load a MIDI file\n", "First load in a MIDI file of the song Billie Jean. We are using a Python package called `pretty_midi` to read and manipulate MIDI data. I have provided the MIDI file `Billie_Jean.mid` in the `aim80L` Python package." ] }, { "cell_type": "code", "metadata": { "id": "hTgyHI6rZU9d", "colab_type": "code", "colab": {} }, "source": [ "# load midi file\n", "midi_data = pretty_midi.PrettyMIDI('mai/resources/midi/Billie_Jean.mid')\n", "\n", "# and make a copy for our resynthesized version\n", "altered_midi_data = copy.deepcopy(midi_data)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "lKVU6l_EoViL", "colab_type": "text" }, "source": [ "## Step 3: Select an instrument\n", "MIDI files are often organized with multiple voices or instruments, which are stored in an `instruments` list. Run the cell below to see the instruments list. Hopefully the file you are using names its instruments! Otherwise it'll be difficult to know which voice corresponds to which instrument..." ] }, { "cell_type": "code", "metadata": { "id": "azeeKlSB5SKX", "colab_type": "code", "outputId": "3ef2cca2-1f81-43a3-a454-9a024e29fd2f", "colab": { "base_uri": "https://localhost:8080/", "height": 243 } }, "source": [ "# display all instruments\n", "midi_data.instruments" ], "execution_count": 5, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "[Instrument(program=53, is_drum=False, name=\"\"),\n", " Instrument(program=5, is_drum=False, name=\"\"),\n", " Instrument(program=27, is_drum=False, name=\"\"),\n", " Instrument(program=28, is_drum=False, name=\"\"),\n", " Instrument(program=49, is_drum=False, name=\"\"),\n", " Instrument(program=7, is_drum=False, name=\"\"),\n", " Instrument(program=63, is_drum=False, name=\"\"),\n", " Instrument(program=88, is_drum=False, name=\"\"),\n", " Instrument(program=62, is_drum=False, name=\"\"),\n", " Instrument(program=28, is_drum=False, name=\"\"),\n", " Instrument(program=50, is_drum=False, name=\"\"),\n", " Instrument(program=35, is_drum=False, name=\"\"),\n", " Instrument(program=0, is_drum=True, name=\"\")]" ] }, "metadata": { "tags": [] }, "execution_count": 5 } ] }, { "cell_type": "markdown", "metadata": { "id": "0prpSkCz5i52", "colab_type": "text" }, "source": [ "Now indicate the instrument you'd like to work with according to its index in the list. " ] }, { "cell_type": "code", "metadata": { "id": "EHxQzqM0oRBo", "colab_type": "code", "colab": {} }, "source": [ "# instrument to work with\n", "instrument_index = 0" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "I1rp7kWtZU9i", "colab_type": "text" }, "source": [ "__note:__ Since instruments arn't named in this file, here are a few:\n", "\n", "* vocal = `midi_data.instrument[0]`\n", "* drums = `midi_data.instrument[-1]`\n", "* bass = `midi_data.instrument[-2]`\n", "* keys = `midi_data.instrument[-3]`" ] }, { "cell_type": "markdown", "metadata": { "id": "G-JVU8hc3qIq", "colab_type": "text" }, "source": [ "## Step 4: Extract note pitches\n", "We are going to extract the pitch and rhythm information from the vocal melody, turning it into two lists of numbers, one representing pitch and the other duration. Don't worry about understanding the programming in this cell." ] }, { "cell_type": "code", "metadata": { "id": "CZTO4dMlBf87", "colab_type": "code", "colab": {} }, "source": [ "# select instrument from list\n", "instrument = midi_data.instruments[instrument_index]\n", "\n", "# extract pitch to list\n", "original_pitches = [note.pitch for note in instrument.notes] \n", "\n", "# extract durations to list\n", "original_durs = [(n2.start - n1.start) for n1,n2 in zip(instrument.notes[:-1], instrument.notes[1:])]" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "IudNAzpBB7DL", "colab_type": "text" }, "source": [ "Print the pitches and durations lists." ] }, { "cell_type": "code", "metadata": { "id": "Bg1N7n0qBv68", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 54 }, "outputId": "67d5047c-84c1-4bda-a393-4cf88864a457" }, "source": [ "print(original_pitches)" ], "execution_count": 8, "outputs": [ { "output_type": "stream", "text": [ "[61, 61, 61, 59, 57, 59, 57, 61, 57, 57, 59, 57, 61, 61, 61, 61, 61, 59, 57, 59, 57, 61, 59, 57, 56, 54, 54, 56, 54, 54, 56, 54, 54, 56, 54, 54, 57, 59, 57, 56, 54, 57, 56, 54, 57, 56, 54, 57, 56, 54, 61, 61, 61, 59, 57, 59, 57, 61, 57, 57, 59, 57, 61, 61, 61, 61, 61, 59, 57, 59, 57, 61, 59, 57, 56, 54, 54, 56, 54, 54, 56, 54, 54, 56, 54, 66, 64, 66, 64, 66, 69, 66, 69, 66, 66, 64, 66, 61, 66, 64, 66, 66, 66, 64, 66, 68, 66, 64, 66, 64, 66, 64, 66, 66, 66, 66, 69, 66, 66, 64, 66, 61, 66, 62, 62, 62, 62, 64, 66, 66, 65, 65, 65, 65, 66, 68, 66, 68, 66, 66, 64, 61, 61, 66, 66, 64, 61, 66, 66, 66, 64, 61, 61, 66, 69, 71, 69, 68, 66, 66, 66, 73, 71, 71, 66, 62, 61, 66, 69, 71, 69, 68, 66, 66, 66, 73, 71, 71, 66, 62, 61, 61, 61, 61, 59, 57, 59, 57, 61, 57, 57, 59, 57, 61, 61, 61, 61, 61, 59, 57, 59, 57, 61, 59, 57, 56, 54, 54, 56, 54, 54, 56, 54, 54, 56, 54, 54, 57, 59, 57, 56, 54, 57, 56, 54, 57, 56, 54, 57, 56, 54, 61, 61, 61, 59, 57, 59, 57, 61, 57, 57, 59, 57, 61, 61, 61, 61, 61, 59, 57, 59, 57, 61, 59, 57, 56, 54, 54, 56, 54, 54, 56, 54, 54, 56, 54, 66, 64, 66, 64, 66, 69, 66, 69, 66, 66, 64, 66, 61, 66, 64, 66, 66, 66, 64, 66, 68, 66, 64, 66, 64, 66, 64, 66, 66, 66, 66, 69, 66, 66, 64, 66, 61, 66, 62, 62, 62, 62, 64, 66, 66, 65, 65, 65, 65, 66, 68, 66, 68, 66, 66, 64, 61, 61, 66, 66, 64, 61, 66, 66, 66, 64, 61, 61, 66, 69, 71, 69, 68, 66, 66, 66, 73, 71, 71, 66, 62, 61, 66, 66, 64, 61, 61, 66, 66, 64, 61, 66, 66, 66, 64, 61, 61, 66, 69, 71, 69, 68, 66, 66, 66, 73, 71, 71, 66, 62, 61, 66, 69, 71, 69, 68, 66, 66, 66, 73, 71, 71, 66, 62, 61, 66, 69, 71, 69, 68, 66, 66, 66, 73, 71, 71, 66, 62, 61, 66, 66, 64, 61, 61, 66, 66, 64, 61, 66, 66, 66, 64, 61, 61, 66, 69, 71, 69, 68, 66, 66, 66, 73, 71, 71, 66, 62, 61, 66, 69, 71, 69, 68, 66, 66, 66, 73, 71, 71, 66, 62, 61, 66, 66, 64, 61, 61, 66, 66, 64, 61, 66, 66, 64, 61, 61, 66, 66, 64, 61, 66, 66, 64, 61, 61, 66, 66, 64, 61, 66, 66, 64, 61, 61, 66, 66, 64, 61, 66, 66, 64, 61, 61, 66, 66, 64, 61, 66, 66, 64, 61, 61, 66, 66, 64, 61, 66, 66, 64, 61, 61, 66, 66, 64, 61]\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "XtwY4GitBxs3", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 54 }, "outputId": "b1d49923-cf39-4d9a-a9b0-6708a24e2752" }, "source": [ "print(original_durs)" ], "execution_count": 9, "outputs": [ { "output_type": "stream", "text": [ "[0.22395833333333215, 0.28125, 0.234375, 0.265625, 0.265625, 0.5, 0.2421875, 0.2552083333333357, 0.125, 0.1328125, 0.23177083333333215, 0.23958333333333215, 0.7552083333333357, 0.2473958333333286, 0.2395833333333357, 0.2786458333333357, 0.2421875, 0.2421875, 0.2578125, 0.2526041666666643, 0.234375, 0.5234375, 0.4947916666666643, 0.2630208333333357, 0.2630208333333357, 1.6979166666666643, 0.1354166666666643, 0.1197916666666714, 0.7421875, 0.1510416666666643, 0.1171875, 0.7395833333333357, 0.1380208333333286, 0.109375, 2.5, 0.2421875, 0.2604166666666714, 0.4947916666666643, 0.2421875, 0.2708333333333357, 1.7395833333333286, 0.1302083333333357, 0.140625, 0.7213541666666643, 0.1354166666666714, 0.1354166666666643, 0.7291666666666643, 0.1302083333333357, 0.1276041666666643, 4.7578125, 0.2239583333333357, 0.28125, 0.234375, 0.265625, 0.265625, 0.5, 0.2421875, 0.2552083333333357, 0.125, 0.1328125, 0.2317708333333286, 0.2395833333333357, 0.7552083333333357, 0.2473958333333286, 0.2395833333333357, 0.2786458333333357, 0.2421875, 0.2421875, 0.2578125, 0.2526041666666643, 0.234375, 0.5234375, 0.4947916666666643, 0.2630208333333357, 0.2630208333333357, 1.6979166666666643, 0.1354166666666643, 0.1197916666666714, 0.7552083333333286, 0.1380208333333357, 0.1197916666666643, 0.734375, 0.140625, 0.1171875, 4.236979166666671, 0.2447916666666572, 0.1197916666666714, 0.2604166666666714, 0.1380208333333286, 0.46875, 0.5234375, 0.2447916666666714, 0.2395833333333286, 0.1276041666666714, 0.2473958333333286, 0.1197916666666714, 1.0286458333333286, 0.1197916666666714, 0.1302083333333286, 0.1276041666666714, 0.11979166666665719, 0.5130208333333428, 0.1354166666666572, 0.1328125, 0.2734375, 0.46875, 1.9739583333333428, 0.2604166666666572, 0.2421875, 0.1328125, 0.2604166666666714, 0.1276041666666714, 0.2942708333333286, 0.6588541666666714, 0.11979166666665719, 0.1354166666666714, 0.2630208333333286, 0.1380208333333428, 0.2786458333333286, 0.1302083333333286, 0.9557291666666714, 0.1302083333333286, 0.1197916666666714, 0.2552083333333286, 0.1119791666666714, 0.1354166666666714, 0.125, 0.3984375, 0.7109375, 0.2604166666666572, 0.2604166666666714, 0.1223958333333286, 0.1328125, 0.1302083333333428, 0.3854166666666572, 0.4895833333333428, 0.2421875, 0.75, 0.2135416666666572, 0.2734375, 0.265625, 0.5026041666666714, 0.2604166666666714, 0.2421875, 0.46875, 0.5078125, 0.9947916666666572, 0.2604166666666714, 0.2552083333333286, 0.2708333333333428, 0.2369791666666572, 0.2421875, 0.4895833333333428, 0.2942708333333286, 0.4635416666666714, 0.5104166666666572, 0.2473958333333428, 0.2395833333333286, 1.4869791666666714, 0.5, 0.2604166666666572, 0.2526041666666714, 0.2838541666666714, 0.4791666666666572, 0.2682291666666714, 0.5026041666666714, 2.46875, 0.234375, 0.2708333333333286, 0.4817708333333286, 0.2552083333333428, 0.2682291666666572, 1.4895833333333428, 0.4921875, 0.2578125, 0.2473958333333286, 0.2630208333333286, 0.4921875, 0.2630208333333428, 0.5026041666666572, 4.736979166666671, 0.2239583333333286, 0.28125, 0.234375, 0.265625, 0.265625, 0.5, 0.2421875, 0.2552083333333428, 0.125, 0.1328125, 0.2317708333333286, 0.2395833333333286, 0.7552083333333428, 0.2473958333333286, 0.2395833333333286, 0.2786458333333428, 0.2421875, 0.2421875, 0.2578125, 0.2526041666666572, 0.234375, 0.5234375, 0.4947916666666714, 0.2630208333333286, 0.2630208333333428, 1.6979166666666572, 0.1354166666666714, 0.1197916666666714, 0.7421875, 0.1510416666666572, 0.1171875, 0.7395833333333428, 0.1380208333333286, 0.109375, 2.5, 0.2421875, 0.2604166666666714, 0.4947916666666572, 0.2421875, 0.2708333333333428, 1.7395833333333286, 0.1302083333333286, 0.140625, 0.7213541666666714, 0.1354166666666714, 0.1354166666666572, 0.7291666666666714, 0.1302083333333286, 0.1276041666666714, 4.757812499999986, 0.2239583333333428, 0.28125, 0.234375, 0.265625, 0.265625, 0.5, 0.2421875, 0.2552083333333428, 0.125, 0.1328125, 0.23177083333331439, 0.2395833333333428, 0.7552083333333428, 0.24739583333331439, 0.2395833333333428, 0.2786458333333428, 0.2421875, 0.2421875, 0.2578125, 0.2526041666666572, 0.234375, 0.5234375, 0.4947916666666572, 0.2630208333333428, 0.2630208333333428, 1.6979166666666572, 0.1354166666666572, 0.11979166666668561, 0.7552083333333144, 0.1380208333333428, 0.11979166666665719, 0.734375, 0.140625, 0.1171875, 4.236979166666686, 0.2447916666666572, 0.11979166666665719, 0.2604166666666856, 0.13802083333331439, 0.46875, 0.5234375, 0.24479166666668561, 0.23958333333331439, 0.12760416666668561, 0.24739583333331439, 0.11979166666668561, 1.0286458333333144, 0.11979166666668561, 0.13020833333331439, 0.12760416666668561, 0.11979166666665719, 0.5130208333333428, 0.1354166666666572, 0.1328125, 0.2734375, 0.46875, 1.9739583333333428, 0.2604166666666572, 0.2421875, 0.1328125, 0.2604166666666572, 0.12760416666668561, 0.2942708333333144, 0.6588541666666856, 0.11979166666665719, 0.1354166666666572, 0.2630208333333428, 0.1380208333333428, 0.2786458333333144, 0.1302083333333428, 0.9557291666666572, 0.1302083333333428, 0.11979166666665719, 0.2552083333333428, 0.11197916666665719, 0.13541666666668561, 0.125, 0.3984375, 0.7109375, 0.2604166666666572, 0.2604166666666572, 0.12239583333334281, 0.1328125, 0.1302083333333428, 0.3854166666666572, 0.4895833333333428, 0.2421875, 0.75, 0.2135416666666572, 0.2734375, 0.265625, 0.5026041666666572, 0.2604166666666856, 0.2421875, 0.46875, 0.5078125, 0.9947916666666572, 0.2604166666666572, 0.2552083333333428, 0.2708333333333428, 0.2369791666666572, 0.2421875, 0.4895833333333428, 0.2942708333333144, 0.4635416666666856, 0.5104166666666572, 0.2473958333333428, 0.23958333333331439, 1.4869791666666856, 0.5, 0.2604166666666572, 0.2526041666666572, 0.2838541666666856, 0.4791666666666572, 0.2682291666666572, 0.5026041666666856, 4.7265625, 0.2135416666666572, 0.2734375, 0.265625, 0.5026041666666572, 0.2604166666666856, 0.2421875, 0.46875, 0.5078125, 0.9947916666666572, 0.2604166666666572, 0.2552083333333428, 0.2708333333333428, 0.2369791666666572, 0.2421875, 0.4895833333333428, 0.2942708333333144, 0.4635416666666856, 0.5104166666666572, 0.2473958333333428, 0.23958333333331439, 1.4869791666666856, 0.5, 0.2604166666666572, 0.2526041666666572, 0.2838541666666856, 0.4791666666666572, 0.2682291666666572, 0.5026041666666856, 2.46875, 0.234375, 0.2708333333333144, 0.4817708333333428, 0.2552083333333428, 0.2682291666666572, 1.4895833333333428, 0.4921875, 0.2578125, 0.24739583333331439, 0.2630208333333428, 0.4921875, 0.2630208333333428, 0.5026041666666572, 18.481770833333343, 0.234375, 0.2708333333333144, 0.4817708333333428, 0.2552083333333428, 0.2682291666666572, 1.4895833333333428, 0.4921875, 0.2578125, 0.24739583333331439, 0.2630208333333428, 0.4921875, 0.2630208333333428, 0.5026041666666572, 4.739583333333343, 0.2135416666666572, 0.2734375, 0.265625, 0.5026041666666572, 0.2604166666666856, 0.2421875, 0.46875, 0.5078125, 0.9947916666666572, 0.2604166666666572, 0.2552083333333428, 0.2708333333333428, 0.2369791666666572, 0.2421875, 0.4895833333333428, 0.2942708333333144, 0.4635416666666856, 0.5104166666666572, 0.2473958333333428, 0.23958333333331439, 1.4869791666666856, 0.5, 0.2604166666666572, 0.2526041666666572, 0.2838541666666856, 0.4791666666666572, 0.2682291666666572, 0.5026041666666856, 2.46875, 0.234375, 0.2708333333333144, 0.4817708333333428, 0.2552083333333428, 0.2682291666666572, 1.4895833333333428, 0.4921875, 0.2578125, 0.24739583333331439, 0.2630208333333428, 0.4921875, 0.2630208333333428, 0.5026041666666572, 4.739583333333343, 0.2135416666666572, 0.2734375, 0.265625, 0.5026041666666572, 0.2604166666666856, 0.2421875, 0.46875, 0.5078125, 1.265625, 0.21354166666662877, 0.2734375, 0.265625, 0.5026041666666856, 0.2604166666666856, 0.2421875, 0.46875, 0.5078125, 1.265625, 0.21354166666662877, 0.2734375, 0.265625, 0.5026041666666856, 0.2604166666666856, 0.2421875, 0.46875, 0.5078125, 1.265625, 0.21354166666662877, 0.2734375, 0.265625, 0.5026041666666856, 0.2604166666666856, 0.2421875, 0.46875, 0.5078125, 1.265625, 0.21354166666662877, 0.2734375, 0.265625, 0.5026041666666856, 0.2604166666666856, 0.2421875, 0.46875, 0.5078125, 1.265625, 0.21354166666662877, 0.2734375, 0.265625, 0.5026041666666856, 0.2604166666666856, 0.2421875, 0.46875, 0.5078125, 1.265625, 0.21354166666662877, 0.2734375, 0.265625, 0.5026041666666856, 0.2604166666666856, 0.2421875, 0.46875, 0.5078125]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "kSJ6bXQ0CA0Z", "colab_type": "text" }, "source": [ "And... play it. Just the first 30 notes or so, it's a long song." ] }, { "cell_type": "code", "metadata": { "id": "fqw43AFyCD1H", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 256 }, "outputId": "1a26f902-964b-4616-9174-233f6d640134" }, "source": [ "# num notes\n", "n = 35\n", "\n", "# plot\n", "mai.make_music_plot(pitches=original_pitches[:n], durs=original_durs[:n])\n", "\n", "# play\n", "mai.make_music(pitches=original_pitches[:n], durs=original_durs[:n], pgm=35)" ], "execution_count": 10, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } }, { "output_type": "execute_result", "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 10 } ] }, { "cell_type": "markdown", "metadata": { "id": "DD_2bWJA4FVF", "colab_type": "text" }, "source": [ "##Step 5: Learn a Markov model\n", "Train a Markov model on the sequnce of pitches extracted from the vocal meldoy. **This is where you specify what `order` Markov chain you'd like to use.**" ] }, { "cell_type": "code", "metadata": { "id": "KQIdAP_4ZU9r", "colab_type": "code", "colab": {} }, "source": [ "# what order?\n", "order = 1\n", "\n", "# create a markov chain instance\n", "mark = mai.markov.Markov()\n", "\n", "# then learn a transition table from data\n", "mark.train(original_pitches, order=order)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "twFECn9kklyJ", "colab_type": "text" }, "source": [ "View the transition table" ] }, { "cell_type": "code", "metadata": { "id": "ddwpOCKfBMJ2", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 189 }, "outputId": "5e303d7a-7dc1-4960-9384-4873ca7012d5" }, "source": [ "# plot transition table\n", "mark.plot_transition_matrix(figscale=0.2)" ], "execution_count": 12, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "code", "metadata": { "id": "kB5NXzj4zPj1", "colab_type": "code", "outputId": "d1872809-dc4e-4e70-ea2c-f77c146e4b6b", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "# show length of transition table\n", "len(mark.transitions)" ], "execution_count": 13, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "38" ] }, "metadata": { "tags": [] }, "execution_count": 13 } ] }, { "cell_type": "code", "metadata": { "id": "lyMPVjdtZU9v", "colab_type": "code", "outputId": "ab43fd11-58ad-4a2b-b4ca-ea23116c36ac", "colab": { "base_uri": "https://localhost:8080/", "height": 677 } }, "source": [ "# show transition table\n", "mark.print_transitions()" ], "execution_count": 14, "outputs": [ { "output_type": "stream", "text": [ "(61,) -> 61 : 40\n", "(61,) -> 59 : 12\n", "(59,) -> 57 : 26\n", "(57,) -> 59 : 14\n", "(57,) -> 61 : 12\n", "(61,) -> 57 : 4\n", "(57,) -> 57 : 4\n", "(57,) -> 56 : 12\n", "(56,) -> 54 : 24\n", "(54,) -> 54 : 14\n", "(54,) -> 56 : 12\n", "(54,) -> 57 : 8\n", "(54,) -> 61 : 2\n", "(54,) -> 66 : 2\n", "(66,) -> 64 : 44\n", "(64,) -> 66 : 20\n", "(66,) -> 69 : 14\n", "(69,) -> 66 : 6\n", "(66,) -> 66 : 62\n", "(66,) -> 61 : 4\n", "(61,) -> 66 : 36\n", "(66,) -> 68 : 6\n", "(68,) -> 66 : 14\n", "(66,) -> 62 : 10\n", "(62,) -> 62 : 6\n", "(62,) -> 64 : 2\n", "(66,) -> 65 : 2\n", "(65,) -> 65 : 6\n", "(65,) -> 66 : 2\n", "(64,) -> 61 : 26\n", "(69,) -> 71 : 8\n", "(71,) -> 69 : 8\n", "(69,) -> 68 : 8\n", "(66,) -> 73 : 8\n", "(73,) -> 71 : 8\n", "(71,) -> 71 : 8\n", "(71,) -> 66 : 8\n", "(62,) -> 61 : 8\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "UEy-G1M84aZY", "colab_type": "text" }, "source": [ "##Step 6: Generate a sequence\n", "Now the fun part, we generate a new vocal melody using the Markov model learned from the original. Note that this cell first sets the initial Markov state to be the first `order` number of notes from the original melody, then generates a new melody with the same number of notes as the original. **Important: you do not need to edit any code in this cell when changing the order.**" ] }, { "cell_type": "code", "metadata": { "id": "wnw3Vw2PBV35", "colab_type": "code", "colab": {} }, "source": [ "# generate a new melody\n", "new_pitches = mark.choice(k=len(original_pitches)-order, suppress_errors=True)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "sbBC8kAAU-Dv", "colab_type": "text" }, "source": [ "**Note:** If your Markov model produces the error `'Current state not found in transition table'`, you can supress it by passing the value `True` to the argument `supress_errors` in the `mark.choose()` function call. " ] }, { "cell_type": "code", "metadata": { "id": "gsQ2gemeZU97", "colab_type": "code", "outputId": "d710e895-e4c3-4b19-a205-d0d7bcf67472", "colab": { "base_uri": "https://localhost:8080/", "height": 54 } }, "source": [ "# print the new music\n", "print(new_pitches)" ], "execution_count": 16, "outputs": [ { "output_type": "stream", "text": [ "[61, 59, 57, 61, 66, 66, 66, 69, 71, 71, 69, 68, 66, 64, 61, 66, 62, 61, 66, 69, 71, 66, 64, 61, 66, 64, 66, 73, 71, 71, 71, 66, 64, 61, 61, 61, 61, 57, 61, 59, 57, 59, 57, 59, 57, 61, 61, 59, 57, 57, 61, 61, 66, 62, 62, 64, 61, 66, 62, 62, 62, 61, 61, 59, 57, 56, 54, 56, 54, 54, 54, 56, 54, 57, 59, 57, 59, 57, 59, 57, 56, 54, 56, 54, 54, 54, 56, 54, 54, 54, 56, 54, 57, 61, 59, 57, 61, 66, 69, 68, 66, 64, 66, 64, 61, 61, 66, 69, 71, 69, 71, 66, 66, 64, 61, 66, 66, 66, 73, 71, 69, 66, 69, 68, 66, 64, 61, 59, 57, 57, 59, 57, 56, 54, 57, 56, 54, 54, 57, 56, 54, 54, 56, 54, 66, 66, 68, 66, 66, 62, 62, 62, 62, 61, 61, 66, 66, 66, 66, 66, 68, 66, 69, 71, 66, 64, 61, 61, 66, 66, 66, 66, 68, 66, 66, 62, 64, 61, 61, 57, 59, 57, 56, 54, 54, 57, 59, 57, 61, 57, 61, 61, 61, 66, 64, 66, 64, 61, 66, 66, 66, 66, 64, 61, 59, 57, 61, 66, 66, 62, 62, 62, 61, 61, 57, 59, 57, 61, 66, 66, 64, 61, 57, 56, 54, 57, 59, 57, 56, 54, 56, 54, 56, 54, 54, 54, 54, 54, 57, 56, 54, 54, 54, 56, 54, 57, 56, 54, 54, 57, 56, 54, 66, 69, 68, 66, 69, 71, 66, 66, 66, 64, 61, 61, 61, 61, 59, 57, 59, 57, 61, 66, 66, 64, 66, 69, 71, 71, 69, 71, 69, 71, 66, 66, 66, 62, 61, 61, 59, 57, 61, 66, 64, 66, 62, 61, 61, 66, 64, 66, 66, 66, 69, 68, 66, 64, 66, 64, 66, 69, 68, 66, 62, 61, 61, 61, 57, 61, 59, 57, 59, 57, 56, 54, 57, 59, 57, 59, 57, 56, 54, 56, 54, 66, 73, 71, 66, 61, 59, 57, 56, 54, 57, 61, 59, 57, 61, 61, 66, 62, 62, 62, 62, 62, 62, 62, 62, 64, 61, 66, 62, 62, 61, 61, 61, 66, 66, 69, 66, 64, 61, 66, 66, 69, 68, 66, 64, 61, 59, 57, 59, 57, 56, 54, 66, 69, 66, 64, 66, 73, 71, 69, 71, 71, 71, 69, 66, 64, 61, 61, 59, 57, 59, 57, 59, 57, 59, 57, 61, 59, 57, 59, 57, 61, 61, 61, 66, 68, 66, 69, 68, 66, 64, 61, 66, 64, 66, 66, 66, 61, 61, 66, 66, 62, 62, 62, 61, 61, 66, 64, 61, 59, 57, 59, 57, 61, 66, 66, 64, 66, 64, 61, 66, 68, 66, 66, 64, 61, 66, 66, 66, 66, 64, 61, 61, 66, 73, 71, 69, 68, 66, 64, 66, 69, 71, 66, 66, 66, 66, 62, 61, 61, 66, 66, 66, 69, 71, 71, 69, 68, 66, 64, 61, 61, 61, 61, 61, 61, 66, 64, 61, 61, 61, 61, 59, 57, 59, 57, 59, 57, 59]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "vuoyRWMJhSiV", "colab_type": "text" }, "source": [ "Let's also plot them. Here the the original melody (in blue) and the new melody (in orange) are on the same plot. How do they compare?" ] }, { "cell_type": "code", "metadata": { "id": "yqV9g5K-gyCQ", "colab_type": "code", "outputId": "3142106c-3cc6-4e27-984d-f4c036b974a5", "colab": { "base_uri": "https://localhost:8080/", "height": 241 } }, "source": [ "plot_melodies(original_pitches, new_pitches, num_notes=45)" ], "execution_count": 17, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "markdown", "metadata": { "id": "CdAhOElAAbDl", "colab_type": "text" }, "source": [ "##Step 7: Let's hear it\n", "We'll start by resynthesizing the altered voice solo. Since we've only manipulated pitch, we'll use the rhythm from the original vocal line. This may take a few moments... **Warning!** Turn down your volume before you hit play b/c sometimes the player makes loud static --- usually if you synthesize MIDI into silence." ] }, { "cell_type": "code", "metadata": { "id": "kXhVP_o3ZU-T", "colab_type": "code", "outputId": "b5675338-b042-41e9-d203-fb59a3d2fec4", "colab": { "base_uri": "https://localhost:8080/", "height": 256 } }, "source": [ "# num notes\n", "n = 35\n", "\n", "# plot\n", "mai.make_music_plot(pitches=new_pitches[:n], durs=original_durs[:n])\n", "\n", "# play\n", "mai.make_music(pitches=new_pitches[:n], durs=original_durs[:n], pgm=35)" ], "execution_count": 18, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } }, { "output_type": "execute_result", "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 18 } ] }, { "cell_type": "markdown", "metadata": { "id": "O2xFFyDh20Hd", "colab_type": "text" }, "source": [ "Let's add that altered voice to the band and listen to the entire band. We do this by overwriting the voice in `altered_midi_data`, which is a copy of the original midi file we read it in way back at the beginning of this notebook." ] }, { "cell_type": "code", "metadata": { "id": "U6mI2qIM2m3H", "colab_type": "code", "outputId": "1d403fd0-42bc-418c-80fc-a389864ac02e", "colab": { "base_uri": "https://localhost:8080/", "height": 62 } }, "source": [ "# loop through original notes and change the pitch\n", "for i,new_pitch in enumerate(new_pitches):\n", " instrument.notes[i].pitch = new_pitch\n", " \n", "# this time replace the original instrument with your new one\n", "altered_midi_data.instruments[instrument_index] = instrument\n", "\n", "# synthesize midi to audio\n", "x = altered_midi_data.fluidsynth(fs=22050)\n", "\n", "# convert to mp3 and listen\n", "mai.io.play_mp3(x, sr=22050)" ], "execution_count": 19, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 19 } ] }, { "cell_type": "markdown", "metadata": { "id": "IecqbU7egNg_", "colab_type": "text" }, "source": [ "## Step 8: Here's the fun part\n", "Go back and try a few other instruments. Try different orders as well! Can you get a sense for how order affects the resynthesized music?" ] } ] }