<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

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

        來源:懂視網 責編:小采 時間:2020-11-27 14:18:13
        文檔

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

        用Python制作簡單的鋼琴程序的教程:錄一段音頻,把它的音高改變50次并把每一個新的音頻匹配到鍵盤的一個鍵位,你就能把電腦變成一架鋼琴! 一段音頻可以被編碼為一組數值的數組(或者列表),像這樣: 我們可以在數組中每隔一秒拿掉一秒的值來將這段音頻的速度變成兩倍。 如此我們不僅將音
        推薦度:
        導讀用Python制作簡單的鋼琴程序的教程:錄一段音頻,把它的音高改變50次并把每一個新的音頻匹配到鍵盤的一個鍵位,你就能把電腦變成一架鋼琴! 一段音頻可以被編碼為一組數值的數組(或者列表),像這樣: 我們可以在數組中每隔一秒拿掉一秒的值來將這段音頻的速度變成兩倍。 如此我們不僅將音
        錄一段音頻,把它的音高改變50次并把每一個新的音頻匹配到鍵盤的一個鍵位,你就能把電腦變成一架鋼琴!

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

        201541171623980.png (512×112)

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

        201541171709750.png (512×112)

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

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

        201541171802247.png (512×112)

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

        import numpy as np
         
        def speedx(sound_array, factor):
         """ 將音頻速度乘以任意系數`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) ]
        

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

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

        201541171835595.png (300×102)

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

        def stretch(sound_array, f, window_size, h):
         """ 將音頻按系數`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):
         
         # 兩個可能互相重疊的子數列
         a1 = sound_array[i: i + window_size]
         a2 = sound_array[i + h: i + window_size + h]
         
         # 按第一個數列重新同步第二個數列
         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))
         
         # 加入到結果中
         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')
        


        變調

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

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

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


        小程序:電腦鋼琴

        讓我們來玩一下我們的變調器。我們先敲碗來確定一個“標準音高”:

        [youku id="XNzM1NDM2NTky"]

        接下來我們基于之前的音頻創造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]
        

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

        201541172006429.jpeg (300×142)

        我們只需要在代碼中告訴計算機當一個鍵按下來的時候播放其對應的聲音,然后當按鍵松開后停止播放就可以了:

        import pygame
         
        pygame.mixer.init(fps, -16, 1, 512) # 太靈活了 ;)
        screen = pygame.display.set_mode((640,480)) # 設置焦點
         
        # 得到鍵盤的鍵位的正確順序的列表
        # ``keys`` 如 ['Q','W','E','R' ...] 一樣排列
        keys = open('typewriter.kb').read().split('
        ')
         
        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
        
        

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

        [youku id="XNzM1NDQ1MDA4"]

        如果想自己試試的話,在這里可以下載你需要的所有文件。因為不是所有的人都用Python,我也用Javascript/HTML5(在這兒)實現了一臺電腦鋼琴,但是不是特別理想。如果有經驗豐富的HTML5/JS/elm程序員來改進改進,或者從頭重寫就太好了。
        接下來做什么?

        更通常的情況下,我發現計算機很少被用來進行表演性質的演奏。我明白使用鋼琴鍵盤或者直接從樂器錄音會容易很多,但是請看看僅僅用一個碗和60行的Python代碼就能做到什么!

        即便是很便宜的計算機也有如此多的控制來實現一個馬馬虎虎的音樂臺:你可以對著麥克風唱歌,對著攝像頭做手勢,用鼠標來調制,然后用鍵盤來完成剩下來的玩意兒。有如此多方式來表現自我,而每種方式又有那么一個Python包……有沒有具有藝術天賦的大神加入呀?

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

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

        用Python制作簡單的鋼琴程序的教程:錄一段音頻,把它的音高改變50次并把每一個新的音頻匹配到鍵盤的一個鍵位,你就能把電腦變成一架鋼琴! 一段音頻可以被編碼為一組數值的數組(或者列表),像這樣: 我們可以在數組中每隔一秒拿掉一秒的值來將這段音頻的速度變成兩倍。 如此我們不僅將音
        推薦度:
        標簽: 鋼琴 樂譜 python
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 国产亚洲美日韩AV中文字幕无码成人| 最近2019中文免费字幕在线观看 | 亚洲人成影院午夜网站| 成人爽a毛片免费| 久久久久久久亚洲精品| 一级做α爱过程免费视频| 日韩成人免费aa在线看| 亚洲av无码久久忘忧草| 久久久久久国产a免费观看黄色大片 | 亚洲三级视频在线| 久久午夜羞羞影院免费观看| 亚洲狠狠婷婷综合久久久久| 久久er国产精品免费观看8| 亚洲视频在线精品| 成人免费无码H在线观看不卡| 亚洲成年看片在线观看| 一二三区免费视频| 亚洲午夜久久久影院伊人| a毛片在线免费观看| 亚洲国产美女精品久久久久∴| a级成人毛片免费图片| 久久亚洲精品成人综合| 99在线观看精品免费99| 中文字幕亚洲精品| 国产成在线观看免费视频| 亚洲熟女乱色一区二区三区| 日本午夜免费福利视频| 美女被免费网站视频在线| 国产福利电影一区二区三区,亚洲国模精品一区 | 亚洲性色AV日韩在线观看| 麻豆国产VA免费精品高清在线| 国产精品亚洲专区一区| 亚洲成av人片在线观看天堂无码| a高清免费毛片久久| 亚洲91av视频| 成年网站免费视频A在线双飞| 久久精品国产亚洲av瑜伽| 中文字幕专区在线亚洲| 免费A级毛片无码A∨| 亚洲男人的天堂网站| 亚洲午夜精品第一区二区8050|