The Smell of Molten Projects in the Morning

Ed Nisley's Blog: Shop notes, electronics, firmware, machinery, 3D printing, laser cuttery, and curiosities. Contents: 100% human thinking, 0% AI slop.

Tag: MK4

Prusa Mk 4 3D printer with MMU3 feeder

  • Work Sharp Precision Sharpener: Clamp Support

    Work Sharp Precision Sharpener: Clamp Support

    Another Work Sharp Precision Adjust sharpener improvement from Printables:

    WorkSharp - clamp support
    WorkSharp – clamp support

    Although the blade clamp is a snug fit in its socket, it has enough stick-out cantilever to move slightly even under minimal force from the diamond tools.

    I added a thin cardboard shim, cut with a utility knife (!) and stuck on with a craft adhesive sheet, as the block was about half a millimeter upward with the clamp turned this-a-way and half a millimeter downward the other way. Your mileage / setup will certainly differ.

    I like the sharpener, but it’s much fiddlier than I expected.

  • Window Mount for Bamboo Bee Tunnel Nests

    Window Mount for Bamboo Bee Tunnel Nests

    Mary suggested converting wild bamboo up the hill into tunnel nests (per a xerces.org paper) for native bees buzzing around flowers in the yard, so:

    Bee Tunnel Nest - downspout installation
    Bee Tunnel Nest – downspout installation

    I hung bundles of larger tubes in trees out back, in hopes of attracting huge carpenter bees.

    3D printed mounts hold smaller bundles on the windows to let us keep an eye on the proceedings:

    Bee Tunnel Nest Mount - installed-]
    Bee Tunnel Nest Mount – installed

    Which look better when not seen though two layers of glass in desperate need of Spring Cleaning:

    Bee Tunnel Nest Mounts
    Bee Tunnel Nest Mounts

    The tabs provide a bit of pressure to hold the mounts in place, although I don’t know if they have enough springiness or will survive contact with the elements:

    Bee Tunnel Nest Mount - tab section - solid model
    Bee Tunnel Nest Mount – tab section – solid model

    The key advantage of not building bigger bee motels: these little bundles don’t need annual cleaning / maintenance and will eventually fall apart.

    If the bees find them suitable, more power to ’em!

    And I realized the cut-off ends fit in the rotary. Witticisms engraved on bamboo could become the New Hotness:

    Laser engraved bamboo
    Laser engraved bamboo

    Stipulated: I’m barely half-right about being a wit …

    The OpenSCAD source code as a GitHub Gist:

    // Bee Tunnel Nest Mount
    // Ed Nisley – KE4ZNU
    // 2026-04-26
    include <BOSL2/std.scad>
    Layout = "Show"; // [Build,Show,Window,Bundle,Tabs]
    BundleOD = 35.0;
    BundleOffset = 0.0;
    SlotDepth = 18.0;
    SlotGap = 1.2;
    /* [Hidden] */
    HoleWindage = 0.2;
    Protrusion = 0.01;
    NumSides = 3*2*4;
    Clearance = 0.3;
    //$fn=NumSides;
    WallThick = 2.0;
    MountHeight = 1.5*BundleOD;
    MountWidth = 1.5*BundleOD + BundleOffset;
    ClipOA = [SlotDepth + WallThick,SlotGap + 2*WallThick,MountHeight];
    BundleCtr = [-WallThick/2,ClipOA.y + MountWidth/2 + BundleOffset/2,MountHeight/2];
    TabOA = [0.7*SlotDepth,5.0,0.7*WallThick];
    TabOffset = 0.2*SlotDepth;
    TabOC = MountHeight/2;
    TabClearance = [4*Clearance,0,Clearance];
    //—–
    // Define things
    module BundleMount() {
    difference() {
    cuboid([WallThick,MountWidth + ClipOA.y,MountHeight],
    rounding=3.0,edges=[TOP+BACK,BOTTOM+BACK],anchor=FRONT+RIGHT);
    back(BundleCtr.y)
    xcyl(3*WallThick,d=BundleOD);
    for (j=[-1,1],k=[-1,1])
    translate([BundleCtr.x,j*BundleOD/2 + BundleCtr.y,k*BundleOD/2])
    xcyl(3*WallThick,d=3.0,$fn=6);
    }
    }
    module WindowMount() {
    difference() {
    cuboid(ClipOA,rounding=3.0,edges=[TOP+LEFT,BOTTOM+LEFT],
    anchor=FRONT+RIGHT);
    left(WallThick) back(WallThick)
    cuboid([2*SlotDepth,SlotGap,2*MountHeight],anchor=FRONT+RIGHT);
    for (k=[-1,1])
    translate([-(ClipOA.x – TabOffset),-Protrusion,k*TabOC/2])
    cuboid([TabOA.x + TabClearance.x,WallThick + 2*Protrusion,TabOA.y + 2*TabClearance.z],anchor=FRONT+LEFT);
    }
    }
    module Tabs() {
    for (j=[-1,1])
    fwd(j*TabOC/2)
    cuboid(TabOA,anchor=BOTTOM+LEFT) position(LEFT+TOP)
    prismoid(size1=[3*SlotGap,TabOA.y],size2=[0,TabOA.y/2],
    h=(WallThick – TabOA.z) + SlotGap/3,anchor=BOTTOM+LEFT);
    }
    module Assembly() {
    union() {
    BundleMount();
    WindowMount();
    left(ClipOA.x – TabOffset – TabClearance.x)
    xrot(-90)
    Tabs();
    }
    }
    //—–
    // Build things
    if (Layout == "Bundle") {
    BundleMount();
    }
    if (Layout == "Window") {
    WindowMount();
    }
    if (Layout == "Tabs") {
    Tabs();
    }
    if (Layout == "Show") {
    Assembly();
    }
    if (Layout == "Build") {
    yrot(90)
    Assembly();
    }
  • PolyDryer Humidity: April-ish

    PolyDryer Humidity: April-ish

    After about five weeks:

    2026-04-16
    Filament%RHWeight – gWt gain – gGain %
    PETG White14
    PETG Black14
    PETG Orange2252.52.55.0%
    PETG Natural15
    PETG-CF Blue2355.45.410.8%
    PETG-CF Gray18
    PETG-CF Black14
    PETG Blue10
    TPU Clear14
    TPU Black14

    Most of the PolyDryer boxes had the same humidity as before, so I didn’t disturb them. When the humidity starts to rise, then we’ll see what’s going on in there.

    The PETG Orange meter continues to misbehave and has been glitching from 22% to 30%. The indicator card shows the humidity is around 10% inside and the relatively low weight gain suggests there’s not much water to be adsorbed.

    The PETG-CF Blue spool is new and, once again, shows filament does not arrive bone-dry in the factory wrapper.

    Those two boxes now have alumina beads.

    Dehydrating the jar of wet silica gel on the induction cooktop (set for 405 °F) sweated it down from 532 g to 503 g over the course of four hours, with nearly all of that change in the first two hours.

    Obligatory photo from a while ago, because it looks pretty much the same now:

    Silica gel beads - drying
    Silica gel beads – drying
  • Gridfininty Tape Dispenser

    Gridfininty Tape Dispenser

    A Gridfinity Tape Dispenser holds a roll of book repair tape:

    Gridfinity Tape Dispenser - overview
    Gridfinity Tape Dispenser – overview

    The perspective makes the dispenser look chonkier than it really is.

    A wrap of black silicone tape around the spool embiggens it for a snug fit inside the tape core. A casual inspection of other tapes suggest enlarging the spool by a few percent would help, but it’s Good Enough™ as-is.

    The two end thumbscrews fasten the 4×1 Gridfinity baseplate to the dispenser; both from Gridfinity Refined:

    Gridfinity Tape Dispenser - baseplate
    Gridfinity Tape Dispenser – baseplate

    If I had my wits about me, I’d have used a nicely contrasting color for the baseplate, but it is what it is.

    Although they’re called “thumbscrews”, the slot is sized for a US quarter (or cart coin).

    An OpenSCAD one-liner produces an SVG model of the baseplate:

    projection(cut=true) import("Grid 4x1.stl");
    

    Import SVG into LightBurn, delete the magnet pockets, and Fire The Laser on some EVA foam:

    Gridfinity Tape Dispenser - foam base
    Gridfinity Tape Dispenser – foam base

    A layer of 3M 300LSE tape holds the foam in place, because neither side sticks well to the goo on a craft adhesive sheet due to their low surface energy. I stuck an oversize rectangle to the foam with the thin adhesive side before cutting, which required a second pass at higher speed.

    The thumbscrews also close off the holes in the dispenser bottom through which I poured 275 g = 10 oz of sand for better traction. Steel shot is reputed to be Even Better, although most of the BBs are in the long-arm weight.

    The dispenser model includes a printed serrated blade which works as poorly as the author suggested. A length snapped from an ancient Strombecker 4-I (“four eye”) blade in the Box o’ Big X-Acto Blades fits perfectly, works wonderfully well, and is sufficiently inconspicuous to warrant the warning label. An X-Acto #26 Whittling Blade would probably snap down equally well.

  • LED Garage Light: Desk Lamp Upcycling

    LED Garage Light: Desk Lamp Upcycling

    One of the heatsink panels from the defunct LED garage light now casts a uniform warm-white glow on my desk:

    LED Garage Light - desk light
    LED Garage Light – desk light

    A PCB intended as a lithium battery charger serves as a constant-current supply:

    LED Garage Light - constant current driver
    LED Garage Light – constant current driver

    The three trimpots, from left to right:

    • Constant-voltage limit adjustment
    • Full-charge current setpoint (irrelevant here)
    • Constant-current limit adjustment

    The as-received trimpot settings will be wildly inappropriate for a nominal 10 W COB LED array, so:

    • Connect the output to about 10 Ω of power resistors
    • … with an ammeter in series
    • Connect the input to a 12 VDC / 1-ish A wall wart
    • Adjust the output voltage to 10 V
    • Adjust the output current to 900 mA

    As long as the voltage limit is over about 10 V, it will (likely) never matter, as the LED forward drop doesn’t vary much with temperature. Setting it to something sensible keeps it out of the way.

    The middle trimpot apparently sets a voltage for a comparator to light an LED when the battery current drops below that level as it reaches full charge.

    Although the regulator touts its high efficiency, it does run hot and a heatsink seemed in order:

    LED Garage Light - heatsink
    LED Garage Light – heatsink

    Stipulated: the fins run the wrong way and it’s sitting in the updraft from the main heatsink. It’s Good Enough™.

    The switch on the top comes from the collection of flashlight tailcap switches and controls the 12 V input power. It’s buried up to its button in a generous dollop of JB Kwik epoxy, which seemed the least awful way to get that done.

    The solid model looks about like you’d expect:

    LED Lamp Driver case - switch housing - show solid model
    LED Lamp Driver case – switch housing – show solid model

    The OpenSCAD code exports the (transparent) lid as an SVG so I can import it into LightBurn and laser-cut some thin acrylic. Two tape snippets hold the lid in place pending more power-on hours, after which I’ll apply a few dots of cyanoacrylate adhesive and call it done.

    The case builds in two pieces that glue together to avoid absurd support structures:

    LED Lamp Driver case - switch housing - build solid model
    LED Lamp Driver case – switch housing – build solid model

    A 3D printed adapter goes between the desk lamp arm and the lamp heatsink bolt:

    LED Lamp Driver case - arm adapter - solid model
    LED Lamp Driver case – arm adapter – solid model

    The OpenSCAD source code files for the case and adapter arm as a GitHub Gist:

    // LED Lamp arm adapter
    // Ed Nisley – KE4ZNU
    // 2026-03-18
    include <BOSL2/std.scad>
    Layout = "Adapter"; // [Show,Build,ArmClamp,SinkClamp,Adapter]
    /* [Hidden] */
    HoleWindage = 0.2;
    Protrusion = 0.01;
    Gap = 5.0;
    $fn=5*3*4;
    HoleOC = 45.0;
    ArmRad = 7.5;
    ArmWidth = 11.3;
    SinkOD = 11.5;
    SinkThick = 3.2;
    SinkOC = 20.0;
    ClampThick = 5.0; // outside sink, watch thinning due to hull()
    // Define things
    // Screw & bushings in lamp arm bracket
    // … over-long bushings to prevent coincident surfaces
    module ArmClamp() {
    BushingThick = 1.5;
    BushingOD = 9.0;
    union() {
    ycyl(ArmWidth,d=4.0 + HoleWindage); // central M4 screw
    for (j=[-1,1]) {
    back(j*(ArmWidth – BushingThick + Protrusion)/2)
    ycyl(BushingThick + Protrusion,d=BushingOD);
    back(j*(ArmWidth + 10)/2)
    cuboid([2*ArmRad,10,2*ArmRad]);
    }
    }
    }
    module SinkClamp() {
    union() {
    ycyl(2*SinkOC,d=6.0 + HoleWindage); // central M6 screw
    for (j=[-1,1])
    back(j*SinkOC/2) {
    ycyl(SinkThick + Protrusion,d=SinkOD);
    cuboid([SinkOD,SinkThick + Protrusion,2*SinkOD]);
    }
    }
    }
    module Adapter() {
    difference() {
    hull() {
    right(HoleOC)
    ycyl(ArmWidth,r=ArmRad);
    ycyl(SinkOC + SinkThick + 2*ClampThick,d=SinkOD);
    }
    right(HoleOC)
    ArmClamp();
    SinkClamp();
    }
    }
    // Build it
    if (Layout == "ArmClamp")
    ArmClamp();
    if (Layout == "SinkClamp")
    SinkClamp();
    if (Layout == "Adapter")
    Adapter();
    if (Layout == "Build")
    up(SinkOD/2)
    yrot(-atan((ArmRad – SinkOD/2)/HoleOC))
    Adapter();
    // LED Constant-current driver case
    // Ed Nisley – KE4ZNU
    // 2026-03-15
    include <BOSL2/std.scad>
    Layout = "Show"; // [Show,Build,Case,Lid,LidSVG,Switch]
    /* [Hidden] */
    ThreadThick = 0.2;
    HoleWindage = 0.2;
    Protrusion = 0.01;
    Gap = 5.0;
    WallThick = 1.8;
    TapeThick = 1.5;
    DriverOA = [48.5,13.5 + TapeThick,23.5]; // PCB forward Y, pots along top to rear
    SinkOA = [31.5,12.0,15.5]; // fins forward
    SinkOffset = [(DriverOA.x – SinkOA.x)/2,0,2.0]; // from lower left front corner of PCB
    AdjPots = [14,24,34]; // screwdriver adjust offsets
    AdjOD = 3.0; // … access hole dia
    CaseOA = DriverOA + [2*WallThick,2*WallThick,2*WallThick];
    echo(CaseOA=CaseOA);
    LidOA = [CaseOA.x – WallThick,CaseOA.z – WallThick,1.0];
    Cables = [8.0,3.0 + WallThick/2,LidOA.z];
    SwitchWireOC = DriverOA.x – 6.0;
    SwitchCapBase = [DriverOA.x + WallThick,DriverOA.y + WallThick];
    SwitchCapTop = [DriverOA.x,12.0];
    SwitchCavity = [25.0,10.5,5.5];
    // Define things
    module Lid() {
    difference() {
    cuboid(LidOA,anchor=BOTTOM+FWD+LEFT);
    for (i = AdjPots)
    translate([i,LidOA.y – AdjOD/2 – WallThick/2,-Protrusion])
    cyl(LidOA.z + 2*Protrusion,d=AdjOD,anchor=BOTTOM,$fn=8,spin=180/8);
    translate([LidOA.x/2,-Protrusion,-Protrusion])
    cuboid(Cables + [0,Protrusion,2*Protrusion],rounding=1.0,edges=[BACK+LEFT,BACK+RIGHT],anchor=BOTTOM+FWD);
    }
    }
    module SwitchBox() {
    difference() {
    prismoid(SwitchCapBase,SwitchCapTop,SwitchCavity.z,anchor=BOTTOM);
    down(Protrusion)
    cuboid(SwitchCavity + [0,0,2*Protrusion],anchor=BOTTOM);
    hull()
    for (i=[-1,1])
    right(i*SwitchWireOC/2)
    zcyl(CaseOA.z,d=3.0,$fn=8,spin=180/8);
    }
    }
    module Case() {
    difference() {
    cuboid(CaseOA,chamfer=WallThick/2,anchor=BOTTOM+FWD+LEFT);
    translate([WallThick,WallThick + Protrusion,WallThick])
    cuboid(DriverOA + [0,WallThick + Protrusion,0],anchor=BOTTOM+FWD+LEFT);
    translate(SinkOffset + [WallThick,WallThick + 2*Protrusion,WallThick])
    cuboid(SinkOA,anchor=BOTTOM+BACK+LEFT);
    for (i=[-1,1])
    translate([i*SwitchWireOC/2 + CaseOA.x/2,CaseOA.y/2,CaseOA.z/2])
    zcyl(CaseOA.z,d=2.0,anchor=BOTTOM,$fn=8,spin=180/8);
    translate([WallThick/2,(CaseOA.y + LidOA.z),WallThick/2])
    xrot(90)
    scale([1,1,2])
    Lid();
    }
    }
    // Build it
    if (Layout == "Switch")
    SwitchBox();
    if (Layout == "Case")
    Case();
    if (Layout == "Lid")
    Lid();
    if (Layout == "LidSVG")
    projection(cut=true)
    Lid();
    if (Layout == "Show") {
    Case();
    translate(SinkOffset + [WallThick,WallThick + 2*Protrusion,WallThick])
    color("Gray",0.7)
    cuboid(SinkOA,anchor=BOTTOM+BACK+LEFT);
    translate([CaseOA.x/2,CaseOA.y/2,CaseOA.z])
    SwitchBox();
    translate([WallThick/2,CaseOA.y,WallThick/2])
    xrot(90)
    color("Gray",0.7)
    Lid();
    }
    if (Layout == "Build") {
    fwd(Gap)
    xrot(90)
    Case();
    translate([CaseOA.x/2,(Gap + CaseOA.y/2),0])
    SwitchBox();
    }
  • HQ Sixteen: Bobbin Winder Adjustment and Unwind Adapter

    HQ Sixteen: Bobbin Winder Adjustment and Unwind Adapter

    The Industrial Age bobbin winder for Mary’s HQ Sixteen long-arm machine bunched the thread on one end of the bobbin, rather than distributing it in even layers as it should. Tinkering with the thread tension setting being unavailing, I settled in for some debugging.

    After filling two bobbins from a spool of the thread Mary uses for practice quilts, I decided I should reuse the thread. Mounting the filled bobbin on a 6 mm horizontal shaft attached to the vertical pin normally locating the spool let the thread pay out in the proper orientation, with a duct-tape lashup holding the shaft in place:

    HQ Sixteen bobbin unwind adapter - expedient version
    HQ Sixteen bobbin unwind adapter – expedient version

    I added the stack of washers to keep the bobbin away from the duct tape after having the tape’s adhesive migrate onto the spinning bobbin.

    The thread from the spool or, in my case, a filled bobbin, passes between a pair of tension disks on its way to the bobbin spun by the motor:

    HQ Sixteen bobbin winder - thread path
    HQ Sixteen bobbin winder – thread path

    A conical spring presses the tension disks together, with the thread clamped between them:

    HQ Sixteen bobbin winder - tension disk overview
    HQ Sixteen bobbin winder – tension disk overview

    The instructions suggest using “the lightest tension possible”, but backing the nut off to hang by its fingernails had no effect. The spring has a bent end passing through the slotted shaft, so rotation of the disks won’t unscrew the nut.

    The washer under the mounting screw left slight scars in the black oxide finish on the fixture, presumably from previous attempts to adjust the thing:

    HQ Sixteen bobbin winder - tension disk base
    HQ Sixteen bobbin winder – tension disk base

    The threaded shaft is not exactly parallel to the base, because the upright arm is slightly over-bent, but I think that has no effect on the outcome, because the thread path doesn’t depend on the disk angle.

    Because the thread accumulated on the outer side of the bobbin (to the right in that picture), I loosened the mounting screw and shoved the fixture all the way to the left. That should, if anything, bias the thread accumulation to the other (inner) side of the bobbin.

    As it turned out, relocating the tension disks caused the thread to distribute evenly across the bobbin, with only occasional hesitations and no significant accumulations; Mary pronounced the result entirely satisfactory.

    The motor dataplate says it runs at 7000 RPM, so the 3/4 inch O-ring drives the 4 inch wheel at about 1300 RPM. This was sufficiently terrifying I immediately set up a triac speed control (intended for a router) to throttle it down, but with the bobbins now filling properly we run the motor at full speed and it fills a bobbin in 23 seconds flat.

    After we filled half a dozen bobbins with blue thread for the quilt project, I conjured an adapter from the vasty digital deep for a snippet of 6 mm rod with a D-shaped end:

    Bobbin Unwind Adapter - solid model - show
    Bobbin Unwind Adapter – solid model – show

    The adapter builds on one leg, with a brim for stability:

    HQ Sixteen bobbin unwind adapter - on platform
    HQ Sixteen bobbin unwind adapter – on platform

    And looks like it belongs there:

    HQ Sixteen bobbin unwind adapter - installed
    HQ Sixteen bobbin unwind adapter – installed

    It’s now in the box of HQ Sixteen bobbins, where we both hope it will remain undisturbed forevermore.

    Although the vertical pin locating the spools (and holding the adapter) is nominally 6 mm, burrs in the chrome plating prevented the bobbin’s 6 mm bore from sliding over it. In retrospect, that prevented me from just dropping the bobbin on the pin and unwinding the thread over the side of the bobbin, which likely avoided some serious-to-lethal thread tangles.

    After all that debugging, I had several bobbins full of well-worn thread, so:

    • Chuck a chopstick in the mini-lathe
    • Tape thread to chopstick
    • Put bobbin on another 6 mm shaft
    • Run lathe at a reasonable speed
    • Produce what looks very much like a cocoon
    HQ Sixteen bobbin unwind adapter - thread cocoon
    HQ Sixteen bobbin unwind adapter – thread cocoon

    All’s well that ends well.

    The OpenSCAD source code as a GitHub Gist:

    // HQ Sixteen Bobbin Winder – Unwind adapter
    // Ed Nisley – KE4ZNU
    // 2026-03-27
    include <BOSL2/std.scad>
    Layout = "Show"; // [Show,Build]
    /* [Hidden] */
    HoleWindage = 0.2;
    Protrusion = 0.01;
    Gap = 5.0;
    $fn=5*3*4;
    WallThick = 2.0;
    SpoolRodOD = 6.03; // vertical spool rod
    Kerf = 0.5;
    BobbinRodOD = 6.0 + HoleWindage; // horizontal bobbin rod
    BobbinRodDee = 4.95; // … remaining rod
    DeeLength = 20.0; // … recess depth
    DeeRodCyl = 28.0; // … overall rod length
    AdapterOD = BobbinRodOD + 2*WallThick;
    AdapterOAH = 1.5*AdapterOD;
    AdapterOAL = AdapterOD + DeeLength;
    //—–
    // Define things
    // Surplus-deal 6 mm rod with a lengthy flat on one end
    module DeeRod() {
    union() {
    intersection() {
    xcyl(DeeLength + Protrusion,d=BobbinRodOD,anchor=RIGHT);
    down((BobbinRodOD – BobbinRodDee)/2)
    cuboid([DeeLength + Protrusion,BobbinRodOD,BobbinRodDee],anchor=RIGHT);
    }
    xcyl(DeeRodCyl,d=BobbinRodOD,anchor=LEFT);
    }
    }
    module Adapter() {
    difference() {
    union() {
    cyl(AdapterOAH,d=AdapterOD,rounding=WallThick/2);
    xcyl(AdapterOAL – AdapterOD/2,d=AdapterOD,anchor=LEFT);
    }
    zcyl(AdapterOAH + 2*Protrusion,d=SpoolRodOD);
    cuboid([AdapterOD+2*Protrusion,Kerf,AdapterOAH+2*Protrusion]);
    right(AdapterOD/2 + DeeLength + Protrusion)
    DeeRod();
    }
    }
    //—–
    // Build it
    if (Layout == "Show") {
    Adapter();
    color("Green",0.5)
    zcyl(3*AdapterOAH,d=SpoolRodOD);
    color("Magenta",0.5)
    right(AdapterOD/2 + DeeLength + Protrusion)
    DeeRod();
    }
    if (Layout == "Build")
    up(AdapterOD/2 + DeeLength)
    yrot(90)
    Adapter();

  • Prusa MK4 Foam Feet: Embiggened

    Prusa MK4 Foam Feet: Embiggened

    It turns out the Prusa MK4 weighs enough to squish my add-on foam feet to about half their original thickness:

    Prusa MK4 Foam Feet - embiggened
    Prusa MK4 Foam Feet – embiggened

    The two in the front are 30×30 mm and the shorter (more squished) foot was under the right rear of the MK4 where the power supply lives.

    The larger feet (one installed) are 60×60 mm and, with the same weight supported on four times the area, should squish much less.

    Stipulated: I can’t hear the difference either way.

    This project was precipitated by finding a large scrap of exercise mat foam in a place where it shouldn’t have been.