class_docstr: Logarithmically spaced time stretching.
  
  `n_samples` are generated with stretching spaced logarithmically
  between `2.0**lower` and 2`.0**upper`.
  
  This transformation affects the following attributes:
  
  - Annotations
      - all: time, duration
      - tempo: values
  - metadata
      - duration
  - Audio
  
  Attributes
  ----------
  n_samples : int > 0
      Number of deformations to generate
  
  lower : float
  upper : float > lower
      Minimum and maximum bounds on the stretch parameters
  
  See Also
  --------
  TimeStretch
  RandomTimeStretch
code: def states(self, jam):
      rates = 2.0 ** np.linspace(
          self.lower, self.upper, num=self.n_samples, endpoint=True
      )
  
      for rate in rates:
          yield dict(rate=rate)
  
imports: import pyrubberband
  import numpy
  from ..base import BaseTransformer, _get_rng
label_desc: Use image node_id 2 for calling the LogspaceTimeStretch obj's underlying member method code with example usage: obj.states(jam) without return types