蜂鸣器-播放音乐(含乐理知识)

目录

概述 

五线谱转简谱

步骤一:确定谱号

步骤二:确定调号

步骤三:明确拍号

步骤四:识别音符

步骤五:处理升降音

步骤六:小节和终止线

代码实现步骤

步骤一:确定音符频率

步骤二:产生脉冲信号

步骤三:连接电路

步骤四:编写播放程序


概述 

        蜂鸣器一般分为有源蜂鸣器和无源蜂鸣器,通常用来播放音乐的时候会使用无源蜂鸣器,无源蜂鸣器没有内置振荡源,需要外部提供一定频率的脉冲信号才能发声,通过改变脉冲信号的频率可以发出不同音调的声音,因此可以用来播放音乐。

        如果想把乐谱通过蜂鸣器播放出来,则需要将五线谱转化成简谱,然后针对不同的音符顺序转换成不同的频率,再加上节拍数(时长),就能播放出音乐了。

        首先针对乐谱转简谱做个简单的介绍(如有不正确的地方可指出)!

五线谱转简谱

步骤一:确定谱号

高音谱号

  • 形状:高音谱号也叫G谱号,其形状像一个花体的“G”。它从第二线开始绕圈,第二线被这个“G”的弯钩所环绕,这个设计是为了明确标记出该线的音高为小字一组的“g”(sol)
  • 用途:高音谱号通常用于记录高音区的音符,在许多乐器(如小提琴、长笛、小号等)的乐谱以及声乐中的女高音、男高音声部中广泛使用。

低音谱号

  • 形状:低音谱号又称F谱号,它的形状是先写一个类似“8”的符号,然后在两点之间穿过第四线。这两点标记出的第四线音高为小字组的“f”(fa)
  • 用途:低音谱号主要用于记录低音区的音符,常见于大提琴、低音提琴、大号等乐器的乐谱,以及声乐中的男低音声部。

可以通过下面的文字简易示意感受它们的形态:

高音谱号:𝄞 低音谱号:𝄢

步骤二:确定调号

  • 观察五线谱:在五线谱中,调号位于谱号之后,由升号(#)或降号(b)组成。例如《小星星》通常是 C 大调,C 大调的调号没有升号和降号。如果是 G 大调,调号会有一个升号(升 F);F 大调则有一个降号(降 B)。
  • 对应简谱调号:确定五线谱的调号后,在简谱中用“1 = 调名”来表示。对于 C 大调,简谱就写“1 = C”,这意味着简谱里的“1”对应五线谱 C 调里的“do”音。这里我们就使用“1=C”示例。

步骤三:明确拍号

  • 五线谱中的拍号:拍号一般在调号之后,由上下两个数字组成,比如常见的 4/4 拍、3/4 拍等。《小星星》常用 4/4 拍,分母 4 表示以四分音符为一拍,分子 4 表示每小节有四拍。
  • 转换到简谱:在简谱中同样标注拍号,直接将五线谱的拍号写在简谱开头,《小星星》简谱开头就写“4/4”。

步骤四:识别音符

  • 音高对应
    • 在高音谱号的五线谱中(这里说的线就是五线谱里的五条线,从下开始时第一条线),下加一线是“do”(对应简谱的“1”),下加一间是“re”(对应简谱的“2”),一线是“mi”(对应简谱的“3”),一间是“fa”(对应简谱的“4”),二线是“sol”(对应简谱的“5”),二间是“la”(对应简谱的“6”),三线是“si”(对应简谱的“7”)。
    • 例如《小星星》五线谱第一小节可能是在高音谱号下,下加一线的两个音和二线的两个音,对应的简谱就是“1 1 5 5”。
  • 音符时值
    • 五线谱中不同形状的音符表示不同的时值。全音符是一个空心符头,没有符干和符尾,时值为四拍;二分音符是空心符头加符干,时值为两拍;四分音符是实心符头加符干,时值为一拍;八分音符是实心符头加符干和一条符尾,时值为半拍等。
    • 在简谱里,全音符用数字后面加三个“ - ”表示;二分音符用数字后面加一个“ - ”表示;四分音符就是单个数字;八分音符则在数字下面加一条横线。比如五线谱中第一小节四个四分音符,对应简谱就是四个单独的数字。

步骤五:处理升降音

  • 临时升降号:如果五线谱中有临时升降号(在音符前面出现的升号 # 或降号 b),在简谱中也要相应体现。升号在简谱中用“#”写在数字前面,降号用“b”写在数字前面。例如五线谱中某个音有临时升号,简谱对应的数字前就加上“#”。
  • 调号中的升降号:调号里的升降号会影响整个曲子中对应音的音高。比如 G 大调调号有一个升号(升 F),在简谱里遇到对应“4”(F 音)时,要记得是“#4”。

步骤六:小节和终止线

  • 小节划分:五线谱用竖线划分小节,简谱同样按照这个划分方式,把音符按小节分开书写。
  • 终止线:五线谱中的终止线(两条竖线,后一条较粗)在简谱中同样表示曲子结束,照原样理解即可。

通过以上步骤,就可以将《小星星》的五线谱完整地转化为简谱。以常见的《小星星》五线谱为例,经过上述转化后就会得到我们熟悉的简谱:

1 1 5 5 | 6 6 5 - |
4 4 3 3 | 2 2 1 - |
5 5 4 4 | 3 3 2 - |
5 5 4 4 | 3 3 2 - |
1 1 5 5 | 6 6 5 - |
4 4 3 3 | 2 2 1 - |

简谱吧

代码实现步骤

步骤一:确定音符频率

不同的音符对应不同的频率,例如中央 C(do)的频率约为 261.63Hz,D(re)约为 293.66Hz 等,制作一个音符与频率的对照表。

音符C4D4E4F4G4A4B4C5
频率262294330349392440494523

步骤二:产生脉冲信号

使用单片机或其他控制器来产生不同频率的脉冲信号。例如,Arduino 可以使用 tone() 函数来产生指定频率和时长的脉冲信号。

步骤三:连接电路

将无源蜂鸣器的引脚连接到控制器的 GPIO 引脚,同时可能需要一个三极管来放大电流,以驱动蜂鸣器。具体可查看之前的一篇蜂鸣器完全指南:让电子设备“会说话”的秘密

步骤四:编写播放程序

根据音乐的乐谱,按照音符的顺序和时长依次调用 tone() 函数来播放各个音符。以下是一个使用 Arduino 控制无源蜂鸣器播放《小星星》的示例代码:

const int buzzerPin = 9;  // 定义蜂鸣器连接的引脚

// 定义音符频率
#define NOTE_C4  262
#define NOTE_D4  294
#define NOTE_E4  330
#define NOTE_F4  349
#define NOTE_G4  392
#define NOTE_A4  440
#define NOTE_B4  494

// 《小星星》乐谱
int melody[] = {
  NOTE_C4, NOTE_C4, NOTE_G4, NOTE_G4,
  NOTE_A4, NOTE_A4, NOTE_G4, 
  NOTE_F4, NOTE_F4, NOTE_E4, NOTE_E4,
  NOTE_D4, NOTE_D4, NOTE_C4
};

// 每个音符的时长
int noteDurations[] = {
  4, 4, 4, 4,
  4, 4, 2,
  4, 4, 4, 4,
  4, 4, 2
};

void setup() {
  pinMode(buzzerPin, OUTPUT);  // 将引脚设置为输出模式
}

void loop() {
  for (int thisNote = 0; thisNote < 14; thisNote++) {
    // 计算音符的时长
    int noteDuration = 1000 / noteDurations[thisNote];
    tone(buzzerPin, melody[thisNote], noteDuration);
    // 音符之间的间隔
    int pauseBetweenNotes = noteDuration * 1.30;
    delay(pauseBetweenNotes);
    noTone(buzzerPin);
  }
  delay(2000);  // 每播放完一次,间隔 2 秒
}

        以上计算音符间隔乘的参数1.3是一个经验值,以一个时长为 4 拍的音符为例,假设一拍对应的时间是 250 毫秒,那么这个音符的时长 noteDuration 就是 1000 毫秒(1000=250×41000=250×4)。按照 1.3 的比例计算音符间隔 pauseBetweenNotes ,则为 1300 毫秒(1300=1000×1.31300=1000×1.3)。这样在播放完这个 4 拍的音符后,会停顿 1300 毫秒再播放下一个音符,使得音乐听起来更有节奏感。

        在不同的音乐风格和实际需求中,这个比例可能会有所调整。例如,对于节奏明快的音乐,可能需要更小的比例来减少停顿,让音乐更紧凑;而对于节奏舒缓的音乐,可能会适当增大比例,使停顿更明显。

STM32示例代码可参看上一篇!

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值