Module:MOS in EDO allperiods: Difference between revisions

Ganaram inukshuk (talk | contribs)
m Simplified arg names
ArrowHead294 (talk | contribs)
mNo edit summary
 
(28 intermediate revisions by 2 users not shown)
Line 1: Line 1:
local mos = require('Module:MOS')
local mos = require("Module:MOS")
local rat = require('Module:Rational')
local rat = require("Module:Rational")
local utils = require('Module:Utils')
local utils = require("Module:Utils")
local mosinedo = require('Module:MOS in EDO')
local mosinedo = require("Module:MOS in EDO")
local yesno = require("Module:Yesno")
local p = {}
local p = {}


Line 11: Line 12:
function p.parse_entries(unparsed)
function p.parse_entries(unparsed)
local parsed = {}
local parsed = {}
for entry in string.gmatch(unparsed, '([^;]+)') do
for entry in string.gmatch(unparsed, "([^;]+)") do
local trimmed = entry:gsub("^%s*(.-)%s*$", "%1")
local trimmed = entry:gsub("^%s*(.-)%s*$", "%1")
table.insert(parsed, trimmed) -- Add to array
table.insert(parsed, trimmed) -- Add to array
Line 19: Line 20:


-- Main function
-- Main function
-- Creates an entire page section for every mos in an edo
-- Mosses with the same period are only shown; this function must be called
-- separately for each period count if it can support multi-period mosses
-- Generators start with half the period rounded down, plus 1
-- 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, max_generations, temperaments)
local edo = edo or 12
local number_of_periods = number_of_periods or 1
local show_subsets = show_subsets == 1
local max_generations = max_generations or edo - 1
local temperaments = temperaments
-- Check whether the number of periods divides the edo
-- If so, the entire page section will be for multiperiod mosses
local period_in_edosteps = edo
local verified_number_of_periods = 1
if edo % number_of_periods == 0 then
period_in_edosteps = edo / number_of_periods
verified_number_of_periods = number_of_periods
end
-- Starting generator
-- If the generator and its complement are the same, skip that genpair by
-- incrementing the starting generator by 1
local starting_generator = math.ceil(period_in_edosteps / 2)
local complement = period_in_edosteps - starting_generator
if starting_generator == complement then
starting_generator = starting_generator + 1
end
-- Include temperament names?
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 = ""
for i = starting_generator, period_in_edosteps - 1 do
local gen = i
local comp = period_in_edosteps - gen
--result = result .. string.format("MOS scales with generators %i\\%i and %i\\%i.\n", gen, edo, comp, edo)
-- Skip mosses that are supported by subset edos; this happens if the
-- gen and comp have a gcd > 1; if show_subsets is set to true, then
-- show them anyway.
local gcd = utils._gcd(gen, comp)
local add_table = gcd == 1 or show_subsets
-- Add table
if add_table then
-- 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_simplified(edo, i, verified_number_of_periods, max_generations, temperaments[temperament_index])
else
result = result .. mosinedo.mos_in_edo_simplified(edo, i, verified_number_of_periods, max_generations)
end
end
end
return result
end
-- Main function variant
-- Creates tables for every mos in an edo, for every possible period count
-- Creates tables for every mos in an edo, for every possible period count
function p.moses_in_edo_multi_periods(edo, max_number_of_periods, show_subsets, max_generations, temperaments)
function p.mos_in_edo_allperiods(edo, max_number_of_periods, show_subsets, generation_limit, temperaments)
local edo = edo or 12
local edo = edo or 12
local max_number_of_periods = max_number_of_periods or -1
local max_number_of_periods = max_number_of_periods or -1
local show_subsets = show_subsets == 1
local show_subsets = show_subsets == 1
local max_generations = max_generations or edo - 1
local generation_limit = generation_limit or edo - 1
local temperaments = temperaments
local temperaments = temperaments
is_debug = (is_debug or false)
-- Include temperament names?
-- Include temperament names?
Line 117: Line 51:
else
else
max_number_of_periods = math.min(default_max, max_number_of_periods)
max_number_of_periods = math.min(default_max, max_number_of_periods)
end
-- Check whether the generation limit is valid
-- Technically, any number above the edo works with showing all generations (rows)
-- If it's -1, then show all generations (period_in_edosteps-1)
if generation_limit == -1 then
generation_limit = edo - 1
end
end
Line 122: Line 63:
-- TODO: Show period/note/subset limits if applicable
-- TODO: Show period/note/subset limits if applicable
local result = ""
local result = ""
result = result .. string.format("This page lists all [[moment of symmetry]] scales in [[%iedo]].\n", edo)
result = result .. string.format("This page lists all [[moment of symmetry]] scales in [[%iedo]].\n__TOC__\n", edo)
-- Call a for loop that produces a set of tables for each period count
-- Call a for loop that produces a set of tables for each period count
Line 143: Line 84:
-- Add a section header
-- Add a section header
if number_of_periods == 1 then
if number_of_periods == 1 then
result = result .. string.format("== Single-period MOS scales ==\n")
result = result .. "<h2>Single-period MOS scales</h2>\n"
else
else
-- If the L2 header wasn't written yet, write that, followed by
-- If the L2 header wasn't written yet, write that, followed by
Line 149: Line 90:
-- header.
-- header.
if not multi_period_header_written then
if not multi_period_header_written then
result = result .. string.format("== Multi-period MOS scales ==\n")
result = result .. string.format("<h2>Multi-period MOS scales</h2>\n")
result = result .. string.format("=== %i periods ===\n", number_of_periods)
multi_period_header_written = true
multi_period_header_written = true
else
result = result .. string.format("=== %i periods ===\n", number_of_periods)
end
end
result = result .. string.format("<h3>%i periods</h3>\n", number_of_periods)
end
end
Line 175: Line 114:
local temperament_index = 1 + i - starting_generator
local temperament_index = 1 + i - starting_generator
if show_temperament then
if show_temperament then
result = result .. mosinedo.mos_in_edo_simplified(edo, i, number_of_periods, max_generations, temperaments[temperament_index])
result = result .. mosinedo.mos_in_edo_simplified(edo, i, number_of_periods, generation_limit, temperaments[temperament_index])
else
else
result = result .. mosinedo.mos_in_edo_simplified(edo, i, number_of_periods, max_generations)
result = result .. mosinedo.mos_in_edo_simplified(edo, i, number_of_periods, generation_limit)
end
end
result = result .. "\n\n"
end
end
end
end
Line 184: Line 124:
end
end
-- Add categories
result = result .. string.format("[[Category:%iedo]]\n", edo)
.. "[[Category:Lists of scales]]\n"
.. "[[Category:MOS scales]]"
return result
return result
end
end


function p.test()
function p.test()
return tonumber("")
return tonumber("")
end
end
Line 202: Line 146:
-- - Hide Step Pattern: if ever set to 1, this disables the step pattern visualization; will automatically set to 1 for mosses over 60edo, unless overridden.
-- - Hide Step Pattern: if ever set to 1, this disables the step pattern visualization; will automatically set to 1 for mosses over 60edo, unless overridden.
-- Maximum values can be overridden to have no max if set to "-1"
-- Maximum values can be overridden to have no max if set to "-1"
function p.moses_in_edo_frame(frame)
function p.mos_in_edo_allperiods_frame(frame)
local edo = tonumber(frame.args["EDO"])
local edo = tonumber(frame.args["EDO"])
local temperaments = p.parse_entries(frame.args["Temperaments"])
local temperaments = p.parse_entries(frame.args["Temperaments"])
local show_subsets = tonumber(frame.args["Show Subsets"])
local show_subsets = tonumber(frame.args["Show Subsets"])
local max_periods = tonumber(frame.args["Period Limit"]) or -1
local max_periods = tonumber(frame.args["Period Limit"]) or -1
local max_generations = tonumber(frame.args["Generation Limit"]) or -1
local generation_limit = tonumber(frame.args["Generation Limit"]) or -1
local num_periods = tonumber(frame.args["Number of Periods"])
local debugg = yesno(frame.args["debug"])
local result = p.mos_in_edo_allperiods(edo, max_periods, show_subsets, generation_limit, temperaments)
local result = ""
-- Debugger option
if num_periods ~= nil then
if debugg == true then
result = p.moses_in_edo(edo, num_periods, show_subsets, max_generations, temperaments)
result = "<syntaxhighlight lang=\"wikitext\">" .. result .. "</syntaxhighlight>"
else
result = p.moses_in_edo_multi_periods(edo, max_periods, show_subsets, max_generations, temperaments)
end
end
return result
return frame:preprocess(result)
end
end


return p
return p