《鈴兒響叮當》是一首脍炙人口的經典聖誕歌曲,今晚平安夜我來用python奏起來——
用最原始的winsound庫函數Beep()來演奏,用法如下:
私信小編01即可獲取大量Python學習資源
>>> import winsound
>>> help(winsound.Beep)
Help on built-in function Beep in module winsound:
Beep(frequency, duration)
A wrapper around the Windows Beep API.
frequency
Frequency of the sound in hertz.
Must be in the range 37 through 32,767.
duration
How long the sound should play, in milliseconds.
先找來do,re,mi等音符的頻率表:
'''休止符及do re mi等對應的頻率數'''
Tone = [[0,0,0,0,0,0],
[523,262,1046,554,277,1109],
[578,294,1175,622,311,1245],
[659,330,1318,659,330,1318],
[698,349,1493,740,370,1556],
[784,392,1568,831,415,1661],
[880,440,1760,932,466,1865],
[988,494,1976,988,494,1976]]
然後找一份最簡版的《鈴兒響叮當》簡譜:
照此編制樂譜,自定義一個規則,每個音符為一個元組:(音符,音長,音階)
簡譜的每個音符用一個三元素元組表示,其中:
第一個元素 1~7 對應do re mi fa so la si 0=休止符
第二個元素 1拍=1;半拍=0.5 四分之一拍=0.25 以此類推
第三個元素一般就為0,低音=1 高音=2 對應的半階音=3 4 5
這樣定義方便樂譜的編制,代碼如下:
from winsound import Beep
'''休止符及do re mi等對應的頻率數'''
Tone = [[0,0,0,0,0,0],
[523,262,1046,554,277,1109],
[578,294,1175,622,311,1245],
[659,330,1318,659,330,1318],
[698,349,1493,740,370,1556],
[784,392,1568,831,415,1661],
[880,440,1760,932,466,1865],
[988,494,1976,988,494,1976]]
'''樂譜編制'''
t1 = '33333335123'
t2 = '444333322125'
t3 = t1
t4 = '4444433355421'
'''對應的音長'''
p1 = [1,1,2,1,1,2,1,1,1.5,0.5,4]
p2 = [1,1,2,1,1,2,1,1,1,1,2,2]
p3 = p1
p4 = [1,1,1.5,0.5,1,1,1,1,1,1,1,1,4]
t = list(map(int,t1 t2 t1 t4))
p = p1 p2 p1 p4
Tune = list(zip(t,p,[0]*len(t))) #配曲音符都為中音,音階值全為0
'''演奏樂譜'''
Pai = 360 #一拍的毫秒數,可以調節
for t in Tune:
Beep(Tone[t[0]][t[2]],int(t[1]*Pai))
按下運行鍵,動聽的演奏開始了:
“叮叮當,叮叮當, 鈴兒響叮當.
我們滑雪多快樂,我們坐在雪橇上...”
為方便初學者理解怎樣把簡譜轉換成Tune列表,另附一首《兩隻老虎》:
from winsound import Beep
'''休止符及do re mi等對應的頻率數'''
Tone = [[0,0,0,0,0,0],
[523,262,1046,554,277,1109],
[578,294,1175,622,311,1245],
[659,330,1318,659,330,1318],
[698,349,1493,740,370,1556],
[784,392,1568,831,415,1661],
[880,440,1760,932,466,1865],
[988,494,1976,988,494,1976]]
'''按照簡譜編制樂譜'''
t = [None]*4
t[0] = [(1,1,0),(2,1,0),(3,1,0),(1,1,0)] #兩隻老虎
t[1] = [(3,1,0),(4,1,0),(5,2,0)] #跑得快
t[2] = [(5,0.75,0),(6,0.25,0),(5,0.75,0),
(4,0.25,0),(3,1,0),(1,1,0)] #一隻沒眼睛|尾巴
t[3]= [(1,1,0),(5,1,1),(1,2,0)] #真奇怪
'''導入樂譜'''
Tune = []
for i in range(4):
Tune.extend(t[i]*2)
'''演奏樂譜'''
Pai = 360 #一拍的毫秒數,可以調節
for t in Tune*2:
Beep(Tone[t[0]][t[2]],int(t[1]*Pai))
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!