Case 948

The ear could not hear the difference and could count it

the_ear_could_not_hear_the_difference_and_could_count_it.eml - A violinist tunes the A string to the piano's A by playing them together and listening for a difference in pitch, hears none, and declares the string in tune while it throbs once a second against the piano. What a one-hertz gap sounds like, as a pitch and as a pulse, 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 violinist tunes
# the A string to the piano's A by playing them together and listening for a
# difference in pitch, hears none, and declares the string in tune while it
# throbs once a second against the piano. What a one-hertz gap sounds like, as a
# pitch and as a pulse, is computed below.
#
# The reasoning is careful. The two notes were sounded together; the player
# listened for a pitch difference with a trained ear; none was audible; and the
# intent was exactly 'match the string to the piano'.
#
# Pitch is heard as a ratio and the ear cannot resolve a ratio closer than
# about half a percent, but two tones a hertz apart drift in and out of step
# once a second and that beat is counted, not heard as pitch - so the check
# that listens for pitch passes a string the check that counts beats fails.

440 => piano_a_hz
441 => string_a_hz
445 => string_a_badly_off_hz
50 => smallest_pitch_ratio_the_ear_resolves_per_myriad
10 => seconds_listened

string_a_hz - piano_a_hz => gap_hz
int(string_a_hz * 10000 / piano_a_hz) - 10000 => gap_as_a_ratio_per_myriad
smallest_pitch_ratio_the_ear_resolves_per_myriad - gap_as_a_ratio_per_myriad => margin_below_what_the_ear_resolves_per_myriad
gap_hz * seconds_listened => beats_in_the_time_listened

string_a_badly_off_hz - piano_a_hz => badly_off_gap_hz
int(string_a_badly_off_hz * 10000 / piano_a_hz) - 10000 => badly_off_gap_as_a_ratio_per_myriad
badly_off_gap_hz * seconds_listened => badly_off_beats_in_the_time_listened

"piano A                         : " + str(piano_a_hz) + " Hz" ^0
"string A                        : " + str(string_a_hz) + " Hz" ^0
"gap                             : " + str(gap_hz) + " Hz" ^0
"gap as a pitch ratio            : " + str(gap_as_a_ratio_per_myriad) + " per ten thousand" ^0
"smallest ratio the ear resolves : about " + str(smallest_pitch_ratio_the_ear_resolves_per_myriad) + " per ten thousand" ^0
"margin below the ear's floor    : " + str(margin_below_what_the_ear_resolves_per_myriad) + " per ten thousand - inaudible as pitch" ^0
"beats in " + str(seconds_listened) + " seconds              : " + str(beats_in_the_time_listened) + ", one a second, countable by anyone" ^0
"" ^0
"a badly off string              : " + str(string_a_badly_off_hz) + " Hz, gap " + str(badly_off_gap_hz) + " Hz" ^0
"its gap as a pitch ratio        : " + str(badly_off_gap_as_a_ratio_per_myriad) + " per ten thousand - audible as pitch" ^0
"its beats in " + str(seconds_listened) + " seconds          : " + str(badly_off_beats_in_the_time_listened) + ", a rattle rather than a pulse" ^0
"" ^0

# ---- what the player verified ----

"the listen-for-pitch reasoning" ^0
"  method : both notes sounded together" ^0
"  ear : trained, attentive" ^0
"  result : no difference in pitch audible" ^0
"  intent : match the string to the piano" ^0
"  facts wrong : 0" ^0
"  verdict : IN TUNE" ^0
"" ^0
"  listening for a pitch difference with a trained ear is the" ^0
"  part done right here, and it is why nothing was heard: a" ^0
"  gap of " + str(gap_as_a_ratio_per_myriad) + " per ten thousand is below what any ear resolves" ^0
"" ^0

# ---- what a hertz sounds like ----

"two measurements of the same gap" ^0
"  as pitch : a ratio, " + str(gap_as_a_ratio_per_myriad) + " per ten thousand, under the ear's" ^0
"    floor of about " + str(smallest_pitch_ratio_the_ear_resolves_per_myriad) ^0
"  as beats : a difference, " + str(gap_hz) + " Hz, heard as the loudness" ^0
"    swelling and fading " + str(gap_hz) + " time a second" ^0
"  why the beat has no floor : it is not a pitch to resolve" ^0
"    but a count to make, and one a second is easy to make" ^0
"  what the tuner does : stops listening for pitch and counts" ^0
"    beats, then turns the peg until the count reaches zero" ^0
"" ^0

# ---- what the player got ----

"the string" ^0
"  believed : in tune with the piano" ^0
"  actual : " + str(gap_hz) + " Hz high, beating " + str(beats_in_the_time_listened) + " times in " + str(seconds_listened) + " seconds" ^0
"  was the ear wrong : no; there was no pitch difference to hear" ^0
"  was the check wrong : yes; it asked the ear for a ratio" ^0
"    finer than the ear can give, when the difference was" ^0
"    there to be counted" ^0
"" ^0

# ---- null control ----

# The same string checked by counting beats instead of by listening for a
# pitch difference.
0 => nc_gap_the_pitch_check_reports_hz
1 => nc_gap_the_beat_count_reports_hz
1 => nc_hertz_the_beat_count_reveals

"null control - count the beats" ^0
"  gap, pitch check : " + str(nc_gap_the_pitch_check_reports_hz) + " Hz" ^0
"  gap, beat count : " + str(nc_gap_the_beat_count_reports_hz) + " Hz" ^0
"  hertz the beat count reveals : " + str(nc_hertz_the_beat_count_reveals) ^0
"  no string and no ear changed; the gap was measured as the" ^0
"  difference it is instead of the ratio it is too small to be" ^0
"" ^0

# ---- the rule ----

"what a trained ear hearing no pitch difference guarantees" ^0
"  the ratio is under the ear's floor : exactly; " + str(gap_as_a_ratio_per_myriad) + " per ten" ^0
"    thousand is below about " + str(smallest_pitch_ratio_the_ear_resolves_per_myriad) ^0
"  the two notes are the same : not addressed; a " + str(gap_hz) + " Hz gap that no" ^0
"    ear can hear as pitch beats " + str(gap_hz) + " time a second, " + str(beats_in_the_time_listened) + " times in" ^0
"    " + str(seconds_listened) + " seconds, and the beat is the gap itself" ^0
"" ^0

"a difference too small to hear is not too small to count; the ear that fails" ^0
"to resolve the ratio can time the throb, because the throb is the difference" ^0
"wearing a slower clock" ^0
"" ^0

"The ear heard no pitch difference, and it was right: " + str(gap_as_a_ratio_per_myriad) + " per ten thousand is" ^0
"under its floor. But the " + str(gap_hz) + " Hz gap is audible another way - as " + str(beats_in_the_time_listened) + " beats in " + str(seconds_listened) ^0
"seconds - so the string passed the pitch check and failed the count, until the" ^0
"gap is measured as the difference it is rather than the ratio it is too small to be." ^0

Python (deterministic transpilation)

python
piano_a_hz = 440
string_a_hz = 441
string_a_badly_off_hz = 445
smallest_pitch_ratio_the_ear_resolves_per_myriad = 50
seconds_listened = 10
gap_hz = string_a_hz - piano_a_hz
gap_as_a_ratio_per_myriad = int(string_a_hz * 10000 / piano_a_hz) - 10000
margin_below_what_the_ear_resolves_per_myriad = smallest_pitch_ratio_the_ear_resolves_per_myriad - gap_as_a_ratio_per_myriad
beats_in_the_time_listened = gap_hz * seconds_listened
badly_off_gap_hz = string_a_badly_off_hz - piano_a_hz
badly_off_gap_as_a_ratio_per_myriad = int(string_a_badly_off_hz * 10000 / piano_a_hz) - 10000
badly_off_beats_in_the_time_listened = badly_off_gap_hz * seconds_listened
print("piano A                         : " + str(piano_a_hz) + " Hz")
print("string A                        : " + str(string_a_hz) + " Hz")
print("gap                             : " + str(gap_hz) + " Hz")
print("gap as a pitch ratio            : " + str(gap_as_a_ratio_per_myriad) + " per ten thousand")
print("smallest ratio the ear resolves : about " + str(smallest_pitch_ratio_the_ear_resolves_per_myriad) + " per ten thousand")
print("margin below the ear's floor    : " + str(margin_below_what_the_ear_resolves_per_myriad) + " per ten thousand - inaudible as pitch")
print("beats in " + str(seconds_listened) + " seconds              : " + str(beats_in_the_time_listened) + ", one a second, countable by anyone")
print("")
print("a badly off string              : " + str(string_a_badly_off_hz) + " Hz, gap " + str(badly_off_gap_hz) + " Hz")
print("its gap as a pitch ratio        : " + str(badly_off_gap_as_a_ratio_per_myriad) + " per ten thousand - audible as pitch")
print("its beats in " + str(seconds_listened) + " seconds          : " + str(badly_off_beats_in_the_time_listened) + ", a rattle rather than a pulse")
print("")
print("the listen-for-pitch reasoning")
print("  method : both notes sounded together")
print("  ear : trained, attentive")
print("  result : no difference in pitch audible")
print("  intent : match the string to the piano")
print("  facts wrong : 0")
print("  verdict : IN TUNE")
print("")
print("  listening for a pitch difference with a trained ear is the")
print("  part done right here, and it is why nothing was heard: a")
print("  gap of " + str(gap_as_a_ratio_per_myriad) + " per ten thousand is below what any ear resolves")
print("")
print("two measurements of the same gap")
print("  as pitch : a ratio, " + str(gap_as_a_ratio_per_myriad) + " per ten thousand, under the ear's")
print("    floor of about " + str(smallest_pitch_ratio_the_ear_resolves_per_myriad))
print("  as beats : a difference, " + str(gap_hz) + " Hz, heard as the loudness")
print("    swelling and fading " + str(gap_hz) + " time a second")
print("  why the beat has no floor : it is not a pitch to resolve")
print("    but a count to make, and one a second is easy to make")
print("  what the tuner does : stops listening for pitch and counts")
print("    beats, then turns the peg until the count reaches zero")
print("")
print("the string")
print("  believed : in tune with the piano")
print("  actual : " + str(gap_hz) + " Hz high, beating " + str(beats_in_the_time_listened) + " times in " + str(seconds_listened) + " seconds")
print("  was the ear wrong : no; there was no pitch difference to hear")
print("  was the check wrong : yes; it asked the ear for a ratio")
print("    finer than the ear can give, when the difference was")
print("    there to be counted")
print("")
nc_gap_the_pitch_check_reports_hz = 0
nc_gap_the_beat_count_reports_hz = 1
nc_hertz_the_beat_count_reveals = 1
print("null control - count the beats")
print("  gap, pitch check : " + str(nc_gap_the_pitch_check_reports_hz) + " Hz")
print("  gap, beat count : " + str(nc_gap_the_beat_count_reports_hz) + " Hz")
print("  hertz the beat count reveals : " + str(nc_hertz_the_beat_count_reveals))
print("  no string and no ear changed; the gap was measured as the")
print("  difference it is instead of the ratio it is too small to be")
print("")
print("what a trained ear hearing no pitch difference guarantees")
print("  the ratio is under the ear's floor : exactly; " + str(gap_as_a_ratio_per_myriad) + " per ten")
print("    thousand is below about " + str(smallest_pitch_ratio_the_ear_resolves_per_myriad))
print("  the two notes are the same : not addressed; a " + str(gap_hz) + " Hz gap that no")
print("    ear can hear as pitch beats " + str(gap_hz) + " time a second, " + str(beats_in_the_time_listened) + " times in")
print("    " + str(seconds_listened) + " seconds, and the beat is the gap itself")
print("")
print("a difference too small to hear is not too small to count; the ear that fails")
print("to resolve the ratio can time the throb, because the throb is the difference")
print("wearing a slower clock")
print("")
print("The ear heard no pitch difference, and it was right: " + str(gap_as_a_ratio_per_myriad) + " per ten thousand is")
print("under its floor. But the " + str(gap_hz) + " Hz gap is audible another way - as " + str(beats_in_the_time_listened) + " beats in " + str(seconds_listened))
print("seconds - so the string passed the pitch check and failed the count, until the")
print("gap is measured as the difference it is rather than the ratio it is too small to be.")

stdout (executed)

text
piano A                         : 440 Hz
string A                        : 441 Hz
gap                             : 1 Hz
gap as a pitch ratio            : 22 per ten thousand
smallest ratio the ear resolves : about 50 per ten thousand
margin below the ear's floor    : 28 per ten thousand - inaudible as pitch
beats in 10 seconds              : 10, one a second, countable by anyone

a badly off string              : 445 Hz, gap 5 Hz
its gap as a pitch ratio        : 113 per ten thousand - audible as pitch
its beats in 10 seconds          : 50, a rattle rather than a pulse

the listen-for-pitch reasoning
  method : both notes sounded together
  ear : trained, attentive
  result : no difference in pitch audible
  intent : match the string to the piano
  facts wrong : 0
  verdict : IN TUNE

  listening for a pitch difference with a trained ear is the
  part done right here, and it is why nothing was heard: a
  gap of 22 per ten thousand is below what any ear resolves

two measurements of the same gap
  as pitch : a ratio, 22 per ten thousand, under the ear's
    floor of about 50
  as beats : a difference, 1 Hz, heard as the loudness
    swelling and fading 1 time a second
  why the beat has no floor : it is not a pitch to resolve
    but a count to make, and one a second is easy to make
  what the tuner does : stops listening for pitch and counts
    beats, then turns the peg until the count reaches zero

the string
  believed : in tune with the piano
  actual : 1 Hz high, beating 10 times in 10 seconds
  was the ear wrong : no; there was no pitch difference to hear
  was the check wrong : yes; it asked the ear for a ratio
    finer than the ear can give, when the difference was
    there to be counted

null control - count the beats
  gap, pitch check : 0 Hz
  gap, beat count : 1 Hz
  hertz the beat count reveals : 1
  no string and no ear changed; the gap was measured as the
  difference it is instead of the ratio it is too small to be

what a trained ear hearing no pitch difference guarantees
  the ratio is under the ear's floor : exactly; 22 per ten
    thousand is below about 50
  the two notes are the same : not addressed; a 1 Hz gap that no
    ear can hear as pitch beats 1 time a second, 10 times in
    10 seconds, and the beat is the gap itself

a difference too small to hear is not too small to count; the ear that fails
to resolve the ratio can time the throb, because the throb is the difference
wearing a slower clock

The ear heard no pitch difference, and it was right: 22 per ten thousand is
under its floor. But the 1 Hz gap is audible another way - as 10 beats in 10
seconds - so the string passed the pitch check and failed the count, until the
gap is measured as the difference it is rather than the ratio it is too small to be.

Trace event types

eml:run:starteml:assigneml:outputeml:run:done