music/waves.ipynb

275 lines
130 KiB
Text
Raw Normal View History

2018-03-08 08:09:39 -08:00
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
2018-03-08 08:09:39 -08:00
"outputs": [],
"source": [
"import matplotlib\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# Show plots inline.\n",
"%matplotlib inline\n",
"\n",
"# Number of harmonics to include in subsequent plots.\n",
"Harmonics = 10\n",
"# Time in seconds.\n",
"Time = 2.0\n",
"# Plot resolution.\n",
"Steps = 200"
]
},
{
"cell_type": "code",
2018-03-08 13:41:31 -08:00
"execution_count": 42,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
2018-03-08 08:09:39 -08:00
"# Array of step values.\n",
"def time_space(sec=Time, samples=Steps):\n",
" '''An array of equally spaced samples over a period of time.'''\n",
" # One extra sample to also include the endpoint.\n",
" return np.linspace(0, sec, num=samples + 1)\n",
"\n",
"def sample_rate(sec=Time, samples=Steps):\n",
" '''Sampling rate in samples per second.'''\n",
" return float(samples + 1) / float(sec)\n",
"\n",
"def sample_spacing(sec=Time, samples=Steps):\n",
" '''Time between samples.'''\n",
" return float(sec) / float(samples + 1)\n",
2018-03-08 08:09:39 -08:00
"\n",
"def frequency_spectrum(data):\n",
" '''Perform an FFT on `data`.'''\n",
" # Get the signal frequencies.\n",
" fft = np.abs(np.fft.fft(data))\n",
2018-03-08 08:09:39 -08:00
" \n",
" # Get the frequencies for a DFT plot (this doesn't depend on the actual signal) based on the \n",
" # spacing of our samples.\n",
" freqs = np.fft.fftfreq(len(fft), d=sample_spacing())\n",
2018-03-08 08:09:39 -08:00
" \n",
" return freqs, fft\n",
"\n",
"def plot_signal_and_spectrum(domain, data):\n",
" '''Plot the signal and spectrum in a stacked plot.'''\n",
2018-03-08 13:41:31 -08:00
" plt.figure(figsize=(10,6))\n",
" plt.subplot(211)\n",
" plt.axhline(color='k', linewidth=0.75)\n",
" plt.plot(domain, data)\n",
2018-03-08 08:09:39 -08:00
" \n",
" freqs, mags = frequency_spectrum(data)\n",
2018-03-08 13:41:31 -08:00
" num_freqs = Harmonics * 2\n",
" plt.subplot(212)\n",
" plt.xticks(range(num_freqs))\n",
" plt.plot(freqs[:num_freqs], mags[:num_freqs], 'x')"
2018-03-08 08:09:39 -08:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Basic Waves"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Sine Wave\n",
"\n",
"Sine waves are easy. 😁 The have a single frequency, and no harmonics."
]
},
{
"cell_type": "code",
2018-03-08 13:41:31 -08:00
"execution_count": 43,
2018-03-08 08:09:39 -08:00
"metadata": {},
"outputs": [
{
"data": {
2018-03-08 13:41:31 -08:00
"image/png": "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
2018-03-08 08:09:39 -08:00
"text/plain": [
2018-03-08 13:41:31 -08:00
"<Figure size 720x432 with 2 Axes>"
2018-03-08 08:09:39 -08:00
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Sine wave.\n",
"\n",
"def sine(domain, freq=1.0):\n",
" return np.sin(2.0 * np.pi * freq * domain)\n",
"\n",
"wave = sine(time_space())\n",
"plot_signal_and_spectrum(time_space(), wave)"
2018-03-08 08:09:39 -08:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Saw Wave\n",
"\n",
"Saw waves consist of every integer harmonic _n_ above the fundamental frequency, where that harmonic's amplitude is n<sup>-1</sup>."
]
},
{
"cell_type": "code",
2018-03-08 13:41:31 -08:00
"execution_count": 30,
2018-03-08 08:09:39 -08:00
"metadata": {},
"outputs": [
{
"data": {
2018-03-08 13:41:31 -08:00
"image/png": "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
2018-03-08 08:09:39 -08:00
"text/plain": [
2018-03-08 13:41:31 -08:00
"<Figure size 720x432 with 2 Axes>"
2018-03-08 08:09:39 -08:00
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def saw(domain, freq=1):\n",
" harmonics = np.asarray([1.0 / h * sine(domain, freq=freq * h) for h in range(1, Harmonics)])\n",
" wave = np.sum(harmonics, axis=0)\n",
" return wave\n",
"\n",
"wave = saw(time_space())\n",
"plot_signal_and_spectrum(time_space(), wave)"
2018-03-08 08:09:39 -08:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You can invert a saw wave to get what many synths call a \"blade\" wave. Instead of gradually falling and then spiking up, blade waves gradually rise and the sharply fall."
]
},
{
"cell_type": "code",
2018-03-08 13:41:31 -08:00
"execution_count": 31,
2018-03-08 08:09:39 -08:00
"metadata": {},
"outputs": [
{
"data": {
2018-03-08 13:41:31 -08:00
"image/png": "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
2018-03-08 08:09:39 -08:00
"text/plain": [
2018-03-08 13:41:31 -08:00
"<Figure size 720x432 with 2 Axes>"
2018-03-08 08:09:39 -08:00
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_signal_and_spectrum(time_space(), -1 * saw(time_space()))"
2018-03-08 08:09:39 -08:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Square Wave\n",
"\n",
"Square waves are made of every other harmonic above the fundamental frequency. Again, the amplitude of each harmonic _n_ is _1 / n_."
]
},
{
"cell_type": "code",
2018-03-08 13:41:31 -08:00
"execution_count": 32,
2018-03-08 08:09:39 -08:00
"metadata": {},
"outputs": [
{
"data": {
2018-03-08 13:41:31 -08:00
"image/png": "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
2018-03-08 08:09:39 -08:00
"text/plain": [
2018-03-08 13:41:31 -08:00
"<Figure size 720x432 with 2 Axes>"
2018-03-08 08:09:39 -08:00
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def square(domain, freq=1):\n",
" harmonics = np.asarray([1.0 / h * sine(domain, freq=freq * h) for h in range(1, Harmonics, 2)])\n",
" wave = np.sum(harmonics, axis=0)\n",
" return wave\n",
"\n",
"wave = square(time_space())\n",
"plot_signal_and_spectrum(time_space(), wave)"
2018-03-08 08:09:39 -08:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Triangle Wave"
]
},
{
"cell_type": "code",
2018-03-08 13:41:31 -08:00
"execution_count": 33,
2018-03-08 08:09:39 -08:00
"metadata": {},
"outputs": [
{
"data": {
2018-03-08 13:41:31 -08:00
"image/png": "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
2018-03-08 08:09:39 -08:00
"text/plain": [
2018-03-08 13:41:31 -08:00
"<Figure size 720x432 with 2 Axes>"
2018-03-08 08:09:39 -08:00
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def triangle(domain, freq=1):\n",
" def label(i):\n",
" return 2. * i + 1.\n",
" harmonics = np.asarray([((-1) ** h) * (label(h) ** -2) * sine(domain, freq=freq * label(h)) for h in range(Harmonics)])\n",
" wave = np.sum(harmonics, axis=0)\n",
" return wave\n",
"\n",
"wave = triangle(time_space())\n",
"plot_signal_and_spectrum(time_space(), wave)"
2018-03-08 08:09:39 -08:00
]
},
{
"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.6.1"
}
},
"nbformat": 4,
"nbformat_minor": 2
}