File:Harmonic partials on strings.svg

Original file (SVG file, nominally 620 × 590 pixels, file size: 10 KB)

Summary

Description
English: Illustration of harmonic overtones on the wave set up along a string when it is held steady in certain places, as when a guitar string is plucked while lightly held exactly half way along its length.
Date
Source Own work by uploader, based on design of bitmap image Image:Overtone.jpg
Author Qef / Houtlijm
Other versions Massive JPEG bitmap version: Image:Overtone.jpg

Source code

Created by a specially written program in the Lua programming language. To recreate the image just run the program, and it will write the SVG into a file. There are various parameters that can be adjusted at the start of the code. The sine-wave approximation using Bezier curves is derived from Bezier curve sinewave approximation (PDF) by Jim Fitzsimmons.

local MARGIN = 10 local AMPLITUDE, WAVE_WIDTH = 30, 600 local GAP_BETWEEN_WAVES = 25 local NUM_WAVES = 7 local FONT_SIZE, FONT_FUDGE = 20, 5  local WAVE_STYLE = ' stroke="#000" stroke-width="1.5" fill="none"'  local img_wd = 2 * MARGIN + WAVE_WIDTH local img_ht = 2 * MARGIN + NUM_WAVES * AMPLITUDE * 2 +                (NUM_WAVES - 1) * GAP_BETWEEN_WAVES  local PI = math.asin(1) * 2 local XD = PI / 12 local SQRT2 = math.sqrt(2) local Y1 = (2 * SQRT2) / 7 - 1 / 7 local Y2 = (4 * SQRT2) / 7 - 2 / 7 local Y3 = SQRT2 / 2 local Y4 = (3 * SQRT2) / 7 + 2 / 7  function sine_wave_path (x, y, width, amp, num_half_waves)     local xmul = width / (num_half_waves * PI)     local xd = XD * xmul     local path = 'M' .. coords(x, y)     for _ = 1, num_half_waves do         path = path .. ' C' .. coords(x + xd,   y + amp * Y1)                     ..  ' ' .. coords(x + 2*xd, y + amp * Y2)                     ..  ' ' .. coords(x + 3*xd, y + amp * Y3)                     .. ' C' .. coords(x + 4*xd, y + amp * Y4)                     ..  ' ' .. coords(x + 5*xd, y + amp)                     ..  ' ' .. coords(x + 6*xd, y + amp)                     .. ' C' .. coords(x + 7*xd, y + amp)                     ..  ' ' .. coords(x + 8*xd, y + amp * Y4)                     ..  ' ' .. coords(x + 9*xd, y + amp * Y3)                     .. ' C' .. coords(x + 10*xd, y + amp * Y2)                     ..  ' ' .. coords(x + 11*xd, y + amp * Y1)                     ..  ' ' .. coords(x + 12*xd, y)         x = x + width / num_half_waves         amp = amp * -1  -- flip over vertically every half wave     end     return path end  function coords (x, y)     return string.format('%g,%g', x, y) end  local fh = assert(io.open("Harmonic_partials_on_strings.svg", "wb")) fh:write('<?xml version="1.0" encoding="UTF-8"?>\n' ..          '<svg version="1.0" width="', img_wd, '" height="', img_ht,          '" xmlns="http://www.w3.org/2000/svg">\n')  local y_origin = MARGIN + AMPLITUDE local wave_labels, pick_circles = '', '' for n = 1, NUM_WAVES do     local amp = AMPLITUDE - (n - 1) * AMPLITUDE * 0.1     fh:write(' <path', WAVE_STYLE, ' d="',              sine_wave_path(MARGIN, y_origin, WAVE_WIDTH, amp, n), ' ',              sine_wave_path(MARGIN, y_origin, WAVE_WIDTH, -amp, n),              '"/>\n')     if n > 1 then         local pick_x = MARGIN + WAVE_WIDTH / n         local pick_r = AMPLITUDE * 0.2         pick_circles = pick_circles .. '  <circle cx="' .. pick_x ..                        '" cy="' .. y_origin + pick_r ..                        '" r="' .. pick_r .. '"/>\n'         wave_labels = wave_labels .. '  <text x="' .. pick_x ..                       '" y="' .. y_origin - FONT_SIZE + 2 * FONT_FUDGE ..                       '">1/' .. n .. '</text>\n'     end     y_origin = y_origin + 2 * AMPLITUDE + GAP_BETWEEN_WAVES end  fh:write(' <g stroke="#000" fill="#bbb">\n', pick_circles, ' </g>\n',          ' <g font-family="Bitstream Vera Sans" font-size="', FONT_SIZE, 'px"',          ' text-anchor="middle">\n',          '  <text x="', MARGIN + FONT_FUDGE,          '" y="', MARGIN + AMPLITUDE - FONT_SIZE + 2 * FONT_FUDGE,          '">0</text>\n',          '  <text x="', MARGIN + WAVE_WIDTH - FONT_FUDGE,          '" y="', MARGIN + AMPLITUDE - FONT_SIZE + 2 * FONT_FUDGE,          '">1</text>\n',          wave_labels,          ' </g>\n',          '</svg>\n') 

Licensing

Public domain This work has been released into the public domain by its author, Qef. This applies worldwide.

In some countries this may not be legally possible; if so:
Qef grants anyone the right to use this work for any purpose, without any conditions, unless such conditions are required by law.

Captions

Add a one-line explanation of what this file represents

Items portrayed in this file

depicts

8 July 2008

File history

Click on a date/time to view the file as it appeared at that time.

Date/TimeThumbnailDimensionsUserComment
current14:46, 8 July 2008Thumbnail for version as of 14:46, 8 July 2008620 × 590 (10 KB)Qef{{Information |Description={{en|1=Illustration of harmonic overtones on the wave set up along a string when it is held steady in certain places, as when a guitar string is plucked while lightly held exactly half way along its length. }} |Source=Own work

Global file usage

The following other wikis use this file:

View more global usage of this file.