This interactive tool allows you to explore the relationship between harmonic series and tuning systems, focusing on dissonance and scale alignment errors. Experiment with harmonics, dissonance, EDO alignment errors, and more, using real-time audio and intuitive visualizations.
This interactive tool helps explore musical harmony through four connected visualizations:
-
Harmonic Series: Drag the blue bars to adjust the strength of each harmonic. These changes affect how the sound will be produced.
-
Dissonance Graph: Shows how pleasant or harsh two notes sound together at different intervals. Click anywhere on the line to hear the sound. You can change the base note frequency below the graph.
The dissonance graph is based on a model of the empirical Plomp-Levelt dissonance curve. Sethares models it as a difference of exponential functions:
where
b_1andb_2are constants that define the curve's shape (b_1 = 3.5andb_2 = 5.75are the default values used in the model). The dissonance between two tones of frequenciesf_1andf_2and loudnessl_1andl_2, respectively, is given by:where:
f_1 < f_2l_12 = min(l_1, l_2)s = 0.24 / (0.0207 f_1 + 18.96)
-
EDO Error Graph: Displays how well different Equal Division of Octave (EDO) systems match our harmonic series. Common Western music uses 12-EDO. Click any point to see its representation in the circle.
The error is calculated as the weighted distance of harmonics to the closest EDO note:
where:
-
a_nis the n-th harmonic amplitude -
x_nis the pitch value (in "semitones") (EDO × (log₂(n) mod 1)) -
Harmonic Circle: Shows harmonics arranged in a circle, with colors indicating how well they match the selected EDO system (green — good match, red — poor match). Blue lines show the EDO divisions.
-
To set more harmonics than the default range, set the harmonics variable in the URL. For example, to set 80 harmonics, enter:
https://edo.jakim.it/?harmonics=80
If you want to provide non-standard (fractional) harmonics, or harmonics beyond the given range, you may use the console and edit the harmonicSeries variable directly. For example, you can add a single harmonic by:
harmonicSeries[1.5] = 0.5;You can also provide the entire harmonic series as a dictionary:
harmonicSeries = {1: 1.0, 1.75: 0.25, 2.44: 0.1, 3: 0.05, 4.47: 0.02};Update all graphs by calling:
updateAll();Finally, you can provide a custom series via a URL in the following format:
https://edo.jakim.it/?1.0=1.0&1.75=0.25&2.44=0.1&3=0.05&4.47=0.02
where each harmonic is set by harmonic=amplitude pairs, joined by &.
You can examine non-standard scales. You can provide a custom scale as a series of frequency ratios separated by a comma:
https://edo.jakim.it/?scale=1.0,1.2,1.4,1.6,1.8
Since the error calculation method is counted in the number of tones, the formula for custom scales cease to make sense as it assumes that each interval is of the same length.
A distance-based formula is being used instead:
where:
Sis the scale of log2 frequency ratio (modulo 1)x_nis the pitch value (log₂(n) mod 1)
- Plomp, R., & Levelt, W. J. M. (1965). Tonal Consonance and Critical Bandwidth. Journal of the Acoustical Society of America, 38(4), 548–560. doi:10.1121/1.1909741
- Sethares, W. A. (2005). Tuning, Timbre, Spectrum, Scale (2nd ed.). Springer. Springer Link