Selected harmonic

Generated natural harmonic layout.

Fretboard

node pluck point fret marker

Spectral graph

Approximate relative amplitudes. Open-string view shows a simple plucked-string rolloff. Natural-harmonic view suppresses non-matching modes and shows surviving partials.

Node details

Node positions

Node locations relative to the shortened speaking length.

Full harmonic table

Harmonic table

First 16 harmonics with pitch, cents, and modeled amplitude.

Harmonic Freq Pitch Cents Amp Present

Last Updated - 2026 March 26

Harmonics

This page maps natural harmonic nodes on a string and shows what happens when you treat the string as fretted first.

If you have a stringed instrument then lightly press down at half the length of the string (12th fret, 12th position). Don't engage the string with the fret or fingerboard. Actuate the string. That's a natural harmonic.

The useful part here is the fretted view. Instead of only showing open-string node positions, the page shortens the speaking length first and then shows where the harmonic nodes, pitches, and surviving partials land on that new string length.

I can't play...

The more divided the string, the more precise you must be relative to the node's central location and the more sensitive the string actuation point is.

If you can't play the 3rd node on the 10th harmonic (right between the first nodes of the 4th and 5th harmonics), don't worry.

Ideally, the loudest sound will come from the most precise and accurate muting of the node (try your finger nail) then plucking exactly between two nodes. You can get a 'purer' (fewer harmonics) sound by muting two nodes simultaneously and plucking between them.

Reading the chart

The chart has 4 important pieces of information:

  • Fretboard - This is a generated 24-fret instrument fretboard with node locations for the selected natural harmonic. The fret positions are equal temperament.
  • Controls - You can select the open-string frequency, a fretted fret, which natural harmonic you want to inspect, and where the string is plucked.
  • Spectral graph - This shows an idealized amplitude model for the first 16 harmonics. In All mode it shows a simple plucked-string rolloff. In a specific natural harmonic mode it suppresses the modes that should disappear and shows the surviving partials.
  • Summary and node details - The compact summary shows the currently selected harmonic, pitch and amplitude information, and the node panel shows where those nodes lie on the shortened speaking length.
  • Harmonic table
    • Frequency - The frequency of each harmonic relative to the current sounding fundamental.
    • Pitch - The nearest equal-tempered note and the cent offset from that note.
    • Amp - The modeled relative amplitude for that harmonic.

Pluck Position

The Pluck position control means exactly where on the currently speaking part of the string you excite it.

On this page it is measured from the bridge side of the speaking length, not from the nut and not from the full original string if you have fretted a note first.

So:

  • 22% from bridge means the pluck point is 22% of the active string length away from the bridge
  • if the string is fretted, that 22% is taken from the shortened speaking length
  • moving the pluck point changes which harmonics are emphasized or suppressed in the spectral graph

In practical terms:

  • plucking closer to the middle tends to emphasize the lower harmonics more strongly
  • plucking closer to the bridge tends to produce a brighter sound with more upper-harmonic content
  • if the pluck point lands near a node for a given mode, that mode gets reduced a lot or can effectively disappear in this model

That last bit is the important one.

If you pluck exactly on a node, you do a bad job of exciting that mode, because that part of the string is not moving for that harmonic. This is why pluck position matters in the graph even when the fretboard geometry stays the same.

How to use it on the page:

  • leave it around the default value if you just want a reasonable general picture
  • move it toward the bridge to see a brighter, more upper-harmonic-heavy result
  • move it away from the bridge to see a rounder result with different cancellations
  • combine it with Fretted fret and Natural harmonic to see how the surviving modes change when the speaking length changes

Formulas

Here is the whole app logic in Clojure rather than scattered little fragments.

Core calculations

(def note-names ["C" "C#" "D" "D#" "E" "F" "F#" "G" "G#" "A" "A#" "B"])

(defn fret->distance-from-nut-ratio
  [fret]
  (- 1.0 (/ 1.0 (Math/pow 2.0 (/ fret 12.0)))))

(defn fret->speaking-length-ratio
  [fret]
  (/ 1.0 (Math/pow 2.0 (/ fret 12.0))))

(defn fretted-fundamental
  [open-fundamental fretted-fret]
  (* open-fundamental (Math/pow 2.0 (/ fretted-fret 12.0))))

(defn harmonic-frequency
  [fundamental harmonic]
  (* fundamental harmonic))

(defn cents-from-ratio
  [ratio]
  (* 1200.0 (/ (Math/log ratio) (Math/log 2.0))))

(defn cents-from-frequencies
  [f1 f2]
  (cents-from-ratio (/ f2 f1)))

(defn harmonic-node-ratios
  [harmonic]
  (map #(/ % harmonic) (range 1 harmonic)))

(defn fretted-harmonic-node-positions
  [fretted-fret harmonic]
  (let [speaking-start (fret->distance-from-nut-ratio fretted-fret)
        speaking-length (fret->speaking-length-ratio fretted-fret)]
    (map #(+ speaking-start (* % speaking-length))
         (harmonic-node-ratios harmonic))))

That covers:

  • where the fretted note starts
  • how much of the string is still speaking
  • the new fundamental after fretting
  • the actual harmonic frequency
  • where the harmonic nodes land on the full string

Pitch labels

(defn frequency->midi
  [freq]
  (+ 69.0
     (* 12.0
        (/ (Math/log (/ freq 440.0))
           (Math/log 2.0)))))

(defn frequency->pitch-label
  [freq]
  (let [midi (frequency->midi freq)
        rounded (Math/round midi)
        note-name (nth note-names (mod rounded 12))
        octave (- (quot rounded 12) 1)
        cents (* 100.0 (- midi rounded))]
    {:note (str note-name octave)
     :cents cents}))

That is what you want for the app's "Pitch" column: nearest equal-tempered note plus cent offset.

Relative amplitude model

The amplitude graph here is not a full physical string simulation. It is a simple, useful model:

  • plucked strings roll off roughly as the harmonic number increases
  • pluck position changes which modes are emphasized or suppressed
  • selecting a natural harmonic suppresses modes that should not survive
(defn amplitude-for-mode
  [mode pluck-ratio selected-harmonic]
  (let [base (/ (Math/abs (Math/sin (* Math/PI mode pluck-ratio)))
                mode)]
    (if (= selected-harmonic :all)
      base
      (if (zero? (mod mode selected-harmonic))
        (/ base (Math/sqrt (/ mode selected-harmonic)))
        0.0))))

If selected-harmonic is 3, then only 3, 6, 9, 12, 15 and so on survive in the spectrum.

Finding the nearest fret for a node

The UI also shows roughly which fret a node is near. That is just nearest-neighbor matching against the fret positions.

(defn nearest-fret-number
  [ratio-from-nut]
  (->> (range 25)
       (map (fn [fret]
              {:fret fret
               :distance (Math/abs
                           (- ratio-from-nut
                              (fret->distance-from-nut-ratio fret)))}))
       (apply min-key :distance)
       :fret))

Putting it together

This produces the core values for one selected natural harmonic:

(defn harmonic-view
  [{:keys [open-fundamental fretted-fret harmonic pluck-ratio]}]
  (let [fundamental (fretted-fundamental open-fundamental fretted-fret)
        harmonic-freq (harmonic-frequency fundamental harmonic)
        pitch (frequency->pitch-label harmonic-freq)
        node-positions (fretted-harmonic-node-positions fretted-fret harmonic)
        node-frets (map nearest-fret-number node-positions)]
    {:fundamental fundamental
     :harmonic-frequency harmonic-freq
     :pitch pitch
     :cents-from-fundamental (cents-from-frequencies fundamental harmonic-freq)
     :mode-amplitude (amplitude-for-mode harmonic pluck-ratio harmonic)
     :node-positions node-positions
     :nearest-frets node-frets}))

And this gives the table/spectrum data for the first 16 harmonics:

(defn harmonic-table
  [{:keys [open-fundamental fretted-fret selected-harmonic pluck-ratio]}]
  (let [fundamental (fretted-fundamental open-fundamental fretted-fret)]
    (map (fn [mode]
           (let [freq (harmonic-frequency fundamental mode)
                 pitch (frequency->pitch-label freq)
                 amp (amplitude-for-mode mode pluck-ratio selected-harmonic)]
             {:harmonic mode
              :frequency freq
              :pitch pitch
              :cents-from-fundamental (cents-from-frequencies fundamental freq)
              :amplitude amp
              :present? (> amp 0.0001)}))
         (range 1 17))))

That is basically the whole app in one place: fret position, shortened speaking length, harmonic nodes, pitch labeling, cent math, and the amplitude model.

Support Me!

This page took around 30 hours to put together. If you appreciate the information presented then please consider joining patreon or donating!