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 ]