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