{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## ThinkDSP\n",
"\n",
"This notebook contains code examples from Chapter 1: Sounds and Signals\n",
"\n",
"Copyright 2015 Allen Downey\n",
"\n",
"License: [Creative Commons Attribution 4.0 International](http://creativecommons.org/licenses/by/4.0/)\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": 2,
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"from thinkdsp import decorate"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Read a wave\n",
"\n",
"`read_wave` reads WAV files. The WAV examples in the book are from freesound.org. In the contributors section of the book, I list and thank the people who uploaded the sounds I use."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"if not os.path.exists('92002__jcveliz__violin-origional.wav'):\n",
" !wget https://github.com/AllenDowney/ThinkDSP/raw/master/code/92002__jcveliz__violin-origional.wav"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"from thinkdsp import read_wave\n",
"\n",
"wave = read_wave('92002__jcveliz__violin-origional.wav')"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
" \n",
" "
],
"text/plain": [
""
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"wave.make_audio()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"I pulled out a segment of this recording where the pitch is constant. When we plot the segment, we can't see the waveform clearly, but we can see the \"envelope\", which tracks the change in amplitude during the segment."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"