piccolo

3d Printable Piccolo
git clone https://git.woozle.org/neale/piccolo.git

Neale Pickett  ·  2025-10-24

body.scad

 1include <common.scad>
 2use <MCAD/regular_shapes.scad>
 3
 4body_height = 189.68 + 25; // add 25 for built-in barrel
 5
 6rev = "preview";
 7stamp = str(rev);
 8
 9module body() {
10  d1 = 17.0;
11  d2 = 20.4;
12  toneholes = [
13               [40, 7.0],
14               [66, 8.5],
15               [81, 7.0],
16               [106.5, 7.0],
17               [125.0, 7.5],
18               [144.4, 7.0],
19               ];
20
21
22  union() {
23    difference() {
24      // Combine cylinders to make it look curvy
25      union() {
26        bend_bot = 100;
27        bend_top = 180;
28        cylinder(h=body_height, d1=d1, d2=(d1+d2)/2);
29        translate([0, 0, bend_bot]) cylinder(h=bend_top-bend_bot, d1=d1, d2=d2);
30        translate([0, 0, bend_top]) cylinder(h=body_height-bend_top, d=d2);
31      }
32
33      // Inner bore, the most important part of the whole instrument!
34      translate([0, 0, -1]) cylinder(h=body_height+2, d1=id_bot, d2=id_top);
35
36      // Tone holes
37      for (hole = toneholes) {
38        translate([0, 0, hole[0]]) tonehole(d=hole[1]);
39      }
40
41      // Mortise
42      translate([0, 0, body_height-25]) {
43        d = 16.9;
44        cylinder(h=25, d=d);
45        translate([0, 0, -d/2]) cylinder(h=d/2, d1=0, d2=d);
46      }
47
48      translate([0, 0, 4]) intersection() {
49        cylinder_tube(50, d1/2+0.5, 1);
50        union() {
51          rotate([90, 90, -90]) {
52            linear_extrude(height=d1, convexity=4) {
53              translate([-8, -5]) import("ruby.svg");
54            }
55          }
56          rotate([90, 90, -160]) {
57            linear_extrude(height=d1, convexity=10) {
58              text(stamp, size=2, halign="right", valign="center");
59            }
60          }
61        }
62      }
63    }
64
65    // Rings
66    translate([0, 0, body_height-1.5]) torus((d2+3)/2, (d2-3)/2);
67    difference() {
68      // Fat one at the bottom, for good bed adhesion
69      translate([0, 0, 0]) torus((d1+3)/2, (d1-3)/2);
70      translate([0, 0, -25]) cube(50, center=true);
71    }
72  }
73}
74
75body();