docs: def ranges(self, yield_ranges_without_labels=False, include_labels=None):
          """
          Generate all ranges of the label-list. A range is defined
          as a part of the label-list for which the same labels are defined.
  
          Args:
              yield_ranges_without_labels(bool): If True also yields ranges for
                                                  which no labels are defined.
              include_labels(list): If not empty, only the label values in
                                     the list will be considered.
  
          Returns:
              generator: A generator which yields one range
              (tuple start/end/list-of-labels) at a time.
  
          Example:
              >>> ll = LabelList(labels=[
              >>>     Label('a', 3.2, 4.5),
              >>>     Label('b', 5.1, 8.9),
              >>>     Label('c', 7.2, 10.5),
              >>>     Label('d', 10.5, 14)
              >>>])
              >>> ranges = ll.ranges()
              >>> next(ranges)
              (3.2, 4.5, [ < audiomate.annotations.Label at 0x1090527c8 > ])
              >>> next(ranges)
              (4.5, 5.1, [])
              >>> next(ranges)
              (5.1, 7.2, [ < audiomate.annotations.label.Label at 0x1090484c8 > ])
          """
  
          tree_copy = self.label_tree.copy()
  
          # Remove labels not included
          if include_labels is not None:
              for iv in list(tree_copy):
                  if iv.data.value not in include_labels:
                      tree_copy.remove(iv)
  
          def reduce(x, y):
              x.append(y)
              return x
  
          # Split labels when overlapping and merge equal ranges to a list of labels
          tree_copy.split_overlaps()
          tree_copy.merge_equals(data_reducer=reduce, data_initializer=[])
  
          intervals = sorted(tree_copy)
          last_end = intervals[0].begin
  
          # yield range by range
          for i in range(len(intervals)):
              iv = intervals[i]
  
              # yield an empty range if necessary
              if yield_ranges_without_labels and iv.begin > last_end:
                  yield (last_end, iv.begin, [])
  
              yield (iv.begin, iv.end, iv.data)
  
              last_end = iv.end