Obtaining overtones in Tristan Murail's tuning system
A friend approached me with him not completely understanding the technique of how Tristan Murail explained his approach of distorting the overtones of a certain basenote. In this blogpost I'm going to explain the way I approached the calculations.
The source [Desintegration of Tristan Murail -- An analysis of harmonic generation and use of spectra - Kenneth Lampl] described a curve in the shape of
$$ f(x) = ax^b + c. $$
With $a=f_1$, the base frequency, $b=1$ and $c=0$ one obtains the conventional overtones with $x$ values being whole numbers. For example, if $a=f_1=100$, then $f(x=1)=100 \cdot 1 = 100$, $f(x=2)=100 \cdot 2 = 200$ and so on.
The way Murail distorts the overtone series is with following these steps.
- Choose a base note, for example $f_1=100$.
- Choose two partials, $p_1$ and $p_2$. For example, let's make them the 3rd and the 7th overtones resulting in $p_1=3$ and $p_2 = 7$, and their corresponding frequencies $f_{p_1}=f_3 = 300$ Hz and $f_{p_2} = f_7 = 700$ Hz.
- Nudge them a little bit, more concretely detune them with a certain amount. For example make the 3rd partial 10 Hz lower, $f_{p_1}' = f_{3}' = f_3 - 10 =290$ Hz. Make the other partial 50 cent higher resulting in $f_{p_2}' =f_7' = f_7 + 50$ cent $=926.37$ Hz.
- Find the parameters $a,b,c$ for the curve $f(x)= ax^b + c$ such that evaluating them at $f(1)=f_1$, $f(p_1) = f_{p_1}'$ and $f(p_2) = f_{p_2}'$. In this case we want to find the parameters for which the curve results in $f(1) = 100$, $f(3)=290$ and $f(7) = 926.37$.
To find the parameters $a,b,c$ one has to solve the system of equations as follows.
$$ a \cdot 1^b+ c = f_1$$
$$ a \cdot p_1 ^b + c = f'_{p_1}$$
$$ a \cdot p_2 ^b + c = f'_{p_2}$$
In our example
$$ a \cdot 1^b+ c = 100$$
$$ a \cdot 3^b + c = 290$$
$$ a \cdot 7^b + c = 926.37$$
As it turns out this system of equations is quite hard to solve with pen and paper, but can easily be solved using approximations. For this the computer comes in quite handy. Python has some packages that solve this issue, for example the function scipy.optimize.fsolve solves the equations in a jiffy.
In our case
$$ a= 80.87$$
$$ b = 1.10$$
$$ c = 19.12$$
resulting in the curve
$$ f(x) = 80.87 x^{1.10} + 19.12$$
This curve matches our requirements. One can see this property in the following plot.
In this case the following distorted overtone series is obtained with additional info
original | distorted | diff_hz | diff_cent | |
---|---|---|---|---|
1 | 100.00 | 100.00 | 0.00 | 0.00 |
2 | 200.00 | 192.51 | -7.49 | -66.04 |
3 | 300.00 | 290.00 | -10.00 | -58.69 |
4 | 400.00 | 390.86 | -9.14 | -40.02 |
5 | 500.00 | 494.31 | -5.69 | -19.83 |
6 | 600.00 | 599.86 | -0.14 | -0.40 |
7 | 700.00 | 707.20 | 7.20 | 17.73 |
8 | 800.00 | 816.10 | 16.10 | 34.49 |
9 | 900.00 | 926.37 | 26.37 | 50.00 |
10 | 1000.00 | 1037.88 | 37.88 | 64.37 |
11 | 1100.00 | 1150.52 | 50.52 | 77.74 |
12 | 1200.00 | 1264.19 | 64.19 | 90.21 |
13 | 1300.00 | 1378.81 | 78.81 | 101.89 |
14 | 1400.00 | 1494.32 | 94.32 | 112.87 |
15 | 1500.00 | 1610.66 | 110.66 | 123.23 |
16 | 1600.00 | 1727.78 | 127.78 | 133.02 |
17 | 1700.00 | 1845.64 | 145.64 | 142.31 |
18 | 1800.00 | 1964.20 | 164.20 | 151.14 |
19 | 1900.00 | 2083.42 | 183.42 | 159.55 |
20 | 2000.00 | 2203.27 | 203.27 | 167.58 |
21 | 2100.00 | 2323.72 | 223.72 | 175.26 |
22 | 2200.00 | 2444.75 | 244.75 | 182.62 |
23 | 2300.00 | 2566.34 | 266.34 | 189.69 |
24 | 2400.00 | 2688.45 | 288.45 | 196.49 |
25 | 2500.00 | 2811.08 | 311.08 | 203.03 |
26 | 2600.00 | 2934.20 | 334.20 | 209.34 |
27 | 2700.00 | 3057.79 | 357.79 | 215.44 |
28 | 2800.00 | 3181.84 | 381.84 | 221.32 |
29 | 2900.00 | 3306.34 | 406.34 | 227.02 |
30 | 3000.00 | 3431.27 | 431.27 | 232.54 |
You can access this Colab Notebook calculating this exact thing. You can copy this notebook to your own Google account and have fun with it.