Module:Harmonic entropy: Difference between revisions
Jump to navigation
Jump to search
Round to 3 decimal places by default ("no rounding" can be achieved by using prec ≥ 12) |
Added backslash_ratio |
||
| Line 15: | Line 15: | ||
prec = u.eval_num_arg(prec, 3) | prec = u.eval_num_arg(prec, 3) | ||
return u._round(1200*u._log(ratio), prec) | return u._round(1200*u._log(ratio), prec) | ||
end | |||
-- return ratio corresponding to an interval written in backslash notation | |||
-- edf = ed3/2, edo = ed2, edt = ed3 | |||
local equaves = | |||
{ | |||
['f'] = 3/2, | |||
['o'] = 2, | |||
['t'] = 3 | |||
} | |||
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" of "size" equal divisions of "equave" (c/d), defaults to 0\12(edo) | |||
local steps, size, equave = 0, 12, 2 | |||
-- edf = ed3/2, edo = ed2, edt = ed3 | |||
input = string.lower(input) | |||
steps, size = input:match("^%s*([0-9]*)\\([0-9]*).-$") | |||
if input:match("^[0-9]*\\[0-9]*[%-]?ed[fot]$") then | |||
equave = equaves[tostring(input:match("[fot]"))] | |||
else | |||
equave = u.eval_num_arg(input:match("^.-ed(.-)%s*$")) | |||
end | |||
result = tonumber(equave)^(tonumber(steps)/tonumber(size)) | |||
return result | |||
end | end | ||
return p | return p | ||
Revision as of 20:12, 19 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 3
prec = u.eval_num_arg(prec, 3)
return u._round(1200*u._log(ratio), prec)
end
-- return ratio corresponding to an interval written in backslash notation
-- edf = ed3/2, edo = ed2, edt = ed3
local equaves =
{
['f'] = 3/2,
['o'] = 2,
['t'] = 3
}
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" of "size" equal divisions of "equave" (c/d), defaults to 0\12(edo)
local steps, size, equave = 0, 12, 2
-- edf = ed3/2, edo = ed2, edt = ed3
input = string.lower(input)
steps, size = input:match("^%s*([0-9]*)\\([0-9]*).-$")
if input:match("^[0-9]*\\[0-9]*[%-]?ed[fot]$") then
equave = equaves[tostring(input:match("[fot]"))]
else
equave = u.eval_num_arg(input:match("^.-ed(.-)%s*$"))
end
result = tonumber(equave)^(tonumber(steps)/tonumber(size))
return result
end
return p