<?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_mode_degrees</id>
	<title>モジュール:MOS mode degrees - 版の履歴</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_mode_degrees"/>
	<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_mode_degrees&amp;action=history"/>
	<updated>2026-07-04T03:36:23Z</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_mode_degrees&amp;diff=1401&amp;oldid=prev</id>
		<title>2026年4月1日 (水) 21: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_mode_degrees&amp;diff=1401&amp;oldid=prev"/>
		<updated>2026-04-01T21:19:57Z</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日 (水) 21: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-l144&quot;&gt;144行目:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;144行目:&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;		for j = 1, #step_matrices[i] do&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;		for j = 1, #step_matrices[i] do&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 current_interval = step_matrices[i][j]&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 current_interval = step_matrices[i][j]&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 degree_quality = tamnams.&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;decode_quality&lt;/del&gt;(current_interval, input_mos&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;, &quot;shortened&quot;&lt;/del&gt;)&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 degree_quality = tamnams.&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;decode_quality_japanese&lt;/ins&gt;(current_interval, input_mos)&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;			&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;			local cell_color = p.cell_color(current_interval, input_mos)&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 cell_color = p.cell_color(current_interval, input_mos)&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_mode_degrees&amp;diff=1362&amp;oldid=prev</id>
		<title>2026年4月1日 (水) 18:21に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_mode_degrees&amp;diff=1362&amp;oldid=prev"/>
		<updated>2026-04-01T18:21:10Z</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:21時点における版&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-l112&quot;&gt;112行目:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;112行目:&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&amp;#039;s title&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&amp;#039;s title&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 it&amp;#039;s for a modmos, add the step pattern&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 it&amp;#039;s for a modmos, add the step pattern&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;	result = result .. &quot;|+ style=\&quot;font-size: 105%; white-space: nowrap;\&quot; | &quot; .. string.format(&quot;%&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;sの旋法における音階度数&lt;/del&gt;&quot;, scale_sig)&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;	result = result .. &quot;|+ style=\&quot;font-size: 105%; white-space: nowrap;\&quot; | &quot; .. string.format(&quot;%&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;s各旋法における音階の度数&lt;/ins&gt;&quot;, scale_sig)&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;		.. (is_true_mos and &amp;quot;\n&amp;quot; or string.format(&amp;quot; (%s)\n&amp;quot;, step_pattern))&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;		.. (is_true_mos and &amp;quot;\n&amp;quot; or string.format(&amp;quot; (%s)\n&amp;quot;, step_pattern))&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;		.. &amp;quot;|-\n&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;		.. &amp;quot;|-\n&amp;quot;&lt;/div&gt;&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-l123&quot;&gt;123行目:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;123行目:&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;	-- Add header for scale degrees&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;	-- Add header for scale degrees&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;	result = result .. string.format(&quot;! colspan=\&quot;%d\&quot; class=\&quot;unsortable\&quot; | &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;音階度数 &lt;/del&gt;(%sdegree)\n&quot;, #step_matrices[1], mos_prefix)&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;	result = result .. string.format(&quot;! colspan=\&quot;%d\&quot; class=\&quot;unsortable\&quot; | &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;音階の度数 &lt;/ins&gt;(%sdegree)\n&quot;, #step_matrices[1], mos_prefix)&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;	&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;	-- Add second row of headers&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;	-- Add second row of headers&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key xenwiki_ja:diff:1.41:old-1357:rev-1362:php=table --&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_mode_degrees&amp;diff=1357&amp;oldid=prev</id>
		<title>2026年4月1日 (水) 18:10に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_mode_degrees&amp;diff=1357&amp;oldid=prev"/>
		<updated>2026-04-01T18:10:33Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://ja.xen.wiki/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:MOS_mode_degrees&amp;amp;diff=1357&amp;amp;oldid=1356&quot;&gt;差分を表示&lt;/a&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_mode_degrees&amp;diff=1356&amp;oldid=prev</id>
		<title>Furcht968: ページの作成:「local p = {}  local mos = require(&quot;Module:MOS&quot;) local tamnams = require(&quot;Module:TAMNAMS&quot;) local tip = require(&quot;Module:Template input parse&quot;) local yesno = require(&quot;Module:Yesno&quot;)  -- TODO -- - Split off modmos mode degrees as a separate template  -- Global variables for cell colors -- Colors are as follows: -- - Orange and blue for small and large sizes, respectively -- - Darker colors for altered scale degrees -- - No color for period intervals p.cell_color_none =…」</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_mode_degrees&amp;diff=1356&amp;oldid=prev"/>
		<updated>2026-04-01T17:47:21Z</updated>

		<summary type="html">&lt;p&gt;ページの作成:「local p = {}  local mos = require(&amp;quot;Module:MOS&amp;quot;) local tamnams = require(&amp;quot;Module:TAMNAMS&amp;quot;) local tip = require(&amp;quot;Module:Template input parse&amp;quot;) local yesno = require(&amp;quot;Module:Yesno&amp;quot;)  -- TODO -- - Split off modmos mode degrees as a separate template  -- Global variables for cell colors -- Colors are as follows: -- - Orange and blue for small and large sizes, respectively -- - Darker colors for altered scale degrees -- - No color for period intervals p.cell_color_none =…」&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local mos = require(&amp;quot;Module:MOS&amp;quot;)&lt;br /&gt;
local tamnams = require(&amp;quot;Module:TAMNAMS&amp;quot;)&lt;br /&gt;
local tip = require(&amp;quot;Module:Template input parse&amp;quot;)&lt;br /&gt;
local yesno = require(&amp;quot;Module:Yesno&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- TODO&lt;br /&gt;
-- - Split off modmos mode degrees as a separate template&lt;br /&gt;
&lt;br /&gt;
-- Global variables for cell colors&lt;br /&gt;
-- Colors are as follows:&lt;br /&gt;
-- - Orange and blue for small and large sizes, respectively&lt;br /&gt;
-- - Darker colors for altered scale degrees&lt;br /&gt;
-- - No color for period intervals&lt;br /&gt;
p.cell_color_none = &amp;quot;NONE&amp;quot;				-- For cells that don&amp;#039;t have a color (default cell color applies)&lt;br /&gt;
p.cell_color_perfect_size = &amp;quot;NONE&amp;quot;		-- Only applies for periods, including the root and equave&lt;br /&gt;
p.cell_color_lg_altered_size = &amp;quot;#BDD7EE&amp;quot;&lt;br /&gt;
p.cell_color_large_size      = &amp;quot;#DDEBF7&amp;quot;&lt;br /&gt;
p.cell_color_small_size      = &amp;quot;#FCE4D6&amp;quot;&lt;br /&gt;
p.cell_color_sm_altered_size = &amp;quot;#F8CBAD&amp;quot;&lt;br /&gt;
&lt;br /&gt;
-- Finds the row color for a single cell&lt;br /&gt;
function p.cell_color(interval, input_mos)&lt;br /&gt;
	local interval = interval or {[&amp;quot;L&amp;quot;] = 3, [&amp;quot;s&amp;quot;] = 1}&lt;br /&gt;
	local input_mos = input_mos or mos.new(5, 2)&lt;br /&gt;
	&lt;br /&gt;
	local period_step_count = mos.period_step_count(input_mos)&lt;br /&gt;
	local interval_step_count = mos.interval_step_count(interval)&lt;br /&gt;
	local chroma_count = mos.interval_chroma_count(interval, input_mos)&lt;br /&gt;
	&lt;br /&gt;
	local is_period_interval = interval_step_count % period_step_count == 0&lt;br /&gt;
	&lt;br /&gt;
	local color = p.cell_color_none&lt;br /&gt;
	if is_period_interval then&lt;br /&gt;
		if chroma_count &amp;gt; 0 then&lt;br /&gt;
			color = p.cell_color_lg_altered_size&lt;br /&gt;
		elseif chroma_count == 0 then&lt;br /&gt;
			color = p.cell_color_none&lt;br /&gt;
		elseif chroma_count &amp;lt; 0 then&lt;br /&gt;
			color = p.cell_color_sm_altered_size&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		if chroma_count &amp;gt; 0 then&lt;br /&gt;
			color = p.cell_color_lg_altered_size&lt;br /&gt;
		elseif chroma_count == 0 then&lt;br /&gt;
			color = p.cell_color_large_size&lt;br /&gt;
		elseif chroma_count == -1 then&lt;br /&gt;
			color = p.cell_color_small_size&lt;br /&gt;
		elseif chroma_count &amp;lt; -1 then&lt;br /&gt;
			color = p.cell_color_sm_altered_size&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return color&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Create a table of a mos&amp;#039;s degrees&lt;br /&gt;
-- If a step pattern is provided, it&amp;#039;s assumed to be that of a modmos&lt;br /&gt;
function p._mos_mode_degrees(input_mos, mos_prefix, is_collapsed, step_pattern)&lt;br /&gt;
	local is_true_mos = step_pattern == nil&lt;br /&gt;
	local input_mos = input_mos or mos.new(5, 2)&lt;br /&gt;
	local mos_prefix = mos_prefix or &amp;quot;mos&amp;quot;&lt;br /&gt;
	local is_collapsed = is_collapsed == true&lt;br /&gt;
	&lt;br /&gt;
	-- Get the modes as strings and step vectors&lt;br /&gt;
	local step_patterns = {}&lt;br /&gt;
	local step_matrices = {}&lt;br /&gt;
	if is_true_mos then&lt;br /&gt;
		step_patterns = mos.modes_by_brightness(input_mos)&lt;br /&gt;
		step_matrices = mos.modes_to_step_matrices(input_mos)&lt;br /&gt;
	else&lt;br /&gt;
		step_patterns = mos.mode_rotations(step_pattern)&lt;br /&gt;
		step_matrices = mos.mode_rotations_to_step_matrices(step_pattern)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Get the scale sig&lt;br /&gt;
	local scale_sig = mos.as_string(input_mos)&lt;br /&gt;
&lt;br /&gt;
	-- Equave step count; needed for degree column count&lt;br /&gt;
	local equave_step_count = mos.equave_step_count(input_mos)&lt;br /&gt;
	&lt;br /&gt;
	-- Get the brightness (UDP) and rotational orderings (CPOs).&lt;br /&gt;
	-- Also produce default mode names if set to do so.&lt;br /&gt;
	local udps = {}&lt;br /&gt;
	local cpos = {}&lt;br /&gt;
	if is_true_mos then&lt;br /&gt;
		-- Get UDPs and CPOs&lt;br /&gt;
		udps = tamnams.mos_mode_udps(input_mos)&lt;br /&gt;
		cpos = tamnams.mos_mode_cpos(input_mos)&lt;br /&gt;
	else&lt;br /&gt;
		-- Modmos udps require a mosabbrev; this is forced to be &amp;quot;m&amp;quot; since some&lt;br /&gt;
		-- abbrevs are tooo long. Get both the names for the closest-bright and&lt;br /&gt;
		-- closest-dark mode. If they&amp;#039;re the same, only one name will be used;&lt;br /&gt;
		-- if not, both are used.&lt;br /&gt;
		-- The CPOs of a modmos are simply 1 to n (n is the mode count).&lt;br /&gt;
		local udps_closest_bright = tamnams.mode_rotation_udps(step_pattern, input_mos, &amp;quot;m&amp;quot;, true)&lt;br /&gt;
		local udps_closest_dark = tamnams.mode_rotation_udps(step_pattern, input_mos, &amp;quot;m&amp;quot;, false)&lt;br /&gt;
		for i = 1, #udps_closest_bright do&lt;br /&gt;
			if udps_closest_bright[i] == udps_closest_dark[i] then&lt;br /&gt;
				table.insert(udps, udps_closest_bright[i])&lt;br /&gt;
			else&lt;br /&gt;
				table.insert(udps, string.format(&amp;quot;%s&amp;lt;br /&amp;gt;%s&amp;quot;, udps_closest_bright[i], udps_closest_dark[i]))&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(cpos, i)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Create table&lt;br /&gt;
	local result = &amp;quot;{| class=\&amp;quot;wikitable sortable mw-collapsible center-2 center-3&amp;quot;&lt;br /&gt;
		.. (is_collapsed and &amp;quot; mw-collapsed\&amp;quot;&amp;quot; or &amp;quot;\&amp;quot;&amp;quot;) .. &amp;quot;\n&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	-- Table&amp;#039;s title&lt;br /&gt;
	-- If it&amp;#039;s for a modmos, add the step pattern&lt;br /&gt;
	result = result .. &amp;quot;|+ style=\&amp;quot;font-size: 105%; white-space: nowrap;\&amp;quot; | &amp;quot; .. string.format(&amp;quot;Scale degrees of the modes of %s&amp;quot;, scale_sig)&lt;br /&gt;
		.. (is_true_mos and &amp;quot;\n&amp;quot; or string.format(&amp;quot; (%s)\n&amp;quot;, step_pattern))&lt;br /&gt;
		.. &amp;quot;|-\n&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	-- Add table headers for first row&lt;br /&gt;
	result = result&lt;br /&gt;
		.. &amp;quot;! rowspan=\&amp;quot;2\&amp;quot; | UDP&amp;quot; .. (is_true_mos and &amp;quot;\n&amp;quot; or &amp;quot; and&amp;lt;br /&amp;gt;alterations\n&amp;quot;)		-- If modmos, add &amp;quot;and alterations&amp;quot; string&lt;br /&gt;
		.. &amp;quot;! rowspan=\&amp;quot;2\&amp;quot; | Cyclic&amp;lt;br /&amp;gt;order\n&amp;quot;&lt;br /&gt;
		.. &amp;quot;! rowspan=\&amp;quot;2\&amp;quot; | Step&amp;lt;br /&amp;gt;pattern\n&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	-- Add header for scale degrees&lt;br /&gt;
	result = result .. string.format(&amp;quot;! colspan=\&amp;quot;%d\&amp;quot; class=\&amp;quot;unsortable\&amp;quot; | Scale degree (%sdegree)\n&amp;quot;, #step_matrices[1], mos_prefix)&lt;br /&gt;
	&lt;br /&gt;
	-- Add second row of headers&lt;br /&gt;
	result = result .. &amp;quot;|- class=\&amp;quot;unsortable\&amp;quot;\n&amp;quot;&lt;br /&gt;
		.. &amp;quot;! 0&amp;quot;&lt;br /&gt;
	for i = 1, #step_patterns[1] do&lt;br /&gt;
		result = result .. string.format(&amp;quot;\n! %d&amp;quot;, i)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	result = result .. &amp;quot;\n&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	-- Add table contents&lt;br /&gt;
	for i = 1, #step_patterns do&lt;br /&gt;
		result = result .. &amp;quot;|-\n&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		-- Add brightness order (as UDP), rotational order, and step pattern&lt;br /&gt;
			.. string.format(&amp;quot;| %s\n| %s\n| %s\n&amp;quot;, udps[i], cpos[i], step_patterns[i])&lt;br /&gt;
&lt;br /&gt;
		-- Add scale degrees with cell coloring&lt;br /&gt;
		for j = 1, #step_matrices[i] do&lt;br /&gt;
			local current_interval = step_matrices[i][j]&lt;br /&gt;
			local degree_quality = tamnams.decode_quality(current_interval, input_mos, &amp;quot;shortened&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
			local cell_color = p.cell_color(current_interval, input_mos)&lt;br /&gt;
			local style_code = (cell_color == p.cell_color_none and &amp;quot;&amp;quot; or string.format(&amp;quot;style=\&amp;quot;background: %s;\&amp;quot; | &amp;quot;, cell_color))&lt;br /&gt;
			&lt;br /&gt;
			result = result .. string.format(&amp;quot;| %s%s\n&amp;quot;, style_code, degree_quality)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- End of table&lt;br /&gt;
	result = result .. &amp;quot;|}&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Function to be called as part of a template&lt;br /&gt;
function p.mos_mode_degrees(frame)&lt;br /&gt;
	-- Get args&lt;br /&gt;
	local input_mos    = mos.parse(frame.args[&amp;quot;Scale Signature&amp;quot;])&lt;br /&gt;
	local mos_prefix   = frame.args[&amp;quot;MOS Prefix&amp;quot;]&lt;br /&gt;
	local step_pattern = frame.args[&amp;quot;MODMOS Step Pattern&amp;quot;]&lt;br /&gt;
	local mode_names_unparsed = frame.args[&amp;quot;Mode Names&amp;quot;]&lt;br /&gt;
	&lt;br /&gt;
	-- Parse debugging option&lt;br /&gt;
	local debugg = yesno(frame.args[&amp;quot;debug&amp;quot;])&lt;br /&gt;
	&lt;br /&gt;
	-- Get the scale sig; for calculating the mos prefix&lt;br /&gt;
	local scale_sig = mos.as_string(input_mos)&lt;br /&gt;
	&lt;br /&gt;
	-- Verify mosprefix&lt;br /&gt;
	mos_prefix = tamnams.verify_prefix(input_mos, mos_prefix)&lt;br /&gt;
	&lt;br /&gt;
	-- Get the mode names&lt;br /&gt;
	local mode_names = nil&lt;br /&gt;
	-- Default names for 5L 2s modes and select modmosses.&lt;br /&gt;
	-- Names are based on whichever mode is returnd by UDP closest-mode search,&lt;br /&gt;
	-- with common names added wherever applicable. Sources include:&lt;br /&gt;
	-- - https://www.jazz-guitar-licks.com/ and likely others&lt;br /&gt;
	-- - Whatever Wikipedia has cited for the Neapolitan scales&lt;br /&gt;
	-- NOTE: these names can be overridden if they don&amp;#039;t suffice.&lt;br /&gt;
	if scale_sig == &amp;quot;5L 2s&amp;quot; then&lt;br /&gt;
		if step_pattern == &amp;quot;LsLLsAs&amp;quot; then&lt;br /&gt;
			-- Modes of harmonic minor&lt;br /&gt;
			-- Closest-mode search always returns one name&lt;br /&gt;
			mode_names = {&lt;br /&gt;
				&amp;quot;Harmonic minor&amp;lt;br /&amp;gt;(Aeolian ♮7)&amp;quot;,&lt;br /&gt;
				&amp;quot;Locrian ♮6&amp;quot;,&lt;br /&gt;
				&amp;quot;Ionian augmented&amp;lt;br /&amp;gt;(Ionian ♯5)&amp;quot;,&lt;br /&gt;
				&amp;quot;Dorian ♯4&amp;quot;,&lt;br /&gt;
				&amp;quot;Phrygian dominant&amp;lt;br /&amp;gt;(Phrygian ♮3)&amp;quot;,&lt;br /&gt;
				&amp;quot;Lydian ♯2&amp;quot;,&lt;br /&gt;
				&amp;quot;Altered diminished&amp;lt;br /&amp;gt;(Locrian ♭4 𝄫7)&amp;quot;,&lt;br /&gt;
			}&lt;br /&gt;
		elseif step_pattern == &amp;quot;LLsLsAs&amp;quot; then&lt;br /&gt;
			-- Modes of harmonic major&lt;br /&gt;
			-- Closest-mode search always returns one name&lt;br /&gt;
			mode_names = {&lt;br /&gt;
				&amp;quot;Harmonic major&amp;lt;br /&amp;gt;(Ionian ♭6)&amp;quot;,&lt;br /&gt;
				&amp;quot;Dorian ♭5&amp;quot;,&lt;br /&gt;
				&amp;quot;Phrygian ♭4&amp;quot;,&lt;br /&gt;
				&amp;quot;Lydian ♭3&amp;quot;,&lt;br /&gt;
				&amp;quot;Mixolydian ♭2&amp;quot;,&lt;br /&gt;
				&amp;quot;Lydian augmented ♯2&amp;lt;br /&amp;gt;(Lydian ♯2 ♯5)&amp;quot;,&lt;br /&gt;
				&amp;quot;Locrian 𝄫7&amp;quot;,&lt;br /&gt;
			}&lt;br /&gt;
		elseif step_pattern == &amp;quot;LsLLLLs&amp;quot; then&lt;br /&gt;
			-- Modes of melodic minor&lt;br /&gt;
			-- Closest-mode search sometimes returns two names&lt;br /&gt;
			mode_names = {&lt;br /&gt;
				&amp;quot;Melodic minor&amp;lt;br /&amp;gt;(Ionian ♭3, Dorian ♮7)&amp;quot;,&lt;br /&gt;
				&amp;quot;Dorian ♭2, Phrygian ♮6&amp;quot;,&lt;br /&gt;
				&amp;quot;Lydian augmented&amp;lt;br /&amp;gt;(Lydian ♯5)&amp;quot;,&lt;br /&gt;
				&amp;quot;Lydian dominant&amp;lt;br /&amp;gt;(Lydian ♭7, Mixolydian ♯4)&amp;quot;,&lt;br /&gt;
				&amp;quot;Mixolydian ♭6, Aeolian ♮3&amp;quot;,&lt;br /&gt;
				&amp;quot;Half-diminished&amp;lt;br /&amp;gt;(Aeolian ♭5, Locrian ♮2)&amp;quot;,&lt;br /&gt;
				&amp;quot;Altered, Altered dominant&amp;lt;br /&amp;gt;(Locrian ♭4)&amp;quot;,&lt;br /&gt;
			}&lt;br /&gt;
		elseif step_pattern == &amp;quot;sLLLLLs&amp;quot; then&lt;br /&gt;
			-- Modes of Neapolitan major&lt;br /&gt;
			-- Closest-mode search sometimes returns two names&lt;br /&gt;
			mode_names = {&lt;br /&gt;
				&amp;quot;Neapolitan major&amp;lt;br /&amp;gt;(Ionian ♭2 ♭3, Phrigian ♮6 ♮7)&amp;quot;,&lt;br /&gt;
				&amp;quot;Lydian augmented ♯6&amp;lt;br /&amp;gt;(Lydian ♯5 ♯6)&amp;quot;,&lt;br /&gt;
				&amp;quot;Lydian augmented dominant&amp;lt;br /&amp;gt;(Lydian ♯5 ♭7, Mixolydian ♯4 ♯5)&amp;quot;,&lt;br /&gt;
				&amp;quot;Lydian minor&amp;lt;br /&amp;gt;(Lydian ♭6 ♭7, Aeolian ♮3 ♯4)&amp;quot;,&lt;br /&gt;
				&amp;quot;Major locrian&amp;lt;br /&amp;gt;(Mixolydian ♭5 ♭6, Locrian ♮2 ♮3)&amp;quot;,&lt;br /&gt;
				&amp;quot;Altered dominant ♮2&amp;lt;br /&amp;gt;(Aeolian ♭4 ♭5, Locrian ♮2, ♭4)&amp;quot;,&lt;br /&gt;
				&amp;quot;Altered dominant 𝄫3&amp;lt;br /&amp;gt;(Locrian 𝄫3 ♭4)&amp;quot;,&lt;br /&gt;
			}&lt;br /&gt;
		elseif step_pattern == &amp;quot;sLLLsAs&amp;quot; then&lt;br /&gt;
			-- Modes of Neapolitan minor&lt;br /&gt;
			-- Closest-mode search always returns one name&lt;br /&gt;
			mode_names = {&lt;br /&gt;
				&amp;quot;Neapolitan minor&amp;lt;br /&amp;gt;(Phrygian ♮7)&amp;quot;,&lt;br /&gt;
				&amp;quot;Lydian ♯6&amp;quot;,&lt;br /&gt;
				&amp;quot;Mixolydian augmented&amp;lt;br /&amp;gt;(Mixolydian ♯5)&amp;quot;,&lt;br /&gt;
				&amp;quot;Aeolian ♯4&amp;quot;,&lt;br /&gt;
				&amp;quot;Locrian dominant&amp;lt;br /&amp;gt;(Locrian ♮3)&amp;quot;,&lt;br /&gt;
				&amp;quot;Ionian ♯2&amp;quot;,&lt;br /&gt;
				&amp;quot;Altered diminished 𝄫3&amp;lt;br /&amp;gt;(Locrian 𝄫3 ♭4 𝄫7)&amp;quot;,&lt;br /&gt;
			}&lt;br /&gt;
			elseif step_pattern == &amp;quot;sAsLsAs&amp;quot; then&lt;br /&gt;
			-- Modes of double harmonic&lt;br /&gt;
			-- Closest-mode search sometimes returns two names&lt;br /&gt;
			mode_names = {&lt;br /&gt;
				&amp;quot;Double harmonic&amp;lt;br /&amp;gt;(Ionian ♭2 ♭6, Phrygian ♮3 ♮7)&amp;quot;,&lt;br /&gt;
				&amp;quot;Lydian ♯2 ♯6&amp;quot;,&lt;br /&gt;
				&amp;quot;Altered ♮5 𝄫6&amp;lt;br /&amp;gt;(Phrygian ♭4 𝄫7)&amp;quot;,&lt;br /&gt;
				&amp;quot;Double harmonic minor&amp;lt;br /&amp;gt;(Lydian ♭3 ♭6, Aeolian ♯4 ♮7)&amp;quot;,&lt;br /&gt;
				&amp;quot;Mixolydian ♭2 ♭5, Locrian ♮3 ♮6&amp;quot;,&lt;br /&gt;
				&amp;quot;Ionian augmented ♯2&amp;lt;br /&amp;gt;(Ionian ♯2 ♯5)&amp;quot;,&lt;br /&gt;
				&amp;quot;Locrian 𝄫3 𝄫7&amp;quot;,&lt;br /&gt;
			}&lt;br /&gt;
		elseif #step_pattern == 0 then&lt;br /&gt;
			-- True-mos modes&lt;br /&gt;
			mode_names = { &lt;br /&gt;
				&amp;quot;Lydian&amp;quot;,&lt;br /&gt;
				&amp;quot;Ionian (major)&amp;quot;,&lt;br /&gt;
				&amp;quot;Mixolydian&amp;quot;,&lt;br /&gt;
				&amp;quot;Dorian&amp;quot;,&lt;br /&gt;
				&amp;quot;Aeolian (minor)&amp;quot;,&lt;br /&gt;
				&amp;quot;Phrygian&amp;quot;,&lt;br /&gt;
				&amp;quot;Locrian&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- If mode names are given, use those instead&lt;br /&gt;
	-- If using default mode names (scalesig+udp), those names are auto-added by the relevant function&lt;br /&gt;
	local use_default_names = false&lt;br /&gt;
	if #mode_names_unparsed ~= 0 then&lt;br /&gt;
		if mode_names_unparsed == &amp;quot;Default&amp;quot; then&lt;br /&gt;
			use_default_names = true&lt;br /&gt;
		else&lt;br /&gt;
			mode_names = tip.parse_entries(mode_names_unparsed)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Check if the table should start collapsed&lt;br /&gt;
	local is_collapsed = yesno(frame.args[&amp;quot;Collapsed&amp;quot;], false)&lt;br /&gt;
	&lt;br /&gt;
	-- If a modmos step pattern was never provided, call the function mos_mode_degrees&lt;br /&gt;
	-- Otherwise, call the function modmos_mode_degrees&lt;br /&gt;
	local result = &amp;quot;&amp;quot;&lt;br /&gt;
	if step_pattern == &amp;quot;&amp;quot; then&lt;br /&gt;
		result = p._mos_mode_degrees(input_mos, mos_prefix, is_collapsed)&lt;br /&gt;
	--elseif #step_pattern == input_mos.nL + input_mos.ns then&lt;br /&gt;
	else&lt;br /&gt;
		result = p._mos_mode_degrees(input_mos, mos_prefix, is_collapsed, step_pattern)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Debugger option&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;
return p&lt;/div&gt;</summary>
		<author><name>Furcht968</name></author>
	</entry>
</feed>