{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "1.2 Hello Music.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": [
""
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "-bEMPSTz3c60",
"colab_type": "text"
},
"source": [
"# Making Music with Python\n",
"So how do we use numbers, variables, maths, and lists to make music? We need some way of converting a list of numbers into musical sounds. That is, we need some way of interpreting a list of numbers into *musical features* — such as pitch, rhythm, or harmony. Obviously there are about a zillion ways to do this, but, as a starting point, I've included some code in the course code repository to work with. A way of interpreting numbers into music is called a *music representation*, and I'll be using this word over and over again throughout the course, because the decisions about music representation have a profound impact on the music that a musical system produces.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "fNq7yfsMfS24",
"colab_type": "text"
},
"source": [
"## Notebook Setup\n",
"First we have to install a few software packages. Don't worry about the specifics of the two code cells below. Just know that we are installing some software packages that we need in order to make sound in Python and then importing them into our current notebook session. \n",
"\n",
"* Warning: you may see a bunch of text when you execute these cells. Don't worry, it's normal.\n",
"* Important: you must run these setup cells everytime you start a new notebook session."
]
},
{
"cell_type": "code",
"metadata": {
"id": "PEvFSb0KeN_d",
"colab_type": "code",
"cellView": "both",
"colab": {}
},
"source": [
"# install software repositories\n",
"from IPython.display import clear_output\n",
"!pip install -qq git+https://github.com/davidkant/mai#egg=mai\n",
"!apt-get -qq update\n",
"!apt-get -qq install -y libfluidsynth1\n",
"clear_output()"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "zWbdkTb3eS2W",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 35
},
"outputId": "157a52da-1073-4e42-eb44-c13536e84c6d"
},
"source": [
"# import packages into our notebook session\n",
"import mai\n",
"import matplotlib.pyplot as plt"
],
"execution_count": 2,
"outputs": [
{
"output_type": "stream",
"text": [
"Using TensorFlow backend.\n"
],
"name": "stderr"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "JMF4v1mBfW_a",
"colab_type": "text"
},
"source": [
"# Representing music as lists of numbers\n",
"This is definitely the least inventive thing we could do, but let's start by interpreting a list as a sequence of notes on a piano keyboard. We'll be using a convention for mapping integers to piano keys called [General MIDI](https://en.wikipedia.org/wiki/General_MIDI). In General MIDI, the key middle C on a piano keyboad is mapped to the value `60`. \n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Oq5EH0q9z523",
"colab_type": "text"
},
"source": [
"The course code package contains a function `mai.make_music()` which will get us started. Don't worry about the code syntax in the following cells — we'll learn about functions later. However, try to understand the music representation. That is, how numbers and lists are being interpreted into music."
]
},
{
"cell_type": "code",
"metadata": {
"id": "otAj0PGDy213",
"colab_type": "code",
"outputId": "b5a702c2-66b1-44b8-9c87-9caf78b32086",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 62
}
},
"source": [
"# a list of numbers\n",
"my_music = [30, 50, 42, 61, 75, 2, 33]\n",
"\n",
"# list interpreted into music\n",
"mai.make_music(my_music)"
],
"execution_count": 3,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {
"tags": []
},
"execution_count": 3
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "9wagWfIH7bd4",
"colab_type": "text"
},
"source": [
"## Visual Representations\n",
"I also find it useful to use look at a visual representation. Here's a simple *line plot*.\n",
"\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "goYotiQg7Tj0",
"colab_type": "code",
"outputId": "9b50c212-ae7c-4fe5-91d2-93018319cf8c",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 211
}
},
"source": [
"# line plot\n",
"plt.figure(figsize=(9,3))\n",
"plt.plot(my_music)\n",
"plt.show()"
],
"execution_count": 4,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"