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) )
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))