@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.
Files changed (226) hide show
  1. package/README.md +118 -2
  2. package/dist/bake.d.ts +38 -0
  3. package/dist/bake.d.ts.map +1 -0
  4. package/dist/bake.js +101 -0
  5. package/dist/bake.js.map +1 -0
  6. package/dist/bbd-clock.d.ts +171 -0
  7. package/dist/bbd-clock.d.ts.map +1 -0
  8. package/dist/bbd-clock.js +1750 -0
  9. package/dist/bbd-clock.js.map +1 -0
  10. package/dist/block-row.d.ts +51 -0
  11. package/dist/block-row.d.ts.map +1 -0
  12. package/dist/block-row.js +17 -0
  13. package/dist/block-row.js.map +1 -0
  14. package/dist/bypass.d.ts +3 -0
  15. package/dist/bypass.d.ts.map +1 -0
  16. package/dist/bypass.js +228 -0
  17. package/dist/bypass.js.map +1 -0
  18. package/dist/compile.d.ts +24 -0
  19. package/dist/compile.d.ts.map +1 -0
  20. package/dist/compile.js +348 -0
  21. package/dist/compile.js.map +1 -0
  22. package/dist/converter-scale.d.ts +14 -0
  23. package/dist/converter-scale.d.ts.map +1 -0
  24. package/dist/converter-scale.js +133 -0
  25. package/dist/converter-scale.js.map +1 -0
  26. package/dist/couple.d.ts +28 -0
  27. package/dist/couple.d.ts.map +1 -0
  28. package/dist/couple.js +567 -0
  29. package/dist/couple.js.map +1 -0
  30. package/dist/dangling-active-terminal.d.ts +47 -0
  31. package/dist/dangling-active-terminal.d.ts.map +1 -0
  32. package/dist/dangling-active-terminal.js +542 -0
  33. package/dist/dangling-active-terminal.js.map +1 -0
  34. package/dist/declared-program.d.ts +23 -0
  35. package/dist/declared-program.d.ts.map +1 -0
  36. package/dist/declared-program.js +387 -0
  37. package/dist/declared-program.js.map +1 -0
  38. package/dist/denomination.d.ts +48 -0
  39. package/dist/denomination.d.ts.map +1 -0
  40. package/dist/denomination.js +27 -0
  41. package/dist/denomination.js.map +1 -0
  42. package/dist/device-laws.d.ts +237 -0
  43. package/dist/device-laws.d.ts.map +1 -0
  44. package/dist/device-laws.js +3513 -0
  45. package/dist/device-laws.js.map +1 -0
  46. package/dist/diagnostics.d.ts +13 -0
  47. package/dist/diagnostics.d.ts.map +1 -0
  48. package/dist/diagnostics.js +19 -0
  49. package/dist/diagnostics.js.map +1 -0
  50. package/dist/emit.d.ts +8 -0
  51. package/dist/emit.d.ts.map +1 -0
  52. package/dist/emit.js +43 -0
  53. package/dist/emit.js.map +1 -0
  54. package/dist/errors.d.ts +22 -0
  55. package/dist/errors.d.ts.map +1 -0
  56. package/dist/errors.js +39 -0
  57. package/dist/errors.js.map +1 -0
  58. package/dist/firmware-class.d.ts +69 -0
  59. package/dist/firmware-class.d.ts.map +1 -0
  60. package/dist/firmware-class.js +20 -0
  61. package/dist/firmware-class.js.map +1 -0
  62. package/dist/fixtures/circuits.d.ts +1742 -0
  63. package/dist/fixtures/circuits.d.ts.map +1 -0
  64. package/dist/fixtures/circuits.js +13896 -0
  65. package/dist/fixtures/circuits.js.map +1 -0
  66. package/dist/fixtures/expected.d.ts +261 -0
  67. package/dist/fixtures/expected.d.ts.map +1 -0
  68. package/dist/fixtures/expected.js +315 -0
  69. package/dist/fixtures/expected.js.map +1 -0
  70. package/dist/fixtures/index.d.ts +4 -0
  71. package/dist/fixtures/index.d.ts.map +1 -0
  72. package/dist/fixtures/index.js +8 -0
  73. package/dist/fixtures/index.js.map +1 -0
  74. package/dist/fixtures/registry.d.ts +52 -0
  75. package/dist/fixtures/registry.d.ts.map +1 -0
  76. package/dist/fixtures/registry.js +341 -0
  77. package/dist/fixtures/registry.js.map +1 -0
  78. package/dist/generic-tube-fit.d.ts +12 -0
  79. package/dist/generic-tube-fit.d.ts.map +1 -0
  80. package/dist/generic-tube-fit.js +45 -0
  81. package/dist/generic-tube-fit.js.map +1 -0
  82. package/dist/grounded-clock-supply.d.ts +13 -0
  83. package/dist/grounded-clock-supply.d.ts.map +1 -0
  84. package/dist/grounded-clock-supply.js +45 -0
  85. package/dist/grounded-clock-supply.js.map +1 -0
  86. package/dist/identify.d.ts +50 -0
  87. package/dist/identify.d.ts.map +1 -0
  88. package/dist/identify.js +319 -0
  89. package/dist/identify.js.map +1 -0
  90. package/dist/index.d.ts +10 -0
  91. package/dist/index.d.ts.map +1 -0
  92. package/dist/index.js +19 -0
  93. package/dist/index.js.map +1 -0
  94. package/dist/inert-controls.d.ts +15 -0
  95. package/dist/inert-controls.d.ts.map +1 -0
  96. package/dist/inert-controls.js +266 -0
  97. package/dist/inert-controls.js.map +1 -0
  98. package/dist/latch-seed.d.ts +53 -0
  99. package/dist/latch-seed.d.ts.map +1 -0
  100. package/dist/latch-seed.js +257 -0
  101. package/dist/latch-seed.js.map +1 -0
  102. package/dist/link.d.ts +7 -0
  103. package/dist/link.d.ts.map +1 -0
  104. package/dist/link.js +270 -0
  105. package/dist/link.js.map +1 -0
  106. package/dist/lower.d.ts +79 -0
  107. package/dist/lower.d.ts.map +1 -0
  108. package/dist/lower.js +1855 -0
  109. package/dist/lower.js.map +1 -0
  110. package/dist/netlist.d.ts +79 -0
  111. package/dist/netlist.d.ts.map +1 -0
  112. package/dist/netlist.js +4746 -0
  113. package/dist/netlist.js.map +1 -0
  114. package/dist/non-executable-clock-drivers.d.ts +8 -0
  115. package/dist/non-executable-clock-drivers.d.ts.map +1 -0
  116. package/dist/non-executable-clock-drivers.js +33 -0
  117. package/dist/non-executable-clock-drivers.js.map +1 -0
  118. package/dist/open-category.d.ts +98 -0
  119. package/dist/open-category.d.ts.map +1 -0
  120. package/dist/open-category.js +111 -0
  121. package/dist/open-category.js.map +1 -0
  122. package/dist/over-driven-node.d.ts +33 -0
  123. package/dist/over-driven-node.d.ts.map +1 -0
  124. package/dist/over-driven-node.js +188 -0
  125. package/dist/over-driven-node.js.map +1 -0
  126. package/dist/part-catalog.d.ts +15 -0
  127. package/dist/part-catalog.d.ts.map +1 -0
  128. package/dist/part-catalog.js +6712 -0
  129. package/dist/part-catalog.js.map +1 -0
  130. package/dist/part-number.d.ts +32 -0
  131. package/dist/part-number.d.ts.map +1 -0
  132. package/dist/part-number.js +80 -0
  133. package/dist/part-number.js.map +1 -0
  134. package/dist/partition.d.ts +7 -0
  135. package/dist/partition.d.ts.map +1 -0
  136. package/dist/partition.js +242 -0
  137. package/dist/partition.js.map +1 -0
  138. package/dist/port-full-scale.d.ts +70 -0
  139. package/dist/port-full-scale.d.ts.map +1 -0
  140. package/dist/port-full-scale.js +235 -0
  141. package/dist/port-full-scale.js.map +1 -0
  142. package/dist/pot-orientation.d.ts +114 -0
  143. package/dist/pot-orientation.d.ts.map +1 -0
  144. package/dist/pot-orientation.js +551 -0
  145. package/dist/pot-orientation.js.map +1 -0
  146. package/dist/power-domain-control.d.ts +40 -0
  147. package/dist/power-domain-control.d.ts.map +1 -0
  148. package/dist/power-domain-control.js +142 -0
  149. package/dist/power-domain-control.js.map +1 -0
  150. package/dist/proxy-declaration.d.ts +121 -0
  151. package/dist/proxy-declaration.d.ts.map +1 -0
  152. package/dist/proxy-declaration.js +50 -0
  153. package/dist/proxy-declaration.js.map +1 -0
  154. package/dist/registry.d.ts +323 -0
  155. package/dist/registry.d.ts.map +1 -0
  156. package/dist/registry.js +192 -0
  157. package/dist/registry.js.map +1 -0
  158. package/dist/sparse-schedule.d.ts +65 -0
  159. package/dist/sparse-schedule.d.ts.map +1 -0
  160. package/dist/sparse-schedule.js +421 -0
  161. package/dist/sparse-schedule.js.map +1 -0
  162. package/dist/speaker-load.d.ts +38 -0
  163. package/dist/speaker-load.d.ts.map +1 -0
  164. package/dist/speaker-load.js +97 -0
  165. package/dist/speaker-load.js.map +1 -0
  166. package/dist/stage-coverage.d.ts +21 -0
  167. package/dist/stage-coverage.d.ts.map +1 -0
  168. package/dist/stage-coverage.js +124 -0
  169. package/dist/stage-coverage.js.map +1 -0
  170. package/dist/stamp-partition.d.ts +314 -0
  171. package/dist/stamp-partition.d.ts.map +1 -0
  172. package/dist/stamp-partition.js +472 -0
  173. package/dist/stamp-partition.js.map +1 -0
  174. package/dist/supply-reference.d.ts +19 -0
  175. package/dist/supply-reference.d.ts.map +1 -0
  176. package/dist/supply-reference.js +66 -0
  177. package/dist/supply-reference.js.map +1 -0
  178. package/dist/supply-short.d.ts +32 -0
  179. package/dist/supply-short.d.ts.map +1 -0
  180. package/dist/supply-short.js +118 -0
  181. package/dist/supply-short.js.map +1 -0
  182. package/dist/supply-stamps.d.ts +51 -0
  183. package/dist/supply-stamps.d.ts.map +1 -0
  184. package/dist/supply-stamps.js +363 -0
  185. package/dist/supply-stamps.js.map +1 -0
  186. package/dist/terminal-role.d.ts +109 -0
  187. package/dist/terminal-role.d.ts.map +1 -0
  188. package/dist/terminal-role.js +46 -0
  189. package/dist/terminal-role.js.map +1 -0
  190. package/dist/terminal-roles.d.ts +59 -0
  191. package/dist/terminal-roles.d.ts.map +1 -0
  192. package/dist/terminal-roles.js +92 -0
  193. package/dist/terminal-roles.js.map +1 -0
  194. package/dist/transformer.d.ts +181 -0
  195. package/dist/transformer.d.ts.map +1 -0
  196. package/dist/transformer.js +476 -0
  197. package/dist/transformer.js.map +1 -0
  198. package/dist/types.d.ts +3157 -0
  199. package/dist/types.d.ts.map +1 -0
  200. package/dist/types.js +11 -0
  201. package/dist/types.js.map +1 -0
  202. package/dist/unbounded-operating-point.d.ts +35 -0
  203. package/dist/unbounded-operating-point.d.ts.map +1 -0
  204. package/dist/unbounded-operating-point.js +181 -0
  205. package/dist/unbounded-operating-point.js.map +1 -0
  206. package/dist/unexecuted-region.d.ts +3 -0
  207. package/dist/unexecuted-region.d.ts.map +1 -0
  208. package/dist/unexecuted-region.js +122 -0
  209. package/dist/unexecuted-region.js.map +1 -0
  210. package/dist/unimplemented-control-role.d.ts +3 -0
  211. package/dist/unimplemented-control-role.d.ts.map +1 -0
  212. package/dist/unimplemented-control-role.js +61 -0
  213. package/dist/unimplemented-control-role.js.map +1 -0
  214. package/dist/unreachable-output.d.ts +3 -0
  215. package/dist/unreachable-output.d.ts.map +1 -0
  216. package/dist/unreachable-output.js +97 -0
  217. package/dist/unreachable-output.js.map +1 -0
  218. package/dist/unreadable-terminal-role.d.ts +67 -0
  219. package/dist/unreadable-terminal-role.d.ts.map +1 -0
  220. package/dist/unreadable-terminal-role.js +409 -0
  221. package/dist/unreadable-terminal-role.js.map +1 -0
  222. package/dist/unverified-pinout.d.ts +27 -0
  223. package/dist/unverified-pinout.d.ts.map +1 -0
  224. package/dist/unverified-pinout.js +121 -0
  225. package/dist/unverified-pinout.js.map +1 -0
  226. package/package.json +75 -5
@@ -0,0 +1,188 @@
1
+ // More than one ideal voltage source driving one node, which is not a circuit.
2
+ //
3
+ // An op-amp output is a **low-impedance driven node**: the device's whole job is to force a
4
+ // voltage there. Two of them on one node are two sources asserting two different voltages
5
+ // through near-zero impedance, and there is no answer — the real circuit fights itself and
6
+ // one part wins on current limit, while the model has no current limit to arbitrate with.
7
+ //
8
+ // ngspice says so plainly and refuses the deck: `singular matrix: check nodes ee25#branch
9
+ // and n15`, because two `E` elements driving one node give two rows asserting the same
10
+ // unknown. **This runtime does not refuse.** It gives each op-amp its own auxiliary row and
11
+ // solves an over-determined system to whatever `gmin` and the limiters allow, which is how
12
+ // `ibanez-pql` renders volts a 9 V pedal cannot reach and reports converged samples doing it.
13
+ // That was `1.118e13` V when this was written. Re-measured 2026-08-28 on the node its contested
14
+ // output feeds, the number is not a level at all — **the node never settles**:
15
+ //
16
+ // ```
17
+ // t=0.25s 55.3411 V t=2s 0.9281 V
18
+ // t=0.5s 17.7907 V t=4s -10.1509 V
19
+ // t=1s 5.4407 V t=8s 500.1368 V
20
+ // ```
21
+ //
22
+ // Which is what two integrators fighting for one output node should do: there is no steady state
23
+ // to find, so it wanders. **Do not quote a single figure from this packet as a level** — an
24
+ // earlier revision of this comment quoted `17.177 V` as "settled over 0.5 s and unchanged at 2 s",
25
+ // which was a harness bug (the later reading was aliased to the earlier one, so the
26
+ // still-moving control could not fire) and not a property of the circuit. The durable claim is
27
+ // the shape: unbounded excursion far outside the supply envelope, while the sample count reports
28
+ // converged.
29
+ //
30
+ // The pair is not always two op-amps. `boss-pq-4` puts a declared 4.5 V rail and an op-amp
31
+ // output on one node -- `Vv2 n24 0 DC 4.5` beside `Ee49 n24 0 TABLE {...}` -- and ngspice
32
+ // refuses it the same way. What matters is the *count of ideal sources on a node*, not which
33
+ // kinds they are, so both are counted.
34
+ //
35
+ // Measured over the pedal corpus, 2026-08-27 at `a6f5732d`:
36
+ //
37
+ // ```
38
+ // boss-aw-2 n23 <- two opamp stamps
39
+ // n26 <- five opamp stamps
40
+ // boss-ce-2b n16, n40, n46, n48 each <- two opamp stamps
41
+ // boss-dd-3b n8, n3 each <- two opamp stamps
42
+ // boss-pq-4 n24 <- VREF rail + IC4_VREF
43
+ // boss-tr-2 n3 <- a rail + one opamp stamp
44
+ // ibanez-pql n16 <- U2B + U2A
45
+ // moogerfooger-mf-102 n1 <- PLUS9 rail + U8C + U8D + U10A
46
+ // pigtronix-philosophers-tone n36 <- VC rail + IC4
47
+ // ```
48
+ //
49
+ // **Eight packets now, and the previous list is the reason this one carries its revision.** At
50
+ // `1ccb9839` on 2026-08-21 this list held five, and said of `boss-aw-2`, `boss-dd-3b` and
51
+ // `electro-harmonix-deluxe-memory-man` that all three "now refuse to compile on an unregistered
52
+ // IC, so their over-driven nodes are not live findings". Re-measured at the revision above, all
53
+ // three compile: `boss-aw-2` and `boss-dd-3b` are **live findings again**, with two over-driven
54
+ // nodes each, and `electro-harmonix-deluxe-memory-man` compiles carrying none. `boss-tr-2` was
55
+ // never on either list. `boss-ce-2b`'s fourth node reads `n48` rather than `n49`.
56
+ //
57
+ // So the list has been wrong in both directions — naming packets that had stopped reaching this
58
+ // stage, and omitting packets that had started reaching it again. A reader who quoted it without
59
+ // re-running it went looking for packets that did not compile; a later reader would have missed
60
+ // three that do. **An example list in a comment is a measurement with a date on it**, and a
61
+ // packet dropping off this list because it stopped compiling is not the same as the
62
+ // contradiction being resolved. Re-run before quoting:
63
+ // `compile(...).warnings.filter((w) => w.code === "node-driven-by-two-sources")`.
64
+ //
65
+ // Evidence is terminal-role tokens and node identity, the same as the other three warnings
66
+ // here. No component name, no `Description`, no part number.
67
+ //
68
+ // **A warning rather than a refusal**, matching its neighbours: the program builds and the
69
+ // pedal renders, and this says the rendered circuit contains a contradiction the source almost
70
+ // certainly did not intend. Two plausible readings stay open and this stage cannot pick
71
+ // between them — a transcription that merged two distinct nets into one node, or a real
72
+ // paralleling that the source drew faithfully — and either way the compiled circuit is
73
+ // over-determined, which is the reportable fact.
74
+ //
75
+ // **All of them were read against their sources on 2026-08-21, and one thing that reading found
76
+ // belongs here: over-determined is not the same as inconsistent.** Freeing the second source
77
+ // changed the render by nothing measurable on four of the five, because two ideal sources
78
+ // asserting the *same* voltage leave the solution alone. Only `ibanez-pql`, whose two competing
79
+ // devices are *different* op-amps, manufactured a level — `1.79 V` of swing against `2.48e-2`
80
+ // once separated. So this warning marks a real structural contradiction and says nothing about
81
+ // audibility, and the triage test is one program patch plus one render. See
82
+ // `docs/troubleshootings/the-over-driven-nodes-read-against-their-sources.md`.
83
+ import { blockRow, describeRow } from "./block-row.js";
84
+ /**
85
+ * Nodes driven by more than one ideal voltage source, read from the **lowered stamps**.
86
+ *
87
+ * Reading stamps rather than the netlist is the whole correctness of this rule, and a first
88
+ * version got it wrong. `boss-sd-1` declares two supply devices on node 14 -- a `rail` and a
89
+ * battery's positive terminal -- and lowering collapses them into **one** `dc-source` stamp, so
90
+ * the compiled circuit is not over-determined and ngspice accepts the deck. A netlist-level
91
+ * check flagged it anyway, reporting a redundant *declaration* as a contradiction. The stamps
92
+ * are what the runtime executes and what the deck is emitted from, so they are the only thing
93
+ * that can say whether two sources really force one unknown.
94
+ *
95
+ * Counts `dc-source` positives, `ac-source` positives, `ideal-opamp` outputs, and the
96
+ * `clock-driver` stamp's `vgg` output, and nothing else. The clock driver's VGG pin is an
97
+ * on-chip voltage-source output (`lower.ts` budgets it its own auxiliary row beside CP1 and
98
+ * CP2), so a declared rail on the same node is the same over-determined system as two rails.
99
+ * It fires on three packets today, all clock-VGG fights: canonical `boss-ce-2` v1.22
100
+ * (`VGG_RAIL` against the MN3101's own VGG on the bias node), `boss-ce-5`
101
+ * (a 7.5 V rail against the clock VGG, drawing 4.0 A of phantom supply current in the TS
102
+ * runtime), and `boss-bf-2` (clock VGG against an op-amp output). `boss-ce-2b`'s 2.3 A is
103
+ * NOT this shape -- measured, it is a D5 (1S2473) + D7 (S5500G) two-hop forward-diode path
104
+ * to ground, so this warning correctly stays silent there; that current is a packet defect
105
+ * for artifacts, and `findSupplyShorts` only sees single-hop shorts. CP1/CP2 are not counted: no packet ties a rail to a clock phase, and expanding
106
+ * the count without an observed case would be speculative. A transistor
107
+ * collector on a driven node is ordinary -- a collector is a current source behind a load
108
+ * resistor, not a voltage forced through near-zero impedance -- and a supply's negative end is
109
+ * a reference rather than a driver, so counting either would make this noise.
110
+ *
111
+ * Per block, because regions are independent solves: two sources on the same node id in
112
+ * different regions are different unknowns and no conflict.
113
+ */
114
+ export function findOverDrivenNodes(program) {
115
+ const warnings = [];
116
+ for (const block of program.blocks) {
117
+ if (block.kind !== "mna") {
118
+ continue;
119
+ }
120
+ const byNode = new Map();
121
+ for (const stamp of block.stamps) {
122
+ const driver = drivenNode(stamp);
123
+ if (driver === null || driver.node === 0) {
124
+ continue;
125
+ }
126
+ byNode.set(driver.node, [
127
+ ...(byNode.get(driver.node) ?? []),
128
+ driver.label,
129
+ ]);
130
+ }
131
+ for (const [node, drivers] of byNode) {
132
+ if (drivers.length < 2) {
133
+ continue;
134
+ }
135
+ warnings.push({
136
+ code: "node-driven-by-two-sources",
137
+ device: null,
138
+ detail:
139
+ // The source node, not the row: this names a net someone has to go and look at.
140
+ `in block ${block.id}, ${drivers.join(" and ")} all drive node ${describeRow(block, blockRow(node))}, so ` +
141
+ "that many ideal voltage sources force one unknown and the system is " +
142
+ "over-determined: ngspice refuses such a deck as a singular matrix, while " +
143
+ "this runtime gives each its own auxiliary row and renders whatever the " +
144
+ "solve allows",
145
+ });
146
+ }
147
+ }
148
+ return warnings;
149
+ }
150
+ /**
151
+ * The node a stamp forces the voltage of and a label naming it, or `null` when it forces none.
152
+ *
153
+ * The label is the stamp kind and its auxiliary index, because a stamp carries no device id —
154
+ * so this is the most specific thing that can be said about which element is in conflict.
155
+ */
156
+ function drivenNode(stamp) {
157
+ switch (stamp.kind) {
158
+ case "dc-source":
159
+ return {
160
+ node: stamp.positive,
161
+ label: `dc-source#${stamp.sourceIndex}`,
162
+ };
163
+ // An AC source forces its node just as firmly as a DC one; only the value moves. Two of
164
+ // them on a node -- or one beside a rail -- is the same over-determined system, and a
165
+ // mains inlet declared twice is exactly the shape a transcription produces.
166
+ case "ac-source":
167
+ return {
168
+ node: stamp.positive,
169
+ label: `ac-source#${stamp.sourceIndex}`,
170
+ };
171
+ case "ideal-opamp":
172
+ return {
173
+ node: stamp.output,
174
+ label: `ideal-opamp#${stamp.sourceIndex}`,
175
+ };
176
+ // The clock driver's VGG pin is a voltage-source output like the rails above: the
177
+ // lowering gives it its own auxiliary row, and a declared rail on the same node fights
178
+ // it for the unknown. See the file header for the two packets that do this today.
179
+ case "clock-driver":
180
+ return {
181
+ node: stamp.vgg,
182
+ label: `clock-driver-vgg#${stamp.sourceIndex}`,
183
+ };
184
+ default:
185
+ return null;
186
+ }
187
+ }
188
+ //# sourceMappingURL=over-driven-node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"over-driven-node.js","sourceRoot":"","sources":["../src/over-driven-node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { PartRegistry } from "./registry";
2
+ export declare const zenerCatalogPartIds: ReadonlySet<string>;
3
+ /**
4
+ * Every part id whose `fet` entry refines the gate term only, folded for comparison.
5
+ * `report-part-store-drift.ts` keys its channel-field exclusion on this set -- a catalog
6
+ * product -- rather than on the registry row, so a gate-only entry's avowed class channel
7
+ * is never graded against the database's beta/lambda/Vp the way a transcribed channel
8
+ * would be. Mirrors `zenerCatalogPartIds` above.
9
+ */
10
+ export declare const gateOnlyFetPartIds: ReadonlySet<string>;
11
+ /**
12
+ * The catalog the corpus-facing scripts inject.
13
+ */
14
+ export declare const pedalPartCatalog: PartRegistry;
15
+ //# sourceMappingURL=part-catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"part-catalog.d.ts","sourceRoot":"","sources":["../src/part-catalog.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAa,YAAY,EAAE,MAAM,YAAY,CAAC;AAkM1D,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAEnD,CAAC;AAk8MF;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAAuB,CAAC;AAE3E;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,YAA0B,CAAC"}