piccolo

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

commit
84ae56f
parent
28cf438
author
Neale Pickett
date
2025-10-24 17:28:46 -0600 MDT
new idea for the embouchure hole

Apparently you want a nice flat edge to blow against,
but Irish players are going to want to feel a circle under their lip.
Why not do both?
4 files changed,  +27, -12
M Makefile
+1, -1
1@@ -1,6 +1,6 @@
2 all: head.3mf body.3mf
3 
4-rev=$(shell git rev-list --count HEAD)
5+rev=$(shell git log -1 --pretty='format:%cd' --date='format:%Y-%m-%d')
6 
7 %.3mf: %.scad piccolo.scad common.scad
8 	openscad -D rev=\"$(rev)\" -o $@ $<
M body.scad
+10, -6
 1@@ -2,7 +2,9 @@ include <common.scad>
 2 use <MCAD/regular_shapes.scad>
 3 
 4 body_height = 189.68 + 25; // add 25 for built-in barrel
 5-rev = "P"; // revision to stamp on the side
 6+
 7+rev = "preview";
 8+stamp = str(rev);
 9 
10 module body() {
11   d1 = 17.0;
12@@ -21,9 +23,11 @@ module body() {
13     difference() {
14       // Combine cylinders to make it look curvy
15       union() {
16-        bend = 80;
17+        bend_bot = 100;
18+        bend_top = 180;
19         cylinder(h=body_height, d1=d1, d2=(d1+d2)/2);
20-        translate([0, 0, body_height-bend]) cylinder(h=bend, d1=d1, d2=d2);
21+        translate([0, 0, bend_bot]) cylinder(h=bend_top-bend_bot, d1=d1, d2=d2);
22+        translate([0, 0, bend_top]) cylinder(h=body_height-bend_top, d=d2);
23       }
24 
25       // Inner bore, the most important part of the whole instrument!
26@@ -46,12 +50,12 @@ module body() {
27         union() {
28           rotate([90, 90, -90]) {
29             linear_extrude(height=d1, convexity=4) {
30-              translate([-9, -5]) import("ruby.svg");
31+              translate([-8, -5]) import("ruby.svg");
32             }
33           }
34-          rotate([90, 90, -180]) {
35+          rotate([90, 90, -160]) {
36             linear_extrude(height=d1, convexity=10) {
37-              text(rev, size=5, halign="right", valign="center");
38+              text(stamp, size=2, halign="right", valign="center");
39             }
40           }
41         }
M head.3mf
+0, -0
M head.scad
+16, -5
 1@@ -41,11 +41,22 @@ module head() {
 2 
 3       // Embouchure
 4       translate([0, 0, 45]) {
 5-        rotate([90, 0, 0]) {
 6+        rotate([90, 90, 0]) {
 7+          // https://vintagefluteshop.com/articles/embouchure/art5.html
 8+          undercut = 10; // degrees
 9+          corner_r = 1;
10           hull() {
11-            for (y = [0, 4]) {
12-              translate([0, y, 0]) cylinder(d1=13, d2=7, h=id_top);
13+            // This part is where the air hits,
14+            // so we try to optimize for the hard edge.
15+            translate([0, 0, od_top/2]) {
16+              for (vertex = [[-3, -2], [3, -2]]) {
17+                translate(vertex) rotate([180-undercut, 0, 0]) cylinder(r=corner_r, h=(od_top-id_top)/2);
18+              }
19             }
20+
21+            // This part is covered by your lip,
22+            // so how it feels is most important.
23+            cylinder(r=3, h=od_top/2);
24           }
25         }
26       }
27@@ -53,8 +64,8 @@ module head() {
28 
29     // Resonance chamber plate
30     intersection() {
31-      cylinder(h=83, d=id_top+1);
32-      translate([0, 0, 25]) rotate([-60, 30, 0]) cube([200, 200, 0.8], center=true);
33+      cylinder(h=82, d=id_top+1);
34+      translate([0, 0, 25.2]) rotate([-40, 40, 0]) cube([200, 200, 0.8], center=true);
35     }
36 
37     translate([0, 0, 8.5]) torus((od_top+3)/2, (od_top-3)/2);