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

From DT^2
Jump to: navigation, search
m
Line 69: Line 69:
 
78,76,78,76,78,76,78,76,
 
78,76,78,76,78,76,78,76,
 
131,119,119,119,169 };
 
131,119,119,119,169 };
 +
</syntaxhighlight>
 +
 +
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í:
 +
 +
<syntaxhighlight lang="c" line=line>
 +
#define SIRENE 12
 +
 +
void setup()
 +
{
 +
  pinMode(SIRENE, OUTPUT);
 +
}
 +
 +
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 };
 +
int16_t music_speed = 2000 / 16;
 +
 +
uint16_t dlzka_cancan = 279;
 +
uint8_t cancan[] = {
 +
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,
 +
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,
 +
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,
 +
135,131,128,126,75,76,78,80,81,76,80,76,81,76,80,76,81,76,80,76,81,76,80,76,
 +
251,2,11,3,16,19,251,1,4,3,16,19,
 +
251,1,4,3,16,19,251,1,4,3,16,19,
 +
251,1,4,3,16,19,251,1,4,3,16,19,
 +
251,1,4,3,16,19,251,1,4,3,16,19,
 +
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,
 +
174,88,91,90,88,143,143,93,95,90,91,138,138,88,91,90,88,86,93,89,90,136,
 +
64,71,71,73,71,69,69,73,74,78,81,78,78,76,251,1,184,1,32,126,
 +
78,76,126,78,76,126,78,76,126,78,76,126,78,76,126,78,76,126,
 +
78,76,78,76,78,76,78,76,
 +
131,119,119,119,169 };
 +
 +
void otto_tone(uint8_t *note)
 +
{
 +
  if (*note == 251)
 +
  {
 +
    uint16_t frq = ((*(note + 1)) << 8) + (*(note + 2));
 +
    uint8_t d1 = *(note + 3);
 +
    uint8_t d2 = *(note + 4);
 +
    uint16_t del = (music_speed * 16 * (long)d1) / d2;
 +
 +
    tone(SIRENE, frq);
 +
    delay(del);
 +
    noTone(SIRENE);
 +
  }
 +
  else
 +
  {
 +
    uint8_t len = *note / 50;
 +
    uint16_t d = music_speed;
 +
    while (len--) d *= 2;
 +
    uint8_t n = *note % 50;
 +
    if (n != 49)
 +
    {
 +
      uint8_t octave = (n + 5) / 12;
 +
      n = (n + 5 ) % 12;
 +
      float freq = octave_4[n];
 +
      octave = 4 - octave;
 +
      while (octave > 0)
 +
      {
 +
        freq /= 2.0;
 +
        octave--; 
 +
      }
 +
      tone(SIRENE, (int)freq);
 +
    }
 +
    delay(d);
 +
    noTone(SIRENE);
 +
  }
 +
}
 +
 +
void loop()
 +
{
 +
  music_speed = 2500 / 16;
 +
  for (int j = 0; j < 4; j++)
 +
  {
 +
    for (int i = 0; i < dlzka_cancan; i++)
 +
    {
 +
      otto_tone(cancan + i);
 +
      if (cancan[i] == 251) i += 4;
 +
    }
 +
    music_speed -= 500 / 16;
 +
  }
 +
  delay(3000);
 +
}
 
</syntaxhighlight>
 
</syntaxhighlight>

Revision as of 01:31, 6 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 };

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 }