uilleann

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

uilleann / pickett-d
Neale Pickett  ·  2025-12-30

chanter.scad

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