《鈴兒響叮當》是一首膾炙人口的經典圣誕歌曲,今晚平安夜我來用python奏起來——
用最原始的winsound庫函式Beep()來演奏,用法如下:
>>> 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))
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/392130.html
標籤:python
