GuitarModels/CFTubes.scad

268 lines
9.0 KiB
OpenSCAD
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

include <common.scad>
// Guitar_Scale_Length_mm = 610; // millimetres, slightly over 24inch (609.6mm) Jaguar scale, should be fine for guitar and u-bass
// assert(fret_scale_length(0) == 610); // Make sure the function correctly uses our changed global
CF_Tube_Dia = 5.0;
CF_Square_Width = 6.0;
// Philippians 4:8
// Gideon 真実な, 尊ぶべき, 正しい, 清い, 愛すべき, 評判の良い, 徳とされる, 称賛に値する
// ShinKaiYaku65 最後に、兄弟たち。すべての真実なこと、すべての誉れあること、すべての正しいこと、すべてのきよいこと、すべての愛すべきこと、すべての評判の良いこと、そのほか徳と言われること、称賛に値することがあるならば、そのようなことに心を留めなさい。
// I swapped 愛 and 評判 because 12th fret should be the biggest marker, and having only 15 as a 2char marker would be too disorienting
// going with 良 for 21
fret_inlays = [[3, "真"], [5, "尊"], [7, "正"], [9, "清"], [12, "評判"], [15, "愛"], [17, "徳"], [19, "賛"], [21, "良"], [24, "主イエス"]];
module neck(string_spacing=18, string_margin=4.5, num_strings=3, target_neck_thickness=15, scallop_depth=3, num_frets=24, fret_width=2.4) {
fw2 = fret_width/2;
neck_length = fret_scale_length(0)+fw2;
neck_width = (num_strings-1)*string_spacing + string_margin*2;
module neck_stock() {
angle_excess = asin((scallop_depth+fw2)/target_neck_thickness);
a0 = 90-angle_excess;
a1 = 270+angle_excess;
rotate([-90, 0, 0])
linear_extrude(neck_length)
polygon([for (i = [0:300]) let(a=lerp(a0, a1, i/300.0)) [neck_width*0.5*sin(a), -target_neck_thickness*cos(a)]]);
}
module scallops() {
for (fret = [0:num_frets]) {
x0 = fret_scale_length(fret-1) - fw2;
x1 = fret_scale_length(fret) + fw2;
xmid = lerp(x0, x1, 0.5);
// Radius it?
arc = arc_points([[x0, scallop_depth], [x1, scallop_depth], [xmid, 0]]);
// echo(arc);
rotate([90, 0, 90]) linear_extrude(neck_width, center=true) polygon(arc);
}
}
module fret_bumps() {
for (fret = [0:num_frets]) {
translate([0, fret_scale_length(fret), scallop_depth])
rotate([0, 90]) cylinder(d=fret_width, h = neck_width, center = true, $fn=200);
}
}
module fret_inlays() {
for (num_text = fret_inlays) {
fret = num_text[0];
x0 = fret_scale_length(fret-1);
x1 = fret_scale_length(fret);
diff = x0 - x1;
translate([0, lerp(x0, x1, 0.5), -0.5])
linear_extrude(30)
text(text = num_text[1], font = JP_Serif_Font, halign = "center", valign = "center", size = clamp(2, diff-fret_width*2-2, 10));
}
}
module fret_side_markers() {
for (num_text = fret_inlays) {
fret = num_text[0];
x0 = fret_scale_length(fret-1);
x1 = fret_scale_length(fret);
diff = x0 - x1;
rotate([0, -90, 0])
translate([0, x1, neck_width/2-3])
linear_extrude(50)
rotate(-35)
text(text = str(fret), font = JP_Serif_Font, halign = "right", valign = "center", size = 5);
}
}
// scallops();
render() difference() {
neck_stock();
scallops();
fret_inlays();
fret_side_markers();
translate([-neck_width, 0, scallop_depth]) cube([neck_width*2, Guitar_Scale_Length_mm*3, target_neck_thickness*3]);
}
intersection() {
fret_bumps();
neck_stock();
}
}
module cf_tube(x1, x2, tolerance = 0.3) {
translate([0, x2, 0])
rotate([-90,0,0])
cylinder(h=x1-x2, d=CF_Tube_Dia+tolerance, $fn=360);
hull() {
translate([0, x2])
rotate([-90,0,0])
cylinder(h=0.2, d=CF_Tube_Dia*1.2+tolerance, $fn=360);
translate([0, x2+5])
rotate([-90,0,0])
cylinder(h=0.2, d=CF_Tube_Dia+tolerance, $fn=360);
}
hull() {
translate([0, x1])
rotate([-90,0,0])
cylinder(h=0.2, d=CF_Tube_Dia*1.2+tolerance, $fn=360);
translate([0, x1-5])
rotate([-90,0,0])
cylinder(h=0.2, d=CF_Tube_Dia+tolerance, $fn=360);
}
}
module cf_square(x1, x2, tolerance = 0.2, taper_x1 = true, taper_x2 = true) {
x = CF_Square_Width+tolerance;
translate([-x/2, x2, -x/2])
cube([x, x1-x2, x]);
if (taper_x1) {
hull() {
translate([0, x1, 0])
cube([x*1.2, 0.2, x*1.2], center=true);
translate([0, x1-5, 0])
cube([x, 0.2, x], center=true);
}
}
if (taper_x2){
hull() {
translate([0, x2, 0])
cube([x*1.2, 0.2, x*1.2], center=true);
translate([0, x2+5, 0])
cube([x, 0.2, x], center=true);
}
}
}
module fret_tube(from_fret, to_fret, fret_width=2.4) {
fw2 = fret_width/2;
x0 = fret_scale_length(0)+fw2;
x1 = fret_scale_length(from_fret) + ((from_fret==0) ? fw2 : (-fw2));
x2 = fret_scale_length(to_fret)-fw2;
render() difference() {
neck(fret_width=fret_width);
for (i = [-1:2:1])
translate([i*15, 0, -4])
cf_tube(x1, x2);
for (i = [-1:2:1])
translate([i*7.5, 0, -7])
cf_square(x1, x2);
translate([0, 0, -10])
cf_tube(x1, x2);
translate([-50, 0, -50]) cube([100, x2, 100]);
translate([-50, x1, -50]) cube([100, x0-x1, 100]);
// αβγδεζ
rotate([90, 0, 0]) linear_extrude((x2+0.3)*2, center=true) text(text = "01β", font = "Deja Vu Sans", halign = "center", valign = "center", size = 4);
}
}
module headpiece(string_spacing=18, string_margin=4.5, num_strings=3, target_neck_thickness=15, scallop_depth=3, fret_width=2.4) {
headpiece_length = 36;
cf_square_length = 32;
fw2 = fret_width/2;
x0 = fret_scale_length(0)+fw2;
neck_width = (num_strings-1)*string_spacing + string_margin*2;
bend_radius = 24;
module stock() {
angle_excess = asin(scallop_depth/target_neck_thickness);
a0 = 90-angle_excess;
a1 = 270+angle_excess;
translate([0, x0, 0])
rotate([-90, 0, 0])
linear_extrude(headpiece_length)
polygon([for (i = [0:300]) let(a=lerp(a0, a1, i/300.0)) [neck_width*0.5*sin(a), -target_neck_thickness*cos(a)]]);
}
module string_tubes(tolerance = 1.0) {
string_thicknesses = [4.9, 4.2, 3.0];
module string_tube(diameter, fn=36) {
hole_r = diameter/2;
bend_r = bend_radius + hole_r;
union() {
for (a = [0:89]) {
hull() {
translate([0, bend_r*sin(a), bend_r*cos(a)]) sphere(hole_r, $fn=fn);
translate([0, bend_r*sin(a+1), bend_r*cos(a+1)]) sphere(hole_r, $fn=fn);
}
}
hull() {
translate([0, bend_r*sin(90), bend_r*cos(90)]) sphere(hole_r, $fn=fn);
translate([0, bend_r*sin(90), -target_neck_thickness]) sphere(hole_r, $fn=fn);
}
}
};
for (i = [0:num_strings-1]) {
string_diameter = string_thicknesses[i] + tolerance;
x = -neck_width/2 + string_margin + (i*string_spacing);
translate([x, x0+2, -bend_radius+scallop_depth]) string_tube(string_diameter);
}
}
difference() {
stock();
string_tubes();
for (i = [-1:2:1])
translate([i*7.5, 0, -7])
cf_square(x0+cf_square_length, x0, taper_x1=false);
// αβγδεζ
translate([0, x0+headpiece_length, -5]) rotate([90, 0, 180]) linear_extrude(0.3, center=true) text(text = "01β.γ", font = "Deja Vu Sans", halign = "center", valign = "center", size = 4);
}
}
module ubass_tuner() {
d_thread = 11.0;
d_collar = 13.8 + 0.2; // Add some tolerance
max_thread = 5.0; // thread to cover without the collar
w_tag = 19;
l_tag = 32.5;
l_tag_rect = 20.1;
d_peg_collar = 7.2;
d_peg_collar_max = 9.4;
back_of_peg_collar_to_end = 10.8;
d_screw = 2.0; // As we will screw into this, probably don't need tolerance yet
screw_tab_min_w = 1.6;
screw_tab_min_thick = 2.0;
d_screw_tab = 5.2+0.4; // Tolerance this though!
// back_of_thread_to_tab_tip = 20.7 + 0.1; // 17.1 measuring far hole end to hole end, 6.9 measuring close ends gives average of 12.0
middle_of_thread_to_tab_screw = 12.0; //back_of_thread_to_tab_tip - d_thread/2 - screw_tab_min_w; == 13.7
echo(middle_of_thread_to_tab_screw);
module tuner_footprint() {
hull() {
translate([-w_tag/2, -l_tag+d_screw_tab/2]) square([w_tag, l_tag_rect]);
circle(d=d_screw_tab, $fn=72);
}
}
module holes() {
circle(d=d_screw, $fn=72);
translate([0, -middle_of_thread_to_tab_screw]) circle(d=d_thread, $fn=72);
}
difference() {
linear_extrude(max_thread) difference() {
offset(4, 3) tuner_footprint();
holes();
}
translate([0,0,max_thread-0.2]) linear_extrude(1) {
translate([-3.5,-2]) text(str(d_screw), size=2.5);
translate([ 0, -4]) rotate(30) text(str(d_screw_tab), size=2.5);
translate([4.4, -7]) rotate(90) text(str(middle_of_thread_to_tab_screw), size=2.5);
translate([-9.5,-13.5]) text(str(d_thread), size=2.5);
translate([-12,-27]) text(str(d_peg_collar_max), size=2.5);
}
}
translate([0,0,max_thread]) linear_extrude(10) difference() {
offset(4, 3) tuner_footprint();
tuner_footprint();
translate([0, -l_tag+d_screw_tab/2+back_of_peg_collar_to_end-d_peg_collar_max/2]) square([100, d_peg_collar_max], center=true);
}
// This segfaults for no reason
// difference() {
// linear_extrude(15) offset(4, 3) tuner_footprint();
// translate([0,0,max_thread]) linear_extrude(15) tuner_footprint();
// linear_extrude(100) holes();
// }
}
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();
ubass_tuner();