如何解决在确切的预定时间播放音频样本以使用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 举报,一经查实,本站将立刻删除。