This document verifies that the SpeedsterAI enclosure design is mechanically sound, dimensionally correct, and acoustically faithful to Paul Carmody's original Speedster specification.
Carmody spec: 5.5 liters (0.19 ft³)
SpeedsterAI: 5.68 liters net / ~5.35 liters effective
The volume is computed via Simpson's rule on the inner cavity cross-sections. The taper formula interpolates between inner baffle dimensions (160×244mm) and inner back dimensions (98×191mm) using a power-2.0 curve. The roundover inset (20mm) is applied to both outer and inner cross-sections, maintaining uniform wall thickness.
Note: The SCAD Simpson's rule uses 3 sample points (front, mid, back) which overestimates the front zone volume by not accounting for the roundover inset in the first 33mm. The verified volume below was measured from the exported inner_cavity() STL in Bambu Studio.
Breakdown:
- Gross cavity volume: 5.86 L (verified via STL export; SCAD 3-point estimate reports 5.94L)
- Cavity floor taper displacement: ~-0.02 L (5mm extra wall inset at cavity floor)
- Port tube + entry bell displacement: -0.16 L (tube: 39.925mm OD × 114.3mm, bell: truncated cone 70→40mm OD × 15mm)
- Pillar displacement: -0.02 L (estimated, 8 front + 8 back pillars)
- Net air volume: ~5.66 L (port, pillars, and cavity taper subtracted)
- Internal crossover displacement: -0.33 L (10 components across 2 PCBs + PCB boards + mounting bosses)
- Effective air volume: ~5.33 L (3.1% below 5.5L target — within acoustic tolerance)
The crossover volume displacement (0.33L) is a consequence of mounting the crossover internally on PCBs rather than externally as in Carmody's original MDF design. This shifts port tuning up ~1Hz — negligible in practice, especially considering poly-fill damping material will further modify the effective volume.
For final verification, export inner_cavity() as STL and measure volume in slicing software.
Carmody spec: 1.375" diameter × 4.5" long, tuned to ~55 Hz
SpeedsterAI: 34.925mm diameter × 114.3mm long (exact conversion of Carmody's imperial specs)
The port dimensions are unchanged from the original design. The Helmholtz resonance frequency depends on port area, port length, and box volume — all three are matched. The entry end has a 15mm quarter-circle concave flare (for tweeter clearance and turbulence reduction); the exit end has a 45° linear chamfer confined to the 10mm back wall (for FDM printability). The entry flare consumes 15mm of the 114.3mm bore for the flared section, leaving 99.3mm of straight bore. This shortens the effective acoustic length, shifting tuning ~3-4 Hz higher than the nominal calculated value. The exit chamfer adds a small end correction. The combined tuning is within practical tolerance, and the flares' primary benefit — reduced air turbulence and chuffing noise at higher SPL — outweighs this shift.
Original: 152mm (6") wide flat MDF baffle with sharp edges. Estimated baffle step frequency: ~720 Hz.
SpeedsterAI: 180mm wide baffle with 20mm cubic Hermite roundover (plus 2mm edge chamfer). Estimated baffle step: ~608 Hz. Roundover effective above ~2737 Hz.
The baffle is 28mm wider than the original (180mm vs 152mm) to accommodate 10mm walls while maintaining internal clearance for the woofer screw circle and ensuring the woofer flange (125.5mm OD) sits entirely within the flat baffle face with 4.1mm margin per side. This shifts the baffle step down by ~112 Hz.
The 20mm roundover (reduced from 24mm during Session 18 geometry revision to maintain driver fit margins) uses a cubic Hermite spline profile designed for FDM printability (max overhang exactly 45° when printed baffle-down). A 2mm 45° chamfer at the baffle face edge softens the front transition. The roundover is effective above ~2737 Hz (c/2πr = 344000/(2π×20)). The original Speedster had no roundover at all, so any roundover is a strict improvement.
Carmody's design note: Woofer is surface-mounted, tweeter is flush-mounted. The original design had the woofer slightly overlapping the tweeter flange.
SpeedsterAI:
- Woofer center: y = -45mm
- Tweeter center: y = +55mm
- Center-to-center: 100mm
- Woofer flange top edge: y = +17.75mm (125.5mm flange / 2 - 45mm offset)
- Tweeter faceplate bottom: y = +5mm (55mm - 100mm/2)
- Gap between driver edges: 7.75mm (slight positive gap, vs slight negative overlap in original)
This 7.75mm gap means the drivers do not overlap, which is a minor departure from the original. Carmody himself noted that builders have increased cabinet height to eliminate the overlap with "negligible effect" on acoustics. The crossover was designed with 3rd-order electrical filters that control the off-axis behavior regardless of this small spacing change.
The W4-1720 requires 89mm of depth behind the baffle. The internal cavity at the woofer position (y=-45mm, near the center) provides approximately 154mm of depth (from inner baffle at z=10mm to inner back wall at z=164mm). This is ~1.7× the required clearance.
Carmody specifies the port "directly behind the tweeter." In SpeedsterAI, the port is at y=+52mm (3mm below the tweeter center at y=+55mm), centered horizontally (x=0). The port tube extends from z=80.7mm to z=195mm, entirely within the back half. At depth=205mm, the port entry bell starts at z=80.7mm — 10.7mm past the tweeter's 70mm mounting depth, so the tweeter body and port tube occupy entirely separate z-ranges.
Original: 1/2" (12.7mm) MDF, density ~750 kg/m³, Young's modulus ~4 GPa
SpeedsterAI: 10mm PETG at 5-6 perimeters + 50-80% gyroid infill
PETG has a Young's modulus of ~2.0 GPa (roughly half of MDF). However, the curved-back wedge shape provides structural advantage: curved surfaces resist pressure better than flat panels (shell stiffness). The 8 pillar pairs act as internal ties between the front and back halves, further resisting baffle flex.
Carmody's original design specifies "no bracing" with 1/2" MDF. The SpeedsterAI design adds 8 structural pillars despite using slightly thinner walls, which should provide equivalent or better panel rigidity.
The split at z=72.7mm divides the enclosure into a shallow front half (baffle + 62.7mm of cavity) and a deep back half (port, terminal, 114.3mm of cavity).
Three mechanisms ensure joint integrity:
- Tongue-and-groove: 3mm tongue / 3.6mm groove provides X-Y alignment and prevents lateral shift during assembly
- 8× M4 bolts: Provide z-axis clamping force at the split-plane perimeter (12mm inset from edge)
- 8× pillar interlocks: 10mm diameter × 2mm boss/recess at each bolt position resist shear loads
The seal strip (foam tape or TPU) in the groove bottom ensures airtightness under bolt compression.
The 8 bolts are positioned at the split-plane cross-section perimeter:
- 2× top/bottom center
- 2× left/right center
- 4× corners (offset 15mm from the cardinal positions to clear driver cutouts)
Each bolt passes from the back exterior through the back half wall into a heat-set insert in the front half pillar. The challenge is that bolts exit through tapered side walls, not flat surfaces.
Solution: The landing_z() function computes, for each bolt position (px, py), the z-depth where the taper cross-section still provides at least 4mm of material clearance to the nearest outer edge. An 8mm diameter cylinder is then cut from this z through to the back face, creating a flat perpendicular landing surface inside the wall.
All 8 bolts use the same landing z (~113mm), determined by the most restrictive positions (top/bottom center bolts, which are closest to the shrinking height edge). This gives uniform bolt length (~60mm from landing to split plane insert).
Verification of the most restrictive bolt:
- Top center bolt position: (0, 134.8) at the split plane
- At z=113mm: cross-section half-height = 134.8 + 4.0 = 138.8mm → actual half-height at z=113 ≈ 138.8mm ✓
- Landing depth from back face: 197 - 113 = 84mm of material for the counterbore cut
- Wall thickness at landing: ~10mm (the bolt sits in the wall zone)
Front pillars: 16mm diameter × 62.7mm long (from inner baffle at z=10mm to split plane at z=72.7mm). Solid cylinders providing material for the M4 heat-set insert (Ø5.6mm × 8mm deep pocket at split face).
Back pillars: 16mm diameter × 30mm cylinder + 30mm taper (15° from vertical, transitioning from 16mm to 0mm). Total: 60mm from split plane. The gentler 15° angle (vs the original 20°) creates a more gradual blend with the inner wall and provides better coverage of the bolt through-hole.
The back cavity depth is 114.3mm (from split plane to inner back wall). The back pillar occupies 60mm of this, leaving 54.3mm clear — plenty of room for the crossover board, wiring, and polyfill.
Crossover PCBs mount vertically on the left and right inner side walls via cylindrical bosses with M3 heat-set inserts. Each boss extends horizontally from the wall to a common flat PCB face plane.
Print support geometry: The back half prints with the back wall down, so bosses are horizontal cantilevered cylinders that need support from below. Each boss has:
-
D-shaped cross-section: The cylinder is hulled with a thin slab at z = ez + boss_r, creating a flat bottom that mates flush with the triangular brace surface. This eliminates the crescent-shaped gaps that would otherwise exist between a round cylinder and a flat support.
-
45° triangular brace: A wedge extending from the bottom of the boss toward the back wall (+Z). Full height (= boss_len) at the wall end, tapering to zero at the PCB face end. The brace starts at the very bottom of the boss (z = ez + boss_r, not the center), so every layer of the boss prints on ≤45° supported material.
These features ensure the bosses print cleanly without slicer-generated support material.
The interlock boss is on the back half pillar (protrudes 2mm past split plane toward front). The recess is on the front half pillar (2mm deep pocket at split face).
This orientation was chosen specifically because the front half has heat-set inserts pressed into the pillar faces. Insert installation causes localized thermal expansion of the surrounding PETG. If the boss were on the front half, this expansion could make the boss oversized and prevent mating. With the recess on the front half instead:
- Expansion slightly shrinks the recess diameter, but 0.3mm clearance per side absorbs this
- The boss on the back half (no insert) stays at nominal dimensions
- The result is actually a slightly tighter (better) friction fit
All heat-set inserts have adequate wall material surrounding them:
| Insert | Diameter | Depth | Pillar/Wall Dia | Wall Ratio |
|---|---|---|---|---|
| Enclosure M4 | 5.6mm | 8mm | 16mm pillar | 2.86× |
| Woofer M4 | 5.6mm | 6mm | 10mm wall | 1.79× |
| Tweeter M3 | 4.5mm | 5mm | 10mm wall | 2.22× |
| Terminal M4 | 5.6mm | 6mm | 10mm wall | 1.79× |
A minimum wall ratio of 1.5× insert diameter is recommended for PETG; all four exceed this.
Terminal insert depth check: The recess is 3mm deep from the back exterior. Inserts are 6mm deep from the recess floor, for a total of 9mm into the 10mm wall. This leaves 1mm of solid PETG on the cavity side — sufficient to prevent punch-through during insert installation. The insert pockets do not intersect the terminal through-cutout (76.5mm square) because the screw pattern (84.5mm spacing) places each insert center 4mm outside the cutout edge. ✓
The binding post plate is 100.6mm square, mounted at y=-45mm on the back face. The back face dimensions are 118×211mm with R30 corners (internal: 98×191mm).
- Horizontal clearance: (118 - 100.6) / 2 = 8.7mm per side ✓
- Vertical clearance: plate center at y=-45, plate extends from y=-95.3 to y=+5.3. Back face extends from y=-105.5 to y=+105.5. Clearance to bottom edge: 105.5 - 95.3 = 10.2mm ✓
-
Woofer cutout: 95.5mm diameter at y=-45mm
-
Woofer screw circle: 115mm diameter (outermost screw edge at 60.1mm from center)
-
Baffle inner half-width: (180 - 20) / 2 = 80mm
-
Screw-to-wall clearance: 80 - 60.1 = 19.9mm ✓
-
Tweeter faceplate: 100mm diameter at y=+55mm
-
Tweeter screw spacing: 60.8mm square (outermost screw at 30.4 + 1.75 = 32.15mm from center)
-
Faceplate edge to inner wall: 80 - 50 = 30mm ✓
- Port outer diameter (straight section): 34.925 + 2×2.5 = 39.925mm
- Port entry flare bell: max outer diameter = 34.925 + 2×15 + 2×2.5 = 69.925mm at z=72.7mm, tapering to 39.925mm at z=87.7mm
- Port at (x=0, y=+45) from z=72.7 to z=187mm
- Inner cavity width at z=72.7: ~155mm → port center to side wall: 77.5mm >> 35mm bell radius ✓
- Inner cavity height at y=+45: port top edge at y=80mm (bell mouth), inner cavity top at ~138mm → 58mm clearance ✓
- Crossover bosses on side walls (x=±hw) do not intersect the centered port bell ✓
- Reinforcement ribs: 6 triangular gusset ribs at the tube-to-back-wall junction (z=149–164mm). Each rib spans 15mm along the tube and 10mm radially beyond the tube surface, 2mm thick. Total rib volume: ~0.001L (negligible). Ribs are clipped to inner cavity via intersection(). ✓
The bolt pattern is computed from the cross-section at the split plane (z=72.7mm). At this depth, the cross-section is approximately 163×262mm. Bolt centers are 12mm inset from the edge.
The most critical clearance is between corner bolts and the woofer/tweeter cutouts. The woofer cutout at the split plane is a 95.5mm diameter bore (or wider due to the 45° chamfer starting at z=3mm — at z=72.7mm the bore has expanded well past the baffle). Since the woofer bore passes through the baffle (z=0 to z=10mm) and the split plane is at z=72.7mm, the woofer cutout does not intersect the split plane at all. The bolt positions at z=72.7 are in the wall zone, well outboard of the cavity. ✓
- Reduced diffraction: 20mm Hermite roundover + 2mm edge chamfer eliminates sharp baffle edges (the single biggest source of coloration in small speakers). Designed for FDM printability with max 45° overhang.
- Curved back: Eliminates parallel internal surfaces that cause standing waves at specific frequencies. The MDF box had 6 parallel pairs; the wedge has zero.
- Port exit flare: 45° linear chamfer in back wall reduces turbulence noise at the port exit. Entry bell (15mm quarter-circle) reduces turbulence at the cavity side and provides tweeter clearance. The original had plain tube ends.
- Structural pillars: 8 pillar pairs add internal reinforcement that the original "no bracing" MDF box lacked.
- Repeatability: Parametric CAD model produces identical enclosures every time. MDF builds vary with woodworking skill.
- Woofer rear chamfer: Opens the baffle bore behind the driver, reducing back-wave reflections that can color the midrange.
- Serviceability: Heat-set inserts allow unlimited assembly/disassembly cycles. The original design used glue for the enclosure and wood screws for drivers.
| Risk | Mitigation |
|---|---|
| PETG less stiff than MDF | Curved shape + 8 pillar pairs compensate; gyroid infill adds internal damping |
| Split-plane air leak | Tongue-and-groove + foam tape + 8 bolt compression |
| Bolt head overhang past curved wall | Analytically computed landing ensures ≥4mm of flat seat; slight overhang is cosmetic only |
| Heat-set insert expansion | Interlock recess on insert side absorbs expansion; boss on non-insert side stays nominal |
| Print warping (large PETG parts) | Bambu H2D enclosed chamber; split into two halves keeps each part manageable |
| Volume sensitivity to print dimensions | Simpson's rule estimation + STL volume verification in slicer before printing |
The enclosure is built by hulling adjacent 2D cross-section slices. Both outer_shape() and inner_cavity() must use the same slice z-positions to avoid artifacts in the boolean difference outer - inner.
Problem: With misaligned hull boundaries (e.g., outer at z=86.88, inner at z=85.9 and z=89.2), the boolean difference creates thin horizontal shelves at each mismatch — visible as horizontal planes in the slicer at z≈88mm and z≈114mm.
Solution: inner_cavity() uses the same slice formula as outer_shape() (20 roundover + 40 body slices) with a 0.001mm epsilon offset to prevent exactly coplanar faces that cause CGAL non-manifold edges.
Results:
| Metric | Before Fix | After Fix |
|---|---|---|
| Non-manifold edges | 170 | 159 |
| Large horizontal faces at z=88 | Yes (shelves) | None |
| Large horizontal faces at z=114 | Yes (shelves) | None |
| Export status | NoError | NoError |
Three sources of coplanar face artifacts were identified and resolved:
- Hull boundary misalignment — aligned slicing with epsilon offset (see above)
- Port tube end at inner back wall — extended port tube 1mm past z=depth−wall
- Crossover boss intersection — removed
intersection(inner_cavity, bosses), added bosses directly
The original 28mm circular roundover profile (quarter-arc) had a vertical tangent at z=0, creating catastrophic FDM overhangs when the front half is printed baffle-down:
| Depth (z) | Circular overhang | Layers affected |
|---|---|---|
| 0.2mm | 83.1° | First layer |
| 2mm | 68.2° | 10 layers |
| 8.2mm | 45.0° | 41 layers |
The first 8.2mm (41 layers at 0.2mm) all exceeded 45° overhang — unprintable without support material on the primary visible surface.
The circular profile was replaced with a compound curve defined by roundover_inset_at(z):
- Baffle edge chamfer (z=0 to z=2mm): Linear 45° bevel. Inset decreases from 26mm to 24mm.
- Cubic Hermite spline (z=2mm to z=39mm):
p(f) = (2-s)f³ + (2s-3)f² - sf + 1wheref = (z-c)/(D-c)ands = (D-c)/I. Inset decreases from 24mm to 0mm.
The junction at z=2mm is G1 continuous (both zones have matching 45° slope). The Hermite spline's slope magnitude is monotonically decreasing, guaranteeing the maximum overhang is exactly 45° at z=0 and decreasing thereafter.
| Depth (z) | Old circular | New Hermite | Improvement |
|---|---|---|---|
| 0.2mm | 83.1° | 45.0° | -38.1° |
| 2mm | 68.2° | 44.6° | -23.6° |
| 5mm | 59.0° | 43.9° | -15.1° |
| 10mm | 45.6° | 42.1° | -3.5° |
| 20mm | 16.6° | 36.4° | +19.8° |
| 39mm | — | 0.0° | — |
Every layer is now ≤45° overhang — printable without support on the roundover surface.
The woofer flange (125.5mm OD) must sit entirely within the flat baffle face. This required decoupling the roundover inset from the baffle width:
| Parameter | Session 13 | Session 18 | Rationale |
|---|---|---|---|
| Baffle width | 180mm | 180mm | Unchanged |
| Roundover inset | 24mm | 20mm | Reduced for driver margin with internal crossover |
| Flat face width | 132mm | 140mm | 4.1mm margin per side (woofer flange) |
| Diffraction threshold | ~2281 Hz | ~2737 Hz | Slightly higher, still covers tweeter range |
| Roundover depth | 39mm | 33mm | Proportional (ratio 1.65, ≤45° overhang) |
| Edge chamfer | 2mm | 2mm | Unchanged |
The cubic Hermite spline satisfies four boundary conditions:
- p(0) = 1 (full inset at chamfer junction)
- p(1) = 0 (zero inset at body junction)
- p'(0) = -s (45° starting slope, matching chamfer)
- p'(1) = 0 (tangent to body)
With s = D/I (depth/inset ratio), the slope magnitude |d(inset)/dz| = (I/D)|3af² + 2bf + c| is maximized at f=0 where it equals exactly 1.0 (45°). The derivative of the slope w.r.t. f is always positive for f ∈ [0,1], confirming monotonically decreasing overhang. This holds for any s ≥ 1.
Three-layer validation system ensures all components fit within the enclosure:
-
Analytical assertions (13 checks, run at every render):
- Woofer flange fits flat baffle face (width and height)
- Woofer/tweeter body fits within cavity at deepest z-point
- Tweeter body ends before port tube starts (z-range separation)
- Crossover PCBs clear woofer body (3D spatial check: woofer radius < face_x)
- Crossover component zone clears port tube (3D spatial check)
- Binding post intrusion within crossover z-range
- Split plane clears roundover zone
- Driver-to-driver gap positive
- Left/right crossover boards don't overlap
-
Visual inspection (render_mode=5):
- Transparent enclosure with color-coded component envelopes
- Red=woofer, Blue=tweeter, Green=binding posts, Orange/Gold=crossover, Cyan=port
-
Geometric collision detection (validate.py):
- Exports each component + cavity as individual STLs
- Checks cavity containment (component - cavity = empty)
- Checks pair-wise intersections (A ∩ B = empty)
- 21 total checks (6 containment + 15 pair-wise)
| Component | Envelope Shape | Key Dimensions |
|---|---|---|
| Woofer | Multi-zone cylinder | Ø96mm basket + Ø91.8mm motor, 89.5mm deep |
| Tweeter | Rectangular box | 55mm × 66mm × 66mm body, 70mm total depth |
| Binding posts (×2) | Cylinders | Ø11.3mm × 34mm, from inner back wall |
| Crossover HP/LP (×2) | PCB slab + component zone | 92×126mm + 40mm height (placeholder) |
| Port tube | Clipped solid | Ø39.9mm OD with entry bell, cavity z-range |
- Phase 1 (assertions): All 20 checks PASS
- Includes 4 PCB corner containment checks and H2D print envelope check
- Phase 2 (geometric): All 21 checks PASS
- 6 containment checks: 3 PASS, 3 SKIP (woofer/tweeter/binding posts pass through walls by design)
- 15 pair-wise collision checks: All PASS
- Crossover envelopes: Per-component models with correct shapes (5 cylinders, 5 rectangles) from KiCad placement data. Volume displacement: 0.33L.
Before printing the full enclosure, a tolerance test print (tolerance-test.scad) validates all fit-critical features on the target printer with the actual PETG material and print settings.
The test generates small bars with 7 variants per feature (±0.3mm in 0.1mm increments around the current nominal). Features are grouped by print orientation to match the enclosure's actual layer directions:
| Group | Features | Orientation | What It Tests |
|---|---|---|---|
| A1, A2, A5 | M4/M3 heatset, counterbore | Face-down (holes on bed) | Ceiling bridging, bore accuracy |
| A4 | Binding post keyhole | Through-hole | Hole + keyway fit |
| B1 | M3 horizontal bore | Upright (bore from side) | Z-axis tolerance (perpendicular to layers) |
| C1–C3 | Tongue/groove, interlock | Flat | Mating clearances |
The tolerance test file uses include <speedster-ai.scad> to derive all nominal values directly from the enclosure's print_* variables. This ensures the test always generates variants centered on the current design values — no manual synchronization needed.
- Print the tolerance test STL with the same settings as the final enclosure
- Test-fit actual hardware (heat-set inserts, bolts, binding posts, tongue/groove mating pieces)
- Read the label on the best-fitting variant
- Enter that value directly into the corresponding
print_*variable inspeedster-ai.scad - Re-export enclosure STLs with
./export.sh
When a new fit-critical feature is introduced to the enclosure design (new insert size, different hardware, additional mating interface), a corresponding test panel should be added to tolerance-test.scad with:
- A new
print_*variable inspeedster-ai.scadfor the feature dimension - Test variants at ±0.3mm around the nominal
- Correct print orientation matching the feature's orientation in the real enclosure
- Engraved labels for identification
This ensures every tolerance-sensitive dimension is validated on the actual printer before committing to a full enclosure print.
The SpeedsterAI enclosure faithfully reproduces Carmody's acoustic design (~5.35L effective volume accounting for internal crossover displacement, identical port tuning, same drivers and crossover) while adding structural improvements (roundover, curved back, pillars, port flares) that should improve measured performance. All mechanical interfaces (driver mounting, bolt pattern, binding posts, split joint, crossover PCB mounting) have been verified for dimensional clearance through a comprehensive validation pipeline (20 analytical assertions + 21 geometric collision/containment checks). The front edge roundover profile and port exit chamfer are designed for FDM printability with max 45° overhang. The design fits within the Bambu Lab H2D print envelope (350×320×325mm) and is printable in PETG with minimal support material.