From 9f0f029301f1c3cef9c5630a96d38cd3b2b22ec4 Mon Sep 17 00:00:00 2001 From: Luke Hubmayer-Werner Date: Mon, 1 Apr 2024 14:55:15 +1030 Subject: [PATCH] A new 36-fret neck for a 3-string T-section Starts with 2-Banger geometry, widens out to do 1cm nut 2cm bridge spacing Neck profile is just a growing radius circle maintaining constant thickness from T-spine --- T-riple.scad | 133 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 T-riple.scad diff --git a/T-riple.scad b/T-riple.scad new file mode 100644 index 0000000..35f6a8c --- /dev/null +++ b/T-riple.scad @@ -0,0 +1,133 @@ +include +include + +semitone_strings = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "X", "XI"]; +octave_strings = ["", "˙", "¨", "¯"]; +octave_scales = [1.1, 1, 0.9, 0.8]; + +// $fn = $preview ? 32 : 512; +// mink_fn = $preview ? 12 : 128; +// mink_fn_2d = $preview ? 32 : 256; +$fn = 32; +mink_fn = 12; +mink_fn_2d = 32; + +fret_width = 2.4; //2.8; // Jumbo = 0.11", 0.055" tall +tube_radius = Cap_Spine + T_circumcenter[0]; + + +module tube(from_fret, to_fret, scale_offset = 0) { + function fsl(fret_number) = fret_scale_length(fret_number + scale_offset); + z_min = (fsl(to_fret) + fsl(to_fret+1))/2; + z_max = (fsl(from_fret) + fsl(from_fret-1))/2; + z_offset = z_min; + Cap_Length = z_max - z_min; + echo(str("Cap length from fret ", from_fret, " to ", to_fret, " is ", Cap_Length, "mm")); + + module solid_tube(cap_taper = 1.5, fingerboard_min_thick = 2.5, fingerboard_max_thick = 5, fret_angle = 60) { // Fret angle of 45° is normal, anything over 60 will not work correctly + module cap_outline(profile_radius_scale = 1.0, rounding_radius = 1.5) { + minkowski($fn = mink_fn_2d) { + circle(r = rounding_radius); + difference() { + translate([(profile_radius_scale-1.0)*tube_radius, 0, 0]) translate(T_circumcenter) circle(r = tube_radius*profile_radius_scale - rounding_radius); + translate([fingerboard_max_thick - rounding_radius, -50]) square([100,100]); + } + } + } + module fret_bumps(w=100) { + translate([0,0,-z_offset]) for (fret = [from_fret:to_fret]) + translate([fingerboard_max_thick - fret_width/2, w/2, fsl(fret)]) + rotate([90,0,0]) cylinder(h = w, r = fret_width/2); + } + + module scallops(w=100) { + for (fret = [from_fret:to_fret+1]) + let( + f_prev = fsl(fret-1) - z_offset, + f_next = fsl(fret) - z_offset, + o = fret_width/2 * sin(fret_angle), + x0 = f_prev - o, + x1 = f_next + o, + y0 = fingerboard_min_thick, + y1 = fingerboard_max_thick - (fret_width/2 * cos(fret_angle)), + pts = [[x0, y1], [x1, y1], [(x0+x1)/2, y0]], + cc = tri_circumcenter(pts), + r = norm([x0, y1] - cc) + ) { + translate([0,-w/2,0]) + rotate([-90,-90,0]) + translate(cc) cylinder(h = w, r = r); + } + } + + module basic_fretboard() { + intersection() { + // hull() { + // minkowski($fn = mink_fn) { + // sphere(cap_taper, $fn = mink_fn); + // translate([0,0,cap_taper]) linear_extrude(0.01) offset(-cap_taper) + // cap_outline(fingerboard_min_thick = fingerboard_min_thick, fingerboard_max_thick = fingerboard_max_thick); + // } + // minkowski($fn = mink_fn) { + // sphere(cap_taper, $fn = mink_fn); + // translate([0,0,Cap_Length-cap_taper]) linear_extrude(0.01) offset(-cap_taper) + // cap_outline(fingerboard_min_thick = fingerboard_min_thick, fingerboard_max_thick = fingerboard_max_thick); + // } + // linear_extrude(Cap_Length) offset(-1) cap_outline(); + // translate([0,0,cap_taper]) linear_extrude(Cap_Length-cap_taper*2) + // cap_outline(fingerboard_min_thick = fingerboard_min_thick, fingerboard_max_thick = fingerboard_max_thick); + // } + hull() { + translate([0,0,Cap_Length]) linear_extrude(0.001) cap_outline(1.0); + translate([0,0,0]) linear_extrude(0.001) cap_outline(1.75); + } + // linear_extrude(Cap_Length) + // cap_outline(); + union() { + color("black") fret_bumps(); + color("white", alpha=0.01) translate([-50,-50,0]) cube([50 + fingerboard_max_thick - (fret_width/2 * cos(fret_angle)), 100, Cap_Length]); + } + } + } + + // Make a solid tube and then subtract the notches + difference() { + basic_fretboard(); + difference() { + color("red") scallops(); + color("blue") fret_bumps(); + } + } + // color("red") scallops(); + } + + difference() { + solid_tube(1.5); + linear_extrude(Cap_Length) T_hole(); + tapered_T_hole(z0 = 0, z1 = 3); + tapered_T_hole(z0 = Cap_Length-3, z1 = Cap_Length+0.0001, o0 = 0, o1 = 1); + // Version number + translate([-10,10,Cap_Length-0.5]) linear_extrude(1) text("06", size=5, halign="center", valign="center", font="Noto Sans"); + // Fret number markers + color("black") + for (fret = [from_fret:to_fret]) + translate([-3,-16,fsl(fret)-z_offset]) rotate([90,25,16]) linear_extrude(40) { + octave = floor(fret/12); + semitone = fret%12; + octave_scale = octave_scales[octave]; + + text(semitone_strings[semitone], size=4*octave_scale, halign="center", valign="center", font="Noto Sans"); + text(octave_strings[octave], size=6*octave_scale, halign="center", valign="center", font="Noto Sans"); + } + } +} + + +tube(from_fret = 0, to_fret = 36, scale_offset = -5); +//translate([50, 0]) tube(from_fret = -4, to_fret = -3); +//translate([100, 0]) tube(from_fret = -2, to_fret = 0); +//translate([150, 0]) tube(from_fret = 1, to_fret = 3); +//translate([200, 0]) tube(from_fret = 4, to_fret = 7); +//translate([250, 0]) tube(from_fret = 8, to_fret = 12); +//translate([300, 0]) tube(from_fret = 13, to_fret = 19); +//translate([350, 0]) tube(from_fret = 20, to_fret = 30);