summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 9e9083d)
raw | patch | inline | side by side (parent: 9e9083d)
author | buliabyak <buliabyak@users.sourceforge.net> | |
Thu, 23 Nov 2006 20:42:36 +0000 (20:42 +0000) | ||
committer | buliabyak <buliabyak@users.sourceforge.net> | |
Thu, 23 Nov 2006 20:42:36 +0000 (20:42 +0000) |
share/extensions/Makefile.am | patch | blob | history | |
share/extensions/ffgeom.py | [deleted file] | patch | blob | history |
share/extensions/ffmet.inx | [deleted file] | patch | blob | history |
share/extensions/ffms.inx | [deleted file] | patch | blob | history |
share/extensions/ffproc.py | [deleted file] | patch | blob | history |
share/extensions/ffscale.py | [deleted file] | patch | blob | history |
share/extensions/ffset.inx | [deleted file] | patch | blob | history |
share/extensions/ffss.inx | [deleted file] | patch | blob | history |
share/extensions/fretfind.py | [deleted file] | patch | blob | history |
index 8a6ad980de2340b6d404887ca2a100584ad23fd3..8015d8792fbf535fff6ac5d693e9d18ec853e399 100644 (file)
cubicsuperpath.py \
dots.py \
export_gimp_palette.py \
- ffgeom.py \
- ffproc.py \
- ffscale.py \
- fretfind.py \
funcplot.py \
handles.py \
inkex.py \
pdf_output_via_gs_on_win32.inx.txt \
txt2svg.inx \
dots.inx \
- ffmet.inx \
- ffms.inx \
- ffss.inx \
- ffset.inx \
funcplot.inx \
handles.inx \
interp.inx \
diff --git a/share/extensions/ffgeom.py b/share/extensions/ffgeom.py
+++ /dev/null
@@ -1,138 +0,0 @@
-#!/usr/bin/env python
-"""
- ffgeom.py
- Copyright (C) 2005 Aaron Cyril Spike, aaron@ekips.org
-
- This file is part of FretFind 2-D.
-
- FretFind 2-D is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- FretFind 2-D is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with FretFind 2-D; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-"""
-import math
-try:
- NaN = float('NaN')
-except ValueError:
- PosInf = 1e300000
- NaN = PosInf/PosInf
-
-class Point:
- precision = 5
- def __init__(self, x, y):
- self.__coordinates = {'x' : float(x), 'y' : float(y)}
- def __getitem__(self, key):
- return self.__coordinates[key]
- def __setitem__(self, key, value):
- self.__coordinates[key] = float(value)
- def __repr__(self):
- return '(%s, %s)' % (round(self['x'],self.precision),round(self['y'],self.precision))
- def copy(self):
- return Point(self['x'],self['y'])
- def translate(self, x, y):
- self['x'] += x
- self['y'] += y
- def move(self, x, y):
- self['x'] = float(x)
- self['y'] = float(y)
-
-class Segment:
- def __init__(self, e0, e1):
- self.__endpoints = [e0, e1]
- def __getitem__(self, key):
- return self.__endpoints[key]
- def __setitem__(self, key, value):
- self.__endpoints[key] = value
- def __repr__(self):
- return repr(self.__endpoints)
- def copy(self):
- return Segment(self[0],self[1])
- def translate(self, x, y):
- self[0].translate(x,y)
- self[1].translate(x,y)
- def move(self,e0,e1):
- self[0] = e0
- self[1] = e1
- def delta_x(self):
- return self[1]['x'] - self[0]['x']
- def delta_y(self):
- return self[1]['y'] - self[0]['y']
- #alias functions
- run = delta_x
- rise = delta_y
- def slope(self):
- if self.delta_x() != 0:
- return self.delta_x() / self.delta_y()
- return NaN
- def intercept(self):
- if self.delta_x() != 0:
- return self[1]['y'] - (self[0]['x'] * self.slope())
- return NaN
- def distanceToPoint(self, p):
- s2 = Segment(self[0],p)
- c1 = dot(s2,self)
- if c1 <= 0:
- return Segment(p,self[0]).length()
- c2 = dot(self,self)
- if c2 <= c1:
- return Segment(p,self[1]).length()
- return self.perpDistanceToPoint(p)
- def perpDistanceToPoint(self, p):
- len = self.length()
- if len == 0: return NaN
- return math.fabs(((self[1]['x'] - self[0]['x']) * (self[0]['y'] - p['y'])) - \
- ((self[0]['x'] - p['x']) * (self[1]['y'] - self[0]['y']))) / len
- def angle(self):
- return math.pi * (math.atan2(self.delta_y(), self.delta_x())) / 180
- def length(self):
- return math.sqrt((self.delta_x() ** 2) + (self.delta_y() ** 2))
- def pointAtLength(self, len):
- if self.length() == 0: return Point(NaN, NaN)
- ratio = len / self.length()
- x = self[0]['x'] + (ratio * self.delta_x())
- y = self[0]['y'] + (ratio * self.delta_y())
- return Point(x, y)
- def pointAtRatio(self, ratio):
- if self.length() == 0: return Point(NaN, NaN)
- x = self[0]['x'] + (ratio * self.delta_x())
- y = self[0]['y'] + (ratio * self.delta_y())
- return Point(x, y)
- def createParallel(self, p):
- return Segment(Point(p['x'] + self.delta_x(), p['y'] + self.delta_y()), p)
- def intersect(self, s):
- return intersectSegments(self, s)
-
-def intersectSegments(s1, s2):
- x1 = s1[0]['x']
- x2 = s1[1]['x']
- x3 = s2[0]['x']
- x4 = s2[1]['x']
-
- y1 = s1[0]['y']
- y2 = s1[1]['y']
- y3 = s2[0]['y']
- y4 = s2[1]['y']
-
- denom = ((y4 - y3) * (x2 - x1)) - ((x4 - x3) * (y2 - y1))
- num1 = ((x4 - x3) * (y1 - y3)) - ((y4 - y3) * (x1 - x3))
- num2 = ((x2 - x1) * (y1 - y3)) - ((y2 - y1) * (x1 - x3))
-
- num = num1
-
- if denom != 0:
- x = x1 + ((num / denom) * (x2 - x1))
- y = y1 + ((num / denom) * (y2 - y1))
- return Point(x, y)
- return Point(NaN, NaN)
-
-def dot(s1, s2):
- return s1.delta_x() * s2.delta_x() + s1.delta_y() * s2.delta_y()
diff --git a/share/extensions/ffmet.inx b/share/extensions/ffmet.inx
+++ /dev/null
@@ -1,26 +0,0 @@
-<inkscape-extension>
- <_name>Multi Length Equal Temperament</_name>
- <id>org.ekips.filter.fretfind.multi.et</id>
- <dependency type="executable" location="extensions">fretfind.py</dependency>
- <dependency type="executable" location="extensions">inkex.py</dependency>
- <param name="firstscalelength" type="float" min="1" max="500" _gui-text="First String Length">25</param>
- <param name="lastscalelength" type="float" min="1" max="500" _gui-text="Last String Length">26</param>
- <param name="perpdist" type="float" min="-2" max="2" _gui-text="Perpendicular Distance">0.5</param>
- <param name="nutwidth" type="float" min="0" max="100" _gui-text="Nut Width">2</param>
- <param name="bridgewidth" type="float" min="0" max="100" _gui-text="Bridge Width">2.5</param>
- <param name="etbase" type="float" min="1" max="10" _gui-text="Scale Base (2 for Octave)">2</param>
- <param name="etroot" type="float" min="0.01" max="1000" _gui-text="Tones in Scale">12</param>
- <param name="frets" type="int" min="1" max="1000" _gui-text="Number of Frets">24</param>
- <param name="strings" type="int" min="1" max="60" _gui-text="Number of Strings">6</param>
- <param name="fbedges" type="float" min="0" max="100" _gui-text="Fretboard Edges">0.0975</param>
- <param name="pxperunit" type="float" min="0" max="1000" _gui-text="px per Unit">90</param>
- <effect>
- <object-type>all</object-type>
- <effects-menu>
- <submenu _name="Fretboard Designer"/>
- </effects-menu>
- </effect>
- <script>
- <command reldir="extensions" interpreter="python">fretfind.py</command>
- </script>
-</inkscape-extension>
diff --git a/share/extensions/ffms.inx b/share/extensions/ffms.inx
+++ /dev/null
@@ -1,26 +0,0 @@
-<inkscape-extension>
- <_name>Multi Length Scala</_name>
- <id>org.ekips.filter.fretfind.multi.scala</id>
- <dependency type="executable" location="extensions">fretfind.py</dependency>
- <dependency type="executable" location="extensions">inkex.py</dependency>
- <param name="firstscalelength" type="float" min="1" max="500" _gui-text="First String Length">25</param>
- <param name="lastscalelength" type="float" min="1" max="500" _gui-text="Last String Length">26</param>
- <param name="perpdist" type="float" min="-2" max="2" _gui-text="Perpendicular Distance">0.5</param>
- <param name="nutwidth" type="float" min="0" max="100" _gui-text="Nut Width">2</param>
- <param name="bridgewidth" type="float" min="0" max="100" _gui-text="Bridge Width">2.5</param>
- <param name="scalafile" type="string" _gui-text="Path to Scala *.scl File">none</param>
- <param name="tuning" type="string" _gui-text="Tuning (scale step for each string separated by semicolons)">0;0;0;0;0;0</param>
- <param name="frets" type="int" min="1" max="1000" _gui-text="Number of Frets">24</param>
- <param name="strings" type="int" min="1" max="60" _gui-text="Number of Strings">6</param>
- <param name="fbedges" type="float" min="0" max="100" _gui-text="Fretboard Edges">0.0975</param>
- <param name="pxperunit" type="float" min="0" max="1000" _gui-text="px per Unit">90</param>
- <effect>
- <object-type>all</object-type>
- <effects-menu>
- <submenu _name="Fretboard Designer"/>
- </effects-menu>
- </effect>
- <script>
- <command reldir="extensions" interpreter="python">fretfind.py</command>
- </script>
-</inkscape-extension>
diff --git a/share/extensions/ffproc.py b/share/extensions/ffproc.py
+++ /dev/null
@@ -1,194 +0,0 @@
-#!/usr/bin/env python
-'''
- Copyright (C) 2004 Aaron Cyril Spike
-
- This file is part of FretFind 2-D.
-
- FretFind 2-D is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- FretFind 2-D is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with FretFind 2-D; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-'''
-import sys
-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.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
-
-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
diff --git a/share/extensions/ffscale.py b/share/extensions/ffscale.py
+++ /dev/null
@@ -1,73 +0,0 @@
-#!/usr/bin/env python
-'''
- Copyright (C) 2004 Aaron Cyril Spike
-
- This file is part of FretFind 2-D.
-
- FretFind 2-D is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- FretFind 2-D is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with FretFind 2-D; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-'''
-import math
-
-def ETScale(tones, octave=2.0):
- octave, tones = float(octave), float(tones)
- scale = {'steps':[[1.0,1.0]], 'title':'', 'errors':0, 'errorstring':''}
- if not tones:
- scale['errors'] += 1
- scale['errorstring'] = 'Error: Number of tones must be non zero!'
- else:
- ratio = octave**(1/tones)
- scale['title'] = '%s root of %s Equal Temperament' % (tones, octave)
- scale['steps'].append([ratio,1])
- return scale
-
-def ScalaScale(scala):
- #initial step 0 or 1/1 is implicit
- scale = {'steps':[[1.0,1.0]], 'title':'', 'errors':0, 'errorstring':''}
-
- #split scale discarding commments
- lines = [l.strip() for l in scala.strip().splitlines() if not l.strip().startswith('!')]
-
- #first line may be blank and contains the title
- scale['title'] = lines.pop(0)
-
- #second line indicates the number of note lines that should follow
- expected = int(lines.pop(0))
-
- #discard blank lines and anything following whitespace
- lines = [l.split()[0] for l in lines if l != '']
-
- if len(lines) != expected:
- scale['errors'] += 1
- scale['errorstring'] = 'Error: expected %s more tones but found %s!' % (expected,len(lines))
- else:
- for l in lines:
- #interpret anyline containing a dot as cents
- if l.find('.') >= 0:
- num = 2**(float(l)/1200)
- denom = 1
- #everything else is a ratio
- elif l.find('/') >=0:
- l = l.split('/')
- num = float(int(l[0]))
- denom = float(int(l[1]))
- else:
- num = float(int(l))
- denom = 1.0
- scale['steps'].append([num,denom])
-
- if (num < 0) ^ (denom <= 0):
- scale['errors'] += 1
- scale['errorstring'] += 'Error at "'+l+'": Negative and undefined ratios are not allowed!\n'
- return scale
diff --git a/share/extensions/ffset.inx b/share/extensions/ffset.inx
+++ /dev/null
@@ -1,24 +0,0 @@
-<inkscape-extension>
- <_name>Single Length Equal Temperament</_name>
- <id>org.ekips.filter.fretfind.single.et</id>
- <dependency type="executable" location="extensions">fretfind.py</dependency>
- <dependency type="executable" location="extensions">inkex.py</dependency>
- <param name="scalelength" type="float" min="1" max="500" _gui-text="Scale Length">25</param>
- <param name="nutwidth" type="float" min="0" max="100" _gui-text="Nut Width">2</param>
- <param name="bridgewidth" type="float" min="0" max="100" _gui-text="Bridge Width">2.5</param>
- <param name="etbase" type="float" min="1" max="10" _gui-text="Scale Base (2 for Octave)">2</param>
- <param name="etroot" type="float" min="0.01" max="1000" _gui-text="Tones in Scale">12</param>
- <param name="frets" type="int" min="1" max="1000" _gui-text="Number of Frets">24</param>
- <param name="strings" type="int" min="1" max="60" _gui-text="Number of Strings">6</param>
- <param name="fbedges" type="float" min="0" max="100" _gui-text="Fretboard Edges">0.0975</param>
- <param name="pxperunit" type="float" min="0" max="1000" _gui-text="px per Unit">90</param>
- <effect>
- <object-type>all</object-type>
- <effects-menu>
- <submenu _name="Fretboard Designer"/>
- </effects-menu>
- </effect>
- <script>
- <command reldir="extensions" interpreter="python">fretfind.py</command>
- </script>
-</inkscape-extension>
diff --git a/share/extensions/ffss.inx b/share/extensions/ffss.inx
+++ /dev/null
@@ -1,24 +0,0 @@
-<inkscape-extension>
- <_name>Single Length Scala</_name>
- <id>org.ekips.filter.fretfind.single.scala</id>
- <dependency type="executable" location="extensions">fretfind.py</dependency>
- <dependency type="executable" location="extensions">inkex.py</dependency>
- <param name="scalelength" type="float" min="1" max="500" _gui-text="Scale Length">25</param>
- <param name="nutwidth" type="float" min="0" max="100" _gui-text="Nut Width">2</param>
- <param name="bridgewidth" type="float" min="0" max="100" _gui-text="Bridge Width">2.5</param>
- <param name="scalafile" type="string" _gui-text="Path to Scala *.scl File">none</param>
- <param name="tuning" type="string" _gui-text="Tuning (Scale step for each string separated by semicolons)">0;0;0;0;0;0</param>
- <param name="frets" type="int" min="1" max="1000" _gui-text="Number of Frets">24</param>
- <param name="strings" type="int" min="1" max="60" _gui-text="Number of Strings">6</param>
- <param name="fbedges" type="float" min="0" max="100" _gui-text="Fretboard Edges">0.0975</param>
- <param name="pxperunit" type="float" min="0" max="1000" _gui-text="px per Unit">90</param>
- <effect>
- <object-type>all</object-type>
- <effects-menu>
- <submenu _name="Fretboard Designer"/>
- </effects-menu>
- </effect>
- <script>
- <command reldir="extensions" interpreter="python">fretfind.py</command>
- </script>
-</inkscape-extension>
diff --git a/share/extensions/fretfind.py b/share/extensions/fretfind.py
+++ /dev/null
@@ -1,186 +0,0 @@
-#!/usr/bin/env python
-'''
-Copyright (C) 2005 Aaron Spike, aaron@ekips.org
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-'''
-import sys
-import inkex, simplestyle, simplepath
-import ffscale, ffproc
-
-def seg2path(seg):
- return "M%s,%sL%s,%s" % (seg[0]['x'],seg[0]['y'],seg[1]['x'],seg[1]['y'])
-
-class FretFind(inkex.Effect):
- def __init__(self):
- inkex.Effect.__init__(self)
- self.doScala = False
- self.doMultiScale = False
- self.OptionParser.add_option("--scalafile",
- action="store", type="string",
- dest="scalafile", default=None,
- help="")
- self.OptionParser.add_option("--scalascale",
- action="store", type="string",
- dest="scalascale", default=None,
- help="")
- self.OptionParser.add_option("--etbase",
- action="store", type="float",
- dest="etbase", default=2.0,
- help="")
- self.OptionParser.add_option("--etroot",
- action="store", type="float",
- dest="etroot", default=12.0,
- help="")
- self.OptionParser.add_option("--tuning",
- action="store", type="string",
- dest="tuning", default="0;0;0;0;0;0",
- help="")
- self.OptionParser.add_option("--perpdist",
- action="store", type="float",
- dest="perpdist", default=0.5,
- help="")
- self.OptionParser.add_option("--offset",
- action="store", type="float",
- dest="offset", default=0.0,
- help="")
- self.OptionParser.add_option("--scalelength",
- action="store", type="float",
- dest="scalelength", default=25.0,
- help="")
- self.OptionParser.add_option("--firstscalelength",
- action="store", type="float",
- dest="firstscalelength", default=None,
- help="")
- self.OptionParser.add_option("--lastscalelength",
- action="store", type="float",
- dest="lastscalelength", default=None,
- help="")
- self.OptionParser.add_option("--nutwidth",
- action="store", type="float",
- dest="nutwidth", default=1.5,
- help="")
- self.OptionParser.add_option("--bridgewidth",
- action="store", type="float",
- dest="bridgewidth", default=2.5,
- help="")
- self.OptionParser.add_option("--frets",
- action="store", type="int",
- dest="frets", default=24,
- help="")
- self.OptionParser.add_option("--strings",
- action="store", type="int",
- dest="strings", default=6,
- help="")
- self.OptionParser.add_option("--fbedges",
- action="store", type="float",
- dest="fbedges", default=0.0975,
- help="")
- self.OptionParser.add_option("--pxperunit",
- action="store", type="float",
- dest="pxperunit", default=90,
- help="")
- def checkopts(self):
- #scale type
- if self.options.scalascale is not None:
- self.doScala = True
- if self.options.scalafile is not None:
- if self.doScala:
- sys.stderr.write('Mutually exclusive options: if found scalafile will override scalascale.')
- else:
- self.options.scalascale = ""
- self.doScala = True
- try:
- f = open(self.options.scalafile,'r')
- self.options.scalascale = f.read()
- except:
- sys.exit('Scala scale description file expected.')
- #scale
- if self.doScala:
- self.scale = ffscale.ScalaScale(self.options.scalascale)
- else:
- self.scale = ffscale.ETScale(self.options.etroot,self.options.etbase)
-
- #string length
- first = self.options.firstscalelength is not None
- last = self.options.lastscalelength is not None
- if first and last:
- self.doMultiScale = True
- elif first:
- sys.stderr.write('Missing lastscalelength: overriding scalelength with firstscalelength.')
- self.options.scalelength = self.options.firstscalelength
- elif last:
- sys.stderr.write('Missing firstscalelength: overriding scalelength with lastscalelength.')
- self.options.scalelength = self.options.lastscalelength
-
- #tuning
- self.tuning = [int(t.strip()) for t in self.options.tuning.split(";")]
- self.tuning.extend([0 for i in range(self.options.strings - len(self.tuning))])
-
- def effect(self):
- self.checkopts()
-
- o = self.options.fbedges
- oNF,oBF,oNL,oBL = o,o,o,o
-
- if self.doMultiScale:
- strings, meta = ffproc.FindStringsMultiScale(self.options.strings,self.options.firstscalelength,
- self.options.lastscalelength,self.options.nutwidth,self.options.bridgewidth,
- self.options.perpdist,oNF,oBF,oNL,oBL)
- else:
- strings, meta = ffproc.FindStringsSingleScale(self.options.strings,self.options.scalelength,
- self.options.nutwidth,self.options.bridgewidth,
- oNF,oBF,oNL,oBL)
-
- frets = ffproc.FindFrets(strings, meta, self.scale, self.tuning, self.options.frets)
-
- edgepath = seg2path(meta[0]) + seg2path(meta[-1])
- stringpath = "".join([seg2path(s) for s in strings])
- fretpath = "".join(["".join([seg2path(f) for f in s]) for s in frets])
-
- group = self.document.createElement('svg:g')
- group.setAttribute('transform',"scale(%s,%s)" % (self.options.pxperunit,self.options.pxperunit))
- self.current_layer.appendChild(group)
-
- edge = self.document.createElement('svg:path')
- s = {'stroke-linejoin': 'miter', 'stroke-width': '0.01px',
- 'stroke-opacity': '1.0', 'fill-opacity': '1.0',
- 'stroke': '#0000FF', 'stroke-linecap': 'butt',
- 'fill': 'none'}
- edge.setAttribute('style', simplestyle.formatStyle(s))
- edge.setAttribute('d', edgepath)
-
- string = self.document.createElement('svg:path')
- s = {'stroke-linejoin': 'miter', 'stroke-width': '0.01px',
- 'stroke-opacity': '1.0', 'fill-opacity': '1.0',
- 'stroke': '#FF0000', 'stroke-linecap': 'butt',
- 'fill': 'none'}
- string.setAttribute('style', simplestyle.formatStyle(s))
- string.setAttribute('d', stringpath)
-
- fret = self.document.createElement('svg:path')
- s = {'stroke-linejoin': 'miter', 'stroke-width': '0.01px',
- 'stroke-opacity': '1.0', 'fill-opacity': '1.0',
- 'stroke': '#000000', 'stroke-linecap': 'butt',
- 'fill': 'none'}
- fret.setAttribute('style', simplestyle.formatStyle(s))
- fret.setAttribute('d', fretpath)
-
- group.appendChild(edge)
- group.appendChild(string)
- group.appendChild(fret)
-
-e = FretFind()
-e.affect()
\ No newline at end of file