{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "3.1 Anna's Music Box.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": "O7kM5PfeDEIZ", "colab_type": "text" }, "source": [ "# Anna's Music Box\n", "*Rule-based* systems can be cumbersome to write and reason through, often involving complex, branching logical control flow *if/then* structures and large sets of rules. In a **parametric** model, by comparison, musical features — such as rhythm, melody, harmony, or even \"interestingness\" — are expressed with numerical values, often between 0 and 1, called *parameters*. In this notebook, we'll reverse engineer Larry Polansky's *Anna's Music Box* and code a few musical parameters to represent features of melody and rhythm. \n" ] }, { "cell_type": "markdown", "metadata": { "id": "6Qu7Gaq06RRJ", "colab_type": "text" }, "source": [ "## Setup" ] }, { "cell_type": "code", "metadata": { "id": "FHFbn3VtHx2U", "colab_type": "code", "colab": {} }, "source": [ "# install external libraries\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", "clear_output()" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "3Wv7_phw2qXj", "colab_type": "code", "colab": {} }, "source": [ "# imports\n", "import mai\n", "import random" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "LZSicJEi4-bb", "colab_type": "text" }, "source": [ "## (1) Rhythm: Pulse\n", "How would you express the concept of *rhythm* as a value between `0.0` and `1.0`? In AMB, two parameters `pulse` and `rhythm` together determine the timing of notes. Let's see if we can reverse engineer how they work.\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "fcqOi-95qzbD", "colab_type": "text" }, "source": [ " Music often has a recurring *beat* — it's what you clap your hands to or tap your foot along with. *Pulse* is the speed, or duration, of that beat, and it is generally measured in \"beats per minute\" (*bpm*). In AMB, the parameter `pulse` determines the basic note duration in bpm." ] }, { "cell_type": "markdown", "metadata": { "id": "4K61Poey1QDT", "colab_type": "text" }, "source": [ "**Exercise:** Let's write an expression to compute the note duration (in seconds) given a value of `pulse` (in bpm). This is done by dividing the number of seconds in a minute, `60`, by number of beats per minute, `pulse`." ] }, { "cell_type": "code", "metadata": { "id": "qEtxI-wMoe5A", "colab_type": "code", "outputId": "30603640-a993-4089-8e78-2ce79239f7a6", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "# parameters\n", "pulse = 240\n", "\n", "# duration in seconds\n", "60 / pulse" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "0.25" ] }, "metadata": { "tags": [] }, "execution_count": 3 } ] }, { "cell_type": "markdown", "metadata": { "id": "7fDKa-jO3dJM", "colab_type": "text" }, "source": [ "Now let's generate a sequence of notes with with duration determined by `pulse`. What does it sound like? We have an even sequence of note durations, or a steady pulse. Try changing the `pulse` value." ] }, { "cell_type": "code", "metadata": { "id": "xeDpCWld3nu2", "colab_type": "code", "colab": {} }, "source": [ "# start with an empty list\n", "my_durs = []\n", "\n", "# loop until we have enough notes\n", "while len(my_durs) < 16:\n", "\n", " # choose duration\n", " new_dur = 60 / pulse\n", " \n", " # append to the melody\n", " my_durs += [new_dur]" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "2o9KjXOp3sB3", "colab_type": "code", "outputId": "42f64836-a217-49f3-bf90-9a63c44884cc", "colab": { "base_uri": "https://localhost:8080/", "height": 268 } }, "source": [ "# let's see it\n", "mai.make_music_plot(pitches=60, durs=my_durs)\n", "\n", "# let's hear it\n", "mai.make_music(pitches=60, durs=my_durs, is_drum=True)" ], "execution_count": 0, "outputs": [ { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAioAAADCCAYAAABnuOl1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAHSlJREFUeJzt3X1MVffhx/H3hYsaHtYC3ot11doS\nIZNClTJXnxVZnf6qo1YpUsfWuDrrYwgtVqeF1SrREreJrrLWVUtrxaoxLEtjMzJbq4htWZx1cz6l\nFsXJvRYQBWaF8/uj8a6Uh0vVK4fj55U04d5zvuecT7/N9sn3e1CbYRgGIiIiIibk19UPICIiItIe\nFRURERExLRUVERERMS0VFRERETEtFRURERExLRUVERERMS17Vz/AjXC56nx27dDQQKqr6312fTNQ\nRmtQRmtQRmtQxpvjcIS0e0wrKt9it/t39SP4nDJagzJagzJagzL6joqKiIiImJaKioiIiJiWioqI\niIiYVqdepi0uLub111/HbrezcOFCoqOjycrKoqmpCYfDwSuvvEKPHj1ajFm1ahWHDx/GZrOxdOlS\n4uLiAHjzzTdZvXo1hw4dIigoCICYmBji4+M9Yzdv3oy/v/X3+0RERKRjXotKdXU1GzZsYOfOndTX\n15Ofn8+ePXtIS0tj4sSJrF27lh07dpCWluYZc+jQIc6cOUNRURGnTp1i6dKlFBUVsXv3bi5evIjT\n6Wxxj+DgYAoLC299OhEREenWvG79lJaWMmzYMIKDg3E6naxYsYKysjLGjx8PwLhx4ygtLW01Jikp\nCYDIyEhqa2u5fPkySUlJZGRkYLPZfBBFRERErMZrUTl79iyNjY3MmTOHtLQ0SktLaWho8Gz1hIeH\n43K5Woxxu92EhoZ6PoeFheFyuQgODm7zHlevXiUzM5PU1FTeeOONm8kjIiIiFtKpd1RqampYv349\nlZWVpKenYxiG59g3f26Pt3OysrKYMmUKNpuNmTNnkpCQQGxsbLvnh4YG+vT3uTv6g2esQhmtQRmt\nQRmtQRl9w2tRCQ8PZ8iQIdjtdvr3709QUBD+/v40NjbSq1cvLly40OqdE6fTidvt9nyuqqrC4XC0\ne48ZM2Z4fn7kkUc4fvx4h0XFl3/6n8MR4tM/+dYMlNEalNEalNEalPHmr90er1s/I0eO5ODBgzQ3\n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\niIiIiGmpqIiIiIhpqaiIiIiIaamoiIiIiGmpqIiIiIhpqaiIiIiIaamoiIiIiGnZvZ1QVlbGokWL\nGDhwIABRUVGkpaXx4osvYrPZGDBgADk5Odjt/7tUc3Mz2dnZnDhxgoCAAHJycoiMjOTUqVNtjisu\nLmbLli34+fmRkpLC9OnTfZdYREREuo1OragMHTqUwsJCCgsLWb58OXl5ecyePZu33nqLe+65h/fe\ne6/F+SUlJdTV1bFt2zZWrlzJmjVrANocV19fz4YNG9i8eTOFhYVs2bKFmpqaW59UREREup0b2vo5\nc+YMcXFxAIwaNYr9+/e3OP755597jvfv35/KykqampraHHf48GFiY2MJCQmhV69exMfHU15efjOZ\nRERExCI6VVROnjzJnDlzmDFjBvv37ycqKooPPvgAgH379uF2u1ucHxUVxUcffURTUxOnT5+moqKC\n6urqNse53W7CwsI8Y8PCwnC5XLcqn4iIiHRjXt9RGTBgAPPnz2fixIlUVFSQnp7O22+/zUsvvcSu\nXbsYOnQohmG0GDNmzBjKy8t56qmniI6O5oEHHsAwDBYvXkxOTk6744A2v/u20NBA7Hb/7xDzu3E4\nQnx2bbNQRmtQRmtQRmtQRt/wWlQiIiKYNGkS8PU2Tu/evWlubqagoAD4emWkqqqq1biMjAzPz0lJ\nSYSHh+Pn59dqnNPpbLEiU1VVxeDBgzt8purq+k5EuzEORwguV53Prm8GymgNymgNymgNynjz126P\n162f4uJiNm3aBIDL5eLixYts376dvXv3ArBr1y4SExNbjDl27BhLliwB4MMPP2TQoEH4+fmxbt26\nVuMeeughjhw5wqVLl7hy5Qrl5eUkJCTcSE4RERGxGK8rKomJiTz33HOUlJTw1VdfkZOTQ79+/cjK\nyiI/P5+EhATGjh0LfL2KkpubS1RUFIZhMG3aNHr27EleXh4Ajz32WJvjMjMzmTVrFjabjXnz5hES\nYv3lMxEREfHOZnTmpRCT8eXympbvrEEZrUEZrUEZrcG0Wz8iIiIiXUVFRURERExLRUVERERMS0VF\nRERETEtFRURERExLRUVERERMS0VFRERETEtFRURERExLRUVERERMS0VFRERETEtFRURERExLRUVE\nRERMS0VFRERETEtFRURERExLRUVERERMy+7thLKyMhYtWsTAgQMBiIqKIi0tjRdffBGbzcaAAQPI\n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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] } }, { "output_type": "execute_result", "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 5 } ] }, { "cell_type": "markdown", "metadata": { "id": "neXzdaEErCFZ", "colab_type": "text" }, "source": [ "## (1) Rhythm: Variation\n", "But in many forms of music, notes are not all the same duration. In AMB, this variation in duration is what Polansky means by rhythm, and is quantified as *amount of deviation from the pulse*. Let's modify the previous cell to add a random deviation to this steady pulse. We'll need a new random number generator, `random.uniform()`, which gives a random *floating point* number." ] }, { "cell_type": "markdown", "metadata": { "id": "yJRt8yMxrizU", "colab_type": "text" }, "source": [ "**Exercise:** Given values for `pulse` and `rhythm`, let's write an expression to generate note durations that randomly deviate from the `pulse` duration according to the value of `rhythm`. " ] }, { "cell_type": "code", "metadata": { "id": "zQx3HM1WBWI_", "colab_type": "code", "outputId": "f15206d7-6917-4fe8-8d11-bdc42338bc15", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "# parameters\n", "pulse = 240\n", "rhythm = 1\n", "\n", "# duration in seconds\n", "duration = 60.0 / pulse\n", "\n", "# random variation in duration\n", "duration * random.uniform(1 - rhythm, 1 + rhythm)" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "0.04090916824629198" ] }, "metadata": { "tags": [] }, "execution_count": 6 } ] }, { "cell_type": "markdown", "metadata": { "id": "r6Gx4e5ZzTuy", "colab_type": "text" }, "source": [ "Note that we use `(1 - rhythm, 1 + rhythm)` to generate a random number within a given range, both above and below, of the vaue `1`. We then multiply by the pulse `duration` because we want the variation to be proportional to the pulse." ] }, { "cell_type": "markdown", "metadata": { "id": "gLtzWslAvjbK", "colab_type": "text" }, "source": [ "Now let's generate a sequence of notes with with duration determined by both `pulse` and `rhythm`. What does it sound like? Try changing the parameter values." ] }, { "cell_type": "code", "metadata": { "id": "uxdumh0lUU73", "colab_type": "code", "colab": {} }, "source": [ "# start with an empty list\n", "my_durs = []\n", "\n", "# loop until we have enough notes\n", "while len(my_durs) < 12:\n", "\n", " # choose duration\n", " new_dur = (60.0 / pulse) * random.uniform(1 - rhythm, 1 + rhythm)\n", "\n", " # append to the melody\n", " my_durs += [new_dur]" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "-ce9pw7_UWlJ", "colab_type": "code", "outputId": "0f92a8db-7be6-4d6f-b612-6983f15c710a", "colab": { "base_uri": "https://localhost:8080/", "height": 268 } }, "source": [ "# let's see it\n", "mai.make_music_plot(pitches=60, durs=my_durs)\n", "\n", "# let's hear it\n", "mai.make_music(pitches=60, durs=my_durs, is_drum=True)" ], "execution_count": 0, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\nRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] } }, { "output_type": "execute_result", "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 8 } ] }, { "cell_type": "markdown", "metadata": { "id": "gtojMM89tIrq", "colab_type": "text" }, "source": [ "A `rhythm` value of `0` produces a steady pulse, and a `rhythm` value of `1` produces uneven rhythms. This gives us an entire *continuum* of rhythms, spanning everything in between!" ] }, { "cell_type": "markdown", "metadata": { "id": "cgSh3Roo5W_q", "colab_type": "text" }, "source": [ "## (2) Pitch\n", "How about pitch? How would you express *pitch* as a value between `0` and `1`? In AMB, the two parameters `pitch` and `range` together determine the possible pitches, expressed in terms of a center pitch and range above and below that center pitch." ] }, { "cell_type": "markdown", "metadata": { "id": "lJBDtc9xwrfl", "colab_type": "text" }, "source": [ "**Exercise:** Given values for `pitch_center` and `pitch_range`, let's write an expression to choose a random pitch. Remember, the two values inside the parenthesis determined the mininum and maximum value of `random.randint(0,127)`." ] }, { "cell_type": "code", "metadata": { "id": "KYU6rHn14vTb", "colab_type": "code", "outputId": "a62f4638-df33-4e7f-ff64-ca07e1cb138d", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "# parameters\n", "pitch_center = 60\n", "pitch_range = 6 \n", "\n", "# choose pitch\n", "random.randint(pitch_center - pitch_range, pitch_center + pitch_range)" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "62" ] }, "metadata": { "tags": [] }, "execution_count": 9 } ] }, { "cell_type": "markdown", "metadata": { "id": "oLud7Oi4589_", "colab_type": "text" }, "source": [ "Note that we again use the construction `(pitch_center - pitch_range, pitch_center + pitch_range)` to generate a value within a given range of a center value." ] }, { "cell_type": "markdown", "metadata": { "id": "RPv9X2MKyZvk", "colab_type": "text" }, "source": [ "Let's try it. Add pitch the previous `while` loop --- now we're choosing pitch as well as duration. Our list of parameters is growing..." ] }, { "cell_type": "code", "metadata": { "id": "r0G75zvdVuMJ", "colab_type": "code", "colab": {} }, "source": [ "# start with empty lists for both pitch and duration\n", "my_pitches = []\n", "my_durs = []\n", "\n", "# loop until we have enough notes\n", "while len(my_durs) < 24:\n", "\n", " # choose pitch\n", " new_pitch = random.randint(pitch_center - pitch_range, pitch_center + pitch_range)\n", " \n", " # choose duration\n", " new_dur = (60.0 / pulse) * random.uniform(1 - rhythm, 1 + rhythm)\n", " \n", " # append to the melody\n", " my_pitches += [new_pitch]\n", " my_durs += [new_dur]" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "BW0BK9NvV44A", "colab_type": "code", "outputId": "9e02d71d-bb1b-432e-beff-2306846d513d", "colab": { "base_uri": "https://localhost:8080/", "height": 268 } }, "source": [ "# let's see it\n", "mai.make_music_plot(pitches=my_pitches, durs=my_durs)\n", "\n", "# let's hear it\n", "mai.make_music(pitches=my_pitches, durs=my_durs, is_drum=False)" ], "execution_count": 0, "outputs": [ { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhYAAADCCAYAAAAVd4vDAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAFVhJREFUeJzt3X9M1fe9x/HXkQM6zqH0HDiw2oxq\nu+qads1cIxHHmlVNLSy3XXWDU67Qm7Y2LKOwpkyY5XbekDRB12YB7Wi1+5HbNtLousvutmhqNSUG\nWdwf3WrWdDRNL+KmRzkgcjz0AOf+sXtZa8FzwM/X7/ken4/EBA7w/b55HTm+/H6/fL6ueDweFwAA\ngAEL7B4AAACkD4oFAAAwhmIBAACMoVgAAABjKBYAAMAYigUAADDGfTV2EgqNWrZtny9b4XDEsu1f\n68jXOmRrLfK1FvlaxynZBgI5Mz7u+CMWbneG3SOkNfK1Dtlai3ytRb7WcXq2ji8WAAAgdVAsAACA\nMRQLAABgDMUCAAAYk1Sx6O7u1v33368NGzboyJEjisVieuqpp/Ttb39bDz/8sEZGRqyeEwAAOEDC\nXzcNh8PatWuX9u/fr0gkoo6ODg0ODsrn8+m5555TV1eXjh8/rrVr116NeQEAQApLWCx6e3tVUlIi\nr9crr9er1tZWPfbYY6qvr5ckVVZWWj6kU/j9HknS0NCYzZNcGb/fo9jYmP6z/Jta+dgjuvGbG+0e\nKaV9Mq+5yMrM0MexyTnv70uVVfpS8F/n/HUAcDUkPBVy8uRJRaNR1dbWqqqqSr29vRocHNTbb7+t\n6upqPfnkkxoeHr4aswIAgBSX1Mqbw8PD2rlzp06dOqWamhotXLhQS5cuVV1dnV544QW9+OKLampq\nmvXrfb5sSxf8mG31L7uk2jzzMbnApazMfzxn6fD9WO2Tec3FfL4mJ2cRz0mSyMla5GsdJ2ebsFjk\n5eVpxYoVcrvdKioqksfj0dTUlFauXClJKi0tVUdHx2W3YeXSpIFAjqVLhs9FOp0KmZqKTx+mT5V8\nU9WleSVrvqdCRkejPCdJSKXXhnREvtZxSrbzXtK7tLRUx44d09TUlMLhsCKRiB544AH19PRIkk6c\nOKGlS5eanRYAADiSKx6PxxN90t69e7Vv3z5J0ne/+12tXr1aTU1NCoVCys7OVltbm/Lz82f9eiub\nl1OanVORr3XI1lrkay3ytY5Tsp3tiEVSxeJKUSyci3ytQ7bWIl9rka91nJJt2t7dFAAApA6KBQAA\nMIZiAQAAjKFYAAAAYygWAADAmKRW3gTwT36/R/GxMZ36xL1B3JVVyuT+HYCtZvrZNIWf8eRxxAIA\nABhDsQAAAMZQLAAAgDEUCwAAYAwXbwJz9P93r/3cG7+1eRIAn8TPZmrgiAUAADCGYgEAAIyhWAAA\nAGMoFgAAwJikikV3d7fuv/9+bdiwQUeOHJl+vKenR8uXL7dqNgAA4DAJi0U4HNauXbv02muvqbOz\nU4cOHZIkjY+P66WXXlIgELB8SAAA4AwJf920t7dXJSUl8nq98nq9am1tlSR1dnaqqqpKO3bssHxI\nAIB1/H6PXNExTbTM4R4bmRnKjU1e8b4z/71L8QVuTfzHxiveliRFS6s0fjf39LBTwiMWJ0+eVDQa\nVW1traqqqtTb26sPP/xQ7733nsrKyq7GjAAAwCGSWiBreHhYO3fu1KlTp1RTU6Nly5appaUl6Z34\nfNlyuzPmPWQigUCOZdsG+VqJbK1FvnOwwKWszLm9Ts/182fmkss1933PJitnkZQGz7uT/+4mLBZ5\neXlasWKF3G63ioqKtGDBAvX396uxsVGSdObMGW3atEmvvPLKrNsIhyPmJr5EIJCjUGjUsu1f68jX\nOmRrLfJNnt/vkWsqrok5nNrIyszQxyZOhSiueHxu+76c6GhU4w5/3p3yd3e28pPwVEhpaamOHTum\nqakphcNhxeNxvfnmm3r99df1+uuvq6Cg4LKlAgAAXDsSHrEoLCzU+vXrVVFRIUlqaWnRggUsfwEA\n6eL/77GhrcnfYyMQyNGIif9VT/7fnznsG6ktqWssgsGggsHgjB976623jA4EAACci0MPAADAGIoF\nAAAwhmIBAACMoVgAAABjKBYAAMCYpH4rBDPz+z1yTYxp4r/+ub5+dEmVxpemxzr1fr9H+viCcg+n\n5/cHZ5np5+2ysjKU+7GZRZfmKvObXYq73Jr473/e/4KfHVwrOGIBAACMoVgAAABjKBYAAMAYigUA\nADDGFY/H41bvxMq7tDnlLnBORb7WIVtrka+1yNc6Tsl23nc3BQAASBbFAgAAGEOxAAAAxlAsAACA\nMRQLAABgTFJLend3d2vPnj1yu92qr6/X8uXL9cMf/lATExNyu93asWOHAoGA1bMCAIAUl7BYhMNh\n7dq1S/v371ckElFHR4d+//vfq6KiQuXl5Xr11Vf185//XFu2bLka8wKwiN/vkUtjmggleS8OG0Rd\nVRpfwP02gFSWsFj09vaqpKREXq9XXq9Xra2tikQiWrhwoSTJ5/PpxIkTlg8KAABSX8JicfLkSUWj\nUdXW1ur8+fN64oknVFJSIkmanJzUa6+9pu9973uX3YbPly23O8PMxDOYbZEOmEG+1km5bKdcysq0\n7mf1SmV9bpGUnXxmKZdvmiFf6zg526SusRgeHtbOnTt16tQp1dTU6PDhw5qamtKWLVu0atWq6aIx\nm3A4YmTYmThlhTKnIl/rpFq2/zgVEtdEzJ5bjScjOhHV+FhymaVavumGfK3jlGxnKz8Ji0VeXp5W\nrFght9utoqIieTweDQ0Nqa2tTTfddJPq6uqMDwsAAJwpYbEoLS1Vc3OzNm/erJGREUUiER09elSZ\nmZmqr6+/GjMCuAqGhsb+8UbGb+0dBICjJSwWhYWFWr9+vSoqKiRJLS0t2r17t8bHx1VdXS1JuuWW\nW7Rt2zZLBwUAAKkvqWssgsGggsHg9Ptr1661bCAAAOBcrLwJAACMoVgAAABjKBYAAMAYigUAADAm\nqYs3kRy/36Mp10W9M/Gk0e3mRu/VzZ4Nlmz7cvu8fnz9px67ku9vpu3Nh1UZz5Wp7wfAtSfR69gp\nZSiWa2ahOjteqzhiAQAAjKFYAAAAYygWAADAGIoFAAAwxhWPx+NW78TKu7Q55S5wTkW+1iFba5Gv\ntcjXOk7Jdra7m3LEAgAAGEOxAAAAxlAsAACAMRQLAABgDMUCAAAYk9SS3t3d3dqzZ4/cbrfq6+u1\nfPlybdmyRZOTkwoEAtqxY4eysrKsnhUAAKS4hMUiHA5r165d2r9/vyKRiDo6OnTgwAFVVVWprKxM\nzz//vPbt26eqqqqrMS8AOI7f71HM9bF+OfHLz3zstugdum38ThumAqyR8FRIb2+vSkpK5PV6VVBQ\noNbWVvX19Wnt2rWSpHvuuUe9vb2WDwoAAFJfwiMWJ0+eVDQaVW1trc6fP68nnnhCFy9enD71kZeX\np1AodNlt+HzZcrszzEw8g9kW6YAZ5GsdsrVWKuU7IZcysz77OpiT9TkFlDpzzkUq5ZtunJxtUtdY\nDA8Pa+fOnTp16pRqamr0ycU6k1m4MxyOzH/CBJyyQplTka91yNZaqZSv3+9R3BVXbOKzt8IejV5U\naDw15pyLVMo33Tgl23mvvJmXl6cVK1bI7XarqKhIHo9HHo9H0WhUknT69GkVFBSYnRYAADhSwiMW\npaWlam5u1ubNmzUyMqJIJKLS0lIdOHBADzzwgA4ePKivf/3rV2NWAHCkoaExSdIGcZE70l/CYlFY\nWKj169eroqJCktTS0qIvf/nLampqUldXlxYvXqxvfetblg8KAABSH3c3xWWRr3XI1lrkay3ytY5T\nsuXupgAAwHIUCwAAYAzFAgAAGEOxAAAAxlAsAACAMRQLAABgDMUCAAAYQ7EAAADGUCwAAIAxFAsA\nAGAMxQIAABhDsQAAAMZQLAAAgDEUCwAAYAzFAgAAGONO9Al9fX1qaGjQrbfeKklatmyZ7rvvPj3/\n/PNyu93Kzs7W9u3blZuba/mwAAAgtSUsFpJUXFys9vb26fc3bNigH//4x7r55pvV2dmprq4uPf74\n45YNCQAAnCGpYnEpn8+n4eFhSdLIyIhuvvlmo0MBwLXA7/doLC6Vfzhl9yiqXBRTcNGE3WOkJCue\np3TOO6li0d/fr9raWo2MjKiurk5bt27Vpk2bdN111yk3N1dPPfWU1XMCAAAHcMXj8fjlPuH06dP6\n4x//qLKyMg0MDKimpkZFRUVqaGjQXXfdpba2Nt1www2qqamZdRsTE5NyuzOMDw8ATndhSvqX/7F7\nCunh66V/u97uKVKX6ecpnfNOeMSisLBQ5eXlkqSioiLl5+fr/fff11133SVJWr16tX7zm99cdhvh\ncMTAqDMLBHIUCo1atv1rHflah2yt5YR8/X6PpuJSLGb/qZDR0ZhCseQPzTshX1OseJ4ul7dTsg0E\ncmZ8POGvm3Z3d+vll1+WJIVCIZ07d05+v1/9/f2SpD//+c+66aabDI4KAACcKuERizVr1qixsVGH\nDh1SLBbTtm3blJOTo5aWFmVmZio3N1fPPvvs1ZgVANLK0NCYJOmNND0kni54nuYmYbHwer3q7Oz8\nzON79+61ZCAAAOBcrLwJAACMoVgAAABjKBYAAMAYigUAADCGYgEAAIyhWAAAAGMoFgAAwBiKBQAA\nMIZiAQAAjKFYAAAAYygWAADAGIoFAAAwhmIBAACMoVgAAABjKBYAAMAYd6JP6OvrU0NDg2699VZJ\n0rJly9Tc3Kzm5mZ99NFH8ng8am9vV25uruXDAgCA1JawWEhScXGx2tvbp99/9dVX5fP59Nxzz6mr\nq0vHjx/X2rVrLRsSAAA4Q1LF4lKHDx9WfX29JKmystLoQEg/fr9HYxel8senjGyv8r6YgmUTRrbl\nNKazvNS1nC0AM5K6xqK/v1+1tbV66KGHdPToUQ0ODurtt99WdXW1nnzySQ0PD1s9JwAAcICERyyW\nLFmiuro6lZWVaWBgQDU1NcrIyNDSpUtVV1enF154QS+++KKamppm3YbPly23O8Po4J8UCORYtm2Y\nyXeBS8rMMnOtcE6OW4GAkU3Zbj7ZmszyUumUrcRrg9XI1zpOzjZhsSgsLFR5ebkkqaioSPn5+Tp3\n7pxWrlwpSSotLVVHR8dltxEORwyMOrNAIEeh0Khl27/WmcjX7/doKi7FPjZz+H50NKZQyPmH6+eT\nreksL5Uu2Uq8NliNfK3jlGxnKz8J/9vT3d2tl19+WZIUCoV07tw5bdy4UT09PZKkEydOaOnSpQZH\nBQAATuWKx+Pxy33ChQsX1NjYqPPnzysWi6murk7FxcVqampSKBRSdna22tralJ+fP+s2rGxeTml2\nTkW+1iFba5GvtcjXOk7JdrYjFglPhXi9XnV2dn7m8U/++ikAAIDEypsAAMAgigUAADCGYgEAAIyh\nWAAAAGMoFgAAwBiKRYrz+z1auDBbDz44or17o3aPAwDAZVEsAACAMRQLAABgDMUCAAAYQ7EAAADG\nJFzSG/YaGhqTJL3xRq7NkwAAkBhHLAAAgDEUCwAAYAzFAgAAGEOxAAAAxlAsAACAMQmLRV9fn1at\nWqXq6mpVV1ertbV1+mM9PT1avny5pQMCAADnSOrXTYuLi9Xe3v6px8bHx/XSSy8pEAhYMlgy/H6P\nLlz4WA8++LptM1RW3q5g8Hbb9g8AQCqZ96mQzs5OVVVVKSsry+Q8AADAwZI6YtHf36/a2lqNjIyo\nrq5Oixcv1nvvvaeGhgbt2LEj4df7fNlyuzOueNjZZGbat85XTs4iBQI5tu3/akj3789OZGst8rUW\n+VrHydkm/Bd5yZIlqqurU1lZmQYGBlRTU6MvfvGLeuaZZ5LeSTgcuaIhZ+P3eyRJsdiEJdtPxuho\nVKHQqG37t1ogkJPW35+dyNZa5Gst8rWOU7KdrfwkPBVSWFio8vJyuVwuFRUVKSsrS0ePHlVjY6Mq\nKip05swZbdq0yfjAAADAeRIeseju7lYoFNKjjz6qUCikWCymd955Z/raijVr1uiVV16xfNCZDA2N\nKRDI0RtvVNiyfwAA8GkJi8WaNWvU2NioQ4cOKRaLadu2bVywCQAAZpSwWHi9XnV2ds768bfeesvo\nQAAAwLlYeRMAABhDsQAAAMa44vF43O4hAABAeuCIBQAAMIZiAQAAjKFYAAAAYygWAADAGIoFAAAw\nhmIBAACMcXSxePbZZ1VZWalgMKg//elPdo+Tdt5//32tW7fOtnvBpLPt27ersrJSGzdu1MGDB+0e\nJ61cvHhRDQ0N2rRpk77zne/o8OHDdo+UdqLRqNatW6df/epXdo+SVvr6+rRq1SpVV1erurpara2t\ndo80LwmX9E5Vf/jDH/TRRx+pq6tLH3zwgbZu3aquri67x0obkUhEra2tKikpsXuUtHPs2DH99a9/\nVVdXl8LhsB588EHde++9do+VNg4fPqw77rhDmzdv1uDgoB555BHdc889do+VVn76058qNzfX7jHS\nUnFxsdrb2+0e44o4tlj09vZq3bp1kqRbbrlFIyMjunDhgrxer82TpYesrCzt3r1bu3fvtnuUtLNy\n5UrdeeedkqTrrrtOFy9e1OTkpDIyMmyeLD2Ul5dPv/23v/1NhYWFNk6Tfj744AP19/frG9/4ht2j\nIEU59lTI2bNn5fP5pt/3+/0KhUI2TpRe3G63Fi1aZPcYaSkjI0PZ2dmSpH379unuu++mVFggGAyq\nsbFRW7dutXuUtNLW1qbm5ma7x0hb/f39qq2t1UMPPaSjR4/aPc68OPaIxaVYmRxO8+abb2rfvn36\n2c9+ZvcoaWnv3r36y1/+oh/84Afq7u6Wy+WyeyTH+/Wvf62vfOUr+sIXvmD3KGlpyZIlqqurU1lZ\nmQYGBlRTU6ODBw8qKyvL7tHmxLHFoqCgQGfPnp1+/8yZMwoEAjZOBCSvp6dHnZ2d2rNnj3Jycuwe\nJ628++67ysvL0w033KDbbrtNk5OTGhoaUl5ent2jOd6RI0c0MDCgI0eO6O9//7uysrL0+c9/XqtX\nr7Z7tLRQWFg4fSqvqKhI+fn5On36tOOKnGOLxde+9jV1dHQoGAzqxIkTKigo4PoKOMLo6Ki2b9+u\nX/ziF7r++uvtHiftHD9+XIODg3r66ad19uxZRSKRT502xfz95Cc/mX67o6NDN954I6XCoO7uboVC\nIT366KMKhUI6d+6cI68Rcmyx+OpXv6rbb79dwWBQLpdLP/rRj+weKa28++67amtr0+DgoNxutw4c\nOKCOjg7+ITTgd7/7ncLhsL7//e9PP9bW1qbFixfbOFX6CAaDevrpp1VVVaVoNKpnnnlGCxY49nIy\nXEPWrFmjxsZGHTp0SLFYTNu2bXPcaRCJ26YDAACDqPEAAMAYigUAADCGYgEAAIyhWAAAAGMoFgAA\nwBiKBQAAMIZiAQAAjKFYAAAAY/4XOsp7lNUFQZEAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] } }, { "output_type": "execute_result", "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 11 } ] }, { "cell_type": "markdown", "metadata": { "id": "BSskgAvE55yK", "colab_type": "text" }, "source": [ "## (3) De-tuning\n", "I thought it'd be fun to add a parameter called `detune` to control microtonal pitch inflections, since I like them so much." ] }, { "cell_type": "markdown", "metadata": { "id": "FX2Ag6pC9NVl", "colab_type": "text" }, "source": [ "**Exercise:** Given a value for `detune` , let's write an expression to adjust the chosen pitch up to plus/minus one semitone (`+/-1.0`)." ] }, { "cell_type": "code", "metadata": { "id": "lnZ1LVhr57PO", "colab_type": "code", "outputId": "dc5aa14f-4702-45c4-b1d9-eb4ed0bf737a", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "# parameter\n", "detune = 1.0\n", "\n", "# given a pitch\n", "pitch = 60\n", "\n", "# microtronal pitch adjustment\n", "random.uniform(pitch - detune, pitch + detune)" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "60.733581739169" ] }, "metadata": { "tags": [] }, "execution_count": 12 } ] }, { "cell_type": "markdown", "metadata": { "id": "QVUCZQI-91FH", "colab_type": "text" }, "source": [ "And add it to the `while` loop." ] }, { "cell_type": "code", "metadata": { "id": "i5VfF1z0Wrzg", "colab_type": "code", "colab": {} }, "source": [ "# start with empty lists for both pitch and duration\n", "my_pitches = []\n", "my_durs = []\n", "\n", "# loop until we have enough notes\n", "while len(my_durs) < 24:\n", "\n", " # choose pitch\n", " new_pitch = random.randint(pitch_center - pitch_range, pitch_center + pitch_range)\n", " \n", " # microtonal pitch adjustment \n", " new_pitch = random.uniform(new_pitch - detune, new_pitch + detune)\n", " \n", " # choose duration\n", " new_dur = (60.0 / pulse) * random.uniform(1 - rhythm, 1 + rhythm)\n", "\n", " # append to the melody\n", " my_pitches += [new_pitch]\n", " my_durs += [new_dur]" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "YnfEj0amWux4", "colab_type": "code", "outputId": "df4d18fe-50f0-4a51-c7e5-d7e7e93c9b76", "colab": { "base_uri": "https://localhost:8080/", "height": 268 } }, "source": [ "# let's see it\n", "mai.make_music_plot(pitches=my_pitches, durs=my_durs)\n", "\n", "# let's hear it\n", "mai.make_music(pitches=my_pitches, durs=my_durs, is_drum=False)" ], "execution_count": 0, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\nPDcZOx6A2OLupgAAwBiKBQAAMIZTITDmiztRPmBxEgCAVSgWQJKguAFIBhQLAMZ8UX5KLE4CwCrs\nsQAAAMZQLAAAgDEUCwAAYAzFAgAAGEOxAAAAxlAsAACAMSmhUChkdQgAADA5sGIBAACMoVgAAABj\nKBYAAMAYigUAADCGYgEAAIyhWAAAAGOSulg8++yzKi0tlcfj0V//+ler4yS8Dz/8UEuXLtWuXbus\njpLwtmzZotLSUj344IPav3+/1XES2oULF1RVVaVVq1bpoYceUkdHh9WREl4gENDSpUv16quvWh0l\noR0+fFi33367Vq9erdWrV6u2ttbqSAmvra1N999/v1asWKEDBw5YkiFpb5v+1ltv6dNPP1VLS4s+\n/vhjbdq0SS0tLVbHSlh+v1+1tbXKy8uzOkrCO3TokD766CO1tLTI5/Np+fLluueee6yOlbA6Ojr0\n3e9+V48++qhOnDihH//4x7r77rutjpXQfve73ykjI8PqGElh4cKFqq+vtzpGUvD5fGpqatLevXvl\n9/vV0NCgxYsXxz1H0haLrq4uLV26VJJ04403qr+/X+fOnZPT6bQ4WWKy2+3avn27tm/fbnWUhLdg\nwQJ973vfkyRNnz5dFy5c0PDwsFJTUy1OlpiKi4tHP/7HP/6h7OxsC9Mkvo8//ljd3d2WvOBjcuvq\n6lJeXp6cTqecTqdlKzxJeyrk1KlTyszMHP3c5XLJ6/VamCix2Ww2TZs2zeoYSSE1NVVpaWmSpNbW\nVt11112Uigh4PB5VV1dr06ZNVkdJaHV1ddq4caPVMZJGd3e3KioqtHLlSh08eNDqOAnt+PHjCgQC\nqqioUFlZmbq6uizJkbQrFv+KK5PDtDfeeEOtra168cUXrY6SFF555RX97W9/089//nO1tbUpJSXF\n6kgJ5w9/+INuueUW3XDDDVZHSQrf+MY3tHbtWhUVFamnp0fl5eXav3+/7Ha71dESVl9fnxobG3Xy\n5EmVl5ero6Mj7r+LSVssZs2apVOnTo1+/tlnn8ntdluYCJNJZ2enmpubtWPHDqWnp1sdJ6G9++67\nysrK0nXXXafvfOc7Gh4e1pkzZ5SVlWV1tIRz4MAB9fT06MCBA/rnP/8pu92ua6+9VosWLbI6WkLK\nzs4ePdWWk5OjmTNnqre3l2I2jqysLOXm5spmsyknJ0cOh8OS38WkPRVyxx13aN++fZKkY8eOadas\nWeyvgBEDAwPasmWLXnjhBc2YMcPqOAnvyJEjo6s6p06dkt/v/9JpSnzht7/9rfbu3as9e/booYce\n0k9+8hNKxQTa2tq0c+dOSZLX69Xp06fZwzOB/Px8HTp0SCMjI/L5fJb9LibtisWtt96qm266SR6P\nRykpKXr66aetjpTQ3n33XdXV1enEiROy2Wzat2+fGhoa+MM5hj//+c/y+Xz66U9/OvpYXV2drr/+\negtTJS6Px6Mnn3xSZWVlCgQCeuqppzRlStL+PwsSSEFBgaqrq9Xe3q5gMKjNmzdzGmQC2dnZKiws\nVElJiSSppqbGkt9FbpsOAACM4X8rAACAMRQLAABgDMUCAAAYQ7EAAADGUCwAAIAxFAsAAGAMxQIA\nABhDsQAAAMb8H7nUTsaakerIAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] } }, { "output_type": "execute_result", "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 14 } ] }, { "cell_type": "markdown", "metadata": { "id": "LH5e0PuyFaTh", "colab_type": "text" }, "source": [ "## (4) Repeat\n", "AMB has a parameter called `repeat` which controls the \"interesting-ness\" of the melody. I think this is pretty cool, because we're no longer quantifying lower level musical features like which notes and which durations, but thinking about higher level music concepts, like what even makes something interesting? In this case, \"interestingness\" has to do with how much the melody repeats itself.\n", "\n", "In AMB, `repeat` controls the likelihood that the critter looks back and repeats a recent note. Believe it or not, there's more than one way to do this... Let's say that if the critter decides to look back 8 notes it takes and repeats the value of the eighth previous note." ] }, { "cell_type": "markdown", "metadata": { "id": "OmDC-uBTAYk4", "colab_type": "text" }, "source": [ "**Exercise:** Given a value for `repeat`, we'll use an `if` statement to control the likelihood that the melody repeats itself. Use `random.random()` which generates a random floating point number between `0` and `1`.\n" ] }, { "cell_type": "code", "metadata": { "id": "DGNN3pDPFetd", "colab_type": "code", "outputId": "8cc20eee-6922-452a-b939-71b4f069304e", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "# parameter\n", "repeat = 0.7\n", "\n", "# let's say this is our music thus far\n", "my_music = [60, 62, 64, 64, 64, 66, 64, 60]\n", "\n", "# do we look back or choose a brand new pitch?\n", "if random.random() <= repeat:\n", "\n", " # take the fifth previous note\n", " pitch = my_music[-8]\n", "\n", "print(pitch)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "60\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "xBLqunuWFhM7", "colab_type": "text" }, "source": [ "Note that we want to use a *less than or equal to* sign `<=` (not a greater than or equal to sign)!" ] }, { "cell_type": "markdown", "metadata": { "id": "L24J_bJzB_Ee", "colab_type": "text" }, "source": [ "And add it to the `while` loop." ] }, { "cell_type": "code", "metadata": { "id": "9kpw8IPoYxKE", "colab_type": "code", "colab": {} }, "source": [ "# start with empty lists for both pitch and duration\n", "my_pitches = []\n", "my_durs = []\n", "\n", "# loop until we have enough notes\n", "while len(my_durs) < 16:\n", "\n", " # do we look back?\n", " if random.random() <= repeat and len(my_pitches) >= 8:\n", " \n", " # use the fifth previous note\n", " new_pitch = my_pitches[-8]\n", " new_dur = my_durs[-8]\n", " \n", " # if we don't look back\n", " else:\n", " \n", " # choose pitch\n", " new_pitch = random.randint(pitch_center - pitch_range, pitch_center + pitch_range)\n", "\n", " # microtonal pitch adjustment \n", " new_pitch = random.uniform(new_pitch - detune, new_pitch + detune)\n", "\n", " # choose duration\n", " new_dur = (60.0 / pulse) * random.uniform(1 - rhythm, 1 + rhythm)\n", "\n", " # append to the melody\n", " my_pitches += [new_pitch]\n", " my_durs += [new_dur]" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "lNs7FNfQKE3B", "colab_type": "code", "outputId": "adba2923-4c32-4ff3-d6b2-b2f6723bef1f", "colab": { "base_uri": "https://localhost:8080/", "height": 268 } }, "source": [ "# let's see it\n", "mai.make_music_plot(pitches=my_pitches, durs=my_durs)\n", "\n", "# let's hear it\n", "mai.make_music(my_pitches, durs=my_durs, pgm=1)" ], "execution_count": 0, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\namrSK6+8kuhSHHOrHt00x7feekt//vOf9YMf/EDNzc0p+T/WeG7VoxvmeOTIEX35y1/W5z73uUSX\nIimF3hWSn5+vS5cuDX/94Ycfyufzjbjv4sWLKXkaerQeJenRRx9VXl6eLMvS4sWLdfbs2USU6Ri3\nzDEet8zxxIkTCgaDOnjwoLKzs4e3u2mOt+pRcscc33//fV24cEGSdO+992pwcFCdnZ2S3DPH0XqU\n3DHH48ePq6WlRWVlZfr5z3+u/fv3691335WUmDmmTLC4//77dfToUUnSmTNnlJ+fP3yJ4O6779bV\nq1fV3t6ugYEBHTt2TPfff38iyx2X0Xrs6enRk08+qevXr0uS3nvvPc2ePTthtTrBLXMcjVvm2NPT\no127dulnP/uZ7rjjjpv2uWWOo/XoljmeOnVq+EzMpUuXFI1G5fV6JblnjqP16JY5/vSnP9Xhw4d1\n6NAhfetb39L69eu1aNEiSYmZY0p9uunu3bt16tQppaWlafv27frTn/6k7Oxsff3rX9d7772n3bt3\nS5KWL1+uJ598MsHVjs9oPb722ms6cuSIpk2bpi984Qt65plnUu6U5fvvv6/a2lqdP39elmWpoKBA\nS5cu1d133+2aOcbr0Q1zbGxsVH19vWbNmjW87Stf+Yrmzp3rmjnG69ENc4zFYvrxj3+sCxcuKBaL\naePGjerq6nLVf1fj9eiGOf6r+vp6ffazn5WkhM0xpYIFAABIbilzKQQAACQ/ggUAADCGYAEAAIwh\nWAAAAGMIFgAAwBiCBQAAMIZgAQAAjCFYAAAAY/4f1P5OY86eCjgAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] } }, { "output_type": "execute_result", "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 17 } ] }, { "cell_type": "markdown", "metadata": { "id": "GCRBoQyrZQNd", "colab_type": "text" }, "source": [ "## Many many parameters\n", "At this point we've accumulated quite a few musical parameters — for rhythm, pitch, tuning, and interestingness. The neat thing about parametric models is all of the different combinations of parameter values describe different musical systems. Let's put them all together in one place. Try adjusting a few parameters below and see what comes out." ] }, { "cell_type": "code", "metadata": { "id": "kMeAPmMtZYdK", "colab_type": "code", "colab": {} }, "source": [ "# parameters\n", "pitch_center = 60 # center pitch \n", "pitch_range = 6 # variation in pitch\n", "pulse = 240 # in bpm beats per minute\n", "rhythm = 1 # percent of variation around the pulse\n", "detune = 0.5 # amount of microtonal inflection\n", "repeat = 0.85 # probability of repeat or interestingness" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "aTThTa0L1YbU", "colab_type": "text" }, "source": [ "## Functions\n", "At this point I'm pretty tired of copy and pasting that giant `while` loop, so what can we do about it? The answer: **functions**. Functions allow us to reuse code. We'll put the code that we want to reuse — e.g., that huge `while` loop — inside a function defintion. Then, when we call the function name, Python will exectue the code inside. This allows us to reuse the same code without having to rewrite it every time.\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "8LdGKTmvPQ52", "colab_type": "text" }, "source": [ "The function `amb` is already defined for us in the class code package, just write `mai.amb()` and you can run AMB in just one line of code! Functions are central concept in programming and we'll learn more about them in the next Tutorial. But first, a few key concepts.\n", "\n", "1. Funtions have *arguments* — the values written between the parenthesis `()` — and we'll use them to set the values of the AMB parameters.\n", "\n", "2. Functions can return values. In our case, `amb` will return two lists, one for pitches and one for durations." ] }, { "cell_type": "code", "metadata": { "id": "KKkNFOg2RyH5", "colab_type": "code", "colab": {} }, "source": [ "# run AMB\n", "my_pitches, my_durs = mai.amb(pitch_center=60, \n", " pitch_range=12, \n", " pulse=240, \n", " rhythm=0.3, \n", " detune=0.3, \n", " repeat=0.7, \n", " memory=5, \n", " length=40)" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "n5j81UMqYuVZ", "colab_type": "code", "outputId": "f808f662-3dee-47a4-fb1a-69e22435ff1a", "colab": { "base_uri": "https://localhost:8080/", "height": 268 } }, "source": [ "# let's see it\n", "mai.make_music_plot(pitches=my_pitches, durs=my_durs)\n", "\n", "# let's hear it\n", "mai.make_music(my_pitches, durs=my_durs, pgm=1, is_drum=False)" ], "execution_count": 0, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\nYMz/Acu/RgI0VSzoAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] } }, { "output_type": "execute_result", "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 20 } ] }, { "cell_type": "markdown", "metadata": { "id": "u8PvGTY_Jeq2", "colab_type": "text" }, "source": [ "## How many jelly beans are in the jar?\n", "These might seem like an odd question, but how many *different* musics can you find by turning those parameter values? Let's use a random search to help answer the question. Choose some random parameter settings and see what we get." ] }, { "cell_type": "code", "metadata": { "id": "4nu90QvBRm0P", "colab_type": "code", "outputId": "506a98e8-36f4-47aa-8420-e15cd3725819", "colab": { "base_uri": "https://localhost:8080/", "height": 408 } }, "source": [ "# choose parameters\n", "pitch_center = random.randint(24, 99) # pitch in MIDI pitch value \n", "pitch_range = random.randint(1, 36) # variation in MIDI pitch value\n", "pulse = random.randint(40, 480) # in bpm beats per minute\n", "rhythm = random.uniform(0, 1) # percent of variation around the pulse\n", "detune = random.uniform(0, 1) # amount of microtonal inflection\n", "repeat = random.uniform(0, 1) # probability of repeat\n", "memory = random.randint(0, 10) # how far back to look\n", "pgm = random.randint(0, 127) # instrument sound\n", "\n", "# print random parameters\n", "print(\"RANDOM PARAMETERS!\")\n", "print(\"- pitch center:\", pitch_center)\n", "print(\"- pitch range:\", pitch_range)\n", "print(\"- pulse:\", pulse)\n", "print(\"- rhythm:\", rhythm)\n", "print(\"- detune:\", detune)\n", "print(\"- repeat:\", repeat)\n", "print(\"- memory:\", memory)\n", "\n", "# run AMB\n", "my_pitches, my_durs = mai.amb(pitch_center=pitch_center, pitch_range=pitch_range, pulse=pulse, rhythm=rhythm, detune=detune, repeat=repeat, memory=memory)\n", "\n", "# let's see it\n", "mai.make_music_plot(pitches=my_pitches, durs=my_durs)\n", "\n", "# let's hear it\n", "mai.make_music(my_pitches, durs=my_durs, pgm=pgm+1, is_drum=False)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "RANDOM PARAMETERS!\n", "- pitch center: 62\n", "- pitch range: 13\n", "- pulse: 148\n", "- rhythm: 0.019581088737275376\n", "- detune: 0.6259893271290293\n", "- repeat: 0.8847835388942795\n", "- memory: 10\n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] } }, { "output_type": "execute_result", "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 21 } ] }, { "cell_type": "markdown", "metadata": { "id": "K1_qYqIVjSSm", "colab_type": "text" }, "source": [ "## Numerically vs Perceptually different\n", "Yes, there are a whole lot of parameter combinations that are *numerically* different, but that doesn't mean they are *perceptually* different — that is, it doesn't means they'll actually *sound* all that different to us. This is a super important point when dealing with parametrics systems. Not every change makes a difference. We can imagine a space of all possible combinations of parameter values, but (possibly) large regions of this space are perceptually the same!\n" ] }, { "cell_type": "markdown", "metadata": { "id": "KGWErWjEmKlE", "colab_type": "text" }, "source": [ "## a GUI\n", "Think you can do better than random search by turning those knobs yourself? To make things easier, I've conveniently tucked the code away under a graphical user interface (GUI). We can forget about all the code and just worry about selecting parameters and *listening*. Adjust AMB parameters using sliders and hit run to generate music." ] }, { "cell_type": "code", "metadata": { "id": "H_5UmJqrJL7T", "colab_type": "code", "cellView": "form", "outputId": "14fb576a-1777-468d-e43b-fe731eceaa51", "colab": { "base_uri": "https://localhost:8080/", "height": 268 } }, "source": [ "#@title Anna's Music Box\n", "\n", "# choose parameters\n", "length = 9 #@param {type:\"slider\", min:1, max:99, step:1.0}\n", "pitch_center = 45 #@param {type:\"slider\", min:32, max:84, step:1.0}\n", "pitch_range = 3 #@param {type:\"slider\", min:0, max:36, step:1.0}\n", "pulse = 184 #@param {type:\"slider\", min:40, max:480, step:1.0}\n", "rhythm = 0.73 #@param {type:\"slider\", min:0, max:1, step:0.01}\n", "detune = 1 #@param {type:\"slider\", min:0, max:1, step:0.01}\n", "repeat = 0.82 #@param {type:\"slider\", min:0, max:1, step:0.01}\n", "memory = 5 #@param {type:\"slider\", min:1, max:10, step:1.0}\n", "pgm = 22 #@param {type:\"slider\", min:1, max:128, step:1.0}\n", "is_drums = True #@param {type:\"boolean\"}\n", "autoplay = False #@param {type:\"boolean\"}\n", "\n", "# run AMB\n", "my_pitches, my_durs = mai.amb(pitch_center=pitch_center, pitch_range=pitch_range, pulse=pulse, rhythm=rhythm, detune=detune, repeat=repeat, memory=memory, length=length)\n", "\n", "# let's see it\n", "mai.make_music_plot(pitches=my_pitches, durs=my_durs)\n", "\n", "# let's hear it\n", "mai.make_music(my_pitches, durs=my_durs, pgm=pgm, is_drum=is_drums, format='autoplay' if autoplay else 'inbrowser')" ], "execution_count": 0, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] } }, { "output_type": "execute_result", "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 25 } ] }, { "cell_type": "markdown", "metadata": { "id": "GY7mQ5H-UlMP", "colab_type": "text" }, "source": [ "## Multiple Voices? Heterophony\n", "AMB has four voices, or critters. The critters, however, are realtively independent. It's not as though one is the main voice and the other are accompaniment. This kind of a musical structure is called *heterophony*. Here's a version of AMB with multiple voices, or critters." ] }, { "cell_type": "code", "metadata": { "id": "JHFE7UiiUk8I", "colab_type": "code", "cellView": "form", "outputId": "6ac4e394-c25b-4525-d11e-ae69df1d99a9", "colab": { "base_uri": "https://localhost:8080/", "height": 75 } }, "source": [ "#@title Anna's Music Box\n", "\n", "# choose parameters\n", "length = 18 #@param {type:\"slider\", min:1, max:99, step:1.0}\n", "pitch_center = 52 #@param {type:\"slider\", min:32, max:84, step:1.0}\n", "pitch_range = 36 #@param {type:\"slider\", min:0, max:36, step:1.0}\n", "pulse = 201 #@param {type:\"slider\", min:40, max:480, step:1.0}\n", "rhythm = 0.57 #@param {type:\"slider\", min:0, max:1, step:0.01}\n", "detune = 0.24 #@param {type:\"slider\", min:0, max:1, step:0.01}\n", "repeat = 1 #@param {type:\"slider\", min:0, max:1, step:0.01}\n", "memory = 5 #@param {type:\"slider\", min:1, max:10, step:1.0}\n", "pgm = 13 #@param {type:\"slider\", min:1, max:128, step:1.0}\n", "num_critters = 4 #@param {type:\"slider\", min:1, max:16, step:1.0}\n", "is_drums = False #@param {type:\"boolean\"}\n", "autoplay = False #@param {type:\"boolean\"}\n", "\n", "# run AMB\n", "my_music = [mai.amb(pitch_center=pitch_center, \n", " pitch_range=pitch_range, \n", " pulse=pulse, rhythm=rhythm, \n", " detune=detune, \n", " repeat=repeat, \n", " memory=memory, \n", " length=length) \n", " for i in range(num_critters)]\n", "\n", "# combine multiple voices\n", "pitches = [x[0] for x in my_music]\n", "durs = [x[1] for x in my_music]\n", "\n", "# let's hear it\n", "mai.make_music_heterophonic(pitches, durs=durs, pgm=pgm, is_drum=is_drums, format='autoplay' if autoplay else 'inbrowser')" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 8 } ] } ] }