Difference between revisions of "Arduino - zložitejšia melódia"
m |
m |
||
Line 41: | Line 41: | ||
| iná nota: || 251 f1 f2 d1 d2 || frekvencia = f1 * 256 + f2, dĺžka noty: d1/d2 | | iná nota: || 251 f1 f2 d1 d2 || frekvencia = f1 * 256 + f2, dĺžka noty: d1/d2 | ||
|- | |- | ||
− | | nastavenie | + | | nastavenie tempa: || 252 d || d = dĺžka trvania šestnástinovej noty [ms] |
|- | |- | ||
− | |||
− | |||
|} | |} | ||
Revision as of 23:04, 9 August 2018
V tomto projekte naprogramujeme jednoduché zadávanie zložitejšej (akejkoľvek) melódie, ktorú potom Arduino dokáže zahrať.
Najskôr si navrhneme spôsob kódovania melódie:
oktáva \ nota | c | c# | d | d# | e | f | f# | g | g# | a | a# | h |
veľká | 0 | 1 | 2 | 3 | 4 | 5 | 6 | |||||
malá | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
1. | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 |
2. | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 |
3. | 43 | 44 | 45 | 46 | 47 | 48 | ||||||
pomlčka | 49 |
šestnástinové | ( +0) |
osminové | ( +50) |
štvrťové | (+100) |
pólové | (+150) |
celé | (+200) |
iná nota: | 251 f1 f2 d1 d2 | frekvencia = f1 * 256 + f2, dĺžka noty: d1/d2 |
nastavenie tempa: | 252 d | d = dĺžka trvania šestnástinovej noty [ms] |
Napríklad:
1 uint16_t dlzka_kohutik = 24;
2 uint8_t kohutik_jarabi[] = { 119, 121, 173, 174, 124, 124, 124, 123, 171, 173, 123, 123, 123, 121, 169, 171, 121, 121, 121, 123, 171, 169, 119, 119 };
3
4 uint16_t dlzka_cancan = 279;
5 uint8_t cancan[] = {
6 251,1,184,1,32,126,149,251,1,184,1,32,125,149,251,1,184,1,32,126,251,1,184,1,32,126,251,1,184,1,32,126,251,1,184,1,32,126,
7 64,71,71,73,71,69,69,73,74,78,81,78,78,76,251,1,184,1,32,126,78,68,68,78,76,69,69,73,73,71,73,71,85,83,85,83,
8 64,71,71,73,71,69,69,73,74,78,81,78,78,76,251,1,184,1,32,126,78,68,68,78,76,69,69,73,73,71,73,71,71,69,119,
9 135,131,128,126,75,76,78,80,81,76,80,76,81,76,80,76,81,76,80,76,81,76,80,76,
10 251,2,11,3,16,19,251,1,4,3,16,19,
11 251,1,4,3,16,19,251,1,4,3,16,19,
12 251,1,4,3,16,19,251,1,4,3,16,19,
13 251,1,4,3,16,19,251,1,4,3,16,19,
14 174,88,91,90,88,193,193,93,95,90,91,138,138,88,91,90,88,86,86,85,83,81,79,78,76,
15 174,88,91,90,88,193,193,93,95,90,91,138,138,88,91,90,88,86,93,89,90,136,
16 64,71,71,73,71,69,69,73,74,78,81,78,78,76,251,1,184,1,32,126,
17 78,76,126,78,76,126,78,76,126,78,76,126,78,76,126,78,76,126,
18 78,76,78,76,78,76,78,76,
19 131,119,119,119,169 };
20
21 uint16_t dlzka_labutie_jazero = 215;
22 uint8_t labutie_jazero[] = {
23 66, 69, 73, 69, 66, 69, 73, 69, 66, 69, 73, 69, 66, 69, 73, 69,
24 185, 78, 80, 81, 83, 251, 5, 39, 3, 8, 81, 251, 5, 39, 3, 8, 81, 251, 5, 39, 3, 8, 78, 81, 78, 73, 81, 178,
25 99, 83, 81, 80,
26 185, 78, 80, 81, 83, 251, 5, 39, 3, 8, 81, 251, 5, 39, 3, 8, 81, 251, 5, 39, 3, 8, 78, 81, 78, 73, 81, 178,
27 149, 128, 130, 131, 133, 85, 86, 251, 6, 32, 3, 8, 86, 135, 86, 88, 251, 6, 224, 3, 8, 88, 136, 88, 90, 251, 7, 184, 3, 8, 90, 85, 81, 80, 78,
28 130, 131, 133, 85, 86, 251, 6, 32, 3, 8, 86, 135, 86, 88, 251, 6, 224, 3, 8, 88, 136, 88, 90, 251, 7, 73, 3, 8, 86, 133, 86, 91, 251, 7, 184, 3, 8, 87, 251, 7, 184, 3, 8, 85,
29 185, 78, 80, 81, 83, 251, 5, 39, 3, 8, 81, 251, 5, 39, 3, 8, 81, 251, 5, 39, 3, 8, 78, 81, 78, 73, 81, 178,
30 99, 83, 81, 80,
31 185, 78, 80, 81, 83, 251, 5, 39, 3, 8, 81, 251, 5, 39, 3, 8, 81, 251, 5, 39, 3, 8, 78, 81, 78, 73, 81, 178 };
32
33 uint16_t dlzka_popcorn = 242;
34 uint8_t popcorn[] = { 149, 49,
35 28, 31, 35, 40, 49, 99, 38, 49, 99, 40, 49, 99, 35, 49, 99, 31, 49, 99, 35, 49, 99, 28, 49, 99, 49,
36 28, 31, 35, 40, 49, 99, 38, 49, 99, 40, 49, 99, 35, 49, 99, 31, 49, 99, 35, 49, 99, 28, 49, 99, 149,
37 40, 49, 99, 42, 49, 99, 43, 49, 99, 42, 49, 99, 43, 49, 99, 40, 49, 99, 42, 49, 99, 40, 49, 99, 42, 49, 99, 38, 49, 99, 40, 49, 99, 38, 49, 99, 40, 49, 99, 36, 49, 99, 40, 49, 99,
38 28, 31, 35, 40, 49, 99, 38, 49, 99, 40, 49, 99, 35, 49, 99, 31, 49, 99, 35, 49, 99, 28, 49, 99, 49,
39 28, 31, 35, 40, 49, 99, 38, 49, 99, 40, 49, 99, 35, 49, 99, 31, 49, 99, 35, 49, 99, 28, 49, 99, 149,
40 40, 49, 99, 42, 49, 99, 43, 49, 99, 42, 49, 99, 43, 49, 99, 40, 49, 99, 42, 49, 99, 40, 49, 99, 42, 49, 99, 38, 49, 99, 40, 49, 99, 38, 49, 99, 40, 49, 99, 42, 49, 99, 43, 49, 99,
41 49, 35, 38, 43, 47, 49, 99, 45, 49, 99, 47, 49, 99, 43, 49, 99, 38, 49, 99, 43, 49, 99, 35, 49, 99,
42 49, 35, 38, 43, 47, 49, 99, 45, 49, 99, 47, 49, 99, 43, 49, 99, 38, 49, 99, 43, 49, 99, 35, 49, 99, 149 };
Nasledujúci program zahrá 4x rôznou rýchlosťou známu melódiu pre tanec Kankán od Jacquese Offenbacha z operety Orfeus v podsvetí:
1 #define SIRENE 12
2
3 uint8_t *melodia;
4 uint16_t dlzka_melodie;
5
6 void setup()
7 {
8 pinMode(SIRENE, OUTPUT);
9 melodia = cancan;
10 dlzka_melodie = dlzka_cancan;
11 }
12
13 float octave_4[] = { 2093.00, 2217.46, 2349.32, 2489.02, 2637.02, 2793.83, 2959.96, 3135.96, 3322.44, 3520.00, 3729.31, 3951.07 };
14 int16_t music_speed;
15
16 uint16_t dlzka_cancan = 279;
17 uint8_t cancan[] = {
18 251,3,112,1,32,126,149,251,3,112,1,32,126,149,251,3,112,1,32,126,251,3,112,1,32,126,251,3,112,1,32,126,251,3,112,1,32,126,
19 64,71,71,73,71,69,69,73,74,78,81,78,78,76,251,3,112,1,32,126,78,68,68,78,76,69,69,73,73,71,73,71,85,83,85,83,
20 64,71,71,73,71,69,69,73,74,78,81,78,78,76,251,3,112,1,32,126,78,68,68,78,76,69,69,73,73,71,73,71,71,69,119,
21 135,131,128,126,75,76,78,80,81,76,80,76,81,76,80,76,81,76,80,76,81,76,80,76,
22 251,2,11,3,16,19,251,1,4,3,16,19,
23 251,1,4,3,16,19,251,1,4,3,16,19,
24 251,1,4,3,16,19,251,1,4,3,16,19,
25 251,1,4,3,16,19,251,1,4,3,16,19,
26 174,88,91,90,88,143,143,93,95,90,91,138,138,88,91,90,88,86,86,85,83,81,79,78,76,
27 174,88,91,90,88,143,143,93,95,90,91,138,138,88,91,90,88,86,93,89,90,136,
28 64,71,71,73,71,69,69,73,74,78,81,78,78,76,251,1,184,1,32,126,
29 78,76,126,78,76,126,78,76,126,78,76,126,78,76,126,78,76,126,
30 78,76,78,76,78,76,78,76,
31 131,119,119,119,169 };
32
33 void otto_tone(uint8_t *note)
34 {
35 if (*note == 251)
36 {
37 uint16_t frq = ((*(note + 1)) << 8) + (*(note + 2));
38 uint8_t d1 = *(note + 3);
39 uint8_t d2 = *(note + 4);
40 uint16_t del = (music_speed * 16 * (long)d1) / d2;
41
42 tone(SIRENE, frq);
43 delay(del);
44 noTone(SIRENE);
45 }
46 else
47 {
48 uint8_t len = *note / 50;
49 uint16_t d = music_speed;
50 while (len--) d *= 2;
51 uint8_t n = *note % 50;
52 if (n != 49)
53 {
54 uint8_t octave = (n + 5) / 12;
55 n = (n + 5 ) % 12;
56 float freq = octave_4[n];
57 octave = 4 - octave;
58 while (octave > 0)
59 {
60 freq /= 2.0;
61 octave--;
62 }
63 tone(SIRENE, (int)freq);
64 }
65 delay(d);
66 noTone(SIRENE);
67 }
68 }
69
70 void loop()
71 {
72 music_speed = 2500 / 16;
73 for (int j = 0; j < 4; j++)
74 {
75 for (int i = 0; i < dlzka_melodie; i++)
76 {
77 otto_tone(melodia + i);
78 if (melodia[i] == 251) i += 4;
79 }
80 music_speed -= 500 / 16;
81 }
82 delay(3000);
83 }