This will make a functional high whistle mouthpiece using a 3D printer.
This is hereby released to the Chiff and Fipple Community per the Creative Commons license illustrated in the source code below:
Code: Select all
// Written and designed by Daniel Bingamon
// (CC) 2018 Jubilee Music Instrument Co.
// Released to open source 3/6/18 per Creative Commons Attribution License
//
// The whistle is composed of three parts, the block the main shaft and the shroud,
//
// This is size in order to make a 3D printed mouthpiece for 1/2" CPVC
// The scale function can make this fit other tubes as well.
//
// ABS is recommended in order to acetone polish the finish
//
// Fully Remove the two supports inside the fipple window before testing and playing
//
$fn=48;
module make_shaft()
{
difference() // The first item is made and all other items below it are subtracted from the piece
{
translate([0, 0, 1])
cylinder(d=16.5,h=45, center=true, $fn=75); // Main body
translate([0, 0, 1])
cylinder(d=13.19,h=46, center=true); // Hollow it out
translate([-3.175, 0, 0.0])
cube([6.55,20,37.02]); // Cut out windway
translate([0,-8.1, 17.7])
rotate(a=90,v=[0,1,0], center=true)
cylinder(d=24.00,h=43,center=true); // Curved cut out in beak
translate([-8.5,-16.1, 17])
cube([17.0,20,37.02]); // Flat back of beak for mouth/lip
// Create labium ramp from little angled pieces
translate([2.3, 7.7, -5])
rotate(a=-19,v=[0,0,1], center=true)
rotate(a=15,v=[1,0,0], center=true)
cube([1,2,15]);
translate([1.7, 7.9, -5])
rotate(a=-17,v=[0,0,1], center=true)
rotate(a=15,v=[1,0,0], center=true)
cube([1,2,15]);
translate([1, 8, -5])
rotate(a=-10,v=[0,0,1], center=true)
rotate(a=15,v=[1,0,0], center=true)
cube([1,2,15]);
translate([0.04, 8.06, -5])
rotate(a=-2,v=[0,0,1], center=true)
rotate(a=15,v=[1,0,0], center=true)
cube([1,2,15.1]);
translate([-0.92, 8, -5])
rotate(a=5,v=[0,0,1], center=true)
rotate(a=15,v=[1,0,0], center=true)
cube([1,2,15.1]);
translate([-1.79, 7.85, -5])
rotate(a=11,v=[0,0,1], center=true)
rotate(a=15,v=[1,0,0], center=true)
cube([1,2,15]);
translate([-2.6, 7.6, -5])
rotate(a=16,v=[0,0,1], center=true)
rotate(a=15,v=[1,0,0], center=true)
cube([1,2,15]);
translate([-3.26, 7.37, -5])
rotate(a=19,v=[0,0,1], center=true)
rotate(a=15,v=[1,0,0], center=true)
cube([1,2,15]);
translate([-12,-12, -35])
cube([25,25,25]); // Trim bottom
}
// This section makes the angled internal entrance for the shaft
translate([0, 0, -9.6])
{
rotate_extrude()
{
translate([8.22,-1.2,90])
rotate(a=-88,v=[0,0,1])
circle(d=3.73, $fn=3);
}
}
// Bottom coupler
translate([0,0,-22])
{
difference()
{
cylinder(d=21,h=25.4,center=true,$fn=75);
cylinder(d=16.6,h=25.42,center=true);
}
}
}
module fippleblock()
{
difference()
{
cylinder(d=13.2,h=23.5,center=true); // solid block
translate([-3.275, -3, -11.76])
cube([6.55,10,5.588]); // cutout for windway internal ears
translate([0,-8.1, 5.9])
rotate(a=90,v=[0,1,0], center=true)
cylinder(d=24.00,h=43,center=true); // Beak curvature for block
translate([-8.5,-16.1, 7])
cube([15.0,20,37.02]); // Flat lip surface for beak
rotate(a=5,v=[1,0,0])
translate([-3.275,6.6, -3.3])
cube([6.55,1,15]); // Flaten windway at entrance and eventually windway becomes curved
}
}
// The shroud is the top wide part of the whistle that covers the windway and contacts the players mouth
module shroud()
{
difference()
{
outercylinder(); // make the outer piece
cylinder(d=16.49,h=23.6,center=true); // hollow it out
translate([-3.4, 5, -15.76])
cube([6.55,10,9.588]); // makes outer ears around fipple and reveals window opening
translate([0,-8.1, 5.9])
rotate(a=90,v=[0,1,0], center=true)
cylinder(d=24.00,h=43,center=true); // This cuts out the beak back curve just like the other pieces
translate([-11,-13, 6])
cube([25.0,17,17.02]); // This flatens the bottom of the beak
}
}
// The fence, the .DXF image makes the shape of the fence, available on request
module trifence()
{
scale(0.9)
rotate(a=90,v=[1,0,0])
rotate(a=90,v=[0,1,0])
linear_extrude(height = 0.25)
import (file = "trifence.dxf");
}
// The fence holds up the block at the entrance to the bore so that we don't have droopy lines
module fence(size)
{
translate([0, 0, 0])
cube([0.1,size,5.45]);
translate([0, 0, 0])
cube([0.35,size,5]);
}
module outercylinder()
{
cylinder(d=22,h=23.5,center=true, $fn=93); // This is the actual outer surface of the shroud
translate([0, 0, -11.15]) // This creates an angled rise to the shroud since 3D printers don't like print angles and I don't want to use supports on the exterior
{
rotate_extrude()
{
translate([8.7,-1.2,90])
rotate(a=-105,v=[0,0,1])
circle(d=4.72, $fn=3);
}
}
}
//
// Make the whistle
//
make_shaft();
translate([0,0, 11.75])
//translate([30,0, -23]) //***** Use if pieces made separately
//
// Now make the block
//
difference()
{
fippleblock();
//
// This makes the chamfer on the end of the windway
//
translate([-3.3,4.4,-6.95])
rotate(a=-45,v=[1,0,0], center=true)
rotate(a=18,v=[0,0,1], center=true)
cube([1.0,1,2.5]);
translate([-2.8,4.4,-7.15])
rotate(a=-45,v=[1,0,0], center=true)
rotate(a=18,v=[0,0,1], center=true)
cube([1.0,1.5,2.5]);
translate([-2.15,4.65,-7.2])
rotate(a=-45,v=[1,0,0], center=true)
rotate(a=12,v=[0,0,1], center=true)
cube([1.0,1,2.5]);
translate([-1.4,4.9,-7.2])
rotate(a=-45,v=[1,0,0], center=true)
rotate(a=6,v=[0,0,1], center=true)
cube([1.0,1,2.5]);
translate([-0.46,5,-7.2])
rotate(a=-45,v=[1,0,0], center=true)
rotate(a=0,v=[0,0,1], center=true)
cube([1.0,1,2.5]);
translate([0.5,5,-7.2])
rotate(a=-45,v=[1,0,0], center=true)
rotate(a=-6,v=[0,0,1], center=true)
cube([1.0,1,2.53]);
translate([1.4,5,-7.1])
rotate(a=-45,v=[1,0,0], center=true)
rotate(a=-12,v=[0,0,1], center=true)
cube([1.0,1,2]);
translate([2.2,5,-6.9])
rotate(a=-45,v=[1,0,0], center=true)
rotate(a=-18,v=[0,0,1], center=true)
cube([1.0,1,5]);
}
// This is the bevel that joins the tuning shaft to the main body making it stronger at this point
translate([0, 0, -7.15])
{
rotate_extrude()
{
translate([8.4,-1.2,90])
rotate(a=-145,v=[0,0,1])
circle(d=4.72, $fn=3);
}
}
//
// This produces the fence which keep the body of the block piece from drooping
//
translate([-1.25,-6.6,-3.5])
trifence();
translate([1.25,-6.6,-3.5])
trifence();
//translate([-30,0, -23]) //***** use this other translate instead to reveal shroud separately
translate([0,0, 11.75])
shroud();
// That is it, the end.