<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:

def timemap_stretch(y, sr, time_map, rbargs=None):
    '''Apply a timemap stretch to an audio time series.

    A timemap stretch allows non-linear time-stretching by mapping source to
    target sample frame numbers for fixed time points within the audio data.

    This uses the `time` and `timemap` form for rubberband.

    Parameters
    ----------
    y : np.ndarray [shape=(n,) or (n, c)]
        Audio time series, either single or multichannel

    sr : int > 0
        Sampling rate of `y`

    time_map : list
        Each element is a tuple `t` of length 2 which corresponds to the
        source sample position and target sample position.

        If `t[1] < t[0]` the track will be sped up in this area.

        `time_map[-1]` must correspond to the lengths of the source audio and
        target audio.

    rbargs
        Additional keyword parameters for rubberband

        See `rubberband -h` for details.

    Returns
    -------
    y_stretch : np.ndarray
        Time-stretched audio

    Raises
    ------
    ValueError
        if `time_map` is not monotonic
        if `time_map` is not non-negative
        if `time_map[-1][0]` is not the input audio length
    '''

    if rbargs is None:
        rbargs = dict()

    is_positive = all(time_map[i][0] >= 0 and time_map[i][1] >= 0
                      for i in range(len(time_map)))
    is_monotonic = all(time_map[i][0] <= time_map[i+1][0] and
                       time_map[i][1] <= time_map[i+1][1]
                       for i in range(len(time_map)-1))
    if not is_positive:
        raise ValueError('time_map should be non-negative')

    if not is_monotonic:
        raise ValueError('time_map is not monotonic')

    if time_map[-1][0] != len(y):
        raise ValueError('time_map[-1] should correspond to the last sample')

    time_stretch = time_map[-1][1] * 1.0 / time_map[-1][0]
    rbargs.setdefault('--time', time_stretch)

    stretch_file = tempfile.NamedTemporaryFile(mode='w', suffix='.txt',
                                               delete=False)
    try:
        for t in time_map:
            stretch_file.write('{:0} {:1}\n'.format(t[0], t[1]))
        stretch_file.close()

        rbargs.setdefault('--timemap', stretch_file.name)
        y_stretch = __rubberband(y, sr, **rbargs)
    finally:
        # Remove temp file
        os.unlink(stretch_file.name)

    return y_stretch