uilleann

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

uilleann / rowsome
Neale Pickett  ·  2025-01-01

chanter.scad

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