变调 一旦你实现了变速以后,变调就不难了。如果需要一个更高的音高,可以先将这段音频拉伸并保持音高不变,然后再加快它的速度,如此最后得到的音频将具有原始音频同样的长度,更高的频率,即更高的音高。
把一段音频的频率翻倍将把音高提高一个八度,也就是12个半音。因此,要将音高提高n个半音的话,我们需要将频率乘上系数2^(n/12): def pitchshift(snd_array, n, window_size = 2 * * 13 , h = 2 * * 11 ): factor = 2 * * ( 1.0 * n / 12.0 ) stretched = stretch(snd_array, 1.0 / factor, window_size, h) return speedx(stretched[window_size:], factor) | 小程序:电脑钢琴 让我们来玩一下我们的变调器。我们先敲碗来确定一个“标准音高”: 接下来我们基于之前的音频创造50个变调的音高,从很低到很高: from scipy.io import wavfile fps, bowl_sound = wavfile.read( "bowl.wav" ) tones = range ( - 25 , 25 ) transposed = [pitchshift(bowl_sound, n) for n in tones] |
接下来根据这个文件中的顺序,我们把每一个音频匹配到键盘的一个键位,如下图所示: 
我们只需要在代码中告诉计算机当一个键按下来的时候播放其对应的声音,然后当按键松开后停止播放就可以了: import pygame pygame.mixer.init(fps, - 16 , 1 , 512 ) screen = pygame.display.set_mode(( 640 , 480 )) keys = open ( 'typewriter.kb' ).read().split( '\n' ) sounds = map (pygame.sndarray.make_sound, transposed) key_sound = dict ( zip (keys, sounds) ) is_playing = {k: False for k in keys} while True : event = pygame.event.wait() if event. type in (pygame.KEYDOWN, pygame.KEYUP): key = pygame.key.name(event.key) if event. type = = pygame.KEYDOWN: if (key in key_sound.keys()) and ( not is_playing[key]): key_sound[key].play(fade_ms = 50 ) is_playing[key] = True elif event.key = = pygame.K_ESCAPE: pygame.quit() raise KeyboardInterrupt elif event. type = = pygame.KEYUP and key in key_sound.keys(): key_sound[key].fadeout( 50 ) is_playing[key] = False |
就这样我们把计算机变成了一台钢琴!至此,让我为您表演一段土耳其进行曲来表达对您耐心阅读此文的谢意吧: 如果想自己试试的话,在这里可以下载你需要的所有文件。因为不是所有的人都用Python,我也用Javascript/HTML5(在这儿)实现了一台电脑钢琴,但是不是特别理想。如果有经验丰富的HTML5/JS/elm程序员来改进改进,或者从头重写就太好了。
接下来做什么?
更通常的情况下,我发现计算机很少被用来进行表演性质的演奏。我明白使用钢琴键盘或者直接从乐器录音会容易很多,但是请看看仅仅用一个碗和60行的Python代码就能做到什么!
即便是很便宜的计算机也有如此多的控制来实现一个马马虎虎的音乐台:你可以对着麦克风唱歌,对着摄像头做手势,用鼠标来调制,然后用键盘来完成剩下来的玩意儿。有如此多方式来表现自我,而每种方式又有那么一个Python包……有没有具有艺术天赋的大神加入呀?
原文链接: Zulko 翻译: 伯乐在线 - datorhjaelten 译文链接: http://blog.jobbole.com/72745/ |