Module:Temperament data: Difference between revisions
Jump to navigation
Jump to search
CompactStar (talk | contribs) No edit summary |
CompactStar (talk | contribs) No edit summary |
||
Line 185: | Line 185: | ||
return result | return result | ||
end | end | ||
local function rat_to_subgroup_monzo(subgroup, x) | local function rat_to_subgroup_monzo(subgroup, x) | ||
local n, d = rat.as_pair(x) | local n, d = rat.as_pair(x) | ||
return matsub(int_to_subgroup_monzo(n), int_to_subgroup_monzo(d)) | return matsub({int_to_subgroup_monzo(subgroup, n)}, {int_to_subgroup_monzo(subgroup, d)})[1] | ||
end | end | ||
function p.rat_list_to_matrix(subgroup, list) | |||
local result = {} | local result = {} | ||
for j = 1, #subgroup do | for j = 1, #subgroup do | ||
Line 205: | Line 204: | ||
end | end | ||
end | end | ||
return result | |||
end | end | ||
Revision as of 04:13, 15 February 2024
Note: Do not invoke this module directly; use the corresponding template instead: Template:Temperament data.
local rat = require('Module:Rational')
local p = {}
local function gcd(a,b)
if type(a) == "number" and type(b) == "number" and
a == math.floor(a) and b == math.floor(b) then
if b == 0 then
return a
else
return gcd(b, a % b) -- tail recursion
end
else
error("Invalid argument to gcd (" .. tostring(a) .. "," ..
tostring(b) .. ")", 2)
end
end
-- Linear algebra and RTT functions
local function matadd(a, b)
local result = {}
for i = 1, #a do
result[i] = {}
for j = 1, #(b[1]) do
result[i][j] = a[i][j] + b[i][j]
end
end
return result
end
local function matsub(a, b)
local result = {}
for i = 1, #a do
result[i] = {}
for j = 1, #(b[1]) do
result[i][j] = a[i][j] - b[i][j]
end
end
return result
end
local function matmul(a, b)
local result = {}
for i = 1, #a do
result[i] = {}
for j = 1, #(b[1]) do
result[i][j] = 0
for k = 1, #(a[1]) do
result[i][j] = result[i][j] + (a[i][k] * b[k][j])
end
end
end
return result
end
local function scalarmatmul(a, b)
local result = {}
for i = 1, #a do
result[i] = {}
for j = 1, #(a[1]) do
result[i][j] = a[i][j] * b
end
end
return result
end
local function matinv(a)
local dbl_identity = {}
for i = 1, #a do
dbl_identity[i] = {}
for j = 1, #a do
if i == j then
dbl_identity[i][j] = 2
else
dbl_identity[i][j] = 0
end
end
end
local xn = scalarmatmul(a, 0.000001)
for i = 1, 30 do
xn = matmul(xn, matsub(dbl_identity, matmul(a, xn)))
end
return xn
end
local function transpose(a)
local result = {}
for i = 1, #a[1] do
result[i] = {}
for j = 1, #a do
result[i][j] = a[j][i]
end
end
return result
end
local function antitranspose(a)
local result = {}
for i = 1, #a[1] do
result[i] = {}
for j = 1, #a do
result[i][j] = a[#a - j + 1][#a[1] - i + 1]
end
end
return result
end
local function pseudoinv(a)
return matmul(transpose(a), matinv(matmul(a, transpose(a))))
end
local function nullspace(mapping)
local identity = {}
for i = 1, #mapping[1] do
identity[i] = {}
for j = 1, #mapping[1] do
if i == j then
identity[i][j] = 1
else
identity[i][j] = 0
end
end
end
-- local w = {{0},{1},{0}}
-- for i = 1, #mapping[1] do
-- w[i] = {10}
-- end
return matsub(identity, matmul(pseudoinv(mapping), mapping))
end
local function unreduced_mapping_from_basis(comma_basis)
return antitranspose(nullspace(antitranspose(comma_basis)))
end
local function get_te_tuning_map(subgroup, comma_basis)
local v = unreduced_mapping_from_basis(comma_basis)
local w = {}
for i = 1, #subgroup do
w[i] = {}
for j = 1, #subgroup do
if i == j then
w[i][j] = math.log(2)/math.log(subgroup[i])
else
w[i][j] = 0
end
end
end
local jw = {{}}
for i = 1, #subgroup do
jw[1][i] = 1
end
local vw = matmul(v, w)
local g = matmul(jw, pseudoinv(vw))
return g
end
local function get_te_generator(subgroup, comma_basis, preimage)
return matmul(get_te_tuning_map(subgroup, comma_basis), preimage)
end
-- Parsing/display functions
local function int_to_subgroup_monzo(subgroup, x)
local result = {}
local x2 = x
for i = 1, #subgroup do
result[i] = 0
while true do
x2 = x2 / subgroup[i]
if x2 ~= math.floor(x2) then
break
end
result[i] = result[i] + 1
end
x2 = x
end
return result
end
local function rat_to_subgroup_monzo(subgroup, x)
local n, d = rat.as_pair(x)
return matsub({int_to_subgroup_monzo(subgroup, n)}, {int_to_subgroup_monzo(subgroup, d)})[1]
end
function p.rat_list_to_matrix(subgroup, list)
local result = {}
for j = 1, #subgroup do
result[j] = {}
end
for i = 1, #list do
local smonzo = rat_to_subgroup_monzo(subgroup, list[i])
for j = 1, #subgroup do
result[j][i] = smonzo[j]
end
end
return result
end
-- function p.temperament_data(frame)
-- local
-- end
return p