<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://ja.xen.wiki/index.php?action=history&amp;feed=atom&amp;title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%3AChord_consistency</id>
	<title>モジュール:Chord consistency - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="https://ja.xen.wiki/index.php?action=history&amp;feed=atom&amp;title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%3AChord_consistency"/>
	<link rel="alternate" type="text/html" href="https://ja.xen.wiki/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Chord_consistency&amp;action=history"/>
	<updated>2026-07-12T00:17:10Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://ja.xen.wiki/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Chord_consistency&amp;diff=1340&amp;oldid=prev</id>
		<title>2026年4月1日 (水) 17:12にFurcht968による</title>
		<link rel="alternate" type="text/html" href="https://ja.xen.wiki/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Chord_consistency&amp;diff=1340&amp;oldid=prev"/>
		<updated>2026-04-01T17:12:52Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ja&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← 古い版&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2026年4月1日 (水) 17:12時点における版&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l20&quot;&gt;20行目:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;20行目:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;function p.consistent_edos(harmonics, distance, ed, maxlen)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;function p.consistent_edos(harmonics, distance, ed, maxlen)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	distance = distance or 1.0&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	distance = distance or 1.0&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	ed = ed or &#039;edo&#039;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	ed = ed or &#039;edo&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&#039; or &#039;平均律&lt;/ins&gt;&#039;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	local max_n = 72&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	local max_n = 72&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	maxlen = maxlen or max_n&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	maxlen = maxlen or max_n&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Furcht968</name></author>
	</entry>
	<entry>
		<id>https://ja.xen.wiki/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Chord_consistency&amp;diff=1339&amp;oldid=prev</id>
		<title>Furcht968: ページの作成:「local limits = require(&#039;Module:Limits&#039;) local ET = require(&#039;Module:ET&#039;) local rat = require(&#039;Module:Rational&#039;) local utils = require(&quot;Module:Utils&quot;) local p = {}  -- determine maximum error function p.max_error(et, ratios) 	local maxe = 0.0 	for a_key, a in pairs(ratios) do 		local a_approx = ET.approximate(et, rat.as_float(a)) 		local e = math.abs((ET.cents(et, a_approx) - rat.cents(a)) / ET.cents(et, 1)) 		if (e &gt; maxe) then 			maxe = e 		end 	end 	return maxe end…」</title>
		<link rel="alternate" type="text/html" href="https://ja.xen.wiki/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Chord_consistency&amp;diff=1339&amp;oldid=prev"/>
		<updated>2026-04-01T17:05:22Z</updated>

		<summary type="html">&lt;p&gt;ページの作成:「local limits = require(&amp;#039;Module:Limits&amp;#039;) local ET = require(&amp;#039;Module:ET&amp;#039;) local rat = require(&amp;#039;Module:Rational&amp;#039;) local utils = require(&amp;quot;Module:Utils&amp;quot;) local p = {}  -- determine maximum error function p.max_error(et, ratios) 	local maxe = 0.0 	for a_key, a in pairs(ratios) do 		local a_approx = ET.approximate(et, rat.as_float(a)) 		local e = math.abs((ET.cents(et, a_approx) - rat.cents(a)) / ET.cents(et, 1)) 		if (e &amp;gt; maxe) then 			maxe = e 		end 	end 	return maxe end…」&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local limits = require(&amp;#039;Module:Limits&amp;#039;)&lt;br /&gt;
local ET = require(&amp;#039;Module:ET&amp;#039;)&lt;br /&gt;
local rat = require(&amp;#039;Module:Rational&amp;#039;)&lt;br /&gt;
local utils = require(&amp;quot;Module:Utils&amp;quot;)&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- determine maximum error&lt;br /&gt;
function p.max_error(et, ratios)&lt;br /&gt;
	local maxe = 0.0&lt;br /&gt;
	for a_key, a in pairs(ratios) do&lt;br /&gt;
		local a_approx = ET.approximate(et, rat.as_float(a))&lt;br /&gt;
		local e = math.abs((ET.cents(et, a_approx) - rat.cents(a)) / ET.cents(et, 1))&lt;br /&gt;
		if (e &amp;gt; maxe) then&lt;br /&gt;
			maxe = e&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return maxe&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.consistent_edos(harmonics, distance, ed, maxlen)&lt;br /&gt;
	distance = distance or 1.0&lt;br /&gt;
	ed = ed or &amp;#039;edo&amp;#039;&lt;br /&gt;
	local max_n = 72&lt;br /&gt;
	maxlen = maxlen or max_n&lt;br /&gt;
	if max_n &amp;lt; maxlen then max_n = maxlen end&lt;br /&gt;
	local all_interval = {}&lt;br /&gt;
&lt;br /&gt;
	for i, h in ipairs(harmonics) do&lt;br /&gt;
		-- compute all ratio&lt;br /&gt;
		for j, g in ipairs(harmonics) do&lt;br /&gt;
			if j &amp;gt; i then&lt;br /&gt;
				local a = rat.new(g, h)&lt;br /&gt;
				all_interval[rat.as_ratio(a)] = a&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local vals = {}&lt;br /&gt;
	for i = 1, max_n do&lt;br /&gt;
		local et = ET.parse(&amp;#039;&amp;#039; .. i .. ed)&lt;br /&gt;
		local consistent = limits.additively_consistent(et, all_interval, false, false, nil)&lt;br /&gt;
		if consistent then&lt;br /&gt;
			local maxe = p.max_error(et, all_interval)&lt;br /&gt;
			if maxe &amp;lt;= 5.0e-11 then&lt;br /&gt;
				table.insert(vals, &amp;quot;[[&amp;quot; .. i .. ed .. &amp;quot;]]&amp;quot; .. &amp;quot;(just)&amp;quot;)&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
			local dist = 0.5/maxe&lt;br /&gt;
			local up = (dist &amp;gt;= distance)&lt;br /&gt;
			local llevel = 0&lt;br /&gt;
			while (dist &amp;gt;= 2) do&lt;br /&gt;
				llevel = llevel + 1&lt;br /&gt;
				dist = dist / 2&lt;br /&gt;
			end&lt;br /&gt;
			if up then&lt;br /&gt;
				if #vals &amp;gt;= maxlen then&lt;br /&gt;
					table.insert(vals, &amp;quot;&amp;amp;hellip;&amp;quot;)&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
				table.insert(vals, &amp;quot;[[&amp;quot; .. i .. ed .. &amp;quot;]]&amp;quot; .. string.rep(&amp;quot;*&amp;quot;, llevel))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return table.concat(vals, &amp;quot;, &amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.noinfobox_chord(frame)&lt;br /&gt;
	local distance = tonumber(frame.args[&amp;quot;Distance&amp;quot;])&lt;br /&gt;
	local debug_data = &amp;quot;&amp;quot;&lt;br /&gt;
	local infobox_data = {}&lt;br /&gt;
	local cats = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	--if utils.value_provided(frame.args[&amp;quot;Harmonics&amp;quot;]) then&lt;br /&gt;
		local harmonics = {}&lt;br /&gt;
		for hs in string.gmatch(frame.args[&amp;quot;Harmonics&amp;quot;], &amp;quot;[^:]+&amp;quot;) do&lt;br /&gt;
			h = tonumber(hs)  -- TODO: support rational entries?&lt;br /&gt;
			assert(h &amp;gt; 0, &amp;quot;invalid harmonic&amp;quot;)&lt;br /&gt;
			table.insert(harmonics, h)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if distance == nil then&lt;br /&gt;
			if #harmonics &amp;gt;= 5 then&lt;br /&gt;
				distance = 1.5&lt;br /&gt;
			elseif #harmonics &amp;gt;= 3 then&lt;br /&gt;
				distance = 2.0&lt;br /&gt;
			else&lt;br /&gt;
				distance = 3.0&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- reduce harmonics to simplest terms, in case the user accidentally failed to reduce them&lt;br /&gt;
		local gcd = harmonics[1]&lt;br /&gt;
		for i, h in ipairs(harmonics) do&lt;br /&gt;
			gcd = utils._gcd(gcd, h)&lt;br /&gt;
			if gcd == 1 then break end&lt;br /&gt;
		end&lt;br /&gt;
		if gcd &amp;gt; 1 then&lt;br /&gt;
			for i, h in ipairs(harmonics) do&lt;br /&gt;
				harmonics[i] = harmonics[i] / gcd&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local root = harmonics[1]&lt;br /&gt;
&lt;br /&gt;
		local root_interval_links = {}&lt;br /&gt;
		local step_interval_links = {}&lt;br /&gt;
		for i, h in ipairs(harmonics) do&lt;br /&gt;
			-- compute ratio of this harmonic relative to the root&lt;br /&gt;
			local gcd = utils._gcd(h, root)&lt;br /&gt;
			local numer = h / gcd&lt;br /&gt;
			local denom = root / gcd&lt;br /&gt;
			table.insert(root_interval_links, &amp;quot;[[&amp;quot; .. numer .. &amp;quot;/&amp;quot; .. denom .. &amp;quot;]]&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
			-- compute ratio of this harmonic relative to the previous&lt;br /&gt;
			if i &amp;gt; 1 then&lt;br /&gt;
				local prev = harmonics[i-1]&lt;br /&gt;
				local step_gcd = utils._gcd(h, prev)&lt;br /&gt;
				local step_numer = h / step_gcd&lt;br /&gt;
				local step_denom = prev / step_gcd&lt;br /&gt;
				table.insert(step_interval_links, &amp;quot;[[&amp;quot; .. step_numer .. &amp;quot;/&amp;quot; .. step_denom .. &amp;quot;]]&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		cat = &amp;quot;(d &amp;gt;= &amp;quot; .. distance .. &amp;quot;) &amp;quot; .. p.consistent_edos(harmonics, distance, &amp;#039;edo&amp;#039;, 4)&lt;br /&gt;
	--end&lt;br /&gt;
&lt;br /&gt;
	return cat&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Furcht968</name></author>
	</entry>
</feed>