Module:ED intro: Difference between revisions
Undo revision 140630 by Ganaram inukshuk (talk) Tag: Undo |
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. | 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, | 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, | local parsed_ed, parsed_equave, ed_type = p.parse(ed) | ||
if | if ed_type == ED_TYPE_DEFAULT then | ||
return "Equave not supported." | return "Equave type not supported or entered incorrectly." | ||
elseif | elseif ed_type == ED_TYPE_EDO then | ||
return p.edo_intro(parsed_ed) | return p.edo_intro(parsed_ed) | ||
elseif | elseif ed_type == ED_TYPE_EDT then | ||
return p.edt_intro(parsed_ed) | return p.edt_intro(parsed_ed) | ||
elseif | elseif ed_type == ED_TYPE_EDF then | ||
return p.edf_intro(parsed_ed) | return p.edf_intro(parsed_ed) | ||
elseif | elseif ed_type == ED_TYPE_EDH then | ||
return p.edh_intro(parsed_ed, parsed_equave) | return p.edh_intro(parsed_ed, parsed_equave) | ||
elseif | elseif ed_type == ED_TYPE_EDR then | ||
return p.edr_intro(parsed_ed, parsed_equave) | return p.edr_intro(parsed_ed, parsed_equave) | ||
elseif | elseif ed_type == ED_TYPE_EDC then | ||
return p. | return p.edc_intro(parsed_ed, parsed_equave) | ||
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 | ||