Module:Harmonic entropy: Difference between revisions

From Xenharmonic Wiki
Jump to navigation Jump to search
Added backslash_ratio
Bug fixing
Line 42: Line 42:
equave = equaves[tostring(input:match("[fot]"))]
equave = equaves[tostring(input:match("[fot]"))]
else
else
equave = u.eval_num_arg(input:match("^.-ed(.-)%s*$"))
equave = u.eval_num_arg(input:match("^.-ed(.-)%s*$") or 2)
end
end
result = tonumber(equave)^(tonumber(steps)/tonumber(size))
result = tonumber(equave)^(tonumber(steps)/tonumber(size))

Revision as of 20:36, 19 August 2022

Module documentation[view] [edit] [history] [purge]
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 
Functions provided (4)
Line Function Params Description
6 to_cents (invokable) (frame)
11 _to_cents (ratio, prec)
28 backslash_ratio (invokable) (frame)
33 _backslash_ratio (input)
Lua modules required (2)
Variable Module Functions used
getArgs Module:Arguments getArgs
u Module:Utils eval_num_arg
_round
_log

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*$") or 2)
	end
	result = tonumber(equave)^(tonumber(steps)/tonumber(size))
	return result
end

return p