class_docstr: Clip made by composing several AudioClips.
  
  An audio clip made by putting together several audio clips.
  
  Parameters
  ----------
  
  clips
    List of audio clips, which may start playing at different times or
    together, depends on their ``start`` attributes. If all have their
    ``duration`` attribute set, the duration of the composite clip is
    computed automatically.
class_docstr_tok: ["Clip","made","by","composing","several","AudioClips",".","An","audio","clip","made","by","putting","together","several","audio","clips",".","Parameters","--","--","--","--","--","clips","List","of","audio","clips",",","which","may","start","playing","at","different","times","or","together",",","depends","on","their","``","start","``","attributes",".","If","all","have","their","``","duration","``","attribute","set",",","the","duration","of","the","composite","clip","is","computed","automatically","."]
code: def __init__(self, clips):
      self.clips = clips
      self.nchannels = max(clip.nchannels for clip in self.clips)
  
      # self.duration is set at AudioClip
      duration = None
      for end in self.ends:
          if end is None:
              break
          duration = max(end, duration or 0)
  
      # self.fps is set at AudioClip
      fps = None
      for clip in self.clips:
          if hasattr(clip, "fps") and isinstance(
              clip.fps, numbers.Number
          ):
              fps = max(clip.fps, fps or 0)
  
      super().__init__(duration=duration, fps=fps)
  
imports: import numbers
  import os
  import numpy
  import proglog
  from moviepy.audio.io.ffmpeg_audiowriter import ffmpeg_audiowrite
  from moviepy.Clip import Clip
  from moviepy.decorators import convert_path_to_string, requires_duration
  from moviepy.tools import extensions_dict
label_desc: Use image node_id 1 to create a new CompositeAudioClip object from inherited base classes: AudioClip with example: obj = CompositeAudioClip(clips)