Esempio n. 1
0
 def __init__(self, patch, fromname, index, name):
     self.patch = patch
     self.fromname = fromname
     self.index = index
     self.name = name
     self.modules = []
     self.cables = []
     self.netlist = NetList()
     self.free_indexes = range(1, MAX_MODULES + 1)
Esempio n. 2
0
File: file.py Progetto: msg/g2ools
 def __init__(self, patch, fromname, index, name):
   self.patch = patch
   self.fromname = fromname
   self.index = index
   self.name = name
   self.modules = []
   self.cables = []
   self.netlist = NetList()
   self.free_indexes = range(1, MAX_MODULES+1)
Esempio n. 3
0
    def parse(self):
        lines = self.lines
        line = lines.pop(0)
        fields = line.split()
        if len(fields) > 1:
            if len(fields) == 8:
                l = fields[0]
                line = ' '.join(fields[1:])
                lines.insert(0, line)
            sect = int(l)
        else:
            sect = int(line)
        if sect:
            area = self.patch.voice
        else:
            area = self.patch.fx
        area.cables = []
        area.netlist = NetList()
        area.cables = [None] * len(self.lines)
        for i in xrange(len(self.lines)):
            values = eval_fields(lines[i])
            c = Cable(area)
            c.color, dmod, dconn, ddir, smod, sconn, sdir = values
            dmodule = area.find_module(dmod)
            smodule = area.find_module(smod)
            if ddir:
                dest = dmodule.outputs[dconn]
            else:
                dest = dmodule.inputs[dconn]
            if sdir:
                source = smodule.outputs[sconn]
            else:
                source = smodule.inputs[sconn]

            # if dest is an output, make it the source
            if dest.direction:
                dest, source = source, dest

            area.cables[i] = c
            c.source, c.dest = source, dest

            source.cables.append(c)
            dest.cables.append(c)

            # update netlist with source and dest
            area.netlist.add(source, dest)
Esempio n. 4
0
class Area(object):
    '''Area class for patch voice and fx area data (modules, cables, etc...)

This class maintains the modules, cable connections, and netlist
for the voice and fx areas of a nord modules g2 patch.

\tuseful members:
\tpatch\tpatch containing area.
\tmodules\tarray of modules within area.
\tcables\tarray of cables connections within area.
'''
    def __init__(self, patch, fromname, index, name):
        self.patch = patch
        self.fromname = fromname
        self.index = index
        self.name = name
        self.modules = []
        self.cables = []
        self.netlist = NetList()
        self.free_indexes = range(1, MAX_MODULES + 1)

    def find_module(self, index):
        '''find_module(index) -> module at index or None'''
        for module in self.modules:
            if module.index == index:
                return module
        return None

    modmembers = ['name', 'index', 'color', 'horiz', 'vert', 'uprate', 'leds']

    def add_module(self, shortnm, **kw):
        '''add_module(shortnm, **kw) -> Module
\tshortnm\tmodule short type name to add.

\t**kw:
\tname\tname of module (label displayed in upper left corner.
\tcolor\tcolor of module (nord.g2.color.g2modulecolors.
\thoriz\tcolumn where module is placed (<32).
\tvert\trow where module is placed (<127)
'''
        if len(self.modules) >= MAX_MODULES:
            raise Exception('Too many modules')

        type = self.fromname(shortnm)
        m = Module(type, self)
        m.name = type.shortnm
        if len(self.free_indexes) == 0:
            raise Exception('No free module indexes')
        m.index = self.free_indexes.pop(0)
        m.color = m.horiz = m.vert = m.uprate = m.leds = 0
        #print 'update kw=', kw
        m.__dict__.update(kw)
        self.modules.append(m)
        return m

    def del_module(self, module):
        '''del_module(module) -> None

\tdelete module from modules sequence.
'''
        self.free_indexes.insert(0, module.index)
        self.modules.remove(module)

    def connect(self, source, dest, color):
        '''connect(source, dest, color) -> None

\tconnect input/output to input from source port to dest port using color.
\tcolor is in nord.g2.colors.g2cablecolors or nord.nm1.colors.nm1cablecolors.

\tcannot connect 2 Outputs together.
'''
        sid = (source.module.index << 16) + source.index
        did = (dest.module.index << 16) + dest.index
        if source.direction == dest.direction and sid > did:
            source, dest = dest, source

        cable = Cable(self)
        self.cables.append(cable)

        cable.color = color

        cable.source = source
        source.cables.append(cable)

        cable.dest = dest
        dest.cables.append(cable)

        self.netlist.add(source, dest)

    def disconnect(self, cable):
        '''disconnect(cable) -> None

\tdisconnect a input or output port - update all cables connected to port
'''
        source, dest = cable.source, cable.dest

        #printf('disconnect %s:%s -> %s:%s\n' (
        #  cable.source.module.name, cable.source.type.name,
        #  cable.dest.module.name, cable.dest.type.name)
        #printf(' cable %s', self.netlist.nettos(cable.source.net))

        # collect all the cables on the net
        cables = []
        for input in source.net.inputs:
            for c in input.cables:
                if not c in cables:
                    cables.append(c)

        cables.remove(cable)
        source.cables.remove(cable)
        dest.cables.remove(cable)
        self.cables.remove(cable)
        self.netlist.delete(source, dest)

        source.net = dest.net = None
        for c in cables:
            #printf('connect\n source %s\n', self.netlist.nettos(c.source.net))
            #printf(' dest %s\n', self.netlist.nettos(c.dest.net))
            self.netlist.add(c.source, c.dest)

        #printf('after disconnect\n source %s\n', self.netlist.nettos(source.net))
        #printf(' dest %s\n', self.netlist.nettos(dest.net))

    def removeconnector(self, connector):
        '''removeconnector(connector) -> connector

\tremove connector from the cable net and cable connections.
\tconnector is a member of the Module object.
'''
        connectors = []
        minconn = None
        mindist = 1000000

        #printf('removeconnector %s:%s\n', connector.module.name,
        #       connector.type.name)
        #printf('before remove %s\n', self.netlist.nettos(connector.net))
        while len(connector.cables):
            cable = connector.cables[0]
            source, dest = cable.source, cable.dest
            self.disconnect(cable)
            if connector == source:
                other = dest
            else:
                other = source
            dist = self.connection_length(connector, other)
            if dist < mindist:
                if minconn:
                    connectors.append(minconn)
                mindist = dist
                minconn = other
            elif not other in connectors:
                connectors.append(other)

        if len(connectors) != 0:
            for connector in connectors:
                #printf(' new %s:%s -> %s:%s\n', minconn.module.name, minconn.type.name,
                #    connector.module.name, connector.type.name)
                if minconn.direction:
                    self.connect(minconn, connector, 0)
                else:
                    self.connect(connector, minconn, 0)
                #printf(' done %s\n', self.netlist.nettos(connector.net))

        #printf('after remove %s\n', self.netlist.nettos(minconn.net))
        return minconn

    # quick cable length calculation
    def cable_length(self, cable):
        '''cable_length(cable) -> length of cable'''
        return self.connection_length(cable.source, cable.dest)

    # quick connection length calculation (returns square distance)
    def connection_length(self, start, end):
        '''connection_length(start, end) -> distance from start port to end port'''
        # horiz coordinates about 20 times bigger.
        sm, em = start.module, end.module
        dh = (19 * em.horiz + end.type.horiz) - (19 * sm.horiz +
                                                 start.type.horiz)
        dv = (em.vert + end.type.vert) - (sm.vert + start.type.vert)
        return (dh**2) + (dv**2)

    def shorten_cables(self):
        '''shorten_cables()

\tmake all cable as short as possible.
'''
        # copy netlist before changes for later
        netlist = self.netlist.copy()

        # remove all cables
        cables = self.cables[:]
        while len(cables):
            cable = cables.pop(0)
            cable.source.net.color = cable.color
            self.disconnect(cable)

        def findclosest(g2area, fromlist, tolist):
            mincablelen = 1000000
            mincable = None
            for fromconn in fromlist:
                for toconn in tolist:
                    cablelen = g2area.connection_length(fromconn, toconn)
                    if cablelen < mincablelen:
                        mincablelen = cablelen
                        mincable = [fromconn, toconn]
            return mincable

        # on each net, successively connect closet connector
        # net list will change while modifying so we need a static copy
        for net in netlist.nets:
            inputs = net.inputs
            if net.output:
                fromconn, toconn = findclosest(self, [net.output], inputs)
            else:
                conn = inputs.pop(0)
                fromconn, toconn = findclosest(self, [conn], inputs)
            self.connect(fromconn, toconn, net.color)
            inputs.remove(toconn)
            connected = [fromconn, toconn]
            while len(inputs):
                fromconn, toconn = findclosest(self, connected, inputs)
                self.connect(fromconn, toconn, net.color)
                inputs.remove(toconn)
                connected.append(toconn)
Esempio n. 5
0
File: file.py Progetto: msg/g2ools
class Area(object):
  '''Area class for patch voice and fx area data (modules, cables, etc...)

This class maintains the modules, cable connections, and netlist
for the voice and fx areas of a nord modules g2 patch.

\tuseful members:
\tpatch\tpatch containing area.
\tmodules\tarray of modules within area.
\tcables\tarray of cables connections within area.
'''
  def __init__(self, patch, fromname, index, name):
    self.patch = patch
    self.fromname = fromname
    self.index = index
    self.name = name
    self.modules = []
    self.cables = []
    self.netlist = NetList()
    self.free_indexes = range(1, MAX_MODULES+1)

  def find_module(self, index):
    '''find_module(index) -> module at index or None'''
    for module in self.modules:
      if module.index == index:
        return module
    return None

  modmembers = [ 'name', 'index', 'color', 'horiz', 'vert', 'uprate', 'leds' ]

  def add_module(self, shortnm, **kw):
    '''add_module(shortnm, **kw) -> Module
\tshortnm\tmodule short type name to add.

\t**kw:
\tname\tname of module (label displayed in upper left corner.
\tcolor\tcolor of module (nord.g2.color.g2modulecolors.
\thoriz\tcolumn where module is placed (<32).
\tvert\trow where module is placed (<127)
'''
    if len(self.modules) >= MAX_MODULES:
      raise Exception('Too many modules')

    type = self.fromname(shortnm)
    m = Module(type, self)
    m.name = type.shortnm
    if len(self.free_indexes) == 0:
      raise Exception('No free module indexes')
    m.index = self.free_indexes.pop(0)
    m.color = m.horiz = m.vert = m.uprate = m.leds = 0
    #print 'update kw=', kw
    m.__dict__.update(kw)
    self.modules.append(m)
    return m

  def del_module(self, module):
    '''del_module(module) -> None

\tdelete module from modules sequence.
'''
    self.free_indexes.insert(0, module.index)
    self.modules.remove(module)


  def connect(self, source, dest, color):
    '''connect(source, dest, color) -> None

\tconnect input/output to input from source port to dest port using color.
\tcolor is in nord.g2.colors.g2cablecolors or nord.nm1.colors.nm1cablecolors.

\tcannot connect 2 Outputs together.
'''
    sid = (source.module.index << 16) + source.index
    did = (dest.module.index << 16) + dest.index
    if source.direction == dest.direction and sid > did:
      source, dest = dest, source

    cable = Cable(self)
    self.cables.append(cable)

    cable.color = color

    cable.source = source
    source.cables.append(cable)

    cable.dest = dest
    dest.cables.append(cable)

    self.netlist.add(source, dest)

  def disconnect(self, cable):
    '''disconnect(cable) -> None

\tdisconnect a input or output port - update all cables connected to port
'''
    source, dest = cable.source, cable.dest

    #printf('disconnect %s:%s -> %s:%s\n' (
    #  cable.source.module.name, cable.source.type.name,
    #  cable.dest.module.name, cable.dest.type.name)
    #printf(' cable %s', self.netlist.nettos(cable.source.net))

    # collect all the cables on the net
    cables = []
    for input in source.net.inputs:
      for c in input.cables:
        if not c in cables:
          cables.append(c)

    cables.remove(cable)
    source.cables.remove(cable)
    dest.cables.remove(cable)
    self.cables.remove(cable)
    self.netlist.delete(source, dest)

    source.net = dest.net = None
    for c in cables:
      #printf('connect\n source %s\n', self.netlist.nettos(c.source.net))
      #printf(' dest %s\n', self.netlist.nettos(c.dest.net))
      self.netlist.add(c.source, c.dest)

    #printf('after disconnect\n source %s\n', self.netlist.nettos(source.net))
    #printf(' dest %s\n', self.netlist.nettos(dest.net))

  def removeconnector(self, connector):
    '''removeconnector(connector) -> connector

\tremove connector from the cable net and cable connections.
\tconnector is a member of the Module object.
'''
    connectors = []
    minconn = None
    mindist = 1000000

    #printf('removeconnector %s:%s\n', connector.module.name,
    #       connector.type.name)
    #printf('before remove %s\n', self.netlist.nettos(connector.net))
    while len(connector.cables):
      cable = connector.cables[0]
      source, dest = cable.source, cable.dest
      self.disconnect(cable)
      if connector == source:
        other = dest
      else:
        other = source
      dist = self.connection_length(connector, other)
      if dist < mindist:
        if minconn:
          connectors.append(minconn)
        mindist = dist
        minconn = other
      elif not other in connectors:
        connectors.append(other)

    if len(connectors) != 0:
      for connector in connectors:
        #printf(' new %s:%s -> %s:%s\n', minconn.module.name, minconn.type.name,
        #    connector.module.name, connector.type.name)
        if minconn.direction:
          self.connect(minconn, connector, 0)
        else:
          self.connect(connector, minconn, 0)
        #printf(' done %s\n', self.netlist.nettos(connector.net))

    #printf('after remove %s\n', self.netlist.nettos(minconn.net))
    return minconn

  # quick cable length calculation
  def cable_length(self, cable):
    '''cable_length(cable) -> length of cable'''
    return self.connection_length(cable.source, cable.dest)

  # quick connection length calculation (returns square distance)
  def connection_length(self, start, end):
    '''connection_length(start, end) -> distance from start port to end port'''
    # horiz coordinates about 20 times bigger.
    sm, em = start.module, end.module
    dh = (19*em.horiz+end.type.horiz)-(19*sm.horiz+start.type.horiz)
    dv = (em.vert+end.type.vert)-(sm.vert+start.type.vert)
    return (dh**2)+(dv**2)

  def shorten_cables(self):
    '''shorten_cables()

\tmake all cable as short as possible.
'''
    # copy netlist before changes for later
    netlist = self.netlist.copy()

    # remove all cables
    cables = self.cables[:]
    while len(cables):
      cable = cables.pop(0)
      cable.source.net.color = cable.color
      self.disconnect(cable)

    def findclosest(g2area, fromlist, tolist):
      mincablelen = 1000000
      mincable = None
      for fromconn in fromlist:
        for toconn in tolist:
          cablelen = g2area.connection_length(fromconn, toconn)
          if cablelen < mincablelen:
            mincablelen = cablelen
            mincable = [fromconn, toconn]
      return mincable

    # on each net, successively connect closet connector
    # net list will change while modifying so we need a static copy
    for net in netlist.nets:
      inputs = net.inputs
      if net.output:
        fromconn, toconn = findclosest(self, [net.output], inputs)
      else:
        conn = inputs.pop(0)
        fromconn, toconn = findclosest(self, [conn], inputs)
      self.connect(fromconn, toconn, net.color)
      inputs.remove(toconn)
      connected = [fromconn, toconn]
      while len(inputs):
        fromconn, toconn = findclosest(self, connected, inputs)
        self.connect(fromconn, toconn, net.color)
        inputs.remove(toconn)
        connected.append(toconn)