Difference between revisions of "Arduino - zložitejšia melódia"
Line 77: | Line 77: | ||
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, | 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, | ||
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, | 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, | ||
− | 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, | + | 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, |
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, | 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, | ||
99, 83, 81, 80, | 99, 83, 81, 80, |
Revision as of 20:31, 7 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 rytmu: | 252 d | dĺžka trvania celej noty = d * 20 [ms] |
prepnutie oktávy: | 253 o | bez oktávy o=0, subkontra: o=1, kontra: o=2, veľká: o=3, malá: o=4, prvá: o=4, atď. Po prepnutí oktávy platia čísla nôt 0-49. |
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 };
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 void setup()
4 {
5 pinMode(SIRENE, OUTPUT);
6 }
7
8 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 };
9 int16_t music_speed = 2000 / 16;
10
11 uint16_t dlzka_cancan = 279;
12 uint8_t cancan[] = {
13 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,
14 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,
15 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,
16 135,131,128,126,75,76,78,80,81,76,80,76,81,76,80,76,81,76,80,76,81,76,80,76,
17 251,2,11,3,16,19,251,1,4,3,16,19,
18 251,1,4,3,16,19,251,1,4,3,16,19,
19 251,1,4,3,16,19,251,1,4,3,16,19,
20 251,1,4,3,16,19,251,1,4,3,16,19,
21 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,
22 174,88,91,90,88,143,143,93,95,90,91,138,138,88,91,90,88,86,93,89,90,136,
23 64,71,71,73,71,69,69,73,74,78,81,78,78,76,251,1,184,1,32,126,
24 78,76,126,78,76,126,78,76,126,78,76,126,78,76,126,78,76,126,
25 78,76,78,76,78,76,78,76,
26 131,119,119,119,169 };
27
28 void otto_tone(uint8_t *note)
29 {
30 if (*note == 251)
31 {
32 uint16_t frq = ((*(note + 1)) << 8) + (*(note + 2));
33 uint8_t d1 = *(note + 3);
34 uint8_t d2 = *(note + 4);
35 uint16_t del = (music_speed * 16 * (long)d1) / d2;
36
37 tone(SIRENE, frq);
38 delay(del);
39 noTone(SIRENE);
40 }
41 else
42 {
43 uint8_t len = *note / 50;
44 uint16_t d = music_speed;
45 while (len--) d *= 2;
46 uint8_t n = *note % 50;
47 if (n != 49)
48 {
49 uint8_t octave = (n + 5) / 12;
50 n = (n + 5 ) % 12;
51 float freq = octave_4[n];
52 octave = 4 - octave;
53 while (octave > 0)
54 {
55 freq /= 2.0;
56 octave--;
57 }
58 tone(SIRENE, (int)freq);
59 }
60 delay(d);
61 noTone(SIRENE);
62 }
63 }
64
65 void loop()
66 {
67 music_speed = 2500 / 16;
68 for (int j = 0; j < 4; j++)
69 {
70 for (int i = 0; i < dlzka_cancan; i++)
71 {
72 otto_tone(cancan + i);
73 if (cancan[i] == 251) i += 4;
74 }
75 music_speed -= 500 / 16;
76 }
77 delay(3000);
78 }