<?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%3AMOS_tuning_spectrum</id>
	<title>モジュール:MOS tuning spectrum - 版の履歴</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%3AMOS_tuning_spectrum"/>
	<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:MOS_tuning_spectrum&amp;action=history"/>
	<updated>2026-06-05T22:32:53Z</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:MOS_tuning_spectrum&amp;diff=1465&amp;oldid=prev</id>
		<title>2026年4月2日 (木) 17:29に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:MOS_tuning_spectrum&amp;diff=1465&amp;oldid=prev"/>
		<updated>2026-04-02T17:29:22Z</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月2日 (木) 17:29時点における版&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-l99&quot;&gt;99行目:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;99行目:&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 result = {}&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 result = {}&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;	table.insert(result, &amp;#039;{| class=&amp;quot;wikitable center-all&amp;quot;&amp;#039;)&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;	table.insert(result, &amp;#039;{| class=&amp;quot;wikitable center-all&amp;quot;&amp;#039;)&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;	table.insert(result, &#039;|+ style=&quot;font-size: 105%; white-space: nowrap;&quot; | &#039; ..  mos_as_string .. &#039;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;の音階一覧と調律スペクトル&lt;/del&gt;&#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;	table.insert(result, &#039;|+ style=&quot;font-size: 105%; white-space: nowrap;&quot; | &#039; ..  mos_as_string .. &#039;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;の調律スペクトル&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;	table.insert(result, &amp;#039;|-&amp;#039;)&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;	table.insert(result, &amp;#039;|-&amp;#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;	table.insert(result, string.format(&amp;#039;! rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;%d&amp;quot; | ジェネレーター&amp;lt;sup&amp;gt;&amp;lt;abbr title=&amp;quot;In steps of %s.&amp;quot;&amp;gt;(%s)&amp;lt;/abbr&amp;gt;&amp;lt;/sup&amp;gt;&amp;#039;, deepest + 1, et_suffix, et_suffix))&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;	table.insert(result, string.format(&amp;#039;! rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;%d&amp;quot; | ジェネレーター&amp;lt;sup&amp;gt;&amp;lt;abbr title=&amp;quot;In steps of %s.&amp;quot;&amp;gt;(%s)&amp;lt;/abbr&amp;gt;&amp;lt;/sup&amp;gt;&amp;#039;, deepest + 1, et_suffix, et_suffix))&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:MOS_tuning_spectrum&amp;diff=1454&amp;oldid=prev</id>
		<title>2026年4月2日 (木) 13:19に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:MOS_tuning_spectrum&amp;diff=1454&amp;oldid=prev"/>
		<updated>2026-04-02T13:19:40Z</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月2日 (木) 13:19時点における版&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-l106&quot;&gt;106行目:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;106行目:&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;	table.insert(result, string.format(&amp;#039;! rowspan=&amp;quot;2&amp;quot; | %s&amp;#039;, comments_header_text))&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;	table.insert(result, string.format(&amp;#039;! rowspan=&amp;quot;2&amp;quot; | %s&amp;#039;, comments_header_text))&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;	table.insert(result, &amp;#039;|-&amp;#039;)&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;	table.insert(result, &amp;#039;|-&amp;#039;)&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;	table.insert(result, &#039;! &amp;lt;abbr title=&quot;Chroma-positive generator&quot;&amp;gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;明&lt;/del&gt;&amp;lt;/abbr&amp;gt;&#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;	table.insert(result, &#039;! &amp;lt;abbr title=&quot;Chroma-positive generator&quot;&amp;gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;上方&lt;/ins&gt;&amp;lt;/abbr&amp;gt;&#039;)&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;	table.insert(result, &#039;! &amp;lt;abbr title=&quot;Chroma-negative generator&quot;&amp;gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;暗&lt;/del&gt;&amp;lt;/abbr&amp;gt;&#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;	table.insert(result, &#039;! &amp;lt;abbr title=&quot;Chroma-negative generator&quot;&amp;gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;下方&lt;/ins&gt;&amp;lt;/abbr&amp;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;	table.insert(result, &amp;#039;! 全音半音比(L:s)&amp;#039;)&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;	table.insert(result, &amp;#039;! 全音半音比(L:s)&amp;#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;	table.insert(result, &amp;#039;! 広さ&amp;#039;)&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;	table.insert(result, &amp;#039;! 広さ&amp;#039;)&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:MOS_tuning_spectrum&amp;diff=1383&amp;oldid=prev</id>
		<title>2026年4月1日 (水) 19:15に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:MOS_tuning_spectrum&amp;diff=1383&amp;oldid=prev"/>
		<updated>2026-04-01T19:15:31Z</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日 (水) 19:15時点における版&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-l101&quot;&gt;101行目:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;101行目:&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;	table.insert(result, &amp;#039;|+ style=&amp;quot;font-size: 105%; white-space: nowrap;&amp;quot; | &amp;#039; ..  mos_as_string .. &amp;#039;の音階一覧と調律スペクトル&amp;#039;)&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;	table.insert(result, &amp;#039;|+ style=&amp;quot;font-size: 105%; white-space: nowrap;&amp;quot; | &amp;#039; ..  mos_as_string .. &amp;#039;の音階一覧と調律スペクトル&amp;#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;	table.insert(result, &amp;#039;|-&amp;#039;)&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;	table.insert(result, &amp;#039;|-&amp;#039;)&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;	table.insert(result, string.format(&#039;! rowspan=&quot;2&quot; colspan=&quot;%d&quot; | &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Generator&lt;/del&gt;&amp;lt;sup&amp;gt;&amp;lt;abbr title=&quot;In steps of %s.&quot;&amp;gt;(%s)&amp;lt;/abbr&amp;gt;&amp;lt;/sup&amp;gt;&#039;, deepest + 1, et_suffix, et_suffix))&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;	table.insert(result, string.format(&#039;! rowspan=&quot;2&quot; colspan=&quot;%d&quot; | &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;ジェネレーター&lt;/ins&gt;&amp;lt;sup&amp;gt;&amp;lt;abbr title=&quot;In steps of %s.&quot;&amp;gt;(%s)&amp;lt;/abbr&amp;gt;&amp;lt;/sup&amp;gt;&#039;, deepest + 1, et_suffix, et_suffix))&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;	table.insert(result, &amp;#039;! colspan=&amp;quot;2&amp;quot; | セント&amp;#039;)&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;	table.insert(result, &amp;#039;! colspan=&amp;quot;2&amp;quot; | セント&amp;#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;	table.insert(result, &amp;#039;! colspan=&amp;quot;2&amp;quot; | 比率 &amp;#039;)&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;	table.insert(result, &amp;#039;! colspan=&amp;quot;2&amp;quot; | 比率 &amp;#039;)&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:MOS_tuning_spectrum&amp;diff=1375&amp;oldid=prev</id>
		<title>2026年4月1日 (水) 18:47に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:MOS_tuning_spectrum&amp;diff=1375&amp;oldid=prev"/>
		<updated>2026-04-01T18:47:50Z</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日 (水) 18:47時点における版&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-l84&quot;&gt;84行目:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;84行目:&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;	&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;	&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;	-- Produce table header for the comments&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;	-- Produce table header for the comments&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;	local comments_header_text = &quot;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Comments&lt;/del&gt;&quot;&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;	local comments_header_text = &quot;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;備考&lt;/ins&gt;&quot;&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;	if small_steps == 1 then&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;	if small_steps == 1 then&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;		comments_header_text = comments_header_text .. &amp;quot;&amp;lt;sup&amp;gt;&amp;lt;abbr title=\&amp;quot;Every tuning produces a proper scale.\&amp;quot;&amp;gt;(always proper)&amp;lt;/abbr&amp;gt;&amp;lt;/sup&amp;gt;&amp;quot;&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;		comments_header_text = comments_header_text .. &amp;quot;&amp;lt;sup&amp;gt;&amp;lt;abbr title=\&amp;quot;Every tuning produces a proper scale.\&amp;quot;&amp;gt;(always proper)&amp;lt;/abbr&amp;gt;&amp;lt;/sup&amp;gt;&amp;quot;&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:MOS_tuning_spectrum&amp;diff=1364&amp;oldid=prev</id>
		<title>Furcht968: ページの作成:「local mos      = require(&quot;Module:MOS&quot;) local mediants = require(&quot;Module:Mediants&quot;) local tip      = require(&quot;Module:Template input parse&quot;) local utils    = require(&quot;Module:Utils&quot;) local yesno    = require(&quot;Module:yesno&quot;) local getArgs  = require(&quot;Module:Arguments&quot;).getArgs  local p = {}  -- TODO: -- - Add back old option from previous scale tree: toggle staggering of ratios. -- - (Low priority): Force-add comments that lie outside searched depth. If such --   ratios…」</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:MOS_tuning_spectrum&amp;diff=1364&amp;oldid=prev"/>
		<updated>2026-04-01T18:29:19Z</updated>

		<summary type="html">&lt;p&gt;ページの作成:「local mos      = require(&amp;quot;Module:MOS&amp;quot;) local mediants = require(&amp;quot;Module:Mediants&amp;quot;) local tip      = require(&amp;quot;Module:Template input parse&amp;quot;) local utils    = require(&amp;quot;Module:Utils&amp;quot;) local yesno    = require(&amp;quot;Module:yesno&amp;quot;) local getArgs  = require(&amp;quot;Module:Arguments&amp;quot;).getArgs  local p = {}  -- TODO: -- - Add back old option from previous scale tree: toggle staggering of ratios. -- - (Low priority): Force-add comments that lie outside searched depth. If such --   ratios…」&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local mos      = require(&amp;quot;Module:MOS&amp;quot;)&lt;br /&gt;
local mediants = require(&amp;quot;Module:Mediants&amp;quot;)&lt;br /&gt;
local tip      = require(&amp;quot;Module:Template input parse&amp;quot;)&lt;br /&gt;
local utils    = require(&amp;quot;Module:Utils&amp;quot;)&lt;br /&gt;
local yesno    = require(&amp;quot;Module:yesno&amp;quot;)&lt;br /&gt;
local getArgs  = require(&amp;quot;Module:Arguments&amp;quot;).getArgs&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- TODO:&lt;br /&gt;
-- - Add back old option from previous scale tree: toggle staggering of ratios.&lt;br /&gt;
-- - (Low priority): Force-add comments that lie outside searched depth. If such&lt;br /&gt;
--   ratios are added, they&amp;#039;re added in either the last column or their own&lt;br /&gt;
--   column appended after the last one. (to be determined)&lt;br /&gt;
&lt;br /&gt;
-- Split comments into in-range and out-of-range comments.&lt;br /&gt;
-- Iterate through the comments and determine whether the key for a comment is&lt;br /&gt;
-- in the table of step ratios. If so, add the corresponding key-value pair into&lt;br /&gt;
-- the table of in-comments; if not, add to the table of out-comments.&lt;br /&gt;
function p.preprocess_comments(comments, step_ratios, depths)&lt;br /&gt;
	local in_comments  = {}&lt;br /&gt;
	local out_comments = {}&lt;br /&gt;
	local out_ratios   = {}&lt;br /&gt;
	&lt;br /&gt;
	for key, value in pairs(comments) do&lt;br /&gt;
		local key_found_in_step_ratios = utils.table_contains(step_ratios, key, function(key, ratio)&lt;br /&gt;
			return key == string.format(&amp;quot;%s/%s&amp;quot;, ratio[1], ratio[2]) end&lt;br /&gt;
		)&lt;br /&gt;
		&lt;br /&gt;
		if key_found_in_step_ratios then&lt;br /&gt;
			in_comments[key] = value&lt;br /&gt;
		else&lt;br /&gt;
			out_comments[key] = value&lt;br /&gt;
			table.insert(out_ratios, tip.parse_numeric_pair(key, &amp;quot;/&amp;quot;, true))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	mediants.sort_ratios(out_ratios)&lt;br /&gt;
	&lt;br /&gt;
	return in_comments, out_comments, out_ratios&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Re-re-rewrite of tuning spectrum&lt;br /&gt;
function p._mos_tuning_spectrum(args)&lt;br /&gt;
	-- Find default ratios, if nothing was entered&lt;br /&gt;
	local default_ratios, default_depths&lt;br /&gt;
	local default_depth = 5&lt;br /&gt;
	default_ratios, default_depths = mediants.find_mediants({{1,1}, {1,0}}, default_depth)&lt;br /&gt;
	&lt;br /&gt;
	-- Extract info from args&lt;br /&gt;
	local input_mos   = args[&amp;quot;Input MOS&amp;quot;  ] or mos.new(5, 2)&lt;br /&gt;
	local comments    = args[&amp;quot;Comments&amp;quot;   ] or {}&lt;br /&gt;
	local step_ratios = args[&amp;quot;Step Ratios&amp;quot;] or default_ratios&lt;br /&gt;
	local depths      = args[&amp;quot;Depths&amp;quot;     ] or default_depths&lt;br /&gt;
	&lt;br /&gt;
	-- Find the deepest searched depth at which ratios were found&lt;br /&gt;
	local deepest = mediants.deepest_depth(depths)&lt;br /&gt;
	&lt;br /&gt;
	-- Find mos info&lt;br /&gt;
	local equave      = input_mos.equave&lt;br /&gt;
	local large_steps = input_mos.nL		-- Large steps in mos&lt;br /&gt;
	local small_steps = input_mos.ns		-- Small steps in mos&lt;br /&gt;
	local periods     = mos.period_count(input_mos)	-- Number of periods&lt;br /&gt;
	local et_suffix   = mos.et_suffix(input_mos)	-- Mos&amp;#039;s ET suffix (edo, edt, edf, ed-p/q, etc)&lt;br /&gt;
	&lt;br /&gt;
	-- Default comments for TAMNAMS-named step ratios&lt;br /&gt;
	local default_comments = {}&lt;br /&gt;
	local mos_as_string = mos.as_string(input_mos)&lt;br /&gt;
	default_comments[&amp;quot;1/1&amp;quot;] = string.format(&amp;quot;&amp;#039;&amp;#039;&amp;#039;Equalized %s&amp;#039;&amp;#039;&amp;#039;&amp;quot;, mos_as_string)&lt;br /&gt;
	default_comments[&amp;quot;4/3&amp;quot;] = string.format(&amp;quot;&amp;#039;&amp;#039;&amp;#039;Supersoft %s&amp;#039;&amp;#039;&amp;#039;&amp;quot;, mos_as_string)&lt;br /&gt;
	default_comments[&amp;quot;3/2&amp;quot;] = string.format(&amp;quot;&amp;#039;&amp;#039;&amp;#039;Soft %s&amp;#039;&amp;#039;&amp;#039;&amp;quot;     , mos_as_string)&lt;br /&gt;
	default_comments[&amp;quot;5/3&amp;quot;] = string.format(&amp;quot;&amp;#039;&amp;#039;&amp;#039;Semisoft %s&amp;#039;&amp;#039;&amp;#039;&amp;quot; , mos_as_string)&lt;br /&gt;
	default_comments[&amp;quot;2/1&amp;quot;] = string.format(&amp;quot;&amp;#039;&amp;#039;&amp;#039;Basic %s&amp;#039;&amp;#039;&amp;#039;&amp;quot;    , mos_as_string)&lt;br /&gt;
	default_comments[&amp;quot;5/2&amp;quot;] = string.format(&amp;quot;&amp;#039;&amp;#039;&amp;#039;Semihard %s&amp;#039;&amp;#039;&amp;#039;&amp;quot; , mos_as_string)&lt;br /&gt;
	default_comments[&amp;quot;3/1&amp;quot;] = string.format(&amp;quot;&amp;#039;&amp;#039;&amp;#039;Hard %s&amp;#039;&amp;#039;&amp;#039;&amp;quot;     , mos_as_string)&lt;br /&gt;
	default_comments[&amp;quot;4/1&amp;quot;] = string.format(&amp;quot;&amp;#039;&amp;#039;&amp;#039;Superhard %s&amp;#039;&amp;#039;&amp;#039;&amp;quot;, mos_as_string)&lt;br /&gt;
	default_comments[&amp;quot;1/0&amp;quot;] = string.format(&amp;quot;&amp;#039;&amp;#039;&amp;#039;Collapsed %s&amp;#039;&amp;#039;&amp;#039;&amp;quot;, mos_as_string)&lt;br /&gt;
	&lt;br /&gt;
	-- Append boundary of proper scales to basic comment, if applicable&lt;br /&gt;
	-- Monosmall mosses and knL ns mosses are always proper, but all other mosses&lt;br /&gt;
	-- are proper if the step ratio is within the soft-of-basic range&lt;br /&gt;
	if periods &amp;lt; small_steps then&lt;br /&gt;
		default_comments[&amp;quot;2/1&amp;quot;] = default_comments[&amp;quot;2/1&amp;quot;] .. &amp;quot;&amp;lt;br /&amp;gt;(これより小さい方が望ましい) &amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Produce table header for the comments&lt;br /&gt;
	local comments_header_text = &amp;quot;Comments&amp;quot;&lt;br /&gt;
	if small_steps == 1 then&lt;br /&gt;
		comments_header_text = comments_header_text .. &amp;quot;&amp;lt;sup&amp;gt;&amp;lt;abbr title=\&amp;quot;Every tuning produces a proper scale.\&amp;quot;&amp;gt;(always proper)&amp;lt;/abbr&amp;gt;&amp;lt;/sup&amp;gt;&amp;quot;&lt;br /&gt;
	elseif small_steps == periods and periods &amp;gt; 1 then&lt;br /&gt;
		comments_header_text = comments_header_text .. &amp;quot;&amp;lt;sup&amp;gt;&amp;lt;abbr title=\&amp;quot;Every true-mos tuning produces a proper scale.\&amp;quot;&amp;gt;(always proper)&amp;lt;/abbr&amp;gt;&amp;lt;/sup&amp;gt;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Table headers&lt;br /&gt;
	-- There are 6 columns:&lt;br /&gt;
	-- - Steps of ED&lt;br /&gt;
	-- - Bright and dark gens in cents&lt;br /&gt;
	-- - Step ratio and hardness&lt;br /&gt;
	-- - Comments&lt;br /&gt;
	local result = {}&lt;br /&gt;
	table.insert(result, &amp;#039;{| class=&amp;quot;wikitable center-all&amp;quot;&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;|+ style=&amp;quot;font-size: 105%; white-space: nowrap;&amp;quot; | &amp;#039; ..  mos_as_string .. &amp;#039;の音階一覧と調律スペクトル&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;|-&amp;#039;)&lt;br /&gt;
	table.insert(result, string.format(&amp;#039;! rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;%d&amp;quot; | Generator&amp;lt;sup&amp;gt;&amp;lt;abbr title=&amp;quot;In steps of %s.&amp;quot;&amp;gt;(%s)&amp;lt;/abbr&amp;gt;&amp;lt;/sup&amp;gt;&amp;#039;, deepest + 1, et_suffix, et_suffix))&lt;br /&gt;
	table.insert(result, &amp;#039;! colspan=&amp;quot;2&amp;quot; | セント&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;! colspan=&amp;quot;2&amp;quot; | 比率 &amp;#039;)&lt;br /&gt;
	table.insert(result, string.format(&amp;#039;! rowspan=&amp;quot;2&amp;quot; | %s&amp;#039;, comments_header_text))&lt;br /&gt;
	table.insert(result, &amp;#039;|-&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;! &amp;lt;abbr title=&amp;quot;Chroma-positive generator&amp;quot;&amp;gt;明&amp;lt;/abbr&amp;gt;&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;! &amp;lt;abbr title=&amp;quot;Chroma-negative generator&amp;quot;&amp;gt;暗&amp;lt;/abbr&amp;gt;&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;! 全音半音比(L:s)&amp;#039;)&lt;br /&gt;
	table.insert(result, &amp;#039;! 広さ&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	-- Rounding is done using string.format, to 3 decimal places (%.3f)&lt;br /&gt;
	&lt;br /&gt;
	-- Create each row of the table&lt;br /&gt;
	for i = 1, #step_ratios do&lt;br /&gt;
		-- Simplify step ratio before using it&lt;br /&gt;
		local step_ratio = mediants.simplify_ratio(step_ratios[i])&lt;br /&gt;
		&lt;br /&gt;
		-- Produce current ET as a string&lt;br /&gt;
		local et_as_string = mos.et_string(input_mos, step_ratio)&lt;br /&gt;
		&lt;br /&gt;
		-- Calculate the bright gen and cent value&lt;br /&gt;
		local bright_generator_steps  = mos.bright_gen_to_et_steps (input_mos, step_ratio)&lt;br /&gt;
		local bright_generator_cents  = mos.bright_gen_to_cents    (input_mos, step_ratio)&lt;br /&gt;
		local bright_generator_string = mos.bright_gen_to_et_string(input_mos, step_ratio, &amp;quot;&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		-- Calculate dark generator step count and cent value&lt;br /&gt;
		local dark_generator_steps = mos.dark_gen_to_et_steps(input_mos, step_ratio)&lt;br /&gt;
		local dark_generator_cents = mos.dark_gen_to_cents   (input_mos, step_ratio)&lt;br /&gt;
		&lt;br /&gt;
		-- New row&lt;br /&gt;
		table.insert(result, &amp;quot;|-&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		-- Cells for bright generator, as steps in et&lt;br /&gt;
		-- Bright gen cell is accompanied by cells to the left and right.&lt;br /&gt;
		-- The variable current_depth is the number of left cells; the number of&lt;br /&gt;
		-- right cells is deepest minus current_depth.&lt;br /&gt;
		local current_depth = depths[i]&lt;br /&gt;
		local num_right_cells = deepest - current_depth&lt;br /&gt;
		for i = 1, current_depth do&lt;br /&gt;
			table.insert(result, &amp;quot;|&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(result, string.format(&amp;quot;| [[%s|%s]]&amp;quot;, et_as_string, bright_generator_string))&lt;br /&gt;
		for i = 1, num_right_cells do&lt;br /&gt;
			table.insert(result, &amp;quot;|&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- Cells for generators in cents&lt;br /&gt;
		table.insert(result, string.format(&amp;quot;| %.3f&amp;quot;, bright_generator_cents))&lt;br /&gt;
		table.insert(result, string.format(&amp;quot;| %.3f&amp;quot;, dark_generator_cents  ))&lt;br /&gt;
		&lt;br /&gt;
		-- Cell for step ratio&lt;br /&gt;
		table.insert(result, string.format(&amp;quot;| %d:%d&amp;quot;, step_ratio[1], step_ratio[2]))&lt;br /&gt;
		&lt;br /&gt;
		-- Cell for hardness, with divide-by-zero check&lt;br /&gt;
		local hardness = &amp;quot;&amp;quot;&lt;br /&gt;
		if step_ratio[2] == 0 then&lt;br /&gt;
			hardness = &amp;quot;&amp;amp;rarr;&amp;amp;nbsp;&amp;amp;#8734;&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			hardness = string.format(&amp;quot;%.3f&amp;quot;, step_ratio[1] / step_ratio[2])&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(result, string.format(&amp;quot;| %s&amp;quot;, hardness))&lt;br /&gt;
		&lt;br /&gt;
		-- Cell for comment&lt;br /&gt;
		-- Default comments are on their own line before custom comments&lt;br /&gt;
		local key = step_ratio[1] .. &amp;quot;/&amp;quot; .. step_ratio[2]		-- The step ratio is (literally and figuratively) the key to add comments!&lt;br /&gt;
		local comment = &amp;quot;&amp;quot;&lt;br /&gt;
		local default_comment = default_comments[key] or &amp;quot;&amp;quot;&lt;br /&gt;
		local custom_comment = comments[key] or &amp;quot;&amp;quot;&lt;br /&gt;
		if default_comment == &amp;quot;&amp;quot; then&lt;br /&gt;
			comment = custom_comment&lt;br /&gt;
		else&lt;br /&gt;
			comment = default_comment .. &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; .. custom_comment&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(result, string.format(&amp;quot;| style=\&amp;quot;text-align: left;\&amp;quot; | %s&amp;quot;, comment))&lt;br /&gt;
		&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	table.insert(result, &amp;quot;|}&amp;quot;)&lt;br /&gt;
	return table.concat(result, &amp;quot;\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Wrapper function; to be called by template; preprocesses args&lt;br /&gt;
-- Unprocessed args:&lt;br /&gt;
-- - Scale Signature (textual scalesig)&lt;br /&gt;
-- - Depth (how deep to search for mediants)&lt;br /&gt;
-- - Int Limit (if present, overrides depth-based search for int-limit search)&lt;br /&gt;
-- - X/Y (comments for individual step ratios)&lt;br /&gt;
-- - First/Last Step Ratio (initial ratios for mediant search; default is&lt;br /&gt;
--   1/1 and 1/0 respectively)&lt;br /&gt;
-- Processed args:&lt;br /&gt;
-- - Input MOS (processed from textual scalesig)&lt;br /&gt;
-- - Step Ratios (table of step ratios found)&lt;br /&gt;
-- - Depths (table of how deep each step ratio was found at)&lt;br /&gt;
-- - Comments (step ratio comments placed in their own table)&lt;br /&gt;
function p.mos_tuning_spectrum(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	&lt;br /&gt;
	-- Parse scalesig as input mos, then remove scalesig&lt;br /&gt;
	local input_mos = mos.parse(args[&amp;quot;Scale Signature&amp;quot;])&lt;br /&gt;
	args[&amp;quot;Input MOS&amp;quot;] = input_mos&lt;br /&gt;
	args[&amp;quot;Scale Signature&amp;quot;] = nil&lt;br /&gt;
	&lt;br /&gt;
	-- Parse initial ratios&lt;br /&gt;
	local initial_ratios_unparsed = args[&amp;quot;Initial Ratios&amp;quot;]&lt;br /&gt;
	local initial_ratios = {}&lt;br /&gt;
	if initial_ratios_unparsed ~= nil then&lt;br /&gt;
		-- Parse initial ratios, then sort by ascending&lt;br /&gt;
		initial_ratios = tip.parse_numeric_pairs(initial_ratios_unparsed, &amp;quot;;&amp;quot;, &amp;quot;/&amp;quot;, true)&lt;br /&gt;
		mediants.sort_ratios(initial_ratios)&lt;br /&gt;
	else&lt;br /&gt;
		-- If no initial ratios were passed in, default to 1/1 and 1/0&lt;br /&gt;
		initial_ratios = {{1,1}, {1,0}}&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Then generate mediants and depths&lt;br /&gt;
	-- If using depth-based search, parse the depth, then remove it from args&lt;br /&gt;
	-- If using int-limit search, parse the int limit, then remove it from args,&lt;br /&gt;
	-- and remove depth in case it was present.&lt;br /&gt;
	local step_ratios, depths&lt;br /&gt;
	local use_int_limit = args[&amp;quot;Int Limit&amp;quot;] ~= nil&lt;br /&gt;
	if use_int_limit then&lt;br /&gt;
		-- Int-limit search; parse int-limit&lt;br /&gt;
		local int_limit = tonumber(args[&amp;quot;Int Limit&amp;quot;])&lt;br /&gt;
		args[&amp;quot;Int Limit&amp;quot;] = nil&lt;br /&gt;
		&lt;br /&gt;
		-- Find ratios and depths found&lt;br /&gt;
		step_ratios, depths = mediants.find_mediants_by_int_limit(initial_ratios, int_limit)&lt;br /&gt;
	else &lt;br /&gt;
		-- Depth-based search; parse depth&lt;br /&gt;
		local depth = tonumber(args[&amp;quot;Depth&amp;quot;]) or 5&lt;br /&gt;
		&lt;br /&gt;
		-- Find ratios and depths found&lt;br /&gt;
		step_ratios, depths = mediants.find_mediants(initial_ratios, depth)&lt;br /&gt;
	end&lt;br /&gt;
	args[&amp;quot;Depth&amp;quot;      ] = nil&lt;br /&gt;
	args[&amp;quot;Step Ratios&amp;quot;] = step_ratios&lt;br /&gt;
	args[&amp;quot;Depths&amp;quot;     ] = depths&lt;br /&gt;
	&lt;br /&gt;
	-- Transfer comments from args to comments&lt;br /&gt;
	local comments = {}&lt;br /&gt;
	for i = 1, #step_ratios do&lt;br /&gt;
		local key = step_ratios[i][1] .. &amp;quot;/&amp;quot; .. step_ratios[i][2]&lt;br /&gt;
		if args[key] ~= nil then&lt;br /&gt;
			comments[key] = args[key]&lt;br /&gt;
			args[key] = nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	args[&amp;quot;Comments&amp;quot;] = comments&lt;br /&gt;
	&lt;br /&gt;
	-- Parse debug option&lt;br /&gt;
	local debugg = yesno(args[&amp;quot;debug&amp;quot;])&lt;br /&gt;
	&lt;br /&gt;
	-- Output&lt;br /&gt;
	local result = p._mos_tuning_spectrum(args)&lt;br /&gt;
	if debugg == true then&lt;br /&gt;
		result = &amp;quot;&amp;lt;syntaxhighlight lang=\&amp;quot;wikitext\&amp;quot;&amp;gt;&amp;quot; .. result .. &amp;quot;&amp;lt;/syntaxhighlight&amp;gt;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return frame:preprocess(result)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.tester()&lt;br /&gt;
	--local args = {}&lt;br /&gt;
	--return p._mos_tuning_spectrum(args)&lt;br /&gt;
&lt;br /&gt;
	local comments = {&lt;br /&gt;
		[&amp;quot;5/4&amp;quot;] = &amp;quot;aaa&amp;quot;,&lt;br /&gt;
		[&amp;quot;2/1&amp;quot;] = &amp;quot;bbb&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	local step_ratios = {&lt;br /&gt;
		{1,1},&lt;br /&gt;
		{5,4},&lt;br /&gt;
		{4,3}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	local in_comments = {}&lt;br /&gt;
	local out_comments = {}&lt;br /&gt;
	in_comments, out_comments, out_ratios = p.preprocess_comments(comments, step_ratios)&lt;br /&gt;
&lt;br /&gt;
	local args = {}&lt;br /&gt;
	--return out_comments&lt;br /&gt;
	return p._mos_tuning_spectrum(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Furcht968</name></author>
	</entry>
</feed>