piccolo

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

Neale Pickett  ·  2025-12-02

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