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