aboutsummaryrefslogtreecommitdiff
path: root/helpers/music_effect.py
blob: ef8dc906025a61ea71a5a1a93540532cec666516 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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
                    ]