{ "cells": [ { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [], "source": [ "from nbmultitask import ProcessWithLogAndControls\n", "from IPython.display import clear_output\n", "import multiprocessing as mp\n", "import matplotlib.pyplot as plt\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from time import sleep\n", "\n", "def fn(x):\n", " while True:\n", " print(x.value)\n", " x.value = x.value**1.01\n", " sleep(0.1)\n", "\n", "from multiprocessing import Value\n", "x = Value('f',2)\n", "task = ProcessWithLogAndControls(target=fn, args=(x,), name=\"exponential growth\")" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "#task.control_panel()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2.3297741413116455\n", "2.80667781829834\n" ] } ], "source": [ "task.start()\n", "time.sleep(2)\n", "print(x.value)\n", "time.sleep(2)\n", "print(x.value)\n", "task.stop()" ] }, { "cell_type": "code", "execution_count": 2, "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": "code", "execution_count": 68, "metadata": {}, "outputs": [], "source": [ "def test_func(selector):\n", " import sounddevice as sd\n", " import numpy as np\n", " import time\n", "\n", " tone1 = np.sin(np.linspace(0, 0.05 * 440 * 2*np.pi, int(0.05*44100), dtype=np.float32))\n", " tone2 = np.sin(np.linspace(0, 0.05 * 880 * 2*np.pi, int(0.05*44100), dtype=np.float32))\n", " ts1 = np.column_stack((tone1, tone1))\n", " ts2 = np.column_stack((tone2, tone2))\n", "\n", " sd.default.samplerate = 44100\n", " stream = sd.OutputStream(samplerate=44100, channels=2, dtype='float32')\n", " stream.start()\n", "\n", " latency = 0.25\n", " next_beat = time.time() + latency\n", " with open('sound_log.csv', 'w') as f:\n", " f.write(\"time,id\\n\")\n", "\n", " beats = 0\n", " while beats < 40:\n", " t0 = time.time()\n", " if t0 < next_beat:\n", " time.sleep(0.0001) # not to spin the wheels too much\n", " continue\n", "\n", " \n", " with open('sound_log.csv', 'a') as f:\n", " f.write(\",\".join([str(x) for x in (t0, 1)]) + \"\\n\")\n", " \n", " #sd.play(self.tone) # has underrun errors, maybe try blocking?\n", " if selector.value == 1:\n", " stream.write(ts1)\n", " else:\n", " stream.write(ts2)\n", " \n", " beats += 1\n", " next_beat += latency\n", " \n", " stream.stop()" ] }, { "cell_type": "code", "execution_count": 70, "metadata": { "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "ALSA lib pcm.c:8526:(snd_pcm_recover) underrun occurred\n", "ALSA lib pcm.c:8526:(snd_pcm_recover) underrun occurred\n", "ALSA lib pcm.c:8526:(snd_pcm_recover) underrun occurred\n", "ALSA lib pcm.c:8526:(snd_pcm_recover) underrun occurred\n", "ALSA lib pcm.c:8526:(snd_pcm_recover) underrun occurred\n", "ALSA lib pcm.c:8526:(snd_pcm_recover) underrun occurred\n", "ALSA lib pcm.c:8526:(snd_pcm_recover) underrun occurred\n", "ALSA lib pcm.c:8526:(snd_pcm_recover) underrun occurred\n", "ALSA lib pcm.c:8526:(snd_pcm_recover) underrun occurred\n", "ALSA lib pcm.c:8526:(snd_pcm_recover) underrun occurred\n", "ALSA lib pcm.c:8526:(snd_pcm_recover) underrun occurred\n", "ALSA lib pcm.c:8526:(snd_pcm_recover) underrun occurred\n", "ALSA lib pcm.c:8526:(snd_pcm_recover) underrun occurred\n", "ALSA lib pcm.c:8526:(snd_pcm_recover) underrun occurred\n" ] } ], "source": [ "selector = mp.Value('f', 0)\n", "#is_running = Value(c_bool, True)\n", "#sc = ProcessWithLogAndControls(target=sound_controller, args=(selector, is_running), name=\"sounds\")\n", "sc = ProcessWithLogAndControls(target=test_func, args=(selector,), name=\"foo\")\n", "sc.start()\n", "time.sleep(2)\n", "selector.value = 1\n", "time.sleep(2)\n", "sc.stop()" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [], "source": [ "sc.stop()" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [], "source": [ "ds = np.loadtxt('sound_log.csv', delimiter=',', skiprows=1)" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 58, "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(ds[:, 0]))" ] }, { "cell_type": "code", "execution_count": null, "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)\n", "\n", "def sound_controller(selector, is_running, latency=0.25):\n", " \"\"\"\n", " selector mp.Value object to set the sound to be played\n", " is_running mp.Value object to stop the loop\n", " \"\"\"\n", " print('Loading SC..')\n", " \n", " 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", "\n", " sounds = {\n", " 0: np.column_stack((silence, silence)),\n", " 1: np.column_stack((tone1, tone1)),\n", " 2: np.column_stack((tone2, tone2))\n", " }\n", "\n", " stream = sd.OutputStream(samplerate=44100, channels=2, dtype='float32')\n", " stream.start()\n", " \n", " print('Creating sounds..')\n", " \n", " next_beat = time.time() + latency\n", " beat_times = collections.deque(maxlen=10000)\n", "\n", " \n", " while is_running.value:\n", " print('Running loop..')\n", " \n", " t0 = time.time()\n", " if t0 < next_beat:\n", " continue\n", "\n", " beat_times.append(t0)\n", " #sd.play(self.tone) # has underrun errors, maybe try blocking?\n", " stream.write(sounds[int(selector.value)])\n", " next_beat += latency\n", " \n", " stream.stop()\n", " print('Sound controller stopped')" ] } ], "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": 4 }