musicmouse/espmusicmouse/host_driver/effect_debug.ipynb

241 lines
16 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 10,
"id": "b5d8a856-d466-4102-8bfc-2a9014ab0767",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import importlib.util\n",
"from ipywidgets import interactive\n",
"\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "c4fc1c81-3f08-4cd8-bb38-3566b033318a",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 11,
"id": "39d0f384-6533-41e0-8093-b1b2a9d59608",
"metadata": {},
"outputs": [],
"source": [
"def load_test(path):\n",
" spec = importlib.util.spec_from_file_location(\"test\", path)\n",
" module = importlib.util.module_from_spec(spec)\n",
" spec.loader.exec_module(module)\n",
" for sym in ['r', 'g', 'b', 'h', 's', 'v']:\n",
" a = np.array(getattr(module, sym))\n",
" setattr(module, sym, a)\n",
" return module\n",
"\n",
"path = \"/home/martin/code/musicmouse/espmusicmouse/.pio/build/native/swipe.py\"\n",
"path = \"/home/martin/code/musicmouse/espmusicmouse/.pio/build/native/reverse_swipe.py\"\n",
"res = load_test(path)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "bb3bc44d-2523-43d5-87eb-2cded8d0d8c2",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "09617018b02c449d912ef07757fcc8c6",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"interactive(children=(IntSlider(value=99, description='t', max=199), Output(layout=Layout(height='350px'))), _…"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def plot_v(t):\n",
" plt.figure(2)\n",
" plt.ylim(-0.1, 1.1) \n",
" plt.plot(res.v[t], label=f\"v at {t}\")\n",
" plt.legend()\n",
" plt.show()\n",
"\n",
"interactive_plot = interactive(plot_v, t=(0, len(res.v)-1))\n",
"output = interactive_plot.children[-1]\n",
"output.layout.height = '350px'\n",
"interactive_plot"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "2ef27efb-b021-42b7-8cb5-c84add88ab17",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2,\n",
" 2, 1, 1, 1, 1, 1, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
" 0, 0, 0, 0, 0, 0, 1])"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"res.r[70]"
]
},
{
"cell_type": "markdown",
"id": "817d4771-f210-48e9-a342-0b0d238d0e11",
"metadata": {},
"source": [
"## Bell Curve"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "763b5ffe-4224-4dec-a147-40be2aaa0d41",
"metadata": {},
"outputs": [],
"source": [
"def bell_curve_approximation_old(x, inverse_width):\n",
" if x < 0:\n",
" x = -x\n",
" \n",
" nx = x * inverse_width * 4\n",
" if nx > 2:\n",
" return 0\n",
" \n",
" x2 = nx * nx\n",
" x3 = x2 * nx\n",
" res = 1 + 0.2760695894 * x3 - 0.8021391 * x2\n",
" \n",
" return res if res > 0 else 0\n",
"\n",
"\n",
"def bell_curve_approximation(x, inverse_width): \n",
" nx = x * inverse_width * 4\n",
" x2 = nx * nx\n",
" x3 = x2 * nx\n",
" res = 1 + 0.2760695894 * x3 - 0.8021391 * x2\n",
" \n",
" return res if res > 0 else 0\n",
"\n",
"# // Function start at 0 (x=0) and goes smoothly up to 1 and arrives 1 at x=width\n",
"# // inverse width has to be 1 / width (should be cached outside)\n",
"def step_function(x, width, inverse_width):\n",
" if x < 0:\n",
" return 0\n",
" if x >= width:\n",
" return 1\n",
" bell_inv_width = inverse_width * 0.5\n",
" nx = (-x + width) * bell_inv_width * 4\n",
" x2 = nx * nx\n",
" x3 = x2 * nx\n",
" res = 1 + 0.2760695894 * x3 - 0.8021391 * x2\n",
" return res"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "be193428-3fec-4a2f-9903-4dbfa4ad19e3",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 15,
"id": "de8b9ee1-6232-4cab-8a1a-b62ec723b4f4",
"metadata": {},
"outputs": [],
"source": [
"x = np.linspace(-1, 10, 20)\n",
"y = np.array([step_function(x_i, 8, 1 / 8) for x_i in x])"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "db9bddcc-ae89-462c-b8f4-56384a36a1df",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7fa511346af0>]"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.plot(x, y)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "ad451aa5-8645-4432-a0e8-821eb4826f19",
"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.10"
}
},
"nbformat": 4,
"nbformat_minor": 5
}