3D preview of Lip-Held Whistle Body
Loading the interactive model…
Interactive 3D model of Lip-Held Whistle Body

Fittings and adapters

Lip-Held Whistle Body

16 views
Bounding box
18.1 × 18.1 × 28.0 mm
Engine
Precision B-rep
Parameters
10
Published
August 17, 2026

Download

Free to download and use. See the terms.

The prompt

// ======================================================== // COMPACT LIP-HELD WHISTLE CANDY — max whistle strength // Not tuned to a specific frequency — optimized for a // loud edge tone via a small throat + sharp step + wide // resonance chamber, with an engraved grip groove. // Units: millimeters (mm) // ======================================================== $fn = 150; // --- Core tube dimensions --- tube_length = 28.0; // overall body length tube_dia = 18.0; // main body diameter (increased for wall strength — acoustics unaffected, set entirely by throat/chamber below) // --- Grip groove (engraved bite/lip channel) --- // A recessed channel is structurally safer than a raised flange: nothing // sticks out to shear off under bite force, teeth/lips settle naturally // into the concave channel, and it's undercut-free to mold/release. groove_depth = 1.5; // radial depth cut into the wall groove_radius = 1.6; // cross-section radius of the grooving tool (sets width ~3.2mm) groove_pos = 4.0; // sits in the inlet taper, where the bore is already narrowing — // wall here is thick, so the groove doesn't undercut it much // --- Inlet taper (smooth jet acceleration into throat) --- inlet_length = 5.0; inlet_start_dia = tube_dia; // --- Throat (jet formation — smaller = faster jet = louder) --- throat_dia = 1.8; throat_length = 1.8; // ~1x throat diameter, just enough to stabilize jet // --- Resonance chamber (sharp step edge = edge-tone generator) --- chamber_length = tube_length - inlet_length - throat_length; // 21.2 mm chamber_dia = 9.0; // wide relative to length = more volume = louder module whistle_body() { cylinder(h = tube_length, d = tube_dia, center = false); } module grip_groove() { // Torus cut into the outer wall at groove_pos, forming a rounded // engraved channel for teeth/lips to sink into translate([0, 0, groove_pos]) rotate_extrude() translate([tube_dia/2 - groove_depth + groove_radius, 0]) circ

Parameters

NameValueRange
Overall body length28 mm10 – 60
Main body diameter18 mm10 – 40
Inlet taper length5 mm1 – 15
Inlet start diameter18 mm2 – 40
Throat diameter1.8 mm0.4 – 6
Throat length1.8 mm0.5 – 10
Resonance chamber diameter9 mm3 – 30
Grip groove radial depth1.5 mm0.2 – 3
Grip groove cross-section radius1.6 mm0.2 – 4
Grip groove Z position4 mm0 – 20

Every value above is a live dimension. Open a model like this in the editor and each one becomes a slider you can drag before exporting.