Module:MOS gamut: Difference between revisions

Sintel (talk | contribs)
import gcd from utils
ArrowHead294 (talk | contribs)
mNo edit summary
 
(6 intermediate revisions by 2 users not shown)
Line 1: Line 1:
local mos = require('Module:MOS')
local rat = require('Module:Rational')
local mosm = require('Module:MOS modes')
local et = require('Module:ET')
local mosnot = require('Module:MOS notation')
local utils = require('Module:Utils')
local p = {}
local p = {}


-- Function that produces a gamut, a sequence of note names with accidentals, for an edo
local et = require("Module:ET")
local mos = require("Module:MOS")
local mosm = require("Module:MOS modes")
local mosnot = require("Module:MOS notation")
local rat = require("Module:Rational")
local utils = require("Module:Utils")
local yesno = require("Module:Yesno")
 
-- Helper function for the function that has "frame" as a parameter
-- Helper function for the function that has "frame" as a parameter
function p.mos_gamut(input_mos, udp, step_ratio, note_symbols, chroma_plus_symbol, chroma_minus_symbol)
function p.mos_gamut(input_mos, udp, step_ratio, note_symbols, chroma_plus_symbol, chroma_minus_symbol)
Line 97: Line 98:
-- How long are the genchains? Length is per period
-- How long are the genchains? Length is per period
local ascending_genchain_length = gens_up_per_period + genchain_extend
-- Genchain length counts the root, hence the +1
local descending_genchain_length = gens_down_per_period + genchain_extend
local ascending_genchain_length = gens_up_per_period + genchain_extend + 1
local descending_genchain_length = gens_down_per_period + genchain_extend + 1
-- Get the ascending and descending genchains
-- Get the ascending and descending genchains
Line 113: Line 115:
-- How many esteps are the bright and dark generators?
-- How many esteps are the bright and dark generators?
local bright_gen = mos.bright_gen(input_mos)
local bright_gen = mos.bright_gen(input_mos)
local esteps_per_bright_gen = bright_gen['L'] * num + bright_gen['s'] * den
local esteps_per_bright_gen = bright_gen["L"] * num + bright_gen["s"] * den
local esteps_per_dark_gen = esteps_per_period - esteps_per_bright_gen
local esteps_per_dark_gen = esteps_per_period - esteps_per_bright_gen
Line 124: Line 126:
-- Convert the notationally agnostic form into a form that uses given notation
-- Convert the notationally agnostic form into a form that uses given notation
local note = ascending_genchain[j][i]
local note = ascending_genchain[j][i]
local note_symbol = string.sub(note_symbols, note['mossteps'] + 1, note['mossteps'] + 1)
local note_symbol = string.sub(note_symbols, note["Mossteps"] + 1, note["Mossteps"] + 1)
local chroma_count = note['chromas']
local chroma_count = note["Chromas"]
local note_name = note_symbol .. string.rep(chroma_plus_symbol, chroma_count)
local note_name = note_symbol .. string.rep(chroma_plus_symbol, chroma_count)
Line 137: Line 139:
-- Convert the notationally agnostic form into a form that uses given notation
-- Convert the notationally agnostic form into a form that uses given notation
local note = descending_genchain[j][i]
local note = descending_genchain[j][i]
local note_symbol = string.sub(note_symbols, note['mossteps'] + 1, note['mossteps'] + 1)
local note_symbol = string.sub(note_symbols, note["Mossteps"] + 1, note["Mossteps"] + 1)
local chroma_count = note['chromas'] * -1
local chroma_count = note["Chromas"] * -1
local note_name = note_symbol .. string.rep(chroma_minus_symbol, chroma_count)
local note_name = note_symbol .. string.rep(chroma_minus_symbol, chroma_count)
Line 160: Line 162:
function p.mos_gamut_frame(frame)
function p.mos_gamut_frame(frame)
-- Default parameters for input mos and step ratio (5L 2s and 2:1 step ratio)
-- Default parameters for input mos and step ratio (5L 2s and 2:1 step ratio)
local input_mos_unparsed = frame.args['Scale Signature']
local input_mos_unparsed = frame.args["Scale Signature"]
local input_mos = mos.parse(input_mos_unparsed) or mos.new(2, 5, 2)
local input_mos = mos.parse(input_mos_unparsed) or mos.new(2, 5, 2)
-- Step ratio
-- Step ratio
local step_ratio = { 2, 1 }
local step_ratio = { 2, 1 }
if string.len(frame.args['Step Ratio']) > 0 then
if string.len(frame.args["Step Ratio"]) > 0 then
step_ratio = mosnot.parse_step_ratio(frame.args['Step Ratio'])
step_ratio = mosnot.parse_step_ratio(frame.args["Step Ratio"])
end
end
Line 186: Line 188:
udp = { 5, 1 }
udp = { 5, 1 }
end
end
if string.len(frame.args['UDP']) > 0 then
if string.len(frame.args["UDP"]) > 0 then
udp = mosnot.parse_udp(frame.args['UDP'])
udp = mosnot.parse_udp(frame.args["UDP"])
end
end
local generators_up = udp[1]
local generators_up = udp[1]
Line 193: Line 195:
-- Get notation: naturals (or nominals), sharp symbol, and flat symbol
-- Get notation: naturals (or nominals), sharp symbol, and flat symbol
local notation_default = { ['Naturals'] = string.sub("JKLMNOPQRSTUVWXYZ", 1, mossteps_per_equave), ['Sharp'] = "&", ['Flat'] = "@" }
local notation_default = { ["Naturals"] = string.sub("JKLMNOPQRSTUVWXYZ", 1, mossteps_per_equave), ["Sharp"] = "&", ["Flat"] = "@" }
if scale_sig == "5L 2s" then
if scale_sig == "5L 2s" then
notation_default['Naturals'] = "CDEFGAB"
notation_default["Naturals"] = "CDEFGAB"
notation_default['Sharp'] = "#"
notation_default["Sharp"] = "#"
notation_default['Flat'] = "b"
notation_default["Flat"] = "b"
end
end
local notation = mosnot.parse_notation(frame.args['Notation']) or notation_default
local notation = mosnot.parse_notation(frame.args["Notation"]) or notation_default
local note_symbols = notation['Naturals']
local note_symbols = notation["Naturals"]
local chroma_plus_symbol = notation['Sharp']
local chroma_plus_symbol = notation["Sharp"]
local chroma_minus_symbol = notation['Flat']
local chroma_minus_symbol = notation["Flat"]
-- Get the gamut
-- Get the gamut
Line 221: Line 223:
result = result .. "'''" .. gamut[#gamut] .. "'''"
result = result .. "'''" .. gamut[#gamut] .. "'''"
return result
-- Debugger option
local debugg = yesno(frame.args["debug"])
if debugg == true then
result = "<syntaxhighlight lang=\"wikitext\">" .. result .. "</syntaxhighlight>"
end
return frame:preprocess(result)
end
end


return p
return p