Module:ED intro: Difference between revisions

Ganaram inukshuk (talk | contribs)
Undo revision 140630 by Ganaram inukshuk (talk)
Tag: Undo
Ganaram inukshuk (talk | contribs)
Rewrote code for better handling of ed types; added edo compare function (for outputting things like "12edf corresponds to 20.5edo"), but requires further rewriting/testing
Line 16: Line 16:
-- - Equal divisions of irrational constants (such as pi and e) are not very
-- - Equal divisions of irrational constants (such as pi and e) are not very
--  common, but count as equal divisions of arbitrary cent values.
--  common, but count as equal divisions of arbitrary cent values.
local ED_TYPE_EDO = "EDO"
local ED_TYPE_EDT = "EDT"
local ED_TYPE_EDF = "EDF"
local ED_TYPE_EDH = "EDH"
local ED_TYPE_EDR = "EDR"
local ED_TYPE_EDC = "EDC"
local ED_TYPE_DEFAULT = "UNKNOWN_TYPE"


-- Separate function for edo intro
-- Separate function for edo intro
Line 162: Line 170:


-- Separate function for edc (arbitrary cent value)
-- Separate function for edc (arbitrary cent value)
function p.edcent_intro(ed, cents)
function p.edc_intro(ed, cents)
local ed = ed or 1
local ed = ed or 1
local cents = cents or 97.5
local cents = cents or 97.5
Line 206: Line 214:
-- Parse equave
-- Parse equave
local parsed_equave
local parsed_equave
local ed_type = ED_TYPE_DEFAULT
if equave == "o" or equave == "O" or equave == "2" or equave == "2/1" then
if equave == "o" or equave == "O" or equave == "2" or equave == "2/1" then
-- Equave is octave
-- Equave is octave
parsed_equave = 2
parsed_equave = 2
ed_type = ED_TYPE_EDO
elseif equave == "t" or equave == "T" or equave == "3" or equave == "3/1" then
elseif equave == "t" or equave == "T" or equave == "3" or equave == "3/1" then
-- Equave is tritave/twelfth
-- Equave is tritave/twelfth
parsed_equave = 3
parsed_equave = 3
ed_type = ED_TYPE_EDT
elseif equave == "f" or equave == "F" or equave == "3/2" then
elseif equave == "f" or equave == "F" or equave == "3/2" then
-- Equave is fifth
-- Equave is fifth
parsed_equave = rat.new(3,2)
parsed_equave = rat.new(3,2)
ed_type = ED_TYPE_EDF
elseif string.match(equave, '^%d+$') ~= nil then
elseif string.match(equave, '^%d+$') ~= nil then
-- Equave is arbitrary harmonic (not 2/1 or 3/1)
-- Equave is arbitrary harmonic (not 2/1 or 3/1)
parsed_equave = tonumber(equave)
parsed_equave = tonumber(equave)
ed_type = ED_TYPE_EDH
elseif string.match(equave, '^%d+/%d+$') ~= nil then
elseif string.match(equave, '^%d+/%d+$') ~= nil then
-- Equave is arbitrary ratio (not 3/2)
-- Equave is arbitrary ratio (not 3/2)
local num, den = equave:match('^(%d+)/(%d+)$')
local num, den = equave:match('^(%d+)/(%d+)$')
parsed_equave = rat.new(tonumber(num), tonumber(den))
parsed_equave = rat.new(tonumber(num), tonumber(den))
ed_type = ED_TYPE_EDR
elseif is_cents then
elseif is_cents then
-- Equave is arbitrary cent value
-- Equave is arbitrary cent value
parsed_equave = tonumber(equave:match('^(%d*%.?%d+)[Cc¢]$'))
parsed_equave = tonumber(equave:match('^(%d*%.?%d+)[Cc¢]$'))
ed_type = ED_TYPE_EDC
else
else
-- Equave is unsupported
-- Equave is unsupported
Line 230: Line 245:
end
end
return tonumber(steps), parsed_equave, is_cents
return tonumber(steps), parsed_equave, ed_type
end
 
-- ED-EDO comparison
-- Meant for finding what edo a nonoctave ed corresponds to
function p.edo_compare(ed)
local ed = ed or "12edf"
local parsed_ed, parsed_equave, ed_type = p.parse(ed)
local edstep_size = 0;
if ed_type == ED_TYPE_EDC then
edstep_size = parsed_equave / parsed_ed
else
edstep_size = rat.cents(parsed_equave) / parsed_ed
end
local ed_compare = 1200 / edstep_size
local ed_compare_text = "''ed1'' roughly corresponds to ''ed2''edo, "
-- Replace certain strings with the intended final versions
ed_compare_text = string.gsub(ed_compare_text, "''ed1''", ed)
ed_compare_text = string.gsub(ed_compare_text, "''ed2''", string.format("%.3f", ed_compare))
local ed_floor = math.floor(ed_compare)
local diff = ed_compare - ed_floor
if diff > 0.5 then
ed_compare_text = ed_compare_text .. string.format("and can be seen as %dedo with stretched octaves", ed_floor+1)
else
ed_compare_text = ed_compare_text .. string.format("and can be seen as %dedo with compressed octaves", ed_floor)
end
if diff > 0.4 and diff < 0.6 then
ed_compare_text = ed_compare_text .. string.format(", or roughly every second step of %dedo.", 2*ed_floor+1)
else
ed_compare_text = ed_compare_text .. "."
end
return ed_compare_text
end
end


Line 237: Line 291:
local ed = ed or "12"
local ed = ed or "12"
local parsed_ed, parsed_equave, is_cent_value = p.parse(ed)
local parsed_ed, parsed_equave, ed_type = p.parse(ed)
if rat.eq(0, parsed_equave) then
if ed_type == ED_TYPE_DEFAULT then
return "Equave not supported."
return "Equave type not supported or entered incorrectly."
elseif rat.eq(2, parsed_equave) then
elseif ed_type == ED_TYPE_EDO then
return p.edo_intro(parsed_ed)
return p.edo_intro(parsed_ed)
elseif rat.eq(3, parsed_equave) then
elseif ed_type == ED_TYPE_EDT then
return p.edt_intro(parsed_ed)
return p.edt_intro(parsed_ed)
elseif rat.eq(rat.new(3,2), parsed_equave) then
elseif ed_type == ED_TYPE_EDF then
return p.edf_intro(parsed_ed)
return p.edf_intro(parsed_ed)
elseif rat.is_harmonic(parsed_equave) and not is_cent_value then
elseif ed_type == ED_TYPE_EDH then
return p.edh_intro(parsed_ed, parsed_equave)
return p.edh_intro(parsed_ed, parsed_equave)
elseif not rat.is_harmonic(parsed_equave) then
elseif ed_type == ED_TYPE_EDR then
return p.edr_intro(parsed_ed, parsed_equave)
return p.edr_intro(parsed_ed, parsed_equave)
elseif is_cent_value then
elseif ed_type == ED_TYPE_EDC then
return p.edcent_intro(parsed_ed, parsed_equave)
return p.edc_intro(parsed_ed, parsed_equave)
else
return "Invalid input."
end
end
end
-- Tester function
function p.ed_intro_tester()
return
p._ed_intro("12") .. "\n" ..
p._ed_intro("12edt") .. "\n" ..
p._ed_intro("12edf") .. "\n" ..
p._ed_intro("12ed4") .. "\n" ..
p._ed_intro("12ed9/8") .. "\n" ..
p._ed_intro("12ed666c") .. "\n" .. "\n" ..
p._ed_intro("1") .. "\n" ..
p._ed_intro("1ed3") .. "\n" ..
p._ed_intro("1ed3/2") .. "\n" ..
p._ed_intro("1ed4") .. "\n" ..
p._ed_intro("1ed9/8") .. "\n" ..
p._ed_intro("1ed666c") .. "\n"
end
end