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.

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)