「数理最適化」の版間の差分

提供: Xenharmonic Wiki
ナビゲーションに移動 検索に移動
編集の要約なし
編集の要約なし
 
7行目: 7行目:
[[RTT]]において、'''数理最適化'''の技法はレギュラーテンペラメントの「誤差の小さい」チューニングを求めるために使われている。
[[RTT]]において、'''数理最適化'''の技法はレギュラーテンペラメントの「誤差の小さい」チューニングを求めるために使われている。


レギュラーテンペラメントは[[マッピング]]または[[コンマ基底]]によって定義される。これはチューニングを特定するような情報を含んでいない。このテンペラメントを調律するには、{{en仮リンク|tuning map}}を定義する、つまり各ジェネレーターのサイズを決定しなければならない。ではそれらはどうあるべきなのか? 一般的に、テンペラメントは[[純正律]]を近似するものである。どうチューニングしてもいくつかの音程には不可避的に誤差が導入される(そもそも別々の純正音程をひとつの音程にしなければならないという無茶をやろうとしているのだ)。[[テンパーアウト|テンパー]]の肝は妥協にあり――関心のある音程の総合誤差が最小になるようなスイートスポットを見つけること、これにより元の純正律の和声をできるだけ保つようにする。
レギュラーテンペラメントは[[マッピング]]または[[コンマ基底]]によって定義される。これはチューニングを特定するような情報を含んでいない。このテンペラメントを調律するには、{{en仮リンク|tuning map}}を定義する、つまり各ジェネレーターのサイズを決定しなければならない。ではそれらはどうあるべきなのか? 一般的に、テンペラメントは[[純正律]]をより少ない音で近似するものである。どうチューニングしてもいくつかの音程には不可避的に誤差が導入される。[[テンパーアウト|テンパー]]の肝は妥協にあり――関心のある音程の総合誤差が最小になるようなスイートスポットを見つけること、これにより元の純正律の和声をできるだけ保つようにする。


== 分類 ==
== 分類 ==
大まかに言うと、態度がだいぶ違う2種類のチューニング方法がある。
大まかに言うと、態度がだいぶ違う2種類のチューニング方法がある。


* ノルム最適化は、形式的素数([[純正律サブグループ]]の基底のこと)だけではなく全ての音程(無限個)を対象とする、というていで、実際には無限和を回避し、音程の誤差を音程の複雑度で割ったもの({{en仮リンク|damage}})を考えることにより結局簡単な音程しか考える必要がなくなる(複雑度が有理数に関して加法的な振る舞いをするなら、例えば 9/4 の複雑度は 3/2 の複雑度の2倍になって誤差と比例するので割ったものは同じになり全ての音程のことを考えていると言えなくもない)という、よく言えばエレガントなチューニング方法である。
* ノルム最適化は、形式的素数([[純正律サブグループ]]の基底のこと)だけではなく全ての音程(無限個)を対象とする、というていで、実際には無限和を回避し、音程の誤差を音程の複雑度で割ったもの({{en仮リンク|damage}})を考えることにより結局簡単な音程しか考える必要がなくなる(複雑度が有理数に関して加法的な振る舞いをするなら、例えば 9/4 の複雑度は 3/2 の複雑度の2倍になって誤差と比例するので割ったものは同じになり全ての音程のことを考えていると言えそうではある)という、なんだかエレガントなチューニング方法である。
* ターゲット最適化は、自由に作曲者が望んだいくつかの音程だけの総合誤差を小さくする。望まれる音程は大体簡単な音程であり、格子のより外側の音程は無関係なものとして無視される。
* ターゲット最適化は、自由に作曲者が望んだいくつかの音程だけの総合誤差を小さくする。望まれる音程は大体簡単な音程であり、格子のより外側の音程は無関係なものとして無視される。


27行目: 27行目:
$$ W = \operatorname {diag} (1/\log_2 (Q)) $$
$$ W = \operatorname {diag} (1/\log_2 (Q)) $$


となる。ここで ''Q'' = {{val| 2 3 5 … }} でありその中の各素数 ''q'' の重要度は 1/log<sub>2</sub>(''q'')、複雑度は log<sub>2</sub>(''q'') となる。重みを付けても双対空間であることを維持するために、''V'' をヴァル、''M'' をモンゾとして
となる。ここで ''Q'' = {{val| 2 3 5 … }} でありその中の各素数 ''q'' の重要度は 1/log<sub>2</sub>(''q'')、複雑度は log<sub>2</sub>(''q'') となる。双対空間であるまま(内積がステップ数を出力することを維持したまま)重みを付けようとすると必然的に、''V'' をヴァル、''M'' をモンゾとして


$$
$$
33行目: 33行目:
$$
$$


で、''W'' が重要度、''W''<sup>−1</sup> が複雑度だということである。
となり、''W'' が重要度、''W''<sup>−1</sup> が複雑度になるということである。


=== 傾き ===
=== 傾き ===
51行目: 51行目:
''L''<sup>1</sup> と ''L''<sup>∞</sup> が双対ノルム(双対空間それぞれに設定されたノルムである種の性質の良さがある組み合わせ)である。''L''<sup>2</sup> の双対は ''L''<sup>2</sup> である。
''L''<sup>1</sup> と ''L''<sup>∞</sup> が双対ノルム(双対空間それぞれに設定されたノルムである種の性質の良さがある組み合わせ)である。''L''<sup>2</sup> の双対は ''L''<sup>2</sup> である。


これは重みの逆数関係に似た話で、斜め方向(軸と軸の間の方向)の重要度と複雑度を扱っていると思えばよく、例えばtuning spaceの斜め方向が重要でinterval spaceの斜め方向を簡単扱いとするには、tuning spaceに ''L''<sup>1</sup>、interval spaceに ''L''<sup>∞</sup> を採用する。テニー高さはinterval spaceの斜め方向を複雑扱いするもので、tuning spaceに ''L''<sup>∞</sup>、interval spaceに ''L''<sup>1</sup> を採用する。
これは重みの逆数関係に似た話で、斜め方向(軸と軸の間の方向)の重要度と複雑度を扱っていると思えばよい。例えばtuning spaceの斜め方向が重要でinterval spaceの斜め方向を簡単扱いとするには、tuning spaceに ''L''<sup>1</sup>、interval spaceに ''L''<sup>∞</sup> を採用する。テニー高さはinterval spaceの斜め方向を複雑扱いするもので、tuning spaceに ''L''<sup>∞</sup>、interval spaceに ''L''<sup>1</sup> を採用する。


(中略)
ハーモニーの複雑さは主にテニー高さのようにマンハッタンノルムでモデル化される。なのでマンハッタンノルムによる最適化(tuning spaceで ''L''<sup>∞</sup> 最適化)が最良のチューニングで、ユークリッドノルムは計算が簡単なせいで使われているだけだと({{en仮リンク|D&D's Guide}}は特にこの立場である)。しかしながら、ユークリッドノルムや特にチェビシェフノルムでより最適化分野の知見を活かすのもよい。これらは各素数のジェネレーターチェーン上の遠さが誤差量に反映される。


== 強制 ==
== 強制 ==
62行目: 62行目:


=== 制約 ===
=== 制約 ===
制約条件(等式)を追加してそれも満たす最小化問題をきちんと解くこと。制約条件を増やした結果最小化以前に解が定まってしまう場合もある(純正のままにした音程のことを{{en仮リンク|固有モンゾ|eigenmonzo}}という。ランク-''n'' テンペラメントに固有モンゾを線形独立に ''n'' 個設定すると解が定まってしまう)。制約条件は最適化の{{w|実行可能領域}}を定義し、実行可能な範囲で最小化された結果をfeasibly optimalという。
制約条件を追加してそれも満たす最小化問題をきちんと解くこと。制約条件を増やした結果最小化以前に解が定まってしまう場合もある(純正のままにした音程のことを{{en仮リンク|固有モンゾ|eigenmonzo}}という。ランク-''n'' テンペラメントに固有モンゾを線形独立に ''n'' 個設定すると解が定まってしまう)。制約条件は最適化の{{w|実行可能領域}}を定義し、実行可能な範囲で最小化された結果をfeasibly optimalという。


== 枠組みの定式化 ==
== 枠組みの定式化 ==
87行目: 87行目:


== 主要なチューニング ==
== 主要なチューニング ==
たくさんのチューニング方法に名前が与えられている。以下の表にてその一部をマトリックスにして示す。
 
{| class="wikitable"
|+主要なチューニング
|-
! 重み–傾き\次数 !! 音程複雑度: チェビシェフ<br>(素数の重要度: ''L''<sup>1</sup>) !! ユークリッド<br>(''L''<sup>2</sup>) !! マンハッタン<br>(''L''<sup>inf</sup>)
|-
| テニー<br>ワイル || TC tuning<br><br> || [[TE tuning]]<br>[[WE tuning]] || [[TOP tuning]]<br><br>
|-
| 等辺(=重みなし)<br>傾き+等辺 || EC tuning<br><br> || [[Frobenius tuning]]<br><abbr title="Skewed-equilateral-Euclidean">SEE</abbr> tuning || EOP tuning<br><br>
|-
| Benedetti/Wilson<br>Skewed-Benedetti/Wilson || BC tuning<br><br> || [[BE tuning]]<br><abbr title="Skewed-Benedetti-Euclidean">SBE</abbr> tuning || [[BOP tuning]]<br><br>
|}
 
それぞれに制約付き変種やデストレッチ付き変種がある。例えば、TE tuningに対し[[CTE tuning]]、WE tuningに対し[[CWE tuning]]などである。
 
'''Note:''' [[:en:Sintel]]の[https://sintel.pythonanywhere.com/ temperament calculator]において、Frobenius tuningは"E tuning"と表示され、CEE tuningは"CE tuning"と表示される。

2025年10月22日 (水) 14:57時点における最新版

RTTにおいて、数理最適化の技法はレギュラーテンペラメントの「誤差の小さい」チューニングを求めるために使われている。

レギュラーテンペラメントはマッピングまたはコンマ基底によって定義される。これはチューニングを特定するような情報を含んでいない。このテンペラメントを調律するには、tuning map (en) を定義する、つまり各ジェネレーターのサイズを決定しなければならない。ではそれらはどうあるべきなのか? 一般的に、テンペラメントは純正律をより少ない音で近似するものである。どうチューニングしてもいくつかの音程には不可避的に誤差が導入される。テンパーの肝は妥協にあり――関心のある音程の総合誤差が最小になるようなスイートスポットを見つけること、これにより元の純正律の和声をできるだけ保つようにする。

分類

大まかに言うと、態度がだいぶ違う2種類のチューニング方法がある。

  • ノルム最適化は、形式的素数(純正律サブグループの基底のこと)だけではなく全ての音程(無限個)を対象とする、というていで、実際には無限和を回避し、音程の誤差を音程の複雑度で割ったもの(damage (en) )を考えることにより結局簡単な音程しか考える必要がなくなる(複雑度が有理数に関して加法的な振る舞いをするなら、例えば 9/4 の複雑度は 3/2 の複雑度の2倍になって誤差と比例するので割ったものは同じになり全ての音程のことを考えていると言えそうではある)という、なんだかエレガントなチューニング方法である。
  • ターゲット最適化は、自由に作曲者が望んだいくつかの音程だけの総合誤差を小さくする。望まれる音程は大体簡単な音程であり、格子のより外側の音程は無関係なものとして無視される。

本項目ではノルム最適化の分類方法について述べる。ターゲット最適化についてはtarget tuning (en) を参照のこと。

ノルム

平面 R2 上の異なるノルムに関する単位円の様子

ノルム最適化を行うには、音程の複雑度に関するノルムを導入する必要がある。技術的には、純正律サブグループをノルム線型空間埋め込むことである。これをするにはいくつかの側面で検討することがある。重みは形式的素数のそれぞれがどの程度重要なのか、傾き(skew、仮訳)は分数と合成数で扱いを変えるかどうか、である。これらはノルムの定義として書いても座標として表現してもよく、見方の違いでしかない。最後に次数(ノルムと聞いて真っ先に思い浮かべるあれ)は、斜め方向の移動がどう数えられるかを決定する。

重み

重み付けは対角行列で表され、形式的素数それぞれの重要度を決定する。tuning spaceinterval spaceは互いに双対空間であって、tuning spaceでの重要度(重要な方向はより拡大して埋め込まれる)はinterval spaceでの複雑度の評価(簡単さ・原点への近さ)に相当する。テニー重みは最もありふれた重み付けであり、

$$ W = \operatorname {diag} (1/\log_2 (Q)) $$

となる。ここで Q = 2 3 5 …] でありその中の各素数 q の重要度は 1/log2(q)、複雑度は log2(q) となる。双対空間であるまま(内積がステップ数を出力することを維持したまま)重みを付けようとすると必然的に、V をヴァル、M をモンゾとして

$$ V M = (V W) (W^{-1} M) $$

となり、W が重要度、W−1 が複雑度になるということである。

傾き

各素数軸を直交させた場合は分数の形になっているものと合成数の形になっているものを同じ重要度として扱うが、分数の形のほうが重要であると考えることが多い。例えば、同じように 3 と 5 を1個づつ使っていても、5/3 のほうが 15/1 より重要だとみなされる。傾きはこれを理論に導入する。

ワイルノルム (en) はテニー重みをベースに、軸の間の角度を 60 度に傾け(さらに線形従属な軸を加え)たものである。

重みと傾きは、マッピング行列に掛けることができる行列として表現できる。一般化して考えると、両者の区別は重要ではなく、まとめて重み・傾き変換行列と呼ばれる。

次数

ノルムの次数はinterval spaceでの単位長さを決定する。

  • ユークリッドノルム(L2 ノルム)は現実の直線距離のようなものである。
  • マンハッタンノルム(L1 ノルム)はマンハッタンの中のタクシーのようなものである。水平方向の移動と垂直方向の移動しかできないので、斜めの移動コストは両方の和となる。
  • チェビシェフノルム(L ノルム)はチェスのキングのようなものである。左右に1マス、上下に1マス、斜め移動(L2 的に言えば 1.41 マス先)が全て1手でできる。

L1L が双対ノルム(双対空間それぞれに設定されたノルムである種の性質の良さがある組み合わせ)である。L2 の双対は L2 である。

これは重みの逆数関係に似た話で、斜め方向(軸と軸の間の方向)の重要度と複雑度を扱っていると思えばよい。例えばtuning spaceの斜め方向が重要でinterval spaceの斜め方向を簡単扱いとするには、tuning spaceに L1、interval spaceに L を採用する。テニー高さはinterval spaceの斜め方向を複雑扱いするもので、tuning spaceに L、interval spaceに L1 を採用する。

ハーモニーの複雑さは主にテニー高さのようにマンハッタンノルムでモデル化される。なのでマンハッタンノルムによる最適化(tuning spaceで L 最適化)が最良のチューニングで、ユークリッドノルムは計算が簡単なせいで使われているだけだと(D&D's Guide (en) は特にこの立場である)。しかしながら、ユークリッドノルムや特にチェビシェフノルムでより最適化分野の知見を活かすのもよい。これらは各素数のジェネレーターチェーン上の遠さが誤差量に反映される。

強制

特定の音程を特定の大きさに強制する手法について解説する。オクターブを純正にすることが最もよく行われている強制であるが、他の音程も対象になりうる。2つの主流な方法がある。

デストレッチ

デストレッチは後処理により純正音程を強制する方法である。(17.1edoのGPVを17.0edoで用いるような話である。)その結果はもはや元々のノルムとは関係ないものになるが、しばしばもっと高度な手法に対する簡便な近似になる。最もありふれた例がPOTE tuning (en) である。これはたまたまCWE tuning (en) に近い結果を得られることで知られている。

制約

制約条件を追加してそれも満たす最小化問題をきちんと解くこと。制約条件を増やした結果最小化以前に解が定まってしまう場合もある(純正のままにした音程のことを固有モンゾ (en) という。ランク-n テンペラメントに固有モンゾを線形独立に n 個設定すると解が定まってしまう)。制約条件は最適化の実行可能領域を定義し、実行可能な範囲で最小化された結果をfeasibly optimalという。

枠組みの定式化

(デストレッチを除いて)テンペラメントの最適化問題は以下のように定義できる。マッピング行列 V純正律マップ (en) J が与えられ、重み・傾き変換行列 X、tuning spaceのノルムの次数 q、制約条件があるならその固有モンゾを並べた行列 M を決定する。generator tuning mapを G と書くと、

$$ \begin{align} & \text{find(動かす変数)} && G \\ & \text{that minimizes(最小化したい)} && \lVert GV_X - J_X \rVert_q \\ & \text{subject to(制約条件)} && (GV - J)M = O \end{align} $$

ここで (·)X は重み・傾き付き空間での変数を表し、

$$ \begin{align} V_X &= VX \\ J_X &= JX \end{align} $$

である。

主要なチューニング

たくさんのチューニング方法に名前が与えられている。以下の表にてその一部をマトリックスにして示す。

主要なチューニング
重み–傾き\次数 音程複雑度: チェビシェフ
(素数の重要度: L1)
ユークリッド
(L2)
マンハッタン
(Linf)
テニー
ワイル
TC tuning

TE tuning
WE tuning
TOP tuning

等辺(=重みなし)
傾き+等辺
EC tuning

Frobenius tuning
SEE tuning
EOP tuning

Benedetti/Wilson
Skewed-Benedetti/Wilson
BC tuning

BE tuning
SBE tuning
BOP tuning

それぞれに制約付き変種やデストレッチ付き変種がある。例えば、TE tuningに対しCTE tuning、WE tuningに対しCWE tuningなどである。

Note: en:Sinteltemperament calculatorにおいて、Frobenius tuningは"E tuning"と表示され、CEE tuningは"CE tuning"と表示される。