guitar

3D printable guitar parts
git clone https://git.woozle.org/neale/guitar.git

commit
be70cc9
parent
be70cc9
author
Neale Pickett
date
2025-12-28 08:56:43 -0700 MST
Check in tuner plate and replacement nut
6 files changed,  +205, -0
A .gitignore
+1, -0
1@@ -0,0 +1 @@
2+*.3mf
A Makefile
+2, -0
1@@ -0,0 +1,2 @@
2+nut.%.3mf: nut.scad nuts.json
3+	openscad -o $@ -p nuts.json -P $* $<
A README.md
+40, -0
 1@@ -0,0 +1,40 @@
 2+tuner-plate.scad
 3+-------------
 4+
 5+Allows you to mount a D'Addario PW-CT-12 micro tuner onto the head of
 6+an instrument using a tuning machine screw.
 7+
 8+Print in PETG: you will need the flexibility.
 9+
10+Put some adhesive rubber pads on the bottom of it where it will press
11+against the head.  This will flex the part a little bit, which is what
12+you want: the tuner needs a good solid connection against the
13+instrument.
14+
15+
16+nut.scad
17+-------
18+
19+A parametric nut. This goes on the neck between the head and the fretboard,
20+and holds the strings high enough that they don't buzz against the frets.
21+
22+Print in PLA at 100% infill. I printed it with the largest face
23+against the print bed, so the pre-cut grooves were nice and
24+smooth. The print layers will be on parallel planes to the frets.
25+
26+You will probably have to sand the top print layer to get the correct
27+width.  You will definitely have tofile the grooves to get the
28+intonation right: I intentionally designed this in to let me file each
29+string to exactly the right depth.
30+
31+PLA is the most dense commonly-available filament, and you want the
32+density to avoid dampening the vibrations of the string when it's open
33+(no finger holding it up to a fret).  I suspect that even a dense
34+plastic is not the ideal material for a nut, but for me, it's good
35+enough.  I'm not playing at a level where I need jaw-dropping sustain
36+on open strings. 
37+
38+In another sense, PLA *is* an ideal material, though: it allows you to
39+make a new nut in 5 minutes, so you can spend time getting the
40+intonation right. As a bonus, you don't have to store a bunch of blank
41+nuts in weird sizes.
A nut.scad
+36, -0
 1@@ -0,0 +1,36 @@
 2+$fn=180;
 3+
 4+inch = 25.4;
 5+
 6+// Size of the nut
 7+size = [30, 9, 5];
 8+
 9+ // Strings you're putting on it, in mils (aka thous)
10+string_gauges = [11, 16, 30, 40];
11+
12+strings = string_gauges * inch / 1000;
13+
14+// tenor guitar
15+// d4 - 0.014" - 20.5.lb
16+// a3 - 0.018" - 19.0 lb
17+// d3 - 0.029" - 19.6 lb
18+// g2 - 0.044" - 19.3 lb
19+
20+difference() {
21+  intersection() {
22+
23+    cube(size);
24+    rotate([0, 90, 0]) cylinder(h=size.x, r=size.y);
25+  }
26+
27+  // string grooves
28+  spacing = size.x / len(strings);
29+  for (n = [0:len(strings)-1]) {
30+    d = strings[n];
31+    pos = [spacing * (n + 1/2), size.y, 0];
32+    translate(pos) rotate([5, 0, 0]) hull() {
33+      translate([0, 0, 0]) cylinder(h=size.z*2, d=d, center=true);
34+      translate([0, 10, 0]) cylinder(h=size.z*2, d=d, center=true);
35+    }
36+  }
37+}
A nuts.json
+14, -0
 1@@ -0,0 +1,14 @@
 2+{
 3+    "parameterSets": {
 4+        "tenor-guitar": {
 5+            "size": "[30, 9, 5]",
 6+            "string_gauges": "[11, 16, 30, 40]"
 7+        },
 8+        "tenor-guitar-heavy": {
 9+            "size": "[30, 9, 5]",
10+            "string_gauges": "[14, 18, 29, 44]"
11+        }
12+    }
13+}
14+            
15+    
A tuner-plate.scad
+112, -0
  1@@ -0,0 +1,112 @@
  2+$fn = 60;
  3+
  4+// overall thickness
  5+z = 2.3; // .1
  6+
  7+// tunerposition / smallHoleR is on x = 0, original screw distance from center looks like 20mm
  8+screwHoleX = 20; // .1
  9+
 10+// original looks like 2.5-ish
 11+screwHoleR = 1.5; // .1
 12+
 13+// amount of X to travel when unclicking the tuner
 14+bigHoleX = -5; // .1
 15+
 16+// measure the max space between the screw and the tuner gears etc!
 17+materialAroundScrewHole = 2.0;
 18+
 19+// original 25 / 2
 20+bodyOuterR = 12.5;
 21+
 22+// measured from center of hole!
 23+slitX = 8.0; // .1
 24+
 25+// ~3mm in original
 26+feetZ = 3; // .1
 27+
 28+// original is 5.4-ish
 29+feetX = 5; // .1
 30+
 31+// how much 
 32+feetTopCylRatio = .3; // amount of rounding on top
 33+
 34+feetCylZ = feetTopCylRatio * feetX / 2; 
 35+
 36+bigHoleR = 4.1;
 37+smallHoleR1 = 2.7;
 38+smallHoleR2 = 3.9;
 39+screwHoleOuterR = screwHoleR + materialAroundScrewHole;
 40+
 41+
 42+
 43+
 44+difference () {
 45+
 46+    union () {
 47+        hull () {
 48+            cylinder(r = bodyOuterR, h = z);
 49+
 50+            translate([screwHoleX, 0, 0])
 51+                cylinder(r = screwHoleOuterR, h = z);
 52+        }
 53+
 54+        // feet, let's not use intersection but diff of diff
 55+      if (false) difference () {
 56+            union () {
 57+                cubeC([feetX, 2 * bodyOuterR, z + feetZ - feetCylZ], [1, 1, 0]);
 58+
 59+                translate([0, 0, z + feetZ - feetCylZ])
 60+                scale([1, 1, feetTopCylRatio])
 61+                    rotate([90, 0, 0])
 62+                        cylinder(r = feetX / 2, h = bodyOuterR * 2, center = true);
 63+
 64+            }
 65+            // negative part:
 66+
 67+            // cut out mid: 
 68+            // cubeC([feetX * 2, (bigHoleR + .3)  * 2, z * 5], center = [1, 1, 0]);
 69+            cylinder (r = bigHoleR + .3, h = z * 5);
 70+
 71+            difference () {
 72+                cubeC([bodyOuterR * 2, bodyOuterR * 3, z * 15]);
 73+                cylinder(r = bodyOuterR - 1, h = z * 20, center = true);
 74+            }
 75+
 76+        }
 77+
 78+
 79+    }
 80+
 81+    // negative parts:
 82+    translate([screwHoleX, 0, -1])
 83+        cylinder(r = screwHoleR, h = z + 2);
 84+
 85+
 86+    // Where the tuner normally sits
 87+    // I made the angle of the cone steeper for a grippier grip on the tuner
 88+    cylinder(r1 = smallHoleR1, r2 = smallHoleR2, h = z);
 89+
 90+    translate([bigHoleX, 0, -1])
 91+        cylinder(r = bigHoleR, h = z + 2);
 92+
 93+    // slit:
 94+    // translate([.5 * slitX, 0, 0])
 95+    //     cube([slitX, 1.5, 2.5 * z], center = true);
 96+    cubeC([slitX, 1.5, 2.5 * z], [0, 1, 1]);
 97+
 98+    translate([slitX, 0, 0])
 99+        cylinder(r = 1.5 / 2, h = 2.7 * z);
100+
101+    translate([screwHoleX, 0, 10+z-1]) cube(20, center=true);
102+
103+}
104+
105+
106+
107+
108+module cubeC(cubeSize, centeredAxes = [true, true, true]) {
109+    translate([centeredAxes[0] ? -.5 * cubeSize[0] : 0,
110+               centeredAxes[1] ? -.5 * cubeSize[1] : 0,
111+               centeredAxes[2] ? -.5 * cubeSize[2] : 0]) 
112+        cube(cubeSize, center = false);
113+}