|
|
| Line 19: |
Line 19: |
|
| |
|
| -- 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, generation_limit, temperaments)
| |
| local edo = edo or 12
| |
| local number_of_periods = number_of_periods or 1
| |
| local show_subsets = show_subsets == 1
| |
| local generation_limit = generation_limit 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
| |
|
| |
| -- 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 = period_in_edosteps - 1
| |
| 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, generation_limit, temperaments[temperament_index])
| |
| else
| |
| result = result .. mosinedo.mos_in_edo_simplified(edo, i, verified_number_of_periods, generation_limit)
| |
| 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, generation_limit, temperaments) | | function p.moses_in_edo(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 |
| Line 223: |
Line 147: |
| local max_periods = tonumber(frame.args["Period Limit"]) or -1 | | local max_periods = tonumber(frame.args["Period Limit"]) or -1 |
| local generation_limit = 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 result = "" | | local result = "" |
| if num_periods ~= nil then | | result = p.moses_in_edo(edo, max_periods, show_subsets, generation_limit, temperaments) |
| result = p.moses_in_edo(edo, num_periods, show_subsets, generation_limit, temperaments)
| |
| else
| |
| result = p.moses_in_edo_multi_periods(edo, max_periods, show_subsets, generation_limit, temperaments)
| |
| end
| |
| | | |
| return result | | return result |