在确切的预定时间播放音频样本以使用Python创建音乐

问题描述

我有每个钢琴音符的wav文件,我想在预定的时间播放它们,以便在音乐播放器中播放和弦。

这是我以pygame为例进行的一些测试...

import pygame
import time

def play(path):

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

    a1Note = pygame.mixer.Sound(path + 'Piano.pp.A3.wav')
    a2Note = pygame.mixer.Sound(path + 'Piano.pp.C3.wav')

    pygame.mixer.set_num_channels(50)

    for _ in range(25):

        a1Note.play()
        time.sleep(0.3)
        
        a2Note.play()
        time.sleep(0.3)

...此代码不够准确-我需要按时出现注释。

如何使它更准确?

  • 我不依赖于使用pygame
  • 我需要一次播放大约四个样本
  • 整个乐曲是预先确定的-因此任何预加载都可以。

根据让·弗朗索瓦(Jean-Francois)的建议,我尝试为每个声音使用更准确的计时器,甚至使用单独的通道,但计时仍然无处不在...

import pygame
import time

    
def play(path):

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

    a = pygame.mixer.Sound(path + 'Piano.pp.A3.wav')
    b = pygame.mixer.Sound(path + 'Piano.pp.Db4.wav')
    A = pygame.mixer.Sound(path + 'Piano.pp.Ab4.wav')

    channelCount = 50
    pygame.mixer.set_num_channels(channelCount)

    count = 0
    seconds = 10 ** 9

    t1 = time.time_ns()

    channels = []

    for i in range(channelCount):
        channels.append(pygame.mixer.Channel(i))

    while count < channelCount:

        t2 = time.time_ns()

        if t2 - t1 > 0.2 * seconds:

            t1 = t2

            if count % 8 == 0:
                sound = a
                print('a',end = '')
            elif count % 4 == 0:
                sound = b
                print('b',end = '')
            else:
                sound = A
                print('.',end = '')

            channel = channels[count]
            channel.play(sound)

            count += 1

输出为:

a...b...a...b...a...b...a...b...a...b...a...b...a.

即稳定的音符,但听起来并不稳定!

如何准确安排音符,使音调听起来对耳朵好?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...