Module:MOS: Difference between revisions

From Xenharmonic Wiki
Jump to navigation Jump to search
Inthar (talk | contribs)
No edit summary
Inthar (talk | contribs)
No edit summary
Line 13: Line 13:
-- create a MOS structure (nL)L (ns)s <equave>
-- create a MOS structure (nL)L (ns)s <equave>
function p.new(nL, ns, equave)
function p.new(nL, ns, equave)
nL = nL or 5
local nL = nL or 5
ns = ns or 2
local ns = ns or 2
equave = equave or 2
local equave = equave or 2
return { nL = nL, ns = ns, equave = equave }
return { nL = nL, ns = ns, equave = equave }
end
end
Line 34: Line 34:
-- construct a string representation for a MOS structure
-- construct a string representation for a MOS structure
function p.as_string(mos)
function p.as_string(mos)
return et.size .. et.suffix
local suffix = nil
end
if mos.equave ~= 2 then
 
suffix = "<" .. rat.as_ratio(mos.equave):lower() .. ">"
-- convert steps to a proper ratio (except that it is a float approximation)
function p.backslash_ratio(et, steps)
if et.size == 0 then
return 1
end
return rat.as_float(et.equave) ^ (steps / et.size)
end
 
-- convert steps to cents
function p.cents(et, steps)
if et.size == 0 then
return 0
end
end
steps = steps or 1
return mos.nL .. "L " .. mos.ns .. "s " .. suffix
return 1200 * steps / et.size * math.log(rat.as_float(et.equave)) / math.log(2)
end
end


return p
return p

Revision as of 18:50, 29 March 2023

Module documentation[view] [edit] [history] [purge]
This module primarily serves as a library for other modules and has no corresponding template.

This module provides functions for working with MOS scales in Lua code.


Introspection summary for Module:MOS 
Functions provided (3)
Line Function Params
14 new (nL, ns, equave)
22 parse (unparsed)
35 as_string (mos)
Lua modules required (3)
Variable Module Functions used
et Module:ET dependency not used
rat Module:Rational new
parse
as_ratio
seq Module:Sequence dependency not used

No function descriptions were provided. The Lua code may have further information.


local rat = require('Module:Rational')
local seq = require('Module:Sequence')
local et = require('Module:ET')
local p = {}

local common_name = {
	['3/2'] = 'fifth'
}
local common_ratio = {
	['fifth'] = rat.new(3, 2)
}

-- create a MOS structure (nL)L (ns)s <equave>
function p.new(nL, ns, equave)
	local nL = nL or 5
	local ns = ns or 2
	local equave = equave or 2
	return { nL = nL, ns = ns, equave = equave }
end

-- parse a MOS structure
function p.parse(unparsed)
	local nL, ns, equave = unparsed:match('^(%d+[Ll])(%s*)(%d+[Ss])(%s*)(.-equivalent)$')
	if equave == nil then
		equave = 2
	end
	equave = common_ratio[equave] or rat.parse(equave)
	if nL == nil or ns == nil or equave == nil then
		return nil
	end
	return p.new(nL, ns, equave)
end

-- construct a string representation for a MOS structure
function p.as_string(mos)
	local suffix = nil
	if mos.equave ~= 2 then
		suffix = "<" .. rat.as_ratio(mos.equave):lower() .. ">" 
	end
	return mos.nL .. "L " .. mos.ns .. "s " .. suffix
end

return p