Module:MOS

From Xenharmonic Wiki
Revision as of 20:56, 31 March 2023 by Inthar (talk | contribs)
Jump to navigation Jump to search
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
eq
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*(.*)$')
	nL = tonumber(nL)
	ns = tonumber(ns)
	equave = rat.parse(equave:match('^%((.*)%)$')) or 2
	equave = common_ratio[equave] or 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 = ''
	if not rat.eq(mos.equave, 2) then
		suffix = '<' .. rat.as_ratio(mos.equave):lower() .. '>'
	end
	return '' .. mos.nL .. 'L ' .. mos.ns .. 's' .. suffix
end

return p