whistles

3d printable Irish whistles
git clone https://git.woozle.org/neale/whistles.git

commit
73c725e
parent
55c7d6d
author
Neale Pickett
date
2025-12-13 19:37:16 -0700 MST
some little tweaks
4 files changed,  +31, -5
M Makefile
+3, -0
 1@@ -3,6 +3,9 @@ all: lowc lowd lowe lowf lowg
 2 clean:
 3 	rm -f *.3mf
 4 
 5+wall-mount.3mf: wall-mount.scad
 6+	openscad -o $@ $<
 7+
 8 %.3mf: whistle.scad whistle.json tonehole.scad ruby.svg
 9 	openscad -o $@ -p whistle.json -P $(VARIANT) -D Section=$(SECTION) $<
10 
M common.scad
+3, -0
 1@@ -4,6 +4,9 @@ $fn = $preview ? 0 : 180;
 2 // clearance in a permanent tenon/mortise joint
 3 clearance = 0.2;
 4 
 5+// www.tauday.com
 6+TAU = PI * 2;
 7+
 8 module brass() {
 9   color("gold") children();
10 }
M whistle.json
+2, -2
 1@@ -2,7 +2,7 @@
 2     "parameterSets": {
 3         "low g": {
 4             "Text": "g",
 5-            "Height": "381",
 6+            "Height": "331",
 7             "InnerDiameter": "18.1",
 8             "Cuts": "[137, 230]",
 9             "TenonDepth": "15",
10@@ -41,7 +41,7 @@
11             "Text": "d",
12             "Height": "469",
13             "InnerDiameter": "20.9",
14-            "Cuts": "[190, 240]",
15+            "Cuts": "[190, 340]",
16             "Hole1": "[293, 7.45]",
17             "Hole2": "[254, 9.50]",
18             "Hole3": "[221, 7.45]",
M whistle.scad
+23, -3
 1@@ -39,12 +39,32 @@ AxianovHoleAngle = 45;
 2 // Depth of the tenon joint. Shallower will be less stable.
 3 TenonDepth = 20;
 4 
 5+// Make the inner bore square, outer body hexagonal?
 6+LowPoly = false;
 7+
 8 /* [ Hidden ] */
 9 sortedCuts = [min(Cuts[0], Cuts[1]), max(Cuts[0], Cuts[1])];
10+id = LowPoly ? (sqrt(TAU) * InnerDiameter/2) : InnerDiameter;
11+od = LowPoly? (sqrt(TAU) * OuterDiameter/2) : OuterDiameter;
12 
13 module whistle() {
14   difference() {
15-    tube(h=Height, id=InnerDiameter, od=OuterDiameter);
16+    if (LowPoly) {
17+      union() {
18+        cylinder(h=Height-70, d=od, $fn=6);
19+        translate([0, 0, Height-70]) cylinder(h=70, d=OuterDiameter);
20+      }
21+    } else {
22+      cylinder(h=Height, d=od);
23+    }
24+
25+    translate([0, 0, -1]) {
26+      if (LowPoly) {
27+        cylinder(h=Height+2, d=id, $fn=4);
28+      } else {
29+        cylinder(h=Height+2, d=InnerDiameter);
30+      }
31+    }
32 
33     // O ring grooves
34     for (z = [Height-7, Height-20]) {
35@@ -54,8 +74,8 @@ module whistle() {
36     // Decoration
37     for (i = [0, sortedCuts[0], sortedCuts[1]]) {
38       translate([0, 0, i + 2]) {
39-        translate([0, 0, 0]) tube(h=1, id=OuterDiameter-0.5, od=OuterDiameter+0.5);
40-        translate([0, 0, 4]) tube(h=1, id=OuterDiameter-0.5, od=OuterDiameter+0.5);
41+        translate([0, 0, 0]) tube(h=1, id=OuterDiameter-0.5, od=OuterDiameter*2);
42+        translate([0, 0, 4]) tube(h=1, id=OuterDiameter-0.5, od=OuterDiameter*2);
43       }
44     }
45