Module:Temperament data: Difference between revisions
Jump to navigation
Jump to search
CompactStar (talk | contribs) No edit summary |
CompactStar (talk | contribs) TE tuning FINALLY works |
||
Line 99: | Line 99: | ||
end | end | ||
local jw = {} | local jw = {{}} | ||
for i = 1, # | for i = 1, #subgroup do | ||
jw[ | jw[1][i] = 1 | ||
end | end | ||
local vw = matmul(mapping, w) | local vw = matmul(mapping, w) | ||
local g = matmul(jw, pseudoinv(vw)) | local g = matmul(jw, pseudoinv(vw)) | ||
return g | return g | ||
end | end | ||
return p | return p |
Revision as of 01:03, 16 October 2023
Note: Do not invoke this module directly; use the corresponding template instead: Template:Temperament data.
local rat = require('Module:Rational')
local p = {}
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)
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
xn = scalarmatmul(a, 0.0001)
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 pseudoinv(a)
return matmul(transpose(a), matinv(matmul(a, transpose(a))))
end
function p.te_generator(subgroup, mapping)
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(mapping, w)
local g = matmul(jw, pseudoinv(vw))
return g
end
return p