docs: def make_movie(q: np.ndarray, step: int, bodies: List[str], plot_colors: Dict[str, str], fname: str):
      """
      Make a series of frames of the planetary orbits that can be assembled into a movie.
      q is a Nx3B array.  t indexes time points.  3B columns are (x, y, z) for the bodies in order.
      """
      # Get N and number of dims
      N, dims = q.shape
  
      # Slices for x and y
      x_slice = slice(0, dims, 3)
      y_slice = slice(1, dims, 3)
      # Convert all distances from meters to astronomical units (AU)
      plot_x = q[:, x_slice] / au2m
      plot_y = q[:, y_slice] / au2m
      
      # Set marker sizes proportional to size of bodies
      radius_earth = radius_tbl['earth']
      markersize_earth = 8.0
      markersize_tbl = {body : (radius_tbl[body] / radius_earth)**0.25 * markersize_earth for body in bodies}
      
      # Set up chart title and scale
      fig, ax = plt.subplots(figsize=[12,12])
  
      # Make each frame
      print(f'Generating movie with {N} frames...')
      for fn in tqdm(range(N//step)):
          # The row number in the array is the frame number times the step size
          rn: int = fn * step
          make_frame(fig, ax, plot_x[rn], plot_y[rn], fn, bodies, plot_colors, markersize_tbl, fname)
  
      # Assemble the frames into a movie (video only)
      cmd1: List[str] = ['ffmpeg', '-r', '24', '-f', 'image2', '-s', '864x864', '-i', 'movie/planets_%05d.png',
                       '-vcodec',  'libx264', '-crf', '20', '-pix_fmt', 'yuv420p', 'movie/planets_video.mp4']
      call(cmd1)
  
      # Add the soundtrack to the movie
      cmd2: List[str] = ['ffmpeg', '-i', 'movie/planets_video.mp4', '-i', 'movie/holst_jupiter.mp3', 
                        '-c:v', 'copy', '-shortest', 'movie/planets.mp4']
      call(cmd2) 
  
      # Delete the frames
      cmd3: List[str] = ['rm', 'movie/*.png']
      call(cmd3)