a whole heap of crap

This commit is contained in:
Connor Olding 2014-11-03 12:54:18 -08:00
parent f937547991
commit a6aed4fcc5
3 changed files with 202 additions and 56 deletions

119
run.py
View file

@ -3,56 +3,79 @@
from strings import print_ideal_stock from strings import print_ideal_stock
in_mm = 25.4 in_mm = 25.4
scale_length = 648/in_mm default_scale_length = 648/in_mm
string_sets = { sets = """
'regular light': ( regular light
# (desired note, tension, and type) E4 16 PD
('E4' , 16, 'P'), B3 16 PD
('B3' , 16, 'P'), G3 16 PD
('G3' , 16, 'P'), D3 16 WD
('D3' , 16, 'W'), A2 16 WD
('A2' , 16, 'W'), E2 16 WD
('E2' , 16, 'W'),
),
'jazz light': (
('E4' , 24, 'P'),
('B3' , 24, 'P'),
('G3' , 24, 'W'),
('D3' , 24, 'W'),
('A2' , 24, 'W'),
('E2' , 24, 'W'),
),
'regular light (DADGAD)': (
('D4' , 16, 'P'),
('A3' , 16, 'P'),
('G3' , 16, 'P'),
('D3' , 16, 'W'),
('A2' , 16, 'W'),
('D2' , 16, 'W'),
),
'regular light (open G, 6)': (
('D4' , 16, 'P'),
('B3' , 16, 'P'),
('G3' , 16, 'P'),
('D3' , 16, 'W'),
('B2' , 16, 'W'),
('D2' , 16, 'W'),
),
'regular light (open G, 7)': (
('D4' , 16, 'P'),
('B3' , 16, 'P'),
('G3' , 16, 'P'),
('D3' , 16, 'W'),
('B2' , 16, 'W'),
('G2' , 16, 'W'),
('D2' , 16, 'W'),
),
}
print('for a scale length of {:>5.2f} inches'.format(scale_length)) jazz medium
for name, strings in string_sets.items(): E4 24 PD
B3 24 PD
G3 24 WD
D3 24 WD
A2 24 WD
E2 24 WD
regular light (DADGAD)
D4 16 PD
A3 16 PD
G3 16 PD
D3 16 WD
A2 16 WD
D2 16 WD
fanned-fret bass
G2 35 WC 34.00
D2 35 WC 34.75
A1 35 WC 35.50
E1 35 WC 36.25
B0 35 WC 37.00
regular light (Open G 7-string)
D4 16 PD
B3 16 PD
G3 16 PD
D3 16 WD
B2 16 WD
G2 16 WD
D2 16 WD
"""
string_sets = {}
sets = sets+'\n\n'
title = None
for line in sets.splitlines():
if not line:
title = None
continue
if not title:
title = line
string_sets[title] = []
else:
fields = line.split()
note, tension = fields[0:2]
tension = int(tension)
req = ''
if len(fields) > 2:
req = fields[2]
length = None
if len(fields) > 3:
length = float(fields[3])
string = (note, tension, req, length)
string_sets[title].append(string)
print('for a scale length of {:>5.2f} inches'.format(default_scale_length))
for name, strings in sorted(string_sets.items()):
print() print()
print('"{}"'.format(name)) print('"{}"'.format(name))
print_ideal_stock(strings, scale_length) print_ideal_stock(strings, default_scale_length)

84
run2.py Executable file
View file

@ -0,0 +1,84 @@
#!/usr/bin/python
from strings import print_tensions
in_mm = 25.4
default_scale_length = 648/in_mm
sets = """
E standard (super light balanced)
E4 DAPL009
B3 DAPL012
G3 DAPL015
D3 DANW022
A2 DANW030
E2 DANW040
E standard (medium balanced)
E4 DAPL011
B3 DAPL015
G3 DAPL019
D3 DANW028
A2 DANW037
E2 DANW050
C standard (medium balanced)
C4 DAPL011
G3 DAPL015
D#3 DAPL019
A#2 DANW028
F2 DANW037
C2 DANW050
C standard (jazz medium)
C4 DAPL013
G3 DAPL017
D#3 DANW026
A#2 DANW036
F2 DANW046
C2 DANW056
C standard (CKS-G6-14-59mb)
C4 CKPL014
G3 CKPL019
D#3 CKHW025
A#2 CKHW033
F2 CKHW045
C2 CKHW059
B standard (CKS-G6-14-59mb)
B3 CKPL014
F#3 CKPL019
D3 CKHW025
A2 CKHW033
E2 CKHW045
B1 CKHW059
D standard drop C (medium balanced)
D4 DAPL011
A3 DAPL015
F3 DAPL019
C3 DANW028
G2 DANW037
C2 DANW050
"""
string_sets = {}
sets = sets+'\n\n'
title = None
for line in sets.splitlines():
if not line:
title = None
continue
if not title:
title = line
string_sets[title] = []
else:
note, string = line.split()
string_sets[title].append((note, string))
print('for a scale length of {:>5.2f} inches'.format(default_scale_length))
for name, strings in sorted(string_sets.items()):
print()
print('"{}"'.format(name))
print_tensions(strings, default_scale_length)

View file

@ -6,8 +6,8 @@ from notes import note2freq
stock = [] stock = []
stock += daddario_plain_steel stock += daddario_plain_steel
stock += daddario_nickle_wound stock += daddario_nickle_wound
#stock += circle_k_plain stock += circle_k_plain
#stock += circle_k_hybrid_wound stock += circle_k_hybrid_wound
uw_const = 386.4 uw_const = 386.4
def uw2tension(uw, freq, SL): def uw2tension(uw, freq, SL):
@ -16,21 +16,39 @@ def uw2tension(uw, freq, SL):
def tension2uw(t, freq, SL): def tension2uw(t, freq, SL):
return (t*uw_const)/(2*SL*freq)**2 return (t*uw_const)/(2*SL*freq)**2
outfmt = '{:<8} at {:> 5.2f} lb ({:>+4.2f})' outfmt = '\
finalfmt = 'total: {:>7.2f} lb ({:>+5.2f})' {:<8} at {:>6.2f} lb ({:>+4.2f})'
finalfmt = '\
average: {:>7.2f} lb ({:>+5.2f})\n\
total: {:>7.2f} lb ({:>+5.2f})'
tension_outfmt = '\
{:<3} {:<8} at {:>6.2f} lb'
tension_finalfmt = '\
average: {:>7.2f} lb\n\
total: {:>7.2f} lb'
def print_ideal_stock(strings, scale_length=25.512): def print_ideal_stock(strings, scale_length=25.512):
SL = scale_length SL = scale_length
total_tension = 0 total_tension = 0
total_desired_tension = 0 total_desired_tension = 0
for note, tension, kind in strings: for note, tension, req, length in strings:
freq = note2freq(note) freq = note2freq(note)
if length:
SL = length
else:
SL = scale_length
uw = tension2uw(tension, freq, SL) uw = tension2uw(tension, freq, SL)
kind = len(req) > 0 and req[0]
brand = len(req) > 1 and req[1]
closest = ('n/a', 0) closest = ('n/a', 0)
for name, stock_uw in stock: for name, stock_uw in stock:
if kind == 'P' and name[2] != 'P': if kind and kind == 'P' and name[2] != 'P':
continue continue
if kind == 'W' and name[3] != 'W': if kind and kind == 'W' and name[3] != 'W':
continue
if brand and brand[0] != name[0]:
continue continue
if abs(stock_uw - uw) < abs(closest[1] - uw): if abs(stock_uw - uw) < abs(closest[1] - uw):
closest = (name, stock_uw) closest = (name, stock_uw)
@ -43,7 +61,28 @@ def print_ideal_stock(strings, scale_length=25.512):
total_desired_tension += tension total_desired_tension += tension
error = total_tension - total_desired_tension error = total_tension - total_desired_tension
print(finalfmt.format(total_tension, error)) average_tension = total_tension/len(strings)
average_error = error/len(strings)
print(finalfmt.format(average_tension, average_error, total_tension, error))
def print_tensions(strings, scale_length=25.512):
SL = scale_length
total_tension = 0
for note, name in strings:
freq = note2freq(note)
uw = 0
for stock_name, stock_uw in stock:
if name == stock_name or name + '*' == stock_name:
uw = stock_uw
break
if uw:
tension = uw2tension(uw, freq, SL)
else:
tension = 0
print(tension_outfmt.format(note, name, tension))
total_tension += tension
print(tension_finalfmt.format(total_tension/len(strings), total_tension))
if __name__ == '__main__': if __name__ == '__main__':
# DAd's data is all screwy so we use change scale lengths for a best-fit # DAd's data is all screwy so we use change scale lengths for a best-fit