docs: def from_NoteContainer(notes, width=80, tuning=None):
      """Return a string made out of ASCII tablature representing a
      NoteContainer object or list of note strings / Note objects.
  
      Throw a FingerError if no playable fingering can be found.
  
      'tuning' should be a StringTuning object or None for the default tuning.
  
      To force a certain fingering you can use a 'string' and 'fret' attribute
      on one or more of the Notes. If the fingering is valid, it will get used
      instead of the default one.
      """
      if tuning is None:
          tuning = default_tuning
      result = begin_track(tuning)
      l = len(result[0])
      w = max(4, (width - l) - 1)
      fingerings = tuning.find_fingering(notes)
      if fingerings != []:
          # Do an attribute check
          f = []
          attr = []
          for note in notes:
              if hasattr(note, 'string') and hasattr(note, 'fret'):
                  n = tuning.get_Note(note.string, note.fret)
                  if n is not None and int(n) == int(note):
                      f += (note.string, note.fret)
                      attr.append(int(note))
  
          # See if there are any possible fingerings with the attributes
          # that are set.
          fres = []
          if f != []:
              for x in fingerings:
                  found = True
                  for pos in f:
                      if pos not in x:
                          found = False
                  if found:
                      fres.append(x)
  
          # Use best fingering.
          if fres != []:
              f = fres[0]
          else:
              # Use default fingering if attributes don't make sense
              f = fingerings[0]
  
          # Build {string: fret} result
          res = {}
          for (string, fret) in f:
              res[string] = str(fret)
          maxfret = max(res.values())
  
          # Produce ASCII
          for i in range(len(result)):
              if i not in res.keys():
                  result[i] += '-' * w + '|'
              else:
                  d = w - len(res[i])
                  result[i] += '-' * (d / 2) + res[i]
                  d = (w - d / 2) - len(res[i])
                  result[i] += '-' * d + '|'
      else:
          raise FingerError('No playable fingering found for: %s' % notes)
      result.reverse()
      return os.linesep.join(result)