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();