whistles

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

Neale Pickett  ·  2026-01-28

fipple.scad

 1include <BOSL2/std.scad>
 2
 3// TODO: I don't think the windway is centered over the blade.
 4// TODO: Blade undercut
 5// TODO: Block undercut and overcut
 6// TODO: Window height?
 7
 8$fn = 180;
 9
10ang = 60;
11od = 25;
12id = 23;
13height = 50;
14
15// Just the crust of a pie_slice.
16module pie_crust(h, ang, r, thickness=5) {
17  difference() {
18    pie_slice(h=h, ang=ang, r=r, spin=-ang/2);
19    translate([0, 0, -1]) cylinder(h=h+2, r=r-thickness);
20  }
21}
22
23// I'm using terminology from https://www.kingsmills.us/jubilee/store/fipterm.htm
24
25difference() {
26  cylinder(d=od, h=height);
27
28  // Mouthpiece shaping
29  mouth_taper_d = od * 1.5;
30  translate([-od/2, 0, height]) {
31    rotate([90, 0, 10]) cylinder(h=100, d=mouth_taper_d, center=true);
32    rotate([90, 0, -10]) cylinder(h=100, d=mouth_taper_d, center=true);
33  }
34
35  // Marat's idea: skew everything at 45° for nice overhangs
36  skew(azy=45) {
37    // Inner bore
38    // Scoot it down by id/2 so it clears away all material at the bottom despite the skew
39    translate([0, 0, -id/2]) cylinder(d=id, h=height - mouth_taper_d/2);
40
41    // Everything from here on happens below the curve
42    translate([0, 0, height-od]) {
43      // Windway
44      pie_crust(h=100, ang=ang, r=(od-1)/2, thickness=1);
45
46      // Blade overcut
47      // XXX: I would like to be able to provide a height to something and have it intersect the outside diameter at that height
48      // Shoot a cutting laser out from the axis.
49      translate([0, 0, 0]) rotate(-45/2) rotate_extrude(angle=45) skew(ayx=-50) translate([id/2-1, 0]) square(10);
50    }
51  }
52}
53
54//skew(axz=-20) pie_crust(h=50, ang=45, r=100, thickness=1);
55//rotate(-45/2) rotate_extrude(angle=45) skew(ayx=20) square(40);
56//skew(azx=20) rotate(-45/2) pie_slice(h=40, ang=45, r=40);