Module:MOS in EDO allperiods: Difference between revisions

Ganaram inukshuk (talk | contribs)
Fixed error with starting generator calculation
Ganaram inukshuk (talk | contribs)
Added option to toggle displaying mosses of subset edos; for ease of entering temperaments, this requires entering temperaments as key-value pairs rather than an array, so entering temperaments is temporarily disabled
Line 4: Line 4:
local mosinedo = require('Module:MOS in EDO')
local mosinedo = require('Module:MOS in EDO')
local p = {}
local p = {}
-- Helper function
-- Parses entries from a semicolon-delimited string and returns them in an array
-- TODO: Separate this and related functions (parse_pair and parse_kv_pairs) into its own module, as they're included
-- in various modules at this point, such as: scale tree, mos mdoes
function p.parse_entries(unparsed)
local parsed = {}
for entry in string.gmatch(unparsed, '([^;]+)') do
local trimmed = entry:gsub("^%s*(.-)%s*$", "%1")
table.insert(parsed, trimmed) -- Add to array
end
return parsed
end


-- Main function
-- Main function
Line 23: Line 10:
-- separately for each period count if it can support multi-period mosses
-- separately for each period count if it can support multi-period mosses
-- Generators start with half the period rounded down, plus 1
-- Generators start with half the period rounded down, plus 1
function p.moses_in_edo(edo, number_of_periods, temperaments)
-- If the edo has subset edos (such as 24edo containing 12edo and 8edo), mosses
-- for those subset edos are skipped, unless show_subsets is set to 1 (true)
function p.moses_in_edo(edo, number_of_periods, show_subsets, temperaments)
local edo = edo or 12
local edo = edo or 12
local number_of_periods = number_of_periods or 1
local number_of_periods = number_of_periods or 1
local temperaments = temperaments --or { "slender", "valentine", "miracle", "nusecond", "hemithirds", "mothra", "orwell", "myna", "mohajira", "würschmidt", "squares", "semisept", "meantone", "casablanca", "tritonic" }
local show_subsets = show_subsets == 1
local temperaments = temperaments
-- Check whether the number of periods divides the edo
-- Check whether the number of periods divides the edo
Line 49: Line 39:
local show_temperament = temperaments ~= nil and #temperaments == math.floor(period_in_edosteps / verified_number_of_periods / 2)
local show_temperament = temperaments ~= nil and #temperaments == math.floor(period_in_edosteps / verified_number_of_periods / 2)
-- Temporarily disable entry of temperament names
-- Temperament names will be entered as a set of key-value pairs instead of an array
show_temperament = false
-- Add a table for each genpair
local result = ""
local result = ""
for i = starting_generator, period_in_edosteps - 1 do
for i = starting_generator, period_in_edosteps - 1 do
local gen = i
local gen = i
local comp = period_in_edosteps - gen
local comp = period_in_edosteps - gen
--result = result .. string.format("=== MOS scales with generator %d\\%d and %d\\%d ===\n", gen, edo, comp, edo)
result = result .. string.format("MOS scales with generators %i\\%i and %i\\%i.\n", gen, edo, comp, edo)
local temperament_index = 1 + i - starting_generator
-- Skip mosses that are supported by subset edos; this happens if the
if show_temperament then
-- gen and comp have a gcd > 1; if show_subsets is set to true, then
result = result .. mosinedo.mos_in_edo(edo, i, verified_number_of_periods, temperaments[temperament_index])
-- show them anyway
local gcd = utils.gcd_(gen, comp)
if gcd ~= 1 and not show_subsets then
local subset_edo = edo / gcd;
local subset_gen = gen / gcd;
local subset_comp = comp / gcd;
result = result .. string.format('Generators form a subset scale in [[%iedo]] with the generators %i\\%i and %i\\%i.\n', subset_edo, subset_gen, subset_edo, subset_comp, subset_edo)
else
else
result = result .. mosinedo.mos_in_edo(edo, i, verified_number_of_periods)
-- TODO: Rewrite code here for entry of temperaments as a set of
-- key-value pairs
local temperament_index = 1 + i - starting_generator
if show_temperament then
result = result .. mosinedo.mos_in_edo(edo, i, verified_number_of_periods, temperaments[temperament_index])
else
result = result .. mosinedo.mos_in_edo(edo, i, verified_number_of_periods)
end
end
end
end
end
Line 73: Line 80:
local temperaments = p.parse_entries(frame.args["Temperaments"])
local temperaments = p.parse_entries(frame.args["Temperaments"])
local number_of_periods = tonumber(frame.args["Number of Periods"])
local number_of_periods = tonumber(frame.args["Number of Periods"])
local show_subsets = frame.args["Show Subsets"] == "1"
local result = p.moses_in_edo(edo, number_of_periods, temperaments)
local result = p.moses_in_edo(edo, number_of_periods, show_subsets, temperaments)
return result
return result