docs: def determine_triad(triad, shorthand=False, no_inversions=False,
          placeholder=None):
      """Name the triad; return answers in a list.
  
      The third argument should not be given. If shorthand is True the answers
      will be in abbreviated form.
  
      This function can determine major, minor, diminished and suspended
      triads. Also knows about invertions.
  
      Examples:
      >>> determine_triad(['A', 'C', 'E'])
      'A minor triad'
      >>> determine_triad(['C', 'E', 'A'])
      'A minor triad, first inversion'
      >>> determine_triad(['A', 'C', 'E'], True)
      'Am'
      """
      if len(triad) != 3:
          # warning: raise exception: not a triad
          return False
  
      def inversion_exhauster(triad, shorthand, tries, result):
          """Run tries every inversion and save the result."""
          intval1 = intervals.determine(triad[0], triad[1], True)
          intval2 = intervals.determine(triad[0], triad[2], True)
  
          def add_result(short):
              result.append((short, tries, triad[0]))
  
          intval = intval1 + intval2
          if intval == '25':
              add_result('sus2')
          elif intval == '3b7':
              add_result('dom7')  # changed from just '7'
          elif intval == '3b5':
              add_result('7b5')  # why not b5?
          elif intval == '35':
              add_result('M')
          elif intval == '3#5':
              add_result('aug')
          elif intval == '36':
              add_result('M6')
          elif intval == '37':
              add_result('M7')
          elif intval == 'b3b5':
              add_result('dim')
          elif intval == 'b35':
              add_result('m')
          elif intval == 'b36':
              add_result('m6')
          elif intval == 'b3b7':
              add_result('m7')
          elif intval == 'b37':
              add_result('m/M7')
          elif intval == '45':
              add_result('sus4')
          elif intval == '5b7':
              add_result('m7')
          elif intval == '57':
              add_result('M7')
          if tries != 3 and not no_inversions:
              return inversion_exhauster([triad[-1]] + triad[:-1], shorthand,
                                         tries + 1, result)
          else:
              res = []
              for r in result:
                  if shorthand:
                      res.append(r[2] + r[0])
                  else:
                      res.append(r[2] + chord_shorthand_meaning[r[0]] +
                              int_desc(r[1]))
              return res
      return inversion_exhauster(triad, shorthand, 1, [])