class GainEffect:
effect_types = [
'noop',
'fade'
]
def __init__(self, effect, audio_segment, initial_loop, start, end,
**kwargs):
if effect in self.effect_types:
self.effect = effect
else:
self.effect = 'noop'
self.start = start
self.end = end
self.audio_segment = audio_segment
self.initial_loop = initial_loop
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, current_loop, 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,
current_loop,
frame_count)
# Noop
def noop_init(self, **kwargs):
pass
def noop_get_last_gain(self, **kwargs):
return 0
def noop_get_next_gain(self, **kwargs):
return [0, True]
# Fading
def fade_init(self, gain=0, **kwargs):
self.audio_segment_frame_count = self.audio_segment.frame_count()
self.first_frame = int(
self.audio_segment_frame_count * self.initial_loop +\
self.audio_segment.frame_rate * self.start)
self.last_frame = int(
self.audio_segment_frame_count * self.initial_loop +\
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, current_loop, frame_count):
current_frame = current_frame \
+ (current_loop - self.initial_loop) \
* self.audio_segment_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
]