uilleann

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

uilleann / daye / chanter
Neale Pickett  ·  2025-02-20

chanter.scad

  1include <../common.scad>
  2
  3height = 360.0;
  4od = 16.0;
  5od_derlin = od + 0.5;
  6id_bot = 13.2;
  7id_top = 5.51;
  8cut_height = 155; // Where to cut it in half
  9
 10module tonehole(h=10, d=10, undercut=0) {
 11  rotate([0, 0, -90])
 12  translate([od/2, 0, h]) {
 13    rotate([0, -90+undercut, 0]) {
 14      // Scoot it down a hair so it will penetrate the entire tube when rotated
 15      translate([0, 0, -od/2]) {
 16        cylinder(h=od, d=d);
 17      }
 18    }
 19  }
 20}
 21
 22
 23// Something like David Daye's Penny Chanter,
 24// based on my measurements and undercut hints on David's web site.
 25// This is symmetrical, so both pieces can be printed at the same time,
 26// with color changes
 27module chanter() {
 28  difference () {
 29    union() {
 30      // The core part of the instrument is this brass tube
 31      difference() {
 32        brass() cylinder(h=height, d=od);
 33
 34        // Seam guides
 35        translate([0, od/2, 0]) cylinder(d=1, h=400);
 36      }
 37
 38      // David adds this outer Derlin tube as an upgrade option
 39      difference() {
 40        derlin() translate([0, 0, 40.0]) cylinder(h=290, d=od_derlin);
 41
 42        // The slits up the sides serve three purposes:
 43        // 1. directs the slicer to place seams in it (and not on the face)
 44        // 2. provides alignment guides for attaching the two pieces
 45        // 3. looks like an intentional stylistic thing
 46        rotate([0, 0, 85]) translate([0, od_derlin/2, 0]) cylinder(d=1, h=cut_height+20); // overlap
 47        rotate([0, 0, -85]) translate([0, od_derlin/2, cut_height-20]) cylinder(d=1, h=400);
 48      }
 49
 50      // These little doodads are probably just to hide the Derlin seam
 51      ivory() translate([0, 0, 30.0]) cylinder(h=12, d=22.0);
 52      ivory() translate([0, 0, height - 30.0 - 12]) cylinder(h=12, d=22.0);
 53    }
 54
 55    // Seam guides
 56    translate([0, 11, 0]) cylinder(d=1, h=400);
 57
 58    // Inner bore, which runs up to the place where the reed drops in
 59    translate([0, 0,   0]) cylinder(h=337.01, d1=id_bot, d2=id_top);
 60    translate([0, 0, 337]) cylinder(h=23.1, d1=id_top, d2=7.1);
 61
 62    // I totally dig David's minimalist aesthetic
 63    translate([0, 0, 3]) rings(d=16.0);
 64
 65    // Stamp my name on it
 66    difference() {
 67      translate([0, 0, 307]) {
 68        rotate([90, 0, 180]) {
 69          linear_extrude(50) {
 70            translate([0, 5]) text("neale", font="Fontdiner Swanky", valign="bottom", size=3, halign="center");
 71            translate([0, 0]) text("2024-2", font="Fontdiner Swanky", valign="bottom", size=3, halign="center");
 72          }
 73        }
 74      }
 75      cylinder(h=360, d=od-0.5);
 76    }
 77
 78
 79    // Tone Holes!
 80    // XXX: Undercut angle should be taken into account here
 81    tonehole(h=57.1, d=6.68); // E-
 82    tonehole(h=87.0, d=4.25); // E
 83    tonehole(h=118.0, d=8.33); // F#
 84    tonehole(h=149.0, d=5.51, undercut=-15); // G
 85    tonehole(h=184.5, d=7.75, undercut=15); // A
 86    tonehole(h=184.5, d=7.75, undercut=-15); // A (wide undercut)
 87    tonehole(h=219.0, d=6.72, undercut=15); // B
 88    tonehole(h=250.0, d=5.50, undercut=30); // C
 89    rotate([0, 0, 180]) tonehole(h=270.0, d=7.11, undercut=30); // D
 90  }
 91}
 92
 93module tenon(top=false, h=cut_height, od=od, depth=20, thickness=2) {
 94  module cut() {
 95        cylinder(h=cut_height+depth, d=od-thickness-clearance);
 96        cylinder(h=cut_height, d=50);
 97  }
 98
 99  if (top) {
100    difference() {
101      children();
102      cut();
103    }
104  } else {
105    intersection() {
106      children();
107      cut();
108    }
109  }
110}
111
112chanter();
113//translate([0, 50, 360]) rotate([180, 0, 0]) chanter();
114