10

私の意図は、性質が似ている2 つの音楽トラックを、さまざまなタイミングで互いにフェードさせることです。このようなフェードが発生すると、1 つの音楽トラックが短時間でフル ボリュームからミュートにフェードし、同時にもう 1 つのトラックが 0 から 100 にフェードし、同じ時間インデックスから再生を続ける必要があります。これはいつでも動的に実行できる必要があります。特定のアクションが発生すると、フェードが発生し、新しいトラックが他のトラックが中断したのと同じ位置から再生を開始します。

これは、ボリューム操作を使用するか、音楽を開始および停止することによってもっともらしいかもしれません (ただし、「フェードアウト」オプションのみが存在し、「フェードイン」オプションが不足しているようです)。これどうやってするの?存在する場合、最善の方法は何ですか? Pygame を使用できない場合は、Pygame の代替手段を使用できます。

4

4 に答える 4

1

これを試してみてください、それはかなり簡単です..

import pygame

pygame.mixer.init()
pygame.init()

# Maybe you can subclass the pygame.mixer.Sound and
# add the methods below to it..
class Fader(object):
    instances = []
    def __init__(self, fname):
        super(Fader, self).__init__()
        assert isinstance(fname, basestring)
        self.sound = pygame.mixer.Sound(fname)
        self.increment = 0.01 # tweak for speed of effect!!
        self.next_vol = 1 # fade to 100 on start
        Fader.instances.append(self)

    def fade_to(self, new_vol):
        # you could change the increment here based on something..
        self.next_vol = new_vol

    @classmethod
    def update(cls):
        for inst in cls.instances:
            curr_volume = inst.sound.get_volume()
            # print inst, curr_volume, inst.next_vol
            if inst.next_vol > curr_volume:
                inst.sound.set_volume(curr_volume + inst.increment)
            elif inst.next_vol < curr_volume:
                inst.sound.set_volume(curr_volume - inst.increment)

sound1 = Fader("1.wav")
sound2 = Fader("2.wav")
sound1.sound.play()
sound2.sound.play()
sound2.sound.set_volume(0)

# fading..
sound1.fade_to(0)
sound2.fade_to(1)


while True:
    Fader.update() # a call that will update all the faders..
于 2013-09-18T10:11:01.450 に答える