Mester Jakob

I musik noteres tonernes frekvens og varighed ved hjælp af noder. F.eks. noteres tonerne i Mester Jakob sådan her:
Nu skal vi bruge tone() til at få Arduino til at spille Mester Jakob.

Inden vi kan omsætte noderne til et program, skal vi lige forstå notationen i noderne. Nodernes udseende fortæller, hvor lang tid en node skal spilles:

Udseenet alene fortæller dog kun om de relative varigheder. F.eks. at en halvnode skal vare dobbelt så længe, som en fjerdedelsnode. For at fastsætte et absolut tempo, benyttes BPM (beats per minute) (Wikipedia). F.eks. noteres tempoet 120 BPM sådan her:
for at angive, at tidsintervallet imellem hvert taktslag skal vare 60*1000/120 msek = 500 msek.

Nodernes placering i lodret retning på nodelinierne fastlægger tonerne i forhold til tangenterne på et klaver sådan her:

Samtidig kan tonernes frekvenser aflæses, som de røde og grønne tal ovenover tangenterne.

Øvelse

De fire første toner i Mester Jakob er altså de fire fjerdedelsnoder f, g, a og f. Prøv at spille de fire første toner ved at indsætte:
  tone(speakerPin, 349, 500); // f
  delay(500);
  tone(speakerPin, 392, 500); // g  
  delay(500);
  tone(speakerPin, 440, 500); // a
  delay(500);
  tone(speakerPin, 349, 500); // f   
  delay(500);
i programmet PlayTone. Det lyder da næsten, som starten på denne klaver udgave af Mester Jakob.

Øvelse

Prøv nu at lytte til, hvordan programmet MesterJakob spiller melodien. Kan I høre, at der er indlagt en lille pause efter hver tone. Det sker ved at kalde en ny funktion toneWithPause for hver tone i melodien:
// Function used to play tones
//   frequency of tone in Hertz
//   duration of tone in milliseconds
void toneWithPause(float frequency, float duration) 
{
  
  float pause;
    
  // the tone playes with a pause of 30 % of the duration
  pause = duration * 0.30; 
  tone(speakerPin, frequency, duration-pause);
  delay(duration);   
}
Hvor lang er den indlagte pause, f.eks. for en fjerdedelsnode på 500 msek?

Selve melodien spilles ved at kalde toneWithPause for hver tone i melodien:

void setup() 
{
  for (int i=1; i<3; i++)
  {  
    toneWithPause(f4     , quaterNote);
    toneWithPause(g4     , quaterNote);
    toneWithPause(a4     , quaterNote);    
    toneWithPause(f4     , quaterNote);
  }
  
  // 2
  for (int i=1; i<3; i++)
  {  
    toneWithPause(a4     , quaterNote);
    toneWithPause(bFlat4 , quaterNote);
    toneWithPause(c5     , halfNote);    
  }
  
  // 3
  for (int i=1; i<3; i++)
  {  
    toneWithPause(c5     , eighthNote);
    toneWithPause(d5     , eighthNote);
    toneWithPause(c5     , eighthNote);
    toneWithPause(bFlat4 , eighthNote);
    toneWithPause(a4     , quaterNote);
    toneWithPause(f4     , quaterNote);    
  }
  
  // 4
  for (int i=1; i<3; i++)
  {  
    toneWithPause(f4     , quaterNote);
    toneWithPause(c4     , quaterNote);
    toneWithPause(f4     , halfNote);    
  }
      
} 
En såkaldt for løkke, for (int i=1; i<3; i++), er brugt, så hver af de 4 små tonerækker gentages to gange. Så er vi fri for at skrive så meget.

I hvert kald af toneWithPause benyttes navne på noder i stedet for frekvenser:

// notes used in Mester Jakob:
#define c4        262
#define f4        349
#define g4        392
#define a4        440
#define bFlat4    466
#define c5        523
#define d5        587
Det faste fortegn ♭ i noden for Mester Jakob betyder, at ♭ for b bruges, derfor bFlat4.

Der er også indført navne for det absolutte tempo og varighederne af de enkelte noder:

// tempo, beats per minute
#define bpm 120.0

// note values
#define quaterNote     60.0*1000.0/bpm  // quater note value in msec
#define halfNote       2.0*quaterNote
#define eighthNote     quaterNote/2.0

Øvelse

Prøv at ændre bpm f.eks. til 240 eller 100 som i klaverudgaven af Mester Jakob. Og til et meget hurtigt tempo.

Øvelse

Prøv nu at få flere Arduinoer til at spille Mester Jakob sammen, som i denne kanon udgave. Start med at flytte indholdet fra setup() ind i loop(), så Mester Jakob spiller hele tiden.
tilbage