arduino电子琴(2015-11-04)

前言

这是论坛上一个坛友问的问题,想做一个可变音调的电子琴,想着正好练练手,就顺手做一下。

接线图

代码

主程序:

 1 // ----------------------------------------------------------------------------
 2 // elecKeyboard.ino
 3 //
 4 // Created 2015-11-04
 5 // By seesea <seesea2517#gmail#com>
 6 //
 7 // 模拟电子琴
 8 // 七个按键为 1 2 3 4 5 6 7
 9 // 加两个按键控制升降一个八度
10 // ----------------------------------------------------------------------------
11
12 #include "pitches.h"
13
14 #define BASS 0  // 低音
15 #define ALTO 1  // 中音
16 #define ALTA 2  // 高音
17
18 byte keyOttavaBassa = 2;                    // 低八度变换按键
19 byte keyOttavaAlta  = 3;                    // 高八度变换按键
20 byte keyboard[] = { 4, 5, 6, 7, 8, 9, 10 }; // 七个音阶键
21 byte pinBuzzer  = 12;                       // 蜂鸣器
22 byte pinLED     = 13;                       // 灯光显示
23
24 char keyNum = sizeof(keyboard) / sizeof(keyboard[0]);
25
26 unsigned int notes[][7] = {
27         { NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_B4 },  // 低音
28         { NOTE_C5, NOTE_D5, NOTE_E5, NOTE_F5, NOTE_G5, NOTE_A5, NOTE_B5 },  // 中音
29         { NOTE_C6, NOTE_D6, NOTE_E6, NOTE_F6, NOTE_G6, NOTE_A6, NOTE_B6 },  // 高音-------
30     };
31
32 void setup()
33 {
34     pinMode(keyOttavaBassa, INPUT_PULLUP);
35     pinMode(keyOttavaAlta,  INPUT_PULLUP);
36     for (char i = 0; i < keyNum; ++i)
37     {
38         pinMode(keyboard[i], INPUT_PULLUP);
39     }
40
41     pinMode(pinLED, OUTPUT);
42 }
43
44 void loop()
45 {
46     int key = getKeyDown();
47
48     if (key < 0)
49     {
50         noTone(pinBuzzer);
51         digitalWrite(pinLED, LOW);
52         return;
53     }
54
55     tone(pinBuzzer, notes[getToneLevel()][key]);
56     digitalWrite(pinLED, HIGH);
57 }
58
59 // 根据音调按键来获得当前的音调高度
60 char getToneLevel()
61 {
62     if (digitalRead(keyOttavaBassa) == LOW)
63         return BASS;
64
65     if (digitalRead(keyOttavaAlta) == LOW)
66         return ALTA;
67
68     return ALTO;
69 }
70
71 // 获取按下的音阶按键
72 // 以 0 - 6 为音阶 1 - 7
73 // 没有按下的话返回 -1
74 char getKeyDown()
75 {
76     for (char i = 0; i < keyNum; ++i)
77     {
78         if (digitalRead(keyboard[i]) == LOW)
79             return i;
80     }
81
82     return -1;
83 }

头文件(直接摘自官方示例):

 1 /*************************************************
 2  * Public Constants
 3  *************************************************/
 4
 5 #define NOTE_B0  31
 6 #define NOTE_C1  33
 7 #define NOTE_CS1 35
 8 #define NOTE_D1  37
 9 #define NOTE_DS1 39
10 #define NOTE_E1  41
11 #define NOTE_F1  44
12 #define NOTE_FS1 46
13 #define NOTE_G1  49
14 #define NOTE_GS1 52
15 #define NOTE_A1  55
16 #define NOTE_AS1 58
17 #define NOTE_B1  62
18 #define NOTE_C2  65
19 #define NOTE_CS2 69
20 #define NOTE_D2  73
21 #define NOTE_DS2 78
22 #define NOTE_E2  82
23 #define NOTE_F2  87
24 #define NOTE_FS2 93
25 #define NOTE_G2  98
26 #define NOTE_GS2 104
27 #define NOTE_A2  110
28 #define NOTE_AS2 117
29 #define NOTE_B2  123
30 #define NOTE_C3  131
31 #define NOTE_CS3 139
32 #define NOTE_D3  147
33 #define NOTE_DS3 156
34 #define NOTE_E3  165
35 #define NOTE_F3  175
36 #define NOTE_FS3 185
37 #define NOTE_G3  196
38 #define NOTE_GS3 208
39 #define NOTE_A3  220
40 #define NOTE_AS3 233
41 #define NOTE_B3  247
42 #define NOTE_C4  262
43 #define NOTE_CS4 277
44 #define NOTE_D4  294
45 #define NOTE_DS4 311
46 #define NOTE_E4  330
47 #define NOTE_F4  349
48 #define NOTE_FS4 370
49 #define NOTE_G4  392
50 #define NOTE_GS4 415
51 #define NOTE_A4  440
52 #define NOTE_AS4 466
53 #define NOTE_B4  494
54 #define NOTE_C5  523
55 #define NOTE_CS5 554
56 #define NOTE_D5  587
57 #define NOTE_DS5 622
58 #define NOTE_E5  659
59 #define NOTE_F5  698
60 #define NOTE_FS5 740
61 #define NOTE_G5  784
62 #define NOTE_GS5 831
63 #define NOTE_A5  880
64 #define NOTE_AS5 932
65 #define NOTE_B5  988
66 #define NOTE_C6  1047
67 #define NOTE_CS6 1109
68 #define NOTE_D6  1175
69 #define NOTE_DS6 1245
70 #define NOTE_E6  1319
71 #define NOTE_F6  1397
72 #define NOTE_FS6 1480
73 #define NOTE_G6  1568
74 #define NOTE_GS6 1661
75 #define NOTE_A6  1760
76 #define NOTE_AS6 1865
77 #define NOTE_B6  1976
78 #define NOTE_C7  2093
79 #define NOTE_CS7 2217
80 #define NOTE_D7  2349
81 #define NOTE_DS7 2489
82 #define NOTE_E7  2637
83 #define NOTE_F7  2794
84 #define NOTE_FS7 2960
85 #define NOTE_G7  3136
86 #define NOTE_GS7 3322
87 #define NOTE_A7  3520
88 #define NOTE_AS7 3729
89 #define NOTE_B7  3951
90 #define NOTE_C8  4186
91 #define NOTE_CS8 4435
92 #define NOTE_D8  4699
93 #define NOTE_DS8 4978

视频

时间: 2024-10-24 07:49:20

arduino电子琴(2015-11-04)的相关文章

2015.11.04 学习 Ubuntu下安装gocode

2015.11.04 学习 Ubuntu下安装gocode 1.go get github.com/nsf/gocode,如果不成功 2.网页http://github.com/nsf/gocode,下载包,然后解压,解压后的文件名为gocode-master,修改为gocode. 3.复制gocode文件夹到go的安装目录~/go/github.com/nsf/gocode,(没有的话自行创建) 4.然后命令行执行go install github.com/nsf/gocode.确保安装目录的

Murano Weekly Meeting 2015.11.04

Meeting time: 2015.November.4th 1:00~2:00 Chairperson:  Serg Melikyan, PTL from Mirantis Meeting summary: 1.Tagging Liberty    PIC:      Kirill Zaitsev Desc: Murano is still in Liberty 1.0.0 version. Kirill will try to tag stable branch 1.0.1 in this

PCB设计软件CadSoft Eagle Professional v7.5 Multilingual +DownStream Products 2015.11

PCB设计软件CadSoft Eagle Professional v7.5 Multilingual Win64 1CDCadSoft Eagle Professiona是一款简单易用的印刷电路板设计软件,其中包含原理图编辑器.PCB编辑 器和自动布线器三个模块,方便设计者更方便操作.CadSoft Eagle Professiona支持中文版 DownStream Products 2015.11 1CD业界领先的PCB后处理解决方案CadSoft.Eagle.Professional.v7

【我的书】Unity Shader的书 — 目录(2015.09.04更新)

写在前面 感谢所有点进来看的朋友.没错,我目前打算写一本关于Unity Shader的书. 出书的目的有下面几个: 总结我接触Unity Shader以来的历程,给其他人一个借鉴.我非常明白学Shader的艰难,在群里也见了很多人提出的问题.我觉得学习Shader还是一件有规律可循的事情,但问题是中文资料难觅,而大家又不愿意去看英文...这对我有什么好处呢?强迫我对知识进行梳理,对细节问题把握更清楚. 第二个原因你懂的. 关于本书的定位问题: 面向Unity Shader初学者,但要: 有一定的

2015.11.06 学习Ubuntu下常用命令

2015.11.06 学习Ubuntu下常用命令 1.关闭防火墙:ufw disable 2.开启防火墙:ufw enable 3.防火墙状态:ufw status 4.查看占用的端口:#lsof -i 5.查看某一个端口:#lsof -i:8080  或者是: #netstat -apn|grep 8080————接着:#ps -aux|grep 进程号 6.结束占用端口的进程:#killall 进程名 7.自己写一遍,记得牢!

【转】ubuntu 11.04使用apt-get安装软件时一直提示E:unable to locate package

问题: VMware虚拟机安装了ubuntu 11.04,在使用apt-get安装软件时一直提示E:Unable to locate package. 百度了原因,说是要更新源,使用命令:sudo apt-get update更新了,但更新之后问题还是存在: 解决方案: 主要还是源的问题,目前网上找的很多源都是很久以前的了,很多的可能都不能用了: 然后自己重新下载了一个ubuntu 14.04版本的源替换原来的sources.list文件,然后运行sudo apt-get update更新后就可

如何在ubuntu 64 11.04 上运行32位程序

在网上查了很多资料,发现在在ubuntu 64 11.04 上运行32位程序要装一个ia32-libs的包,可执行如下命令,却提示无法安装 apt-get install ia32-libs 难道11.04的安装源给整坏了!!! 经过查了很多很多的外国网站,找到很多方法,都无效! 最后找到一种,将就可以用 apt-get install libstdc++6 apt-get install lib32stdc++6 apt-get install lib32z1 在这里深深的鄙视百度,你搜索出来

分布式系统一周技术动态 2015.11.22

分布式系统实践 1. 直观理解paxos http://drmingdrmer.github.io/pdf/paxos-slide/paxos.pdf 要点: paxos协议一直以难以理解著称, 以至于该论文发表10年后才被人们认识到重要性, 这篇文章通过具体的例子来阐述paxos协议, 让人感觉到paxos协议不是发明出来的, 而是演化而来的, 让paxos协议不再那么难以理解了. 2. NoSQL数据库模型 http://darkhouse.com.cn/blog/4?hmsr=toutia

How to Write and Publish a Scientific Paper: 7th Edition(科技论文写作与发表教程)(11.04更新)

How to Write and Publish a Scientific Paper: 7th Edition(科技论文写作与发表教程)(11.04更新) 重要通知: 最近开题报告已差不多告一段落,准备发力写论文了.我会根据自己写论文的实践,从找期刊到发表的过程记录下来.记录的过程从第6章开始,我会用不同颜色的自己标注出来,其顺序大体和<科技论文写作与发表教程>的目录相似.欢迎大家讨论拍砖. 目 录 第一部分 一些基本常识 第1章 什么是科研写作第2章 历史回顾第3章 走进科技写作第4章 何

我关注的一周技术动态 2015.11.15

分布式系统实践 1. 一致性哈希算法 http://www.javaranger.com/archives/1781?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io 要点: 一致性hash算法是解决分布式系统数据划分的有效手段, 解决了传统hash算法在机器扩容时需要大量移动数据的问题. 这篇文章对一致性hash算法做了简要的介绍, 如果你还不了解一致性hash算法, 那么请读读这篇文章吧 2. 巧用CAS解决数据一致