Difference between revisions of "Arduino - zložitejšia melódia"

From DT^2
Jump to: navigation, search
m
m
 
(One intermediate revision by one other user not shown)
Line 2: Line 2:
  
 
Najskôr si navrhneme spôsob kódovania melódie:
 
Najskôr si navrhneme spôsob kódovania melódie:
 +
''(pozri tiež: [https://kempelen.dai.fmph.uniba.sk/melodie/translate_tones.html konverzia nôt do bajtov])''
  
 
{| class="wikitable"
 
{| class="wikitable"
Line 42: Line 43:
 
|-  
 
|-  
 
| nastavenie tempa: || 252 d    || d = dĺžka trvania šestnástinovej noty [ms]
 
| nastavenie tempa: || 252 d    || d = dĺžka trvania šestnástinovej noty [ms]
 +
|-
 +
| FIS 3 || 254      || bolo ju treba na popcorn
 +
|-
 +
| G3 || 255      || bolo ju treba na popcorn
 
|-  
 
|-  
 
|}
 
|}
Line 80: Line 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 };
  
uint16_t dlzka_popcorn = 242;
+
uint16_t dlzka_popcorn = 388;
uint8_t popcorn[] = { 149, 49,  
+
uint8_t popcorn[] = { 149, 49,  
 
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,
 
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,
 
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,
 
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,
Line 89: Line 94:
 
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,
 
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,
 
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,  
 
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,  
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 };
+
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 ,
 
+
49, 99, 47, 49, 99, 254, 49, 99, 255, 49, 99, 254, 49, 99, 255, 49, 99, 47, 49, 99, 254, 49, 99, 47, 49, 99, 254, 49, 99, 45, 49, 99, 47, 49, 99, 45, 49, 99, 47, 49, 99, 43, 49, 99, 47, 49, 99,
 +
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,
 +
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 ,
 +
49, 99, 47, 49, 99, 254, 49, 99, 255, 49, 99, 254, 49, 99, 255, 49, 99, 47, 49, 99, 254, 49, 99, 47, 49, 99, 254, 49, 99, 45, 49, 99, 47, 49, 99, 45, 49, 99, 47, 49, 99, 254, 49, 99, 255, 49, 99
 +
};
 
</syntaxhighlight>
 
</syntaxhighlight>
  

Latest revision as of 23:48, 10 August 2019

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: (pozri tiež: konverzia nôt do bajtov)

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]
FIS 3 254 bolo ju treba na popcorn
G3 255 bolo ju treba na popcorn

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 = 388;
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 ,
43 49, 99, 47, 49, 99, 254, 49, 99, 255, 49, 99, 254, 49, 99, 255, 49, 99, 47, 49, 99, 254, 49, 99, 47, 49, 99, 254, 49, 99, 45, 49, 99, 47, 49, 99, 45, 49, 99, 47, 49, 99, 43, 49, 99, 47, 49, 99, 
44 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, 
45 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 ,
46 49, 99, 47, 49, 99, 254, 49, 99, 255, 49, 99, 254, 49, 99, 255, 49, 99, 47, 49, 99, 254, 49, 99, 47, 49, 99, 254, 49, 99, 45, 49, 99, 47, 49, 99, 45, 49, 99, 47, 49, 99, 254, 49, 99, 255, 49, 99
47 };

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 }