最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

用Python制作簡單的鋼琴程序的教程

 更新時(shí)間:2015年04月01日 17:29:09   作者:Zulko  
這篇文章主要介紹了用Python制作簡單的鋼琴程序的教程,用鍵盤演奏、包括變速和變調(diào)等功能的實(shí)現(xiàn),需要的朋友可以參考下

錄一段音頻,把它的音高改變50次并把每一個(gè)新的音頻匹配到鍵盤的一個(gè)鍵位,你就能把電腦變成一架鋼琴!

一段音頻可以被編碼為一組數(shù)值的數(shù)組(或者列表),像這樣:

201541171623980.png (512×112)

我們可以在數(shù)組中每隔一秒拿掉一秒的值來將這段音頻的速度變成兩倍。

201541171709750.png (512×112)

如此我們不僅將音頻的長度減半了,而且我們還將它的頻率翻倍了,這樣使得它擁有比原來更高的音高(pitch)。

相反地,假如我們將數(shù)組中每個(gè)值重復(fù)一次,我們將得到一段更慢,周期更長,即音高更低的音頻:

201541171802247.png (512×112)

這里提供一個(gè)可以按任意系數(shù)改變音頻速度的任意簡單的Python函數(shù):
 

import numpy as np
 
def speedx(sound_array, factor):
  """ 將音頻速度乘以任意系數(shù)`factor` """
  indices = np.round( np.arange(0, len(snd_array), factor) )
  indices = indices[indices < len(snd_array)].astype(int)
  return sound_array[ indices.astype(int) ]

這個(gè)問題更困難的地方在于改變音頻長度的同時(shí)保持它的音高(變速,音頻拉伸(sound stretching)),或者在改變音頻的音高的同時(shí)保持它的長度(變調(diào)(pitch shifting))。
變速

變速可以通過傳統(tǒng)的相位聲碼器(phase vocoder,感興趣的朋友可以讀一下維基百科的頁面)來實(shí)現(xiàn)。首先將音頻分解成重疊的比特,然后將這些比特重新排列使得他們重疊得更多(將縮短聲音的長度)或者更少(將拉伸音頻的長度),如下圖所示:

201541171835595.png (300×102)

困難之處在于重新排列的比特可能很嚴(yán)重的互相影響,那么這里就需要用到相位變換來確保它們之間沒有影響。這里有一段Python代碼,取自這個(gè)網(wǎng)頁(打不開的話,您懂的?!g者注):
 

def stretch(sound_array, f, window_size, h):
  """ 將音頻按系數(shù)`f`拉伸 """
 
  phase = np.zeros(window_size)
  hanning_window = np.hanning(window_size)
  result = np.zeros( len(sound_array) /f + window_size)
 
  for i in np.arange(0, len(sound_array)-(window_size+h), h*f):
 
    # 兩個(gè)可能互相重疊的子數(shù)列
    a1 = sound_array[i: i + window_size]
    a2 = sound_array[i + h: i + window_size + h]
 
    # 按第一個(gè)數(shù)列重新同步第二個(gè)數(shù)列
    s1 = np.fft.fft(hanning_window * a1)
    s2 = np.fft.fft(hanning_window * a2)
    phase = (phase + np.angle(s2/s1)) % 2*np.pi
    a2_rephased = np.fft.ifft(np.abs(s2)*np.exp(1j*phase))
 
    # 加入到結(jié)果中
    i2 = int(i/f)
    result[i2 : i2 + window_size] += hanning_window*a2_rephased
 
  result = ((2**(16-4)) * result/result.max()) # 歸一化 (16bit)
 
  return result.astype('int16')

 
變調(diào)

一旦你實(shí)現(xiàn)了變速以后,變調(diào)就不難了。如果需要一個(gè)更高的音高,可以先將這段音頻拉伸并保持音高不變,然后再加快它的速度,如此最后得到的音頻將具有原始音頻同樣的長度,更高的頻率,即更高的音高。

把一段音頻的頻率翻倍將把音高提高一個(gè)八度,也就是12個(gè)半音。因此,要將音高提高n個(gè)半音的話,我們需要將頻率乘上系數(shù)2^(n/12):
 

def pitchshift(snd_array, n, window_size=2**13, h=2**11):
  """ 將一段音頻的音高提高``n``個(gè)半音 """
  factor = 2**(1.0 * n / 12.0)
  stretched = stretch(snd_array, 1.0/factor, window_size, h)
  return speedx(stretched[window_size:], factor)

 
小程序:電腦鋼琴

讓我們來玩一下我們的變調(diào)器。我們先敲碗來確定一個(gè)“標(biāo)準(zhǔn)音高”:

[youku id="XNzM1NDM2NTky"]

接下來我們基于之前的音頻創(chuàng)造50個(gè)變調(diào)的音高,從很低到很高:
 

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]

接下來根據(jù)這個(gè)文件中的順序,我們把每一個(gè)音頻匹配到鍵盤的一個(gè)鍵位,如下圖所示:

201541172006429.jpeg (300×142)

我們只需要在代碼中告訴計(jì)算機(jī)當(dāng)一個(gè)鍵按下來的時(shí)候播放其對(duì)應(yīng)的聲音,然后當(dāng)按鍵松開后停止播放就可以了:

import pygame
 
pygame.mixer.init(fps, -16, 1, 512) # 太靈活了 <img src="http://python.jobbole.com/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley">
screen = pygame.display.set_mode((640,480)) # 設(shè)置焦點(diǎn)
 
# 得到鍵盤的鍵位的正確順序的列表
# ``keys`` 如 ['Q','W','E','R' ...] 一樣排列
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) # 停止播放并50ms淡出
    is_playing[key] = False

就這樣我們把計(jì)算機(jī)變成了一臺(tái)鋼琴!至此,讓我為您表演一段土耳其進(jìn)行曲來表達(dá)對(duì)您耐心閱讀此文的謝意吧:

[youku id="XNzM1NDQ1MDA4"]

如果想自己試試的話,在這里可以下載你需要的所有文件。因?yàn)椴皇撬械娜硕加肞ython,我也用Javascript/HTML5(在這兒)實(shí)現(xiàn)了一臺(tái)電腦鋼琴,但是不是特別理想。如果有經(jīng)驗(yàn)豐富的HTML5/JS/elm程序員來改進(jìn)改進(jìn),或者從頭重寫就太好了。
接下來做什么?

更通常的情況下,我發(fā)現(xiàn)計(jì)算機(jī)很少被用來進(jìn)行表演性質(zhì)的演奏。我明白使用鋼琴鍵盤或者直接從樂器錄音會(huì)容易很多,但是請(qǐng)看看僅僅用一個(gè)碗和60行的Python代碼就能做到什么!

即便是很便宜的計(jì)算機(jī)也有如此多的控制來實(shí)現(xiàn)一個(gè)馬馬虎虎的音樂臺(tái):你可以對(duì)著麥克風(fēng)唱歌,對(duì)著攝像頭做手勢(shì),用鼠標(biāo)來調(diào)制,然后用鍵盤來完成剩下來的玩意兒。有如此多方式來表現(xiàn)自我,而每種方式又有那么一個(gè)Python包……有沒有具有藝術(shù)天賦的大神加入呀?

相關(guān)文章

  • Python3 pip3 list 出現(xiàn) DEPRECATION 警告的解決方法

    Python3 pip3 list 出現(xiàn) DEPRECATION 警告的解決方法

    今天小編就為大家分享一篇Python3 pip3 list 出現(xiàn) DEPRECATION 警告的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • Python Flask全棧項(xiàng)目實(shí)戰(zhàn)構(gòu)建在線書店流程

    Python Flask全棧項(xiàng)目實(shí)戰(zhàn)構(gòu)建在線書店流程

    這篇文章主要為大家介紹了Python Flask全流程全棧項(xiàng)目實(shí)戰(zhàn)之在線書店構(gòu)建實(shí)現(xiàn)過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • python中快速進(jìn)行多個(gè)字符替換的方法小結(jié)

    python中快速進(jìn)行多個(gè)字符替換的方法小結(jié)

    最近在用python給自己的seo工作提高效率和節(jié)省時(shí)間,發(fā)現(xiàn)python真的很不錯(cuò),可以完成很多事情。多個(gè)字符替換是大家可能都會(huì)遇到的一個(gè)問題,昨天在工作中就碰到了這么一個(gè)問題,所以想著記錄一下解決方案及其過程,方便以后參考。下面來一起看看吧。
    2016-12-12
  • 對(duì)Python Class之間函數(shù)的調(diào)用關(guān)系詳解

    對(duì)Python Class之間函數(shù)的調(diào)用關(guān)系詳解

    今天小編就為大家分享一篇對(duì)Python Class之間函數(shù)的調(diào)用關(guān)系詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python3 處理JSON的實(shí)例詳解

    Python3 處理JSON的實(shí)例詳解

    這篇文章主要介紹了Python3 處理JSON的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-10-10
  • ubuntu16.04升級(jí)Python3.5到Python3.7的方法步驟

    ubuntu16.04升級(jí)Python3.5到Python3.7的方法步驟

    這篇文章主要介紹了ubuntu16.04升級(jí)Python3.5到Python3.7的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Python流程控制語句的深入講解

    Python流程控制語句的深入講解

    這篇文章主要給大家介紹了關(guān)于Python流程控制語句的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Python configparser模塊應(yīng)用過程解析

    Python configparser模塊應(yīng)用過程解析

    這篇文章主要介紹了Python configparser模塊應(yīng)用過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Python迅速掌握語音識(shí)別之知識(shí)儲(chǔ)備篇

    Python迅速掌握語音識(shí)別之知識(shí)儲(chǔ)備篇

    語音識(shí)別是一門交叉學(xué)科。近二十年來,語音識(shí)別技術(shù)取得顯著進(jìn)步,開始從實(shí)驗(yàn)室走向市場(chǎng)。人們預(yù)計(jì),未來10年內(nèi),語音識(shí)別技術(shù)將進(jìn)入工業(yè)、家電、通信、汽車電子、醫(yī)療、家庭服務(wù)、消費(fèi)電子產(chǎn)品等各個(gè)領(lǐng)域
    2021-11-11
  • python密碼學(xué)周期置換密碼學(xué)習(xí)

    python密碼學(xué)周期置換密碼學(xué)習(xí)

    這篇文章主要為大家介紹了python密碼學(xué)周期置換密碼的學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05

最新評(píng)論

宕昌县| 清苑县| 遵义市| 凤山市| 宜川县| 东兰县| 乡城县| 遂川县| 绥棱县| 宜兰市| 宣威市| 广宗县| 若尔盖县| 泸水县| 德令哈市| 东兰县| 公安县| 胶州市| 红桥区| 沁水县| 青岛市| 沐川县| 敦煌市| 黄龙县| 新安县| 罗山县| 大田县| 都江堰市| 潜江市| 英德市| 汉源县| 廉江市| 共和县| 久治县| 什邡市| 岐山县| 凤冈县| 新丰县| 江阴市| 娄烦县| 衡山县|