Neale Pickett
·
2025-12-30
chanter.scad
1// Based on O'Flynn Rowsome Chanter Measurements
2// http://pipers.ie/source/media/?mediaId=31307&galleryId=1353
3
4include <BOSL/shapes.scad>
5use <../flare.scad>
6use <./sigil.scad>
7
8ver = "D";
9rev = "pre";
10date = "1900-01-01";
11
12$fn =$preview?30:120;
13
14// Diameter of screw hole
15Screwhole = 4; // [1:10]
16
17module metal() {
18 color("silver") children();
19}
20
21module leather() {
22 color("sienna") children();
23}
24
25module ivory() {
26 color("wheat") children();
27}
28
29module wood() {
30 color("#222") children();
31}
32
33// A compression fitting, basically.
34module ringyding(h, d) {
35 ivory() resize([d, d, h]) sphere();
36}
37
38// A tonehole with :
39// * height=h
40// * transverse diameter = td
41// * longitudinal diameter = ld
42// * chimney height = ch
43// * undercut multiplier
44module tonehole(h, td, ld, ch, undercut=1) {
45 translate([0, 0, h]) {
46 rotate(a=90, v=[1, 0, 0]) {
47 resize([td*undercut, ld*undercut, ch]) {
48 cylinder(h=1, d2=100, d1=100*undercut);
49 }
50 }
51 }
52}
53
54height = 357.2;
55insertion = 28; // length of metal at each end
56
57module chanter() {
58 // We start by building everything up in a union(),
59 // then we ream it with difference().
60 difference() {
61 union() {
62 // Inner metal tube
63 metal() cylinder(h=height, d=16);
64
65 // Wood body
66 translate([0, 0, 30]) wood() cylinder(h=height-60, d1=20.4, d2=18);
67
68 // Bottom wood transition
69 translate([0, 0, 28]) ivory() flare(h=12, d1=28.0, d2=23.0);
70
71 // Top wood transition : from O'Flynn Rowsome measurements
72 // https://pipers.ie/archive/media/?mediaId=31307&galleryId=1353
73 translate([0, 0, height-28-12]) ivory() flare(h=12, d1=21.0, d2=25.0);
74
75 if (false) {
76 translate([0, 0, 290.4]) ringyding(h=5.5, d=20);
77 translate([0, 0, 305.6]) ringyding(h=4.3, d=19);
78 translate([0, 0, 317.6]) ringyding(h=5.5, d=18);
79 translate([0, 0, 318.5]) ivory() fillet(h=8.5, d1=17, d2=24); // eliminate overhang
80 translate([0, 0, 328.3]) ringyding(h=8, d=25.4);
81 }
82 }
83
84 // Some engraved rings for style
85 difference() {
86 for (z = [6, 8, 20, 22]) {
87 translate([0, 0, z]) cylinder(h=0.6, d=25);
88 }
89 cylinder(h=300, d=15);
90 }
91
92 // Inner bore
93 translate([0, 0, -1]) cylinder(h=338.01, d1=13.2, d2=5.51);
94 translate([0, 0, 337]) cylinder(h=21, d1=5.51, d2=7.1);
95
96 // Tone Holes!
97 translate([0, 0, 2]) { // Adjust z offset to tune bottom D
98 rotate(0) tonehole(53.3, 6.94, 7.16, 14.1); // E♭
99 rotate(0) tonehole(84.7, 5.25, 5.49, 14); // E
100 rotate(0) tonehole(116.2, 8.39, 8.88, 12.7); // F♯
101 rotate(0) tonehole(147.4, 6.98, 7.44, 12.2); // G
102 rotate(0) tonehole(182, 8.85, 9.06, 11.4); // A
103 rotate(0) tonehole(216.2, 6.89, 6.96, 11.3); // B
104 rotate(0) tonehole(246.4, 6.42, 6.57, 11.3); // C♯
105 rotate(180) tonehole(268, 6.04, 7.95, 10.1, 1.2); // back D
106 }
107
108 translate([0, 0, height - 62]) rotate([0, 0, 90]) sigil(18, date, ver);
109 }
110}
111
112module split(top=false) {
113 h=162; // Where to make the cut
114 d=14; // Diameter of the tenon
115 depth=15; // Insertion depth of the tenon
116 clearance=0.12; // Gap between tenon and mortise
117
118 module cut(id) {
119 translate([0, 0, h+depth]) cylinder(h=id/2, d1=id, d2=0);
120 cylinder(h=h+depth, d=id);
121 cylinder(h=h, d=id+40);
122 }
123
124 if (top) {
125 translate([0, 0, -h]) {
126 difference() {
127 chanter();
128 cut(d+clearance);
129 }
130 }
131 } else {
132 intersection() {
133 chanter();
134 cut(d);
135 }
136 }
137}
138
139chanter();
140