Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Vorhergehende ÜberarbeitungNächste Überarbeitung | |||
— | project:arduino-kickstarter-tetris [19.11.2011 12:53] – q-rai | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== Tetrismelodie ====== | ||
+ | Die Tetrismelodie besteht aus drei Tonspuren: Sopran, Alt und Bass. Diese sind im Programm als einzelne Melodien gespeichert. Mit mehreren Arduinos kannst du alle drei gleichzeitig abspielen. | ||
+ | ==== Sopran ==== | ||
+ | Der Sopran ist die Hauptmelodie, | ||
+ | Aufruf: '' | ||
+ | < | ||
+ | // notes in the melody: | ||
+ | int melodyTrack1[] = { | ||
+ | NOTE_E3, NOTE_H2, NOTE_C3, NOTE_D3, NOTE_E3, NOTE_D3, NOTE_C3, NOTE_H2, | ||
+ | NOTE_A2, NOTE_A2, NOTE_C3, NOTE_E3, NOTE_D3, NOTE_C3, | ||
+ | NOTE_H2, NOTE_H2, NOTE_C3, NOTE_D3, NOTE_E3, | ||
+ | NOTE_C3, NOTE_A2, NOTE_A2, | ||
+ | 0, NOTE_D3, NOTE_F3, NOTE_A3, NOTE_G3, NOTE_F3, | ||
+ | NOTE_E3, NOTE_E3, NOTE_C3, NOTE_E3, NOTE_D3, NOTE_C3, | ||
+ | NOTE_H2, NOTE_H2, NOTE_C3, NOTE_D3, NOTE_E3, | ||
+ | NOTE_C3, NOTE_A2, NOTE_A2, 0, | ||
+ | NOTE_E2, NOTE_C2, NOTE_D2, NOTE_H1, NOTE_C2, NOTE_A1, NOTE_GS1, NOTE_H1, | ||
+ | NOTE_E2, NOTE_C2, NOTE_D2, NOTE_H1, NOTE_C2, NOTE_E2, NOTE_A2, NOTE_GS2 | ||
+ | }; | ||
+ | | ||
+ | // note durations: 4 = quarter note, 8 = eighth note, etc.: | ||
+ | int durationsTrack1[] = { | ||
+ | 4, | ||
+ | 4, | ||
+ | 4,8,8,4,4, | ||
+ | 4,4,2, | ||
+ | 8, | ||
+ | 4, | ||
+ | 4,8,8,4,4, | ||
+ | 4,4,4,4, | ||
+ | 2, | ||
+ | 2, | ||
+ | };//59 | ||
+ | </ | ||
+ | |||
+ | ==== Alt ==== | ||
+ | Aufruf: '' | ||
+ | < | ||
+ | int melodyTrack2[] = { | ||
+ | NOTE_H2, NOTE_GS2, NOTE_A2, NOTE_H2, NOTE_E3, NOTE_D3, NOTE_A2, NOTE_GS2, | ||
+ | NOTE_E2, NOTE_E2, NOTE_A2, NOTE_C3, NOTE_H2, NOTE_A2, | ||
+ | NOTE_GS2, NOTE_E2, NOTE_GS2, NOTE_A2, NOTE_H2, NOTE_C3, | ||
+ | NOTE_A2, NOTE_E2, NOTE_E2, | ||
+ | 0, NOTE_F2, NOTE_A2, NOTE_C3, NOTE_C3, NOTE_C3, NOTE_H2, NOTE_A2, | ||
+ | NOTE_G2, NOTE_G2, NOTE_E2, NOTE_G2, NOTE_A2, NOTE_G2, NOTE_F2, NOTE_E2, | ||
+ | NOTE_GS2, NOTE_E2, NOTE_GS2, NOTE_A2, NOTE_H2, NOTE_GS2, NOTE_C3, NOTE_GS2, | ||
+ | NOTE_A2, NOTE_E2, NOTE_E2, NOTE_E2, 0, | ||
+ | NOTE_C2, NOTE_A1, NOTE_H1, NOTE_GS1, NOTE_A1, NOTE_E1, NOTE_E1, NOTE_G1, | ||
+ | NOTE_C2, NOTE_A1, NOTE_H1, NOTE_GS1, NOTE_A1, NOTE_C2, NOTE_E2, NOTE_E2 | ||
+ | }; | ||
+ | |||
+ | int durationsTrack2[] = { | ||
+ | 4, | ||
+ | 4, | ||
+ | 8, | ||
+ | 4,4,2, | ||
+ | 8, | ||
+ | 4, | ||
+ | 8, | ||
+ | 8,8,4,4,4, | ||
+ | 2, | ||
+ | 2, | ||
+ | };//77 | ||
+ | </ | ||
+ | |||
+ | ==== Bass ==== | ||
+ | Aufruf: '' | ||
+ | < | ||
+ | int melodyTrack3[] = { | ||
+ | NOTE_E1, NOTE_E2, NOTE_E1, NOTE_E2, NOTE_E1, NOTE_E2, NOTE_E1, NOTE_E2, | ||
+ | NOTE_A1, NOTE_A2, NOTE_A1, NOTE_A2, NOTE_A1, NOTE_A2, NOTE_A1, NOTE_A2, | ||
+ | NOTE_GS1, NOTE_GS2, NOTE_GS1, NOTE_GS2, NOTE_GS1, NOTE_GS2, NOTE_GS1, NOTE_GS2, | ||
+ | NOTE_A1, NOTE_A2, NOTE_A1, NOTE_A2, NOTE_A1, NOTE_A2, NOTE_H1, NOTE_C2, | ||
+ | NOTE_D2, NOTE_D1, 0, NOTE_D1, 0, NOTE_D1, NOTE_A1, NOTE_F1, | ||
+ | NOTE_C1, NOTE_C2, 0, NOTE_C2, NOTE_C1, NOTE_G1, 0, NOTE_G1, | ||
+ | NOTE_H1, NOTE_H2, 0, NOTE_H2, 0, NOTE_E2, 0, NOTE_GS2, | ||
+ | NOTE_A1, NOTE_E2, NOTE_A1, NOTE_E2, NOTE_A1, 0, | ||
+ | NOTE_A1, NOTE_E2, NOTE_A1, NOTE_E2, NOTE_A1, NOTE_E2, NOTE_A1, NOTE_E2, | ||
+ | NOTE_GS1, NOTE_E2, NOTE_GS1, NOTE_E2, NOTE_GS1, NOTE_E2, NOTE_GS1, NOTE_E2, | ||
+ | NOTE_A1, NOTE_E2, NOTE_A1, NOTE_E2, NOTE_A1, NOTE_E2, NOTE_A1, NOTE_E2, | ||
+ | NOTE_GS1, NOTE_E2, NOTE_GS1, NOTE_E2, NOTE_GS1, NOTE_E2, NOTE_GS1, NOTE_E2, | ||
+ | NOTE_A1, NOTE_E2, NOTE_A1, NOTE_E2, NOTE_A1, NOTE_E2, NOTE_A1, NOTE_E2, | ||
+ | NOTE_GS1, NOTE_E2, NOTE_GS1, NOTE_E2, NOTE_GS1, NOTE_E2, NOTE_GS1, NOTE_E2, | ||
+ | NOTE_A1, NOTE_E2, NOTE_A1, NOTE_E2, NOTE_A1, NOTE_E2, NOTE_A1, NOTE_E2, | ||
+ | NOTE_GS1, NOTE_E2, NOTE_GS1, NOTE_E2, NOTE_GS1, NOTE_E2, NOTE_GS1, NOTE_E2 | ||
+ | }; | ||
+ | |||
+ | int durationsTrack3[] = { | ||
+ | 8, | ||
+ | 8, | ||
+ | 8, | ||
+ | 8, | ||
+ | 8, | ||
+ | 8, | ||
+ | 8, | ||
+ | 8, | ||
+ | 8, | ||
+ | 8, | ||
+ | };//126 | ||
+ | </ | ||
+ | |||
+ | ===== Programm ===== | ||
+ | Das Basisprogramm hat -- wie immer -- eine Setup- und eine Loop-Funktion | ||
+ | < | ||
+ | void setup() | ||
+ | { | ||
+ | // put your setup code here, to run once: | ||
+ | pinMode( 8, OUTPUT ); | ||
+ | } | ||
+ | |||
+ | // loop spielt hier die Hauptmelodie (Sopran) in einer Endlosschleife. | ||
+ | void loop() | ||
+ | { | ||
+ | playMelody( melodyTrack1, | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Die '' | ||
+ | < | ||
+ | void playMelody( int* melody, int* noteDurations, | ||
+ | { | ||
+ | // iterate over the notes of the melody: | ||
+ | for( int thisNote = 0; thisNote < length; thisNote++ ) | ||
+ | { | ||
+ | // to calculate the note duration, take one second | ||
+ | // divided by the note type. | ||
+ | //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc. | ||
+ | int noteDuration = 1000 / noteDurations[thisNote]; | ||
+ | tone( 8, melody[thisNote], | ||
+ | |||
+ | // to distinguish the notes, set a minimum time between them. | ||
+ | // the note's duration + 30% seems to work well: | ||
+ | int pauseBetweenNotes = noteDuration * 1.30; | ||
+ | delay( pauseBetweenNotes ); | ||
+ | // stop the tone playing: | ||
+ | noTone(8); | ||
+ | } | ||
+ | } | ||
+ | </ |