@vessel-dsp/compiler 0.0.0-stage → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +118 -2
- package/dist/bake.d.ts +38 -0
- package/dist/bake.d.ts.map +1 -0
- package/dist/bake.js +101 -0
- package/dist/bake.js.map +1 -0
- package/dist/bbd-clock.d.ts +171 -0
- package/dist/bbd-clock.d.ts.map +1 -0
- package/dist/bbd-clock.js +1750 -0
- package/dist/bbd-clock.js.map +1 -0
- package/dist/block-row.d.ts +51 -0
- package/dist/block-row.d.ts.map +1 -0
- package/dist/block-row.js +17 -0
- package/dist/block-row.js.map +1 -0
- package/dist/bypass.d.ts +3 -0
- package/dist/bypass.d.ts.map +1 -0
- package/dist/bypass.js +228 -0
- package/dist/bypass.js.map +1 -0
- package/dist/compile.d.ts +24 -0
- package/dist/compile.d.ts.map +1 -0
- package/dist/compile.js +348 -0
- package/dist/compile.js.map +1 -0
- package/dist/converter-scale.d.ts +14 -0
- package/dist/converter-scale.d.ts.map +1 -0
- package/dist/converter-scale.js +133 -0
- package/dist/converter-scale.js.map +1 -0
- package/dist/couple.d.ts +28 -0
- package/dist/couple.d.ts.map +1 -0
- package/dist/couple.js +567 -0
- package/dist/couple.js.map +1 -0
- package/dist/dangling-active-terminal.d.ts +47 -0
- package/dist/dangling-active-terminal.d.ts.map +1 -0
- package/dist/dangling-active-terminal.js +542 -0
- package/dist/dangling-active-terminal.js.map +1 -0
- package/dist/declared-program.d.ts +23 -0
- package/dist/declared-program.d.ts.map +1 -0
- package/dist/declared-program.js +387 -0
- package/dist/declared-program.js.map +1 -0
- package/dist/denomination.d.ts +48 -0
- package/dist/denomination.d.ts.map +1 -0
- package/dist/denomination.js +27 -0
- package/dist/denomination.js.map +1 -0
- package/dist/device-laws.d.ts +237 -0
- package/dist/device-laws.d.ts.map +1 -0
- package/dist/device-laws.js +3513 -0
- package/dist/device-laws.js.map +1 -0
- package/dist/diagnostics.d.ts +13 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +19 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/emit.d.ts +8 -0
- package/dist/emit.d.ts.map +1 -0
- package/dist/emit.js +43 -0
- package/dist/emit.js.map +1 -0
- package/dist/errors.d.ts +22 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +39 -0
- package/dist/errors.js.map +1 -0
- package/dist/firmware-class.d.ts +69 -0
- package/dist/firmware-class.d.ts.map +1 -0
- package/dist/firmware-class.js +20 -0
- package/dist/firmware-class.js.map +1 -0
- package/dist/fixtures/circuits.d.ts +1742 -0
- package/dist/fixtures/circuits.d.ts.map +1 -0
- package/dist/fixtures/circuits.js +13896 -0
- package/dist/fixtures/circuits.js.map +1 -0
- package/dist/fixtures/expected.d.ts +261 -0
- package/dist/fixtures/expected.d.ts.map +1 -0
- package/dist/fixtures/expected.js +315 -0
- package/dist/fixtures/expected.js.map +1 -0
- package/dist/fixtures/index.d.ts +4 -0
- package/dist/fixtures/index.d.ts.map +1 -0
- package/dist/fixtures/index.js +8 -0
- package/dist/fixtures/index.js.map +1 -0
- package/dist/fixtures/registry.d.ts +52 -0
- package/dist/fixtures/registry.d.ts.map +1 -0
- package/dist/fixtures/registry.js +341 -0
- package/dist/fixtures/registry.js.map +1 -0
- package/dist/generic-tube-fit.d.ts +12 -0
- package/dist/generic-tube-fit.d.ts.map +1 -0
- package/dist/generic-tube-fit.js +45 -0
- package/dist/generic-tube-fit.js.map +1 -0
- package/dist/grounded-clock-supply.d.ts +13 -0
- package/dist/grounded-clock-supply.d.ts.map +1 -0
- package/dist/grounded-clock-supply.js +45 -0
- package/dist/grounded-clock-supply.js.map +1 -0
- package/dist/identify.d.ts +50 -0
- package/dist/identify.d.ts.map +1 -0
- package/dist/identify.js +319 -0
- package/dist/identify.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/inert-controls.d.ts +15 -0
- package/dist/inert-controls.d.ts.map +1 -0
- package/dist/inert-controls.js +266 -0
- package/dist/inert-controls.js.map +1 -0
- package/dist/latch-seed.d.ts +53 -0
- package/dist/latch-seed.d.ts.map +1 -0
- package/dist/latch-seed.js +257 -0
- package/dist/latch-seed.js.map +1 -0
- package/dist/link.d.ts +7 -0
- package/dist/link.d.ts.map +1 -0
- package/dist/link.js +270 -0
- package/dist/link.js.map +1 -0
- package/dist/lower.d.ts +79 -0
- package/dist/lower.d.ts.map +1 -0
- package/dist/lower.js +1855 -0
- package/dist/lower.js.map +1 -0
- package/dist/netlist.d.ts +79 -0
- package/dist/netlist.d.ts.map +1 -0
- package/dist/netlist.js +4746 -0
- package/dist/netlist.js.map +1 -0
- package/dist/non-executable-clock-drivers.d.ts +8 -0
- package/dist/non-executable-clock-drivers.d.ts.map +1 -0
- package/dist/non-executable-clock-drivers.js +33 -0
- package/dist/non-executable-clock-drivers.js.map +1 -0
- package/dist/open-category.d.ts +98 -0
- package/dist/open-category.d.ts.map +1 -0
- package/dist/open-category.js +111 -0
- package/dist/open-category.js.map +1 -0
- package/dist/over-driven-node.d.ts +33 -0
- package/dist/over-driven-node.d.ts.map +1 -0
- package/dist/over-driven-node.js +188 -0
- package/dist/over-driven-node.js.map +1 -0
- package/dist/part-catalog.d.ts +15 -0
- package/dist/part-catalog.d.ts.map +1 -0
- package/dist/part-catalog.js +6712 -0
- package/dist/part-catalog.js.map +1 -0
- package/dist/part-number.d.ts +32 -0
- package/dist/part-number.d.ts.map +1 -0
- package/dist/part-number.js +80 -0
- package/dist/part-number.js.map +1 -0
- package/dist/partition.d.ts +7 -0
- package/dist/partition.d.ts.map +1 -0
- package/dist/partition.js +242 -0
- package/dist/partition.js.map +1 -0
- package/dist/port-full-scale.d.ts +70 -0
- package/dist/port-full-scale.d.ts.map +1 -0
- package/dist/port-full-scale.js +235 -0
- package/dist/port-full-scale.js.map +1 -0
- package/dist/pot-orientation.d.ts +114 -0
- package/dist/pot-orientation.d.ts.map +1 -0
- package/dist/pot-orientation.js +551 -0
- package/dist/pot-orientation.js.map +1 -0
- package/dist/power-domain-control.d.ts +40 -0
- package/dist/power-domain-control.d.ts.map +1 -0
- package/dist/power-domain-control.js +142 -0
- package/dist/power-domain-control.js.map +1 -0
- package/dist/proxy-declaration.d.ts +121 -0
- package/dist/proxy-declaration.d.ts.map +1 -0
- package/dist/proxy-declaration.js +50 -0
- package/dist/proxy-declaration.js.map +1 -0
- package/dist/registry.d.ts +323 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +192 -0
- package/dist/registry.js.map +1 -0
- package/dist/sparse-schedule.d.ts +65 -0
- package/dist/sparse-schedule.d.ts.map +1 -0
- package/dist/sparse-schedule.js +421 -0
- package/dist/sparse-schedule.js.map +1 -0
- package/dist/speaker-load.d.ts +38 -0
- package/dist/speaker-load.d.ts.map +1 -0
- package/dist/speaker-load.js +97 -0
- package/dist/speaker-load.js.map +1 -0
- package/dist/stage-coverage.d.ts +21 -0
- package/dist/stage-coverage.d.ts.map +1 -0
- package/dist/stage-coverage.js +124 -0
- package/dist/stage-coverage.js.map +1 -0
- package/dist/stamp-partition.d.ts +314 -0
- package/dist/stamp-partition.d.ts.map +1 -0
- package/dist/stamp-partition.js +472 -0
- package/dist/stamp-partition.js.map +1 -0
- package/dist/supply-reference.d.ts +19 -0
- package/dist/supply-reference.d.ts.map +1 -0
- package/dist/supply-reference.js +66 -0
- package/dist/supply-reference.js.map +1 -0
- package/dist/supply-short.d.ts +32 -0
- package/dist/supply-short.d.ts.map +1 -0
- package/dist/supply-short.js +118 -0
- package/dist/supply-short.js.map +1 -0
- package/dist/supply-stamps.d.ts +51 -0
- package/dist/supply-stamps.d.ts.map +1 -0
- package/dist/supply-stamps.js +363 -0
- package/dist/supply-stamps.js.map +1 -0
- package/dist/terminal-role.d.ts +109 -0
- package/dist/terminal-role.d.ts.map +1 -0
- package/dist/terminal-role.js +46 -0
- package/dist/terminal-role.js.map +1 -0
- package/dist/terminal-roles.d.ts +59 -0
- package/dist/terminal-roles.d.ts.map +1 -0
- package/dist/terminal-roles.js +92 -0
- package/dist/terminal-roles.js.map +1 -0
- package/dist/transformer.d.ts +181 -0
- package/dist/transformer.d.ts.map +1 -0
- package/dist/transformer.js +476 -0
- package/dist/transformer.js.map +1 -0
- package/dist/types.d.ts +3157 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +11 -0
- package/dist/types.js.map +1 -0
- package/dist/unbounded-operating-point.d.ts +35 -0
- package/dist/unbounded-operating-point.d.ts.map +1 -0
- package/dist/unbounded-operating-point.js +181 -0
- package/dist/unbounded-operating-point.js.map +1 -0
- package/dist/unexecuted-region.d.ts +3 -0
- package/dist/unexecuted-region.d.ts.map +1 -0
- package/dist/unexecuted-region.js +122 -0
- package/dist/unexecuted-region.js.map +1 -0
- package/dist/unimplemented-control-role.d.ts +3 -0
- package/dist/unimplemented-control-role.d.ts.map +1 -0
- package/dist/unimplemented-control-role.js +61 -0
- package/dist/unimplemented-control-role.js.map +1 -0
- package/dist/unreachable-output.d.ts +3 -0
- package/dist/unreachable-output.d.ts.map +1 -0
- package/dist/unreachable-output.js +97 -0
- package/dist/unreachable-output.js.map +1 -0
- package/dist/unreadable-terminal-role.d.ts +67 -0
- package/dist/unreadable-terminal-role.d.ts.map +1 -0
- package/dist/unreadable-terminal-role.js +409 -0
- package/dist/unreadable-terminal-role.js.map +1 -0
- package/dist/unverified-pinout.d.ts +27 -0
- package/dist/unverified-pinout.d.ts.map +1 -0
- package/dist/unverified-pinout.js +121 -0
- package/dist/unverified-pinout.js.map +1 -0
- package/package.json +75 -5
|
@@ -0,0 +1,1742 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Derive one fixture from another, refusing a replacement that matched nothing.
|
|
3
|
+
*
|
|
4
|
+
* A bare `.replace` whose target has drifted returns the original string, so the
|
|
5
|
+
* derived fixture silently becomes a copy of its parent and its test passes while
|
|
6
|
+
* asserting nothing about the variation it was written for.
|
|
7
|
+
*/
|
|
8
|
+
export declare const derive: (source: string, from: string, to: string) => string;
|
|
9
|
+
/**
|
|
10
|
+
* Two 10k resistors from input to ground, output at the midpoint. Forces nodes,
|
|
11
|
+
* device laws, a linear solve, and the end-to-end slice. Expected gain is exactly 0.5.
|
|
12
|
+
*/
|
|
13
|
+
export declare const resistorDivider: string;
|
|
14
|
+
/**
|
|
15
|
+
* The same divider with one inline terminal node contradicting the declared ledger.
|
|
16
|
+
*
|
|
17
|
+
* `R1.b` is authored inline on node 9 while `nodes:` places it on node 2 with `R2.a` and
|
|
18
|
+
* the output jack. Stage 1 should follow the ledger and still warn that the document is
|
|
19
|
+
* inconsistent with itself.
|
|
20
|
+
*/
|
|
21
|
+
export declare const ledgerOverridesInlineDivider: string;
|
|
22
|
+
/**
|
|
23
|
+
* A divider with a **0 ohm link** in series ahead of it: the schematic-capture convention for
|
|
24
|
+
* an ideal wire, drawn as a resistor because the board really does have a jumper there.
|
|
25
|
+
*
|
|
26
|
+
* The behaviour existed and was untested, which is the gap this closes. `device-laws.ts` stamps
|
|
27
|
+
* a declared zero as `SWITCH_ON_OHMS` -- the same electrically-indistinguishable-from-ideal
|
|
28
|
+
* short a closed switch gets -- because `1/0` is not a representable conductance. Untested
|
|
29
|
+
* behaviour is how the CD4047 pin binding silently regressed: a fact verified and never turned
|
|
30
|
+
* into an assertion.
|
|
31
|
+
*
|
|
32
|
+
* The assertion is behavioural rather than structural: the link is in series with the signal, so
|
|
33
|
+
* a divider with it must measure the same gain as `resistorDivider` without it. A link stamped
|
|
34
|
+
* as anything but a near-short would show up as a divider ratio, and one stamped as an open
|
|
35
|
+
* would take the gain to zero.
|
|
36
|
+
*
|
|
37
|
+
* `mxr-noise-gate-line-driver`'s `R_U1B_FB` is the corpus instance -- `Resistance: { raw: "0
|
|
38
|
+
* Ohm", value: 0, unit: "Ω" }`, and the only resistor of 3090 in the corpus declaring exactly
|
|
39
|
+
* zero.
|
|
40
|
+
*/
|
|
41
|
+
export declare const zeroOhmLinkDivider: string;
|
|
42
|
+
/**
|
|
43
|
+
* A resistor that declares no resistance at all, and is not marked unpopulated.
|
|
44
|
+
*
|
|
45
|
+
* **The control that keeps the 0 ohm link honest.** A stated zero and an absent value look
|
|
46
|
+
* similar in a diff and mean opposite things: one is a jumper the board really has, the other is
|
|
47
|
+
* a value nobody recorded. Reading the second as the first would silently short a circuit --
|
|
48
|
+
* exactly the wrong-answer-that-still-renders this pipeline refuses.
|
|
49
|
+
*
|
|
50
|
+
* So this must refuse, and it must keep refusing. `mxr-carbon-copy`'s `R4` is the corpus
|
|
51
|
+
* instance: `SourceValue: visible-no-value-or-DNP`, `SourceConfidence: medium`,
|
|
52
|
+
* `SourceStatus: defer` -- the source itself declines to say. The refusal is the correct
|
|
53
|
+
* consumer behaviour there, not a gap.
|
|
54
|
+
*/
|
|
55
|
+
export declare const resistorWithNoResistance: string;
|
|
56
|
+
/**
|
|
57
|
+
* A `DNP` position that *does* declare its value: R2 keeps its 10k and is marked unpopulated.
|
|
58
|
+
*
|
|
59
|
+
* The corroborated shape, and the counterpart to `notPopulatedResistor`'s load-bearing one. The
|
|
60
|
+
* document says "this is a 10k position, unfitted": the part still leaves the solve, but nothing
|
|
61
|
+
* is concealed by its leaving — a reader can see what would sit there and check it against a
|
|
62
|
+
* board. Distinguishing the two is the whole of `report-source-integrity`'s DNP handling, so both
|
|
63
|
+
* need a fixture or the distinction is asserted only in prose.
|
|
64
|
+
*/
|
|
65
|
+
export declare const notPopulatedResistorWithValue: string;
|
|
66
|
+
/**
|
|
67
|
+
* A resistor declaring a **negative** resistance.
|
|
68
|
+
*
|
|
69
|
+
* The other side of the zero boundary, and the control that says where the line is: zero is a
|
|
70
|
+
* jumper the board really has, and below zero is not a resistor at all. `device-laws.ts` refuses
|
|
71
|
+
* it (`!(ohms > 0)` after the zero case is taken), and that refusal is the reason a declared zero
|
|
72
|
+
* can be admitted safely -- the pipeline is not simply accepting whatever number appears.
|
|
73
|
+
*
|
|
74
|
+
* No corpus packet declares one; all 3090 corpus resistors are positive or zero. That is why it
|
|
75
|
+
* is a fixture: a boundary defended only where the corpus happens to push is not defended.
|
|
76
|
+
*/
|
|
77
|
+
export declare const resistorWithNegativeResistance: string;
|
|
78
|
+
/**
|
|
79
|
+
* The same value-less resistor, marked `DNP: 'true'`.
|
|
80
|
+
*
|
|
81
|
+
* An unpopulated position is an open circuit -- a stated fact about the board, not a missing
|
|
82
|
+
* value -- so this compiles with the component dropped, where the fixture above refuses. The
|
|
83
|
+
* pair is the whole point: the same absent value is a refusal or a legitimate open depending on
|
|
84
|
+
* one typed flag, and nothing else distinguishes them.
|
|
85
|
+
*
|
|
86
|
+
* `mxr-carbon-copy` carries four of these (`R45`, `R50`, `C32`, `C34`) and is the only corpus
|
|
87
|
+
* packet that does.
|
|
88
|
+
*/
|
|
89
|
+
export declare const notPopulatedResistor: string;
|
|
90
|
+
/**
|
|
91
|
+
* A divider plus an `InterfaceOnly` open resistor that declares no resistance. Without the
|
|
92
|
+
* interface/source-only read this fixture refuses -- a resistor with no `Resistance` throws in
|
|
93
|
+
* the parameter stage. The flag is the source's way of saying "panel-LED shell, no driver
|
|
94
|
+
* specified, do not model it", and the correct answer is to drop it (with a warning), not to
|
|
95
|
+
* refuse the whole circuit over a value the source deliberately omits. `SourceOnly` is the
|
|
96
|
+
* twin: the negative control derives it by flipping the flag, and it must behave identically.
|
|
97
|
+
*/
|
|
98
|
+
export declare const interfaceOnlyPlaceholder: string;
|
|
99
|
+
export declare const sourceOnlyPlaceholder: string;
|
|
100
|
+
/**
|
|
101
|
+
* 10k into 10n to ground, output across the capacitor. Forces state, the integration
|
|
102
|
+
* method, and a corner frequency that can be checked by hand.
|
|
103
|
+
*/
|
|
104
|
+
export declare const rcLowPass: string;
|
|
105
|
+
/** A pot as a divider. Forces control binding, 0..1 positions, and emitted taper. */
|
|
106
|
+
export declare const potDivider: string;
|
|
107
|
+
/**
|
|
108
|
+
* `potDivider` plus the enclosures that are not controls: jacks and a status
|
|
109
|
+
* LED, each declared on the panel and bound to its component exactly the way
|
|
110
|
+
* `boss-od-1` declares `INPUT_JACK`, `OUTPUT_JACK` and `CHECK_LED`. The
|
|
111
|
+
* non-knob kinds must be dropped from `Program.controls` while the knob
|
|
112
|
+
* (`Level`) survives and all three devices stay in the netlist.
|
|
113
|
+
*/
|
|
114
|
+
export declare const panelKnobAndHardwareControls: string;
|
|
115
|
+
/**
|
|
116
|
+
* A switch whose both terminals resolve to one node (`boss-od-1`'s
|
|
117
|
+
* `INPUT_BATTERY_CONTACT` shape) next to an ordinary unbound two-terminal
|
|
118
|
+
* switch on distinct nodes. The fixed contact manufactures no control; the
|
|
119
|
+
* real switch keeps its invented one (`switchInSignalPath` pins that second
|
|
120
|
+
* behaviour), so the negative control proves this gate can fail for the
|
|
121
|
+
* claimed reason.
|
|
122
|
+
*/
|
|
123
|
+
export declare const fixedContactSwitchCircuit: string;
|
|
124
|
+
/**
|
|
125
|
+
* A **rheostat** wired so the two orientation rules disagree.
|
|
126
|
+
*
|
|
127
|
+
* `end1` sits on ground and the wiper shares node 2 with `end2`, so the live leg is
|
|
128
|
+
* `end1`-to-wiper. Quiet-distance sees the grounded end as the quiet one and swaps the ends,
|
|
129
|
+
* putting the live leg on `lower`; declaration order leaves it on `upper`. The two rules give
|
|
130
|
+
* different answers here, which is what makes this fixture worth having.
|
|
131
|
+
*
|
|
132
|
+
* The control declares a time-constant role, so `potTerminals` steps aside from quiet-distance:
|
|
133
|
+
* its premise -- a rising knob should be louder -- says nothing about a pot setting an RC, and
|
|
134
|
+
* on `boss-nf-1-noise-gate`'s `DECAY` it picked the side that ran the knob backwards.
|
|
135
|
+
*/
|
|
136
|
+
export declare const rheostatWithTimeConstantRole: string;
|
|
137
|
+
/**
|
|
138
|
+
* The same shape and the same disagreement, with a level role instead. The exemption must NOT
|
|
139
|
+
* fire here: letting declaration order win for every rheostat was measured across the corpus and
|
|
140
|
+
* inverts four knobs that are right today, `boss-fa-1`'s `VOLUME` among them.
|
|
141
|
+
*/
|
|
142
|
+
export declare const rheostatWithLevelRole: string;
|
|
143
|
+
/**
|
|
144
|
+
* The same pot with its wiper hanging off node 3, which nothing else touches, and its
|
|
145
|
+
* track carrying the signal from input to output instead.
|
|
146
|
+
*
|
|
147
|
+
* Electrically a fixed 10k in series: the two halves stay in series through a floating
|
|
148
|
+
* junction, so their sum is the whole track wherever the knob sits and the control
|
|
149
|
+
* cannot move a node voltage. It still compiles and still renders -- which is the
|
|
150
|
+
* defect, since `ibanez-ts808` shipped exactly this and rendered bit-identical output
|
|
151
|
+
* at `Drive=0.1` and `Drive=0.9`.
|
|
152
|
+
*/
|
|
153
|
+
export declare const potWithFloatingWiper: string;
|
|
154
|
+
/** Anti-parallel diodes to ground after a series resistor. Forces Newton. */
|
|
155
|
+
export declare const diodeClipper: string;
|
|
156
|
+
/** Anti-parallel LEDs to ground after a series resistor. Moves clipping knee higher. */
|
|
157
|
+
export declare const ledClipper: string;
|
|
158
|
+
/**
|
|
159
|
+
* The clipper's upper diode carrying a catalogued zener part number and nothing else, so
|
|
160
|
+
* the diode law comes from the catalog's `zenerLaw` entry (1N4733A: 5.1 V knee, class
|
|
161
|
+
* forward defaults) rather than from the source.
|
|
162
|
+
*/
|
|
163
|
+
export declare const zenerCatalogDiode: string;
|
|
164
|
+
/**
|
|
165
|
+
* The LED clipper's upper LED carrying a catalogued zener part number: the device the source
|
|
166
|
+
* declares as an LED must stay one under a catalog match, not come back a plain diode.
|
|
167
|
+
*/
|
|
168
|
+
export declare const zenerLedKeepsLed: string;
|
|
169
|
+
/**
|
|
170
|
+
* The same zener part with the source's own forward parameters and knee typed, so every
|
|
171
|
+
* declared value must survive the catalog match and only absence is filled.
|
|
172
|
+
*/
|
|
173
|
+
export declare const zenerDeclaredParameters: string;
|
|
174
|
+
/**
|
|
175
|
+
* Inverting amplifier: 10k in, 100k feedback, non-inverting leg at ground. Forces the
|
|
176
|
+
* auxiliary-constraint row, which is the same mechanism an ideal transformer needs.
|
|
177
|
+
* Gain is -R_f/R_in = -10 exactly, so the magnitude is a hand-checkable 10.
|
|
178
|
+
*/
|
|
179
|
+
export declare const invertingAmplifier: string;
|
|
180
|
+
/**
|
|
181
|
+
* The same amplifier with the feedback **resistor replaced by a capacitor**: an integrator
|
|
182
|
+
* with no DC feedback path.
|
|
183
|
+
*
|
|
184
|
+
* Nothing pins the inverting node's operating point -- at DC the capacitor is an open
|
|
185
|
+
* circuit, so the output cannot influence its own input -- and any standing differential
|
|
186
|
+
* integrates. `ibanez-pql` ships this shape on its signal path and diverges to `8.55e+12 V`
|
|
187
|
+
* from a 9 V supply. Kept minimal deliberately: swapping one element is what separates a
|
|
188
|
+
* bounded stage from an unbounded one, and the fixture should show exactly that.
|
|
189
|
+
*/
|
|
190
|
+
export declare const opampCapacitiveFeedbackOnly: string;
|
|
191
|
+
/**
|
|
192
|
+
* The same inverting amplifier with a 9 V supply present. Gain is still -10, but the
|
|
193
|
+
* output cannot leave the 0..9 V rails, so a hot input clips instead of producing
|
|
194
|
+
* a voltage the pedal could not make.
|
|
195
|
+
*/
|
|
196
|
+
export declare const railedAmplifier: string;
|
|
197
|
+
/**
|
|
198
|
+
* An op-amp Schmitt-trigger astable: the railed amplifier with its non-inverting input moved onto
|
|
199
|
+
* a 10k/10k divider from its own output (positive feedback, hysteresis at half the swing) and its
|
|
200
|
+
* inverting input on a 100k / 100n timing network. It oscillates rail to rail.
|
|
201
|
+
*
|
|
202
|
+
* The case the op-amp step limiter's halving cap was not built for. At every edge the branch the
|
|
203
|
+
* Newton iterate starts on ceases to exist, the Jacobian points back at it, and the cap pins at its
|
|
204
|
+
* floor in a two-cycle; the runtime must reseed the comparator on its other rail rather than burn
|
|
205
|
+
* the iteration cap. Measured before the reseed: 11 of 9600 samples held at a 1024-iteration peak.
|
|
206
|
+
*/
|
|
207
|
+
export declare const schmittTriggerAstable: string;
|
|
208
|
+
/**
|
|
209
|
+
* An op-amp powered from a rail of its own, spelled the way this corpus actually spells it.
|
|
210
|
+
*
|
|
211
|
+
* The circuit's supply set is +9 / -9, but this op-amp's `vPlus` sits on a separate +4 V node
|
|
212
|
+
* and its `vMinus` on ground, so the rails it should clip at are 4 and 0 -- neither of them a
|
|
213
|
+
* circuit extreme. While the rail lookup read only the exact spellings `vcc`/`vee`, this
|
|
214
|
+
* op-amp was given 9 and -9: a clipping ceiling more than twice its real one, on a part whose
|
|
215
|
+
* whole audible contribution in a drive pedal is where it clips.
|
|
216
|
+
*
|
|
217
|
+
* `boss-bd-2-blues-driver` is the corpus instance and it is not a corner case -- it declares
|
|
218
|
+
* three supply ports (9 V, 8 V, 4 V) and both its op-amps' `vPlus` is on the 8 V one, while
|
|
219
|
+
* the compiler handed them the 9 V inlet rail.
|
|
220
|
+
*/
|
|
221
|
+
export declare const opampOnItsOwnRail: string;
|
|
222
|
+
/**
|
|
223
|
+
* The same op-amp with both supply pins on the one node.
|
|
224
|
+
*
|
|
225
|
+
* A degenerate pair -- `railHigh == railLow` -- which is not a narrow clipping window but a
|
|
226
|
+
* contradiction: the linear region has negative width and the output pins wherever the
|
|
227
|
+
* limiter lands. Reading a document's own supply pins can produce it, so `opampRails`
|
|
228
|
+
* requires an ordered pair and keeps the circuit set when it does not get one.
|
|
229
|
+
*
|
|
230
|
+
* Measured rather than hypothetical: `mxr-m117r-flanger`'s `U4` declares `pin8_vplus` and
|
|
231
|
+
* `pin4_vminus` and **both resolve to the same node** -- ground, carrying a declared +15 V,
|
|
232
|
+
* because that packet puts its `V15` rail component on the ground node. Eight op-amp stamps
|
|
233
|
+
* came out at `high = low = 15` before the invariant existed.
|
|
234
|
+
*/
|
|
235
|
+
export declare const opampWithDegenerateRails: string;
|
|
236
|
+
/**
|
|
237
|
+
* An op-amp that names no inputs at all: `vPlus`, `vMinus`, `output`, in that order.
|
|
238
|
+
*
|
|
239
|
+
* The reason the supply vocabulary is split in two rather than being one list.
|
|
240
|
+
* `vplus`/`vminus` is how every corpus op-amp that declares supplies spells them -- but it is
|
|
241
|
+
* also the natural spelling for a bare differential pair, and `opampTerminals` falls back to
|
|
242
|
+
* declaration order when it cannot resolve a named input pair, so here those two terminals
|
|
243
|
+
* are wired as **the inputs**. Reading them as rails as well would clamp this op-amp to its
|
|
244
|
+
* own input voltages. The rails must come from the circuit set, +9 / -9.
|
|
245
|
+
*
|
|
246
|
+
* This is the invariant the guard protects -- a terminal cannot be both a signal input and a
|
|
247
|
+
* rail -- and it is a control no corpus census could have supplied, because the corpus
|
|
248
|
+
* happens to contain no such part. A vocabulary justified only by what the corpus does today
|
|
249
|
+
* is a vocabulary that breaks on the next document.
|
|
250
|
+
*/
|
|
251
|
+
export declare const opampWithUnnamedInputs: string;
|
|
252
|
+
/**
|
|
253
|
+
* A divider whose lower leg can be shorted by a switch. Open, the output is the
|
|
254
|
+
* divider's half; closed, the lower leg is shorted and the output collapses. Forces
|
|
255
|
+
* topology that changes with a control, without a second netlist.
|
|
256
|
+
*/
|
|
257
|
+
export declare const switchedDivider: string;
|
|
258
|
+
/**
|
|
259
|
+
* The same switch, but stating its contact state the way nine corpus switches do -- a
|
|
260
|
+
* `State` rather than a `Position` or a `Wipe`. Derived from `switchedDivider` by adding
|
|
261
|
+
* exactly one property, so a difference between the two can only be that property.
|
|
262
|
+
*/
|
|
263
|
+
export declare const switchedDividerStatingClosed: string;
|
|
264
|
+
/** The amp corpus's spelling of the same fact: `SelectedState` rather than `State`. */
|
|
265
|
+
export declare const switchedDividerStatingSelectedState: string;
|
|
266
|
+
/**
|
|
267
|
+
* `SelectedState` carrying something that is not a contact state at all, which the corpus also
|
|
268
|
+
* does (`16 ohms`, `90w full-power silicon path`). It must be ignored rather than refused: unlike
|
|
269
|
+
* `State`, this field is not only about contacts.
|
|
270
|
+
*/
|
|
271
|
+
export declare const switchedDividerStatingUnrelatedSelectedState: string;
|
|
272
|
+
/** A fuse, which conducts unless a source says it has blown. */
|
|
273
|
+
export declare const switchedDividerWithFuseRating: string;
|
|
274
|
+
/** The same again with a contact state no closed vocabulary contains. */
|
|
275
|
+
export declare const switchedDividerStatingUnknownContact: string;
|
|
276
|
+
/**
|
|
277
|
+
* The same unpositioned switch, wired the other way round: in series between the input
|
|
278
|
+
* port and the divider rather than shunting the midpoint to ground, so the only path
|
|
279
|
+
* from input to output runs through it. `switchedDivider`'s switch has a path around
|
|
280
|
+
* it; this one is the path. Both senses appear in the corpus under identical terminal
|
|
281
|
+
* naming, which is why the default cannot be a constant.
|
|
282
|
+
*/
|
|
283
|
+
export declare const switchInSignalPath: string;
|
|
284
|
+
/**
|
|
285
|
+
* A JFET whose **drain sits below its source**, so `vds` is negative and only a symmetric channel
|
|
286
|
+
* conducts. The gate is at the input, the source is pulled up through 10k and the drain pulled
|
|
287
|
+
* down through 10k.
|
|
288
|
+
*
|
|
289
|
+
* A channel conducts both ways -- which is why a JFET works as an analogue switch -- and the
|
|
290
|
+
* runtime treated reverse as cutoff until 2026-08-12. With the old law the two resistors were
|
|
291
|
+
* independent and the operating point sat at 9 V and 0 V; symmetric, it solves to 7.42 V and
|
|
292
|
+
* 1.58 V, matching ngspice to 0.08%. `boss-hm-2` has three signal-path FETs spending most samples
|
|
293
|
+
* here.
|
|
294
|
+
*/
|
|
295
|
+
export declare const jfetReverseBiased: string;
|
|
296
|
+
/**
|
|
297
|
+
* A JFET whose gate, source and drain each sit on their own 1M/1M divider off 9 V,
|
|
298
|
+
* so every terminal idles at 4.5 V and the channel (Vds = 0) carries nothing. The only
|
|
299
|
+
* current in the circuit is the gate's own: each junction draws
|
|
300
|
+
* `gateSaturationCurrent * softplus((0 - 0.5) / 0.06)` ~ 2.4 nA, and the two together
|
|
301
|
+
* sag the 0.5M-thevenin gate divider ~2.4 mV while lifting the source/drain dividers
|
|
302
|
+
* ~1.2 mV each. A voltmeter on the gate therefore reads the gate law directly.
|
|
303
|
+
*
|
|
304
|
+
* Unregistered, so this is the class default under test, not any part. The registered
|
|
305
|
+
* twin below (`jfetGateLoadedDivider2SK30A`) is the same copper with a part number,
|
|
306
|
+
* and the pair pins the per-part refinement: same dividers, no sag.
|
|
307
|
+
*/
|
|
308
|
+
export declare const jfetGateLoadedDivider: string;
|
|
309
|
+
/**
|
|
310
|
+
* The same copper as `jfetGateLoadedDivider` with the 2SK30A part number, so the
|
|
311
|
+
* catalog's per-part gate data applies instead of the class default: the gate draws
|
|
312
|
+
* ~1e-18 A and every divider sits at its unloaded 4.5 V. The two fixtures render the
|
|
313
|
+
* same circuit with different gate laws, which is what makes their pair a regression
|
|
314
|
+
* test for the refinement rather than two readings of one law.
|
|
315
|
+
*/
|
|
316
|
+
export declare const jfetGateLoadedDivider2SK30A: string;
|
|
317
|
+
/**
|
|
318
|
+
* A supply with a protection diode wired the wrong way round: anode on the 9 V rail, cathode on
|
|
319
|
+
* ground, so the whole supply forward biases it.
|
|
320
|
+
*
|
|
321
|
+
* `ibanez-ts808` and `ibanez-ts9` both ship this, each carrying **1.074 A** through it while
|
|
322
|
+
* rendering a plausible level, because the runtime clamps the junction voltage instead of
|
|
323
|
+
* diverging. Reversing the two terminal roles turns this fixture into the correct arrangement,
|
|
324
|
+
* which is what the paired test checks.
|
|
325
|
+
*/
|
|
326
|
+
export declare const diodeShortingSupply: string;
|
|
327
|
+
/** The same supply with the protection diode the right way round: cathode to the rail. */
|
|
328
|
+
export declare const diodeProtectingSupply: string;
|
|
329
|
+
/**
|
|
330
|
+
* A 9.1 V zener shunt regulator feeding a light load, supply below breakdown.
|
|
331
|
+
* 9 V through 470 ohm into 10k//1M: the rail must sag to ~8.59 V. Below
|
|
332
|
+
* breakdown a zener passes leakage only, so any rail at or above the 9 V
|
|
333
|
+
* supply is a current the diode law invented, not the circuit.
|
|
334
|
+
*/
|
|
335
|
+
export declare const zenerRegulatedRail: string;
|
|
336
|
+
/**
|
|
337
|
+
* `zenerRegulatedRail` fed from 12 V, so the zener conducts and regulates. About 5.3 mA
|
|
338
|
+
* reaches it, just past the 5 mA at which a declared breakdown voltage is read, so the rail
|
|
339
|
+
* must sit within a few millivolts of 9.1 V. This pins the knee, not only the leakage.
|
|
340
|
+
*/
|
|
341
|
+
export declare const zenerRegulatingRail: string;
|
|
342
|
+
/**
|
|
343
|
+
* The 5F1's V1A triode stage, built to match `whole-amp-5f1` exactly so its operating point is
|
|
344
|
+
* a validated oracle rather than a snapshot: 68k grid stopper from the input, 1M grid leak,
|
|
345
|
+
* 1.5k cathode to ground, 100k plate load to a 250 V rail.
|
|
346
|
+
*
|
|
347
|
+
* That experiment solves `Vk 1.251`, `Vp 166.6`, `Ip 0.83 mA`, and those three are consistent
|
|
348
|
+
* by hand (`1.251/1500 = 0.834 mA`; `250 - 0.834e-3 * 100e3 = 166.6`), so the fixture is
|
|
349
|
+
* checkable without trusting the experiment's solver.
|
|
350
|
+
*/
|
|
351
|
+
export declare const triodeGainStage: string;
|
|
352
|
+
/**
|
|
353
|
+
* Emitter follower on a 9 V rail: 10k/10k base bias, 4k7 emitter, signal coupled in
|
|
354
|
+
* through 1u. Forces Ebers-Moll, junction limiting, a DC operating point, and a
|
|
355
|
+
* voltage source. Voltage gain is Re/(Re + re) with re = Vt/Ie, so just under unity.
|
|
356
|
+
*/
|
|
357
|
+
export declare const emitterFollower: string;
|
|
358
|
+
/**
|
|
359
|
+
* A standard NPN common-emitter amplifier stage with 4-resistor bias.
|
|
360
|
+
*
|
|
361
|
+
* 9 V rail, RB1=100k, RB2=22k base divider, RC=4.7k collector load, RE=1k emitter resistor,
|
|
362
|
+
* 10u input/output coupling caps into a 1M load.
|
|
363
|
+
*
|
|
364
|
+
* Expected small-signal AC gain is -(RC || RLOAD) / (RE + re) ~ -4.53 V/V.
|
|
365
|
+
*/
|
|
366
|
+
export declare const commonEmitterAmplifier: string;
|
|
367
|
+
export declare const commonEmitterAmplifierHalvedRe: string;
|
|
368
|
+
/**
|
|
369
|
+
* A DC-driven transformer secondary carrying a declared-voltage port, for the milestone that a
|
|
370
|
+
* transformer winding may borrow generated status from another winding of the same transformer.
|
|
371
|
+
*
|
|
372
|
+
* `VBATT` (10 V, DC) drives the primary; the secondary is fixed by the ideal transformer's own
|
|
373
|
+
* constraint at exactly `10 / 2 = 5 V`, independent of `RLOAD`, which only sets the current. The
|
|
374
|
+
* declared `BPLUS_PORT` states `6 V` -- a plausible chart value, deliberately not the true `5 V`
|
|
375
|
+
* -- so a promoted ideal rail and the real transformer answer are distinguishable by more than
|
|
376
|
+
* rounding, the same shape `tubeDiodeIntoLoadWithDeclaredPort` uses for the rectifier case.
|
|
377
|
+
*
|
|
378
|
+
* DC rather than AC on purpose, matching `tubeDiodeIntoLoad`'s own reasoning: it isolates the
|
|
379
|
+
* transformer-coupling question from the AC source and its own RMS-to-peak conversion, so a
|
|
380
|
+
* failure here is the coupling rule and nothing else.
|
|
381
|
+
*/
|
|
382
|
+
export declare const transformerSecondaryWithDeclaredPort: string;
|
|
383
|
+
/** Ideal 1:2 step-up into a 10k load. Forces the four-terminal constraint row. */
|
|
384
|
+
export declare const stepUpTransformer: string;
|
|
385
|
+
/** Ideal 2:1 step-down transformer: turns ratio 2.0, so gain is 0.5. */
|
|
386
|
+
export declare const stepDownTransformer: string;
|
|
387
|
+
/** JFET source follower on a 9 V rail, gate at 0 V through 1M, 2k2 source. */
|
|
388
|
+
export declare const jfetFollower: string;
|
|
389
|
+
/**
|
|
390
|
+
* MOSFET source follower. Enhancement mode is off at zero gate bias, so unlike the
|
|
391
|
+
* JFET the gate is biased from the rail by a divider rather than referenced to
|
|
392
|
+
* ground. The divider is 10k/10k rather than 1M/1M for a reason worth recording: an
|
|
393
|
+
* uncharged coupling capacitor starts as a near-short, so the gate is dragged to 0 V
|
|
394
|
+
* and charges with tau = C * (R1 || R2). At 1M that is 0.5 s, far longer than any
|
|
395
|
+
* test window. The JFET fixture escapes this only because its bias point is 0 V, so
|
|
396
|
+
* it needs no settling at all. Same law as the JFET, opposite threshold sign.
|
|
397
|
+
*/
|
|
398
|
+
export declare const mosfetFollower: string;
|
|
399
|
+
/** 1 H into 10k to ground, output across the resistor: an RL low pass at R/(2*pi*L). */
|
|
400
|
+
export declare const rlLowPass: string;
|
|
401
|
+
/** An IC with no registry entry. Forces the unsupported outcome. */
|
|
402
|
+
export declare const unknownChip: string;
|
|
403
|
+
/**
|
|
404
|
+
* An 8-pin chip a registry supplies as **two** sections, the shape a dual op-amp takes.
|
|
405
|
+
*
|
|
406
|
+
* Bare `pin1`..`pin8` names on purpose: a section indexes terminals positionally, so this proves
|
|
407
|
+
* the expansion does not depend on role tokens -- which is the whole reason sections exist, since an
|
|
408
|
+
* 8-pin dual op-amp has two outputs and no role token can name either unambiguously.
|
|
409
|
+
*/
|
|
410
|
+
export declare const dualSectionChip: string;
|
|
411
|
+
/** The same IC, with a part number a fixture registry can supply a macro model for. */
|
|
412
|
+
export declare const knownChip: string;
|
|
413
|
+
/**
|
|
414
|
+
* The same IC again, with a part number a registry supplies a *lumped law* for.
|
|
415
|
+
*
|
|
416
|
+
* Three documents, one device, three answers -- and the document is identical apart from
|
|
417
|
+
* the part number: unsupported with no model, a macro region with one, an ordinary
|
|
418
|
+
* two-terminal element with another. That is the injected registry doing its job:
|
|
419
|
+
* opacity is a property of what the registry knows, never of the device.
|
|
420
|
+
*/
|
|
421
|
+
export declare const resistiveChip: string;
|
|
422
|
+
/**
|
|
423
|
+
* The pinout rung, positive control: an `ic` whose only identity is two terminal roles,
|
|
424
|
+
* both covered by the fixture registry's groups (`cp1`, `vgg`). No part id, no declared
|
|
425
|
+
* type -- so it reaches the pinout rung and must match exactly.
|
|
426
|
+
*/
|
|
427
|
+
export declare const chipPinoutExact: string;
|
|
428
|
+
/**
|
|
429
|
+
* The pinout rung, negative control: the same two roles plus `reset`, which the
|
|
430
|
+
* registry's groups do not cover. Presence alone would satisfy both groups and stamp a
|
|
431
|
+
* macro identity; the exact test must refuse it instead, because a role no group
|
|
432
|
+
* accounts for is evidence this is not that part.
|
|
433
|
+
*/
|
|
434
|
+
export declare const chipPinoutSuperset: string;
|
|
435
|
+
/**
|
|
436
|
+
* The divider again: different coordinates, different component order, different
|
|
437
|
+
* names. Must yield the same netlist up to node relabeling.
|
|
438
|
+
*/
|
|
439
|
+
export declare const resistorDividerRedrawn: string;
|
|
440
|
+
/**
|
|
441
|
+
* Two clippers that share only ground, so partitioning yields two nonlinear regions.
|
|
442
|
+
*
|
|
443
|
+
* The second pair sits on nodes 7 and 8, reachable from neither port, which is what
|
|
444
|
+
* makes it a second *region* rather than more devices in the first one. Needed because a
|
|
445
|
+
* failure counted per block cannot be told from one counted per sample until a document
|
|
446
|
+
* has two blocks that can fail on the same sample.
|
|
447
|
+
*/
|
|
448
|
+
export declare const twoDiodeClippers: string;
|
|
449
|
+
/**
|
|
450
|
+
* The redrawn divider with its non-ground nodes renumbered.
|
|
451
|
+
*
|
|
452
|
+
* `resistorDividerRedrawn` varies coordinates, order, names and value notation but keeps
|
|
453
|
+
* node 1 and node 2, so it cannot show whether a node id is a label or a meaning. Here
|
|
454
|
+
* the same circuit calls them 5 and 7. Ground stays 0 because ground is not a label the
|
|
455
|
+
* document is free to choose -- the ground symbol decides it.
|
|
456
|
+
*/
|
|
457
|
+
export declare const resistorDividerRelabelled: string;
|
|
458
|
+
/** Malformed: not valid interchange YAML. */
|
|
459
|
+
export declare const malformed = "schema: circuit-interchange/v3\n : : :\n";
|
|
460
|
+
/** A resistor whose value cannot be parsed. Must refuse rather than default. */
|
|
461
|
+
export declare const unparseableValue: string;
|
|
462
|
+
/** The divider with every node id quoted. A node id is a token, not a number. */
|
|
463
|
+
export declare const quotedNodeDivider: string;
|
|
464
|
+
/**
|
|
465
|
+
* The divider with named node ids and a ground symbol.
|
|
466
|
+
*
|
|
467
|
+
* The ground token is called `n_delay_clock_bus` on purpose. Nothing in that name says
|
|
468
|
+
* ground; the only thing that does is the ground symbol sitting on it. A rule that
|
|
469
|
+
* matched node names for `gnd` would pass this fixture while being wrong, and a rule
|
|
470
|
+
* that reads the symbol passes it for the right reason.
|
|
471
|
+
*/
|
|
472
|
+
export declare const namedNodeDivider: string;
|
|
473
|
+
/**
|
|
474
|
+
* A structured quantity whose value is stated in kilohms.
|
|
475
|
+
*
|
|
476
|
+
* Ten kilohms, not ten ohms. The format library reports `value` in whatever unit it
|
|
477
|
+
* read, so a stage that trusts `value` without reading `unit` turns every `10k` in the
|
|
478
|
+
* corpus into 10 -- a wrong answer that still renders.
|
|
479
|
+
*/
|
|
480
|
+
export declare const kilohmStructuredValue: string;
|
|
481
|
+
/** A taper code this stage cannot read, resolved by the library in base units. */
|
|
482
|
+
export declare const taperCodeStructuredValue: string;
|
|
483
|
+
/** Unreadable notation *and* a non-base unit: no answer is better than a wrong one. */
|
|
484
|
+
export declare const unreadableNonBaseUnit: string;
|
|
485
|
+
/**
|
|
486
|
+
* The same inverting amplifier with its op-amp inputs declared in the other order.
|
|
487
|
+
*
|
|
488
|
+
* Electrically identical: `inverting` is still node 3 and `noninverting` still node 0.
|
|
489
|
+
* Only the order the document lists them in changes, and the corpus really does write
|
|
490
|
+
* it both ways. A stage reading position instead of role exchanges the two inputs
|
|
491
|
+
* here, which inverts the stage while still rendering plausible audio.
|
|
492
|
+
*/
|
|
493
|
+
export declare const invertingAmplifierReordered: string;
|
|
494
|
+
/**
|
|
495
|
+
* A two-terminal rheostat: 100k track, control at mid travel, feeding ground through
|
|
496
|
+
* a 100k series resistor. A linear sweep at 0.5 is 50k, so the divider reads 100k over
|
|
497
|
+
* 150k = 2/3. Hand-computed before it was measured.
|
|
498
|
+
*/
|
|
499
|
+
export declare const rheostatDivider: string;
|
|
500
|
+
/**
|
|
501
|
+
* Two rheostats that are the two gangs of one physical knob.
|
|
502
|
+
*
|
|
503
|
+
* The declared control's id is `SAG_CTL`, but each gang names it the way the packets
|
|
504
|
+
* do: one by the control's `audioBinding.controlName`, the other by `PhysicalControl`.
|
|
505
|
+
* Matching only the id leaves both unbound and each invents a control of its own, so
|
|
506
|
+
* one knob silently becomes two that each move half the circuit.
|
|
507
|
+
*/
|
|
508
|
+
export declare const gangedRheostats: string;
|
|
509
|
+
/** The same rheostat with a residual minimum, so the bottom of the sweep is not zero. */
|
|
510
|
+
export declare const rheostatWithMinimum: string;
|
|
511
|
+
/**
|
|
512
|
+
* A three-terminal pot wired as a rheostat -- its wiper node **is** its `lug3` -- with both
|
|
513
|
+
* track ends cut off from every DC reference: the far end (node 4) reaches a second op-amp's
|
|
514
|
+
* `vplus` rail node in one hop, and the input-end (node 5) reaches the first op-amp's
|
|
515
|
+
* inverting input in three.
|
|
516
|
+
*
|
|
517
|
+
* This is the narrow path of the pot's orientation evidence. Before 2026-08-25 `vplus` and
|
|
518
|
+
* `vminus` were seeds for that evidence's distance map, so the rail-adjacent end read one hop
|
|
519
|
+
* from an "op-amp input" that was in fact a supply rail: the track oriented to the rail end
|
|
520
|
+
* and the control swept the stage's gain the wrong way, silent at full. Nothing else saw it --
|
|
521
|
+
* the pot still swept, the circuit still converged, and at half travel both orientations agree
|
|
522
|
+
* because a linear taper's midpoint is its own mirror. Only the off-centre values differ, and
|
|
523
|
+
* they are written down in `expected.ts` from the divider arithmetic, not captured from a run.
|
|
524
|
+
*
|
|
525
|
+
* The second op-amp is electrically dead on purpose: its non-inverting input is grounded and
|
|
526
|
+
* its inverting input hangs off a single 100k to ground, so the whole pocket settles at zero
|
|
527
|
+
* and no floating island in the fixture needs gmin to land somewhere.
|
|
528
|
+
*/
|
|
529
|
+
export declare const quietSeedRheostat: string;
|
|
530
|
+
/**
|
|
531
|
+
* A strapped-wiper rheostat treble shunt with **declared rotation** -- the
|
|
532
|
+
* `fulltone-ocd-v1.4` `Tone` class: the 47 n series cap feeds the free end
|
|
533
|
+
* (node 6), the wiper is strapped to the grounded end (node 0), and the ends
|
|
534
|
+
* declare `ccw`/`cw` instead of the ambiguous `end`.
|
|
535
|
+
*
|
|
536
|
+
* Without the declaration the quiet-distance inference puts position 0 at the
|
|
537
|
+
* grounded strapped end, landing the live leg on `upper` (`share = 1 -
|
|
538
|
+
* fraction`) so the bleed resistance *falls* as the knob rises -- the knob runs
|
|
539
|
+
* backwards. The declaration must outrank it: `end2` is the `ccw` free end, the
|
|
540
|
+
* live leg runs wiper-to-free-end on `lower` (`share = fraction`), and bleed
|
|
541
|
+
* resistance grows with the control.
|
|
542
|
+
*/
|
|
543
|
+
export declare const rheostatWithDeclaredRotation: string;
|
|
544
|
+
/**
|
|
545
|
+
* The feedback-gain rheostat with its wiper strapped to the `output` node and the
|
|
546
|
+
* free end (declared first) reaching the `inverting` input -- the `boss-os-2`
|
|
547
|
+
* `VR3b` case, where declaration order ran the knob backwards. See
|
|
548
|
+
* `feedbackGainRheostat` for the wiring.
|
|
549
|
+
*/
|
|
550
|
+
export declare const feedbackGainRheostat: string;
|
|
551
|
+
/**
|
|
552
|
+
* The same stage with the wiper strapped to the inverting-side node (6) instead of
|
|
553
|
+
* the `output` node. The wiper-strapped end is then the one far from a declared
|
|
554
|
+
* output, so the feedback-output rule's guard must refuse and leave the pot in its
|
|
555
|
+
* declaration-order orientation -- a negative control for the flip above. See
|
|
556
|
+
* `feedbackGainRheostat` for the wiring.
|
|
557
|
+
*/
|
|
558
|
+
export declare const feedbackGainRheostatWiperOnInverting: string;
|
|
559
|
+
/**
|
|
560
|
+
* The divider plus a resistor, an LED and a footswitch that declare no terminals.
|
|
561
|
+
*
|
|
562
|
+
* The corpus is full of these: panel hardware from a photo, bias markers from a build
|
|
563
|
+
* document. They are named and described exactly like circuit elements, so the only
|
|
564
|
+
* honest reason to ignore them is the empty terminal list. Adding them must change
|
|
565
|
+
* nothing at all.
|
|
566
|
+
*/
|
|
567
|
+
export declare const dividerWithUnconnectedParts: string;
|
|
568
|
+
/**
|
|
569
|
+
* The same emitter follower with its transistor terminals in the corpus's usual order.
|
|
570
|
+
*
|
|
571
|
+
* `collector,base,emitter` is how **282 of the corpus's 490 transistors** are written,
|
|
572
|
+
* against 15 for `base,collector,emitter`. Electrically identical to the fixture above
|
|
573
|
+
* -- the base is still node 3 -- but a stage reading position exchanges base and
|
|
574
|
+
* collector, the transistor never turns on, and the pedal renders silence.
|
|
575
|
+
*/
|
|
576
|
+
/**
|
|
577
|
+
* The same follower with the supply's two terminals declared the other way round.
|
|
578
|
+
*
|
|
579
|
+
* Electrically identical -- node 5 is still the 9 V rail and node 0 is still the return --
|
|
580
|
+
* but read by position the rail inverts to -9 V, and the packet still compiles `ok`. A
|
|
581
|
+
* supply was the last asymmetric device in the pipeline read by declaration order, and a
|
|
582
|
+
* rail's sign is not a subtle error: every bias point in the circuit hangs off it.
|
|
583
|
+
*/
|
|
584
|
+
export declare const emitterFollowerSupplyReversed: string;
|
|
585
|
+
/**
|
|
586
|
+
* The follower's rail stated the way most corpus rails are: one node, against ground.
|
|
587
|
+
*
|
|
588
|
+
* No fixture had this shape, so reading a supply's polarity by role -- which needs two
|
|
589
|
+
* terminals -- refused **34 packets** and took the corpus from 52 compiled to 19, with
|
|
590
|
+
* the whole unit suite still green. The scoreboard caught it; no test could.
|
|
591
|
+
*/
|
|
592
|
+
export declare const emitterFollowerRailToGround: string;
|
|
593
|
+
/**
|
|
594
|
+
* The same supply stated twice, the second time reversed.
|
|
595
|
+
*
|
|
596
|
+
* Two rows asserting opposite signs across one pair of nodes is a contradiction, not a
|
|
597
|
+
* duplicate -- and keying the dedup on `positive:negative` made the reversed twin look
|
|
598
|
+
* like a different supply, so both were stamped.
|
|
599
|
+
*/
|
|
600
|
+
export declare const contradictorySupplyTwin: string;
|
|
601
|
+
export declare const emitterFollowerReordered: string;
|
|
602
|
+
/**
|
|
603
|
+
* The same follower with the BJT's own IS and BF typed, so the bjt law runs on declared
|
|
604
|
+
* values and `bjt-law-default-parameters` stays silent. IS/BF are the corpus spellings
|
|
605
|
+
* (`sola-sound-tone-bender-professional-mkii`, `electro-harmonix-lpb-1`); the values are
|
|
606
|
+
* the law's own defaults restated, so the program is unchanged and only the disclosure moves.
|
|
607
|
+
*/
|
|
608
|
+
export declare const bjtTypedParameters: string;
|
|
609
|
+
/**
|
|
610
|
+
* The pot divider with the wiper declared last instead of in the middle.
|
|
611
|
+
*
|
|
612
|
+
* `anode,cathode,wiper` is 64 of the corpus's 331 three-terminal pots. Reading position
|
|
613
|
+
* 2 as the wiper makes the grounded end the wiper, which shorts both halves of the
|
|
614
|
+
* track to ground and cuts the output off from the input entirely.
|
|
615
|
+
*/
|
|
616
|
+
export declare const potDividerWiperLast: string;
|
|
617
|
+
/**
|
|
618
|
+
* The divider with a third jack, and no jack declaring a role.
|
|
619
|
+
*
|
|
620
|
+
* `Circuit.Jack` is the corpus's untyped catch-all: it absorbs DC inlets, remote
|
|
621
|
+
* sockets and second outputs alongside the real pair. The roles here are only in the
|
|
622
|
+
* names, which no stage may read, so there is nothing to resolve a port from. The
|
|
623
|
+
* third jack is declared last on purpose -- a positional fallback would take it as the
|
|
624
|
+
* output, which is how a DC inlet came to be read as a pedal's output.
|
|
625
|
+
*/
|
|
626
|
+
export declare const untypedJacks: string;
|
|
627
|
+
/**
|
|
628
|
+
* Jacks whose declared roles reach them only through the panel binding.
|
|
629
|
+
*
|
|
630
|
+
* Both jacks are typed `Circuit.Jack`, so the type name says nothing. The roles are
|
|
631
|
+
* declared against panel-facing ids (`INPUT_JACK`, `OUTPUT_JACK`) and the panel binds
|
|
632
|
+
* those to the components — which is how most of the corpus states it, and it is a
|
|
633
|
+
* chain no type-name table can substitute for.
|
|
634
|
+
*
|
|
635
|
+
* A third jack carries `role: direct-output` and is declared **first**, so anything
|
|
636
|
+
* choosing by position or by "the first jack that looks like an output" takes the dry
|
|
637
|
+
* send instead of the effect output.
|
|
638
|
+
*/
|
|
639
|
+
export declare const jacksTypedOnlyByRole: string;
|
|
640
|
+
/**
|
|
641
|
+
* A single-pole, two-throw selector routing the input to one of two resistors.
|
|
642
|
+
*
|
|
643
|
+
* The throws are declared in the opposite order to the options — `throws` are
|
|
644
|
+
* `bright,dark` while `Options` is `Dark,Bright` — because three corpus selectors do
|
|
645
|
+
* exactly that, and taking the option's index would select the other throw. `Position`
|
|
646
|
+
* names the option rather than giving a number, which is how the corpus states it and
|
|
647
|
+
* why `Number(position)` silently becomes half travel.
|
|
648
|
+
*/
|
|
649
|
+
export declare const selectorRouting: string;
|
|
650
|
+
/**
|
|
651
|
+
* The same selector with its common terminal declared **last**.
|
|
652
|
+
*
|
|
653
|
+
* `throw0,throw1,common` is a real corpus shape, and `marshall-blues-breaker` wires its
|
|
654
|
+
* input jack to exactly such a switch. Attaching throws to a preceding common builds a
|
|
655
|
+
* pole out of the first throw and drops the real common entirely — which left the input
|
|
656
|
+
* jack's node connected to nothing and the pedal silent, while every stage reported
|
|
657
|
+
* success.
|
|
658
|
+
*/
|
|
659
|
+
export declare const selectorCommonLast: string;
|
|
660
|
+
/**
|
|
661
|
+
* Two jacks whose third terminals carry the **same role name** and opposite senses.
|
|
662
|
+
*
|
|
663
|
+
* `IN.switch` is where the battery's negative landed, so it has to make against the
|
|
664
|
+
* sleeve or the supply has no return and the whole circuit floats. `OUT.switch` carries
|
|
665
|
+
* signal, and making *it* against the sleeve shorts the output to ground.
|
|
666
|
+
*
|
|
667
|
+
* One name, two required answers, so no contact-name vocabulary can decide this. The
|
|
668
|
+
* fixture exists because a name table was tried and shorted 13 corpus jacks, five of
|
|
669
|
+
* them supply rails.
|
|
670
|
+
*/
|
|
671
|
+
export declare const switchedJackContacts: string;
|
|
672
|
+
/**
|
|
673
|
+
* A power jack that strands the supply behind its switch contact.
|
|
674
|
+
*
|
|
675
|
+
* `BT1.positive` and `PWR.tip` are alone on node 5, and the circuit's rail is node 6 on
|
|
676
|
+
* the jack's contact. This is the battery-saving arrangement: the contact routes the
|
|
677
|
+
* battery to the pedal and inserting an adaptor breaks it. `boss-od-3` and `boss-mt-2`
|
|
678
|
+
* are exactly this shape.
|
|
679
|
+
*
|
|
680
|
+
* The element has to be tip-to-contact. Closing the contact to the *sleeve* instead is
|
|
681
|
+
* what a contact-name table does, and it shorts the 9 V rail to ground; leaving it open
|
|
682
|
+
* strands the supply and the whole pedal solves with every node at 0 V. So the assertion
|
|
683
|
+
* that matters is which terminal it makes against, not that a law exists.
|
|
684
|
+
*/
|
|
685
|
+
export declare const powerJackStrandedSupply: string;
|
|
686
|
+
/**
|
|
687
|
+
* Wired jacks and a ground, and every other component declaring no terminals.
|
|
688
|
+
*
|
|
689
|
+
* `boss-ps-2` is exactly this: 223 real, electrically active parts that are correctly
|
|
690
|
+
* dropped for having no terminals, leaving nothing to solve. Every stage succeeds and
|
|
691
|
+
* the result is a program with no blocks, which can only ever render silence.
|
|
692
|
+
*/
|
|
693
|
+
export declare const nothingToExecute: string;
|
|
694
|
+
/**
|
|
695
|
+
* The soft-clipping overdrive stage: anti-parallel diodes across an op-amp's feedback
|
|
696
|
+
* resistor, on rails. This is what a Tube Screamer, an OD-1 and a Blues Breaker all
|
|
697
|
+
* are, and the pipeline had no fixture for it.
|
|
698
|
+
*
|
|
699
|
+
* It is also the shape that exposes an undamped op-amp. A diode limits its own Newton
|
|
700
|
+
* step; an op-amp at a gain of 1e5 did not, so the two fought and the iterate cycled
|
|
701
|
+
* rail to rail forever. Every simpler op-amp fixture here converges with or without
|
|
702
|
+
* that damping, including one clipping hard against its rails -- only the two
|
|
703
|
+
* nonlinearities in one loop show it.
|
|
704
|
+
*/
|
|
705
|
+
export declare const clippingOverdriveStage: string;
|
|
706
|
+
/**
|
|
707
|
+
* The hybrid the pipeline has never had a case for: analog, then a macro, then analog.
|
|
708
|
+
*
|
|
709
|
+
* An input shell feeds the delay memory's `in`; its `out` feeds an output shell; and a
|
|
710
|
+
* separate RC clock network sits on `cp1`, which is what sets a bucket brigade's delay
|
|
711
|
+
* time. So three analog regions each share exactly one node with the macro, and none
|
|
712
|
+
* shares a node with another — the macro is the only thing between input and output.
|
|
713
|
+
*
|
|
714
|
+
* Three things this is the first case for, all of them written and none exercised:
|
|
715
|
+
*
|
|
716
|
+
* - `partition.ts` computes `dependencies[macro] = analog regions sharing a node`, and
|
|
717
|
+
* every case so far has produced `[]`.
|
|
718
|
+
* - `MacroModel.portTerminals` is declared in the types and read nowhere.
|
|
719
|
+
* - `Block`'s macro variant has no `inputNode`/`outputNode`, so audio cannot pass
|
|
720
|
+
* through it. That is the defect this fixture exists to hold still: it compiles, the
|
|
721
|
+
* macro is placed correctly, and the output region receives nothing.
|
|
722
|
+
*
|
|
723
|
+
* When the operator format lands, the acceptance criterion inverts and this renders.
|
|
724
|
+
*/
|
|
725
|
+
export declare const hybridDelayPedal: string;
|
|
726
|
+
/**
|
|
727
|
+
* `hybridDelayPedal` with a control-bearing trim pot added across the clock network's own
|
|
728
|
+
* nodes -- the `parameter` port's negative control. `region.controls` is no longer empty for
|
|
729
|
+
* the clock region, so `couple.ts`'s purity gate must refuse to classify the derivation as
|
|
730
|
+
* `parameter`, per the spec's safe default (missing or negative evidence -> never `parameter`).
|
|
731
|
+
* The macro still compiles and still passes audio; only `parameter` on its block should differ.
|
|
732
|
+
*/
|
|
733
|
+
/**
|
|
734
|
+
* S1's delay-model controls: the same pedal with one thing changed each time.
|
|
735
|
+
*
|
|
736
|
+
* The BBD delay model is **capacity-based** -- the document's `DelayMs`, converted to samples at
|
|
737
|
+
* the host's rate, then scaled by the `parameter` port's voltage ratio. That decision is recorded
|
|
738
|
+
* in `thoughts/shared/plans/2026-08-25-v2-bbd-pipeline-readiness.md` §5, and these fixtures are
|
|
739
|
+
* what make it a behavioural fact rather than a note: each one moves exactly one input and the
|
|
740
|
+
* delay has to respond, or not, in the one way the model predicts.
|
|
741
|
+
*
|
|
742
|
+
* Every prediction below is hand-derived before measuring, not read off the output:
|
|
743
|
+
* 3 ms x 48 kHz = 144 samples; 6 ms = 288; a clock rail halved against an unchanged 9 V
|
|
744
|
+
* reference halves the scale to 72; and the resolver's stand-in is 50 ms = 2400.
|
|
745
|
+
*/
|
|
746
|
+
export declare const hybridDelayPedalLongerDelay: string;
|
|
747
|
+
/**
|
|
748
|
+
* `hybridDelayPedal` with `R_OUT_LOAD` changed from 1meg to 10k.
|
|
749
|
+
*
|
|
750
|
+
* S2 negative control: the macro output has an internal 1k impedance and 10k series resistor.
|
|
751
|
+
* Dividing into a 10k load yields an output divider of 10k/(10k + 10k + 1k) = 10/21 (~0.4762),
|
|
752
|
+
* shifting total gain from ~0.4470 to ~0.2152, verifying that output loading is modeled.
|
|
753
|
+
*/
|
|
754
|
+
export declare const hybridDelayPedalLoadedOutput: string;
|
|
755
|
+
/**
|
|
756
|
+
* The clock rail halved, 9 V to 4.5 V, against a `parameterReferenceVolts` still 9.
|
|
757
|
+
*
|
|
758
|
+
* This is the coupling the delay model *does* have, and naming it is the honest complement to
|
|
759
|
+
* the frequency-independence assertion: the `parameter` port reads the clock node's **voltage**
|
|
760
|
+
* and scales the capacity by `|volts| / referenceVolts`. Nothing reads a frequency anywhere.
|
|
761
|
+
* A real BBD's delay is `stages / (2 * f_clock)`, so this is a capacity model with a voltage
|
|
762
|
+
* trim, not a clock model -- which is exactly what §5 chose and what S6 revisits.
|
|
763
|
+
*/
|
|
764
|
+
export declare const hybridDelayPedalHalfClockRail: string;
|
|
765
|
+
/**
|
|
766
|
+
* `DelayMs` removed while the `cp1` parameter terminal remains.
|
|
767
|
+
*
|
|
768
|
+
* The resolver substitutes a 50 ms stand-in rather than refusing, on the grounds that a part
|
|
769
|
+
* with a clock terminal has *somewhere* the delay could have come from. **This fixture exists to
|
|
770
|
+
* pin that number as a deliberate, visible choice rather than a silent one** -- it is the
|
|
771
|
+
* mechanism by which all four of the Deluxe Memory Man's MN3008 macros resolve to
|
|
772
|
+
* `delaySeconds: 0.05` while the document declares no delay at all, and it is BBD plan S1's
|
|
773
|
+
* open question: a stand-in the size of a real echo is indistinguishable from a modelled one.
|
|
774
|
+
*/
|
|
775
|
+
export declare const hybridDelayPedalNoDeclaredDelay: string;
|
|
776
|
+
/**
|
|
777
|
+
* `DelayMs` removed *and* the `cp1` parameter terminal removed.
|
|
778
|
+
*
|
|
779
|
+
* With no declared delay and no clock terminal there is nothing left to derive a delay from, so
|
|
780
|
+
* the pipeline refuses by name. The pair with the fixture above is the whole point: the same
|
|
781
|
+
* missing property is a 50 ms stand-in or a refusal depending on one terminal, and a reader
|
|
782
|
+
* should be able to see which lever decides it.
|
|
783
|
+
*/
|
|
784
|
+
export declare const hybridDelayPedalNoDelayNoClock: string;
|
|
785
|
+
/**
|
|
786
|
+
* A trim pot across the clock network's own nodes, so that region is no longer control-free.
|
|
787
|
+
*
|
|
788
|
+
* **"Movable" is about the purity gate, not about a derived clock.** This is the negative
|
|
789
|
+
* control for `couple.ts`'s parameter-port rule: with a control in the clock region the
|
|
790
|
+
* derivation may no longer be classified as `parameter`, and the port falls back to null while
|
|
791
|
+
* audio stays wired. It deliberately does *not* produce a `clockControl` -- its part is the
|
|
792
|
+
* synthetic `FIXTURE-DELAY-1`, with no clock driver to derive from, so its delay tap runs in
|
|
793
|
+
* `capacity` mode. Anyone scanning fixture names for clock coverage wants
|
|
794
|
+
* `bbdClockDerivedDelay` or `pt2399ClockDerivedDelay` instead.
|
|
795
|
+
*/
|
|
796
|
+
export declare const hybridDelayPedalMovableClock: string;
|
|
797
|
+
/**
|
|
798
|
+
* `hybridDelayPedal` with a resistor joining the input shell's node (3, the macro's audio-in
|
|
799
|
+
* tap) directly to the output shell's node (2, downstream of the macro's audio-out write-back)
|
|
800
|
+
* -- the region SCHEDULE's coincident case. This merges what were two separate analog regions
|
|
801
|
+
* into one, so that ONE region is both the macro's driver and its downstream: an unbuffered
|
|
802
|
+
* dry-blend/regen network, exactly the topology all three real delay/BBD packets that clear
|
|
803
|
+
* device-law identification (`pt2399-delay`, `boss-ce-2`, `boss-ce-5`) actually wire.
|
|
804
|
+
*
|
|
805
|
+
* Refused by `link.ts`'s `topologicalOrder` from 2026-08-14's first landing of clause 3 through
|
|
806
|
+
* the same day's correction: a genuine 2-cycle (the region must run both before the macro, for
|
|
807
|
+
* audio-in, and after it, for the write-back) with both directions added unconditionally. Now
|
|
808
|
+
* resolved with a documented one-sample write-back lag in exactly this case -- see the
|
|
809
|
+
* "coincident case" comment in `couple.ts` for the mechanism -- so this fixture **compiles**,
|
|
810
|
+
* which is what changed; `hybridDelayPedalChainedMacroCycle` below is the fixture that still
|
|
811
|
+
* refuses.
|
|
812
|
+
*/
|
|
813
|
+
export declare const hybridDelayPedalCyclicSchedule: string;
|
|
814
|
+
/**
|
|
815
|
+
* `hybridDelayPedal` with a SECOND macro, `U2`, chained the opposite way round: its audio-in
|
|
816
|
+
* sits on node 2 (U1's downstream region) and its audio-out sits on node 3 (U1's own driver
|
|
817
|
+
* region) -- a loop through two DISTINCT regions and two DISTINCT macros, not one macro whose
|
|
818
|
+
* own driver and downstream coincide. `couple.ts`'s coincident-case lag only applies when a
|
|
819
|
+
* single macro's driver and downstream are the SAME region (a direct check on that one macro's
|
|
820
|
+
* own edges); it does not and should not paper over a longer cycle chained through a second
|
|
821
|
+
* macro, so this must still refuse exactly as before -- the negative control the resolved
|
|
822
|
+
* `hybridDelayPedalCyclicSchedule` above can no longer serve now that it compiles.
|
|
823
|
+
*/
|
|
824
|
+
export declare const hybridDelayPedalChainedMacroCycle: string;
|
|
825
|
+
export declare const potAntiLogarithmicTaper: string;
|
|
826
|
+
export declare const potReverseLinearTaper: string;
|
|
827
|
+
export declare const potLogarithmicTaper: string;
|
|
828
|
+
export declare const potLinearTaper: string;
|
|
829
|
+
/** A manufacturer's own curve. We do not know its shape, so it must not be guessed. */
|
|
830
|
+
export declare const potUnknownTaperCode: string;
|
|
831
|
+
/**
|
|
832
|
+
* The source recording that it does **not** state a taper, which is a complete statement rather
|
|
833
|
+
* than a marking this stage failed to read. 18 corpus declarations are this shape.
|
|
834
|
+
*/
|
|
835
|
+
export declare const potSourceUnmarkedTaper: string;
|
|
836
|
+
/**
|
|
837
|
+
* A taper `@vessel-dsp/core`'s format carries and this runtime has no curve for. `TaperKind` has
|
|
838
|
+
* four laws; `PotentiometerTaper` has seven. Stating one of the other three is a real taper the
|
|
839
|
+
* render cannot produce, which is a different thing from an unreadable marking.
|
|
840
|
+
*/
|
|
841
|
+
export declare const potSteppedTaper: string;
|
|
842
|
+
/** A pot wired as a two-terminal rheostat, which lowering cannot stamp. */
|
|
843
|
+
export declare const rheostatPot: string;
|
|
844
|
+
/**
|
|
845
|
+
* One control on two pots in different regions, which the partition invariant refuses.
|
|
846
|
+
* A dual-gang pot is the real circuit this shape comes from.
|
|
847
|
+
*/
|
|
848
|
+
export declare const straddlingControl: string;
|
|
849
|
+
/**
|
|
850
|
+
* A mains inlet feeding a resistive divider, and the only fixture whose supply moves.
|
|
851
|
+
*
|
|
852
|
+
* Written in the shape the amp packets use: the voltage and the frequency are both structured
|
|
853
|
+
* `{raw, value, unit}` with prose in `raw`, so this exercises the reading a bare `"10"` would
|
|
854
|
+
* not. `hot`/`neutral` are the mains pair those packets declare.
|
|
855
|
+
*
|
|
856
|
+
* Hand-computable, and the numbers are chosen so the supply's own impedance is *visible* in the
|
|
857
|
+
* answer: `SUPPLY_SOURCE_OHMS` is 1, so the loop is `1 + 999 + 1000 = 2000` ohms and the
|
|
858
|
+
* midpoint sits at exactly half the EMF. A stamp that dropped `sourceOhms` would read
|
|
859
|
+
* `1000/1999` and be wrong in the fourth digit.
|
|
860
|
+
*
|
|
861
|
+
* The input jack is deliberately alone on node 1. This circuit has no signal path -- it is a
|
|
862
|
+
* supply -- and an input source stamped onto a divider node would force the voltage this
|
|
863
|
+
* fixture is measuring.
|
|
864
|
+
*/
|
|
865
|
+
export declare const acMainsDivider: string;
|
|
866
|
+
/**
|
|
867
|
+
* The same document with **only the frequency removed**, which is the whole discriminator.
|
|
868
|
+
*
|
|
869
|
+
* The negative control for the AC source: one deleted property has to turn a sine into a
|
|
870
|
+
* battery, and nothing else about the document changes. A `derive` rather than a copy, so the
|
|
871
|
+
* two cannot drift apart silently.
|
|
872
|
+
*/
|
|
873
|
+
export declare const dcMainsDivider: string;
|
|
874
|
+
/**
|
|
875
|
+
* A tube rectifier passing DC into a load, which makes its space-charge law hand-checkable.
|
|
876
|
+
*
|
|
877
|
+
* A 300 V rail through 100 ohms into the plate, cathode into 10k. At the solved point two
|
|
878
|
+
* independent equations must both hold — the load's `I = V(cathode)/10k` and the tube's
|
|
879
|
+
* `I = K * (V(plate) - V(cathode))^1.5` — so the fixed point of
|
|
880
|
+
* `I = K * (300 - 10101*I)^1.5` is the answer without trusting any solver: `I = 27.9 mA` at a
|
|
881
|
+
* `18.4 V` drop, leaving the cathode at `278.8 V`. (The 10101 is 10k of load plus 100 ohms of
|
|
882
|
+
* series resistance plus the rail's own 1 ohm.)
|
|
883
|
+
*
|
|
884
|
+
* DC rather than mains on purpose: it isolates the tube's law from the AC source and the
|
|
885
|
+
* reservoir, so a failure here is the law and nothing else.
|
|
886
|
+
*/
|
|
887
|
+
export declare const tubeDiodeIntoLoad: string;
|
|
888
|
+
/**
|
|
889
|
+
* The same rectifier, with a declared-voltage port added on the cathode/load node.
|
|
890
|
+
*
|
|
891
|
+
* `BPLUS_PORT` states `280 V` on node 2 — a plausible nominal chart value, deliberately not the
|
|
892
|
+
* `278.8 V` the tube law and the 10k load actually solve to, so a promoted ideal source and a
|
|
893
|
+
* real rectifier answer are distinguishable by more than rounding. Before this milestone,
|
|
894
|
+
* `voltagePortRails` had no way to see that node 2 is already generated (a `tube-diode` did not
|
|
895
|
+
* count as DC-conducting), so it promoted this port to an ideal `280 V` rail, deleting
|
|
896
|
+
* `V1_RECT`/`RLOAD`/`RSERIES` from the answer entirely. The fix is exactly the claim under test:
|
|
897
|
+
* the solved cathode voltage must still be `278.8 V` from the tube law, not the declared `280 V`.
|
|
898
|
+
*/
|
|
899
|
+
export declare const tubeDiodeIntoLoadWithDeclaredPort: string;
|
|
900
|
+
export declare const tubeDiodeReversed: string;
|
|
901
|
+
/**
|
|
902
|
+
* The five-terminal dual rectifier the amp corpus actually declares: `plate_a`, `plate_b`, one
|
|
903
|
+
* `cathode_filament`, and two heaters that carry no signal.
|
|
904
|
+
*
|
|
905
|
+
* Both plates are fed from the same 300 V rail through their own 150 ohms, which is a stand-in
|
|
906
|
+
* for the centre-tapped secondary the real supplies use — this fixture is about how one component
|
|
907
|
+
* becomes two elements, not about the winding. The heater nodes are wired to nothing else, which
|
|
908
|
+
* is exactly how they appear in the packets.
|
|
909
|
+
*/
|
|
910
|
+
export declare const dualPlateTubeRectifier: string;
|
|
911
|
+
/**
|
|
912
|
+
* A working divider plus a pot in its **own galvanic island**, which the emitted program
|
|
913
|
+
* therefore does not execute.
|
|
914
|
+
*
|
|
915
|
+
* Every earlier way of being a dead knob is deliberately excluded: `VR9`'s wiper is loaded by
|
|
916
|
+
* `R91` so it is not floating, and every one of the island's nodes is shared, so no device is
|
|
917
|
+
* joined to nothing. The pot is real, grounded through `R92`, and its coefficients move with
|
|
918
|
+
* the knob -- and its region owns neither jack, so nothing it computes can reach the output
|
|
919
|
+
* and `link` leaves it out of the execution order.
|
|
920
|
+
*
|
|
921
|
+
* The island touches the signal path only at ground, which is what makes it a separate region:
|
|
922
|
+
* stage 4 groups by shared *non-ground* node. Its prose says the opposite, as every fixture's
|
|
923
|
+
* does -- `MASTER_VOLUME`, `role: output-level`, a description calling it the output control --
|
|
924
|
+
* so a stage reading names would report the most important knob on the pedal.
|
|
925
|
+
*/
|
|
926
|
+
export declare const controlInUnexecutedRegion: string;
|
|
927
|
+
/**
|
|
928
|
+
* The negative control for the fixture above: the same island, returned to the **output node**
|
|
929
|
+
* instead of to ground.
|
|
930
|
+
*
|
|
931
|
+
* One node changes, and with it the island stops being an island -- it joins the signal path's
|
|
932
|
+
* region, gets scheduled, and the knob really does load the output. Nothing else differs, so a
|
|
933
|
+
* warning that fires on both is reporting the pot rather than the schedule.
|
|
934
|
+
*/
|
|
935
|
+
export declare const controlInScheduledRegion: string;
|
|
936
|
+
/**
|
|
937
|
+
* The same mains inlet drawing amps instead of milliamps, for the supply-current telemetry.
|
|
938
|
+
*
|
|
939
|
+
* `3 ohms` and `1 ohm` in place of the divider's kilohms, so with the supply's own ohm the loop is
|
|
940
|
+
* `5 ohms`. The declared `10 V` is read as RMS by the `ac-source` law's convention and converted
|
|
941
|
+
* to `10 * sqrt(2)` V peak, so the peak current is exactly `10 * sqrt(2) / 5 = 2.8284... A` — a
|
|
942
|
+
* draw three orders of magnitude past anything a pedal makes, and one the **operating point
|
|
943
|
+
* cannot see at all**, because it evaluates an AC source at its `t = 0` zero.
|
|
944
|
+
*/
|
|
945
|
+
export declare const acSupplyDrawingAmps: string;
|
|
946
|
+
/**
|
|
947
|
+
* A bridge rectifier as one component, which is what four of the amp corpus's and two of the
|
|
948
|
+
* pedal corpus's diode components are: `[ac_a, ac_b, positive, negative]`.
|
|
949
|
+
*
|
|
950
|
+
* Resistive load and **no reservoir**, deliberately: the rail then follows the rectified sine
|
|
951
|
+
* instantaneously, so every sample is hand-computable with no settling to wait for. At the sine's
|
|
952
|
+
* peak the loop is `20 V = rail + two junction drops`, and with the class-default silicon junction
|
|
953
|
+
* (`IS = 2.52e-9`, `N = 1.752`) carrying `rail/1k`, that fixed point is `18.57 V`:
|
|
954
|
+
* `2 * 1.752 * 0.025852 * ln(0.01857/2.52e-9) = 1.43 V` of drop.
|
|
955
|
+
*
|
|
956
|
+
* The **negative** peak is the point of the fixture. A bridge rectifies both halves, so the rail
|
|
957
|
+
* must read the same there; the single junction this used to lower to gives a rail of nothing at
|
|
958
|
+
* both peaks, with the two DC terminals touching nothing at all.
|
|
959
|
+
*/
|
|
960
|
+
export declare const bridgeRectifier: string;
|
|
961
|
+
/**
|
|
962
|
+
* The same bridge with its four terminals named as a three-pin clamp package, which is a shape
|
|
963
|
+
* the role table deliberately does not cover.
|
|
964
|
+
*
|
|
965
|
+
* The refusal control. Before the multi-junction reading, a diode component naming no `anode`
|
|
966
|
+
* fell through to declaration order and lowered to a junction between its **first two**
|
|
967
|
+
* terminals, whatever they were — so this compiled, rendered, and modelled a device the source
|
|
968
|
+
* does not contain. `pin1_`/`pin2_`/`pin3_` are stripped by the role folding exactly as stage 1
|
|
969
|
+
* strips them (`^pin\d+`, which also eats the leading `5` in `pin2_5a_clamp`), so the tokens
|
|
970
|
+
* this refuses on are `groundclamp`, `aclamp` and `signal` — checked against
|
|
971
|
+
* `electro-harmonix-holy-grail`'s real `D1`, the shape this fixture is transcribed from.
|
|
972
|
+
*/
|
|
973
|
+
export declare const clampPackageDiode: string;
|
|
974
|
+
/**
|
|
975
|
+
* A dual rectifier sharing one cathode, declared under `kind: diode` with tube electrode names —
|
|
976
|
+
* the shape eight of the amp corpus's rectifiers use (`plate_a`, `plate_b`, `cathode`, plus two
|
|
977
|
+
* heaters that carry no signal).
|
|
978
|
+
*
|
|
979
|
+
* The same winding as the bridge above, wired the way a shared-cathode pack is: `plate_a` driven,
|
|
980
|
+
* `plate_b` at ground, cathode into the load. So it rectifies **one** half — at the positive peak
|
|
981
|
+
* the loop is `20 V = rail + one junction drop`, giving `19.28 V`, and at the negative peak the
|
|
982
|
+
* rail is nothing. That is the pair of numbers that tells this topology from the bridge's, which
|
|
983
|
+
* reads the same at both peaks.
|
|
984
|
+
*
|
|
985
|
+
* Two junctions, and **both keep the silicon law the declared kind asks for**. The lowering fixes
|
|
986
|
+
* the wiring; it does not read a vacuum device out of a terminal name.
|
|
987
|
+
*/
|
|
988
|
+
export declare const dualAnodeRectifier: string;
|
|
989
|
+
/**
|
|
990
|
+
* A transformer with one primary and one untapped secondary, specified by winding voltages
|
|
991
|
+
* rather than by a `Ratio` or an impedance pair -- the "2-winding case". `PrimaryVoltage` (not
|
|
992
|
+
* `Primary`) is the spelling declared here, and as of 2026-08-14 nothing reads it: a winding
|
|
993
|
+
* specified this way is driven at its own stated voltage and no primary is modelled. It is
|
|
994
|
+
* left in the fixture deliberately, as the check that it is now inert.
|
|
995
|
+
*
|
|
996
|
+
* `MAINS` carries the frequency the driven winding runs at. A transformer does not change
|
|
997
|
+
* frequency, so a document with no AC supply in it states none and refuses.
|
|
998
|
+
*/
|
|
999
|
+
export declare const twoWindingVoltageDerivedTransformer: string;
|
|
1000
|
+
/**
|
|
1001
|
+
* A transformer with one primary and one **centre-tapped** secondary, specified by a single
|
|
1002
|
+
* per-half winding voltage and isolated from any other winding so the centre-tap arithmetic is
|
|
1003
|
+
* the only thing under test. `Primary` (not `PrimaryVoltage`) is the spelling declared here,
|
|
1004
|
+
* and like `twoWindingVoltageDerivedTransformer`'s it is now inert.
|
|
1005
|
+
*/
|
|
1006
|
+
export declare const centerTappedVoltageDerivedTransformer: string;
|
|
1007
|
+
/**
|
|
1008
|
+
* A power transformer with three secondaries off one primary -- a centre-tapped HV winding
|
|
1009
|
+
* plus two untapped windings -- shaped exactly like `fender-5e3-deluxe-tweed`'s
|
|
1010
|
+
* `PT_5E3_POWER_TRANSFORMER` but with round numbers. Three windings at three different
|
|
1011
|
+
* voltages off one core is what no single `Ratio` can express, and what the driven-winding
|
|
1012
|
+
* lowering handles without needing a primary at all.
|
|
1013
|
+
*/
|
|
1014
|
+
export declare const powerTransformerVoltageDerived: string;
|
|
1015
|
+
/**
|
|
1016
|
+
* A transformer whose typed winding voltages include one this stage does not recognise --
|
|
1017
|
+
* `ScreenSecondary`, typed exactly like the recognised ones but under a spelling nothing
|
|
1018
|
+
* reads -- alongside a `FilamentSecondary` that *is* recognised. The v2-transformer-ratio
|
|
1019
|
+
* milestone's refusal case: this must refuse by name rather than silently deriving a ratio
|
|
1020
|
+
* from the winding it does recognise and dropping the one it does not.
|
|
1021
|
+
*/
|
|
1022
|
+
export declare const transformerUnlistedWindingSpelling: string;
|
|
1023
|
+
/**
|
|
1024
|
+
* A transformer with a **centre-tapped primary** (the ordinary push-pull output-transformer
|
|
1025
|
+
* shape) and one untapped secondary, its ratio typed as an impedance pair -- the
|
|
1026
|
+
* v2-transformer-primary-tap milestone's core case. `PrimaryImpedance`/`SecondaryImpedance` give
|
|
1027
|
+
* `declaredRatio = sqrt(4000/10) = 20`; the shared-primary reduction has no single reference
|
|
1028
|
+
* winding to pivot on (the primary itself is tapped), so it swaps to the untapped secondary and
|
|
1029
|
+
* halves+inverts the ratio to `2/20 = 0.1` per half.
|
|
1030
|
+
*/
|
|
1031
|
+
export declare const tappedPrimaryOutputTransformer: string;
|
|
1032
|
+
/**
|
|
1033
|
+
* Same tapped primary as `tappedPrimaryOutputTransformer`, plus an alternate impedance tap
|
|
1034
|
+
* (`secondary_8`) that connects to nothing else in the document -- `vox-ac30-top-boost`'s exact
|
|
1035
|
+
* shape, "8 Ω alternate source-visible tap" beside its typed, wired 16 ohm one. The
|
|
1036
|
+
* v2-transformer-primary-tap milestone's dangling-tap case: this must compile with exactly the
|
|
1037
|
+
* same two stamps as `tappedPrimaryOutputTransformer`, silently dropping the extra terminal
|
|
1038
|
+
* rather than refusing or guessing a ratio for it.
|
|
1039
|
+
*/
|
|
1040
|
+
export declare const danglingAlternateTapTransformer: string;
|
|
1041
|
+
/**
|
|
1042
|
+
* The negative control for `danglingAlternateTapTransformer`: the same alternate tap, but wired
|
|
1043
|
+
* to a load like any other winding would be. Connectivity now says it is *not* dangling, so this
|
|
1044
|
+
* must refuse by name rather than silently dropping a terminal that is actually in use.
|
|
1045
|
+
*/
|
|
1046
|
+
export declare const connectedAlternateTapTransformer: string;
|
|
1047
|
+
/**
|
|
1048
|
+
* A tank-shaped shell whose part number is not a tank's, so it lowers as an ordinary transformer
|
|
1049
|
+
* -- `fender-super-reverb`'s `SRC_REVERB_TANK_4AB3C1B` terminals with `125A9A` on the label.
|
|
1050
|
+
*
|
|
1051
|
+
* Its coils declare `drive`/`pickup`, which is what a tank's coils are: neither transforms the
|
|
1052
|
+
* other's voltage. This is the fixture that proves `drive` is treated as the primary on the
|
|
1053
|
+
* ordinary-transformer path, so a mislabelled tank still lowers instead of refusing for want of a
|
|
1054
|
+
* winding called `primary`. `InputImpedance`/`OutputImpedance` remain property-side synonyms for
|
|
1055
|
+
* `PrimaryImpedance`/`SecondaryImpedance` (`parametersFor` in `netlist.ts`).
|
|
1056
|
+
*/
|
|
1057
|
+
export declare const reverbTankInputOutputTransformer: string;
|
|
1058
|
+
/**
|
|
1059
|
+
* `tappedPrimaryOutputTransformer` plus a **third** impedance tap, `secondary_4`, dangling
|
|
1060
|
+
* (connected to nothing else) beside the wired reference winding -- the same shape
|
|
1061
|
+
* `danglingAlternateTapTransformer` tests for `secondary_8`. Must compile to the identical two
|
|
1062
|
+
* stamps as the base fixture -- no third stamp, no stamp touching node 5.
|
|
1063
|
+
*/
|
|
1064
|
+
export declare const danglingSecondary4Transformer: string;
|
|
1065
|
+
/**
|
|
1066
|
+
* `connectedAlternateTapTransformer` (its `secondary_8` wired to a load) plus a **third** tap,
|
|
1067
|
+
* `secondary_4`, dangling.
|
|
1068
|
+
*
|
|
1069
|
+
* The refusal must fire exactly as it does with no `secondary_4` present -- not be masked,
|
|
1070
|
+
* changed, or made order-dependent by the extra tap. It used to prove that two alternate taps
|
|
1071
|
+
* held separate winding groups and so could not overwrite one another's node; they are one coil's
|
|
1072
|
+
* taps now, and the property that matters is that the connectivity test finds the loaded tap
|
|
1073
|
+
* regardless of how many others the coil declares.
|
|
1074
|
+
*/
|
|
1075
|
+
export declare const distinctAlternateTapsTransformer: string;
|
|
1076
|
+
/**
|
|
1077
|
+
* A tapped primary with no other complete, untapped winding to pivot the shared-primary
|
|
1078
|
+
* reduction on -- only a shield beside it, which declares `role: shield` and belongs to no coil.
|
|
1079
|
+
* The v2-transformer-primary-tap milestone's "no reference available" refusal case.
|
|
1080
|
+
*
|
|
1081
|
+
* States its ratio as a typed `TurnsRatio` rather than as an impedance pair, because a rating
|
|
1082
|
+
* belongs to a coil and the secondary it would rate is exactly what this document does not
|
|
1083
|
+
* declare. That is also what keeps the fixture reaching the refusal it is here for: a document
|
|
1084
|
+
* stating no ratio at all refuses earlier, in `requireWindingSpecification`.
|
|
1085
|
+
*/
|
|
1086
|
+
export declare const tappedPrimaryNoReferenceTransformer: string;
|
|
1087
|
+
/**
|
|
1088
|
+
* A divider whose midpoint (the output) is formed by a T-junction in the middle of a
|
|
1089
|
+
* diagonal wire. `wireAxisAligned` is the same circuit with that wire redrawn horizontal,
|
|
1090
|
+
* so the two must yield the same netlist up to node relabeling.
|
|
1091
|
+
*
|
|
1092
|
+
* The midpoint terminals sit on the segment, not at an endpoint, so they are visible only
|
|
1093
|
+
* through the point-on-segment test. Before diagonal segments were recognised that test
|
|
1094
|
+
* returned false for them, the midpoint was dropped as unconnected, and this document
|
|
1095
|
+
* refused where its horizontal sibling compiled.
|
|
1096
|
+
*/
|
|
1097
|
+
export declare const wireDiagonal: string;
|
|
1098
|
+
/**
|
|
1099
|
+
* `wireDiagonal` redrawn with the midpoint wire horizontal. The midpoint terminals still
|
|
1100
|
+
* sit in the middle of the segment; only the segment's angle changes. The two must resolve
|
|
1101
|
+
* to the same netlist up to node relabeling, which is the invariant the angle must not
|
|
1102
|
+
* break.
|
|
1103
|
+
*/
|
|
1104
|
+
export declare const wireAxisAligned: string;
|
|
1105
|
+
/**
|
|
1106
|
+
* NE570 compandor terminal-mapping contract.
|
|
1107
|
+
*
|
|
1108
|
+
* Sixteen bare-pin terminals in strict sequential `pin1`..`pin16` order, each on a
|
|
1109
|
+
* distinct node (10–25). The part catalog binds section A to [rectIn=pin2,
|
|
1110
|
+
* rectCap=pin1, cellIn=pin5/INV_IN, output=pin7] and section B to the channel-2
|
|
1111
|
+
* pins. This fixture asserts that binding is stable: a catalogue edit that
|
|
1112
|
+
* re-points any of the four section terminals fails here rather than surfacing
|
|
1113
|
+
* as a silent audio defect months later.
|
|
1114
|
+
*/
|
|
1115
|
+
export declare const ne570TerminalMap: string;
|
|
1116
|
+
/**
|
|
1117
|
+
* The datasheet's own expander, wired exactly as onsemi NE570/D Rev. 4 Figure 6 draws
|
|
1118
|
+
* it, and the reason this fixture exists rather than a bare transconductance probe: the
|
|
1119
|
+
* datasheet states a closed form for this circuit's gain, so the reference is external
|
|
1120
|
+
* to our code rather than a number read off our own output.
|
|
1121
|
+
*
|
|
1122
|
+
* GAIN = 2 * R3 * VIN(avg) / (R1 * R2 * IB)
|
|
1123
|
+
*
|
|
1124
|
+
* The input drives the rectifier (pin 2) and the gain cell (pin 3) through separate
|
|
1125
|
+
* coupling caps; pin 6 is tied to pin 7, which is what makes the internal 20k R3 the
|
|
1126
|
+
* op-amp's feedback resistor. Both couplings are 1 uF into 10k/20k, corners at 16 Hz and
|
|
1127
|
+
* 8 Hz, so at the 1 kHz test tone they pass unity and the gain is the chip's alone.
|
|
1128
|
+
*
|
|
1129
|
+
* Two independent numbers fall out of this one circuit, which is what makes it a
|
|
1130
|
+
* settlement rather than a smoke test: the AC gain above, and a quiescent output of
|
|
1131
|
+
* `(1 + R3/R4) * VREF` = 3.0 V that the datasheet also states outright. The DC figure
|
|
1132
|
+
* pins down the topology -- it only comes out at 3.0 V with R4 returned to ground -- and
|
|
1133
|
+
* the AC figure pins down the gain cell's scaling. See `ne570ExpanderGainAt`.
|
|
1134
|
+
*
|
|
1135
|
+
* CRECT is 2.2 uF as in the datasheet's own test circuit (Figure 3), giving the detector
|
|
1136
|
+
* `tau = R5 * CRECT` = 22 ms. That is a real external component, not a constant: the
|
|
1137
|
+
* negative control halves it and expects the attack to track.
|
|
1138
|
+
*/
|
|
1139
|
+
export declare const ne570Expander: string;
|
|
1140
|
+
/**
|
|
1141
|
+
* The datasheet's compressor: onsemi NE570/D Rev. 4's own sentence, "a compressor is essentially
|
|
1142
|
+
* an expander placed in the feedback loop of the op amp", applied to `ne570Expander` and nothing
|
|
1143
|
+
* else. It is four derivations off that fixture, so the two provably differ only in the wiring
|
|
1144
|
+
* under test, and the same gain cell, the same internal resistors and the same reference serve
|
|
1145
|
+
* both.
|
|
1146
|
+
*
|
|
1147
|
+
* The three moves, and each is that sentence read literally:
|
|
1148
|
+
*
|
|
1149
|
+
* - the rectifier (pin 2) and the gain cell (pin 3) are driven from the **output** rather than
|
|
1150
|
+
* from the input, which is what "in the feedback loop" means for this chip;
|
|
1151
|
+
* - the signal enters at the **R3 pin** (pin 6), which the expander had tied to pin 7, and
|
|
1152
|
+
* reaches the summing node through the internal 20k;
|
|
1153
|
+
* - an external leg closes the op amp's DC loop, per `ne570CompressorInput` above.
|
|
1154
|
+
*
|
|
1155
|
+
* `mxr-carbon-copy`'s own traced schematic is an independent instance of the same topology --
|
|
1156
|
+
* R31 into pin 6, C24 from pin 7 back to pins 2 and 3, R34+R33 from pin 5 to pin 7 -- which is
|
|
1157
|
+
* why this is a reading of the datasheet rather than an invention: two sources drawn by
|
|
1158
|
+
* different people agree on it.
|
|
1159
|
+
*
|
|
1160
|
+
* **What this fixture is for.** The expander pins the gain cell's *magnitude* against a stated
|
|
1161
|
+
* closed form, and pins nothing about its *direction*: the cell carries no current at DC, so the
|
|
1162
|
+
* stated 3.0 V quiescent cannot see the sign, and the gain formula is a magnitude. Direction only
|
|
1163
|
+
* becomes observable when the cell sits inside the loop, because then it either adds to the
|
|
1164
|
+
* feedback conductance or subtracts from it. So this is the two-sided control the compandor
|
|
1165
|
+
* rebuild never had:
|
|
1166
|
+
*
|
|
1167
|
+
* - a compressor's gain must **fall** as its input level rises, and stay bounded;
|
|
1168
|
+
* - `ne570Expander`'s gain must still **rise**, which is what stops a sign flip being a free fix.
|
|
1169
|
+
*/
|
|
1170
|
+
export declare const ne570Compressor: string;
|
|
1171
|
+
/**
|
|
1172
|
+
* The same expander with a tenth of the averaging capacitance.
|
|
1173
|
+
*
|
|
1174
|
+
* The negative control that proves CRECT is load-bearing. Before this rewrite the
|
|
1175
|
+
* detector integrated a private state variable against a hard-coded 50 ms and never read
|
|
1176
|
+
* the CRECT node at all, so this fixture and its parent rendered identically -- the
|
|
1177
|
+
* external component the chip devotes a pin to did nothing. `tau = R5 * CRECT` drops from
|
|
1178
|
+
* 22 ms to 2.2 ms here, which must show up as a faster attack.
|
|
1179
|
+
*/
|
|
1180
|
+
export declare const ne570ExpanderFastDetector: string;
|
|
1181
|
+
/**
|
|
1182
|
+
* CD4047 bare-pin position-resolution contract.
|
|
1183
|
+
*
|
|
1184
|
+
* Fourteen terminals: `pin1`..`pin13` are bare (no role suffix) and `pin14_vdd`
|
|
1185
|
+
* carries the only role token. The part catalog's pinout is `[null × 13, "vdd"]`,
|
|
1186
|
+
* so position 13 must fold to `vdd` and the remaining thirteen positions accept
|
|
1187
|
+
* any (null) token. This fixture asserts that a bare-pin CD4047 still compiles
|
|
1188
|
+
* and that the clock-driver section resolves its five terminals by position:
|
|
1189
|
+
* cp1=pin10(9), cp2=pin11(10), vgg=pin13(12), vdd=pin14(13), ox1=pin3(2).
|
|
1190
|
+
*/
|
|
1191
|
+
export declare const cd4047BarePinMap: string;
|
|
1192
|
+
/**
|
|
1193
|
+
* A spring reverb tank alone: input jack straight into the drive coil, pickup into the output
|
|
1194
|
+
* jack across a load.
|
|
1195
|
+
*
|
|
1196
|
+
* Deliberately nothing else. A tank inside a real amp is buried behind a driver stage, a
|
|
1197
|
+
* recovery stage and a mix control, so a level measured there cannot say whether the *tank*
|
|
1198
|
+
* reverberates. Here the only thing between the jacks is the tank.
|
|
1199
|
+
*
|
|
1200
|
+
* `PartNumber` is the whole of the classification evidence: the shell declares itself a
|
|
1201
|
+
* `Circuit.Transformer`, exactly as the corpus packets do, and only the exact part id
|
|
1202
|
+
* distinguishes a tank from the output transformer sitting next to it.
|
|
1203
|
+
*/
|
|
1204
|
+
export declare const springReverbTank: string;
|
|
1205
|
+
/**
|
|
1206
|
+
* A variable attenuator using an optocoupler / Vactrol (VTL5C1).
|
|
1207
|
+
*
|
|
1208
|
+
* Series resistor R1=10k, shunt element is the LDR of the optocoupler to ground.
|
|
1209
|
+
* VLED drives the LED anode with respect to ground.
|
|
1210
|
+
*
|
|
1211
|
+
* - When VLED = 0 V (dark): LDR resistance is ~10 MΩ (ldrMaxOhms), so attenuation is 10M / (10k + 10M) ~ 0.999 V/V.
|
|
1212
|
+
* - When VLED = 2 V (illuminated): LED conducts forward current, LDR drops to ~100 Ω (ldrMinOhms), attenuation is 100 / (10k + 100) ~ 0.0099 V/V (-40 dB).
|
|
1213
|
+
* - When VLED = 0.5 V (sub-threshold): LED remains non-conducting, LDR remains dark at ~10 MΩ.
|
|
1214
|
+
*/
|
|
1215
|
+
export declare const optocouplerAttenuator: string;
|
|
1216
|
+
export declare const optocouplerAttenuatorIlluminated: string;
|
|
1217
|
+
export declare const optocouplerAttenuatorSubThreshold: string;
|
|
1218
|
+
/**
|
|
1219
|
+
* The LED biased into the middle of the LDR's range, at 1.14 V.
|
|
1220
|
+
*
|
|
1221
|
+
* **The control the two extremes cannot supply.** Dark and illuminated both agree with a model
|
|
1222
|
+
* that is a two-state switch, and the sub-threshold fixture agrees with one whose LED does
|
|
1223
|
+
* nothing at all -- all three read as one of the two endpoints. Only a bias that lands *between*
|
|
1224
|
+
* them shows the LDR curve is continuous and actually traversed.
|
|
1225
|
+
*
|
|
1226
|
+
* Measured sweep across the knee, 0.1 V drive at 1 kHz: 1.00 V -> 0.9984, 1.05 -> 0.9964,
|
|
1227
|
+
* 1.10 -> 0.9722, 1.12 -> 0.8865, **1.14 -> 0.4936**, 1.16 -> 0.0621, 1.18 -> 0.0112,
|
|
1228
|
+
* 1.20 -> 0.0099 (floored). The assertion deliberately checks the *property* -- strictly between
|
|
1229
|
+
* the endpoints -- rather than pinning 0.4936, because this is the steepest point on a steep
|
|
1230
|
+
* curve and a brittle number here would fail for changes that are not defects.
|
|
1231
|
+
*
|
|
1232
|
+
* **A fidelity note the endpoints hide.** That whole traversal happens in an 80 mV window
|
|
1233
|
+
* (1.10 V to 1.18 V). A real Vactrol's LDR responds gradually over *decades* of LED current --
|
|
1234
|
+
* the slow, smooth knee is the part's musical character, and what an optocoupler tremolo or
|
|
1235
|
+
* compressor is chosen for. So "the optocoupler operator is settled" means its endpoints and its
|
|
1236
|
+
* continuity are pinned, **not** that the Vactrol's response shape is modelled; that lives in
|
|
1237
|
+
* `ledTransconductance` and the LDR exponent's scaling and is not settled by these fixtures.
|
|
1238
|
+
*/
|
|
1239
|
+
export declare const optocouplerAttenuatorPartial: string;
|
|
1240
|
+
export declare const mn3007RoleMap: string;
|
|
1241
|
+
/**
|
|
1242
|
+
* MN3007 bare-pin position-resolution contract.
|
|
1243
|
+
*
|
|
1244
|
+
* Eight terminals named `pin1`..`pin8` with NO role suffixes.
|
|
1245
|
+
* Asserts that bare-pin DIP-8 positions resolve identically to the role-mapped
|
|
1246
|
+
* IC: clk1=pin2(node 11), clk2=pin6(node 15), in=pin3(node 12),
|
|
1247
|
+
* out1=pin7(node 16), out2=pin8(node 17).
|
|
1248
|
+
*/
|
|
1249
|
+
export declare const mn3007BarePinMap: string;
|
|
1250
|
+
/**
|
|
1251
|
+
* MN3207 role-based terminal-resolution contract.
|
|
1252
|
+
*/
|
|
1253
|
+
export declare const mn3207RoleMap: string;
|
|
1254
|
+
/**
|
|
1255
|
+
* MN3207 bare-pin position-resolution contract.
|
|
1256
|
+
*
|
|
1257
|
+
* Physical 8-pin DIP pinout per Panasonic datasheet and Boss VB-2 IC2:
|
|
1258
|
+
* Pin 1 (VGG) = node 13
|
|
1259
|
+
* Pin 2 (CP1) = node 11
|
|
1260
|
+
* Pin 3 (CP2) = node 15
|
|
1261
|
+
* Pin 4 (GND) = node 0
|
|
1262
|
+
* Pin 5 (OUT1) = node 16
|
|
1263
|
+
* Pin 6 (OUT2) = node 17
|
|
1264
|
+
* Pin 7 (VDD) = node 14
|
|
1265
|
+
* Pin 8 (IN) = node 12
|
|
1266
|
+
*/
|
|
1267
|
+
export declare const mn3207BarePinMap: string;
|
|
1268
|
+
/**
|
|
1269
|
+
* Four bucket-brigade delay lines chained in series (S4).
|
|
1270
|
+
*
|
|
1271
|
+
* Models a multi-BBD cascade such as the SAD1024A 4-stage delay in the EH-7550 Deluxe Memory Man.
|
|
1272
|
+
* Each BBD declares DelayMs: 3 (144 samples at 48 kHz).
|
|
1273
|
+
* Total cascade delay across 4 stages = 4 * 3 ms = 12 ms (576 samples at 48 kHz).
|
|
1274
|
+
*/
|
|
1275
|
+
export declare const hybridCascade4DelayPedal: string;
|
|
1276
|
+
/**
|
|
1277
|
+
* 4-BBD cascade with heterogeneous delays: U1=3ms, U2=6ms, U3=3ms, U4=3ms.
|
|
1278
|
+
* Total cascade delay = 3 + 6 + 3 + 3 = 15 ms (720 samples at 48 kHz).
|
|
1279
|
+
*/
|
|
1280
|
+
export declare const hybridCascade4DelayPedalUnequalDelays: string;
|
|
1281
|
+
/**
|
|
1282
|
+
* 3-BBD cascade: 3 stages of 3 ms each.
|
|
1283
|
+
* Total cascade delay = 3 * 3 ms = 9 ms (432 samples at 48 kHz).
|
|
1284
|
+
*/
|
|
1285
|
+
export declare const hybridCascade3DelayPedal: string;
|
|
1286
|
+
/**
|
|
1287
|
+
* `hybridDelayPedal` with a schematic feedback resistor `R_FB` (10k) from BBD output (node 4)
|
|
1288
|
+
* back to BBD input (node 3) (S5).
|
|
1289
|
+
*
|
|
1290
|
+
* An impulse at t=0 produces repeating, geometrically decaying echoes spaced at 3 ms
|
|
1291
|
+
* (144 samples at 48 kHz): t = 144, 288, 432, 576, ...
|
|
1292
|
+
*/
|
|
1293
|
+
export declare const hybridFeedbackDelayPedal: string;
|
|
1294
|
+
/**
|
|
1295
|
+
* `hybridFeedbackDelayPedal` with higher feedback resistance (30k) -> lower loop gain (S5).
|
|
1296
|
+
* Echoes decay faster than the 10k baseline.
|
|
1297
|
+
*/
|
|
1298
|
+
export declare const hybridFeedbackDelayPedalLowFeedback: string;
|
|
1299
|
+
/**
|
|
1300
|
+
* `hybridFeedbackDelayPedal` with lower feedback resistance (4.7k) -> higher loop gain (S5).
|
|
1301
|
+
* Echoes decay slower than the 10k baseline.
|
|
1302
|
+
*/
|
|
1303
|
+
export declare const hybridFeedbackDelayPedalHighFeedback: string;
|
|
1304
|
+
/**
|
|
1305
|
+
* Active feedback delay fixture with op-amp gain in the feedback loop making loop gain > 1 (S5).
|
|
1306
|
+
* Demonstrates sustained/diverging echoes when loop gain exceeds unity.
|
|
1307
|
+
*/
|
|
1308
|
+
export declare const hybridFeedbackDelayPedalUnstableLoop: string;
|
|
1309
|
+
/**
|
|
1310
|
+
* A tapped secondary loaded at **both** taps, with nothing in it ngspice cannot express.
|
|
1311
|
+
*
|
|
1312
|
+
* `orange-rockerverb`'s output transformer is the corpus shape -- a 16 Ω jack and an 8 Ω jack each
|
|
1313
|
+
* with its own feedback resistor -- and that packet cannot be graded against ngspice, because a
|
|
1314
|
+
* spring reverb tank is a DSP operator with no circuit-level deck (5 of the 24 corpus amps are
|
|
1315
|
+
* excluded for the same reason). This is the claim on its own: two loaded taps are two coupled
|
|
1316
|
+
* windings, each at the turns ratio its own rating gives.
|
|
1317
|
+
*
|
|
1318
|
+
* Checked once against ngspice through the parity report's `--source=` mode: `agrees`,
|
|
1319
|
+
* corr 1.0000, gain 1.000, with that report's `--self-check` confirming a corrupted deck
|
|
1320
|
+
* disagrees and its 2% gain gate refuses a 3% level error. Both decks there are emitted from the
|
|
1321
|
+
* program, so that bounds the *solve*, not the stamps -- which is what the ratio assertions below
|
|
1322
|
+
* are for.
|
|
1323
|
+
*/
|
|
1324
|
+
export declare const twoLiveSecondaryTaps: string;
|
|
1325
|
+
/**
|
|
1326
|
+
* A speaker jack one impedance-selector hop from the output transformer, which is where a real
|
|
1327
|
+
* amp puts it.
|
|
1328
|
+
*
|
|
1329
|
+
* `orange-gro100` is the corpus case and was the only one in 142 documents: `J_SPEAKER` on node 79
|
|
1330
|
+
* with `S_SPEAKER_IMPEDANCE` joining it to the winding's 76/77/78 taps. `resolvePorts`'s "after
|
|
1331
|
+
* the transformer" test required the jack to be *on* a winding node, so it missed, and the output
|
|
1332
|
+
* port fell through to a jack whose own `SourceBoundaryRole` reads "tone-stack output-amp handoff
|
|
1333
|
+
* label". The amp rendered its tone stack -- 3 V of preamp node in place of 35 V of speaker swing,
|
|
1334
|
+
* with no transformer bounding it, so the file clipped 10,991 samples of 96,000.
|
|
1335
|
+
*/
|
|
1336
|
+
export declare const speakerBehindSelector: string;
|
|
1337
|
+
/**
|
|
1338
|
+
* A three-terminal 5 V regulator whose pins are named `pin1`/`pin2`/`pin3` and whose *roles* say
|
|
1339
|
+
* which is the output and which the reference — the shape `moogerfooger-mf-102`'s `U13` has.
|
|
1340
|
+
*
|
|
1341
|
+
* The registry's 78Lxx entry lists `pin2` among its ground aliases and `pin3` among its output
|
|
1342
|
+
* aliases, so a reader that goes by the names puts the reference on the rail here. This fixture
|
|
1343
|
+
* declares the opposite, which is the only evidence that settles it.
|
|
1344
|
+
*/
|
|
1345
|
+
export declare const declaredRegulator: string;
|
|
1346
|
+
/** The same regulator with its electrode roles removed, so only the entry's pin naming is left. */
|
|
1347
|
+
export declare const undeclaredRegulator: string;
|
|
1348
|
+
/**
|
|
1349
|
+
* `invertingAmplifier` with the op-amp **packaged as an eight-pin chip**, expanded by
|
|
1350
|
+
* `sectionsRegistry`.
|
|
1351
|
+
*
|
|
1352
|
+
* Deliberately the same circuit, so the only variable is how the op-amp arrives. A discrete
|
|
1353
|
+
* `kind: opamp` states its own three terminals by role; this one states eight numbered pins and
|
|
1354
|
+
* a part number, and the registry says which three of them are the section and in what order.
|
|
1355
|
+
* That is the path most of the corpus's registry-expanded devices take, and nothing graded it
|
|
1356
|
+
* against a second solver before: if this row disagrees while `inverting-amplifier` agrees, the
|
|
1357
|
+
* defect is in expansion rather than in the op-amp law.
|
|
1358
|
+
*
|
|
1359
|
+
* Pins 4-8 are in no section and connect to nothing, which is the ordinary shape of a real
|
|
1360
|
+
* package -- supply pins and a second half nobody used. They must contribute nothing.
|
|
1361
|
+
*/
|
|
1362
|
+
export declare const packagedOpamp: string;
|
|
1363
|
+
/**
|
|
1364
|
+
* An OTA on an eight-pin chip, driving a load resistor.
|
|
1365
|
+
*
|
|
1366
|
+
* `ota` is five corpus packets and had no fixture at all, because every real OTA arrives inside
|
|
1367
|
+
* an `ic` and an `ic` was refused whole. Output current is `gm` times the input difference, so
|
|
1368
|
+
* the stage's gain is `gm * Rload` -- 1 mS into 10k, a gain of ten -- which is a number the deck
|
|
1369
|
+
* and the program must both produce from the same declaration rather than a shape either could
|
|
1370
|
+
* fake.
|
|
1371
|
+
*
|
|
1372
|
+
* Three mapped pins and no fourth means no amplifier-bias terminal, which is the linear OTA.
|
|
1373
|
+
*/
|
|
1374
|
+
export declare const packagedOta: string;
|
|
1375
|
+
/**
|
|
1376
|
+
* The four-terminal nonlinear OTA on an eight-pin chip.
|
|
1377
|
+
*
|
|
1378
|
+
* `ota` is five corpus packets -- the phaser and chorus OTAs -- and had no fixture, because
|
|
1379
|
+
* every real one arrives inside an `ic`. The linear `packagedOta` reaches `vccs`, which is
|
|
1380
|
+
* a different stamp: a fourth mapped terminal is an amplifier-bias pin, and its presence is what
|
|
1381
|
+
* selects the compressive `2 * Iabc * tanh(vDiff / 2Vt)` law over the linear fallback.
|
|
1382
|
+
*
|
|
1383
|
+
* The input is divided down to about 20 mV before the OTA sees it, on purpose. The parity
|
|
1384
|
+
* harness drives every fixture at 0.1 V, and `tanh(0.1 / 2Vt)` is 0.96 -- pinned against the
|
|
1385
|
+
* compression knee, where the row would grade almost nothing but the saturation limit. At 20 mV
|
|
1386
|
+
* the stage runs about 5% compressed: nonlinear enough that a linear model fails the row, gentle
|
|
1387
|
+
* enough that the verdict is about the law rather than about clipping.
|
|
1388
|
+
*
|
|
1389
|
+
* `RBIAS` from the 9 V rail sets `Iabc` near 0.47 mA. That number is the output's scale, so a
|
|
1390
|
+
* bias pin mapped to the wrong node changes the gain instead of changing nothing.
|
|
1391
|
+
*/
|
|
1392
|
+
export declare const packagedNonlinearOta: string;
|
|
1393
|
+
/**
|
|
1394
|
+
* A CMOS transmission gate whose own signal drives its control pin.
|
|
1395
|
+
*
|
|
1396
|
+
* `analog-switch` is two corpus packets and had no fixture. The law is a smooth sigmoid on the
|
|
1397
|
+
* control voltage, not a hard throw, so it has a curve worth grading -- but only if the control
|
|
1398
|
+
* actually moves. Tying the gate to a DC bias would leave the conductance constant and reduce
|
|
1399
|
+
* the row to a resistor divider that happens to be computed through an exponential.
|
|
1400
|
+
*
|
|
1401
|
+
* So the gate is driven by the signal it passes, with the threshold at 0 V. The conductance then
|
|
1402
|
+
* swings across the sigmoid every cycle -- about 1/171 ohm at the positive peak against 1/465 at
|
|
1403
|
+
* the negative one -- and the stage distorts asymmetrically. That asymmetry is the law; a linear
|
|
1404
|
+
* on-resistance would not produce it.
|
|
1405
|
+
*/
|
|
1406
|
+
export declare const packagedAnalogSwitch: string;
|
|
1407
|
+
/**
|
|
1408
|
+
* An open-collector comparator with a pull-up.
|
|
1409
|
+
*
|
|
1410
|
+
* `comparator` is one corpus packet. The law is `gOn / (1 + exp(k * vDiff)) + gOff` between the
|
|
1411
|
+
* output and `vee`, so the output is pulled down or left to float up through `RPULLUP`. Three
|
|
1412
|
+
* mapped terminals leaves `vee` at ground.
|
|
1413
|
+
*
|
|
1414
|
+
* At sensitivity 50 and this harness's 0.1 V drive the output traverses roughly 0.09 V to 5.4 V
|
|
1415
|
+
* as a smooth curve rather than a switching edge -- deliberate, because an edge's *timing* is
|
|
1416
|
+
* resolved differently by a fixed-step runtime and an adaptive-step ngspice, and a row that
|
|
1417
|
+
* disagreed about that would be reporting the integrator rather than the comparator.
|
|
1418
|
+
*/
|
|
1419
|
+
export declare const packagedComparator: string;
|
|
1420
|
+
/**
|
|
1421
|
+
* An optocoupler as a modulated optical attenuator, which is what the corpus uses them for.
|
|
1422
|
+
*
|
|
1423
|
+
* `optocoupler` is four corpus packets -- the Fender tremolos -- and it is a **stamp in the
|
|
1424
|
+
* matrix**, not a lifted macro, which is the whole reason it can be referenced against ngspice
|
|
1425
|
+
* where a BBD cannot. The LDR shunts the signal to ground and its resistance falls exponentially
|
|
1426
|
+
* with LED current, so the LED is driven from the signal as well as from a bias, and the shunt
|
|
1427
|
+
* therefore moves with the signal: the row grades the coupling *curve* rather than one point on
|
|
1428
|
+
* it, which is what gives the harmonic check something to measure.
|
|
1429
|
+
*
|
|
1430
|
+
* **`RLED` is 2k7 because of a measurement, and the first value was wrong twice over.** At 8k2
|
|
1431
|
+
* the bias node sat near 0.98 V, which cleared the LED knee only while that knee was at the
|
|
1432
|
+
* uncorrected 1.036 V; once the emitter was corrected to the cited `LED-RED` entry the LDR
|
|
1433
|
+
* pinned fully dark and the row silently stopped grading any curve at all -- `agrees` at
|
|
1434
|
+
* correlation 1.0000 with h2 and h3 at 1e-9. Re-biasing to 2k7 puts the reference's distortion
|
|
1435
|
+
* at 0.86%, well clear of the shape check's floor, and its `h3Delta` at 0.0001. Values that put
|
|
1436
|
+
* the distortion just above the floor instead (8k2/2k2 reads 0.18%) measure mostly their own
|
|
1437
|
+
* noise and report deltas up to 0.05.
|
|
1438
|
+
*
|
|
1439
|
+
* **What this row cannot grade**, and it is worth knowing before reading a green verdict: the
|
|
1440
|
+
* LED's own law is three constants hardcoded in the stamp -- a 50 mV ideality, `Is = 1e-12`, and
|
|
1441
|
+
* a coupling `alpha` of 1000 -- which the source has no way to state, so the deck can only
|
|
1442
|
+
* restate them. What the row does grade independently is the pin mapping, the LDR span, and the
|
|
1443
|
+
* shape of the exponential coupling.
|
|
1444
|
+
*/
|
|
1445
|
+
export declare const packagedOptocoupler: string;
|
|
1446
|
+
/**
|
|
1447
|
+
* A VTL5C2 optocoupler, resolved through `pedalPartCatalog` (not the mock `sectionsRegistry`
|
|
1448
|
+
* every other resident in this file uses) so this pins the actual production catalog entry, not a
|
|
1449
|
+
* fixture-only copy of it.
|
|
1450
|
+
*
|
|
1451
|
+
* **What it is for.** `runoffgroove-tremulus-lune`'s VTL5C2 sat in the generic optocoupler bucket
|
|
1452
|
+
* (`ldrMinOhms=100, ldrMaxOhms=10_000_000`, the module-wide `exp(-1000*amps)` coupling) until
|
|
1453
|
+
* 2026-09-15: that law put a genuinely-lit LED (0.567 mA, confirmed against an independent ngspice
|
|
1454
|
+
* diode solve) 56.7% of the way to its dark ceiling, because the generic bucket's bounds are
|
|
1455
|
+
* placeholders and VTL5C2's own datasheet -- cited in the packet's own
|
|
1456
|
+
* `SelectedLaneLedCurrentToResistanceLaw` property (R@1mA=5.5k, R@10mA=800, R@40mA=200,
|
|
1457
|
+
* dark>=1M) -- was never fit to a law at all. `part-catalog.ts`'s dedicated VTL5C2 entry carries
|
|
1458
|
+
* that fit now (`ldrPowerLawCoefficientOhms`/`ldrPowerLawExponent`); this fixture is what keeps it
|
|
1459
|
+
* pinned, since nothing else in this suite exercises it.
|
|
1460
|
+
*
|
|
1461
|
+
* **Bias.** `R_LED` (7k2 from the 9 V rail) puts the LED within a few percent of the datasheet's
|
|
1462
|
+
* 1 mA anchor -- close enough that a regression in the fit or an accidental fallback to the generic
|
|
1463
|
+
* exponential moves the verdict, not so exact that the fixture is fragile to the diode law's own
|
|
1464
|
+
* rounding. `RLOAD` (10k from output to ground) turns the LDR into a divider so its resistance is
|
|
1465
|
+
* what decides the gain, rather than leaving `ldrA`/`ldrB` floating in series with nothing to load
|
|
1466
|
+
* against.
|
|
1467
|
+
*
|
|
1468
|
+
* **What this proves and what it cannot** -- same limit `emitOptocoupler`'s own comment states for
|
|
1469
|
+
* every optocoupler resident: the from-source deck's LDR side is a `B`-source that *restates* the
|
|
1470
|
+
* runtime's own formula (now the power law, when the device carries one) rather than deriving it
|
|
1471
|
+
* independently, so ngspice cannot catch an error shared between the restatement and the runtime.
|
|
1472
|
+
* What it grades independently is the pin mapping, the part-specific `ldrMinOhms`/`ldrMaxOhms`
|
|
1473
|
+
* clamp, and -- because `source-to-spice.ts` reads the law fields off the same compiled program,
|
|
1474
|
+
* not off a second constant -- that the compiled program actually carries the VTL5C2-specific
|
|
1475
|
+
* fields rather than silently falling back to the generic law for this part.
|
|
1476
|
+
*/
|
|
1477
|
+
export declare const packagedOptocouplerVtl5c2: string;
|
|
1478
|
+
/**
|
|
1479
|
+
* A Belton BTDR-2H reverb brick in the smallest analog shell that can carry it.
|
|
1480
|
+
*
|
|
1481
|
+
* **Why this fixture exists.** `digital-reverb-module` was the one device law in the corpus with
|
|
1482
|
+
* no behavioural gate anywhere: no parity fixture -- correctly, since it is an `ic` macro the
|
|
1483
|
+
* runtime executes as DSP and ngspice has no circuit to compare -- and no test either. Worse, the
|
|
1484
|
+
* runtime's own `reverbCombGain` comment claimed "`belton-brick-reverb`'s measured T60 is checked
|
|
1485
|
+
* against the datasheet's 2.5 s", and nothing checked it. One packet in the corpus reaches this
|
|
1486
|
+
* law, so a change to the macro scheduler, the tap, or the output source could quietly silence
|
|
1487
|
+
* every reverb in the product and no gate here would have said a word.
|
|
1488
|
+
*
|
|
1489
|
+
* **The shell is deliberately trivial**, because the brick is what is under test. Input divides
|
|
1490
|
+
* 2:1 into the module's `pin3_input` through `10k`/`10k` (its datasheet Z_in is 10k, so this is
|
|
1491
|
+
* the impedance the part expects); `pin6_output_1` drives a `10k` load through the registry's
|
|
1492
|
+
* stated 220R output impedance; `pin5_output_2` is terminated so the second output is not a
|
|
1493
|
+
* dangling active terminal. The `5 V` rail is the module's own supply. No op-amps, because an
|
|
1494
|
+
* op-amp's own operating point would be a second thing to explain when a level moves.
|
|
1495
|
+
*
|
|
1496
|
+
* Node 1 is the input and node 2 the output, which is what the shared `jacks` helper already
|
|
1497
|
+
* declares -- so the module's output pin *is* the output port and nothing sits between them but
|
|
1498
|
+
* the load.
|
|
1499
|
+
*/
|
|
1500
|
+
export declare const beltonBrickReverb: string;
|
|
1501
|
+
/**
|
|
1502
|
+
* A CD4013 dual D flip-flop wired as a clock divider, lifted out of `pipeline.test.ts`.
|
|
1503
|
+
*
|
|
1504
|
+
* **Why it moved.** This was the only fixture in the repository reaching a device law that no
|
|
1505
|
+
* exported fixture reached: `logic-divider`. It lived as an inline template literal inside its
|
|
1506
|
+
* own test, and `report:fixture-parity --corpus` -- which indexes `circuits.ts` and nothing else
|
|
1507
|
+
* -- therefore reported "no fixture compiles to it under any known registry" about a law with a
|
|
1508
|
+
* working test. Seventeen fixtures were written inline that way; measured, this was the one whose
|
|
1509
|
+
* absence from here made a coverage report state a falsehood, which is why it is the one that
|
|
1510
|
+
* moved rather than all of them.
|
|
1511
|
+
*
|
|
1512
|
+
* The document is unchanged: its test still compiles it under `pedalPartCatalog` and asserts the
|
|
1513
|
+
* same things, and this file is now the complete set of laws the fixtures can reach.
|
|
1514
|
+
*/
|
|
1515
|
+
export declare const cd4013LogicDivider = "schema: circuit-interchange/v3\ndeviceInterface:\n controls:\n - id: INPUT_JACK\n label: \"Input Jack\"\n kind: jack\n role: \"input\"\n - id: OUTPUT_JACK\n label: \"Output Jack\"\n kind: jack\n role: \"output\"\ncomponents:\n - id: INPUT_JACK\n kind: jack\n name: \"INPUT_JACK\"\n sourceTypeName: \"Circuit.Jack\"\n origin:\n x: -480\n y: 0\n rotation: 0\n flipped: false\n terminals:\n - name: tip\n node: 1\n position:\n x: 0\n y: 0\n - name: sleeve\n node: 0\n position:\n x: 0\n y: 0\n - id: OUTPUT_JACK\n kind: jack\n name: \"OUTPUT_JACK\"\n sourceTypeName: \"Circuit.Jack\"\n origin:\n x: 480\n y: 0\n rotation: 0\n flipped: false\n terminals:\n - name: tip\n node: 2\n position:\n x: 0\n y: 0\n - name: sleeve\n node: 0\n position:\n x: 0\n y: 0\n - id: FLIP_FLOP\n kind: ic\n name: \"FLIP_FLOP\"\n sourceTypeName: \"Circuit.IC\"\n origin:\n x: 0\n y: 0\n rotation: 0\n flipped: false\n properties:\n PartNumber: \"CD4013\"\n terminals:\n - name: 1q\n node: 2\n position:\n x: 0\n y: 0\n - name: 1q_bar\n node: 0\n position:\n x: 0\n y: 0\n - name: 1clock\n node: 1\n position:\n x: 0\n y: 0\n - name: 1reset\n node: 0\n position:\n x: 0\n y: 0\n - name: 1data\n node: 0\n position:\n x: 0\n y: 0\n - name: 1set\n node: 0\n position:\n x: 0\n y: 0\n - name: gnd\n node: 0\n position:\n x: 0\n y: 0\n - name: 2set\n node: 0\n position:\n x: 0\n y: 0\n - name: 2reset\n node: 0\n position:\n x: 0\n y: 0\n - name: 2data\n node: 0\n position:\n x: 0\n y: 0\n - name: 2clock\n node: 0\n position:\n x: 0\n y: 0\n - name: 2q_bar\n node: 0\n position:\n x: 0\n y: 0\n - name: 2q\n node: 0\n position:\n x: 0\n y: 0\n - name: vDD\n node: 0\n position:\n x: 0\n y: 0\n";
|
|
1516
|
+
/**
|
|
1517
|
+
* An MN3101 BBD clock generator with its oscillator pin biased, and the first fixture in this
|
|
1518
|
+
* repository to reach the `clock-driver` law at all.
|
|
1519
|
+
*
|
|
1520
|
+
* **Why it did not exist.** `report:fixture-parity --scoreboard` reads one row per corpus device
|
|
1521
|
+
* law and says what pins it. On 2026-09-07 exactly one law read `UNGATED: no fixture at all`:
|
|
1522
|
+
* `clock-driver`, needed by 7 corpus packets. Every mention of it in the test tree was about its
|
|
1523
|
+
* *absence* -- `non-executable-clock-driver`, `no-clock-driver`, and one adversarial-prose test
|
|
1524
|
+
* that requires a divider to render identically despite naming a clock driver in its text. The
|
|
1525
|
+
* law owns three stamped outputs and a sampled oscillator and nothing rendered it.
|
|
1526
|
+
*
|
|
1527
|
+
* **The wiring is the stamp's convention, not a real pedal's, and that is a finding rather than a
|
|
1528
|
+
* shortcut.** `part-catalog.ts` states the polarity plainly: the MN3101 runs on a single negative
|
|
1529
|
+
* supply, so a +9 V pedal ties the part's GND pin to +9 V and its VDD pin to circuit ground. The
|
|
1530
|
+
* runtime stamp instead treats `vdd` as the high rail and skips the coupling entirely when that
|
|
1531
|
+
* node *is* ground, so a correctly-wired pedal renders CP1, CP2 and VGG all pinned at zero -- and
|
|
1532
|
+
* two corpus packets, `boss-ch-1` and `boss-dm-3`, resolve `vdd` to node 0 and do exactly that.
|
|
1533
|
+
* See `docs/troubleshootings/a-correctly-wired-bbd-clock-driver-outputs-nothing.md`.
|
|
1534
|
+
*
|
|
1535
|
+
* This fixture therefore wires VDD to the +9 V rail, which is what the stamp as written needs in
|
|
1536
|
+
* order to oscillate. It pins the law's designed behaviour so the polarity can be corrected
|
|
1537
|
+
* against something; pinning first is the whole argument for the scoreboard that found it.
|
|
1538
|
+
*
|
|
1539
|
+
* OX1 sits on a `6k5`/`2k5` divider off 9 V, which is 2.5000 V exactly and therefore `fScale`
|
|
1540
|
+
* of 1, so the rendered rate is the declared `defaultFrequency` with nothing to subtract.
|
|
1541
|
+
*/
|
|
1542
|
+
export declare const mn3101ClockDriver: string;
|
|
1543
|
+
/**
|
|
1544
|
+
* The same clock driver with one divider leg changed, and nothing else.
|
|
1545
|
+
*
|
|
1546
|
+
* `4k`/`5k` off 9 V is 5.0000 V exactly, so `fScale` is 2 and the rendered rate must be twice the
|
|
1547
|
+
* declared frequency. Without a second bias the OX1 coupling is unpinned: at 2.5 V the scale
|
|
1548
|
+
* factor is 1, so a runtime that ignored the oscillator pin and hardcoded `fScale = 1` would
|
|
1549
|
+
* satisfy every assertion the fixture above can make. The BBD's delay time is derived from this
|
|
1550
|
+
* rate, so "the clock is a constant" and "the clock follows its control pin" are exactly the two
|
|
1551
|
+
* possibilities that need separating.
|
|
1552
|
+
*/
|
|
1553
|
+
export declare const mn3101ClockDriverFastOscillator: string;
|
|
1554
|
+
/**
|
|
1555
|
+
* **Synthetic dry wire -- positive control for `detectDryWire` (report-input-dependence.ts:1002).**
|
|
1556
|
+
*
|
|
1557
|
+
* The corpus lost its dry-wire packet on 2026-09-15 when tremulus-lune was cured by the
|
|
1558
|
+
* optocoupler LDR fix, so *every* dry-wire row in the report now asserts `false` and the
|
|
1559
|
+
* detector can never prove it FIRES. This synthetic restores the positive control in the
|
|
1560
|
+
* compiler-lane fixtures: one bypass-switch position carries the input near-unity (inside the
|
|
1561
|
+
* detector's 2 % passthrough bar) and the other position is dead (below the detector's
|
|
1562
|
+
* -60 dBFS floor, full scale * 1e-3). A prose reader is told it is a working spring-reverb
|
|
1563
|
+
* tank; the *structure* is what the detector must flag, never the prose.
|
|
1564
|
+
*
|
|
1565
|
+
* **The first build of this fixture was wrong and never fired -- worth recording why, since the
|
|
1566
|
+
* mistake is the instructive part.** `SW1` bridged input to *ground*, not to the output probe, so
|
|
1567
|
+
* bypassing it collapsed the whole source to ~0 V instead of passing it through, and a fixed
|
|
1568
|
+
* R1/R2 divider sat in the signal path in *both* switch positions, so neither position was ever
|
|
1569
|
+
* unity: measured `-20.8 dB` (bypass) and `0.09x` (tank), never near-unity and dead. A divider is
|
|
1570
|
+
* not a wire. The fix moves the switch itself onto the input/output path (`a: node 1`,
|
|
1571
|
+
* `b: node 2`) so closing it *is* the wire, and removes the always-present divider from the live
|
|
1572
|
+
* path entirely.
|
|
1573
|
+
*
|
|
1574
|
+
* `detectDryWire`'s own `measure()` drives through `ReferenceRuntime.prepare(SAMPLE_RATE)` with
|
|
1575
|
+
* no `inputSourceOhms` option, so the input source is ideal (0 ohm) here -- **not** the ~10 kOhm
|
|
1576
|
+
* guitar-ish default `render:v2`'s CLI applies to its own stimulus. That matters for R2 below: an
|
|
1577
|
+
* ideal source means R2 barely attenuates the closed-switch reading (it only divides against the
|
|
1578
|
+
* switch's own ~0.01 ohm on-resistance), so a small, unremarkable termination value is safe to
|
|
1579
|
+
* leave in the live path on both sides of the switch.
|
|
1580
|
+
*
|
|
1581
|
+
* - **`SW1`**: `a` on the input node, `b` on the output-probe node. Bypassed (on-resistance) is a
|
|
1582
|
+
* near-direct wire; tank (off-resistance, ~1e9 ohm) is effectively open.
|
|
1583
|
+
* - **`R2`**: output probe node to ground, 1 kOhm. Always present. With an ideal source this costs
|
|
1584
|
+
* the bypassed reading nothing (1 kOhm >> the switch's ~0.01 ohm on-resistance), and in the tank
|
|
1585
|
+
* position it is the dominant path to ground against the switch's ~1e9 ohm off-resistance, which
|
|
1586
|
+
* is what pins the dead reading far below the floor rather than leaving the output node to a bare
|
|
1587
|
+
* gmin (1e12 ohm) shunt -- gmin alone against a 1e9 ohm off-switch would leak ~99.9 % of the input
|
|
1588
|
+
* through, not read dead at all.
|
|
1589
|
+
* - **`R1`**: input node to output-probe node, in parallel with the switch, always present at a
|
|
1590
|
+
* deliberately huge value (100 Mohm) so it changes neither reading by more than a part in 1e5 --
|
|
1591
|
+
* present only so the mutation control below has one property to change.
|
|
1592
|
+
*/
|
|
1593
|
+
export declare const syntheticDryWire: string;
|
|
1594
|
+
/**
|
|
1595
|
+
* **Mutation control for the synthetic dry wire.**
|
|
1596
|
+
*
|
|
1597
|
+
* The same fixture with the dead arm made alive: R1's 100 Mohm leakage bridge (negligible in
|
|
1598
|
+
* both switch positions) is replaced by a 1 kOhm live arm, so it now competes evenly with R2
|
|
1599
|
+
* even when SW1 is open -- both switch positions read roughly half the input, neither dead nor
|
|
1600
|
+
* near-unity. `detectDryWire` must NOT fire here -- if it fired, it would be firing because a
|
|
1601
|
+
* bypass switch exists, not because a wire is dry. This is the negative control that proves the
|
|
1602
|
+
* positive control fires for the right reason.
|
|
1603
|
+
*
|
|
1604
|
+
* `derive()`, not a bare `.replace()`: the first build of this control used `.replace()` against
|
|
1605
|
+
* a `"1M"` target the base fixture had already stopped declaring, so the replacement silently
|
|
1606
|
+
* matched nothing and the control was comparing the base fixture against an unmodified copy of
|
|
1607
|
+
* itself the entire time. `derive()` throws instead of returning a silent no-op.
|
|
1608
|
+
*/
|
|
1609
|
+
export declare const syntheticDryWireMutation: string;
|
|
1610
|
+
/**
|
|
1611
|
+
* An `stages`-section RC low-pass ladder: series 10k from each node to the next, 10n shunt to
|
|
1612
|
+
* ground at every interior node, input on node 1, output on node 2.
|
|
1613
|
+
*
|
|
1614
|
+
* **It exists to be BIG, which no other fixture here is.** A block only takes the runtime's
|
|
1615
|
+
* static sparse schedule when the predicted saving clears `SCHEDULE_MINIMUM_SAVING`, and that
|
|
1616
|
+
* saving grows roughly as `n^2/24`, so every hand-written fixture in this file -- two to seven
|
|
1617
|
+
* unknowns -- solves densely and cannot exercise the schedule at all. Ten sections is the first
|
|
1618
|
+
* size that clears the floor with room to spare.
|
|
1619
|
+
*
|
|
1620
|
+
* **And it is an RC ladder specifically**, because the schedule's hardest case is the
|
|
1621
|
+
* difference between a DC pass and a transient one: a capacitor contributes `2C/dt` to the
|
|
1622
|
+
* matrix while audio is running and contributes *nothing at all* during an operating-point
|
|
1623
|
+
* solve. A ladder whose every shunt element is a capacitor is therefore a structurally
|
|
1624
|
+
* different matrix in the two passes, which is exactly the condition that sent six corpus
|
|
1625
|
+
* packets permanently onto the dense path in 2026-09-18's audit.
|
|
1626
|
+
*
|
|
1627
|
+
* Linear, so its own audio is uninteresting: one solve per sample, a first-order roll-off per
|
|
1628
|
+
* section. Nothing here asserts what it sounds like.
|
|
1629
|
+
*/
|
|
1630
|
+
export declare const rcLadder: (stages: number) => string;
|
|
1631
|
+
/**
|
|
1632
|
+
* Two JFETs differing only in parameter-key spelling. The corpus spells the SPICE
|
|
1633
|
+
* threshold and transconductance `Vt0`/`Beta` (mxr-phase-90, boss-ph-1r,
|
|
1634
|
+
* mxr-noise-gate-line-driver, jhs-morning-glory); nothing in the corpus uses the
|
|
1635
|
+
* all-caps `VTO`/`BETA`. Both spellings must land on thresholdVolts and
|
|
1636
|
+
* transconductance — the all-caps forms were the only ones read, so the corpus
|
|
1637
|
+
* values silently fell back to the law defaults (-2 V, 1 mS).
|
|
1638
|
+
*/
|
|
1639
|
+
export declare const jfetSpiceCasedParameters: string;
|
|
1640
|
+
/** DPDT: pole A lifts the input jack off the core, pole B lifts the output jack; the throws meet on a wire. */
|
|
1641
|
+
export declare const trueBypassDpdt: string;
|
|
1642
|
+
/** SPDT on the output only; the input jack stays tied to the core and keeps loading it in bypass. */
|
|
1643
|
+
export declare const hardwireSpdt: string;
|
|
1644
|
+
/**
|
|
1645
|
+
* Always-on emitter-follower buffer, then the DPDT. No latch, no JFET, one BJT: nothing
|
|
1646
|
+
* electronic, yet the bypass wire carries the buffer's output, so the bypass is buffered.
|
|
1647
|
+
* Before 2026-09-22 this derived as `hardwire` and the chain played it as a wire.
|
|
1648
|
+
*/
|
|
1649
|
+
export declare const bufferedMechanicalDpdt: string;
|
|
1650
|
+
/**
|
|
1651
|
+
* Boss-style electronic switching: a cross-coupled BJT bistable toggled by a momentary contact
|
|
1652
|
+
* through a capacitor, its collectors biasing two JFET audio gates. Meets the four structural
|
|
1653
|
+
* requirements `findBistableLatches` states, so this is derived `buffered` by the latch.
|
|
1654
|
+
*/
|
|
1655
|
+
export declare const flipFlopBypassLatched: string;
|
|
1656
|
+
/**
|
|
1657
|
+
* The same JFET gates driven by two BJTs that are **not** cross-coupled (an inverter chain), so
|
|
1658
|
+
* the latch detector finds nothing and the `buffered` verdict rests on the JFET-plus-BJTs
|
|
1659
|
+
* heuristic alone. Pinned so that replacing the heuristic shows up as this fixture moving.
|
|
1660
|
+
*/
|
|
1661
|
+
export declare const flipFlopBypassJfetGates: string;
|
|
1662
|
+
/** The declared switch only grounds a status-indicator node; the audio path never sees it. */
|
|
1663
|
+
export declare const bypassSwitchIndicatorOnly: string;
|
|
1664
|
+
/**
|
|
1665
|
+
* A cathode-biased pentode gain stage on the generic law: 68k grid stopper, 1M leak, 470 R
|
|
1666
|
+
* cathode, 2.2k plate load and the screen at the 250 V rail through 1k (which drops nothing,
|
|
1667
|
+
* because the generic law draws no screen current). Operating point in `expected.ts`.
|
|
1668
|
+
*/
|
|
1669
|
+
export declare const pentodeGainStage: string;
|
|
1670
|
+
/** Series 10k into a 1 H shunt: the RL high-pass twin of `rlLowPass`, same corner. */
|
|
1671
|
+
export declare const rlHighPass: string;
|
|
1672
|
+
/**
|
|
1673
|
+
* A three-way rotary: the common on the input, each throw a series resistor into a 1k load, so
|
|
1674
|
+
* every position has a distinct hand-computed gain (`selectorThreeWayGains`). Throw terminals
|
|
1675
|
+
* are named after the options, in option order, so name and order agree.
|
|
1676
|
+
*/
|
|
1677
|
+
export declare const selectorThreeWay: string;
|
|
1678
|
+
/**
|
|
1679
|
+
* An RC core with a chip the registry does not know, declared as a class the compiler opens
|
|
1680
|
+
* without a model (`Circuit.DigitalSignalProcessor`): the pedal still compiles, the chip is
|
|
1681
|
+
* dropped with `ic-not-executed`, and the analog path around it plays. One pin on the audio
|
|
1682
|
+
* node, one on ground, one on a node nothing else touches.
|
|
1683
|
+
*/
|
|
1684
|
+
export declare const openIcOnDeclaredClass: string;
|
|
1685
|
+
/**
|
|
1686
|
+
* The same unknown chip declared as a plain class the compiler does **not** open: the refusal
|
|
1687
|
+
* this pipeline gives an unidentified IC by default, so the fixture above is a deliberate
|
|
1688
|
+
* exception and not a hole.
|
|
1689
|
+
*/
|
|
1690
|
+
export declare const unknownIcRefused: string;
|
|
1691
|
+
export declare const bbdClockDerivedDelay: string;
|
|
1692
|
+
/**
|
|
1693
|
+
* The same clock, steered by an LFO: `delay-tap-fractional` in `modulation` mode, which
|
|
1694
|
+
* `mxr-micro-flanger`, `boss-ce-5` and `boss-ce-2` ship and no fixture reached.
|
|
1695
|
+
*
|
|
1696
|
+
* A steered clock cannot state its length as one number, so `deriveBbdDelayFromNetlist` refuses
|
|
1697
|
+
* to pretend and the delay falls back to the declared `DelayMs` -- which is why this variant
|
|
1698
|
+
* carries one and the static fixture above does not. What the modulation resolution wants is
|
|
1699
|
+
* strict: exactly one active device steering the timing network, read at its **control**
|
|
1700
|
+
* terminal, because the timing node itself carries the ~40 kHz oscillator waveform and sampling
|
|
1701
|
+
* that would alias garbage into the delay length. Here that is `Q_LFO`'s base.
|
|
1702
|
+
*/
|
|
1703
|
+
export declare const bbdClockModulatedDelay: string;
|
|
1704
|
+
/**
|
|
1705
|
+
* A PT2399 delay whose time is read off its VCO network: `delay-tap` (integer, not fractional)
|
|
1706
|
+
* in `clock` mode, which `pt2399-delay` and `ibanez-dl5` ship.
|
|
1707
|
+
*
|
|
1708
|
+
* Added alongside the bucket-brigade clock fixture because this is a **different derivation
|
|
1709
|
+
* function** -- `derivePt2399DelayFromNetlist`, which traces a series resistor chain from pin 6
|
|
1710
|
+
* to ground and reads the delay off the datasheet's VCO curve -- and nothing exercised it from
|
|
1711
|
+
* source. The two clock routes share a mode name and no code.
|
|
1712
|
+
*/
|
|
1713
|
+
export declare const pt2399ClockDerivedDelay: string;
|
|
1714
|
+
/**
|
|
1715
|
+
* Linear-control VCA transfer cell (M5207L01 law contract).
|
|
1716
|
+
*
|
|
1717
|
+
* Synthetic stand-in for the TR-2 VCA stage: input jack 1 through Rin 10k
|
|
1718
|
+
* into the VCA input (node 3, referenced to COM), VCA output (node 4)
|
|
1719
|
+
* into Ro 22k to ground, control pin driven by a DC source at
|
|
1720
|
+
* `comVolts + controlVolts` (so Vc = controlVolts against COM). The M5207L01
|
|
1721
|
+
* entry models the input as inputSiemens 0.01 to COM and the gain as
|
|
1722
|
+
* max(0, Vc / 1 V) / 2, so with an ideal input source the hand-computed
|
|
1723
|
+
* voltage gain is (100 / 10100) * 0.01 * 22000 * Vc / 2 = 1.08910891 * Vc.
|
|
1724
|
+
* Renders of this fixture are the law's transfer proof: full, half, COM
|
|
1725
|
+
* offset (control referenced to a nonzero COM, the TR-2 case), and floored
|
|
1726
|
+
* mute. The nonzero-COM case is load-bearing: every earlier test ties COM
|
|
1727
|
+
* to ground, but TR-2's COM is 4.5 V and Vc = Vcontrol - Vcom is what the
|
|
1728
|
+
* whole tremolo depends on.
|
|
1729
|
+
*/
|
|
1730
|
+
export declare const linearVcaCell: (controlVolts: number, comVolts?: number) => string;
|
|
1731
|
+
/**
|
|
1732
|
+
* Bypass-engagement contract: the switchedDivider graph (a shunt switch the signal routes
|
|
1733
|
+
* around, so the connectivity default is open/0) steered by control SW1, with audio.bypass
|
|
1734
|
+
* declaring the engaged position. The three renders differ only in the declared position
|
|
1735
|
+
* and, for the third, a firmware latch toggled by SW1 (which makes the control momentary).
|
|
1736
|
+
* See the "bypass switch default follows its declared engaged position" tests: maintained + 1
|
|
1737
|
+
* defaults to 1, declared 0 keeps the connectivity 0, and the latch-toggled + 1 keeps 0 with
|
|
1738
|
+
* a bypass-engaged-disagrees warning instead of resting "held pressed". `unresolvedPosition`
|
|
1739
|
+
* states a Position its Options cannot place on a throw, which reads as half travel.
|
|
1740
|
+
*/
|
|
1741
|
+
export declare const bypassEngagedFixture: (engaged: 0 | 1, latchToggle?: boolean, unresolvedPosition?: boolean) => string;
|
|
1742
|
+
//# sourceMappingURL=circuits.d.ts.map
|