GuitarModels/GuitarFretboards.scad

182 lines
6.0 KiB
OpenSCAD

// Fender standard is 25.5"
Guitar_Scale_Length_In = 25.5;
// Convert to mm (1" = 25.4mm)
//Guitar_Scale_Length_mm = Guitar_Scale_Length_In * 25.4;
// This conversion ends up with 647.7mm, but 648mm has nice round number 865mm on the -5 fret too! Regular P-bass is 864mm
Guitar_Scale_Length_mm = 648;
// Extending the Strat by 5 frets gives a P-Bass
Bass_Fret = -5;
PBass_Nut_Width_In = 1.625; // (43mm)
JBass_Nut_Width_In = 1.5; // (38mm)
Strat_Nut_Width_In = 1.65; // (42mm)
function fret_scale_length(n) = Guitar_Scale_Length_mm * 2^(-n/12);
function lerp(start, end, amount) = start + (end-start)*amount;
echo(str("Guitar scale length is ", fret_scale_length(0), "mm"));
echo(str("Bass scale length is ", fret_scale_length(Bass_Fret), "mm"));
// Our modules need to fit in our 25x20cm build area
// This can be obtained by [-5,0), [0,7), [7,19), [19,bridge] modules.
module radiused_chord(w, r, points=12) {
// w <= abs(r)*2
// Negative r possible for mirroring across y-axis
angle = asin(0.5*w/r);
angles = [
for (i = [0:points-1])
let (f = -0.5 + i/(points-1))
f * 2 * angle
];
x0 = r*cos(angle);
coords = [
for (th = angles)
let (
x = r*cos(th) - x0,
y = r*sin(th)
)
[x,y]
];
polygon(coords);
}
module c_text(s, size)
text(s, size=size, halign="center", valign="center", font="Noto Sans");
epsilon = 0.0001;
module to3d()
{linear_extrude(epsilon) children();}
nut_width = 38;
bridge_width = nut_width + 40;
fretboard_radius = 5.5*25.4;
neck_radius = 20;
color("red")
rotate([0,90]) hull(){
translate([0,0,fret_scale_length(Bass_Fret)/4])
to3d() radiused_chord(lerp(bridge_width, nut_width, 1/4), -fretboard_radius);
translate([0,0,fret_scale_length(Bass_Fret)])
to3d() radiused_chord(nut_width, -fretboard_radius);
}
// color("blue")
// rotate([0,90]) hull(){
// translate([0,-bridge_width/2,0])
// cube([20, bridge_width, 1]);
// translate([0,0,fret_scale_length(Bass_Fret)])
// to3d() scale([0.25,1]) radiused_chord(nut_width, neck_radius);
// }
module frets_and_markers(min_fret=-5, max_fret=36, width=bridge_width) {
// Fret wire placeholder model
for (x = [for (i = [min_fret:max_fret]) fret_scale_length(i)])
translate([x, -width/2, 0])
cube([1, width, 12]);
// Fret dots
for (octave = [0:3])
for (fret = [3, 5, 7, 9]) {
i = fret + (octave*12);
if (i > min_fret && i <= max_fret)
translate([(fret_scale_length(i)+fret_scale_length(i-1))/2,0,0])
//cylinder(h=10, r=4);
linear_extrude(10) c_text(str(fret), size=8);
}
// Octave markers
for (i = [0, 12, 24, 36]) if (i > min_fret && i <= max_fret) hull(){
translate([(fret_scale_length(i)+fret_scale_length(i-1))/2,20,0]) cylinder(h=10, r=3);
translate([(fret_scale_length(i)+fret_scale_length(i-1))/2,-20,0]) cylinder(h=10, r=1);
}
// Bass extension
if (min_fret < -1)
for (i = [min_fret+1:-1])
translate([(fret_scale_length(i)+fret_scale_length(i-1))/2,0,0])
linear_extrude(10) c_text(str(i), size=12);
}
Module_Length = 220; // Printer can do up to 250mm, the bass fret run is 217mm. Don't forget overlapping joins!
Module_Overhang = 20;
Module_Bridge_Offset = -15; //80 240
module Connector() {
translate([0,0,-15])
linear_extrude(10)
polygon([[0,5],[0,-5],[Module_Overhang,-15],[Module_Overhang,15]]);
}
module Body(thickness=20, width=90) {
color("blue", 0.5)
translate([Module_Bridge_Offset, -width/2, -thickness])
cube([Module_Length, width, thickness]);
frets_and_markers(20, 24);
translate([Module_Bridge_Offset+Module_Length, 0, 0]) Connector();
// Bridge
translate([-20, -bridge_width/2, 3])
cube([20, bridge_width, 10]);
}
module Neck1(thickness=18, width=70) {
color([0,0.5,1], 0.5)
translate([Module_Bridge_Offset+Module_Length, -width/2, -thickness])
cube([Module_Length, width, thickness]);
frets_and_markers(8, 20);
translate([Module_Bridge_Offset+Module_Length*2, 0, 0]) Connector();
}
module Neck2(thickness=17, width=60) {
color([0.5,0,1], 0.5)
translate([Module_Bridge_Offset+Module_Length*2, -width/2, -thickness])
cube([Module_Length, width, thickness]);
frets_and_markers(1, 7);
translate([Module_Bridge_Offset+Module_Length*3, 0, 0]) Connector();
}
module Neck_Bass(thickness=16, width=40) {
color([1,0,0.5], 0.5)
translate([Module_Bridge_Offset+Module_Length*3, -width/2, -thickness])
cube([Module_Length+Module_Overhang, width, thickness]);
frets_and_markers(-5, 0);
}
// Structural Aluminium
density_6063 = 2.7; // 6063 alloy is around 2.7g/cm3
echo(str("Weight of one 12mm x 3mm x 1m bar is ", density_6063*1.2*0.3*100, "g"));
echo(str("Weight of three 12mm x 3mm x 1m bar is ", density_6063*3.6*0.3*100, "g"));
echo(str("Weight of one 12x3 and two 10x3 x 1m bars is ", density_6063*3.2*0.3*100, "g"));
echo(str("Weight of one 12mm x 12mm x 1.5mm x 1m channel is roughly ", density_6063*1.2*0.15*100*3, "g"));
echo(str("Weight of one 16mm x 16mm x 1.5mm x 1m channel is roughly ", density_6063*1.6*0.15*100*3, "g"));
module Parallel_Bars(spacing=18, x0=-80) {
// for (y = [-1.5-spacing, -1.5, -1.5+spacing])
// translate([x0, y, -12]) cube([1000,3,12]); // 12mm x 3mm bar, 1m length
translate([x0, -1.5, -12]) cube([1000,3,12]); // 12mm x 3mm bar, 1m length
for (y = [-1.5-spacing, -1.5+spacing])
translate([x0, y, -10]) cube([1000,3,10]); // 12mm x 3mm bar, 1m length
}
module Alu_Channel(x0=-80) {
thickness = 1.5;
y0 = -thickness/2;
//12x12x1.5 channel
translate([x0, -6, -thickness]) cube([1000, 12, thickness]);
for (y = [y0-6, y0+6])
translate([x0, y, -12]) cube([1000, thickness, 12]);
}
// frets_and_markers(-5, 29);
Body(); Neck1(); Neck2();
Neck_Bass();
Parallel_Bars();
translate([0,150,0]) Body();
translate([0,250,0]) Neck1();
translate([0,150,0]) Neck2();
translate([0,250,0]) Neck_Bass();
translate([0,-150,0]) {
Body(); Neck1(); Neck2();
Alu_Channel();
}