{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "Cacophony for the whole family\n", "==============================\n", "\n", "Allen Downey\n", "\n", "This is an example that demonstrates some of the features in the *Think DSP* library.\n", "\n", "It is inspired by the performance of a grade school band I witnessed recently. My goal is to simulate the sound of a beginner band.\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# Get thinkdsp.py\n", "\n", "import os\n", "\n", "if not os.path.exists('thinkdsp.py'):\n", " !wget https://github.com/AllenDowney/ThinkDSP/raw/master/code/thinkdsp.py" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, a function that translates from a MIDI number to a frequency:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "def midi_to_freq(midi_num):\n", " \"\"\"Converts MIDI note number to frequency.\n", "\n", " midi_num: int MIDI note number\n", " \n", " returns: float frequency in Hz\n", " \"\"\"\n", " x = (midi_num - 69) / 12.0\n", " freq = 440.0 * 2**x\n", " return freq" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now here's a randomized version that simulates three kinds of errors: poor tuning, playing the wrong note, and [popping an overtone](https://en.wikipedia.org/wiki/Overtone). Notice that it is possible to make all three errors." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "import random\n", "\n", "def random_freq(midi_num):\n", "\n", " # simulate poor tuning by adding gaussian noise to the MIDI number\n", " midi_num += random.gauss(0, 0.5)\n", " \n", " # one kid out of 10 plays the wrong note\n", " if random.random() < 0.1:\n", " midi_num += random.randint(-5, 5)\n", " \n", " freq = midi_to_freq(midi_num)\n", " \n", " # and one kid in 10 pops an overtone\n", " if random.random() < 0.1:\n", " freq *= random.randint(2, 5)\n", "\n", " return freq" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This function takes a MIDI number and duration and makes a Wave:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "from thinkdsp import SawtoothSignal\n", "\n", "def make_note(midi_num, duration, framerate=22050):\n", " \"\"\"Make a MIDI note with the given duration.\n", "\n", " midi_num: int MIDI note number\n", " duration: float seconds\n", " sig_cons: Signal constructor function\n", " framerate: int frames per second\n", "\n", " returns: Wave\n", " \"\"\"\n", " freq = random_freq(midi_num)\n", " signal = SawtoothSignal(freq)\n", " wave = signal.make_wave(duration, framerate=framerate)\n", " wave.apodize()\n", " return wave" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's test make_note. MIDI number 60 is middle C." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "note = make_note(60, 1.0)\n", "note.make_audio()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sounds good.\n", "\n", "Now we can make 10 notes and play them at the same time. Since Wave provides `__add__`, we can use `sum`:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "def make_ensemble(midi_num, duration):\n", " notes = [make_note(midi_num, duration) for i in range(10)]\n", " ensemble = sum(notes)\n", " ensemble.make_audio()\n", " return ensemble" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And we can test it with a middle C:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "c = make_ensemble(60, 1.0)\n", "c.make_audio()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Good, sounds like angry bees.\n", "\n", "And now, a rousing chorus of that old crowd favorite, _Hot Cross Buns_.\n", "\n", "Wave provides `__or__`, which concatenates notes, so we can use `reduce`:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from thinkdsp import Wave\n", "from functools import reduce\n", "\n", "midi_nums = [64, 62, 60, 64, 62, 60, 60, 60, 60, 60, 62, 62, 62, 62, 64, 62, 60]\n", "durations = [0.5, 0.5, 1.0, 0.5, 0.5, 1.0, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.5, 0.5, 1.0]\n", "\n", "waves = [make_ensemble(midi_num, duration) for midi_num, duration in zip(midi_nums, durations)]\n", "wave = reduce(Wave.__or__, waves)\n", "wave.make_audio()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And that brings a tear of pride to any parent's eye.\n", "\n", "On a more serious note, this example tells us something about how the ear interprets complex sounds with many tones and harmonics.\n", "\n", "Let's take a look at the spectrum of that middle C:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from thinkdsp import decorate\n", "\n", "spectrum = c.make_spectrum()\n", "spectrum.plot()\n", "decorate(xlabel='Frequency (Hz)', ylabel='Amplitude')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And we can zoom in on the first few harmonics:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "spectrum.plot(high=4000)\n", "decorate(xlabel='Frequency (Hz)', ylabel='Amplitude')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A few observations: \n", "\n", "1. The kids playing out of tune have a bigger effect on the harmonics, and less effect on the fundamental, so the ear can still pick out a clear pitch, and\n", "\n", "2. Some of the unintentional overtones overlap with the harmonics, so they change the timbre, but don't stick out as much as you might expect, \n", "\n", "3. The high harmonics are so spread out that they basically contribute white noise and don't affect the perceived pitch." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.2" } }, "nbformat": 4, "nbformat_minor": 1 }