docs: def determine_seventh(seventh, shorthand=False, no_inversion=False,
          no_polychords=False):
      """Determine the type of seventh chord; return the results in a list,
      ordered on inversions.
  
      This function expects seventh to be a list of 4 notes.
  
      If shorthand is set to True, results will be returned in chord shorthand
      ('Cmin7', etc.); inversions will be dropped in that case.
  
      Example:
      >>> determine_seventh(['C', 'E', 'G', 'B'])
      ['C major seventh']
      """
      if len(seventh) != 4:
          # warning raise exception: seventh chord is not a seventh chord
          return False
  
      def inversion_exhauster(seventh, shorthand, tries, result, polychords):
          """Determine sevenths recursive functions."""
          # Check whether the first three notes of seventh are part of some triad.
          triads = determine_triad(seventh[:3], True, True)
  
          # Get the interval between the first and last note
          intval3 = intervals.determine(seventh[0], seventh[3])
  
          def add_result(short, poly=False):
              """Helper function."""
              result.append((short, tries, seventh[0], poly))
  
          # Recognizing polychords
          if tries == 1 and not no_polychords:
              polychords = polychords + determine_polychords(seventh, shorthand)
  
          # Recognizing sevenths
          for triad in triads:
              # Basic triads
              triad = triad[len(seventh[0]):]
              if triad == 'm':
                  if intval3 == 'minor seventh':
                      add_result('m7')
                  elif intval3 == 'major seventh':
                      add_result('m/M7')
                  elif intval3 == 'major sixth':
                      add_result('m6')
              elif triad == 'M':
                  if intval3 == 'major seventh':
                      add_result('M7')
                  elif intval3 == 'minor seventh':
                      add_result('7')
                  elif intval3 == 'major sixth':
                      add_result('M6')
              elif triad == 'dim':
                  if intval3 == 'minor seventh':
                      add_result('m7b5')
                  elif intval3 == 'diminished seventh':
                      add_result('dim7')
              elif triad == 'aug':
                  if intval3 == 'minor seventh':
                      add_result('m7+')
                  if intval3 == 'major seventh':
                      add_result('M7+')
              elif triad == 'sus4':
                  if intval3 == 'minor seventh':
                      add_result('sus47')
                  elif intval3 == 'minor second':
                      add_result('sus4b9')
              elif triad == 'm7':
  
              # Other
                  if intval3 == 'perfect fourth':
                      add_result('11')
              elif triad == '7b5':
                  if intval3 == 'minor seventh':
                      add_result('7b5')
  
          if tries != 4 and not no_inversion:
              return inversion_exhauster([seventh[-1]] + seventh[:-1], shorthand,
                      tries + 1, result, polychords)
          else:
              # Return results
              res = []
  
              # Reset seventh
              seventh = [seventh[3]] + seventh[0:3]
              for x in result:
                  if shorthand:
                      res.append(x[2] + x[0])
                  else:
                      res.append(x[2] + chord_shorthand_meaning[x[0]]
                                  + int_desc(x[1]))
              return res + polychords
      return inversion_exhauster(seventh, shorthand, 1, [], [])