python控制电脑Beep()蜂鸣函数制作简易播放器

记得上大学的时候,用C语言控制单片机的蜂鸣器发出哔哔的声音来播放音乐,虽然音色比较单调,但是当听到一首乐曲从简单的开发板上飘扬出来的时候,还是觉得余音绕梁,三日不绝,着实开心了一把。现在工作了,少了那种简单的快乐,但是看着办公电脑一没有功放,二没有声卡,有的只是电脑警告或者提示时发出的嘀嘀声。对啊,这嘀嘀的蜂鸣声音是不是也能用程序控制,发出枯燥的嘀嘀声,变成悠扬的乐曲声呢?果然,几行Python代码测试之后,电脑嘀嘀的 欢快的蜂鸣了起来。既然行得通,就索性做一个播放器吧!

  1. 准备工作

    Python3.6

    几首歌曲的简谱

    我这里找了一首《小幸运》和一首《大鱼海棠》

  2. 乐理分析、编谱

    简单来讲,声音由振动产生,声音分为三个方面,即响度、音调和音色。响度就是声音的大小,由振动时的振幅决定;音调就是声音的高低,是由振动时的频率决定,频率高音调就高,频率低音调就低;音色就是声音的特点,由振动的波形决定,不同人、不同乐器的振动时的波形不一样,所以我们能听音识人。就像红楼梦里面王熙凤出场时"粉面含春微不露,丹唇未启笑先问",就像长歌行里面"大珠小珠落玉盘",都是因为音色不同而让人一下子就辨认出来了。

     

    在这里由于是使用主板上的蜂鸣器,所以音色就已经确定了,无法改变,由蜂鸣器本身决定。响度的话,如果是台式电脑,基本上就是蜂鸣器发出的声音的大小,也没办法调节;如果是拿笔记本做实验的话,或者说在由声卡的电脑上做实验的话,其实win7内部直接把驱动蜂鸣器发声音的过程转化为驱动声卡,这时可以通过调节电脑声音大小来控制音量。

     

    重点就在频率的处理上面。我们看到简谱上有1/2/3/4/5/6/7,几个音阶,每一个音阶就代表声音的一个频率,其中一个八度内(do到高音do),音调是一个比一个高的,高音do的频率是do的两倍。比如电子琴,我们把这个八度看作是十二平均律,也就是说在一个八度之内,白键和黑键一共有十二个键,假如do的频率为do赫兹,那么高音do(高)=do×2。

    python控制电脑Beep()蜂鸣函数制作简易播放器_第1张图片

    根据十二平均律,这十二个键为等比数列,设公比为q,那么就是do×q^12=do(高),即q^12=2,解得q=1.06。那么,只要知道了do的频率,do(C) 、re(D)、 mi(E)、 fa(F)、 sol(G)、 la(A)、 xi(B)甚至包括那五个黑键的频率也就知道了。

    这里面还有半音、全音、升调、降调等,这里不过多赘述。

     

    通常电子琴中央C区的do频率是523,依据等比数列我们就能够算出所有的高低音的频率了。

    又由于D大调就是把re(D)作为do,所以这样也就知道了C、D、E、F、G、A、B调的do了。

     

    下面就根据简谱来编谱。

    python控制电脑Beep()蜂鸣函数制作简易播放器_第2张图片

     

    在简谱里面,我们看到每一个音符有三个要素,[音符,音调,节拍],音符音调前面已经了解了,节拍就是每一个音符播放的时长。通常有全音符、四分音符,八分音符、附点音符等,这跟乐曲的节奏速度有关。

     

    那么有了上面的铺垫,我们怎么来把简谱数字化呢?

    我的方法是这样,每一个音符都表示为[音符,音调,节拍]三个要素,那么对于歌词的第一句"我听见"中的我对应的3(mi),它是中音,四分音符,我们把它表示为 3m0.5,其中3表示mi,m表示中音,0.5表示一个八分音符。相应的"滴"对应的高音do,表示为1h0.5,对于中间出现的0,也就是空拍,我们直接把音符设计为0,比如0m0.5。

    同理,如果有一个四分音符的低音fa,那么就编成4l1,中间是字母L,表示低音。

     

    按照这个原则,可以把上面的音符编程下面的形式

    python控制电脑Beep()蜂鸣函数制作简易播放器_第3张图片

    把这个文件保存为.txt或其他任何文件类型都可以,这样就只做好了音乐文件了,下面就是编写代码播放这个音乐了。

  3. 播放器编写

    这里为了便于播放,用自带的tkinter库写了一个简单的界面。

    代码比较简单,直接上代码,需要源码的可以在github(https://github.com/pengranxindong1990/BBPlayer)上找到

    python控制电脑Beep()蜂鸣函数制作简易播放器_第4张图片

    python控制电脑Beep()蜂鸣函数制作简易播放器_第5张图片

     

    运行效果如下:

    python控制电脑Beep()蜂鸣函数制作简易播放器_第6张图片

     

    其中比较实用的的一个是多线程处理,防止程序假死

    python控制电脑Beep()蜂鸣函数制作简易播放器_第7张图片

    另一个是音调和速度设置输入框的默认值

    python控制电脑Beep()蜂鸣函数制作简易播放器_第8张图片

     

四、可以愉快地听歌了!

你可能感兴趣的:(python控制电脑Beep()蜂鸣函数制作简易播放器)