[WIP] Revising Steel6String

This commit is contained in:
Luke Hubmayer-Werner 2025-02-17 21:45:22 +10:30
parent 4a351ec4a0
commit 31aff13e42
3 changed files with 136 additions and 172 deletions

View File

@ -14,6 +14,7 @@ include <EllipticalNeck.scad>
shumbucker_h = 20.3;
shumbucker_l = 23.1;
shumbucker_lu = 17.1; // Upper
shumbucker_w1 = 66.4;
shumbucker_w2 = 82.9; // 1.6mm in, a 2.0mm hole on each side
relay_coil_housing_w = 15.2;
@ -661,10 +662,11 @@ module Nylon6String(render_colour_0=true, render_colour_1=true, render_colour_2=
module Steel6String(include_colours, from_fret=0, to_fret=1, reference=false) {
module Steel6String(include_colours, segment=-1, reference=false) {
// Artist Strat clone has a neck thickness of about 20mm at the 12th fret, where we want to overlap the truss rods
// We will probably have to overlap them horizontally, far from ideal, to achieve the desired thinness.
$include_colours = include_colours;
$id_line_0 = "ABS";
$id_line_1 = "2";
$id_lines = ["ABS", "2"];
$guitar_scale_length_mm = Fender_Scale_mm;
$fsl_mm = fret_scale_length(0);
@ -674,7 +676,7 @@ module Steel6String(include_colours, from_fret=0, to_fret=1, reference=false) {
$num_frets = 22;
$num_strings = 6;
// 56mm wide neck
$string_spacing_nut = 10; // 50mm E to e
$string_spacing_nut = 9; // 45mm E to e
$string_spacing_bridge = 11.2; // 56mm E to e
$string_margin = 3; // +6
$neck_width_nut = default_neck_width_nut();
@ -682,113 +684,68 @@ module Steel6String(include_colours, from_fret=0, to_fret=1, reference=false) {
body_width = 96;
$scallop_depth = 2.0;
$fret_widths = default_fret_widths(3.6, 2.4);
$fret_angle = 60;
$fret_angle = 50;
$target_neck_thickness = 16;
// echo(fret_scale_length(8));
// echo(fret_scale_length(9));
rx0 = -40; // Reinforcing rods start
rx1 = rx0+280;
// rx0 = -40; // Reinforcing rods start
// rx1 = rx0+280;
// Artist Strat has about 18cm of headstock and 10cm past bridge on body
y0 = -160;
headstock_length = 36;
y_end = behind_fret(0) + headstock_length;
y_fretboard_end = get_end_of_fretboard();
$segment_cuts = [y0, 0, after_fret(22), after_fret(8), behind_fret(0), y_end];
echo("Segment cuts:", $segment_cuts, "have lengths", [ for (i=[1:len($segment_cuts)-1]) $segment_cuts[i]-$segment_cuts[i-1]]);
target_neck_thickness_additional_points = [];
// target_neck_thickness_additional_points = [[rx0+CF_Tube_Len+20, 22], [0, 22]];
echo(str("Making a Steel 6 String with scale length ", fsl_mm, "mm = ", fsl_mm/25.4, "in and neck width ", neck_width_nut, "mm"));
assert(fsl_mm == Fender_Scale_mm); // Make sure the function correctly uses our changed global
// trussrod_y = 265;
$trussrod_positions = [
[[0, y_end-3, -9.5], [0, 0, 180], "TrussRodSingleAction"],
// [[-8, y0, -32], [1.3, 0, 0], "TrussRod"],
];
$trussrods_extra = 0;
$dowel_positions = [
[ -9, $segment_cuts[4], -10],
[ 9, $segment_cuts[4], -10],
[ -8, $segment_cuts[3], -11],
[ 8, $segment_cuts[3], -11],
[-44, $segment_cuts[2], -22],
[ 44, $segment_cuts[2], -22],
[-44, $segment_cuts[2], -6],
[ 44, $segment_cuts[2], -6],
[-10, $segment_cuts[1], -4],
[ 10, $segment_cuts[1], -4],
[-17, $segment_cuts[1], -16],
[ 17, $segment_cuts[1], -16],
];
$reinforcing_tube_positions = [
[-17, y_end-25-CF_Tube_Len, -4.5],
[ 17, y_end-25-CF_Tube_Len, -4.5],
[ 0, y0, -24],
];
$reinforcing_square_positions = [
[-12, y0, -34],
[ 12, y0, -34],
[-12, y0, -24],
[ 12, y0, -24],
[-24, y0, -24],
[ 24, y0, -24],
];
function CF_Span_Coords(full_length = 700, ply = 3) = [for (i=[0:ply-1]) [0, lerp(0, full_length-CF_Tube_Len, i/(ply-1)), CF_Square_Width*i]];
module CF_Span(full_length = 700, ply = 3, hole = true) {
for (v = CF_Span_Coords(full_length, ply))
translate(v) CFSquare(hole=hole);
}
module MyNeck(inlays_only=false, side_markers_only=false, fret_layers_only=false, engrave_markers=false, remove_fret_layers=false) {
render() TaperNeck(target_neck_thickness_additional_points = target_neck_thickness_additional_points);
}
module truss_rods() {
include_from_fret = (from_fret==0);
x0 = fret_scale_length(to_fret) - get_fret_width(to_fret)/2;
//x1 = fret_scale_length(from_fret) + ((include_from_fret)?1:(-1)) * get_fret_width(from_fret)/2;
x1 = include_from_fret ? x0 : (fret_scale_length(from_fret) - get_fret_width(from_fret)/2); // hacky fix for included headpiece
tolerance = reference ? 0 : 0.6;
rod_mm = 630;
v = [0, 40, -9];
// Nut facing bridge
// o = v[1];
// taper_points = reference ? [] : [x0-o, x1-o];
// translate(v) TrussRod(taper_points = taper_points, tolerance = tolerance, extra = !reference);
// Nut facing headstock
o = v[1];
taper_points = reference ? [] : [rod_mm-(x0-o), rod_mm-(x1-o)];
translate(v + [0, rod_mm, 0]) rotate([0, 0, 180]) TrussRod(taper_points = taper_points, tolerance = tolerance, extra = !reference);
}
reinforcing_tube_positions = flatten([
[
for (i=[-1,1]) each [
// Headside reinforcement
[i*20.5, rx1, -4],
// Bridgeside reinforcement
[i*20.5, rx0, -4],
// [i*17.25, rx0, -10],
// [i*17, rx0, -12],
// [i*3.95, rx0, -16.5],
]
],
[
// Headside reinforcement
// [0, rx1, -4],
// [0, rx1, -11],
// Bridgeside reinforcement
// [0, rx0, -11],
]]);
echo(reinforcing_tube_positions);
// Through span construction
rx2 = fret_scale_length(15) - CF_Tube_Len;
reinforcing_square_positions = flatten([
[
for (i=[-1,1]) each [
// Headside reinforcement
// [i*20.5, rx1, -4],
// Bridgeside reinforcement
[i*12, rx2, -6],
// [i*17.25, rx2, -10],
// [i*17, rx0, -12],
// [i*3.95, rx0, -16.5],
]
],
[
// Headside reinforcement
// [0, rx1, -4],
// [0, rx1, -11],
// Bridgeside reinforcement
// [0, rx0, -11],
]]);
echo(reinforcing_square_positions);
// neck(num_frets=num_frets, num_strings=num_strings, string_margin=string_margin, string_spacing=string_spacing);
// %neck(num_frets=num_frets, num_strings=num_strings, string_margin=string_margin, string_spacing=string_spacing, scallop_depth=scallop_depth, target_neck_thickness=target_neck_thickness);
module NeckFragment(from_fret, to_fret, to_origin=true, include_from_fret=false) {
x0 = fret_scale_length(to_fret) - get_fret_width(to_fret)/2;
x1 = fret_scale_length(from_fret) + ((include_from_fret)?1:(-1)) * get_fret_width(from_fret)/2;
xn = fsl_mm + fret_widths[0];
//translate([0,to_origin ? -x0 : 0,0])
render() difference() {
MyNeck();
translate([-100, 0, -100]) cube([200, x0, 200]);
translate([-100, x1, -100]) cube([200, xn-x1, 200]);
for (v = reinforcing_tube_positions) CFTubeCutout2(v, x0, x1);
for (v = reinforcing_square_positions) CFSquareCutout2(v, x0, x1);
truss_rods();
}
}
module RealPiece(from_fret, to_fret, include_from_fret=false) {
// midpoint = (fret_scale_length(from_fret) - fret_scale_length(to_fret) + (include_from_fret ? fret_width : 0))/2;
module IDText(thickness = 0.2, inset = 0, extra_line=str("F", to_fret)) {
translate([0,0,-8]) rotate([-90,180,180]) translate([0,0,-thickness-inset]) linear_extrude(thickness) {
text(str(id_line_0, id_line_1), size=2.25, halign="center", valign="center", $fn=100);
text(str($id_lines[0], $id_lines[1]), size=2.25, halign="center", valign="center", $fn=100);
translate([0,-3]) text(extra_line, size=2.25, halign="center", valign="center", $fn=100);
}
}
@ -807,46 +764,44 @@ module Steel6String(include_colours, from_fret=0, to_fret=1, reference=false) {
}
}
function string_x(i, y) = (num_strings-i-1)*string_spacing(y) - neck_width(y)/2 + string_margin;
module HeadPiece(label=true) {
string_offsets = [-2.5, 0, 2.5, -2.5, 0, 2.5];
x0 = fret_scale_length(0) + fret_widths[0]/2;
string_offsets = [-2.4, 0, 2.4, -2.4, 0, 2.4];
y0 = behind_fret(0);
end_radius = 12;
x1 = x0 - rx0 + end_radius;
z1 = scallop_depth + max_fret_height;
y1 = y0 + headstock_length;
z0 = $scallop_depth;
z1 = z0 + get_max_fret_height();
z2 = z0 + 2.5; //get_max_fret_height();
module StringHoles() {
for (i = [0:num_strings-1]) translate([string_x(i, x0),0,0]) {
// translate([0,0,z1+string_diameters_mm[i]]) rotate([-105,0,0]) cylinder(h=30, d=string_diameters_mm[i]*2, $fn=cyl_ld_fn);
for (i = [0:$num_strings-1]) translate([string_x(i, y0),y0,0]) {
string_v = [0,0,z1+$string_diameters_mm[i]];
ballend_v = [string_offsets[i],27,-3.5];
hull() {
translate([0,0,z1+string_diameters_mm[i]]) sphere(d=min(2.6, string_diameters_mm[i]*1.2 + 1), $fn=360);
translate([string_offsets[i],27,-3.5]) sphere(d=2.6, $fn=360);
translate(string_v) sphere(d=min(2.6, $string_diameters_mm[i]*1.2 + 1), $fn=360);
translate(ballend_v) sphere(d=2.6, $fn=360);
}
hull() {
// String ball ends are roughly 3mm by 4mm cylinder(d=4, h=3)
// translate([string_offsets[i],29,-3.5]) sphere(d=5.5, $fn=360);
// translate([string_offsets[i],29+11,-17]) sphere(d=7, $fn=360);
translate([string_offsets[i],27,-3.5]) rotate([0, 90, 0]) cylinder(d=4.5, h=3.5, center=true, $fn=360);
translate([string_offsets[i],27+27,-17]) rotate([0, 90, 0]) cylinder(d=6.5, h=5.0, center=true, $fn=360);
translate(ballend_v) rotate([0, 90, 0]) cylinder(d=4.5, h=3.5, center=true, $fn=360);
translate(ballend_v+ballend_v-string_v) rotate([0, 90, 0]) cylinder(d=6.5, h=5.0, center=true, $fn=360);
}
}
}
fw2 = fret_widths[0]/2;
module Label() {
translate([0, lerp(y0, y_end, 0.55), z2-0.5]) linear_extrude(0.5) scale(1.0) import(file = "svgs/Ichthys.plain.svg", center=true);
}
render() difference(){
hull() {
translate([0,fw2,0]) scale([neck_width(x0)/2, 0.01, target_neck_thickness]) sphere(r=1, $fn=360);
translate([0,-rx0-end_radius,0]) scale([neck_width(x1)/2, end_radius, target_neck_thickness*1.0]) sphere(r=1, $fn=360);
}
translate([-500, 0, scallop_depth]) cube([1000, 1000, 1000]);
translate([-500, fw2 - 1000, -500]) cube([1000, 1000, 1000]);
translate([0, -fret_scale_length(0), 0]) {
for (v = reinforcing_tube_positions) CFTubeCutout2(v, x0, x1);
for (v = reinforcing_square_positions) CFSquareCutout2(v, x0, x1);
translate([0,y0,0]) scale([neck_width(y0)/2, 0.01, $target_neck_thickness]) sphere(r=1, $fn=360);
translate([0,y1-end_radius,0]) scale([neck_width(y1)/2, end_radius, $target_neck_thickness*1.0]) sphere(r=1, $fn=360);
}
// Chop excess
translate([-500, y0, z2]) cube([1000, 1000, 1000]);
translate([-500, y0, z0]) rotate([10,0,0]) cube([1000, 1000, 1000]);
translate([-500, y0 - 1000, -500]) cube([1000, 1000, 1000]);
StringHoles();
if (label) translate([-10,fw2+1,-10]) rotate([90,0,0]) linear_extrude(10) {
text(str(id_line_0, id_line_1), size=2.9, halign="center", valign="center", $fn=100);
}
Label();
}
// StringHoles();
}
@ -918,25 +873,29 @@ module Steel6String(include_colours, from_fret=0, to_fret=1, reference=false) {
}
}
}
module Shumbucker() {
translate([-shumbucker_w1/2, -shumbucker_l/2, 0]) cube([shumbucker_w1, shumbucker_l, shumbucker_h]);
translate([-shumbucker_w2/2, -shumbucker_l/2, 0]) cube([shumbucker_w2, shumbucker_l, 4]);
}
bridge_channel_width = 5;
bridge_channel_depth = 7;
if (reference) {
/*translate([0, -fsl_mm, 0]) */union() {
/*translate([0, -$fsl_mm, 0]) */union() {
c_cf = [0.4, 0.5, 0.5];
%MyNeck();
// CF square stacks
truss_rods();
for (v = reinforcing_tube_positions) color(c_cf) translate(v) CFTube();
for (v = reinforcing_square_positions) color(c_cf) translate(v) CFSquare();
color(c_cf) Reinforcements();
translate([0, fret_scale_length(24), 1-shumbucker_h]) Shumbucker();
// Approximate tuner placement
// TunerPlacement();
// Render strings above for spacing reference
string_excess = 80;
for (i = [0:num_strings-1]) {
for (i = [0:$num_strings-1]) {
hull() {
translate([string_x(i, -string_excess), -string_excess, 5]) sphere(d=string_diameters_mm[i], $fn=cyl_ld_fn);
translate([string_x(i, fsl_mm+5), fsl_mm+5, 5]) sphere(d=string_diameters_mm[i], $fn=cyl_ld_fn);
translate([string_x(i, -string_excess), -string_excess, 5]) sphere(d=$string_diameters_mm[i], $fn=cyl_ld_fn);
translate([string_x(i, $fsl_mm+5), $fsl_mm+5, 5]) sphere(d=$string_diameters_mm[i], $fn=cyl_ld_fn);
}
}
}
@ -1054,35 +1013,6 @@ module Steel6String(include_colours, from_fret=0, to_fret=1, reference=false) {
}
}
// echo(fret_scale_length(0) - fret_scale_length(8)); // 225.724
// echo(fret_scale_length(8) - fret_scale_length(24)); // 240.335
// fret_tube(0, 8);
// //translate([30, 0, 0])
// fret_tube(8, 24);
// headpiece();
// UBassTuner();
// fret_tube_filler(24, 100);
// tailpiece();
// bridge();
// Guitar_Scale_Length_mm = Classical_Short_Scale_mm;
// Nylon6String(reference=true);
// translate([0, fret_scale_length(22), 0]) Nylon6String(from_fret=0, to_fret=22);
// translate([0, Guitar_Scale_Length_mm, 0]) rotate([0,0,180]) Nylon6String(reference=true);
// rotate([0,0,180]) Nylon6String(from_fret=-1);
// Nylon6String(from_fret=-2);
// Nylon6String(from_fret=-3);
// Nylon6String(from_fret=-4);
// %Nylon6String(from_fret=-5);
// difference() {
// translate([-15, -60, 0]) cube([50, 120, 8]);
// translate([0, 55, 3]) rotate([180,0,0]) NylonTuner();
// }
// Colour schemes
include <BambuColours.scad>
@ -1095,12 +1025,13 @@ COLOURSCHEME_ABS_BLUE = [BAMBU_ABS_NAVY_BLUE, BAMBU_ABS_AZURE, BAMBU_ABS_AZURE,
COLOURSCHEME_PETGHF_BLUE = [BAMBU_PETGHF_LAKE_BLUE, BAMBU_PETGHF_LAKE_BLUE, "", ""];
// colour_scheme = COLOURSCHEME_ABSGF_CLOWNFISH;
// colour_scheme = COLOURSCHEME_ABS_BLUE;
colour_scheme = COLOURSCHEME_ABS_BLUE;
// color(colour_scheme[0]) rotate([90,0,0]) Steel6String(from_fret=0, to_fret=23, include_colours=[0]);
// color(colour_scheme[1]) rotate([90,0,0]) Steel6String(from_fret=0, to_fret=23, include_colours=[1]);
// color(colour_scheme[2]) rotate([90,0,0]) Steel6String(from_fret=0, to_fret=23, include_colours=[2]);
// color(colour_scheme[3]) rotate([90,0,0]) Steel6String(from_fret=0, to_fret=23, include_colours=[3]);
// rotate([90,0,0]) Steel6String(include_colours=[0,1,2,3], reference=true);
// rotate([90,0,0])
Steel6String(include_colours=[0,1,2,3], reference=true);
// TrussRodSingleAction();
// translate([20, 0]) TrussRod();
@ -1374,11 +1305,11 @@ module TwoBangerMk2(include_colours=[0,1], segment=-1, preview=false) {
}
// colour_scheme = COLOURSCHEME_ABS_BLUE;
colour_scheme = COLOURSCHEME_ABS_CLOWNFISH;
// TwoBangerMk2(preview=true);
segment = 1;
color(colour_scheme[0]) TwoBangerMk2([0], segment);
color(colour_scheme[1]) TwoBangerMk2([1], segment);
color(colour_scheme[2]) TwoBangerMk2([2], segment);
color(colour_scheme[3]) TwoBangerMk2([3], segment);
color("red") TwoBangerMk2([4], segment);
// colour_scheme = COLOURSCHEME_ABS_CLOWNFISH;
// // TwoBangerMk2(preview=true);
// segment = 1;
// color(colour_scheme[0]) TwoBangerMk2([0], segment);
// color(colour_scheme[1]) TwoBangerMk2([1], segment);
// color(colour_scheme[2]) TwoBangerMk2([2], segment);
// color(colour_scheme[3]) TwoBangerMk2([3], segment);
// color("red") TwoBangerMk2([4], segment);

View File

@ -250,12 +250,12 @@ module TrussRods(extra=0, tolerance=0.6) {
}
}
}
module CFs(taper_length = 2, taper_mul = 1.1, tolerance = CF_Tube_OD_tolerance) {
module CFs(taper_length = 2, taper_mul = 1.1, tolerance = CF_Tube_OD_tolerance, tolerance_length = CF_Square_Width_tolerance) {
d = CF_Tube_OD + tolerance;
taper_OD = (CF_Tube_OD*taper_mul) + tolerance;
l = CF_Tube_Len;
l = CF_Tube_Len;// + tolerance_length*2;
$fn = 90;
for (v = $reinforcing_tube_positions) {
if (!is_undef($reinforcing_tube_positions)) for (v = $reinforcing_tube_positions) {
y0 = v[1];
y1 = y0+l;
translate(v = v) rotate([-90, 0, 0]) cylinder_beak(d=d, h=l);
@ -272,6 +272,37 @@ module CFs(taper_length = 2, taper_mul = 1.1, tolerance = CF_Tube_OD_tolerance)
}
}
}
w = CF_Square_Width + tolerance;
taper_w = (CF_Square_Width * taper_mul) + tolerance;
taper_epsilon = 0.00001;
if (!is_undef($reinforcing_square_positions)) for (v = $reinforcing_square_positions) {
y0 = v[1];
y1 = y0+l;
// Full square rod, unconditional
translate([v[0]-w/2, v[1], v[2]-w/2]) cube([w, l, w]);
for (cut_y = $segment_cuts) {
if (cut_y == y0) {
// Taper in only (beginning of segment)
hull() {
translate([v[0], cut_y+taper_epsilon/2, v[2]]) cube([taper_w, taper_epsilon, taper_w], center=true);
translate([v[0], cut_y+taper_length/2, v[2]]) cube([w, taper_length, w], center=true);
}
} else if (cut_y == y1) {
// Taper out only (end of segment)
hull() {
translate([v[0], cut_y-taper_epsilon/2, v[2]]) cube([taper_w, taper_epsilon, taper_w], center=true);
translate([v[0], cut_y-taper_length/2, v[2]]) cube([w, taper_length, w], center=true);
}
} else if ((y1 > cut_y) && (cut_y > y0)) {
// Taper in and out (tube spans multiple segments)
hull() {
translate([v[0], cut_y, v[2]]) cube([taper_w, taper_epsilon, taper_w], center=true);
translate([v[0], cut_y, v[2]]) cube([w, taper_length*2, w], center=true);
}
}
}
}
}
module Dowels() {
for (v = $dowel_positions) translate(v) Dowel();

View File

@ -1,4 +1,5 @@
// Include after common.scad
$extra_thickness_above_center = is_undef($extra_thickness_above_center) ? 0 : $extra_thickness_above_center;
function default_fret_widths(zero_fret_width, other_fret_width) = flatten([[zero_fret_width], [ for (i = [1:$num_frets]) other_fret_width ]]);
function default_neck_width_nut() = ($num_strings-1)*$string_spacing_nut + $string_margin*2;
@ -276,6 +277,7 @@ module TaperNeck(
desired_fontsize = min(fontsize_from_max_height, fontsize_from_max_width);
fontsize = clamp(2, desired_fontsize, 10);
t = num_text[1];
// TODO: account for shallow scallops
translate([0, y_mid, z0-0.5]) linear_extrude(30) {
if (t == ".") {
circle(d=fontsize*0.9, $fn=72);