{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "6c693209", "metadata": {}, "outputs": [], "source": [ "import numpy as np # Import numpy module\n", "import sounddevice as sd # Import sounddevice module for \"real-time\" sound playback\n", "import os, time\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 2, "id": "19bdae6a", "metadata": { "scrolled": false }, "outputs": [], "source": [ "# Set sample rate for audio output\n", "sd.default.samplerate = 44100\n", "\n", "# Audio stream\n", "stream = sd.OutputStream(samplerate=sd.default.samplerate, channels=2, dtype='float32')" ] }, { "cell_type": "code", "execution_count": 3, "id": "6863eedc", "metadata": {}, "outputs": [], "source": [ "def get_pure_tone(freq, duration, sample_rate=44100):\n", " x = np.linspace(0, duration * freq * 2*np.pi, int(duration*sample_rate), dtype=np.float32)\n", " return np.sin(x)" ] }, { "cell_type": "markdown", "id": "cda62a58", "metadata": {}, "source": [ "### List available devices" ] }, { "cell_type": "code", "execution_count": 5, "id": "a5504f48", "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ " 0 HDA Intel PCH: CX20632 Analog (hw:0,0), ALSA (2 in, 2 out)\n", " 1 HDA Intel PCH: CX20632 Alt Analog (hw:0,2), ALSA (2 in, 0 out)\n", " 2 HDA Intel PCH: HDMI 0 (hw:0,3), ALSA (0 in, 8 out)\n", " 3 HDA Intel PCH: HDMI 1 (hw:0,7), ALSA (0 in, 8 out)\n", " 4 HDA Intel PCH: HDMI 2 (hw:0,8), ALSA (0 in, 8 out)\n", " 5 HDA Intel PCH: HDMI 3 (hw:0,9), ALSA (0 in, 8 out)\n", " 6 HDA Intel PCH: HDMI 4 (hw:0,10), ALSA (0 in, 8 out)\n", " 7 HDA NVidia: HDMI 0 (hw:1,3), ALSA (0 in, 8 out)\n", " 8 HDA NVidia: HDMI 1 (hw:1,7), ALSA (0 in, 2 out)\n", " 9 HDA NVidia: HDMI 2 (hw:1,8), ALSA (0 in, 8 out)\n", " 10 HDA NVidia: HDMI 3 (hw:1,9), ALSA (0 in, 8 out)\n", " 11 HDA NVidia: HDMI 4 (hw:1,10), ALSA (0 in, 8 out)\n", " 12 USB Device 0x46d:0x821: Audio (hw:2,0), ALSA (2 in, 0 out)\n", " 13 sysdefault, ALSA (128 in, 128 out)\n", " 14 front, ALSA (0 in, 2 out)\n", " 15 surround40, ALSA (0 in, 2 out)\n", " 16 surround51, ALSA (0 in, 2 out)\n", " 17 surround71, ALSA (0 in, 2 out)\n", " 18 hdmi, ALSA (0 in, 8 out)\n", " 19 samplerate, ALSA (128 in, 128 out)\n", " 20 speexrate, ALSA (128 in, 128 out)\n", " 21 pulse, ALSA (32 in, 32 out)\n", " 22 upmix, ALSA (8 in, 8 out)\n", " 23 vdownmix, ALSA (6 in, 6 out)\n", " 24 dmix, ALSA (0 in, 2 out)\n", "* 25 default, ALSA (32 in, 32 out)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sd.query_devices()" ] }, { "cell_type": "code", "execution_count": 6, "id": "b5c1ccbe", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[25, 25]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sd.default.device # input, output" ] }, { "cell_type": "markdown", "id": "7ff264f8", "metadata": {}, "source": [ "### Play pure tone of a sample frequency" ] }, { "cell_type": "code", "execution_count": 8, "id": "b8de8497", "metadata": {}, "outputs": [], "source": [ "freq = 440 # in Hz\n", "duration = 1 # in sec\n", "sample_rate = sd.default.samplerate # usually 44100\n", "volume = 0.5 # percent 0 - 1\n", "\n", "sound = get_pure_tone(freq, duration, sample_rate) * volume\n", "\n", "stream.start()\n", "stream.write(get_pure_tone(freq, duration, sample_rate) * volume)\n", "stream.stop()" ] }, { "cell_type": "code", "execution_count": 7, "id": "f22e0b7d", "metadata": {}, "outputs": [], "source": [ "duration = 0.2 # in sec\n", "volume = 0.5 # percent 0 - 1\n", "\n", "# C-major scale frequencies\n", "C_major = (261, 293, 329, 349, 392, 440, 494, 523)\n", "\n", "stream.start()\n", "for freq in C_major:\n", " x = np.linspace(0, duration * freq * 2*np.pi, int(duration * sd.default.samplerate), dtype=np.float32)\n", " pure_tone = np.sin(x)\n", " stream.write(pure_tone * volume)\n", " \n", "stream.stop()" ] }, { "cell_type": "code", "execution_count": 12, "id": "4dab0ea9", "metadata": {}, "outputs": [], "source": [ "# play different speakers with play\n", "sd.play(sound, mapping=[2]) # blocking=False by default" ] }, { "cell_type": "code", "execution_count": 10, "id": "81fcd1e9", "metadata": {}, "outputs": [], "source": [ "# play different speakers with stereo array and Stream\n", "stereo = np.column_stack((sound, sound))\n", "left = np.column_stack((sound, np.zeros(len(sound), dtype=np.float32)))\n", "right = np.column_stack((np.zeros(len(sound), dtype=np.float32), sound))\n", "\n", "stream.start()\n", "stream.write(right)\n", "stream.stop()" ] }, { "cell_type": "markdown", "id": "1b83ab86", "metadata": {}, "source": [ "### Plot pure tone" ] }, { "cell_type": "code", "execution_count": 9, "id": "427da2ad", "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "A_pure_tone = get_pure_tone(440, 1)\n", "plt.plot(np.linspace(0, 1000*(500./44100.), 500), A_pure_tone[:500]) # first 500 samples" ] }, { "cell_type": "code", "execution_count": null, "id": "b71db3e2", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 22, "id": "f2e0104c", "metadata": {}, "outputs": [], "source": [ "tone1 = get_pure_tone(440, 0.05, 44100) * 0.5\n", "tone2 = get_pure_tone(880, 0.05, 44100) * 0.5\n", "silence = np.zeros(len(tone1), dtype='float32')\n", "silence = np.zeros(44, dtype='float32')\n", "\n", "tone1_stereo = np.column_stack((tone1, tone1))\n", "tone2_stereo = np.column_stack((tone2, tone2))\n", "silence_stereo = np.column_stack((silence, silence))\n", "\n", "blocks = int(latency / pulse_duration)\n", "sounds = {\n", " 0: np.concatenate([silence_stereo for x in range(blocks)]),\n", " 1: np.concatenate([tone1_stereo] + [silence_stereo for x in range(blocks - 1)]),\n", " 2: np.concatenate([tone2_stereo] + [silence_stereo for x in range(blocks - 1)])\n", "}\n", "\n", "latency = 0.25\n", "pulse_duration = 0.05\n", "\n", "stream = sd.OutputStream(samplerate=sd.default.samplerate, channels=2, dtype='float32')\n", "stream.start()\n", "\n", "t_start = time.time()\n", "next_beat = time.time() + latency\n", "while time.time() < t_start + 2:\n", " t0 = time.time()\n", " if t0 < next_beat:\n", " #time.sleep(0.0001) # not to spin the wheels too much\n", " #stream.write(sounds[0]) # silence\n", " if stream.write_available > 0:\n", " stream.write(silence_stereo)\n", " continue\n", "\n", " #stream.write(sounds[1])\n", " stream.write(tone1_stereo)\n", " next_beat += latency\n", " \n", "stream.stop()" ] }, { "cell_type": "code", "execution_count": 17, "id": "8ce68442", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "blocks" ] }, { "cell_type": "code", "execution_count": 23, "id": "035cba14", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(np.diff(np.array(fps)))" ] }, { "cell_type": "code", "execution_count": 25, "id": "c4b4eef1", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0.25000024, 0.25000024, 0.25000024, 0.25000024, 0.25000024,\n", " 0.25000024, 0.25000024, 0.25000024, 0.25000024, 0.25000024,\n", " 0.25000024, 0.25000024, 0.25000024, 0.25000024, 0.25000024,\n", " 0.25000024, 0.25000024, 0.25000024, 0.25000024, 0.25000048,\n", " 0.25000024, 0.25000024, 0.25000024, 0.25000024, 0.25000024,\n", " 0.25000024, 0.25000024, 0.25000024, 0.25000024, 0.25000024,\n", " 0.25000024, 0.25000024, 0.25000024, 0.25000024, 0.25000024,\n", " 0.25000024, 0.25000024, 0.25000024])" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.diff(np.array(fps))" ] }, { "cell_type": "code", "execution_count": null, "id": "5e3822f8", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.5" } }, "nbformat": 4, "nbformat_minor": 5 }