Neale Pickett
·
2025-02-20
chanter.scad
1include <../common.scad>
2
3height = 360.0;
4od = 16.0;
5od_derlin = od + 0.5;
6id_bot = 13.2;
7id_top = 5.51;
8cut_height = 155; // Where to cut it in half
9
10module tonehole(h=10, d=10, undercut=0) {
11 rotate([0, 0, -90])
12 translate([od/2, 0, h]) {
13 rotate([0, -90+undercut, 0]) {
14 // Scoot it down a hair so it will penetrate the entire tube when rotated
15 translate([0, 0, -od/2]) {
16 cylinder(h=od, d=d);
17 }
18 }
19 }
20}
21
22
23// Something like David Daye's Penny Chanter,
24// based on my measurements and undercut hints on David's web site.
25// This is symmetrical, so both pieces can be printed at the same time,
26// with color changes
27module chanter() {
28 difference () {
29 union() {
30 // The core part of the instrument is this brass tube
31 difference() {
32 brass() cylinder(h=height, d=od);
33
34 // Seam guides
35 translate([0, od/2, 0]) cylinder(d=1, h=400);
36 }
37
38 // David adds this outer Derlin tube as an upgrade option
39 difference() {
40 derlin() translate([0, 0, 40.0]) cylinder(h=290, d=od_derlin);
41
42 // The slits up the sides serve three purposes:
43 // 1. directs the slicer to place seams in it (and not on the face)
44 // 2. provides alignment guides for attaching the two pieces
45 // 3. looks like an intentional stylistic thing
46 rotate([0, 0, 85]) translate([0, od_derlin/2, 0]) cylinder(d=1, h=cut_height+20); // overlap
47 rotate([0, 0, -85]) translate([0, od_derlin/2, cut_height-20]) cylinder(d=1, h=400);
48 }
49
50 // These little doodads are probably just to hide the Derlin seam
51 ivory() translate([0, 0, 30.0]) cylinder(h=12, d=22.0);
52 ivory() translate([0, 0, height - 30.0 - 12]) cylinder(h=12, d=22.0);
53 }
54
55 // Seam guides
56 translate([0, 11, 0]) cylinder(d=1, h=400);
57
58 // Inner bore, which runs up to the place where the reed drops in
59 translate([0, 0, 0]) cylinder(h=337.01, d1=id_bot, d2=id_top);
60 translate([0, 0, 337]) cylinder(h=23.1, d1=id_top, d2=7.1);
61
62 // I totally dig David's minimalist aesthetic
63 translate([0, 0, 3]) rings(d=16.0);
64
65 // Stamp my name on it
66 difference() {
67 translate([0, 0, 307]) {
68 rotate([90, 0, 180]) {
69 linear_extrude(50) {
70 translate([0, 5]) text("neale", font="Fontdiner Swanky", valign="bottom", size=3, halign="center");
71 translate([0, 0]) text("2024-2", font="Fontdiner Swanky", valign="bottom", size=3, halign="center");
72 }
73 }
74 }
75 cylinder(h=360, d=od-0.5);
76 }
77
78
79 // Tone Holes!
80 // XXX: Undercut angle should be taken into account here
81 tonehole(h=57.1, d=6.68); // E-
82 tonehole(h=87.0, d=4.25); // E
83 tonehole(h=118.0, d=8.33); // F#
84 tonehole(h=149.0, d=5.51, undercut=-15); // G
85 tonehole(h=184.5, d=7.75, undercut=15); // A
86 tonehole(h=184.5, d=7.75, undercut=-15); // A (wide undercut)
87 tonehole(h=219.0, d=6.72, undercut=15); // B
88 tonehole(h=250.0, d=5.50, undercut=30); // C
89 rotate([0, 0, 180]) tonehole(h=270.0, d=7.11, undercut=30); // D
90 }
91}
92
93module tenon(top=false, h=cut_height, od=od, depth=20, thickness=2) {
94 module cut() {
95 cylinder(h=cut_height+depth, d=od-thickness-clearance);
96 cylinder(h=cut_height, d=50);
97 }
98
99 if (top) {
100 difference() {
101 children();
102 cut();
103 }
104 } else {
105 intersection() {
106 children();
107 cut();
108 }
109 }
110}
111
112chanter();
113//translate([0, 50, 360]) rotate([180, 0, 0]) chanter();
114