当前位置:   article > 正文

python播放音乐时换音乐代码,在Python中播放时更改音频的音调(和速度)

python将伴奏升调

Craig McQueen

在他的帮助下,我创建了一个概念验证程序。

这个程序播放

单声道

这里有一些奇怪的行为,我不知道该怎么处理。如果音高现在很低,那么在音高改变之前会有2秒的延迟。但是,对于高音,音高会实时变化。(当俯仰变低时,延迟平稳增加)。我只在缓冲区中添加更多的声音

soundOutput.getLeft() < 0.2

. 也就是说,如果缓冲区上剩余的声音量小于0.2秒。因此不应拖延。为了排除故障,我包含了编写

soundOutput.getLeft()

一个文件。它倾向于一直保持在或非常接近于0。

减少读取的帧

waveRead.readframes(100)

import os, sys, wave, pygame, numpy, pymedia.audio.sound, scikits.samplerate

class Window:

def __init__(self, width, height, minOctave, maxOctave):

"""

width, height: the width and height of the screen.

minOctave, maxOctave: the highest and lowest pitch changes. 0 is no change.

"""

self.minOctave = minOctave

self.maxOctave = maxOctave

self.width = width

self.mouseDown = False

self.ratio = 1.0 # The resampling ratio

waveRead = wave.open(os.path.join(sys.path[0], "music.wav"), 'rb')

sampleRate = waveRead.getframerate()

channels = waveRead.getnchannels()

soundFormat = pymedia.audio.sound.AFMT_S16_LE

soundOutput = pymedia.audio.sound.Output(sampleRate, channels, soundFormat)

pygame.init()

screen = pygame.display.set_mode((width, height), 0)

screen.fill((255, 255, 255))

pygame.display.flip()

fout = open(os.path.join(sys.path[0], "musicdata.txt"), 'w') # For troubleshooting

byteString = waveRead.readframes(1000) # Read at most 1000 samples from the file.

while len(byteString) != 0:

self.handleEvent(pygame.event.poll()) # This does not wait for an event.

fout.write(str(soundOutput.getLeft()) + "\n") # For troubleshooting

if soundOutput.getLeft() < 0.2: # If there is less than 0.2 seconds left in the sound buffer.

array = numpy.fromstring(byteString, dtype=numpy.int16)

byteString = scikits.samplerate.resample(array, self.ratio, "sinc_fastest").astype(numpy.int16).tostring()

soundOutput.play(byteString)

byteString = waveRead.readframes(500) # Read at most 500 samples from the file.

waveRead.close()

return

def handleEvent(self, event):

if event.type == pygame.QUIT or (event.type == pygame.KEYUP and event.key == pygame.K_ESCAPE):

sys.exit()

if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:

self.mouseDown = True

self.setRatio(event.pos)

if event.type == pygame.MOUSEBUTTONUP and event.button == 1:

self.mouseDown = False

if event.type == pygame.MOUSEMOTION and self.mouseDown:

self.setRatio(event.pos)

return None

def setRatio(self, point):

self.ratio = 2 ** -(self.minOctave + point[0] * (self.maxOctave - self.minOctave) / float(self.width))

print(self.ratio)

def main():

Window(768, 100, -2.0, 2.0)

if __name__ == '__main__':

main()

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号