アルゴリズムをどう同定しているか
このサイトのほかのページは、すべて「ユニットが何を返したか」を組み直したものです。このページだけが例外で、扱うのは「その返答の背後には、このアルゴリズムがある」という主張です。その主張はアーカイブ側の inferences/ に置かれており、測定とは種類の違う記録です。測定が誤るのは測定系が誤っていたときだけですが、ここでの主張は、根拠にしている数値がすべて正しくても誤りうるものです。
そのため、この主張は決まった手続きの下でしか立てません。実装例を公開してよいと判断できるのも、その手続きがあるからです。以下は、実際に進む順で並べたその手続きです。
1. クラスと、それが取りうる読みの候補表
1 つのバイトを単独で相手にすることはしません。まずフェイザー、ディレイタイム、フィルタ段、モジュレーションレートといったクラスに入れ、そのクラスが持つ「取りうる読み」の候補表を用意します。候補表は、どれか 1 つを採点する前に書き終えます。
候補表の範囲を決めるのは、そのユニットが作られた時代に何が作れたかです。変換器より低いレートで固定小数点 DSP がエフェクトを回している部品なら、オールパス段を 8 つ持つ余裕はあっても、バイカッドを 8 つ持つ余裕はありません。係数 1 つで全段を動かすのと、段ごとに係数を持つのとでは、かかるものが違います。この種の推論は era prior(当時の前提) として記録し、どの前提にも「何があればこの前提が誤りになるか」を必ず添えます。何があれば誤りになるかを述べられない前提は、前提として記録しません。
候補表を先に書くことが、最後の段階が循環になるのを止めています。自分自身としか比べないモデルは必ず勝つからです。「当たっていないのに当てはまりが良く見える」経路は三つあり、これがその一つ目です。残る二つは、比較対象の選び方(3)と対抗候補の選び方(4)です。
2. モデルはコードではなくファイル
候補の 1 つが モデル になります。モデルは小さな宣言的ファイルで、連鎖の構成、動作レート、そしてパラメータバイトごとの写像を並べたものです。写像はテーブル、窓、状態の集合、あるいはいくつかの読み取り点とその間の補間です。そこにプログラムは入りません。数値と構造だけを持ちます。だからこそ、同じ 1 つのファイルからレンダリングし、曲線として描き、コードとして印刷しても、三者が食い違いません。
どの写像にも、どの記録から読んだか、そしてそれが法則なのか読み値なのかが書かれています。設定ごとに、その設定自身のノッチから当てはめたコーナー周波数は読み値です。主張されているのは段数とレートであって、コーナーの数値そのものはその読み取りの丸め誤差です。
3. レンダリングし、同じ経路で読み直す
モデルをレンダリングし、その結果を、ユニット自身のテイクを通したのと同じ経路で読みます。
波形同士は決して比べません。 1 回のテイクの間に、2 つのクロックは数十 ppm ずれます。1 つの設定を 2 回録ったもの同士のコヒーレンスが 2 kHz で崩れることは、すでに測定済みです。比べるのは、アーカイブが公開している量です。帯域プロファイル、ノッチ位置、到達時刻を、両側について求めて突き合わせます。
比較対象は選ばず、生成します。 その型について公開済みの読み取りをすべて、アーカイブ自身の索引から取ります。モデルをどの記録に対して採点するかを選ぶことは、当たっていないのに当てはまりが良く見える二つ目の経路です。外した記録は、外した理由とともに名指しで記録します。
4. 四つの関門、そして残差そのものには閾値を置かない
残差は報告しますが、粗い関門とノイズフロアの間では最適化しません。そこを下げにいっても、測っているのはモデルではなく部屋と変換器だからです。候補の合否は、この数値では決まりません。決めるのは四つの関門です。
粗い関門(gross) は、そのエフェクト自身が試験範囲で動かす幅に対して残差を問います。これは尺度に依存しないので、絶対的なデシベル値をでっち上げる必要がなく、クラスごとに関門が自動的に較正されます。ここを落ちたモデルは、ほかの三つが何を言おうと落ちます。
性質の関門(qualitative) は、ユニットの読み取り値が持つ性質を、モデルの読み取り値も持つかを問います。ユニットが揺れているところで止まっているモデル、ユニットが持ち上げているところで削っているモデルは、残差をどう計算し直しても救われません。
対抗の関門(power) は、候補表の中で最も強い対抗候補を、同じ比較対象で走らせ、どれだけ差がついたかを見ます。対抗候補は選びません。二番目の点数を取った候補が自動的にそれになるので、藁人形を立てることができません。これが三つ目の経路への対処です。候補が 1 つしかないクラスは、候補表が未完成だということです。それは合格ではなく、発見として記録します。
破綻の関門(breakdown) は、モデルがどこでユニットに追随しなくなるかを問います。バイトの範囲の真ん中でしか試していないモデルは、その両端について何も主張できません。そしてモデルが壊れるのは両端です。
人が耳で二つを聴き比べることもあります。それはそのままの位置づけで記録し、モデルを落とすためにだけ使い、通すためには決して使いません。「似ている」という判断は何も保証しませんが、「明らかに違う」という判断は、数値がどうであれ正しいからです。
5. 判定と、その横に残っている読み
関門が判定に至ります。判定はアーカイブの言葉であって、このサイトが計算し直した数値ではありません。主張を閉じる判定は二つ、reproduces(再現した)と equivalent under this test(この試験では等価)です。開いたままにする判定は四つ、breaks down(破綻)、domain too narrow(試験範囲が狭すぎる)、candidates too few(候補が少なすぎる)、rejected(棄却)です。どれにも「何があればこれが動くか」が 1 つ名指ししてあります。
equivalent under this test は未解決の問いではありません。この試験では二つの読みを分離できない、と明言した状態です。そう書いてあるからこそ、下流の誰かがどちらかを選んだとき、自分が何を選んだのかを分かった上で選べます。
同じ証拠が残す別の読みは、すべて主張の横に並べます。そのうち主張と区別できるものについては、区別する測定を「提案」ではなく「計算」で出します。二つの予測が食い違う観測量のうち、その食い違いがこの測定系の分解能を上回るものを選び、その余裕(margin)を書き添えます。余裕が 1 を下回る測定は、そもそも答えを出せません。だから待ち行列にも入れません。答えを出せない実験は、このプロジェクトがもともと公開を拒んでいる種類の否定的結果です。
6. 三巡したら保留にする
モデルの改訂は 3 回までです。それを超えたら、何が足りないかを添えて主張を 保留 にします。1 つのエフェクト型がプロジェクト全体を飲み込まないようにするためです。保留になった主張は開いたまま残り、それ以上は回数を消費しません。
誤りと分かった主張は、修正ではなく 撤回 します。その主張に乗っている他の主張の一覧を持たせてあるので、撤回は探索ではなく有限の作業になります。
主張は「何と呼ぶか」を「何を述べているか」と分けて持ちます。 名前は主張のうち、最初に撤回される部分だからです。ある型をコムフィルタと呼んだために、印刷された頁に「フィルタだ」と書いてあると分かるまで、読み取り 4 件分と相当量の実機時間を費やしました。名前を落としても、その下の構造の主張まで落としてはなりません。
サイト側はそれをどう扱うか
段階は 2 つで、どちらもアーカイブから読み取るだけです。ここで計算し直すものはありません。
特定完了 は、アーカイブが今もその主張を支持しており、かつ レンダリングしたモデルについてのアーカイブ自身の判定が「ユニットの挙動を再現した」となっているものです。両方が要ります。この二つは別々に壊れるからです。証拠の上には立っているのに、そこから組んだモデルの方は棄却されている、という主張がありえます。
調査中 はそれ以外すべてで、まだ開いている理由を横に印刷しています。
実装例を載せるのは特定完了のものだけです。 棄却されたモデルを C++ として印刷すれば、アーカイブが拒否したアルゴリズムを、読み手が最も持ち帰ってコンパイルしやすい形で置くことになります。
実装例は手書きではなくモデルファイルから生成しているので、アーカイブがモデルを改訂すれば、コード例もそれに従って変わります。そこに現れる定数も、段数も、構造の選択も、すべてアーカイブのものです。差分方程式は、モデルが名指した各段のありふれた実現であり、その部分は測定ではなくこのサイトの算術です。どこまでがどちらかは、生成された各ファイルの冒頭の注記が述べています。まだ例を生成できない形のモデルについては、そう書きます。部分的な例は出しません。一段欠けた連鎖は、別のエフェクトだからです。
横に並ぶ曲線は、同じモデルをバイトの全設定について問うたもので、ランが実際に読んだ設定には印が付いています。読み取り点と読み取り点の間の線は本プロジェクトの補間なので、読み取り点そのものとは描き分けています。