1{SONG_END, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, WHITE_KEY},
2 };
3
4
5 struct myNote * pSong = Elise;
6 void setup()
7
8 {
9 pSong = Elise;
10
11 int i = START_BLACK_KEY;
12 while(i <= END_BLACK_KEY) {
13 pinMode(i, OUTPUT);
14 digitalWrite(i, LOW);
15 i++;
16 }
17 i = START_WHITE_KEY;
18 while(i <= END_WHITE_KEY) {
19 pinMode(i, OUTPUT);
20 digitalWrite(i, LOW);
21 i++;
22 }
23 {
24 pinMode(20, OUTPUT);
25 pinMode(21, OUTPUT);
26 }
27 }
28 void playTune(struct myNote * pTune) {
29 byte Port1 = pTune->Port;
30 int Soltime= pTune->Soltime;
31 if(Port1 == SONG_END) {
32 pSong = pTune;
33 return;
34 }
35 if(pTune->Sustain == 1) {
36 digitalWrite(20, HIGH);
37 }
38 if(pTune->Sustain == 0) {
39 digitalWrite(20, LOW);
40 }
41 if(pTune->Volume == 1) {
42 digitalWrite(21, HIGH);
43 }
44 if(pTune->Volume == 0) {
45 digitalWrite(21, LOW);
46 }
47 int beat = pTune->Beat ;
48 beat = beat * beatMult[pTune->Duration]/4;
49
50 int durMS = beat * Soltime/4 ;
51
52 if(pTune->BlackKey == HIGH) {
53 digitalWrite(5, pTune->blackStateP5);
54 digitalWrite(6, pTune->blackStateP6);
55 digitalWrite(7, pTune->blackStateP7);
56 digitalWrite(8, pTune->blackStateP8);
57 digitalWrite(9, pTune->blackStateP9);
58 } else {
59 if(Port1) {
60 digitalWrite(Port1, HIGH);
61 }
62 }
63 struct myNote * pChordTune = pTune;
64
65 if((pChordTune->Chord == CHORD_START) || (pChordTune->Chord == CHORD_CONTINUE)) {
66 pChordTune++;
67 playTune(pChordTune);
68 }
69 if((pTune->Chord == CHORD_END) || (pTune->Chord == 0)) {
70 delay (durMS);
71 }
72
73 if(pTune->BlackKey == HIGH) {
74 int i = START_BLACK_KEY;
75 while(i <= END_BLACK_KEY) {
76 pinMode(i, OUTPUT);
77 digitalWrite(i, LOW);
78 i++;
79 }
80 }else {
81 int i = START_BLACK_KEY;
82 while(i <= END_BLACK_KEY) {
83 pinMode(i, OUTPUT);
84 digitalWrite(i, LOW);
85 i++;
86 }
87 i = START_WHITE_KEY;
88 while(i <= END_WHITE_KEY) {
89 pinMode(i, OUTPUT);
90 digitalWrite(i, LOW);
91 i++;
92 }
93 }
94
95 if((pTune->Chord == CHORD_END) || (pTune->Chord == 0)) {
96 pTune++;
97 pSong = pTune;
98 delay (beat-durMS);
99
100
101
102
103 }
104 }
105 void loop()
106 {
107 if(pSong->Port == SONG_END) {
108 pSong = Elise;
109 delay(2000);
110 }
111 playTune(pSong);
112 }
113