X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=share%2Fextensions%2Fffproc.py;h=b288d250d37f278bfa831466dcd5489252f83784;hb=c60aaf26e4630f72cff359e87c5d95f718bdf33f;hp=7eb6f2dd1b3463f87194e45a9924e2071a4019f0;hpb=6b15695578f07a3f72c4c9475c1a261a3021472a;p=inkscape.git diff --git a/share/extensions/ffproc.py b/share/extensions/ffproc.py index 7eb6f2dd1..b288d250d 100755 --- a/share/extensions/ffproc.py +++ b/share/extensions/ffproc.py @@ -23,172 +23,172 @@ from ffgeom import * threshold=0.0000000001 def FindFrets(strings, meta, scale, tuning, numfrets): - scale = scale['steps'] - - #if the string ends don't fall on the nut and bridge - #don't look for partial frets. - numStrings = len(strings) - doPartials = True - parallelFrets = True - - nut = Segment(strings[0][0],strings[-1][0]) - bridge = Segment(strings[0][1],strings[-1][1]) - midline = Segment( - Point((nut[1]['x']+nut[0]['x'])/2.0,(nut[1]['y']+nut[0]['y'])/2.0), - Point((bridge[1]['x']+bridge[0]['x'])/2.0,(bridge[1]['y']+bridge[0]['y'])/2.0)) - for s in strings: - if nut.distanceToPoint(s[0])>=threshold or bridge.distanceToPoint(s[1])>=threshold: - doPartials = False - break - - denom = ((bridge[1]['y']-bridge[0]['y'])*(nut[1]['x']-nut[0]['x']))-((bridge[1]['x']-bridge[0]['x'])*(nut[1]['y']-nut[0]['y'])) - if denom != 0: - parallelFrets = False - - fretboard = [] - tones = len(scale)-1 - for i in range(len(strings)): - base = tuning[i] - frets = [] - if doPartials: - frets.append(Segment(meta[i][0],meta[i+1][0])) - else: - frets.append(Segment(strings[i][0],strings[i][0])) - last = strings[i][0] - - for j in range(numfrets): - step=((base+j-1)%(tones))+1 - ratio=1.0-((scale[step][1]*scale[step-1][0])/(scale[step][0]*scale[step-1][1])) - x = last['x']+(ratio*(strings[i][1]['x']-last['x'])) - y = last['y']+(ratio*(strings[i][1]['y']-last['y'])) - current = Point(x,y) - temp = Segment(strings[i][0],current) - totalRatio = temp.length()/strings[i].length() - - if doPartials: - #partials depending on outer strings (questionable) - if parallelFrets: - temp = nut.createParallel(current) - else: - temp = Segment(strings[0].pointAtLength(strings[0].length()*totalRatio), - strings[-1].pointAtLength(strings[-1].length()*totalRatio)) - frets.append(Segment(intersectSegments(temp,meta[i]),intersectSegments(temp,meta[i+1]))) - else: - frets.append(Segment(current,current)) - last = current - fretboard.append(frets) - return fretboard - + scale = scale['steps'] + + #if the string ends don't fall on the nut and bridge + #don't look for partial frets. + numStrings = len(strings) + doPartials = True + parallelFrets = True + + nut = Segment(strings[0][0],strings[-1][0]) + bridge = Segment(strings[0][1],strings[-1][1]) + midline = Segment( + Point((nut[1]['x']+nut[0]['x'])/2.0,(nut[1]['y']+nut[0]['y'])/2.0), + Point((bridge[1]['x']+bridge[0]['x'])/2.0,(bridge[1]['y']+bridge[0]['y'])/2.0)) + for s in strings: + if nut.perpDistanceToPoint(s[0])>=threshold or bridge.perpDistanceToPoint(s[1])>=threshold: + doPartials = False + break + + denom = ((bridge[1]['y']-bridge[0]['y'])*(nut[1]['x']-nut[0]['x']))-((bridge[1]['x']-bridge[0]['x'])*(nut[1]['y']-nut[0]['y'])) + if denom != 0: + parallelFrets = False + + fretboard = [] + tones = len(scale)-1 + for i in range(len(strings)): + base = tuning[i] + frets = [] + if doPartials: + frets.append(Segment(meta[i][0],meta[i+1][0])) + else: + frets.append(Segment(strings[i][0],strings[i][0])) + last = strings[i][0] + + for j in range(numfrets): + step=((base+j-1)%(tones))+1 + ratio=1.0-((scale[step][1]*scale[step-1][0])/(scale[step][0]*scale[step-1][1])) + x = last['x']+(ratio*(strings[i][1]['x']-last['x'])) + y = last['y']+(ratio*(strings[i][1]['y']-last['y'])) + current = Point(x,y) + temp = Segment(strings[i][0],current) + totalRatio = temp.length()/strings[i].length() + + if doPartials: + #partials depending on outer strings (questionable) + if parallelFrets: + temp = nut.createParallel(current) + else: + temp = Segment(strings[0].pointAtLength(strings[0].length()*totalRatio), + strings[-1].pointAtLength(strings[-1].length()*totalRatio)) + frets.append(Segment(intersectSegments(temp,meta[i]),intersectSegments(temp,meta[i+1]))) + else: + frets.append(Segment(current,current)) + last = current + fretboard.append(frets) + return fretboard + def FindStringsSingleScale(numStrings,scaleLength,nutWidth,bridgeWidth,oNF,oBF,oNL,oBL): - strings = [] - meta = [] - nutHalf = nutWidth/2 - bridgeHalf = bridgeWidth/2 - nutCandidateCenter = (nutHalf) + oNL - bridgeCandidateCenter = (bridgeHalf) + oBL - if bridgeCandidateCenter >= nutCandidateCenter: - center = bridgeCandidateCenter - else: - center = nutCandidateCenter - nutStringSpacing = nutWidth/(numStrings-1) - bridgeStringSpacing = bridgeWidth/(numStrings-1) - - for i in range(numStrings): - strings.append(Segment(Point(center+nutHalf-(i*nutStringSpacing),0), - Point(center+bridgeHalf-(i*bridgeStringSpacing),scaleLength))) - - meta.append(Segment(Point(center+nutHalf+oNF,0),Point(center+bridgeHalf+oBF,scaleLength))) - for i in range(1,numStrings): - meta.append(Segment( - Point((strings[i-1][0]['x']+strings[i][0]['x'])/2.0, - (strings[i-1][0]['y']+strings[i][0]['y'])/2.0), - Point((strings[i-1][1]['x']+strings[i][1]['x'])/2.0, - (strings[i-1][1]['y']+strings[i][1]['y'])/2.0))) - meta.append(Segment(Point(center-(nutHalf+oNL),0),Point(center-(bridgeHalf+oBL),scaleLength))) - - return strings, meta + strings = [] + meta = [] + nutHalf = nutWidth/2 + bridgeHalf = bridgeWidth/2 + nutCandidateCenter = (nutHalf) + oNL + bridgeCandidateCenter = (bridgeHalf) + oBL + if bridgeCandidateCenter >= nutCandidateCenter: + center = bridgeCandidateCenter + else: + center = nutCandidateCenter + nutStringSpacing = nutWidth/(numStrings-1) + bridgeStringSpacing = bridgeWidth/(numStrings-1) + + for i in range(numStrings): + strings.append(Segment(Point(center+nutHalf-(i*nutStringSpacing),0), + Point(center+bridgeHalf-(i*bridgeStringSpacing),scaleLength))) + + meta.append(Segment(Point(center+nutHalf+oNF,0),Point(center+bridgeHalf+oBF,scaleLength))) + for i in range(1,numStrings): + meta.append(Segment( + Point((strings[i-1][0]['x']+strings[i][0]['x'])/2.0, + (strings[i-1][0]['y']+strings[i][0]['y'])/2.0), + Point((strings[i-1][1]['x']+strings[i][1]['x'])/2.0, + (strings[i-1][1]['y']+strings[i][1]['y'])/2.0))) + meta.append(Segment(Point(center-(nutHalf+oNL),0),Point(center-(bridgeHalf+oBL),scaleLength))) + + return strings, meta def FindStringsMultiScale(numStrings,scaleLengthF,scaleLengthL,nutWidth,bridgeWidth,perp,oNF,oBF,oNL,oBL): - strings = [] - meta = [] - nutHalf = nutWidth/2 - bridgeHalf = bridgeWidth/2 - nutCandidateCenter = (nutHalf)+oNL - bridgeCandidateCenter = (bridgeHalf)+oBL - if bridgeCandidateCenter >= nutCandidateCenter: - xcenter = bridgeCandidateCenter - else: - nutCandidateCenter - - fbnxf = xcenter+nutHalf+oNF - fbbxf = xcenter+bridgeHalf+oBF - fbnxl = xcenter-(nutHalf+oNL) - fbbxl = xcenter-(bridgeHalf+oBL) - - snxf = xcenter+nutHalf - sbxf = xcenter+bridgeHalf - snxl = xcenter-nutHalf - sbxl = xcenter-bridgeHalf - - fdeltax = sbxf-snxf - ldeltax = sbxl-snxl - fdeltay = math.sqrt((scaleLengthF*scaleLengthF)-(fdeltax*fdeltax)) - ldeltay = math.sqrt((scaleLengthL*scaleLengthL)-(ldeltax*ldeltax)) - - fperp = perp*fdeltay - lperp = perp*ldeltay - - #temporarily place first and last strings - first = Segment(Point(snxf,0),Point(sbxf,fdeltay)) - last = Segment(Point(snxl,0),Point(sbxl,ldeltay)) - - if fdeltay<=ldeltay: - first.translate(0,(lperp-fperp)) - else: - last.translate(0,(fperp-lperp)) - - nut = Segment(first[0].copy(),last[0].copy()) - bridge = Segment(first[1].copy(),last[1].copy()) - #overhang measurements are now converted from delta x to along line lengths - oNF = (oNF*nut.length())/nutWidth - oNL = (oNL*nut.length())/nutWidth - oBF = (oBF*bridge.length())/bridgeWidth - oBL = (oBL*bridge.length())/bridgeWidth - #place fretboard edges - fbf = Segment(nut.pointAtLength(-oNF),bridge.pointAtLength(-oBF)) - fbl = Segment(nut.pointAtLength(nut.length()+oNL),bridge.pointAtLength(bridge.length()+oBL)) - #normalize values into the first quadrant via translate - if fbf[0]['y']<0 or fbl[0]['y']<0: - if fbf[0]['y']<=fbl[0]['y']: - move = -fbf[0]['y'] - else: - move = -fbl[0]['y'] - - first.translate(0,move) - last.translate(0,move) - nut.translate(0,move) - bridge.translate(0,move) - fbf.translate(0,move) - fbl.translate(0,move) - - #output values - nutStringSpacing = nut.length()/(numStrings-1) - bridgeStringSpacing = bridge.length()/(numStrings-1) - strings.append(first) - for i in range(1,numStrings-1): - n = nut.pointAtLength(i*nutStringSpacing) - b = bridge.pointAtLength(i*bridgeStringSpacing) - strings.append(Segment(Point(n['x'],n['y']),Point(b['x'],b['y']))) - strings.append(last) - - meta.append(fbf) - for i in range(1,numStrings): - meta.append(Segment( - Point((strings[i-1][0]['x']+strings[i][0]['x'])/2.0, - (strings[i-1][0]['y']+strings[i][0]['y'])/2.0), - Point((strings[i-1][1]['x']+strings[i][1]['x'])/2.0, - (strings[i-1][1]['y']+strings[i][1]['y'])/2.0))) - - meta.append(fbl) - - return strings, meta + strings = [] + meta = [] + nutHalf = nutWidth/2 + bridgeHalf = bridgeWidth/2 + nutCandidateCenter = (nutHalf)+oNL + bridgeCandidateCenter = (bridgeHalf)+oBL + if bridgeCandidateCenter >= nutCandidateCenter: + xcenter = bridgeCandidateCenter + else: + nutCandidateCenter + + fbnxf = xcenter+nutHalf+oNF + fbbxf = xcenter+bridgeHalf+oBF + fbnxl = xcenter-(nutHalf+oNL) + fbbxl = xcenter-(bridgeHalf+oBL) + + snxf = xcenter+nutHalf + sbxf = xcenter+bridgeHalf + snxl = xcenter-nutHalf + sbxl = xcenter-bridgeHalf + + fdeltax = sbxf-snxf + ldeltax = sbxl-snxl + fdeltay = math.sqrt((scaleLengthF*scaleLengthF)-(fdeltax*fdeltax)) + ldeltay = math.sqrt((scaleLengthL*scaleLengthL)-(ldeltax*ldeltax)) + + fperp = perp*fdeltay + lperp = perp*ldeltay + + #temporarily place first and last strings + first = Segment(Point(snxf,0),Point(sbxf,fdeltay)) + last = Segment(Point(snxl,0),Point(sbxl,ldeltay)) + + if fdeltay<=ldeltay: + first.translate(0,(lperp-fperp)) + else: + last.translate(0,(fperp-lperp)) + + nut = Segment(first[0].copy(),last[0].copy()) + bridge = Segment(first[1].copy(),last[1].copy()) + #overhang measurements are now converted from delta x to along line lengths + oNF = (oNF*nut.length())/nutWidth + oNL = (oNL*nut.length())/nutWidth + oBF = (oBF*bridge.length())/bridgeWidth + oBL = (oBL*bridge.length())/bridgeWidth + #place fretboard edges + fbf = Segment(nut.pointAtLength(-oNF),bridge.pointAtLength(-oBF)) + fbl = Segment(nut.pointAtLength(nut.length()+oNL),bridge.pointAtLength(bridge.length()+oBL)) + #normalize values into the first quadrant via translate + if fbf[0]['y']<0 or fbl[0]['y']<0: + if fbf[0]['y']<=fbl[0]['y']: + move = -fbf[0]['y'] + else: + move = -fbl[0]['y'] + + first.translate(0,move) + last.translate(0,move) + nut.translate(0,move) + bridge.translate(0,move) + fbf.translate(0,move) + fbl.translate(0,move) + + #output values + nutStringSpacing = nut.length()/(numStrings-1) + bridgeStringSpacing = bridge.length()/(numStrings-1) + strings.append(first) + for i in range(1,numStrings-1): + n = nut.pointAtLength(i*nutStringSpacing) + b = bridge.pointAtLength(i*bridgeStringSpacing) + strings.append(Segment(Point(n['x'],n['y']),Point(b['x'],b['y']))) + strings.append(last) + + meta.append(fbf) + for i in range(1,numStrings): + meta.append(Segment( + Point((strings[i-1][0]['x']+strings[i][0]['x'])/2.0, + (strings[i-1][0]['y']+strings[i][0]['y'])/2.0), + Point((strings[i-1][1]['x']+strings[i][1]['x'])/2.0, + (strings[i-1][1]['y']+strings[i][1]['y'])/2.0))) + + meta.append(fbl) + + return strings, meta