Example of playing melodies using DAC.

Dependencies:   Joystick mbed

Fork of Melody by Craig Evans

Committer:
el16ecb
Date:
Thu Mar 02 09:58:27 2017 +0000
Revision:
2:7804ced75c2f
Parent:
1:7c149b76c057

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
eencae 0:f1e3ef53cc3c 1 /* Melody
eencae 0:f1e3ef53cc3c 2
eencae 0:f1e3ef53cc3c 3 Play a simple melody on the DAC using a look-up table for the sine waveform
eencae 0:f1e3ef53cc3c 4 Includes a primitive graphic equalizer on the LEDs
eencae 0:f1e3ef53cc3c 5
eencae 0:f1e3ef53cc3c 6 Craig A. Evans
eencae 0:f1e3ef53cc3c 7
eencae 0:f1e3ef53cc3c 8 March 2014
eencae 0:f1e3ef53cc3c 9
eencae 0:f1e3ef53cc3c 10 */
eencae 0:f1e3ef53cc3c 11
eencae 0:f1e3ef53cc3c 12 #include "mbed.h"
eencae 0:f1e3ef53cc3c 13 #include "tone.h" // note definitions
el16ecb 1:7c149b76c057 14 #include <Joystick.h>
eencae 0:f1e3ef53cc3c 15
eencae 0:f1e3ef53cc3c 16 #define PI 3.14159265359
eencae 0:f1e3ef53cc3c 17
eencae 0:f1e3ef53cc3c 18 Timer noteTimer; // timer for note duration
eencae 0:f1e3ef53cc3c 19 AnalogOut aout(p18); // DAC on pin 18
eencae 0:f1e3ef53cc3c 20 BusOut leds(LED4,LED3,LED2,LED1); // LEDs for display
el16ecb 1:7c149b76c057 21 Joystick stick = Joystick(p20,p19,p17);
el16ecb 1:7c149b76c057 22 PwmOut red_led (p24);
el16ecb 1:7c149b76c057 23 PwmOut green_led (p23);
el16ecb 1:7c149b76c057 24 PwmOut blue_led (p22);
el16ecb 1:7c149b76c057 25
eencae 0:f1e3ef53cc3c 26
eencae 0:f1e3ef53cc3c 27 void initArray(); // function to initialise sample array
eencae 0:f1e3ef53cc3c 28 void tone(float frequency,float duration); // play a tone of set frequency for given duration
el16ecb 1:7c149b76c057 29 void graphicEqualizer(int frequency); // displays pattern on LEDs depending on the frequency
eencae 0:f1e3ef53cc3c 30
eencae 0:f1e3ef53cc3c 31 int n = 32; // number of samples
eencae 0:f1e3ef53cc3c 32 float y[32]; // array to store samples
eencae 0:f1e3ef53cc3c 33 float BPM = 73.0; // beats per minute
el16ecb 1:7c149b76c057 34 Vector2D coord = stick.get_coord();
el16ecb 1:7c149b76c057 35 float xoffset = 1 - (coord.x/2);
el16ecb 1:7c149b76c057 36 float yoffset = 1 - (coord.y/5);
eencae 0:f1e3ef53cc3c 37
eencae 0:f1e3ef53cc3c 38 // comment one of the blocks out below - need noteArray[] and noteDuration[]
eencae 0:f1e3ef53cc3c 39
eencae 0:f1e3ef53cc3c 40 /*
eencae 0:f1e3ef53cc3c 41 // secret film melody...
eencae 0:f1e3ef53cc3c 42 float noteArray[] = {
eencae 0:f1e3ef53cc3c 43 NOTE_E4,NOTE_F4,NOTE_F4,NOTE_F4,NOTE_F4,NOTE_E4,NOTE_E4,NOTE_E4,
eencae 0:f1e3ef53cc3c 44 NOTE_E4,NOTE_G4,NOTE_G4,NOTE_G4,NOTE_G4,NOTE_E4,NOTE_E4,NOTE_E4,
eencae 0:f1e3ef53cc3c 45 NOTE_E4,NOTE_F4,NOTE_F4,NOTE_F4,NOTE_F4,NOTE_E4,NOTE_E4,NOTE_E4,
eencae 0:f1e3ef53cc3c 46 NOTE_E4,NOTE_G4,NOTE_G4,NOTE_G4,NOTE_G4,NOTE_E4,NOTE_E4,NOTE_E4,
eencae 0:f1e3ef53cc3c 47 NOTE_DS5,NOTE_D5,NOTE_B4,NOTE_A4,NOTE_B4,NOTE_E4,NOTE_G4,NOTE_DS5,
eencae 0:f1e3ef53cc3c 48 NOTE_D5,NOTE_G4,NOTE_B4,NOTE_B4,NOTE_FS5,NOTE_F5,NOTE_B4,NOTE_D5,
eencae 0:f1e3ef53cc3c 49 NOTE_AS5,NOTE_A5,NOTE_F5,NOTE_A5,NOTE_DS6,NOTE_D6
eencae 0:f1e3ef53cc3c 50 };
eencae 0:f1e3ef53cc3c 51
eencae 0:f1e3ef53cc3c 52 // durations of the notes
eencae 0:f1e3ef53cc3c 53 // 1/8th, 1/16th, 1/4th etc.
eencae 0:f1e3ef53cc3c 54 float noteDuration[] = {
eencae 0:f1e3ef53cc3c 55 8,16,16,8,4,8,8,8,
eencae 0:f1e3ef53cc3c 56 8,16,16,8,4,8,8,8,
eencae 0:f1e3ef53cc3c 57 8,16,16,8,4,8,8,8,
eencae 0:f1e3ef53cc3c 58 8,16,16,8,4,8,8,8,
eencae 0:f1e3ef53cc3c 59 8,2,8,8,1,8,4,8,
eencae 0:f1e3ef53cc3c 60 4,8,8,8,8,4,8,4,
eencae 0:f1e3ef53cc3c 61 8,4,8,4,8,3
eencae 0:f1e3ef53cc3c 62 };
eencae 0:f1e3ef53cc3c 63 */
eencae 0:f1e3ef53cc3c 64
eencae 0:f1e3ef53cc3c 65
eencae 0:f1e3ef53cc3c 66 // secret computer game melody...
eencae 0:f1e3ef53cc3c 67 float noteArray[] = {
el16ecb 1:7c149b76c057 68 //NOTE_E7, NOTE_E7, 0, NOTE_E7,
el16ecb 1:7c149b76c057 69 // 0, NOTE_C7, NOTE_E7, 0,
el16ecb 1:7c149b76c057 70 // NOTE_G7, 0, 0, 0,
el16ecb 1:7c149b76c057 71 // NOTE_G6, 0, 0, 0,
el16ecb 1:7c149b76c057 72 //
el16ecb 1:7c149b76c057 73 // NOTE_C7, 0, 0, NOTE_G6,
el16ecb 1:7c149b76c057 74 // 0, 0, NOTE_E6, 0,
el16ecb 1:7c149b76c057 75 // 0, NOTE_A6, 0, NOTE_B6,
el16ecb 1:7c149b76c057 76 // 0, NOTE_AS6, NOTE_A6, 0,
el16ecb 1:7c149b76c057 77 //
el16ecb 1:7c149b76c057 78 // NOTE_G6, NOTE_E7, NOTE_G7,
el16ecb 1:7c149b76c057 79 // NOTE_A7, 0, NOTE_F7, NOTE_G7,
el16ecb 1:7c149b76c057 80 // 0, NOTE_E7, 0,NOTE_C7,
el16ecb 1:7c149b76c057 81 // NOTE_D7, NOTE_B6, 0, 0,
el16ecb 1:7c149b76c057 82 //
el16ecb 1:7c149b76c057 83 // NOTE_C7, 0, 0, NOTE_G6,
el16ecb 1:7c149b76c057 84 // 0, 0, NOTE_E6, 0,
el16ecb 1:7c149b76c057 85 // 0, NOTE_A6, 0, NOTE_B6,
el16ecb 1:7c149b76c057 86 // 0, NOTE_AS6, NOTE_A6, 0,
el16ecb 1:7c149b76c057 87 //
el16ecb 1:7c149b76c057 88 // NOTE_G6, NOTE_E7, NOTE_G7,
el16ecb 1:7c149b76c057 89 // NOTE_A7, 0, NOTE_F7, NOTE_G7,
el16ecb 1:7c149b76c057 90 // 0, NOTE_E7, 0,NOTE_C7,
el16ecb 1:7c149b76c057 91 // NOTE_D7, NOTE_B6, 0, 0
el16ecb 1:7c149b76c057 92 NOTE_G6, 0, NOTE_A7, 0,
el16ecb 1:7c149b76c057 93 NOTE_E6, NOTE_E6, 0, NOTE_C6,
el16ecb 1:7c149b76c057 94
el16ecb 1:7c149b76c057 95 NOTE_DS6, NOTE_D6, NOTE_C6, 0,
el16ecb 1:7c149b76c057 96 NOTE_C6, 0, NOTE_D6, 0,
eencae 0:f1e3ef53cc3c 97
el16ecb 1:7c149b76c057 98 NOTE_DS6, 0, NOTE_DS6, NOTE_D6,
el16ecb 1:7c149b76c057 99 NOTE_C6, NOTE_D6, NOTE_E6, NOTE_G6,
el16ecb 1:7c149b76c057 100
el16ecb 1:7c149b76c057 101 NOTE_A7, NOTE_E6, NOTE_G7, NOTE_D6,
el16ecb 1:7c149b76c057 102 NOTE_E6, NOTE_C6, NOTE_D6, NOTE_C6,
el16ecb 1:7c149b76c057 103
el16ecb 1:7c149b76c057 104 NOTE_E6, 0, NOTE_G6, 0,
el16ecb 1:7c149b76c057 105 NOTE_A7, NOTE_E6, NOTE_G6, NOTE_D6,
el16ecb 1:7c149b76c057 106
el16ecb 1:7c149b76c057 107 NOTE_E6, NOTE_C6, NOTE_DS6, NOTE_E6,
el16ecb 1:7c149b76c057 108 NOTE_DS6, NOTE_D6, NOTE_C6, NOTE_D6,
el16ecb 1:7c149b76c057 109
el16ecb 1:7c149b76c057 110 NOTE_DS6, 0, NOTE_C6, NOTE_D6,
el16ecb 1:7c149b76c057 111 NOTE_E6, NOTE_G6, NOTE_D6, NOTE_E6,
el16ecb 1:7c149b76c057 112
el16ecb 1:7c149b76c057 113 NOTE_D6, NOTE_C6, NOTE_D6, 0,
el16ecb 1:7c149b76c057 114 NOTE_C6, 0, NOTE_D6, 0,
el16ecb 1:7c149b76c057 115
el16ecb 1:7c149b76c057 116 NOTE_G6, 0, NOTE_A7, 0,
el16ecb 1:7c149b76c057 117 NOTE_E6, NOTE_E6, 0, NOTE_C6,
el16ecb 1:7c149b76c057 118
el16ecb 1:7c149b76c057 119 NOTE_DS6, NOTE_D6, NOTE_C6, 0,
el16ecb 1:7c149b76c057 120 NOTE_C6, 0, NOTE_D6, 0,
el16ecb 1:7c149b76c057 121
el16ecb 1:7c149b76c057 122 NOTE_DS6, 0, NOTE_DS6, NOTE_D6,
el16ecb 1:7c149b76c057 123 NOTE_C6, NOTE_D6, NOTE_E6, NOTE_G6,
el16ecb 1:7c149b76c057 124
el16ecb 1:7c149b76c057 125 NOTE_A7, NOTE_E6, NOTE_G7, NOTE_D6,
el16ecb 1:7c149b76c057 126 NOTE_E6, NOTE_C6, NOTE_D6, NOTE_C6,
eencae 0:f1e3ef53cc3c 127
el16ecb 1:7c149b76c057 128 NOTE_E6, 0, NOTE_G6, 0,
el16ecb 1:7c149b76c057 129 NOTE_A7, NOTE_E6, NOTE_G6, NOTE_D6,
el16ecb 1:7c149b76c057 130
el16ecb 1:7c149b76c057 131 NOTE_E6, NOTE_C6, NOTE_DS6, NOTE_E6,
el16ecb 1:7c149b76c057 132 NOTE_DS6, NOTE_D6, NOTE_C6, NOTE_D6,
el16ecb 1:7c149b76c057 133
el16ecb 1:7c149b76c057 134 NOTE_DS6, 0, NOTE_C6, NOTE_D6,
el16ecb 1:7c149b76c057 135 NOTE_E6, NOTE_G6, NOTE_D6, NOTE_E6,
el16ecb 1:7c149b76c057 136
el16ecb 1:7c149b76c057 137 NOTE_D6, NOTE_C6, NOTE_D6, 0,
el16ecb 1:7c149b76c057 138 NOTE_C6, 0, NOTE_C6, 0,
el16ecb 1:7c149b76c057 139
el16ecb 1:7c149b76c057 140 NOTE_C6, 0, NOTE_G5, NOTE_A6,
el16ecb 1:7c149b76c057 141 NOTE_C6, 0, NOTE_G5, NOTE_A6,
el16ecb 1:7c149b76c057 142
el16ecb 1:7c149b76c057 143 NOTE_C6, NOTE_D6, NOTE_E6, NOTE_C6,
el16ecb 1:7c149b76c057 144 NOTE_F6, NOTE_E6, NOTE_F6, NOTE_G6,
el16ecb 1:7c149b76c057 145
el16ecb 1:7c149b76c057 146 NOTE_C6, 0, NOTE_C6, 0,
el16ecb 1:7c149b76c057 147 NOTE_G5, NOTE_A6, NOTE_C6, NOTE_G6,
el16ecb 1:7c149b76c057 148
el16ecb 1:7c149b76c057 149 NOTE_F6, NOTE_E6, NOTE_D6, NOTE_C6,
el16ecb 1:7c149b76c057 150 NOTE_F5, NOTE_E5, NOTE_F5, NOTE_G5,
el16ecb 1:7c149b76c057 151
el16ecb 1:7c149b76c057 152 NOTE_C6, 0, NOTE_G5, NOTE_A6,
el16ecb 1:7c149b76c057 153 NOTE_C6, 0, NOTE_G5, NOTE_A6,
el16ecb 1:7c149b76c057 154
el16ecb 1:7c149b76c057 155 NOTE_C6, NOTE_C6, NOTE_D6, NOTE_E6,
el16ecb 1:7c149b76c057 156 NOTE_C6, NOTE_G5, NOTE_A6, NOTE_G5,
eencae 0:f1e3ef53cc3c 157
el16ecb 1:7c149b76c057 158 NOTE_C6, 0, NOTE_C6, NOTE_B6,
el16ecb 1:7c149b76c057 159 NOTE_C5, NOTE_G5, NOTE_A6, NOTE_C6,
el16ecb 1:7c149b76c057 160
el16ecb 1:7c149b76c057 161 NOTE_F6, NOTE_E6, NOTE_F6, NOTE_G6,
el16ecb 1:7c149b76c057 162 NOTE_C6, 0, NOTE_B6, 0,
el16ecb 1:7c149b76c057 163
el16ecb 1:7c149b76c057 164 NOTE_C6, 0, NOTE_G5, NOTE_A6,
el16ecb 1:7c149b76c057 165 NOTE_C6, 0, NOTE_G5, NOTE_A6,
el16ecb 1:7c149b76c057 166
el16ecb 1:7c149b76c057 167 NOTE_C6, NOTE_D6, NOTE_E6, NOTE_C6,
el16ecb 1:7c149b76c057 168 NOTE_F6, NOTE_E6, NOTE_F6, NOTE_G6,
el16ecb 1:7c149b76c057 169
el16ecb 1:7c149b76c057 170 NOTE_C6, 0, NOTE_C6, 0,
el16ecb 1:7c149b76c057 171 NOTE_G5, NOTE_A6, NOTE_C6, NOTE_G6,
eencae 0:f1e3ef53cc3c 172
el16ecb 1:7c149b76c057 173 NOTE_F6, NOTE_E6, NOTE_D6, NOTE_C6,
el16ecb 1:7c149b76c057 174 NOTE_F5, NOTE_E5, NOTE_F5, NOTE_G5,
el16ecb 1:7c149b76c057 175
el16ecb 1:7c149b76c057 176 NOTE_C6, 0, NOTE_G5, NOTE_A6,
el16ecb 1:7c149b76c057 177 NOTE_C6, 0, NOTE_G5, NOTE_A6,
el16ecb 1:7c149b76c057 178
el16ecb 1:7c149b76c057 179 NOTE_C6, NOTE_C6, NOTE_D6, NOTE_E6,
el16ecb 1:7c149b76c057 180 NOTE_C6, NOTE_G5, NOTE_A6, NOTE_G5,
el16ecb 1:7c149b76c057 181
el16ecb 1:7c149b76c057 182 NOTE_C6, 0, NOTE_C6, NOTE_B6,
el16ecb 1:7c149b76c057 183 NOTE_C5, NOTE_G5, NOTE_A6, NOTE_C6,
el16ecb 1:7c149b76c057 184
el16ecb 1:7c149b76c057 185 NOTE_F6, NOTE_E6, NOTE_F6, NOTE_G6,
el16ecb 1:7c149b76c057 186 NOTE_C6, 0, NOTE_D6, 0,
eencae 0:f1e3ef53cc3c 187 };
eencae 0:f1e3ef53cc3c 188
eencae 0:f1e3ef53cc3c 189 // durations of the notes
eencae 0:f1e3ef53cc3c 190 // 1/8th, 1/16th, 1/4th etc.
eencae 0:f1e3ef53cc3c 191 float noteDuration[] = {
el16ecb 1:7c149b76c057 192 18, 18, 18, 18,
el16ecb 1:7c149b76c057 193 18, 18, 18, 18,
el16ecb 1:7c149b76c057 194 18, 18, 18, 18,
el16ecb 1:7c149b76c057 195 18, 18, 18, 18,
el16ecb 1:7c149b76c057 196
el16ecb 1:7c149b76c057 197 18, 18, 18, 18,
el16ecb 1:7c149b76c057 198 18, 18, 18, 18,
el16ecb 1:7c149b76c057 199 18, 18, 18, 18,
el16ecb 1:7c149b76c057 200 18, 18, 18, 18,
el16ecb 1:7c149b76c057 201
el16ecb 1:7c149b76c057 202 18, 18, 18, 18,
el16ecb 1:7c149b76c057 203 18, 18, 18, 18,
el16ecb 1:7c149b76c057 204 18, 18, 18, 18,
el16ecb 1:7c149b76c057 205 18, 18, 18, 18,
el16ecb 1:7c149b76c057 206
el16ecb 1:7c149b76c057 207 18, 18, 18, 18,
el16ecb 1:7c149b76c057 208 18, 18, 18, 18,
el16ecb 1:7c149b76c057 209 18, 18, 18, 18,
el16ecb 1:7c149b76c057 210 18, 18, 18, 18,
eencae 0:f1e3ef53cc3c 211
el16ecb 1:7c149b76c057 212 18, 18, 18, 18,
el16ecb 1:7c149b76c057 213 18, 18, 18, 18,
el16ecb 1:7c149b76c057 214 18, 18, 18, 18,
el16ecb 1:7c149b76c057 215 18, 18, 18, 18,
el16ecb 1:7c149b76c057 216
el16ecb 1:7c149b76c057 217 18, 18, 18, 18,
el16ecb 1:7c149b76c057 218 18, 18, 18, 18,
el16ecb 1:7c149b76c057 219 18, 18, 18, 18,
el16ecb 1:7c149b76c057 220 18, 18, 18, 18,
el16ecb 1:7c149b76c057 221
el16ecb 1:7c149b76c057 222 18, 18, 18, 18,
el16ecb 1:7c149b76c057 223 18, 18, 18, 18,
el16ecb 1:7c149b76c057 224 18, 18, 18, 18,
el16ecb 1:7c149b76c057 225 18, 18, 18, 18,
el16ecb 1:7c149b76c057 226
el16ecb 1:7c149b76c057 227 18, 18, 18, 18,
el16ecb 1:7c149b76c057 228 18, 18, 18, 18,
el16ecb 1:7c149b76c057 229 18, 18, 18, 18,
el16ecb 1:7c149b76c057 230 18, 18, 18, 18,
el16ecb 1:7c149b76c057 231
el16ecb 1:7c149b76c057 232 18, 18, 18, 18,
el16ecb 1:7c149b76c057 233 18, 18, 18, 18,
el16ecb 1:7c149b76c057 234 18, 18, 18, 18,
el16ecb 1:7c149b76c057 235 18, 18, 18, 18,
eencae 0:f1e3ef53cc3c 236
el16ecb 1:7c149b76c057 237 18, 18, 18, 18,
el16ecb 1:7c149b76c057 238 18, 18, 18, 18,
el16ecb 1:7c149b76c057 239 18, 18, 18, 18,
el16ecb 1:7c149b76c057 240 18, 18, 18, 18,
el16ecb 1:7c149b76c057 241
el16ecb 1:7c149b76c057 242 18, 18, 18, 18,
el16ecb 1:7c149b76c057 243 18, 18, 18, 18,
el16ecb 1:7c149b76c057 244 18, 18, 18, 18,
el16ecb 1:7c149b76c057 245 18, 18, 18, 18,
el16ecb 1:7c149b76c057 246
el16ecb 1:7c149b76c057 247 18, 18, 18, 18,
el16ecb 1:7c149b76c057 248 18, 18, 18, 18,
el16ecb 1:7c149b76c057 249 18, 18, 18, 18,
el16ecb 1:7c149b76c057 250 18, 18, 18, 18,
el16ecb 1:7c149b76c057 251
el16ecb 1:7c149b76c057 252 18, 18, 18, 18,
el16ecb 1:7c149b76c057 253 18, 18, 18, 18,
el16ecb 1:7c149b76c057 254 18, 18, 18, 18,
el16ecb 1:7c149b76c057 255 18, 18, 18, 18,
eencae 0:f1e3ef53cc3c 256
el16ecb 1:7c149b76c057 257 18, 18, 18, 18,
el16ecb 1:7c149b76c057 258 18, 18, 18, 18,
el16ecb 1:7c149b76c057 259 18, 18, 18, 18,
el16ecb 1:7c149b76c057 260 18, 18, 18, 18,
el16ecb 1:7c149b76c057 261
el16ecb 1:7c149b76c057 262 18, 18, 18, 18,
el16ecb 1:7c149b76c057 263 18, 18, 18, 18,
el16ecb 1:7c149b76c057 264 18, 18, 18, 18,
el16ecb 1:7c149b76c057 265 18, 18, 18, 18,
eencae 0:f1e3ef53cc3c 266
el16ecb 1:7c149b76c057 267 18, 18, 18, 18,
el16ecb 1:7c149b76c057 268 18, 18, 18, 18,
el16ecb 1:7c149b76c057 269 18, 18, 18, 18,
el16ecb 1:7c149b76c057 270 18, 18, 18, 18,
el16ecb 1:7c149b76c057 271
el16ecb 1:7c149b76c057 272 18, 18, 18, 18,
el16ecb 1:7c149b76c057 273 18, 18, 18, 18,
el16ecb 1:7c149b76c057 274 18, 18, 18, 18,
el16ecb 1:7c149b76c057 275 18, 18, 18, 18,
el16ecb 1:7c149b76c057 276
el16ecb 1:7c149b76c057 277 18, 18, 18, 18,
el16ecb 1:7c149b76c057 278 18, 18, 18, 18,
el16ecb 1:7c149b76c057 279 18, 18, 18, 18,
el16ecb 1:7c149b76c057 280 18, 18, 18, 18,
eencae 0:f1e3ef53cc3c 281
eencae 0:f1e3ef53cc3c 282 };
eencae 0:f1e3ef53cc3c 283
eencae 0:f1e3ef53cc3c 284
eencae 0:f1e3ef53cc3c 285 int main()
eencae 0:f1e3ef53cc3c 286 {
eencae 0:f1e3ef53cc3c 287 initArray(); // fill array with sine samples
eencae 0:f1e3ef53cc3c 288
eencae 0:f1e3ef53cc3c 289 // calculate number of notes in array
eencae 0:f1e3ef53cc3c 290 //sizeof() returns number of BYTES in array,
eencae 0:f1e3ef53cc3c 291 // so divide by size of a float in BYTES to get number of elements
eencae 0:f1e3ef53cc3c 292 int notes = sizeof(noteArray)/sizeof(float);
eencae 0:f1e3ef53cc3c 293
eencae 0:f1e3ef53cc3c 294 while (1) {
eencae 0:f1e3ef53cc3c 295
eencae 0:f1e3ef53cc3c 296 // loop through notes
eencae 0:f1e3ef53cc3c 297 for(int i=0; i < notes; i++) {
el16ecb 1:7c149b76c057 298 Vector2D coord = stick.get_coord();
el16ecb 1:7c149b76c057 299 int modi = (yoffset + coord.y/5)*noteArray[i];
el16ecb 1:7c149b76c057 300 float modt = (xoffset + coord.x/2)*noteDuration[i];
el16ecb 1:7c149b76c057 301 printf("%d %d \n",modi,i);
eencae 0:f1e3ef53cc3c 302 // play note
el16ecb 1:7c149b76c057 303 tone(modi,60.0/(BPM*modt));
eencae 0:f1e3ef53cc3c 304 // leave a short pause between notes
el16ecb 1:7c149b76c057 305 wait(60.0/(BPM*modt));
eencae 0:f1e3ef53cc3c 306 }
eencae 0:f1e3ef53cc3c 307
eencae 0:f1e3ef53cc3c 308 wait(1.0); // wait a second before repeating
eencae 0:f1e3ef53cc3c 309
eencae 0:f1e3ef53cc3c 310 }
eencae 0:f1e3ef53cc3c 311
eencae 0:f1e3ef53cc3c 312 }
eencae 0:f1e3ef53cc3c 313
eencae 0:f1e3ef53cc3c 314 void initArray()
eencae 0:f1e3ef53cc3c 315 {
eencae 0:f1e3ef53cc3c 316 // create LUT - loop through array and calculate sine wave samples
eencae 0:f1e3ef53cc3c 317 for (int i = 0; i < n ; i++) {
eencae 0:f1e3ef53cc3c 318 y[i] = 0.5 + 0.5*sin(i*2*PI/n);
eencae 0:f1e3ef53cc3c 319 }
eencae 0:f1e3ef53cc3c 320
eencae 0:f1e3ef53cc3c 321 }
eencae 0:f1e3ef53cc3c 322
eencae 0:f1e3ef53cc3c 323 void tone(float frequency,float duration)
eencae 0:f1e3ef53cc3c 324 {
el16ecb 1:7c149b76c057 325 int newfreq = int(frequency);
el16ecb 1:7c149b76c057 326 graphicEqualizer(newfreq); // equalizer on LEDs
eencae 0:f1e3ef53cc3c 327
eencae 0:f1e3ef53cc3c 328 if (frequency > 0) { // a frequency of 0 indicates no note played so only play a note if frequency is not 0
eencae 0:f1e3ef53cc3c 329
eencae 0:f1e3ef53cc3c 330 float dt = 1.0/(frequency*n) - (1.34e-6 + 1e-6); // calculate time step - take into account DAC time and wait() offset
eencae 0:f1e3ef53cc3c 331
eencae 0:f1e3ef53cc3c 332 noteTimer.start(); // start timer
eencae 0:f1e3ef53cc3c 333
eencae 0:f1e3ef53cc3c 334 while(noteTimer.read() < duration) { // keep looping while timer less than duration
eencae 0:f1e3ef53cc3c 335
eencae 0:f1e3ef53cc3c 336 for (int i = 0; i < n ; i++) { // loop through samples and output analog waveform
eencae 0:f1e3ef53cc3c 337 aout = y[i];
eencae 0:f1e3ef53cc3c 338 wait(dt); // leave appropriate delay for frequency
eencae 0:f1e3ef53cc3c 339 }
eencae 0:f1e3ef53cc3c 340 }
eencae 0:f1e3ef53cc3c 341
eencae 0:f1e3ef53cc3c 342 noteTimer.stop(); // stop the timer
eencae 0:f1e3ef53cc3c 343 noteTimer.reset(); // reset to 0
eencae 0:f1e3ef53cc3c 344
eencae 0:f1e3ef53cc3c 345 } else { // if no note played, have a simple delay
eencae 0:f1e3ef53cc3c 346 wait(duration);
eencae 0:f1e3ef53cc3c 347 }
eencae 0:f1e3ef53cc3c 348
eencae 0:f1e3ef53cc3c 349 leds = 0; // turn off LEDs
eencae 0:f1e3ef53cc3c 350 }
eencae 0:f1e3ef53cc3c 351
eencae 0:f1e3ef53cc3c 352 // primitive graphic equalizer on the LEDs
el16ecb 1:7c149b76c057 353 void graphicEqualizer(int frequency)
eencae 0:f1e3ef53cc3c 354 {
eencae 0:f1e3ef53cc3c 355 // these numbers are fairly random and picked to give a
eencae 0:f1e3ef53cc3c 356 // decent effect when the melodies plays.
el16ecb 1:7c149b76c057 357 // Will have to change for different melodies
el16ecb 1:7c149b76c057 358 //printf("%f",float((frequency%63)/63.0));
el16ecb 1:7c149b76c057 359 red_led = ((frequency%31)/31.0);
el16ecb 1:7c149b76c057 360 green_led = (((frequency)%37)/37.0);
el16ecb 1:7c149b76c057 361 blue_led = (((frequency)%41)/41.0);
eencae 0:f1e3ef53cc3c 362
eencae 0:f1e3ef53cc3c 363 }