Module:MOS degrees: Difference between revisions
Degreechain function outputs result in notationally agnostic form (mossteps and quality) for ease of translation to tamnams or other notation |
Degreechain function no longer depends on mos gamut module; interval qualities are now encoded numerically (0 = perfect root, 1 = large size, -1 = small size, 2 = augmented, -2 = diminished, etc) |
||
| Line 57: | Line 57: | ||
--[[ | --[[ | ||
local input_mos = input_mos or mos.new(5, 2, 2) | local input_mos = input_mos or mos.new(5, 2, 2) | ||
local genchain_length_per_period = genchain_length_per_period or | local genchain_length_per_period = genchain_length_per_period or 10 | ||
local going_up = | local going_up = false | ||
]]-- | ]]-- | ||
| Line 69: | Line 69: | ||
local bright_gen = mos.bright_gen(input_mos) | local bright_gen = mos.bright_gen(input_mos) | ||
local mossteps_per_bright_gen = bright_gen['L'] + bright_gen['s'] | local mossteps_per_bright_gen = bright_gen['L'] + bright_gen['s'] | ||
local mossteps_per_dark_gen = mossteps_per_period - mossteps_per_bright_gen | |||
local degreechain = {} | local degreechain = {} | ||
for j = 1, periods_per_equave do | for j = 1, periods_per_equave do | ||
local chain_for_period = {} | local chain_for_period = {} | ||
for i = 1, | |||
local | -- Define mossteps and quality as counters | ||
-- Quality encodes major/minor/perfect/aug/dim numerically this way: | |||
-- - 3 = 2x augmented | |||
-- - 2 = 1x augmented | |||
-- - 1 = large size (major; perfect for bright gen) | |||
-- - 0 = perfect (reserved for root only) | |||
-- - -1 = small size (minor; perfect for dark gen) | |||
-- - -2 = 1x diminished | |||
-- - -3 = 2x diminished | |||
local mossteps = (j - 1) * mossteps_per_period | |||
local quality = 0 | |||
for i = 1, genchain_length_per_period do | |||
-- Put together the name | |||
local degree = { ['mossteps'] = mossteps, ['quality'] = quality } | |||
table.insert(chain_for_period, degree) | |||
-- Increment the counters | |||
if going_up then | |||
-- Increment quality when mossteps is the root of the period | |||
-- | if mossteps % mossteps_per_period == 0 then | ||
quality = quality + 1 | |||
if | |||
quality = | |||
end | end | ||
mossteps = mossteps_per_bright_gen + mossteps -- Increment | |||
mossteps = mossteps % mossteps_per_period -- Constrain | |||
mossteps = mossteps + (j-1) * mossteps_per_period -- Offset by period | |||
else | else | ||
-- Increment quality when mossteps is the root of the period | |||
if mossteps % mossteps_per_period == 0 then | |||
quality = quality - 1 | |||
quality = | |||
end | end | ||
mossteps = mossteps_per_dark_gen + mossteps -- Increment | |||
mossteps = mossteps % mossteps_per_period -- Constrain | |||
-- Use contrained mossteps value to determine whether to | |||
-- decrement the quality | |||
mossteps = mossteps + (j-1) * mossteps_per_period -- Offset by period | |||
end | end | ||
end | end | ||
table.insert(degreechain, chain_for_period) | table.insert(degreechain, chain_for_period) | ||