找回密码
 立即注册

QQ登录

只需一步,快速开始

本帖最后由 lxf 于 2020-8-17 13:36 编辑

第19课 音乐的制作


目标

1、了解音乐中的音调和节拍
2、掌握音乐的制作方法
3、制作一闪一闪亮晶晶的部分音乐

实验材料

Arduino UNO开发板
蜂鸣器模块
配套USB数据线
配套杜邦线若干
Arduino IDE软件

微信图片_20200624112221.png

内容

音调:中音1(do):0   低音1下面一点:-1    高音1上面一点:1
节拍:1  2  3  4      每个音符为1拍,用数字1表示
          3  4  5  -      5-为2拍,用2表示
          56   54         56和54各占1拍,每个音符上的节拍为0.5拍,用0.5表示

“一闪一闪亮晶晶”部分简谱

图片1.png

接线图

图片2.png

接线方式

Arduino UNO     <------>    蜂鸣器模块
         5V              <------>         VCC
       GND             <------>         GND
        D8               <------>          IO

程序实现代码

  1. float Reference_Note[]={1046.5,1174.7,1318.5,1396.9,1568,1760,1975.5};   //创建一个浮点型的Reference_Note基准音数组
  2. int Musical_note[]={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};  //创建一个整型Musical_note音符数组
  3. int Beat[]={1,1,1,1,1,1,2,1,1,1,1,1,1,2,1,1,1,1,1,1,2,1,1,1,1,1,1,2};  //创建一个整型Beat节拍数组
  4. int pitch[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};   //创建一个整型pitch音调数组
  5. void setup(){
  6.   pinMode(8, OUTPUT);    //定义8号数字管脚类型为输出
  7. }
  8. void loop(){
  9.   for (int i = (1); i <= (sizeof(Musical_note)/sizeof(Musical_note[0])); i = i + (1)) {  //获取 Musical_note音符数组的长度,并进行循环
  10.     tone(8,Reference_Note[(int)(Musical_note[(int)(i - 1)] - 1)] * pow(2, pitch[(int)(i - 1)]));  //获取每个音符的音调,并通过8号引脚//蜂鸣器进行播放
  11.     delay((500 * Beat[(int)(i - 1)]));  //对应每个音符的发音节拍
  12.     noTone(8);   //8号管脚蜂鸣器不响,防止连音
  13.     delay(10);  //防止连音
  14.   }
  15. delay(1000);   //全部播放完后延迟等待1000ms
  16. }
复制代码

sizeof()

sizeof操作符返回一个变量的字节数,或者返回数组占用的字节数。

语法

sizeof(variable)

参数

variable: 任何变量类型或数组(如int,float,byte)

示例程序1:

sizeof操作符用来处理数组非常有效。它能很方便的改变数组的大小而不破坏程序的其他部分。
以下程序一次打印出一个字符串文本的字符。你可以试着改变一下以下程序中第一行语句的字符串内容,看一看运行结果的变化。

  1. char myStr[] = "this is a test";

  2. int i;

  3. void setup(){

  4.   Serial.begin(9600);

  5. }

  6. void loop() {

  7.   for (i = 0; i < sizeof(myStr) - 1; i++){

  8.     Serial.print(i, DEC);

  9.     Serial.print(" = ");

  10.     Serial.write(myStr[i]);

  11.     Serial.println();

  12.   }

  13.   delay(5000);

  14. }
复制代码

运行结果:

图片3.png

示例程序2:

sizeof操作符也可以用来判断各种变量类型所占用的Arduino内存情况。以下示例程序显示几种变量类型所占用的字节大小。

  1. void setup() {
  2.   Serial.begin(9600);
  3.   bool boolVar;
  4.   byte byteVar;
  5.   int intVar;
  6.   float floatVar;
  7.   long longVar;
  8.   Serial.print("sizeof(boolVar) = ");
  9.   Serial.println(sizeof(boolVar));
  10.   Serial.print("sizeof(byteVar) = ");
  11.   Serial.println(sizeof(byteVar));
  12.   Serial.print("sizeof(intVar) = ");
  13.   Serial.println(sizeof(intVar));
  14.   Serial.print("sizeof(floatVar) = ");
  15.   Serial.println(sizeof(floatVar));
  16.   Serial.print("sizeof(longVar) = ");
  17.   Serial.println(sizeof(longVar));
  18. }
  19. void loop() {
  20. }
复制代码

运行结果:

图片4.png
分享至 : QQ空间
收藏

0 个回复

您需要登录后才可以回帖 登录 | 立即注册