Skip to content

Instantly share code, notes, and snippets.

@cr1901
Created February 20, 2020 03:37
Show Gist options
  • Save cr1901/ff8675f20f0ea26e63c52cb8544565eb to your computer and use it in GitHub Desktop.
Save cr1901/ff8675f20f0ea26e63c52cb8544565eb to your computer and use it in GitHub Desktop.
FM Synthesis Class Proof-of-Concept
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 116,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline\n",
"\n",
"import numpy as np\n",
"import scipy.signal as sp\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 130,
"metadata": {},
"outputs": [],
"source": [
"class OpCompose:\n",
" def __init__(self, carr, mod):\n",
" self.carr = carr\n",
" self.mod = mod\n",
" \n",
" def __call__(self, op):\n",
" return OpCompose(self, op)\n",
" \n",
" def __add__(self, op):\n",
" return OpAdd(self, op)\n",
" \n",
" def __getitem__(self, idx):\n",
" if isinstance(idx, tuple):\n",
" return self.mod[(idx[0], self.carr[idx])]\n",
" elif isinstance(idx, int):\n",
" return self.mod[(idx, self.carr[idx])]\n",
" elif isinstance(idx, slice):\n",
" return [self[i] for i in range(idx.stop)[idx]]\n",
" else:\n",
" raise ValueError\n",
" \n",
"class OpAdd:\n",
" def __init__(self, carr, mod):\n",
" self.carr = carr\n",
" self.mod = mod\n",
"\n",
" def __call__(self, op):\n",
" return OpCompose(self, op)\n",
" \n",
" def __add__(self, op):\n",
" return OpAdd(self, op)\n",
" \n",
" def __getitem__(self, idx):\n",
" if isinstance(idx, (tuple, int)):\n",
" return self.carr[idx] + self.mod[idx]\n",
" elif isinstance(idx, slice):\n",
" return [self.carr[i] + self.mod[i] for i in range(idx.stop)[idx]]\n",
" else:\n",
" raise ValueError \n",
"\n",
"class Operator:\n",
" def __init__(self, freq):\n",
" self.freq = freq\n",
" \n",
" def __call__(self, op):\n",
" return OpCompose(self, op)\n",
" \n",
" def __add__(self, op):\n",
" return OpAdd(self, op)\n",
" \n",
" def __getitem__(self, idx):\n",
" # print(idx)\n",
" if isinstance(idx, tuple):\n",
" return np.sin(2*np.pi*(idx[0]/self.freq) + idx[1])\n",
" elif isinstance(idx, int):\n",
" return np.sin(2*np.pi*idx/self.freq)\n",
" elif isinstance(idx, slice):\n",
" return [self[i] for i in range(idx.stop)[idx]]\n",
" else:\n",
" raise ValueError"
]
},
{
"cell_type": "code",
"execution_count": 136,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXYAAAD4CAYAAAD4k815AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nO3dd3hUx9nw4d/sqqOGkISEkFCnI4roiA7GNi7EcS9xSRz3mtcpzmv7TfmS2Inj2HHsOI7jEveCbWxc6L13hGhqNCGJLglUd74/RsICS6js2T17due+Ll0L0u6Zh+XsozlzZp4RUko0TdM072EzOwBN0zTNWDqxa5qmeRmd2DVN07yMTuyapmleRid2TdM0L+NnRqPR0dEyOTnZjKY1TdMsa8OGDUeklDFtPc+UxJ6cnMz69evNaFrTNM2yhBDF7XmeHorRNE3zMjqxa5qmeRmd2DVN07yMTuyapmleRid2TdM0L2NYYhdC2IUQm4QQXxh1TE3TNK3jjOyxPwjkGXg8TdM0rRMMmccuhOgJXAr8HnjEiGNagqMBildAyVaoPwPhCZCcA5GJZkemeYuj+VC0DCrLIDAcEoZCQjbY9Ciq1jqjFig9BzwGhLX2BCHEncCdAElJSQY1a5KGetj4Oix5BioPf//nmRfD9N9CdIbbQ9O8xIEN8O2vYd/K7/+sawpMeQL6zwIh3B+b5vGcTuxCiJlAmZRygxBiYmvPk1K+ArwCkJ2dbd3dPSpK4YNbYP9q6DUWLv4TpIyHgFA4lg+5n8KqF+Efo+HSP8OwW82OWLMShwOW/BGW/AlCu8O030CfmRCZBKePQcFiWPk8fHQb5H4CV74Ega32pzQfJZzdQUkI8QfgZqAeCALCgU+klDe19prs7GxpyZICxwrg9cvgzDGY+RwMuqblHlNlGcz+KeQvhLEPwdSndM9Ka1tDvTpvtn8EWTfAJU+3nLQdDbDq7zD/KYjtDz/6HEKi3B6u5n5CiA1Syuy2nuf0QJ2U8pdSyp5SymTgOmDhhZK6ZZ08AG9cDnWn4favIeva1pN1aCzc+BEMuw1WPAeL/+jeWDXrkRI+v08l9SlPwpX/aL0nbrPD2Afhhg/hyG5460qoPuneeDWPpu/AtEddNbx/E5w5ATfPhvistl9js8Olz8Lgm9Sl9baPXB+nZl0rnoMt78LEX0HOI+27wsuYCtf+F0pzYfZdahhH0zA4sUspF0spZxp5TI/w9S/g0CaY9TL0GNz+19lsMPOvkDgKPr8fyvRsUK0FhUthwW/UzdAJj3XstZnTYfrvYddcWP6sa+LTLEf32Nuy80vY8B916du3E7+z/ALgmjfBPxg+vVuNo2pak+qT8Mmd0C0dLn+hc/diRv4UBlwFi/8Ah7cZH6NmOTqxX0j1SfjyUeg+ACb/b+ePE9YdLv2L6vWvfN64+DTrm/ckVJbCrH92fnaLEHDJnyE4Cj69BxrqjI1Rsxyd2C9k/lPqQ3f582D3d+5Y/WdBvytUr+pYoSHhaRZXtEJdDY66Ry08ckZIFMx8Fg5vhdX/MCY+zbJ0Ym/N4e2w/j8w4qeQMMyYY874E9j81C8Mzbc5HPD1zyEiESb9yphj9r0MMi6CpX+GqiPGHFOzJJ3YWzP/SQiKgIk/N+6Y4fFqXvuOT6F4lXHH1axn24dqPHzKkxDQxbjjTv8d1FbBov9n3DE1y9GJvSX5i2DvfBj/Mwjuauyxx9wPYT3UcnEnF4dpFlVXDQt/q6bNDrjK2GPHZMLwO9QQz5E9xh5bswyd2M8nJSz6vbpEHnGn8ccPCFFXAQfXq5Wpmu/Z9Bac3K/KBbiimNf4x8AeCMv+YvyxNUvQif18RcvhwDo1vdEv0DVtZN0A4T1VPRDda/ctDXWw4m+QOBJSJrimjdAY1Wvf+oGqDqn5HJ3Yz7fsL9AlFoa4sCqCXwDkPAz710DhEte1o3mebR+q3nrOo66tHzTmfjWTa5letOSLdGJv7uBGKFgEo+9VC4pcacjNEBoHK/S8dp/hcMDyv6p1ERnTXdtWWBwMvQW2vg8VLZSW1ryaTuzNrfibmgmTfbvr2/ILhOE/hvwFUL7b9e1p5tv9lSraNe5h91T7HHkXOOph3b9d35bmUXRib3LyIOTNUb2coHD3tJl9m7rJteZl97SnmWvNP9UuW/2udE973dIgcwasf03NxNF8hk7sTTa+AdIB2Xe4r80u0TDwalXV78xx97WruV/5bnU/Jfs2sBu1cVk7jLoLTh+B7R+7r03NdDqxA9TXwobXIWMaRKW4t+1Rd6ka7xvfdG+7mnut/zfY/GHoj9zbbsoEiO0Hq1/SM7B8iE7sADvnqJoww3/i/rbjBkLSGJXY9QfPO9VUwuZ3oP+VahMWdxICRvwESrfBoY3ubVszjU7sAOteg67JkD7VnPaH3gxH98I+XWbAK23/CGpOmdNxALW61S8YNr5lTvua2zmd2IUQQUKItUKILUKIXCHE/xkRmNscL4Li5Wr6oStWAbZHvysgIEwPx3irze9ATB9IHGFO+0ER6mph20eqjozm9YzIZDXAZCllFjAYmCGEGGXAcd1jy3uAgKzrzIshoAsMvApyP9V7V3qbo/lqIVrW9eZuaD7kZqitgB2fmReD5jZGbGYtpZSVjX/1b/yyxmCxlGpGSsp4iOhpbixDb4H6M3r2grfZ8i4IGwy61tw4eo2BqDQ9HOMjDBl7EELYhRCbgTJgnpRyTQvPuVMIsV4Isb68vNyIZp23b5Uaihl8g9mRQI+havbC5nfMjkQzisOhrghTJ6mSzWYSQpXJ2LcSjhWYG4vmcoYkdillg5RyMNATGCGEGNDCc16RUmZLKbNjYmKMaNZ5m9+GgFC1QYHZhFBz2g+sU79sNOsrWqbqwnhCxwHU+QX6qtAHGHq3UEp5AlgEzDDyuC5RexpyP2u8cWngRgfOaKrNrT943mHLuxAYDn0uNTsSJTIRkkarm6h6aq1XM2JWTIwQIrLxz8HANGCns8d1ud1fq5tJZt40PV/XXqqc67aPzI5Ec1bdGVWiot8Vri8o1xEDroLynVCaa3YkmgsZ0WOPBxYJIbYC61Bj7F8YcFzX2vGpKs/ba6zZkZxr4NVQtkN/8Kxu7wKorYQBPzA7knP1nwXCrubWa17LiFkxW6WUQ6SUg6SUA6SUvzEiMJeqqYTd36relM1udjTn6nel+uDpXru15c6G4ChIHm92JOfqEg1pk2Dbx3o4xov55srTPd+oqYX9Z5kdyfeFxkDqRDXOrj941lR3BnZ9Bf0ud2/Br/YaeDWc3Af715odieYivpnYc2erTS6SPHQd1YCr4ESxru1hVXvmQV2VZ3YcQN3MtQeqz4HmlXwvsddUqA+eJw7DNOl9sRqOyfP8WxVaC3JnQ0g09BpndiQtCwyDtMmw8wt9VeilfC+x7/4G6qs9tzcFEBIFKTmQ97n+4FlN7Wk148pTh2Ga9L1MzbEv2Wx2JJoL+F5i3/GZGoZJHGl2JBfWZ6aq+Fi+y+xItI7IX6Dq67trl6TOOntVOMfsSDQX8K3EXletpqH1ucS8So7t1WemetypP3iWsnMuBEV63jTa84VEQfJYPdznpTw8uxmscKm6qdXbQ1YCXkh4PPQcrntUVtJQr4ZhMi/y7GGYJn0ugyO79GbqXsi3Evuuuao2TEqO2ZG0T9/LoGQLnNhndiRaexxYC2eOqWEOK2gqdaCvCr2O7yR2h0PNLU6bDH6BZkfTPk3DMfpy2Rp2fgn2APN24uqoiARIyNZXhV7IdxJ7ySaoPOw5BZnao1saxPRVl/eaZ5NSXREm56jphFbR5xI4tAkqDpsdiWYg30nsO+eqWQAZ082OpGMyp0PxCqg+ZXYk2oUc2a3qnPe5xOxIOibjIvW451tz49AM5TuJfddXqmRpSJTZkXRMxkXgqIeCRWZHol3IrrnqMdMi4+tNuveH8AS1vkPzGr6R2I8XQVmudW5qNZc4Um1GrD94nm3nXIgfrMatrUQINYsnfxHU15gdjWYQ30jsuxrHqK2Y2O1+6mbcnm/VDWDN81QdUTtfWfH8AnVVWFelhvw0r+AbiX3vfLWRb7c0syPpnMwZUFWubgBrnid/ISCtd/+mScp48AtSpaw1r+D9ib3ujNp7MmOa2ZF0XvpUtdO9Ho7xTHvmqaJf8YPNjqRzAkJUct/9ta5N5CWM2BovUQixSAixQwiRK4R40IjADFO8QhX9ssrc4paERKlVqDqxex6HQ9WHSZ/i+WUqLiRjOhwvVPWJNMsz4kysBx6VUvYDRgH3CiH6GXBcY+yZry4zkz20hGp7ZV6kKvHp+caepWQTnD5q7Y4DqPMLdOfBSxixNV6JlHJj458rgDzAc6YG7J2vCjJ50obCndE0frt3vrlxaOfauwAQakWzlUUmqcVwej67VzD02lEIkQwMAda08LM7hRDrhRDry8vLjWy2dceL4Ogea4+vN+k+AEK7N96o0zzGnnnQY4jaS9Tq0qfAvtWqprxmaYYldiFEKPAx8JCU8nvLJKWUr0gps6WU2TExMUY1e2FNvVurXyaDmm+cNlnNN9bTHj3D6WNwcL13nF+gzq+GGiheaXYkmpMMSexCCH9UUn9bSvmJEcc0xJ75ENkLuqWbHYkx0iar6oGHt5gdiQZqNbB0eMcVIUCvMWovVH1VaHlGzIoRwL+BPCnls86HZJD6GlV/PX2q6u16g9RJ6nHvAnPj0JS9C9SmGgnDzI7EGP7BKrnn6/PL6ozosY8FbgYmCyE2N36ZXwlp3yq1ms5belMAoTEQN0gNx2jmcjjUUF/aZM/dFL0z0qdA+U44edDsSDQnGDErZrmUUkgpB0kpBzd+zTUiOKfsXQA2f1VG1ZukTYb9a6CmwuxIfFtZLlSWqkToTZpm9+iic5Zm4RUVbShYrApoBYaaHYmx0iaDow6KdF0PUxUsVo9Nw2PeIrafnn3lBbwzsVcdhcPbIHWC2ZEYL2kU+IfocVCzFSyBbhnWq+bYlnNmXzWYHY3WSd6Z2IuWAhJSJ5ociAv4BapVtLpHZZ76WlWqInWi2ZG4RtoUNfuqRM++sirvTOwFSyAgDHoMNTsS10ibrGp6HC82OxLfdGAd1J323sSeOlE96s6DZXlpYl+serV2P7MjcQ19g8tchUtUtU2r1x9qjZ59ZXnel9iPF6sqdakTzY7EdaIzISxeXZlo7lewWJURCI40OxLXSZ0IB9bq8gIW5X2JvbAx2XnjjdMmQqj62YVLdf1sd6s+BQfWe3fHASBlAjTUwv7VZkeidYL3JfaCxWq6VkwfsyNxrZTxcPoIlOWZHYlvKV4JssH7E3vSKLD5qc6DZjneldgdDjU8kTrRe8oItCZlvHos1MMxblWwWNX37znC7EhcKzAUErL1cJ9FeVdiL9uherEpXjwM0yQyCbqm6B6VuxUshqTR4B9kdiSulzpBbe5y5oTZkWgd5F2J/exqQB9I7KB67UXLoaHe7Eh8Q0UplOd5/zBMk5TxqnqlLuNrOd6V2AuXqBK9ET3NjsQ9UsZDzSldxtddfOHGfHM9h6thJ31VaDnek9jra1X9lNSJZkfiPk3j7Hoc1D0KFkNwVzXH2xf4BaqbqPo+juV4T2I/uEGV6U2daHYk7hMaq4o26R6V60mpfoGmjPeuMr1tSZmg7l1VlpkdidYB3pPYi5YBQm1c7UtSxqt9KutrzI7Eux0vhFMHvK8MdFuaJiIULTM3Dq1DjNoa7zUhRJkQYrsRx+uUomUQNwBCokwLwRQp46H+jKpforlO0XL12DT85SvisyAwXA/3WYxRPfbXgRkGHavj6mtg/zro5aW1Oy6k11hVt0QPx7hW0QroEqPKOfgSu586x/T5ZSmGVMmSUi4VQiQbcaxOObhR9VrPK8pUdqqavMMVnDxTR32Dg9BAP8KD/YkLDyKhazD+di8YiQqOhPjB6oM36VdmR+OdpFQ99l5jz1n4VlVTz67SCg6dOENtvQM/u42uIf5EdQkgMSqE8CB/E4M2UOoE2P0VnNin1k9oHs9t5Q+FEHcCdwIkJRl8chQtR42vj0FKyVfbD/PS4ny2HTzZ6ktsAnpEBpMS3YWBCREM6hlBVmIk8RHBxsbmDinjYdXfobYKArqYHY33OV7UOL7+EAD55ZX8dd5uvt1RSm29o9WXdesSQK9uIfSOCyOrZySDkyLJiA3DbrPYquizq5yXwZAbzY1Faxe3JXYp5SvAKwDZ2dnGVq4qWgbdB1AbEMnPP9jC7E0HSY8N5ZcX9yErMZLo0AD8bDYqa+o5daaOgyfOsO/YafYdO82e0kpeWVpAvUOFlB4bysTMGKb07c7IlChsVvgQpoyHFc+pDbzTp5odjfdpGl9PzuHzLYd47KMt2IXghhFJjE2PJikqhEA/G3UNDo6fruNoZQ37jp2m6GgVhUeqmLvtMO+u3Q9ARLA/4zNjmNInlkl9YokItkCvPqYvhESrq0Kd2C3B+gXL62th/1rk0Ft45IPNfLG1hIenZnLvpDT82jnUUl3XQF7JKTYUH2fJ7nLeXFXMq8sLSYgM5gdDE7hxZC/iIjx4CXniSBB2NQ6sE7vxildASDTflkXw4HsbGd4rir/fOITYsPadE1JKio6eZvP+46zce5RFu8qYs+UQgX42Lh4Qx3UjkhiZEoXw1PpGNhv0GqPeBym9vw6TF7B+Yj+kxtcX1fTmi60l/M9Fvbl3UnqHDhHkb2dIUleGJHXlxzmpnK6tZ35eGR9tOMCLi/by8pJ8Ls9K4O6JaaTHeuDm2IGhkDD0u56lZpzG8fUzCaN4+IMtDEqI4I3bRxAc0P657EIIUqK7kBLdhVlDeuJwSDYfOMHsjQf5dPNBPt18iKzESO6ekMb0ft098yoxOQfyPocTxdA12exotDYYNd3xXWAV0FsIcUAIcYcRx22Xxvm1v94UzoTMGO6ZmOb0IUMC/Lg8qwdv3j6CJf8ziRtH9mLuthKm/3UJv/xkG2UV1U63YbheY9UvudoqsyPxLieK4eR+Pj6agkPC328Y2qGk3hKbTTA0qSu/vXIA6x6fyv+bNZATp2u5678buOLFFawpOGpQ8AZKblwfUrTC3Di0djEksUspr5dSxksp/aWUPaWU/zbiuO1StJySoDTKG7rw1OX9Db+cTYwK4anL+7P855O4ZXQyH67fz8RnFvPyknzqG1q/ceZ2yTngqIf9a8yOxLs0JrI3ShJ5aGoGiVEhhh4+yN/ODSOTWPDIBJ69JosjlTVc+8pq7nprA4dOnDG0LafE9IXgKH1VaBHWnu9XX4vct4ZvqzK4bngSKdGumxHSLTSQpy7vz/xHJjA2PZo/frWTK15cwfYLzLxxq6Rm4+yacYqWc8oWwbHgFG4ZneyyZvzsNn4wtCcLH53Io9MyWbK7nOl/Xcp/VxfjcHjALllnx9l1YrcCayf2QxsR9WdY5ejDHeNS3NJkcnQX/nVLNi/fNJSyihqueHEFT3+9kzqze++BYdBjsLrBpRmmrmApy+t6c3tOqtNDMO0RHGDn/ikZfPPQeLISI/j1p9u5/l+r2X/MA/YeTc5Rc9lP7DM7Eq0Nlk7sDYVqfD0wNYdkF/bWWzJjQDzzH57AD4Yk8I/F+Vz10koKj5g8vt1rrNqPU29AbIzjxfhXHGCd7Me1wxPd2nRStxD+e8dI/nTVQHYcOsUlf1vGZ5sPujWG79Hj7JZh6cR+Mm8ReY5EZozob0r7ESH+PHN1Fi/dOJTio6e59PllfLBuP9KsDaaTx4GjTteNMUh9gRp2EMk5RIcGur19IQTXDk9i7oM5ZMaF8eB7m/nZh1uorDFpY5XY/hAUqYdjLMC6ib2+li6lG9ho68/kvrGmhnLxwHi+ejCHQT0jeOzjrdz3ziZOnqlzfyBJo1TdGH2DyxBHchdwTIYyatQYU+NIjArh/TtH8cCUDD7ZeICZzy9j6wETtquz2dRVoT6/PJ5lE3v9gQ0EymoaEscQ6Gd+fewekcG8/eNRPDajN1/nHuaSvy1jQ/Fx9wYRFKE2gdDj7IYIOLCS9fRjfO/uZoeCn93GI9Myee/O0dTWO7jqpZW8uqzA/TdWk8eqEgsnTR4W0i7Ison94Ob5ACQOmWZyJN+x2wT3TEznw7tGIwRc889VvLhoLw3u/PAlj1Pj7HUeONfeQhzHiomqLeF4zAiC/M3vODQZkRLF3AdzmNwnlt99mcftb6zjSKUba/E3FdrTnQePZtnEXlewlF0ykZEDPK+M6tCkrsx9MIeLB8TxzDe7uOnVNZSeclOiTR4HDTV6nN1JxZvmARAz0PNKNESGBPDyTcP47ZUDWJl/lIv/towVe4+4p/HuAyAwQm+84eEsmdhlfS0Jp7awP3woIQGeWRUhPMifF64fwtNXDWLz/hPMeG4pC/JKXd9w0mhA6B6Vkyp3Lua4DGXYcHPH11sjhODmUb347N6xRAT7c9O/1/DMN26Ydmuzq/nsemaMR7NkYj+4YyXB1OCf5tm72QghuGZ4InPuH0dcRDB3vLGe/5uTS019g+saDY6EuIH6BpeTYo6uY2fgICJC3D8bpiP6xofz+X1juWZYIi8uyufaf65y/Zz35LFwLB9Olbi2Ha3TLJnYy7ctACA1e7rJkbRPemwos+8Zw61jkvnPiiJmvbiS/PJK1zWYPE4Nxehx9k6pKisiznGYqvhRZofSLiEBfvzph4N44foh7Cmt5JLnlzF3mwuTbtO+wvqq0GNZMrEHHFxFgUikZ4J7F404I8jfzlOX9+fVW7IpOXmGmc8v581VRa65sZo8Duqr4eAG44/tA4o3fgtA1/6TTY6kYy7L6sGXD+SQGhPKPW9v5N53NrqmYF3cILUPqh5n91iWS+yOulpSTm/lUGS259avvoCp/brz1YPjyU7uyhOf5fKDl1aSe8jgejN6nN0pdXuXclyG0i/LGj325pK6hfDhT0fz6LRM5uWWMvUvS3hv7T5jp0Xa/dSaCT3O7rEsl9iLt68khBrsqTlmh9JpcRFBvHn7CJ67djAHj5/msheW88Rn2ymvMGjaWkiUmr2gx9k7JfbYOvYEDSI40AK7G7UgwM/G/VMy+OqhHPrGh/OLT7bxg5dWsq7omHGNJI+Do3ugwg0TArQOs1xiP5KrxteTh3nO/PXOEEJw5ZAEFjwykRtGJvH2mn1MeGYRz367i5OnDVi1mjwW9q9VO0xp7XaqtIh4x2Gqelivt36+tJhQ3v3JKJ7+4SBKTp7h6pdX8ZM31xtTkbRX03x23XnwRJZL7MEHV1IoEonv4R27pUeE+PO7Kwcy7+HxTOody/ML9zLqDwt44rPtzhUVSx4H9WfU5htauzWNr3frP8XkSIxhswmuyU5k8c8m8T8X9WZV/lFmvrCcG/61mkU7yzp/jyc+CwJC9XCMhzJkErgQYgbwN8AOvCql/KMRxz1ffW0NKae3szX6YtxTpNd9UmNCefHGodxXcop/Ly/kvbX7eXNVMUOSIrlsUA9mDIijR2Rw+w+Y1Dj/umiZGg/V2qVu71JOyC70zhppdiiGCg6wc++kdG4a1Yv31u7jPyuKuO31dcSGBXJZVg9mDopnUM9I7O3dlu/sOLvusXsi4WwlQiGEHdgNTAMOAOuA66WUO1p7TXZ2tly/fn2H29qzYREZc65k3fBnGX6p+3bfM0NZRTUfbzjInC2H2FFyCoDkbiGMSu1GVmIk6bGhpMWE0jXEv/WbyP8YDaHd4ZZP3Ri5tR36TR8OBSST/YuvzQ7FpWrrHczPK+XTTQdZtKuMugZJWJAfI1O6MaxXV3rHhZIRG0Z8RFDrm8IvexYW/B/8bC+Exrj3H+CjhBAbpJTZbT3PiB77CGCvlLKgseH3gCuAVhN7Zx3NXUgG1h9fb4/YsCDunpjG3RPT2FtWyeJdZawuOMbcbSW8t27/2ecF+NmI7hJAVGgAIQF+BNht+NsF/nYbN9T0ZnT5V/z6vXVgD8DPLrDbBH42G4H+NmJCA4kJCyQuPIiM7mFEdQkw8V9svuOHi+nhKCG/x/Vmh+JyAX42LhkYzyUD4zlxupale46wKv8IK/YeZX6zFdJCQFRIADFhgXQJVOdXoL+NALuNjNpY/gd4473/khs5GT+7Db/G88vPLggP8iM2PIjYsECSokLo1a1L+68INKcYkdgTgP3N/n4A+N51rBDiTuBOgKSkzo2Py4Za8vz70TfOO8bX2ys9NpT02FB+nJOKwyE5eOIMe8sryS+rpLyihiOVtRytquFMbQOna+upd0hq6x0sqe3NRDmbisJ1bKU39Q6pvhocnKlroK7h3Ku16NAA+veIYExaN8akRdOvR7hPfRCLN3xDV6DbAGvNX3dWZEgAl2f14PKsHgCcPFPH3rIKdpdWcvhkNeWVNZRX1HC6tp7aegdVVeqxqD6O+wgitGQNS8sGUe+QNDgc1DdI6hwOquvOLW8Q7G8nMy6MYUldycmMZmRKlMeWBHGF6jNV7Fo1h7TsiwgN7+rStowYivkhMENK+ePGv98MjJRS3tfaazo7FKN1UNUReCYNpjwBOY+e8yMpJafO1FNeWc3BE9XsKa1g1+EKNu0/wd4ytSq2e3gglw3qwZVDEhiQEGHGv8Ct1r1wM5lHFhDy62L8/a051dHt3pqlSgvcu/p7P6qua6C8oobSU9UUHqkir6SC3EMn2bT/BLX1DgLsNib1iWHWkAQm9Yn1iPLbrpS7ci79v72ezWNfYvC0Gzp1DHcOxRwEmi8B7dn4Pc1sXaLV7vJFK76X2IUQRIT4ExHiT3psGBMyvxsjLTtVzYr8I8zddpg3VhXx6vJChvXqyh3jUpjer3vrY64WF39sPQUhAxmik3r7JY+DBb9RnYgu0ef8KMjfTmJUCIlRIWQnR539fnVdA+uKjrFwZxlztpTwTW4p0aGB3DqmFzeO7EVXLx0SPLVzEQ4pSMl2/VCyEZ/QdUCGECJFCBEAXAd8bsBxNSMkj4N9q6Gh/XPjY8ODmDWkJ/+6JZv1j0/jiZn9KKuo5p63NzL12SXM2XLI/Rs8uNiRQ0X0lIc408Mzqzl6rOTGhYIdWOUc5G8nJyOGJy/rz+pfTuY/tw1nQEI4f/52N2P+uJA/zM0zZi2Hhwk/vIZCvxQiurr+RrPTic2i8SwAAB6lSURBVF1KWQ/cB3wD5AEfSClznT2uZpDkcVBXBYc2d+rlESH+3D4uhcU/m8TLNw0lyN/O/e9u4vIXl7O64KjBwZqnqHH+esxA3xpfd1qPIeAf0ulpj352G5N6x/L6bSP45qHxzBgQxyvLChj/zCJeXVZAbb2LyxC7SfWZ06TV7KC823C3tGfINbWUcq6UMlNKmSal/L0Rx9QM0lSJz8mCTXabYMaAeL58IIdnr8nieFUd172ymkc/2MKxKuuvbq3LX0YFwaQOGG12KNZi94fEkYbMZ+8dF8Zfrx3Ml/fnkJUYye++zOPS55exodjAUggm2bNpCUGiji6ZE9zSnncOlmrfCY2BmD6GFQSz2wQ/GNqT+Y9M4J6JaXy2+SCT/7KYjzccwNkb8WaRUtLjxAaKQrKw+/nOLA3DJI+Dsh1QZcwVXL8e4bx5+wj+/aNsTtc2cNVLq3h89jZOVVt3eOb4DjW+7q5S4zqx+4JOjLO3JTjAzmMz+jD3wRzSY0J59MMt3PP2Ro5bsPdeXFxIL3mQukTdW++UToyzt8eUvt359uHx3DEuhXfX7uPi55YZW8jMjcJLV7PPP5kuke5ZyKUTuy9IHge1lVCyxfBDZ3YP4/2fjuYXF/dhfl4pFz23lCW7yw1vx5Wa9jeNz/L+hW8u4eQ4+4V0CfTjf2f246O7x+BnF1z7z1Xu2QLQQMdPVdK7No/jMe4rU6ETuy8waJy9NXab4K4JaXx671giQ/z50WtreerzXKrrXLgFoIFk4XKqCCau9wizQ7EmvwBIHOHSujFDk7ry5QM5XN24BeBVL62kwJW7kBlo54YlBItawvu4Z3wddGL3DaGxEN3b5ZX4+veI4PP7xnHrmGReX1nElS+uYE9phUvbdFZdg4OepzayPzQLYdfz1zsteRyU5cJp1w2VhAaqLQBfvmko+46dZuYLy/nIAvd2Tu1aBECvoe67ItSJ3Vckj4N9q6Ch3qXNNG0B+J9bh1NeUcPMF5bz39XFHvvh27hjN+kcwJYy1uxQrM1F4+wtmTEgnq8ezGFgQgQ/+3ALD72/mQoPvbHqcEgiStdyMCAFvzD3FUrTid1XuHCcvSWT+sTy1UM5jEiJ4tefbuenb23wyBurhRvU+HrSUGtsjO6xegwFv2C3lfGNjwjmnZ+M4tFpmXyxtYRLn1/Opn3H3dJ2R2wqLmOQYyc1Ce69Ma8Tu69w8Th7S2LDgnjjthH8+tK+LNpVxsV/W8bK/CNua78tDofEvm851SKIoKRhZodjbW4YZz+f3Sa4f0oGH/x0FA0OydUvr+Ifi/d61Kro7WuXECJqiMua6tZ2dWL3FWHdITrT7Rtc22yCH+ekMvuesYQE2rnx1TU8/bVnzGrYcuAEA+tzORk9VC200ZyTnAOlrh1nb8mwXlHMfTCHiwbE8fTXu7j5tTWUnqp2awwtkVJSs3cpACHp493atk7sviR5HBS7fpy9JQMSIvji/nFcMyyRfyzO54cvr6L4qBNb/xlg3vod9LHtJ6KvLiNgiORxgITilW5vOiLYn79fP4SnrxrExuITXPy3ZSzIM3ej7c37T5BZvZWToWlu34hEJ3ZfkjwOaivgsHvG2c8XEqBmNbx4w1AKyyu59PnlzN50wJRYqusaOLx1IQBBbu5Nea0E946zn08IwTXDE5lz/zjiwoO44431pk67/XBtIcNtuwh2UxmB5nRi9yVNO8ubvE/lpYPi+eqh8fSND+Ph97fw0Hub3D6r4avtJQys30aDPUgtsNGc5xcIicNNP7/SY0OZfe8Ybhurpt3O+sdKth886dYYKqrrKNi6ki6imoDUHLe2DTqx+5aw7tAtw/QPHkBCZDDv/mQUj0zLZM7WEqb8ZQmzN7lnTrLDIXlpcT7jA3ZhSxqlbvxpxkjOgdLtbh9nP1+gn50nL+vPa7dmU15RzeV/X87/frrdbeWA31xVTFbDdvWX5HFuabM5ndh9zdm6Me4fZz+fn93GA1My+OTuMcRHBvPw+1u46qWVrC10bVL4OvcwpaWHSXUUI0z40Hm1pnH2favMjgSAyX26s+DRidwyOpm31xQz6S+LeX1FoUuHZyqq63h1WQGXhOerCQuhsS5rqzU6sfua5HFQcwoObzU7krOyEiOZffcYnvnhIPYdO8M1/1zFda+sYsXeI4b34Ctr6vntFzuYFVWEQJrSm/JqCcPAL8gjrgqbRAT789Tl/Zlz/zgyYkN5as4OJj6zmDdWFnG61vgOzjPf7KLiTDUD6neYdn7pxO5rkj1jnP18Npvg6uxElj02iSdm9qOgvIobX13DtL8u5dVlBZRX1DjdhpSSX32yjcOnqrk7+bBKQAlDDYheO8svsHE+u/vWS7RX/x4RvHfnKN758UgSo4J58vNcRv5+AU9+tp1tB04a0omYv6OUt1YX89igWux1ld+tH3EzpzazFkJcDTwF9AVGSCnbtUO13szaZC8Mg6g0uPEDsyNpVXVdA59vPsS76/axad8JhIAhiZFM7dedUand6N8jvEObH9fWO3hqTi7vrNnH/1zUm3t33QbBkfCjOS78V/ioxX+CxX+AnxdCcFezo2mRlJKN+47z39X7+HJrCbUNDhIig5nWrztj06PJ7tW1w3uvzttRygPvbiKzeygfDVqP/8In4dFdEBZnWNzu2sx6O/AD4J9OHkdzp+RxsP0TcDSAzTN3hg/yt3PN8ESuGZ7I7tIKvt5+mHk7Snn6610ABNht9E8Ip09cGCnRXUiJDiUpKoSoLgFEhvjjb7fR4JAcOH6aVflHeXV5IXvLKrlrQhr3jOwGS7bBxF+a/K/0Umfns6+CPpeYHU2LhBAM6xXFsF5RPDGzH/PzSvkmt5R31u7j9ZVFAKTGdKFPXBjpMaGkdw+jZ9dgYkIDiQkLJMjfjpSSY1W1bDt4kg/XH+DLbSUMTIjg1R8Nx3/OC9At3dCk3hFOJXYpZR6oN0mzkOQc2PC6Gme3wFS/zO5hZHYP44EpGZSdqmbjvhNs2necTftP8E1uaYtb89ltgoZmS8szYkN59ZZspvbrDnlfgB5fd53m4+wemtib69olgKuzE7k6O5Hquga2HjjJuqJjbN5/grwS1ak4v0qBENB8sCM00I/7J6dz76R0gmxSVVIdeJV7/yHNuG0fMCHEncCdAElJSe5qVmvJ2boxyy2R2JuLDQ9ixoA4Zgz4rid04nQthUeqOHD8DCdO13K0qpa6Bgd+NhsJkcEMSIigb3zYdx2QwqVqY4ie7tlY2Of4B6n31gPH2dsS5G9nREoUI1Kizn6vuq6BoqNVlJyopryyhvKKGmrqGhBCEB7sT0ZsKCNSogjyb7z6PbBeLQRMcf/CpCZtJnYhxHygpeuJx6WUn7W3ISnlK8AroMbY2x2hZrzweDXGXrQcxtxvdjROiwwJYEhSAEOS2jmeW7gUkkbr+euulDwOFv8Rzhz32HH29gryt9MnLpw+ceHte0HhEvWYYt6K5jYTu5TSvWXJNPdIHge5n3r0OLtLVJRCeR5kXWd2JN7t7Hz21dD7YrOjca+CJdB9AHSJNi0EPd3RVyXnQM1JOLzN7Ejcq2l4wMTelE9IyAZ7oMdNq3W5umrYv8b088upxC6EmCWEOACMBr4UQnxjTFiayzXdOCxcam4c7la4BIIiID7L7Ei8m3+Qms/eNCzhKw6sg/pqayd2KeVsKWVPKWWglLK7lPIiowLTXCw8Xi139rUPXuFSdbXiS8NPZkmZoK4Iq46aHYn7FC4BYTdtYVITPRTjy1InqtrZ9Z63ZZ1LHC+G40Wm96Z8RupE9ehLnYfCpWqmWVA7b7S6iE7svix1ItSdVpePvqBp2EkndvfoMQQCw30nsddUwMENHnF+6cTuy3qNBWGDgsVmR+IehUuhSyzE9DE7Et9g91P3cnzl/Nq3Ghz1kGre/PUmOrH7suBItbu8L3zwpFQ9x5Txatmg5h6pE9Xw1/Eic+Nwh4LFYA+AxJFmR6ITu89LnaguH6tPmR2Jax3ZDZWlHnGZ7FNSJ6rHAh8YjilcqpK6f7DZkejE7vNSJ4BsgOIVZkfiWnp83RzRmRAa5/1XhaePqRlAHnJ+6cTu63qOUBsQe3uPqmAxRCZBVIrZkfgWIVSvvXApOBxmR+M6RcsAaWp9mOZ0Yvd1/kHQa7R396gcDWoFpIf0pnxO6kQ4fQTKcs2OxHUKloB/F4/ZuEUndk31MsrzoOKw2ZG4xqFNUH0CUieZHYlvapol4s2dh/yFkJIDdn+zIwF0Yteg2UISLy0vkL8QEDqxmyW8hxpr99bhvmMFcLwQ0qaYHclZOrFrEDdIlVb11h5V/kLoMRi6dDM7Et+VOlHdoPfGVc75i9Rj2mRz42hGJ3YNbDY1/lyw+NxtYbxB9UnYv9ajPnQ+KWWC965yzl8IEUnQLc3sSM7SiV1TUifCqYNwdK/ZkRircJmazqkTu7mSx3nnKueGOjWEmTbJoxa+6cSuKU2Jb+98c+MwWv5CCAhV0zo18wRHqu3yvO38OrgBak55XMdBJ3ZN6ZoM3TK874OXv0CV6dXb4JkvfaqaoVR1xOxIjLN3gboS8YD6MM05u9HGM0KInUKIrUKI2UKISKMC00yQMU3N9647Y3YkxjhWoGqUeFhvymelTwVk4ywlL5G/EBKGedy+rs722OcBA6SUg4DdwC+dD0kzTfoUtftLkZeUF2hKIDqxe4b4wRAS7T1XhaePwaGNHnl+ObuD0rdSyvrGv64GejofkmaaXuNUeYG988yOxBj5izxutoJPs9lU52HvAu8oL1C4FKTD+xL7eW4Hvmrth0KIO4UQ64UQ68vLyw1sVjOMf5CaveANPaqm2Qrpkz1qtoLPS5+qyguUbDY7EuflL1AbiSRkmx3J97SZ2IUQ84UQ21v4uqLZcx4H6oG3WzuOlPIVKWW2lDI7JibGmOg142VMU1MejxWaHYlz9q1unK3gOasBNRp7t8L6nQcpYc88ddPU7md2NN/TZkRSyqkX+rkQ4lZgJjBFSm9b3eKD0hv/u/fOhxE/MTcWZ+z+Gmz+an6x5jm6RKst8/bOhwmPmR1N5x3eChUlkDnD7Eha5OysmBnAY8DlUsrTxoSkmapbGnRNsX6Pas+3kDwWAsPMjkQ7X8Y0tQL19DGzI+m83d+qx4zp5sbRCmfH2P8OhAHzhBCbhRAvGxCTZrb0qWp8ur7G7Eg651iB2jHJQ3tTPi99qrrpaOVVqHu+UdtKhsaaHUmLnJ0Vky6lTJRSDm78usuowDQTZUxTdT2suquSh/emfF7TvO89Fp19VXUEDqz36I6DXnmqfV9yjpr2uKvVSU6ebc830C1dT3P0VDY7pE9T/0+OBrOj6bg98wAJmZ7bcdCJXfu+gBB103HXV9ar9lhTqVbPenBvSgN6Xwynj6rKm1az+2sI7Q5xWWZH0iqd2LWW9b4YTu5XG/RaScFiaKjVwzCeLn2qmrW060uzI+mYhjq1ojljulpw5aE8NzLNXJkzAGG94Zg930BAGCSNNjsS7UKCwtVWclY7v5rWR2ReZHYkF6QTu9ay0FhVZtVKPSqHA3Z/o1ab6mqOnq/3JWoxXPlusyNpv11fgT3gu+0kPZRO7Frr+lwCJVvg5EGzI2mfA2uhshT6XGZ2JFp79L5YPe6aa24c7SUl5M1Re+d6+PoIndi11vW+RD1a5YOXN0eN23rwbAWtmYiear9dq5xfh7fCyX3Q1/M7Djqxa62LzoSoNGuMg57tTU2EoAizo9Haq8+lamZMpQUKA+bNUZtqNHV4PJhO7FrrhFCXy4VL1abQnuzwNjhRDH1nmh2J1hG9LwYk7LZA5yFvDvQaC126mR1Jm3Ri1y6s3xXgqINdX5sdyYXt/AIQ0PtSsyPROiJuEET2gh2fmR3JhR3ZA+U7LTEMAzqxa21JyIbwnpA72+xILixvDvQaA6G6JLSlCAH9Z6n1B55cFCxvjnrsY42Og07s2oXZbKrXnr8AzpwwO5qWHc2Hsh3QRw/DWFL/K8FR33jV5aHy5qiiXxHW2CROJ3atbf1nqdWcnnoTdfvH6rHf5ebGoXVO/GDomuy5V4XHCtTepv2uaPu5HkIndq1tPbMhItEzP3hSwrYPIWmMZXpT2nnODscs8czhmKaOw4CrzI2jA3Ri19omRONwzEI4c9zsaM51eJuqvT7wh2ZHojmj/yyQDd+NZXsKKWHbR6rjEJlodjTtphO71j79f6Bmx+z0sBID2z8Cmx/0u9LsSDRnxA2CqFTI/cTsSM5Vmqtmwwy0Tm8dnN8a77dCiK2Nuyd9K4ToYVRgmodJGKrGQbe+b3Yk33E4YPsnaoNkC8wt1i5ACDXUUbgUTh0yO5rvnO04zDI7kg5xtsf+jJRykJRyMPAF8IQBMWmeSAjIul598E7sMzsaZf8aVVp44NVmR6IZIet6tWWep3QepIRtH6vaMBbrODi7Nd6pZn/tAlhsVwatQ7KuU49bPOSDt+1DtdOTBZZ4a+3QLQ0SR8Lmdz1jg5f9a1RtGAvev3F6jF0I8XshxH7gRi7QYxdC3CmEWC+EWF9eboG6ENr3dU1WS6q3eMAHr+6MuqnVdyYEhpobi2acrOvhyC41vdBsm96CgFBLro9oM7ELIeYLIba38HUFgJTycSllIvA2cF9rx5FSviKlzJZSZsfE6NWBljX4BjiWb/6WZnlzoOYkDL3F3Dg0Y/WfBX5BqtduppoK2D5bxWPBjkObiV1KOVVKOaCFr/OLO7wNWOvWsdZx/a4A/xDY8o65cWx8s/EKYpy5cWjGCo5Uy/a3fwT1NebFkTsb6qos23FwdlZMRrO/XgHsdC4czeMFhkHfy9VslJpKc2I4VgBFy2DITR6976TWSYNvUOslzJxau/FNiO6tdhGzIGc/FX9sHJbZCkwHHjQgJs3TZd+m9n3c9qE57W96W9XFHnyjOe1rrpU6SVV8XPeqOe2X5cGBdTD0ZjUbzIKcnRVzVeOwzCAp5WVSSovsoaY5JXEkdB+oPnjuvolaXwMb34D0aRCul014JZsdht8BxSvUAiF3W/eq2td00HXub9sg+jpW6zgh1AevdLvatd2dtn8CVeUw6i73tqu51+CbwB7o/l77mRPqxu2AH1q6BLRO7FrnDLoGAiNg3b/c16aUsPofENNHXa5r3qtLN7USdcv77t29a9Nb6qapxTsOOrFrnRPQBYbcqHa+OXnAPW3uW6U2FB75U8uOfWodMOInKslufMs97TXUw5pX1FqN+Cz3tOkiOrFrnTfqbvW48u/uaW/1PyAo0tJjn1oHJAyF5BxY9Xf3TH3cNVetNB1p7d466MSuOSMyCQZeAxteh6ojrm2rLA/yvlBj+wEhrm1L8xw5j0BFiVrt7EpSwrI/Q9cUy2x/dyE6sWvOGfcQ1FfD6pdc287SP6uFUaPudW07mmdJnQQ9hsDy59RQiavs+RZKtsD4n6lZORanE7vmnJjeauf2tf9y3SYc5bvVLjYjfmK5Knuak4SAnEfheOF3OxkZTUpY8id1BTroWte04WY6sWvOm/BztWBp2bOuOf7i/wf+wTC61VJEmjfrfSnEDYRFv3PNWPuur+DgBvULxO5v/PFNoBO75ry4Aaoq35p/Gl+rfd9qVbdjzAOWnlesOcFmg2m/UeeW0fPa62vh219DdKZXrWTWiV0zxuTH1WXzgt8Yd0yHA775FYTFw9gHjDuuZj1pkyFtCix52tgNr9f/W1Urnf47r+mtg07smlEieqpe9bYP1abXRtj0lrpEnvy/at685tum/xZqK1UP2winSmDxH9QN2ozpxhzTQ+jErhkn51HolgFzHoLaKueOdfKA+gAn56hhHk3r3h/GPgib34b8Rc4dS0r44iE1Zn/Jn71uwZtO7Jpx/IPg8ufhRLFzvSqHA+Y8CI56uPwFXZpX+874x6BbOnz+gHNDMlvfh91fw5QnIDrduPg8hP7EaMbqNUYNyax/Dba817ljLP8L7J2vbphFpRgbn2Zt/kEw6xW1aOmTO1UnoKNKd8AXj0DSaK9YZdoSndg14015Ug2hzHkIDmzo2GvzvoCFv4eBV8PwH7smPs3aeg6Di/8Ee+fBwg7erK8sg/duUNvd/fA/XrEYqSU6sWvGs/vBD1+DsO7w31lwaHP7XrdnHnx0m6oRctnzXjfuqRko+3YYdiss/yssfaZ9+wJUHYE3r4DKUrj2vxAe7/IwzWJIYhdCPCqEkEKIaCOOp3mB0Fj40RwIDIf/XKLmordGSlj9MrxzrSrJe9PHuh6MdmFCwKXPqpWiC38Hn98PddWtP79kK7wySW2reP27kDjCfbGawOnELoRIRG2LZ/DKFM3yIpPgjnnQvR98eCu8cx0Ur/puXNTRoGY3vDYDvv45ZM6A2+ZCcFdTw9YswmaHK1+GnJ+pqbEvDofN75y7F+/RfPjq5/DKRHUz/ra5kDrRpIDdR0gntzYTQnwE/Bb4DMiWUrZZ5i87O1uuX7/eqXY1C6mvUSV3l/5ZzUMOjICQKHVJXHcausSo2QmD9ebUWicVLIGvfwFlO8DmB+EJ6tyqKlf74w79kVoPYfFaQ0KIDVLK7Daf50xiF0JcAUyWUj4ohCjiAoldCHEncCdAUlLSsOLi4k63q1lUTQXsnKs2Cq4+ASHRkDRK9dT9g8yOTrM6hwP2r1GVGk8eAL9AVWOmz0yISDA7OkMYltiFEPOBuBZ+9DjwK2C6lPJkW4m9Od1j1zRN67j2Jna/tp4gpZzaSgMDgRRgi1CzF3oCG4UQI6SUhzsYr6ZpmmaQNhN7a6SU24DYpr93pMeuaZqmuY6+U6VpmuZlOt1jP5+UMtmoY2mapmmdp3vsmqZpXkYndk3TNC+jE7umaZqX0Yld0zTNyzhdUqBTjQpRDnR26Wk04IlTKj01LvDc2HRcHaPj6hhPjQs6H1svKWWbu7qbktidIYRY356VV+7mqXGB58am4+oYHVfHeGpc4PrY9FCMpmmal9GJXdM0zctYMbG/YnYArfDUuMBzY9NxdYyOq2M8NS5wcWyWG2PXNE3TLsyKPXZN0zTtAnRi1zRN8zZSSrd+ATOAXcBe4Bct/FwAzzf+fCswtK3XAlHAPGBP42PXZj/7ZePzdwEXuTmuZ4Cdjc+fDUQ2fj8ZOANsbvx62YT37CngYLMYLvGQ9+z9ZjEVAZs7+p45GddrQBmw/bzXmH2OtRaX0+eYi+Iy+/xqLS6nzy9nYgMSgUXADiAXeNDIc+zs89t6gpFfgB3IB1KBAGAL0O+851wCfNX4xowC1rT1WuDppjcX+AXwp8Y/92t8XiBqU5B8wO7GuKYDfo1//lOzuJLPP+FMeM+eAn7WQnumvmfnvf4vwBMdec+ciavxZ+OBoee3ZeY51kZcTp1jLozLtPPrQnE5e34ZcO7H812SDwN2Y1Aea/7l7qGYEcBeKWWBlLIWeA+44rznXAG8KZXVQKQQIr6N114BvNH45zeAK5t9/z0pZY2UshD1G2+Eu+KSUn4rpaxvfP1q1C5THeWq96w1pr5nTYTalusa4N024jUyLqSUS4FjLRzXzHOs1bgMOMdc9X61xtT3q4kT55dTsUkpS6SUGxtjrADygIRmr3HmHDvL3Yk9Adjf7O8H+O4f1dZzLvTa7lLKksY/Hwa6d6A9V8bV3O2o3+BNUoQQm4QQS4QQOS083x2x3SeE2CqEeE0I0bUD7bk6LoAcoFRKuafZ99rznjkT14WYeY61V2fOMVfGZdb51R6dPb8Mi00IkQwMAdY0fsvZc+wsr7t5KtW1i0fN4RRCPA7UA283fqsESJJSDgEeAd4RQoS7OayXgDRgcGM8f3Fz+225nnN7U57wngH6HGsnfX5dgBAiFPgYeEhKeer8nzt7jrk7sR9E3Txo0rPxe+15zoVeW9p0Cdb4WNaB9lwZF0KIW4GZwI2N/1k0XlIdbfzzBtSYWWYLcbksNillqZSyQUrpAP7Fd5d2nvCe+QE/QN3oojHe9r5nzsR1IWaeYxfk5DnmkrhMPr8uyMnzy+nYhBD+qKT+tpTyk2bPcfYc+45sx80Co75QW/EVoG4ANN106H/ecy7l3JsOa9t6LWpmQPObDk83/rk/5950KKDlGzWuimsG6u53zHnHimmKA3UD5iAQ5eb3LL7Z6x9GjeGZ/p41e9+WdOY9cyauZj9PpuXZJ6acY23E5dQ55sK4TDu/LhSXs+eXAee+AN4EnmvhuE6dY+cc60I/dMUX6m7xbtRvxMcbv3cXcFezf/iLjT/fBmRf6LWN3+8GLEBNE5rf/D8EeLzx+buAi90c117U2Ng5U6iAq1BTnTYDG4HLTHjP3mp87lbgc879IJr2njX+7PWmYzT7XrvfMyfjehd1WV6HGsu8w0POsdbicvocc1FcZp9fLcZlxPnlTGzAONQQy1bOmwpqxDnW9KVLCmiapnkZr7t5qmma5ut0Ytc0TfMyOrFrmqZ5GZ3YNU3TvIxO7JqmaV5GJ3ZN0zQvoxO7pmmal/n/GSDMa1hCPBMAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"def alg0(c0, m0, c1, m1):\n",
" return m1(c1(m0(c0)))\n",
"\n",
"def alg7(c0, m0, c1, m1):\n",
" return c0 + m0 + c1 + m1\n",
"\n",
"channel0 = alg0(Operator(440), Operator(440), Operator(440), Operator(440))\n",
"channel1 = alg7(Operator(440), Operator(440), Operator(440), Operator(440))\n",
"\n",
"time = np.linspace(0, 1, 44100, endpoint=False)[0:880]\n",
"_ = plt.plot(time, channel0[0:880], time, channel1[0:880])"
]
},
{
"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.8.1"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment