+class GainEffect:
+ effect_types = [
+ 'fade'
+ ]
+
+ def __init__(self, effect, audio_segment, start, end, **kwargs):
+ if effect in self.effect_types:
+ self.effect = effect
+ else:
+ raise Exception("Unknown effect {}".format(effect))
+
+ self.start = start
+ self.end = end
+ self.audio_segment = audio_segment
+ getattr(self, self.effect + "_init")(**kwargs)
+
+ def get_last_gain(self):
+ return getattr(self, self.effect + "_get_last_gain")()
+
+ def get_next_gain(self, current_frame, frame_count):
+ # This returns two values:
+ # - The first one is the gain to apply on that frame
+ # - The last one is True or False depending on whether it is the last
+ # call to the function and the last gain should be saved permanently
+ return getattr(self, self.effect + "_get_next_gain")(
+ current_frame,
+ frame_count)
+
+ # Fading
+ def fade_init(self, gain=0, **kwargs):
+ self.first_frame = int(self.audio_segment.frame_rate * self.start)
+ self.last_frame = int(self.audio_segment.frame_rate * self.end)
+ self.gain= gain
+
+ def fade_get_last_gain(self):
+ return self.gain
+
+ def fade_get_next_gain(self, current_frame, frame_count):
+ if current_frame >= self.last_frame:
+ return [self.gain, True]
+ elif current_frame < self.first_frame:
+ return [0, False]
+ else:
+ return [
+ (current_frame - self.first_frame) / \
+ (self.last_frame - self.first_frame) * self.gain,
+ False
+ ]
+
+