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
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 > ])