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