Module:Harmonic entropy: Difference between revisions
Jump to navigation
Jump to search
Updated to_cents: doesn't round by default now |
New parse_ET function, backslash_ratio now calls that, steps now defaults to 1 |
||
| Line 22: | Line 22: | ||
end | end | ||
-- edf = ed3/2, edo = ed2, edt = ed3 | -- edf = ed3/2, edo = ed2, edt = ed3 | ||
local equaves = | local equaves = | ||
| Line 30: | Line 29: | ||
['t'] = 3 | ['t'] = 3 | ||
} | } | ||
-- returns size and equave of an ET given its name | |||
function p.parse_ET(frame) | |||
local args = getArgs(frame) | |||
return p._parse_ET(args[1]) | |||
end | |||
function p._parse_ET(input) | |||
input = string.lower(input) | |||
local size, equave | |||
-- size defaults to 12 | |||
size = input:match("([0-9]+)[%-]?ed") or 12 | |||
if input:match("^[0-9]*[%-]?ed[fot]$") then | |||
equave = equaves[tostring(input:match("[fot]"))] | |||
else | |||
-- equave defaults to 2 | |||
equave = u.eval_num_arg(input:match("^.-ed(.+)%s*$")) or 2 | |||
end | |||
return size, equave | |||
end | |||
-- return ratio corresponding to an interval written in backslash notation | |||
-- ("steps" of "size" equal divisions of the "equave") | |||
function p.backslash_ratio(frame) | function p.backslash_ratio(frame) | ||
| Line 39: | Line 61: | ||
-- result defaults to 0 | -- result defaults to 0 | ||
local result = 0 | local result = 0 | ||
-- | -- steps defaults to 1 | ||
local steps | local steps = input:match("%s*([0-9]*)\\.-") or 1 | ||
local size, equave = parse_ET(input:match("\\(.*)")) | |||
result = tonumber(equave)^(tonumber(steps)/tonumber(size)) | result = tonumber(equave)^(tonumber(steps)/tonumber(size)) | ||
return result | return result | ||
Revision as of 21:07, 21 August 2022
- This module primarily serves as a library for other modules and has no corresponding template.
This module provides a means to calculate harmonic Shannon entropy of a particular interval.
| Introspection summary for Module:Harmonic entropy | ||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
| |||||||||||||||||||||||||||||||||||||
local getArgs = require('Module:Arguments').getArgs
local u = require('Module:Utils')
local p = {}
-- return measure in cents of an interval ratio, rounded to prec decimal places
function p.to_cents(frame)
local args = getArgs(frame)
return p._to_cents(args[1], args[2])
end
function p._to_cents(ratio, prec)
-- ratio defaults to 1
ratio = u.eval_num_arg(ratio, 1)
-- prec defaults to nil
prec = u.eval_num_arg(prec)
local result = 1200*u._log(ratio), prec
if prec == nil then
return result
else
return u._round(result, prec)
end
end
-- edf = ed3/2, edo = ed2, edt = ed3
local equaves =
{
['f'] = 3/2,
['o'] = 2,
['t'] = 3
}
-- returns size and equave of an ET given its name
function p.parse_ET(frame)
local args = getArgs(frame)
return p._parse_ET(args[1])
end
function p._parse_ET(input)
input = string.lower(input)
local size, equave
-- size defaults to 12
size = input:match("([0-9]+)[%-]?ed") or 12
if input:match("^[0-9]*[%-]?ed[fot]$") then
equave = equaves[tostring(input:match("[fot]"))]
else
-- equave defaults to 2
equave = u.eval_num_arg(input:match("^.-ed(.+)%s*$")) or 2
end
return size, equave
end
-- return ratio corresponding to an interval written in backslash notation
-- ("steps" of "size" equal divisions of the "equave")
function p.backslash_ratio(frame)
local args = getArgs(frame)
return p._backslash_ratio(args[1])
end
function p._backslash_ratio(input)
-- result defaults to 0
local result = 0
-- steps defaults to 1
local steps = input:match("%s*([0-9]*)\\.-") or 1
local size, equave = parse_ET(input:match("\\(.*)"))
result = tonumber(equave)^(tonumber(steps)/tonumber(size))
return result
end
return p