uilleann

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

uilleann / pickett-d
Neale Pickett  ·  2025-11-27

chanter.scad

  1// Based on O'Flynn Rowsome Chanter Measurements
  2// http://pipers.ie/source/media/?mediaId=31307&galleryId=1353
  3
  4use <./tenon.scad>
  5
  6$fn =60;
  7
  8// Diameter of screw hole
  9Screwhole = 4; // [1:10]
 10
 11module metal() {
 12    color("silver") children();
 13}
 14
 15module leather() {
 16    color("sienna") children();
 17}
 18
 19module ivory() {
 20    color("wheat") children();
 21}
 22
 23module wood() {
 24    color("saddlebrown") children();
 25}
 26
 27// A shape like a hamburger patty
 28module patty(h, d) {
 29    intersection() {
 30        cylinder(h=h, d=d);
 31        translate([0, 0, h/2]) {
 32            resize([d, d, h*3]) {
 33                sphere(d=d);
 34            }
 35        }
 36    }
 37}    
 38
 39// A cylinder with something like a compression fitting around it
 40module ringyding(h, d) {
 41  ivory() resize([d, d, h]) sphere(d=d);
 42}
 43
 44// A fillet is a sort of trumpet bell shape
 45module fillet(h, d1, d2) {
 46  r = abs(d1-d2)/2;
 47  render(convexity=4) {
 48    resize([d1, d1, h]) {
 49      rotate_extrude() {
 50        translate([d2/2, 0, 0]) {
 51          difference() {
 52            square([r, r]);
 53            translate([r, r]) circle(r=r);
 54          }
 55        }
 56      }
 57    }
 58  }
 59}
 60
 61// An upside-down fillet
 62module tellif(h, d2, d1) {
 63    translate([0, 0, h]) mirror([0, 0, 1]) fillet(h, d1, d2);
 64}
 65
 66// Absolutely nothing: helps make the code look better
 67module nothing(h) {
 68}
 69
 70// Just a rotated cylinder
 71// h: height of the *top* of the protrusion
 72// d: height of the protrusion (diameter?)
 73// protrusion: amount of protrusion
 74module bumpout(h, d, protrusion) {
 75    intersection() {
 76        translate([0, -protrusion, h-d]) {
 77            cylinder(h=d, d=20.4);
 78        }
 79        translate([0, -protrusion, h-d/2]) {
 80            sphere(d=protrusion*4);
 81        }
 82        translate([0, 0, h-d]) {
 83            cylinder(h=d, d1=19, d2=50);
 84        }
 85    }
 86}
 87
 88
 89// A tonehole with :
 90// * height=h
 91// * transverse diameter = td
 92// * longitudinal diameter = ld
 93// * chimney height = ch
 94// * undercut multiplier
 95module tonehole(h, td, ld, ch, undercut=1) {
 96  translate([0, 0, h]) {
 97    rotate(a=90, v=[1, 0, 0]) {
 98      resize([td*undercut, ld*undercut, ch]) {
 99        cylinder(h=1, d2=100, d1=100*undercut);
100      }
101    }
102  }
103}
104
105module chanter() {
106    difference() {
107        union() {
108            translate([0, 0,  0]) metal() cylinder(h=22.0, d=17.1);
109            translate([0, 0, 22]) wood() cylinder(h=23.5, d=17.1);  // Rings go around this
110            
111            // Decorative stuff on the bottom
112            translate([0, 0, 32]) {          
113                translate([0, 0, 1.7]) ringyding(h=8, d=28);
114                translate([0, 0, 8.2]) ringyding(h=5, d=22);
115            }
116
117            // A taper on that bottom ring so it will print nicely
118            translate([0, 0, 12]) wood() tellif(h=20, d1=25.5, d2=100);
119            
120            // Main body
121            translate([0, 0, 32.5]) wood() cylinder(h=258, d1=20.4, d2=18);
122            
123            // Top decoration
124          translate([0, 0, 290.4]) {
125                color("silver") cylinder(h=40.8, d=17);
126                
127                translate([0, 0,  0.0]) ringyding(h=5.5, d=20);
128                translate([0, 0,  5.5]) nothing(h=9.7); // metal
129                translate([0, 0, 15.2]) ringyding(h=4.3, d=19);
130                translate([0, 0, 19.5]) nothing(h=6.7); // metal
131                translate([0, 0, 27.2]) ringyding(h=5.5, d=20.2);
132                translate([0, 0, 28.2]) leather() {
133                  // XXX: kludge
134                  tellif(h=8, d2=19, d1=23);
135                  cylinder(h=8, d=19);
136                }
137                translate([0, 0, 37.9]) ringyding(h=8, d=25.4);
138            }
139            
140            // This protects the reed and provides a place for tubing to connect
141            translate([0, 0, 324.5]) metal() cylinder(h=32.7, d=14.8);
142            
143            // Bumpouts
144            // These angles are my best guess based on photos
145            rotate(220) wood() bumpout(161.2, 14.8, 6); // protrusion guessed
146        }
147
148        // Inner bore
149        union() {
150            translate([0, 0, -0.01]) { // Go just a bit past the ends
151                translate([0, 0,   0]) cylinder(h=337.01, d1=13.2, d2=5.51);
152                translate([0, 0, 337]) cylinder(h=21, d1=5.51, d2=7.1);
153            }
154        }
155
156        // Tone Holes!
157        translate([0, 0, 5]) { // This offset is specified nowhere. I'm guessing to make it fit the bumpouts.
158          rotate(180) tonehole(263, 6.04, 7.95, 10.1, 1.2); // back D
159          rotate(0) tonehole(246.4, 6.42, 6.57, 11.3); // C♯
160          rotate(0) tonehole(216.2, 6.89, 6.96, 11.3); // B
161          rotate(0) tonehole(182, 8.85, 9.06, 11.4); // A
162          rotate(0) tonehole(147.4, 6.98, 7.44, 12.2); //  G
163          rotate(0) tonehole(116.2, 8.39, 8.88, 12.7); // F♯
164          rotate(0) tonehole(84.7, 5.25, 5.49, 14); // E
165          rotate(0) tonehole(53.3, 6.94, 7.16, 14.1); // E♭
166        }
167    }
168}
169
170module split(top=false) {
171  tenon(top=top, h=162, d=15, depth=15) {
172    children();
173  }
174}
175
176chanter();