docs: def asmono(samples:np.ndarray, channel:Union[int, str]=0) -> np.ndarray:
      """
      convert samples to mono if they are not mono already.
  
      The returned array will always have the shape (numframes,)
  
      channel: the channel number to use, or 'mix' to mix-down
               all channels
      """
      if numchannels(samples) == 1:
          # it could be [1,2,3,4,...], or [[1], [2], [3], [4], ...]
          if isinstance(samples[0], float):
              return samples
          elif isinstance(samples[0], np.dnarray):
              return np.reshape(samples, (len(samples),))
          else:
              raise TypeError("Samples should be numeric, found: %s"
                              % str(type(samples[0])))
      if isinstance(channel, int):
          return samples[:, channel]
      elif channel == 'mix':
          return _mix(samples, scale_by_numchannels=True)
      else:
          raise ValueError("channel has to be an integer indicating a channel,"
                           " or 'mix' to mix down all channels")