Module:Interval edo approximation: Difference between revisions

Pailiaq (talk | contribs)
No edit summary
Don't invent the wheel
Line 2: Line 2:
-- Calculates EDO approximations for just intervals
-- Calculates EDO approximations for just intervals
-- Usage: {{#invoke:EDO_Approximations|main|interval=3/2|tolerance=9|min_edo=5|max_edo=60}}
-- Usage: {{#invoke:EDO_Approximations|main|interval=3/2|tolerance=9|min_edo=5|max_edo=60}}
local u = require("Module:Utils")
local yesno = require("Module:Yesno")
local yesno = require("Module:Yesno")
local p = {}
local p = {}
Line 14: Line 15:
-- Python: return 1200 * math.log2(ratio)
-- Python: return 1200 * math.log2(ratio)
local function cents(ratio)
local function cents(ratio)
    -- Lua doesn't have log2, so use change of base formula
     return 1200 * u.log2(ratio)
     return 1200 * (math.log(ratio) / math.log(2))
end
 
-- Parse a ratio string like '3/2' into a number
-- Python: parts = ratio_str.strip().split('/'); return float(parts[0]) / float(parts[1])
local function parse_ratio(ratio_str)
    -- Strip whitespace (equivalent to Python's strip())
    ratio_str = ratio_str:match("^%s*(.-)%s*$")
 
    -- Split on '/' and parse numerator/denominator
    local slash_pos = ratio_str:find("/")
    if not slash_pos then
        return nil
    end
 
    local num_str = ratio_str:sub(1, slash_pos - 1)
    local denom_str = ratio_str:sub(slash_pos + 1)
 
    local num = tonumber(num_str)
    local denom = tonumber(denom_str)
 
    if not num or not denom or denom == 0 then
        return nil
    end
 
    -- Return exact division (equivalent to Python's float division)
    return num / denom
end
end


Line 129: Line 103:


     -- Parse interval string to numeric ratio
     -- Parse interval string to numeric ratio
     local ratio = parse_ratio(interval_str)
     local ratio = eval_num_arg(interval_str)
     if not ratio then
     if not ratio then
         return "Error: Invalid interval format (use format like '3/2')"
         return "Error: Invalid interval format (use format like '3/2')"