uilleann

3d printable Uilleann bagpipes
git clone https://git.woozle.org/neale/uilleann.git

commit
857b914
parent
45e38bc
author
Neale Pickett
date
2025-12-30 10:24:33 -0700 MST
Some initial work on a C chanter
1 files changed,  +150, -0
A lyons-rowsome-c/chanter.scad
+150, -0
  1@@ -0,0 +1,150 @@
  2+// Based on Lyons Rowsome Chanter Measurements
  3+// https://pipers.ie/archive/gallery/?galleryId=924
  4+
  5+include <BOSL/shapes.scad>
  6+use <./sigil.scad>
  7+
  8+rev = "pre";
  9+stamp = str(rev);
 10+
 11+$fn =120;
 12+
 13+// Diameter of screw hole
 14+Screwhole = 4; // [1:10]
 15+
 16+module metal() {
 17+  color("silver") children();
 18+}
 19+
 20+module ivory() {
 21+  color("wheat") children();
 22+}
 23+
 24+module wood() {
 25+  color("#222") children();
 26+}
 27+
 28+// A compression fitting, basically.
 29+module ringyding(h, d) {
 30+  ivory() cyl(l=h, d=d, fillet=h/2);
 31+}
 32+
 33+// A fillet is a sort of trumpet bell shape
 34+module fillet(h, d1, d2) {
 35+  rmin = min(d1, d2)/2;
 36+  rmax = max(d1, d2)/2;
 37+  r = rmax-rmin;
 38+  rotate_extrude(convexity=4) {
 39+    difference() {
 40+      square([rmax, h]);
 41+      translate([rmax, d1>d2?h:0]) resize([r*2, h*2]) circle();
 42+    }
 43+  }
 44+}
 45+
 46+// A tonehole with :
 47+// * height=h
 48+// * transverse diameter = td
 49+// * longitudinal diameter = ld
 50+// * chimney height = ch
 51+// * undercut multiplier
 52+module tonehole(h, td, ld, ch, undercut=1) {
 53+  translate([0, 0, h]) {
 54+    rotate(a=90, v=[1, 0, 0]) {
 55+      resize([td*undercut, ld*undercut, ch]) {
 56+        cylinder(h=1, d2=100, d1=100*undercut);
 57+      }
 58+    }
 59+  }
 60+}
 61+
 62+module chanter() {
 63+  // We start by building everything up in a union(),
 64+  // then we ream it with difference().
 65+  difference() {
 66+    union() {
 67+      // Inner metal tube
 68+      metal() cylinder(h=407, d=16);
 69+            
 70+      // Wood body
 71+      translate([0, 0, 26.7]) wood() cylinder(h=258, d1=20.4, d2=18);
 72+
 73+      // Bottom decor
 74+      translate([0, 0, 23]) ivory() {
 75+        h = 14;
 76+        d1 = 29.3;
 77+        d2 = 22.0;
 78+
 79+        cyl(l=h/3, d=d1, fillet=h/3/2);
 80+        fillet(h=h, d1=d1, d2=d2-1);
 81+        translate([0, 0, h]) cyl(l=h/4, d=d2, fillet=h/4/2);
 82+      }
 83+            
 84+      // Top wood transition : from O'Flynn Rowsome measurements
 85+      // https://pipers.ie/archive/media/?mediaId=31307&galleryId=1353
 86+      translate([0, 0, 290.4]) ringyding(h=5.5, d=20);
 87+      translate([0, 0, 305.6]) ringyding(h=4.3, d=19);
 88+      translate([0, 0, 317.6]) ringyding(h=5.5, d=18);
 89+      translate([0, 0, 318.5]) ivory() fillet(h=8.5, d1=17, d2=24); // eliminate overhang
 90+      translate([0, 0, 328.3]) ringyding(h=8, d=25.4);
 91+
 92+      // This protects the reed and provides a place for tubing to connect
 93+      translate([0, 0, 324.5]) metal() cylinder(h=32.7, d=16); // O'Flynn Rowsome had d=14.8mm
 94+    }
 95+
 96+    // Some engraved rings for style
 97+    difference() {
 98+      for (z = [5, 18, 20]) {
 99+        translate([0, 0, z]) cylinder(h=0.6, d=25);
100+      }
101+      cylinder(h=300, d=16.6);
102+    }
103+    // Inner bore
104+    translate([0, 0,   -1]) cylinder(h=338.01, d1=13.2, d2=5.51);
105+    translate([0, 0, 337]) cylinder(h=21, d1=5.51, d2=7.1);
106+
107+    // Tone Holes!
108+    translate([0, 0, 2]) { // Adjust z offset to tune bottom D
109+      rotate(0) tonehole(53.3, 6.94, 7.16, 14.1); // E♭
110+      rotate(0) tonehole(84.7, 5.25, 5.49, 14); // E
111+      rotate(0) tonehole(116.2, 8.39, 8.88, 12.7); // F♯
112+      rotate(0) tonehole(147.4, 6.98, 7.44, 12.2); //  G
113+      rotate(0) tonehole(182, 8.85, 9.06, 11.4); // A
114+      rotate(0) tonehole(216.2, 6.89, 6.96, 11.3); // B
115+      rotate(0) tonehole(246.4, 6.42, 6.57, 11.3); // C♯
116+      rotate(180) tonehole(268, 6.04, 7.95, 10.1, 1.2); // back D
117+    }
118+
119+    translate([0, 0, 260]) rotate([0, 0, 90]) sigil(18, "ntp", stamp);
120+  }
121+}
122+
123+module split(top=false) {
124+  h=162; // Where to make the cut
125+  d=14; // Diameter of the tenon
126+  depth=15; // Insertion depth of the tenon
127+  clearance=0.12; // Gap between tenon and mortise
128+  
129+  module cut(id) {
130+    translate([0, 0, h+depth]) cylinder(h=id/2, d1=id, d2=0);
131+    cylinder(h=h+depth, d=id);
132+    cylinder(h=h, d=id+40);
133+  }
134+
135+  if (top) {
136+    translate([0, 0, -h]) {
137+      difference() {
138+        chanter();
139+        cut(d+clearance);
140+      }
141+    }
142+  } else {
143+    intersection() {
144+      chanter();
145+      cut(d);
146+    }
147+  }
148+}
149+
150+chanter();
151+