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