aboutsummaryrefslogtreecommitdiff
path: root/music_sampler/music_effect.py
blob: 4bdbb262ecd17d89d643f07eff1d0a9df3f4dccd (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
51
52
53
54
55
56
57
58
59
60
61
62
class GainEffect:
    effect_types = [
        'fade'
    ]

    def __init__(self, effect, audio_segment, initial_loop, 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
        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)

    # 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
                    ]