Пример #1
0
    def cross_fade(self, seg1, seg2, duration):
        """Add a linear crossfade to the composition between two
        segments.

        :param seg1: First segment (fading out)
        :type seg1: :py:class:`radiotool.composer.Segment`
        :param seg2: Second segment (fading in)
        :type seg2: :py:class:`radiotool.composer.Segment`
        :param duration: Duration of crossfade (in seconds)
        """

        if seg1.comp_location + seg1.duration - seg2.comp_location < 2:
            dur = int(duration * seg1.track.samplerate)

            if dur % 2 == 1:
                dur -= 1

            if dur / 2 > seg1.duration:
                dur = seg1.duration * 2

            if dur / 2 > seg2.duration:
                dur = seg2.duration * 2

            # we're going to compute the crossfade and then create a RawTrack
            # for the resulting frames

            if seg2.start - (dur / 2) < 0:
                diff = seg2.start
                seg2.start = 0
                seg2.duration -= diff
                seg2.comp_location -= diff
                dur = 2 * diff
            else:
                seg2.start -= dur / 2
                seg2.duration += dur / 2
                seg2.comp_location -= dur / 2

            seg1.duration += dur / 2
            out_frames = seg1.get_frames(channels=self.channels)[-dur:]
            seg1.duration -= dur

            in_frames = seg2.get_frames(channels=self.channels)[:dur]
            seg2.start += dur
            seg2.duration -= dur
            seg2.comp_location += dur

            # compute the crossfade
            in_frames = in_frames[: min(map(len, [in_frames, out_frames]))]
            out_frames = out_frames[: min(map(len, [in_frames, out_frames]))]

            cf_frames = radiotool.utils.linear(out_frames, in_frames)
            # cf_frames = equal_power(out_frames, in_frames)

            raw_track = RawTrack(cf_frames, name="crossfade", samplerate=seg1.track.samplerate)

            rs_comp_location = (seg1.comp_location + seg1.duration) / float(seg1.track.samplerate)

            rs_duration = raw_track.duration / float(raw_track.samplerate)

            raw_seg = Segment(raw_track, rs_comp_location, 0.0, rs_duration)
            # will this fix a bug?
            raw_seg.duration = raw_track.duration
            raw_seg.comp_location = seg1.comp_location + seg1.duration

            self.add_track(raw_track)
            self.add_segment(raw_seg)

            return raw_seg

        else:
            print seg1.comp_location + seg1.duration, seg2.comp_location
            raise Exception(
                "Segments must be adjacent"
                "to add a crossfade ({}, {})".format(seg1.comp_location + seg1.duration, seg2.comp_location)
            )
Пример #2
0
    def cross_fade(self, seg1, seg2, duration):
        """Add a linear crossfade to the composition between two
        segments.

        :param seg1: First segment (fading out)
        :type seg1: :py:class:`radiotool.composer.Segment`
        :param seg2: Second segment (fading in)
        :type seg2: :py:class:`radiotool.composer.Segment`
        :param duration: Duration of crossfade (in seconds)
        """

        if seg1.comp_location + seg1.duration - seg2.comp_location < 2:
            dur = int(duration * seg1.track.samplerate)

            if dur % 2 == 1:
                dur -= 1

            if dur / 2 > seg1.duration:
                dur = seg1.duration * 2

            if dur / 2 > seg2.duration:
                dur = seg2.duration * 2

            # we're going to compute the crossfade and then create a RawTrack
            # for the resulting frames

            if seg2.start - (dur / 2) < 0:
                diff = seg2.start
                seg2.start = 0
                seg2.duration -= diff
                seg2.comp_location -= diff
                dur = 2 * diff
            else:
                seg2.start -= (dur / 2)
                seg2.duration += (dur / 2)
                seg2.comp_location -= (dur / 2)

            seg1.duration += (dur / 2)
            out_frames = seg1.get_frames(channels=self.channels)[-dur:]
            seg1.duration -= dur

            in_frames = seg2.get_frames(channels=self.channels)[:dur]
            seg2.start += dur
            seg2.duration -= dur
            seg2.comp_location += dur

            # compute the crossfade
            in_frames = in_frames[:min(map(len, [in_frames, out_frames]))]
            out_frames = out_frames[:min(map(len, [in_frames, out_frames]))]

            cf_frames = radiotool.utils.linear(out_frames, in_frames)
            # cf_frames = equal_power(out_frames, in_frames)

            raw_track = RawTrack(cf_frames,
                                 name="crossfade",
                                 samplerate=seg1.track.samplerate)

            rs_comp_location = (seg1.comp_location + seg1.duration) /\
                float(seg1.track.samplerate)

            rs_duration = raw_track.duration / float(raw_track.samplerate)

            raw_seg = Segment(raw_track, rs_comp_location, 0.0, rs_duration)
            # will this fix a bug?
            raw_seg.duration = raw_track.duration
            raw_seg.comp_location = seg1.comp_location + seg1.duration

            self.add_track(raw_track)
            self.add_segment(raw_seg)

            return raw_seg

        else:
            print seg1.comp_location + seg1.duration, seg2.comp_location
            raise Exception("Segments must be adjacent"
                            "to add a crossfade ({}, {})".format(
                                seg1.comp_location + seg1.duration,
                                seg2.comp_location))