モジュール:ETのソースを表示
←
モジュール:ET
ナビゲーションに移動
検索に移動
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループに属する利用者のみが実行できます:
登録利用者
。
このページのソースの閲覧やコピーができます。
local rat = require("Module:Rational") local seq = require("Module:Sequence") local p = {} local common_suffix = { ["3/2"] = "f", ["2"] = "o", ["2/1"] = "o", ["3"] = "t", ["3/1"] = "t", } local common_ratio = { ["f"] = rat.new(3, 2), ["o"] = 2, ["t"] = 3, ["ϕ"] = (1 + math.sqrt(5)) / 2, ["n"] = math.exp(1), ["π"] = math.pi } -- create a ET structure <size>ed<equave> function p.new(size, equave, suffix) size = size or 12 equave = equave or 2 if suffix == nil then local equave_n, equave_m = rat.as_pair(equave) local equave_ratio = rat.as_ratio(equave) equave_ratio = equave_ratio:lower() suffix = "ed" if common_suffix[equave_ratio] then suffix = suffix .. common_suffix[equave_ratio] elseif equave_m == 1 then suffix = suffix .. equave_n else suffix = suffix .. equave_ratio end if equave_ratio == "2/1" then suffix = "平均律" end end return { size = size, equave = equave, suffix = suffix } end -- parse a ET structure function p.parse(unparsed) local size, equave = unparsed:match("^(%d+%.*%d*)(平均律)$") if equave == nil then return nil else return p.new(tonumber(size), 2, "平均律") end local size, suffix, equave = unparsed:match("^(%d+%.*%d*)([Ee][Dd](.+))$") -- local size, suffix, equave = unparsed:match("^(%d+%.*%d*)([Cc]?[Ee][Dd]?[Tt]?(.*))$") if equave == nil then return nil end suffix = suffix:lower() size = tonumber(size) equave = common_ratio[equave] or rat.parse(equave) if size == nil or equave == nil then return nil end return p.new(size, equave, suffix) end -- construct a string representation for a ET structure function p.as_string(et) return et.size .. et.suffix end -- convert steps to a proper ratio (except that it is a float approximation) function p.backslash_ratio(et, steps) if et.size == 0 then return 1 end return rat.as_float(et.equave) ^ (steps / et.size) end function p.backslash_display(et, steps) if et.size == 0 then return 1 end return steps .. p.backslash_modifier(et) end function p.backslash_modifier(et) if not rat.eq(et.equave, 2) then return "\\" .. et.size .. et.suffix end return "\\" .. et.size end -- convert steps to cents function p.cents(et, steps) if et.size == 0 then return 0 end steps = steps or 1 return 1200 * steps / et.size * math.log(rat.as_float(et.equave)) / math.log(2) end -- convert ratio to steps -- ratio is a float! -- towards is one of: -1 (floor), 0 (nearest), 1 (ceil) function p.approximate(et, ratio, towards) towards = towards or 0 if et.size == 0 then return 0 end local exact = math.log(ratio) / math.log(rat.as_float(et.equave)) * et.size if towards < 0 then return math.floor(exact) elseif towards > 0 then return math.ceil(exact) else return math.floor(exact + 0.5) end end -- whether this ET tempers out the provided rational number function p.tempers_out(et, ratio) local t = 0 for factor, power in pairs(ratio) do if type(factor) == "number" then t = t + power * p.approximate(et, factor) end end return t == 0 end -- determine whether ET is highly composite function p.is_highly_composite(et) et.highly_composite = et.highly_composite or rat.is_highly_composite(et.size) return et.highly_composite end -- determine whether ET's size could be within one of zeta function-related sequences function p.is_zeta(et) return seq.contains(seq.zeta_peak, et.size) or seq.contains(seq.zeta_peak_integer, et.size) or seq.contains(seq.zeta_integral, et.size) or seq.contains(seq.zeta_gap, et.size) end -- describe why function p.why_zeta(et) local zeta_peak = seq.contains(seq.zeta_peak, et.size) local zeta_peak_integer = seq.contains(seq.zeta_peak_integer, et.size) local zeta_integral = seq.contains(seq.zeta_integral, et.size) local zeta_gap = seq.contains(seq.zeta_gap, et.size) local markers = {} if zeta_peak then table.insert(markers, "[[:en:The Riemann zeta function and tuning #Zeta peak edos|Zeta peak]]") elseif zeta_peak == nil then table.insert(markers, "[[:en:The Riemann zeta function and tuning #Zeta peak edos|Zeta peak?]]") end if zeta_peak_integer then table.insert(markers, "[[:en:The Riemann zeta function and tuning #Zeta peak edos|Zeta peak integer]]") elseif zeta_peak_integer == nil then table.insert(markers, "[[:en:The Riemann zeta function and tuning #Zeta peak edos|Zeta peak integer?]]") end if zeta_integral then table.insert(markers, "[[:en:The Riemann zeta function and tuning #Zeta integral edos|Zeta integral]]") elseif zeta_integral == nil then table.insert(markers, "[[:en:The Riemann zeta function and tuning #Zeta integral edos|Zeta integral?]]") end if zeta_gap then table.insert(markers, "[[:en:The Riemann zeta function and tuning #Zeta gap edos|Zeta gap]]") elseif zeta_gap == nil then table.insert(markers, "[[:en:The Riemann zeta function and tuning #Zeta gap edos|Zeta gap?]]") end return table.concat(markers, "<br>") end return p
このページで使用されているテンプレート:
モジュール:ET/doc
(
ソースを閲覧
)
モジュール:ET
に戻る。
ナビゲーション メニュー
個人用ツール
ログイン
アカウント申請
名前空間
モジュール
議論
English
表示
閲覧
ソースを閲覧
履歴表示
その他
検索
案内
メインページ
最近の更新
おまかせ表示
ヘルプ
高度な検索
参加申請
理論
手法
一般理論
コミュニティ
XA Facebook
XA Discord
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報