Case 954
The two notes shared every third overtone
the_two_notes_shared_every_third_overtone.eml - A sound designer thickens a 220 Hz tone by layering a second tone just above it at 233 Hz, both tones clean, both with the same overtone structure, and the layer comes out rough and beating instead of thick. Where the overtones of two tones land on each other, and where they narrowly miss, is computed below.
ok: true — round-trip fixpoint reached (python1 == python2)updated 2026-09-21
EML
eml# Self-authored for the EML case corpus (no external origin). A sound designer
# thickens a 220 Hz tone by layering a second tone just above it at 233 Hz,
# both tones clean, both with the same overtone structure, and the layer comes
# out rough and beating instead of thick. Where the overtones of two tones land
# on each other, and where they narrowly miss, is computed below.
#
# The reasoning is careful. Both tones are clean; the second is only a little
# above the first, so it adds body without a second obvious pitch; the overtone
# structure is identical; and the intent is exactly 'the same sound, thicker'.
#
# A tone carries overtones at whole-number multiples of its pitch, and two tones
# blend when their overtones coincide - 220 against 330 shares every third
# overtone of the lower tone - while 220 against 233 shares none within
# hearing and instead puts overtones 26 and 39 Hz apart, which beat, and the
# roughness is those near-misses.
220 => lower_tone_hz
330 => fifth_above_hz
275 => third_above_hz
233 => just_above_hz
12 => overtones_counted_on_the_lower_tone
660 => first_shared_overtone_with_the_fifth_hz
1100 => first_shared_overtone_with_the_third_hz
51260 => first_shared_overtone_with_just_above_hz
lower_tone_hz * overtones_counted_on_the_lower_tone => highest_overtone_counted_hz
int(highest_overtone_counted_hz / first_shared_overtone_with_the_fifth_hz) => overtones_shared_with_the_fifth
int(highest_overtone_counted_hz / first_shared_overtone_with_the_third_hz) => overtones_shared_with_the_third
int(highest_overtone_counted_hz / first_shared_overtone_with_just_above_hz) => overtones_shared_with_just_above
int(first_shared_overtone_with_the_fifth_hz / lower_tone_hz) => every_nth_overtone_of_the_lower_tone_shared_with_the_fifth
int(first_shared_overtone_with_the_fifth_hz / fifth_above_hz) => every_nth_overtone_of_the_fifth_shared
lower_tone_hz * 2 => lower_second_overtone_hz
just_above_hz * 2 => just_above_second_overtone_hz
just_above_second_overtone_hz - lower_second_overtone_hz => beat_between_second_overtones_hz
lower_tone_hz * 3 => lower_third_overtone_hz
just_above_hz * 3 => just_above_third_overtone_hz
just_above_third_overtone_hz - lower_third_overtone_hz => beat_between_third_overtones_hz
just_above_hz - lower_tone_hz => beat_between_the_fundamentals_hz
"lower tone : " + str(lower_tone_hz) + " Hz, overtones counted up to " + str(highest_overtone_counted_hz) ^0
"" ^0
"against the fifth, " + str(fifth_above_hz) + " Hz : first shared overtone " + str(first_shared_overtone_with_the_fifth_hz) + ", " + str(overtones_shared_with_the_fifth) + " shared" ^0
" every " + str(every_nth_overtone_of_the_lower_tone_shared_with_the_fifth) + "rd of the lower tone's, every " + str(every_nth_overtone_of_the_fifth_shared) + "nd of the fifth's" ^0
"against the third, " + str(third_above_hz) + " Hz : first shared overtone " + str(first_shared_overtone_with_the_third_hz) + ", " + str(overtones_shared_with_the_third) + " shared" ^0
"against just above, " + str(just_above_hz) + " Hz : first shared overtone " + str(first_shared_overtone_with_just_above_hz) + ", " + str(overtones_shared_with_just_above) + " shared" ^0
"" ^0
"just above, the near-misses : fundamentals " + str(beat_between_the_fundamentals_hz) + " Hz apart" ^0
" second overtones " + str(lower_second_overtone_hz) + " and " + str(just_above_second_overtone_hz) + ", " + str(beat_between_second_overtones_hz) + " Hz apart" ^0
" third overtones " + str(lower_third_overtone_hz) + " and " + str(just_above_third_overtone_hz) + ", " + str(beat_between_third_overtones_hz) + " Hz apart" ^0
"" ^0
# ---- what the designer verified ----
"the thicker-sound reasoning" ^0
" tones : both clean" ^0
" overtone structure : identical" ^0
" spacing : close, so no second pitch stands out" ^0
" intent : the same sound, thicker" ^0
" facts wrong : 0" ^0
" verdict : A CLOSE SECOND TONE ADDS BODY" ^0
"" ^0
" keeping both tones clean and alike is the part done right" ^0
" here, and it is why every overtone of each sits at an exact" ^0
" whole-number multiple of its pitch" ^0
"" ^0
# ---- where the overtones land ----
"coincidence and near-miss" ^0
" a tone's overtones : its pitch times 2, 3, 4, and on up" ^0
" two tones in a small ratio : their overtone ladders share" ^0
" rungs; 3 to 2 shares every " + str(every_nth_overtone_of_the_lower_tone_shared_with_the_fifth) + "rd rung of the lower tone" ^0
" two tones in no small ratio : the ladders never meet within" ^0
" hearing; the first shared rung of " + str(lower_tone_hz) + " and " + str(just_above_hz) + " is at " + str(first_shared_overtone_with_just_above_hz) + " Hz" ^0
" what near rungs do : they beat at their difference, " + str(beat_between_second_overtones_hz) + " and" ^0
" " + str(beat_between_third_overtones_hz) + " Hz here, too fast to count and too slow to be a pitch" ^0
" what that is heard as : roughness" ^0
"" ^0
# ---- what the designer got ----
"the layer" ^0
" believed : one sound, thicker" ^0
" actual : two ladders of overtones missing each other by " + str(beat_between_the_fundamentals_hz) + ", " + str(beat_between_second_overtones_hz) + "," ^0
" " + str(beat_between_third_overtones_hz) + " Hz and beating at those rates" ^0
" is either tone impure : no" ^0
" is closeness the same as blend : no; blend is shared" ^0
" overtones, and " + str(just_above_hz) + " shares " + str(overtones_shared_with_just_above) + " with " + str(lower_tone_hz) + " where " + str(fifth_above_hz) + " shares " + str(overtones_shared_with_the_fifth) ^0
"" ^0
# ---- null control ----
# The same tone thickened with a second tone chosen for shared overtones instead
# of for closeness.
0 => nc_shared_overtones_with_the_close_tone
4 => nc_shared_overtones_with_the_fifth
4 => nc_coincidences_the_ratio_buys
"null control - choose the second tone by ratio" ^0
" shared overtones, close tone : " + str(nc_shared_overtones_with_the_close_tone) ^0
" shared overtones, the fifth : " + str(nc_shared_overtones_with_the_fifth) ^0
" coincidences the ratio buys : " + str(nc_coincidences_the_ratio_buys) ^0
" no tone was made purer; the second was placed where its" ^0
" ladder meets the first's" ^0
"" ^0
# ---- the rule ----
"what two clean tones with the same overtone structure guarantee" ^0
" each tone's overtones are exact multiples of its pitch : exactly" ^0
" the two blend into one thicker sound : not addressed; blend" ^0
" is where the two ladders coincide, and at " + str(lower_tone_hz) + " against" ^0
" " + str(just_above_hz) + " the first coincidence is " + str(first_shared_overtone_with_just_above_hz) + " Hz away while the" ^0
" near-misses beat at " + str(beat_between_second_overtones_hz) + " and " + str(beat_between_third_overtones_hz) + " Hz" ^0
"" ^0
"two sounds do not blend because they are near each other; they blend where" ^0
"their overtones fall on the same rungs, and near without coinciding is the" ^0
"recipe for a beat, not for body" ^0
"" ^0
"Both tones are clean and alike - that part holds. But blend is coincidence" ^0
"of overtones: " + str(lower_tone_hz) + " and " + str(fifth_above_hz) + " share " + str(overtones_shared_with_the_fifth) + " of the first " + str(overtones_counted_on_the_lower_tone) + ", while " + str(lower_tone_hz) + " and " + str(just_above_hz) + " share" ^0
"" + str(overtones_shared_with_just_above) + " and instead put overtones " + str(beat_between_second_overtones_hz) + " and " + str(beat_between_third_overtones_hz) + " Hz apart, which beat, until the second" ^0
"tone is chosen by the ratio that makes the ladders meet." ^0Python (deterministic transpilation)
pythonlower_tone_hz = 220
fifth_above_hz = 330
third_above_hz = 275
just_above_hz = 233
overtones_counted_on_the_lower_tone = 12
first_shared_overtone_with_the_fifth_hz = 660
first_shared_overtone_with_the_third_hz = 1100
first_shared_overtone_with_just_above_hz = 51260
highest_overtone_counted_hz = lower_tone_hz * overtones_counted_on_the_lower_tone
overtones_shared_with_the_fifth = int(highest_overtone_counted_hz / first_shared_overtone_with_the_fifth_hz)
overtones_shared_with_the_third = int(highest_overtone_counted_hz / first_shared_overtone_with_the_third_hz)
overtones_shared_with_just_above = int(highest_overtone_counted_hz / first_shared_overtone_with_just_above_hz)
every_nth_overtone_of_the_lower_tone_shared_with_the_fifth = int(first_shared_overtone_with_the_fifth_hz / lower_tone_hz)
every_nth_overtone_of_the_fifth_shared = int(first_shared_overtone_with_the_fifth_hz / fifth_above_hz)
lower_second_overtone_hz = lower_tone_hz * 2
just_above_second_overtone_hz = just_above_hz * 2
beat_between_second_overtones_hz = just_above_second_overtone_hz - lower_second_overtone_hz
lower_third_overtone_hz = lower_tone_hz * 3
just_above_third_overtone_hz = just_above_hz * 3
beat_between_third_overtones_hz = just_above_third_overtone_hz - lower_third_overtone_hz
beat_between_the_fundamentals_hz = just_above_hz - lower_tone_hz
print("lower tone : " + str(lower_tone_hz) + " Hz, overtones counted up to " + str(highest_overtone_counted_hz))
print("")
print("against the fifth, " + str(fifth_above_hz) + " Hz : first shared overtone " + str(first_shared_overtone_with_the_fifth_hz) + ", " + str(overtones_shared_with_the_fifth) + " shared")
print(" every " + str(every_nth_overtone_of_the_lower_tone_shared_with_the_fifth) + "rd of the lower tone's, every " + str(every_nth_overtone_of_the_fifth_shared) + "nd of the fifth's")
print("against the third, " + str(third_above_hz) + " Hz : first shared overtone " + str(first_shared_overtone_with_the_third_hz) + ", " + str(overtones_shared_with_the_third) + " shared")
print("against just above, " + str(just_above_hz) + " Hz : first shared overtone " + str(first_shared_overtone_with_just_above_hz) + ", " + str(overtones_shared_with_just_above) + " shared")
print("")
print("just above, the near-misses : fundamentals " + str(beat_between_the_fundamentals_hz) + " Hz apart")
print(" second overtones " + str(lower_second_overtone_hz) + " and " + str(just_above_second_overtone_hz) + ", " + str(beat_between_second_overtones_hz) + " Hz apart")
print(" third overtones " + str(lower_third_overtone_hz) + " and " + str(just_above_third_overtone_hz) + ", " + str(beat_between_third_overtones_hz) + " Hz apart")
print("")
print("the thicker-sound reasoning")
print(" tones : both clean")
print(" overtone structure : identical")
print(" spacing : close, so no second pitch stands out")
print(" intent : the same sound, thicker")
print(" facts wrong : 0")
print(" verdict : A CLOSE SECOND TONE ADDS BODY")
print("")
print(" keeping both tones clean and alike is the part done right")
print(" here, and it is why every overtone of each sits at an exact")
print(" whole-number multiple of its pitch")
print("")
print("coincidence and near-miss")
print(" a tone's overtones : its pitch times 2, 3, 4, and on up")
print(" two tones in a small ratio : their overtone ladders share")
print(" rungs; 3 to 2 shares every " + str(every_nth_overtone_of_the_lower_tone_shared_with_the_fifth) + "rd rung of the lower tone")
print(" two tones in no small ratio : the ladders never meet within")
print(" hearing; the first shared rung of " + str(lower_tone_hz) + " and " + str(just_above_hz) + " is at " + str(first_shared_overtone_with_just_above_hz) + " Hz")
print(" what near rungs do : they beat at their difference, " + str(beat_between_second_overtones_hz) + " and")
print(" " + str(beat_between_third_overtones_hz) + " Hz here, too fast to count and too slow to be a pitch")
print(" what that is heard as : roughness")
print("")
print("the layer")
print(" believed : one sound, thicker")
print(" actual : two ladders of overtones missing each other by " + str(beat_between_the_fundamentals_hz) + ", " + str(beat_between_second_overtones_hz) + ",")
print(" " + str(beat_between_third_overtones_hz) + " Hz and beating at those rates")
print(" is either tone impure : no")
print(" is closeness the same as blend : no; blend is shared")
print(" overtones, and " + str(just_above_hz) + " shares " + str(overtones_shared_with_just_above) + " with " + str(lower_tone_hz) + " where " + str(fifth_above_hz) + " shares " + str(overtones_shared_with_the_fifth))
print("")
nc_shared_overtones_with_the_close_tone = 0
nc_shared_overtones_with_the_fifth = 4
nc_coincidences_the_ratio_buys = 4
print("null control - choose the second tone by ratio")
print(" shared overtones, close tone : " + str(nc_shared_overtones_with_the_close_tone))
print(" shared overtones, the fifth : " + str(nc_shared_overtones_with_the_fifth))
print(" coincidences the ratio buys : " + str(nc_coincidences_the_ratio_buys))
print(" no tone was made purer; the second was placed where its")
print(" ladder meets the first's")
print("")
print("what two clean tones with the same overtone structure guarantee")
print(" each tone's overtones are exact multiples of its pitch : exactly")
print(" the two blend into one thicker sound : not addressed; blend")
print(" is where the two ladders coincide, and at " + str(lower_tone_hz) + " against")
print(" " + str(just_above_hz) + " the first coincidence is " + str(first_shared_overtone_with_just_above_hz) + " Hz away while the")
print(" near-misses beat at " + str(beat_between_second_overtones_hz) + " and " + str(beat_between_third_overtones_hz) + " Hz")
print("")
print("two sounds do not blend because they are near each other; they blend where")
print("their overtones fall on the same rungs, and near without coinciding is the")
print("recipe for a beat, not for body")
print("")
print("Both tones are clean and alike - that part holds. But blend is coincidence")
print("of overtones: " + str(lower_tone_hz) + " and " + str(fifth_above_hz) + " share " + str(overtones_shared_with_the_fifth) + " of the first " + str(overtones_counted_on_the_lower_tone) + ", while " + str(lower_tone_hz) + " and " + str(just_above_hz) + " share")
print("" + str(overtones_shared_with_just_above) + " and instead put overtones " + str(beat_between_second_overtones_hz) + " and " + str(beat_between_third_overtones_hz) + " Hz apart, which beat, until the second")
print("tone is chosen by the ratio that makes the ladders meet.")stdout (executed)
textlower tone : 220 Hz, overtones counted up to 2640
against the fifth, 330 Hz : first shared overtone 660, 4 shared
every 3rd of the lower tone's, every 2nd of the fifth's
against the third, 275 Hz : first shared overtone 1100, 2 shared
against just above, 233 Hz : first shared overtone 51260, 0 shared
just above, the near-misses : fundamentals 13 Hz apart
second overtones 440 and 466, 26 Hz apart
third overtones 660 and 699, 39 Hz apart
the thicker-sound reasoning
tones : both clean
overtone structure : identical
spacing : close, so no second pitch stands out
intent : the same sound, thicker
facts wrong : 0
verdict : A CLOSE SECOND TONE ADDS BODY
keeping both tones clean and alike is the part done right
here, and it is why every overtone of each sits at an exact
whole-number multiple of its pitch
coincidence and near-miss
a tone's overtones : its pitch times 2, 3, 4, and on up
two tones in a small ratio : their overtone ladders share
rungs; 3 to 2 shares every 3rd rung of the lower tone
two tones in no small ratio : the ladders never meet within
hearing; the first shared rung of 220 and 233 is at 51260 Hz
what near rungs do : they beat at their difference, 26 and
39 Hz here, too fast to count and too slow to be a pitch
what that is heard as : roughness
the layer
believed : one sound, thicker
actual : two ladders of overtones missing each other by 13, 26,
39 Hz and beating at those rates
is either tone impure : no
is closeness the same as blend : no; blend is shared
overtones, and 233 shares 0 with 220 where 330 shares 4
null control - choose the second tone by ratio
shared overtones, close tone : 0
shared overtones, the fifth : 4
coincidences the ratio buys : 4
no tone was made purer; the second was placed where its
ladder meets the first's
what two clean tones with the same overtone structure guarantee
each tone's overtones are exact multiples of its pitch : exactly
the two blend into one thicker sound : not addressed; blend
is where the two ladders coincide, and at 220 against
233 the first coincidence is 51260 Hz away while the
near-misses beat at 26 and 39 Hz
two sounds do not blend because they are near each other; they blend where
their overtones fall on the same rungs, and near without coinciding is the
recipe for a beat, not for body
Both tones are clean and alike - that part holds. But blend is coincidence
of overtones: 220 and 330 share 4 of the first 12, while 220 and 233 share
0 and instead put overtones 26 and 39 Hz apart, which beat, until the second
tone is chosen by the ratio that makes the ladders meet.Trace event types
eml:run:starteml:assigneml:outputeml:run:done