{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 用python告诉你为什么十二平均律有12个音" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "作为一名学音乐的艺术生,为什么平均律现行的是12个音而不是其他的选择,我们需要一个合理的解释。后现代解构主义喜欢把所有的锅都甩给“文化上下文”跟“历史的偶然性”,这是很不负责任的表现。\n", "\n", "![](res/人文三连.svg)\n", "\n", "本文的目的是通过简单的数学和python可视化工具来解释为什么平均律是12个音。以下是正文。\n", "\n", "任何数学工具都要从人的需求开始,因此我们先从音乐的角度说人话。\n", "\n", "从听感的角度,我们将音程分为两种:\n", "\n", "- 和谐音程\n", "- 不和谐音程\n", "\n", "这里我们有了第一个需求:**和谐音程比不和谐音程有更高的优先级,也就是说我们优先考虑让和谐音程尽量和谐**。\n", "\n", "因为我们的生理构造以及各种神秘的原因,和谐音程对应的都是这种形式的比例:\n", "\n", "$$\\frac{k+1}{k}, k = \\{1,2,3,...\\}$$\n", "\n", "例如:\n", "\n", "- $\\frac21$ = 纯八度\n", "- $\\frac32$ = 纯五度\n", "- $\\frac43$ = 纯四度\n", "- $\\frac54$ = 大三度\n", "- $\\frac65$ = 小三度" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from enum import Enum\n", "class INTERVALS(Enum):\n", " P8 = 2/1\n", " P5 = 3/2\n", " P4 = 4/3\n", " M3 = 5/4\n", " m3 = 6/5" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "因此我们想要一个n-平均律,使得这一平均律最好地照顾到这些和谐音程。\n", "\n", "本文的目的就是解释为什么当$n=12$的时候是最优解。\n", "\n", "## 定义损失函数\n", "\n", "怎么样算“照顾到这些和谐音程”?我们需要找到一种衡量n-平均律跟这些和谐音程之间的“距离”,来判定n-平均律的优劣。\n", "\n", "当我们定义了一个n-平均律,我们将八度分为了n等份,同时也生成了n个音程:\n", "\n", "- 第1个音程:$2^{\\frac1n}$\n", "- 第2个音程:$2^{\\frac2n}$\n", "- ...\n", "- 第i个音程:$2^{\\frac{i}{n}}$\n", "\n", "我们想要的就是:**对于任何一个和谐音程,存在一个n平均律中的音程,使得这两个音程之间的距离尽量小**。\n", "\n", "例如,我们熟悉的12平均律($n=12$),对于纯五度,我们可以找到12平均律中的第7个音程:\n", "\n", "$$2^{\\frac{7}{12}} = 1.4983070768766815$$\n", "\n", "而这跟理想中的纯五度\n", "\n", "$$\\frac32 = 1.5$$\n", "\n", "非常接近。" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.0016929231233184794" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "np.abs(2**(7/12) - 1.5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "因此定义损失函数非常简单:遍历上文枚举出的和谐音程,对于任何一个和谐音程,找出在n-平均律中离这一和谐音程“距离”最近的一个音程然后计算“距离”。\n", "\n", "既然上文提到了“距离”,我们可以很直观地直接用欧氏距离(毕竟从几何到统计学的MSE都在用这个):\n", "\n", "$$d(\\vec x,\\vec y) = \\sqrt{(x_1 - y_1)^2 + ... + (x_k - y_k)^2}$$\n", "\n", "也就是说\n", "\n", "$$\\text{损失函数}(\\text{n-平均律}) = \\sqrt{(\\text{纯八度跟最接近的音程的距离})^2 + (\\text{纯五度跟最接近的音程的距离})^2 + ...}$$" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "def loss(n):\n", " loss = 0\n", " for interval in INTERVALS:\n", " x = 2**(np.arange(0,n + 1) / n) - interval.value\n", " x = np.abs(x)\n", " x = np.min(x)\n", " x = np.square(x)\n", " loss = loss + x\n", " return np.sqrt(loss)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "我们现在来看一下效果。" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "x = np.arange(2,25)\n", "y = np.array(list(map(loss,x)))\n", "data = pd.DataFrame({'n':x,'loss':y})\n", "\n", "fig, ax = plt.subplots()\n", "ax.set_xticks(data['n'].head(20))\n", "ax.bar(data['n'].head(20),data['loss'].head(20))\n", "ax.set(xlabel='n', ylabel='loss',\n", " title='n-equal temperament')\n", "ax.grid()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 进阶:两个可以考虑的问题\n", "\n", "从上面已经可以看出来12对应着一个极小值,这也解释了为什么我们会选择12。\n", "\n", "然而美中不足的是:19一样也很小,也就是说,19这一竞争者的存在让我们看不到12独特的光辉。\n", "\n", "接下来我们可以用一个邪恶的招数:**通过修改“比赛规则”让12成为内定的冠军**。\n", "\n", "### 不同的音程并非生而平等\n", "\n", "我们可以提出第二个(伪)需求:**不同的和谐音程重要程度也不一样**。例如,或许我们觉得顾及纯五度比顾及小三度更加重要,也就是说我们更需要P5精准而不是m3。\n", "\n", "从数学的角度来说,我们需要的是加入权重$\\alpha_1,...,\\alpha_k$。\n", "\n", "$$\\text{损失函数}(\\text{n-平均律}) = \\sqrt{\\alpha_1(\\text{纯八度跟最接近的音程的距离})^2 + \\alpha_2(\\text{纯五度跟最接近的音程的距离})^2 + ...}$$\n", "\n", "权重该如何取值?一个很heuristic也是最为自然的办法就是直接用音程自身的值,因为我们发现**和谐音程的大小跟重要性呈正比**。\n", "\n", "例如纯五度比小三度重要,恰好纯五度对应的$\\frac32$比小三度对应的$\\frac65$要大。\n", "\n", "因此公式就成了\n", "\n", "$$\\text{损失函数}(\\text{n-平均律}) = \\sqrt{\\frac21(\\text{纯八度跟最接近的音程的距离})^2 + \\frac32(\\text{纯五度跟最接近的音程的距离})^2 + ...}$$" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "def loss(n):\n", " loss = 0\n", " for interval in INTERVALS:\n", " x = 2**(np.arange(0,n + 1) / n) - interval.value\n", " x = np.abs(x)\n", " x = np.min(x)\n", " x = interval.value * np.square(x)\n", " loss = loss + x\n", " return np.sqrt(loss)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### n的取值\n", "\n", "另外一个直觉则是,n-平均律,n越大越不现实,毕竟作曲家和听众都会懵逼:比如如果一个八度有100万个音,那么我们大家都会集体懵逼。因此从regularization的角度来讲,我们可以加入对n的penalty:我们想要的是**小的损失函数,但是n也最好不要大**。" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
nloss
17190.009908
20220.012017
22240.014834
10120.014834
13150.023361
19210.028531
18200.030169
21230.031397
15170.033355
14160.034023
16180.039706
12140.040861
570.040936
8100.041996
11130.051487
790.053746
9110.066498
680.073648
350.088890
460.128209
130.129295
240.133091
020.284371
\n", "
" ], "text/plain": [ " n loss\n", "17 19 0.009908\n", "20 22 0.012017\n", "22 24 0.014834\n", "10 12 0.014834\n", "13 15 0.023361\n", "19 21 0.028531\n", "18 20 0.030169\n", "21 23 0.031397\n", "15 17 0.033355\n", "14 16 0.034023\n", "16 18 0.039706\n", "12 14 0.040861\n", "5 7 0.040936\n", "8 10 0.041996\n", "11 13 0.051487\n", "7 9 0.053746\n", "9 11 0.066498\n", "6 8 0.073648\n", "3 5 0.088890\n", "4 6 0.128209\n", "1 3 0.129295\n", "2 4 0.133091\n", "0 2 0.284371" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.sort_values(by='loss') # 从这里可以看出来,另一个要考虑的feasibility问题就是n的大小:n越大越不现实,因此也可以加上一个penalty" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "所以一个最简单的方式就是把这个对n的regularization penalty放到损失函数中,**n越大损失越大**。\n", "\n", "一个最简单且自然的选择就是选择n本身当做系数相乘\n", "\n", "$$\\text{损失函数}(\\text{n-平均律}) = n \\sqrt{\\frac21(\\text{纯八度跟最接近的音程的距离})^2 + \\frac32(\\text{纯五度跟最接近的音程的距离})^2 + ...}$$" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "def loss(n):\n", " loss = 0\n", " for interval in INTERVALS:\n", " x = 2**(np.arange(0,n + 1) / n) - interval.value\n", " x = np.abs(x)\n", " x = np.min(x)\n", " x = interval.value * np.square(x)\n", " loss = loss + x\n", " return n * np.sqrt(loss)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "看一下效果:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEWCAYAAABrDZDcAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAanElEQVR4nO3dfZxcZX338c+XBCQkIYKBLZBIqARLShTMAlJUEkEakBva8iAUqYg0tb3ToqItFF4UAe8btKnal7mlCBaLQIwgNCI10Uq09i5P4SmEiMYQgUASnoIEEIz8+se51o7DzO45s3t2slzf9+s1rz0P1+9cvz1zdn5znTNzVhGBmZnla6tuJ2BmZt3lQmBmljkXAjOzzLkQmJllzoXAzCxzLgRmZplzIbCsSFoq6fRu52G2JXEhMEsknS/pq93OY6SRdKqkH3Y7D+ucC4HZCCRpVLdzsNcOFwIbEpLWSPq4pPskPSvpa5K27af9rpKul/SEpIck/VXDujGSrpT0jKQHJH1C0qMN60PSng3zV0q6KE3vIOmmtN1n0vSkEvnPBv4WeJ+kTZLuTcsnSLpC0uOS1kq6qO9FOL0T/k9Jn5W0UdJqSb+Xlj8iaYOkDzTleamk70h6TtL3Je3esP530rqnJT0o6YSm2C9KulnS88AsSe+VdLekn6f+zm9oPyXtpw+mdc9I+rCk/dNztFHSF5r2wWmSVqa2i5tyixT/kxQ7X4W9gUuBg9J+2zjQvrYtUET44cegH8Aa4HZgV2BHYCXw4TZttwKWAecB2wC/DawGfj+tvxj4j7SdycD9wKMN8QHs2TB/JXBRmn4DcCywHTAe+DpwY0PbpcDpbfI6H/hq07IbgH8CxgI7p9/xz9K6U4HNwAeBUcBFwMPAfOB1wOHAc8C4hjyfA96V1n8e+GFaNxZ4JG1rNLAf8CQwrSH2WeDgtP+2BWYC09P8W4D1wB+k9lPSfro0tT0c+AVwY/o9dgM2AIek9scAq4C9U//nAv+/aZ/fBLweeCPwBDC7YT/8sNvHoB+dPzwisKH0jxHxWEQ8DXwT2LdNu/2BnSLigoh4OSJWA18CTkzrTwA+FRFPR8QjwD+WTSAinoqI6yPihYh4DvgUcEgnv4ykHuBI4CMR8XxEbAA+25AnwEMR8c8R8SvgaxSF64KIeCkilgAvA3s2tP9WRPwgIl4CzqF4Jz0ZOApYk7a1OSLuBq4Hjm+I/deI+M+IeCUifhERSyNieZq/D7i2xe96YWq7BHgeuDYiNkTEWopiu19q92Hg/0bEyojYDPwfYN/GUQFwcURsjIiHgVto//zaCDO62wnYa8q6hukXKEYHSPo34J1p+Z8BvwR2bTqNMIrihYkU90jDup+VTUDSdhQv1rOBHdLi8ZJGpRfrKnYHtgYel9S3bKum3NY3TL8IEBHNy8Y1zP86NiI2SXqa4vfdHTiwaZ+MBq5qFQsg6UCK0dM+FCOr11GMgBo159Iut92Bz0ua19gFxcihb/83P7+Nv5eNYC4EVruIOKJxXtJBFO+kp7YJeZzinfWKNP/GpvUvUJz66fNbQN81hDOBNwMHRsQ6SfsCd1O8qA2YatP8I8BLwMT0LnkoTO6bkDSO4vTXY6mv70fEeyrkdw3wBeCIiPiFpM8BEzvM6xGKUdjVHcT6FsYjnE8NWTfcDjwn6W/SheFRkvaRtH9avxA4O134nQT8ZVP8PcAfp7jZ/ObpkPEU73Q3StoR+LsKea0HpkjaCiAiHgeWAPMkbS9pK0lvktTRqabkSEnvkLQNcCFwazr9dROwl6RTJG2dHvuni7HtjAeeTkXgAOCPB5HXpRT7/Hfh1xfJjx8gps96YFL6nWwEciGwYZdO0RxFcY75IYqLopcDE1KTT1KcjniI4oX4qqZNnAH8L2AjcDLFBdA+nwPGpG3eCny7Qmp9p1WeknRXmv4TitMuDwDPANcBu1TYZrNrKIrT08AM4P0A6XrG4RTXHx6jOA1zCcXpnnb+ArhA0nMUF94XdppURNyQ+lsg6ecUF+iP6D/q175HMXpbJ+nJTnOw7lGER3W2ZZM0k+LTPAN+DHRLJulKik8/ndvtXMwaeURgZpY5FwIzs8z51JCZWeY8IjAzy9yI+x7BxIkTY8qUKUO6zeeff56xY8d2JX6k9u288+nbeY+svttZtmzZkxGxU8uV3b7HRdXHjBkzYqjdcsstXYsfqX0773z6dt4jq+92gDvD9xoyM7NWXAjMzDLnQmBmljkXAjOzzLkQmJllzoXAzCxzLgRmZplzITAzy5wLgZlZ5kbcLSasuilnfavl8jOnb+bUFuvWXPzeulMysy2IRwRmZplzITAzy5wLgZlZ5lwIzMwy50JgZpY5FwIzs8y5EJiZZc6FwMwscy4EZmaZcyEwM8ucbzFh1oJvy2E58YjAzCxzHhGY2YhWdfQGHsE184jAzCxzLgRmZplzITAzy5wLgZlZ5lwIzMwy50JgZpa5WguBpNmSHpS0StJZLda/UdItku6WdJ+kI+vMx8zMXq22QiBpFDAfOAKYBpwkaVpTs3OBhRGxH3Ai8P/qysfMzFqrc0RwALAqIlZHxMvAAuCYpjYBbJ+mJwCP1ZiPmZm1oIioZ8PSccDsiDg9zZ8CHBgRcxva7AIsAXYAxgKHRcSyFtuaA8wB6OnpmbFgwYIhzXXTpk2MGzeuK/HD0ffytc+2XN4zBta/+Orl03ebMCT91hU/HLHeZ0MTOxx9V32uoP7nq5v7rJ1Zs2Yti4jeVuu6fYuJk4ArI2KepIOAqyTtExGvNDaKiMuAywB6e3tj5syZQ5rE0qVLGcw2BxM/HH23+5r9mdM3M2/5qw+BNScPnM9I3WdlY73PhiZ2OPqu+lxB/c9XN/dZJ+o8NbQWmNwwPykta/QhYCFARPwXsC0wscaczMysSZ2F4A5gqqQ9JG1DcTF4UVObh4FDASTtTVEInqgxJzMza1JbIYiIzcBcYDGwkuLTQSskXSDp6NTsTOBPJd0LXAucGnVdtDAzs5ZqvUYQETcDNzctO69h+gHg4DpzMBtJ2t1SGfxPcaw+/maxmVnmXAjMzDLnQmBmljkXAjOzzLkQmJllzoXAzCxzLgRmZplzITAzy5wLgZlZ5lwIzMwy50JgZpY5FwIzs8y5EJiZZc6FwMwscy4EZmaZcyEwM8ucC4GZWeZcCMzMMlfrv6o0M3sta/evRUfavxX1iMDMLHMuBGZmmfOpIavVa2XobDbU2v1twPD/fXhEYGaWORcCM7PMuRCYmWXOhcDMLHMuBGZmmXMhMDPLnAuBmVnmXAjMzDLnL5SZvYb4C3zWCRcCMxu0LelbslZdVoWg6rsl8MFqZq99vkZgZpa5rEYE3eRzt2bt+e+juzwiMDPLnAuBmVnmai0EkmZLelDSKklntWlzgqQHJK2QdE2d+ZiZ2avVdo1A0ihgPvAe4FHgDkmLIuKBhjZTgbOBgyPiGUk715WPmZm1VueI4ABgVUSsjoiXgQXAMU1t/hSYHxHPAETEhhrzMTOzFhQR9WxYOg6YHRGnp/lTgAMjYm5DmxuBHwMHA6OA8yPi2y22NQeYA9DT0zNjwYIFHeW0fO2zLZf3jIH1L7aOmb7bhAG3u2nTJsaNGzekfZfpt5t9l+m3230PJrZbebfrt2zfOeY9Uv+uB7vPqpo1a9ayiOhtta7bHx8dDUwFZgKTgB9Imh4RGxsbRcRlwGUAvb29MXPmzI46a/elsTOnb2be8ta7Ys3JA/e1dOlSBsqpat9l+u1m32X67Xbfg4ntVt7t+i3bd455j9S/68Hus6FU56mhtcDkhvlJaVmjR4FFEfHLiHiIYnQwtcaczMysSZ2F4A5gqqQ9JG0DnAgsampzI8VoAEkTgb2A1TXmZGZmTWorBBGxGZgLLAZWAgsjYoWkCyQdnZotBp6S9ABwC/CJiHiqrpzMzOzVar1GEBE3Azc3LTuvYTqAj6WHmZl1gb9ZbGaWORcCM7PMuRCYmWXOhcDMLHPd/kKZWVu+R73Z8PCIwMwscy4EZmaZcyEwM8ucC4GZWeZcCMzMMudCYGaWORcCM7PMuRCYmWXOhcDMLHMuBGZmmXMhMDPLnAuBmVnmShUCSWdI2l6FKyTdJenwupMzM7P6lb376GkR8XlJvw/sAJwCXAUsqS0z+7V2d+EE34nTzAav7KkhpZ9HAldFxIqGZWZmNoKVLQTLJC2hKASLJY0HXqkvLTMzGy5lTw19CNgXWB0RL0jaEfhgfWmZmdlwKTsiOAh4MCI2Sno/cC7wbH1pmZnZcCk7Ivgi8FZJbwXOBC4H/gU4pK7EzAaj6r+5BF9gt3yVHRFsjogAjgG+EBHzgfH1pWVmZsOl7IjgOUlnU3xs9J2StgK2ri8tMzMbLmVHBO8DXqL4PsE6YBLwmdqyMjOzYVNqRBAR6yRdDewv6Sjg9oj4l3pT2/JUPe/sc85mNhKUvcXECcDtwPHACcBtko6rMzEzMxseZa8RnAPsHxEbACTtBHwXuK6uxMzMbHiUvUawVV8RSJ6qEGtmZluwsiOCb0taDFyb5t8H3FxPSmZmNpzKXiz+hKRjgYPTossi4ob60jIzs+FSdkRARFwPXF9jLmZm1gX9FgJJzwHRahUQEbF9LVmZmdmw6bcQRIRvI2Fm9hrnT/6YmWWu9DWCTkiaDXweGAVcHhEXt2l3LMV3EvaPiDvrzMnMWvM35/NV24hA0ihgPnAEMA04SdK0Fu3GA2cAt9WVi5mZtVfnqaEDgFURsToiXgYWUNzGutmFwCXAL2rMxczM2lDxbwZq2HBxL6LZEXF6mj8FODAi5ja0eRtwTkQcK2kp8PFWp4YkzQHmAPT09MxYsGBBRzktX9v6n6r1jIH1L7aOmb7bhI7j644djr7b2bRpE+PGjRuw3Za2z4bjuW6nzD7r5nM9Uo/RwT7X7Qzm+RqOfVbVrFmzlkVEb6t1tV4j6E/6nwb/AJw6UNuIuAy4DKC3tzdmzpzZUZ/t/jPVmdM3M295612x5uT/6atqfN2xw9F3O0uXLqXM87Cl7bPheK7bKbPPuvlcj9RjdLDPdTuDeb6GY58NpTpPDa0FJjfMT0rL+owH9gGWSloDvB1YJKllxTIzs3rUWQjuAKZK2kPSNsCJwKK+lRHxbERMjIgpETEFuBU42p8aMjMbXrUVgojYDMwFFgMrgYURsULSBZKOrqtfMzOrptZrBBFxM013KY2I89q0nVlnLmZm1pq/WWxmljkXAjOzzLkQmJllzoXAzCxzLgRmZplzITAzy5wLgZlZ5lwIzMwy50JgZpY5FwIzs8y5EJiZZc6FwMwsc137xzQ2Mvgfmpu99nlEYGaWORcCM7PMuRCYmWXOhcDMLHMuBGZmmXMhMDPLnAuBmVnmXAjMzDLnQmBmljkXAjOzzLkQmJllzoXAzCxzLgRmZplzITAzy5wLgZlZ5lwIzMwy50JgZpY5FwIzs8y5EJiZZc6FwMwscy4EZmaZcyEwM8vc6G4nYGbWTVPO+lbL5WdO38ypLdatufi9dac07DwiMDPLXK2FQNJsSQ9KWiXprBbrPybpAUn3Sfp3SbvXmY+Zmb1abYVA0ihgPnAEMA04SdK0pmZ3A70R8RbgOuDTdeVjZmat1TkiOABYFRGrI+JlYAFwTGODiLglIl5Is7cCk2rMx8zMWlBE1LNh6ThgdkScnuZPAQ6MiLlt2n8BWBcRF7VYNweYA9DT0zNjwYIFHeW0fO2zLZf3jIH1L7aOmb7bhI7j647tZt9lYrvZdzef63Y2bdrEuHHj+m0zUp/rkZR3N/seyn1W1axZs5ZFRG+rdVtEIZD0fmAucEhEvNTfdnt7e+POO+/sKKf+Ph0wb3nrD1A1fkKganzdsd3su0xsN/v2c71lxG6JeXez76HcZ1VJalsI6vz46FpgcsP8pLTsN0g6DDiHEkXAzMyGXp3XCO4ApkraQ9I2wInAosYGkvYD/gk4OiI21JiLmZm1UVshiIjNFKd7FgMrgYURsULSBZKOTs0+A4wDvi7pHkmL2mzOzMxqUus3iyPiZuDmpmXnNUwfVmf/ZmY2MH+z2Mwscy4EZmaZcyEwM8ucC4GZWeZcCMzMMudCYGaWORcCM7PMuRCYmWXOhcDMLHMuBGZmmXMhMDPLnAuBmVnmXAjMzDLnQmBmljkXAjOzzLkQmJllzoXAzCxzLgRmZplzITAzy5wLgZlZ5lwIzMwy50JgZpY5FwIzs8y5EJiZZc6FwMwscy4EZmaZcyEwM8ucC4GZWeZcCMzMMudCYGaWORcCM7PMuRCYmWXOhcDMLHMuBGZmmXMhMDPLnAuBmVnmXAjMzDJXayGQNFvSg5JWSTqrxfrXSfpaWn+bpCl15mNmZq9WWyGQNAqYDxwBTANOkjStqdmHgGciYk/gs8AldeVjZmat1TkiOABYFRGrI+JlYAFwTFObY4CvpOnrgEMlqcaczMysiSKing1LxwGzI+L0NH8KcGBEzG1oc39q82ia/2lq82TTtuYAc9Lsm4EHhzjdicCTA7aqJ36k9u288+nbeY+svtvZPSJ2arVi9BB3VIuIuAy4rK7tS7ozInq7ET9S+3be+fTtvEdW352o89TQWmByw/yktKxlG0mjgQnAUzXmZGZmTeosBHcAUyXtIWkb4ERgUVObRcAH0vRxwPeirnNVZmbWUm2nhiJis6S5wGJgFPDliFgh6QLgzohYBFwBXCVpFfA0RbHohsGedhpM/Ejt23nn07fzHll9V1bbxWIzMxsZ/M1iM7PMuRCYmWUu60IgabKkWyQ9IGmFpDMqxG4r6XZJ96bYT3bQ/yhJd0u6qYPYNZKWS7pH0p0VY18v6TpJP5K0UtJBFWLfnPrse/xc0kcqxH807a/7JV0radsKsWekuBVl+pT0ZUkb0vdV+pbtKOk7kn6Sfu5QMf741P8rktp+vK9N7GfSPr9P0g2SXl8h9sIUd4+kJZJ2rdJ3w7ozJYWkiRX6Pl/S2obn/Mgq/Ur6y/R7r5D06Sp5q7gFTV+/ayTdUyF2X0m39v2NSDqgYt9vlfRf6e/sm5K2bxPb8nWkzLHWT2yp42zIRES2D2AX4G1pejzwY2BayVgB49L01sBtwNsr9v8x4Brgpg5yXwNM7PD3/gpwepreBnh9h9sZBayj+KJKmfa7AQ8BY9L8QuDUkrH7APcD21F8yOG7wJ4DxLwLeBtwf8OyTwNnpemzgEsqxu9N8aXGpUBvxdjDgdFp+pJ2fbeJ3b5h+q+AS6v0nZZPpvjwxs/aHTtt+j4f+HiJ56hV7Kz0XL0uze9cNe+G9fOA8yr0vQQ4Ik0fCSytmPsdwCFp+jTgwjaxLV9Hyhxr/cSWOs6G6pH1iCAiHo+Iu9L0c8BKiherMrEREZvS7NbpUfrKu6RJwHuByyslPUiSJlAc9FcARMTLEbGxw80dCvw0In5WIWY0MEbF90a2Ax4rGbc3cFtEvBARm4HvA3/UX0BE/IDi02iNGm9r8hXgD6rER8TKiBjwm+1tYpek3AFupfhuTdnYnzfMjqWfY63N7w3F/bz+usPYAbWJ/XPg4oh4KbXZ0EnfkgScAFxbITaAvnfxE+jnWGsTvxfwgzT9HeDYNrHtXkcGPNbaxZY9zoZK1oWgkYo7n+5H8c6+bMyoNFTdAHwnIkrHAp+j+KN8pUJMowCWSFqm4hYcZe0BPAH8s4rTUpdLGtthDifS5g+zlYhYC/w98DDwOPBsRCwpGX4/8E5Jb5C0HcU7vMkDxLTSExGPp+l1QE8H2xgKpwH/ViVA0qckPQKcDJxXMfYYYG1E3FslrsHcdGrqy/2dTmthL4rn7TZJ35e0f4f9vxNYHxE/qRDzEeAzaZ/9PXB2xT5X8D/3RzueEsdb0+tIpWOtk9egoeJCAEgaB1wPfKTpnVe/IuJXEbEvxTu7AyTtU7K/o4ANEbGso4QL74iIt1Hc3fV/S3pXybjRFEPgL0bEfsDzFMPWSlR8SfBo4OsVYnag+MPaA9gVGCvp/WViI2IlxemUJcC3gXuAX1VMu3mbQYVR3FCRdA6wGbi6SlxEnBMRk1Pc3IHaN/S3HfC3VCweDb4IvAnYl6KAz6sQOxrYEXg78AlgYXp3X9VJVHjTkfw58NG0zz5KGgVXcBrwF5KWUZy2ebm/xv29jgx0rHX6GjRUsi8EkrameAKujohvdLKNdGrlFmB2yZCDgaMlraG4K+u7JX21Yp9r088NwA0Ud3st41Hg0YbRy3UUhaGqI4C7ImJ9hZjDgIci4omI+CXwDeD3ygZHxBURMSMi3gU8Q3E+tar1knYBSD/bnqqog6RTgaOAk9OLQyeups1pijbeRFF8703H3CTgLkm/VSY4ItanNz2vAF+i/LEGxfH2jXQq9XaKEXDLC9XtpNOIfwR8rUocxV0L+v6mv061vImIH0XE4RExg6II/bSfHFu9jpQ61obiNWiwsi4E6Z3JFcDKiPiHirE7KX3qQ9IY4D3Aj8rERsTZETEpIqZQnF75XkSUemec+hsraXzfNMVFyFd9QqRN3+uARyS9OS06FHigbN8NOnmH9jDwdknbpX1/KMU50VIk7Zx+vpHiheGaiv3Db97W5APAv3awjY5Imk1xOvDoiHihYuzUhtljKHmsAUTE8ojYOSKmpGPuUYoLlOtK9r1Lw+wfUvJYS26kuGCMpL0oPpxQ9a6ahwE/inSX4goeAw5J0+8GqpxWajzetgLOBS5t067d68iAx9pgXoOGVN1Xo7fkB/AOiuHafRSnGu4BjiwZ+xbg7hR7P20+zVBiOzOp+Kkh4LeBe9NjBXBOxfh9gTtT7jcCO1SMH0txc8AJHfy+n6R4EbsfuIr0aZKSsf9BUbTuBQ4t0f5ailMZv6R48fsQ8Abg3yleFL4L7Fgx/g/T9EvAemBxhdhVwCMNx1rLT/60ib0+7bP7gG9SXFAsnXfT+jW0/9RQq76vApanvhcBu1SI3Qb4asr9LuDdVfMGrgQ+3MFz/Q5gWTpebgNmVIw/g2LU+WPgYtKdGFrEtnwdKXOs9RNb6jgbqodvMWFmlrmsTw2ZmZkLgZlZ9lwIzMwy50JgZpY5FwIzs8y5EJiZZc6FwMwscy4EZoMkaYqK/+vwpXQP+SXp2+ZmI4ILgdnQmArMj4jfBTZS7V5AZl3lQmA2NB6KiL7/nrUMmNLFXMwqcSEwGxovNUz/iuL2y2YjgguBmVnmXAjMzDLnu4+amWXOIwIzs8y5EJiZZc6FwMwscy4EZmaZcyEwM8ucC4GZWeZcCMzMMvffiE1BMp+H9D0AAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "x = np.arange(2,25)\n", "y = np.array(list(map(loss,x)))\n", "data = pd.DataFrame({'n':x,'loss':y})\n", "\n", "fig, ax = plt.subplots()\n", "ax.set_xticks(data['n'].head(20))\n", "ax.bar(data['n'].head(20),data['loss'].head(20))\n", "ax.set(xlabel='n', ylabel='loss',\n", " title='n-equal temperament')\n", "ax.grid()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "如上,12这个数字成了唯一的最优解。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "草稿\n", "\n", "## 进阶:量化trade-off\n", "\n", "平均律本质上就是trade-off:牺牲纯五纯四的纯度换取transposition-invariance。\n", "\n", "我们接下来要找的就是一个最小的irreducible量:也就是说任何temperament都最少会损失“这么多”的“这个量”。" ] } ], "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.8" } }, "nbformat": 4, "nbformat_minor": 4 }