uilleann

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

uilleann / lyons-rowsome-c
Neale Pickett  ·  2025-12-30

chanter.scad

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