code: def trim(self, begin=None, length=None):
          
          for variable, name in [(begin, "begin"), (length, "length")]:
              if (variable is not None) and (not isinstance(variable, TimeValue)):
                  raise TypeError(u"%s is not None or TimeValue" % name)
          self.log(u"Trimming...")
          if (begin is None) and (length is None):
              self.log(u"begin and length are both None: nothing to do")
          else:
              if begin is None:
                  begin = TimeValue("0.000")
                  self.log([u"begin was None, now set to %.3f", begin])
              begin = min(max(TimeValue("0.000"), begin), self.audio_length)
              self.log([u"begin is %.3f", begin])
              if length is None:
                  length = self.audio_length - begin
                  self.log([u"length was None, now set to %.3f", length])
              length = min(max(TimeValue("0.000"), length), self.audio_length - begin)
              self.log([u"length is %.3f", length])
              begin_index = int(begin * self.audio_sample_rate)
              end_index = int((begin + length) * self.audio_sample_rate)
              new_idx = end_index - begin_index
              self.__samples[0:new_idx] = self.__samples[begin_index:end_index]
              self.__samples_length = new_idx
              self._update_length()
          self.log(u"Trimming... done")
docs: Get a slice of the audio data of ``length`` seconds,
          starting from ``begin`` seconds.
  
          If audio data is not loaded, load it and then slice it.
  
          :param begin: the start position, in seconds
          :type  begin: :class:`~aeneas.exacttiming.TimeValue`
          :param length: the  position, in seconds
          :type  length: :class:`~aeneas.exacttiming.TimeValue`
          :raises: TypeError: if one of the arguments is not ``None``
                              or :class:`~aeneas.exacttiming.TimeValue`
  
          .. versionadded:: 1.2.0