Library for ELEC2645 Gamepad PCB. University of Leeds Version 2 January 2020

Dependents:   ELEC2645_Ticker_WAV ELEC2645_Project_username ELEC2645_Project_el18vgt ELEC2645_Project_el17oc11 ... more

Committer:
eencae
Date:
Fri Jan 31 10:49:11 2020 +0000
Revision:
24:33639c2eacb3
Parent:
22:72357412608d
Updated docs

Who changed what in which revision?

UserRevisionLine numberNew contents of line
eencae 0:a6288c29b936 1 #ifndef GAMEPAD_H
eencae 0:a6288c29b936 2 #define GAMEPAD_H
eencae 0:a6288c29b936 3
valavanisalex 12:1b0b6355da4f 4 #include <bitset>
valavanisalex 12:1b0b6355da4f 5
valavanisalex 13:ef5fc9f58805 6 // Forward declaration of the classes that we use from the mbed library
valavanisalex 13:ef5fc9f58805 7 // This avoids the need for us to include the huge mbed.h header inside our
valavanisalex 13:ef5fc9f58805 8 // own library API
valavanisalex 13:ef5fc9f58805 9 namespace mbed
valavanisalex 13:ef5fc9f58805 10 {
valavanisalex 13:ef5fc9f58805 11 class AnalogIn;
valavanisalex 13:ef5fc9f58805 12 class InterruptIn;
valavanisalex 13:ef5fc9f58805 13 class PwmOut;
eencae 21:da0b4e14c867 14 class AnalogOut;
eencae 21:da0b4e14c867 15 class Ticker;
valavanisalex 13:ef5fc9f58805 16 class Timeout;
valavanisalex 13:ef5fc9f58805 17 }
eencae 3:964a6d95acdd 18
eencae 3:964a6d95acdd 19 #define TOL 0.1f
eencae 3:964a6d95acdd 20 #define RAD2DEG 57.2957795131f
eencae 21:da0b4e14c867 21 #define PI 3.14159265359
eencae 21:da0b4e14c867 22
eencae 3:964a6d95acdd 23
eencae 9:893189072e89 24 /** Enum for direction */
eencae 3:964a6d95acdd 25 enum Direction {
eencae 9:893189072e89 26 CENTRE, /**< joystick centred */
eencae 9:893189072e89 27 N, /**< pushed North (0)*/
eencae 9:893189072e89 28 NE, /**< pushed North-East (45) */
eencae 9:893189072e89 29 E, /**< pushed East (90) */
eencae 9:893189072e89 30 SE, /**< pushed South-East (135) */
eencae 9:893189072e89 31 S, /**< pushed South (180) */
eencae 9:893189072e89 32 SW, /**< pushed South-West (225) */
eencae 9:893189072e89 33 W, /**< pushed West (270) */
eencae 9:893189072e89 34 NW /**< pushed North-West (315) */
eencae 3:964a6d95acdd 35 };
eencae 3:964a6d95acdd 36
eencae 9:893189072e89 37 /** Vector 2D struct */
eencae 3:964a6d95acdd 38 struct Vector2D {
eencae 9:893189072e89 39 float x; /**< float for x value */
eencae 9:893189072e89 40 float y; /**< float for y value */
eencae 3:964a6d95acdd 41 };
eencae 3:964a6d95acdd 42
eencae 9:893189072e89 43 /** Polar coordinate struct */
eencae 3:964a6d95acdd 44 struct Polar {
eencae 9:893189072e89 45 float mag; /**< float for magnitude */
eencae 9:893189072e89 46 float angle; /**< float for angle (in degrees) */
eencae 3:964a6d95acdd 47 };
eencae 0:a6288c29b936 48
eencae 9:893189072e89 49 /** Gamepad Class
valavanisalex 20:c0959710291b 50 * @brief Library for interfacing with ELEC2645 Gamepad PCB, University of Leeds
valavanisalex 20:c0959710291b 51 * @author Dr Craig A. Evans
valavanisalex 20:c0959710291b 52 * @author Dr Alex Valavanis
eencae 24:33639c2eacb3 53 * @author Joshua Davy
valavanisalex 20:c0959710291b 54 */
eencae 0:a6288c29b936 55 class Gamepad
eencae 0:a6288c29b936 56 {
valavanisalex 19:c2bb79a10b3c 57
valavanisalex 11:ff86b2ffce01 58 private:
valavanisalex 13:ef5fc9f58805 59 mbed::PwmOut *_led1;
valavanisalex 13:ef5fc9f58805 60 mbed::PwmOut *_led2;
valavanisalex 13:ef5fc9f58805 61 mbed::PwmOut *_led3;
valavanisalex 13:ef5fc9f58805 62 mbed::PwmOut *_led4;
valavanisalex 13:ef5fc9f58805 63 mbed::PwmOut *_led5;
valavanisalex 13:ef5fc9f58805 64 mbed::PwmOut *_led6;
valavanisalex 11:ff86b2ffce01 65
valavanisalex 13:ef5fc9f58805 66 mbed::InterruptIn *_button_A;
valavanisalex 13:ef5fc9f58805 67 mbed::InterruptIn *_button_B;
valavanisalex 13:ef5fc9f58805 68 mbed::InterruptIn *_button_X;
valavanisalex 13:ef5fc9f58805 69 mbed::InterruptIn *_button_Y;
valavanisalex 13:ef5fc9f58805 70 mbed::InterruptIn *_button_start;
valavanisalex 11:ff86b2ffce01 71
valavanisalex 13:ef5fc9f58805 72 mbed::AnalogIn *_vert;
valavanisalex 13:ef5fc9f58805 73 mbed::AnalogIn *_horiz;
valavanisalex 11:ff86b2ffce01 74
eencae 21:da0b4e14c867 75 mbed::AnalogIn *_pot1;
eencae 21:da0b4e14c867 76 mbed::AnalogIn *_pot2;
eencae 21:da0b4e14c867 77
eencae 21:da0b4e14c867 78 mbed::AnalogOut *dac;
eencae 21:da0b4e14c867 79 mbed::Ticker *ticker;
eencae 21:da0b4e14c867 80 mbed::Timeout *timeout;
eencae 21:da0b4e14c867 81 mbed::Timeout *note_timeout;
valavanisalex 11:ff86b2ffce01 82
valavanisalex 11:ff86b2ffce01 83 // centred x,y values
valavanisalex 11:ff86b2ffce01 84 float _x0;
valavanisalex 11:ff86b2ffce01 85 float _y0;
eencae 21:da0b4e14c867 86
eencae 21:da0b4e14c867 87 float *_sample_array;
eencae 21:da0b4e14c867 88 const int *_notes;
eencae 21:da0b4e14c867 89 const int *_durations;
eencae 21:da0b4e14c867 90
eencae 21:da0b4e14c867 91 int _n;
eencae 21:da0b4e14c867 92 int _melody_length;
eencae 21:da0b4e14c867 93 volatile unsigned int _sample;
eencae 21:da0b4e14c867 94 volatile unsigned int _note;
eencae 21:da0b4e14c867 95 float _bpm;
eencae 21:da0b4e14c867 96 bool _repeat;
eencae 21:da0b4e14c867 97
eencae 0:a6288c29b936 98
eencae 0:a6288c29b936 99 public:
eencae 9:893189072e89 100 /** Constructor */
eencae 0:a6288c29b936 101 Gamepad();
eencae 8:7eaf26f4b5f2 102
eencae 9:893189072e89 103 /** Initialise all peripherals and configure interrupts */
eencae 0:a6288c29b936 104 void init();
eencae 8:7eaf26f4b5f2 105
eencae 9:893189072e89 106 /** Turn all LEDs on */
eencae 0:a6288c29b936 107 void leds_on();
eencae 8:7eaf26f4b5f2 108
eencae 9:893189072e89 109 /** Turn all LEDs off */
eencae 0:a6288c29b936 110 void leds_off();
eencae 8:7eaf26f4b5f2 111
eencae 9:893189072e89 112 /** Set all LEDs to duty-cycle
eencae 9:893189072e89 113 *@param value in range 0.0 to 1.0
eencae 9:893189072e89 114 */
valavanisalex 11:ff86b2ffce01 115 void leds(float val) const;
eencae 9:893189072e89 116
eencae 9:893189072e89 117 /** Set LED to duty-cycle
eencae 17:cf1e1ffcf773 118 *@param led number (0 to 5)
eencae 9:893189072e89 119 *@param value in range 0.0 to 1.0
eencae 9:893189072e89 120 */
eencae 18:e0a4f15a7750 121 void led(int n,float val) const;
eencae 1:6d25cd49059b 122
eencae 21:da0b4e14c867 123 /** Read potentiometer 1 value
eencae 9:893189072e89 124 *@returns potentiometer value in range 0.0 to 1.0
eencae 8:7eaf26f4b5f2 125 */
eencae 21:da0b4e14c867 126 float read_pot1() const;
eencae 1:6d25cd49059b 127
eencae 21:da0b4e14c867 128 /** Read potentiometer 2 value
eencae 21:da0b4e14c867 129 *@returns potentiometer value in range 0.0 to 1.0
eencae 21:da0b4e14c867 130 */
eencae 21:da0b4e14c867 131 float read_pot2() const;
valavanisalex 19:c2bb79a10b3c 132
eencae 8:7eaf26f4b5f2 133 /** Get magnitude of joystick movement
eencae 9:893189072e89 134 * @returns value in range 0.0 to 1.0
eencae 8:7eaf26f4b5f2 135 */
eencae 8:7eaf26f4b5f2 136 float get_mag();
eencae 9:893189072e89 137
eencae 8:7eaf26f4b5f2 138 /** Get angle of joystick movement
eencae 9:893189072e89 139 * @returns value in range 0.0 to 359.9. 0.0 corresponds to N, 180.0 to S. -1.0 is central
eencae 8:7eaf26f4b5f2 140 */
eencae 3:964a6d95acdd 141 float get_angle();
eencae 9:893189072e89 142
eencae 8:7eaf26f4b5f2 143 /** Gets joystick direction
eencae 9:893189072e89 144 * @returns an enum: CENTRE, N, NE, E, SE, S, SW, W, NW,
eencae 8:7eaf26f4b5f2 145 */
eencae 3:964a6d95acdd 146 Direction get_direction(); // N,NE,E,SE etc.
eencae 9:893189072e89 147
eencae 8:7eaf26f4b5f2 148 /** Gets raw cartesian co-ordinates of joystick
eencae 9:893189072e89 149 * @returns a struct with x,y members, each in the range 0.0 to 1.0
eencae 8:7eaf26f4b5f2 150 */
eencae 5:ce5eae9ee934 151 Vector2D get_coord(); // cartesian co-ordinates x,y
eencae 9:893189072e89 152
eencae 8:7eaf26f4b5f2 153 /** Gets cartesian coordinates mapped to circular grid
eencae 9:893189072e89 154 * @returns a struct with x,y members, each in the range 0.0 to 1.0
eencae 8:7eaf26f4b5f2 155 */
eencae 5:ce5eae9ee934 156 Vector2D get_mapped_coord(); // x,y mapped to circle
eencae 9:893189072e89 157
eencae 8:7eaf26f4b5f2 158 /** Gets polar coordinates of the joystick
eencae 9:893189072e89 159 * @returns a struct contains mag and angle
eencae 8:7eaf26f4b5f2 160 */
eencae 5:ce5eae9ee934 161 Polar get_polar(); // mag and angle in struct form
eencae 3:964a6d95acdd 162
eencae 21:da0b4e14c867 163
eencae 21:da0b4e14c867 164 /** Resets all button states. Useful for calling inbetween scenes
eencae 21:da0b4e14c867 165 * where you do not want button presses from the previous scene effecting
eencae 21:da0b4e14c867 166 * the current scene
eencae 21:da0b4e14c867 167 */
eencae 21:da0b4e14c867 168 void reset_buttons();
eencae 21:da0b4e14c867 169
eencae 21:da0b4e14c867 170 /** Returns true if A has been pressed
eencae 21:da0b4e14c867 171 * @returns a bool corresponding to A being pressed
eencae 21:da0b4e14c867 172 */
eencae 21:da0b4e14c867 173
eencae 21:da0b4e14c867 174 bool A_pressed();
eencae 21:da0b4e14c867 175
eencae 21:da0b4e14c867 176 /** Returns true if A is held
eencae 21:da0b4e14c867 177 * @returns a bool corresponding to A being held
eencae 21:da0b4e14c867 178 *
eencae 21:da0b4e14c867 179 */
eencae 21:da0b4e14c867 180 bool A_held();
eencae 21:da0b4e14c867 181
eencae 21:da0b4e14c867 182
eencae 21:da0b4e14c867 183 /** Returns true if B has been pressed
eencae 21:da0b4e14c867 184 * @returns a bool corresponding to B being pressed
eencae 21:da0b4e14c867 185 */
eencae 21:da0b4e14c867 186 bool B_pressed();
eencae 21:da0b4e14c867 187
eencae 21:da0b4e14c867 188 /** Returns true if B is held
eencae 21:da0b4e14c867 189 * @returns a bool corresponding to B being held
eencae 21:da0b4e14c867 190 *
eencae 21:da0b4e14c867 191 */
eencae 21:da0b4e14c867 192 bool B_held();
eencae 21:da0b4e14c867 193
eencae 21:da0b4e14c867 194 /** Returns true if B has been pressed
eencae 21:da0b4e14c867 195 * @returns a bool corresponding to B being pressed
eencae 21:da0b4e14c867 196 */
eencae 21:da0b4e14c867 197 bool X_pressed();
eencae 21:da0b4e14c867 198
eencae 21:da0b4e14c867 199 /** Returns true if X is held
eencae 21:da0b4e14c867 200 * @returns a bool corresponding to X being held
eencae 21:da0b4e14c867 201 *
eencae 21:da0b4e14c867 202 */
eencae 21:da0b4e14c867 203 bool X_held();
eencae 21:da0b4e14c867 204
eencae 21:da0b4e14c867 205 /** Returns true if Y has been pressed
eencae 21:da0b4e14c867 206 * @returns a bool corresponding to Y being pressed
eencae 21:da0b4e14c867 207 */
eencae 21:da0b4e14c867 208 bool Y_pressed();
eencae 3:964a6d95acdd 209
eencae 21:da0b4e14c867 210 /** Returns true if Y is held
eencae 21:da0b4e14c867 211 * @returns a bool corresponding to Y being held
eencae 21:da0b4e14c867 212 *
eencae 21:da0b4e14c867 213 */
eencae 21:da0b4e14c867 214 bool Y_held();
eencae 21:da0b4e14c867 215
eencae 21:da0b4e14c867 216
eencae 21:da0b4e14c867 217 /** Returns true if start has been pressed
eencae 21:da0b4e14c867 218 * @returns a bool corresponding to start being pressed
eencae 21:da0b4e14c867 219 */
eencae 21:da0b4e14c867 220 bool start_pressed();
eencae 21:da0b4e14c867 221
eencae 21:da0b4e14c867 222 /** Returns true if start is held
eencae 21:da0b4e14c867 223 * @returns a bool corresponding to start being held
eencae 21:da0b4e14c867 224 *
eencae 21:da0b4e14c867 225 */
eencae 21:da0b4e14c867 226 bool start_held();
eencae 21:da0b4e14c867 227
eencae 24:33639c2eacb3 228 /** Play a single tone for the specifed duration
eencae 24:33639c2eacb3 229 *@param note frequency (in Hz)
eencae 24:33639c2eacb3 230 *@param duration (in s)
eencae 24:33639c2eacb3 231 */
eencae 21:da0b4e14c867 232 void tone(const float frequency,const float duration);
eencae 21:da0b4e14c867 233
eencae 24:33639c2eacb3 234 /** Play a melody
eencae 24:33639c2eacb3 235 *@param length of note array
eencae 24:33639c2eacb3 236 *@param array of note frequencies (in Hz) - 0 treated as a rest
eencae 24:33639c2eacb3 237 *@param array of note durations (4 corresponds to 1/4, 8 is 1/8 etc.)
eencae 24:33639c2eacb3 238 *@param beats per minute
eencae 24:33639c2eacb3 239 *@param whether to repeat or play just once
eencae 24:33639c2eacb3 240 */
eencae 21:da0b4e14c867 241 void play_melody(int length,const int *notes,const int *durations,float bpm,bool repeat);
eencae 21:da0b4e14c867 242
eencae 24:33639c2eacb3 243 /** Set the BPM of the melody
eencae 24:33639c2eacb3 244 *@param beats per minute
eencae 24:33639c2eacb3 245 */
eencae 21:da0b4e14c867 246 void set_bpm(float bpm);
eencae 22:72357412608d 247
eencae 24:33639c2eacb3 248 /** Write an analog voltage to the speaker
eencae 24:33639c2eacb3 249 *@param voltage in range 0.0 to 1.0 (corresponds 0.0 to 3.3 V)
eencae 24:33639c2eacb3 250 */
eencae 22:72357412608d 251 void write_dac(float val);
eencae 21:da0b4e14c867 252
eencae 21:da0b4e14c867 253
eencae 21:da0b4e14c867 254
eencae 21:da0b4e14c867 255
eencae 21:da0b4e14c867 256 private:
eencae 21:da0b4e14c867 257
eencae 21:da0b4e14c867 258 volatile bool A_fall;
eencae 21:da0b4e14c867 259 void A_fall_interrupt();
eencae 21:da0b4e14c867 260
eencae 21:da0b4e14c867 261 volatile bool B_fall;
eencae 21:da0b4e14c867 262 void B_fall_interrupt();
eencae 21:da0b4e14c867 263
eencae 21:da0b4e14c867 264 volatile bool X_fall;
eencae 21:da0b4e14c867 265 void X_fall_interrupt();
eencae 21:da0b4e14c867 266
eencae 21:da0b4e14c867 267 volatile bool Y_fall;
eencae 21:da0b4e14c867 268 void Y_fall_interrupt();
eencae 21:da0b4e14c867 269
eencae 21:da0b4e14c867 270 volatile bool start_fall;
eencae 21:da0b4e14c867 271 void start_fall_interrupt();
eencae 21:da0b4e14c867 272
eencae 21:da0b4e14c867 273 // Tone functions
eencae 21:da0b4e14c867 274 void ticker_isr();
eencae 21:da0b4e14c867 275 void timeout_isr();
eencae 21:da0b4e14c867 276 void note_timeout_isr();
eencae 21:da0b4e14c867 277 void play_next_note();
eencae 21:da0b4e14c867 278
eencae 21:da0b4e14c867 279
eencae 21:da0b4e14c867 280
eencae 0:a6288c29b936 281 };
eencae 0:a6288c29b936 282
eencae 21:da0b4e14c867 283 // Note definitions from Arduino.cc
eencae 21:da0b4e14c867 284 #define NOTE_B0 31
eencae 21:da0b4e14c867 285 #define NOTE_C1 33
eencae 21:da0b4e14c867 286 #define NOTE_CS1 35
eencae 21:da0b4e14c867 287 #define NOTE_D1 37
eencae 21:da0b4e14c867 288 #define NOTE_DS1 39
eencae 21:da0b4e14c867 289 #define NOTE_E1 41
eencae 21:da0b4e14c867 290 #define NOTE_F1 44
eencae 21:da0b4e14c867 291 #define NOTE_FS1 46
eencae 21:da0b4e14c867 292 #define NOTE_G1 49
eencae 21:da0b4e14c867 293 #define NOTE_GS1 52
eencae 21:da0b4e14c867 294 #define NOTE_A1 55
eencae 21:da0b4e14c867 295 #define NOTE_AS1 58
eencae 21:da0b4e14c867 296 #define NOTE_B1 62
eencae 21:da0b4e14c867 297 #define NOTE_C2 65
eencae 21:da0b4e14c867 298 #define NOTE_CS2 69
eencae 21:da0b4e14c867 299 #define NOTE_D2 73
eencae 21:da0b4e14c867 300 #define NOTE_DS2 78
eencae 21:da0b4e14c867 301 #define NOTE_E2 82
eencae 21:da0b4e14c867 302 #define NOTE_F2 87
eencae 21:da0b4e14c867 303 #define NOTE_FS2 93
eencae 21:da0b4e14c867 304 #define NOTE_G2 98
eencae 21:da0b4e14c867 305 #define NOTE_GS2 104
eencae 21:da0b4e14c867 306 #define NOTE_A2 110
eencae 21:da0b4e14c867 307 #define NOTE_AS2 117
eencae 21:da0b4e14c867 308 #define NOTE_B2 123
eencae 21:da0b4e14c867 309 #define NOTE_C3 131
eencae 21:da0b4e14c867 310 #define NOTE_CS3 139
eencae 21:da0b4e14c867 311 #define NOTE_D3 147
eencae 21:da0b4e14c867 312 #define NOTE_DS3 156
eencae 21:da0b4e14c867 313 #define NOTE_E3 165
eencae 21:da0b4e14c867 314 #define NOTE_F3 175
eencae 21:da0b4e14c867 315 #define NOTE_FS3 185
eencae 21:da0b4e14c867 316 #define NOTE_G3 196
eencae 21:da0b4e14c867 317 #define NOTE_GS3 208
eencae 21:da0b4e14c867 318 #define NOTE_A3 220
eencae 21:da0b4e14c867 319 #define NOTE_AS3 233
eencae 21:da0b4e14c867 320 #define NOTE_B3 247
eencae 21:da0b4e14c867 321 #define NOTE_C4 262
eencae 21:da0b4e14c867 322 #define NOTE_CS4 277
eencae 21:da0b4e14c867 323 #define NOTE_D4 294
eencae 21:da0b4e14c867 324 #define NOTE_DS4 311
eencae 21:da0b4e14c867 325 #define NOTE_E4 330
eencae 21:da0b4e14c867 326 #define NOTE_F4 349
eencae 21:da0b4e14c867 327 #define NOTE_FS4 370
eencae 21:da0b4e14c867 328 #define NOTE_G4 392
eencae 21:da0b4e14c867 329 #define NOTE_GS4 415
eencae 21:da0b4e14c867 330 #define NOTE_A4 440
eencae 21:da0b4e14c867 331 #define NOTE_AS4 466
eencae 21:da0b4e14c867 332 #define NOTE_B4 494
eencae 21:da0b4e14c867 333 #define NOTE_C5 523
eencae 21:da0b4e14c867 334 #define NOTE_CS5 554
eencae 21:da0b4e14c867 335 #define NOTE_D5 587
eencae 21:da0b4e14c867 336 #define NOTE_DS5 622
eencae 21:da0b4e14c867 337 #define NOTE_E5 659
eencae 21:da0b4e14c867 338 #define NOTE_F5 698
eencae 21:da0b4e14c867 339 #define NOTE_FS5 740
eencae 21:da0b4e14c867 340 #define NOTE_G5 784
eencae 21:da0b4e14c867 341 #define NOTE_GS5 831
eencae 21:da0b4e14c867 342 #define NOTE_A5 880
eencae 21:da0b4e14c867 343 #define NOTE_AS5 932
eencae 21:da0b4e14c867 344 #define NOTE_B5 988
eencae 21:da0b4e14c867 345 #define NOTE_C6 1047
eencae 21:da0b4e14c867 346 #define NOTE_CS6 1109
eencae 21:da0b4e14c867 347 #define NOTE_D6 1175
eencae 21:da0b4e14c867 348 #define NOTE_DS6 1245
eencae 21:da0b4e14c867 349 #define NOTE_E6 1319
eencae 21:da0b4e14c867 350 #define NOTE_F6 1397
eencae 21:da0b4e14c867 351 #define NOTE_FS6 1480
eencae 21:da0b4e14c867 352 #define NOTE_G6 1568
eencae 21:da0b4e14c867 353 #define NOTE_GS6 1661
eencae 21:da0b4e14c867 354 #define NOTE_A6 1760
eencae 21:da0b4e14c867 355 #define NOTE_AS6 1865
eencae 21:da0b4e14c867 356 #define NOTE_B6 1976
eencae 21:da0b4e14c867 357 #define NOTE_C7 2093
eencae 21:da0b4e14c867 358 #define NOTE_CS7 2217
eencae 21:da0b4e14c867 359 #define NOTE_D7 2349
eencae 21:da0b4e14c867 360 #define NOTE_DS7 2489
eencae 21:da0b4e14c867 361 #define NOTE_E7 2637
eencae 21:da0b4e14c867 362 #define NOTE_F7 2794
eencae 21:da0b4e14c867 363 #define NOTE_FS7 2960
eencae 21:da0b4e14c867 364 #define NOTE_G7 3136
eencae 21:da0b4e14c867 365 #define NOTE_GS7 3322
eencae 21:da0b4e14c867 366 #define NOTE_A7 3520
eencae 21:da0b4e14c867 367 #define NOTE_AS7 3729
eencae 21:da0b4e14c867 368 #define NOTE_B7 3951
eencae 21:da0b4e14c867 369 #define NOTE_C8 4186
eencae 21:da0b4e14c867 370 #define NOTE_CS8 4435
eencae 21:da0b4e14c867 371 #define NOTE_D8 4699
eencae 21:da0b4e14c867 372 #define NOTE_DS8 4978
eencae 21:da0b4e14c867 373
eencae 0:a6288c29b936 374 #endif