Test program for PwmSound class. Provides tests (demos) for the various sound generating functions in the class. Includes several MML melodies and music clips to test the play() function. Tested on an mbed LPC1768.

Dependencies:   PwmSound mbed

Committer:
paulg
Date:
Tue May 06 13:23:02 2014 +0000
Revision:
1:46f098444d0c
Parent:
0:41640fc98a43
Play music written in Music Macro Language (MML) with your mbed! This program fully tests the revised PwmSound library including the new play() function. It includes several MML melodies and music clips.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
paulg 0:41640fc98a43 1 /******************************************************************************
paulg 0:41640fc98a43 2 * File: main.cpp
paulg 0:41640fc98a43 3 * Author: Paul Griffith
paulg 0:41640fc98a43 4 * Created: 25 Mar 2014
paulg 0:41640fc98a43 5 * Last Edit: see below
paulg 0:41640fc98a43 6 * Version: see below
paulg 0:41640fc98a43 7 *
paulg 0:41640fc98a43 8 * Description:
paulg 0:41640fc98a43 9 * Test program for PwmSound class.
paulg 0:41640fc98a43 10 *
paulg 0:41640fc98a43 11 * Copyright (c) 2014 Paul Griffith, MIT License
paulg 0:41640fc98a43 12 *
paulg 0:41640fc98a43 13 * Permission is hereby granted, free of charge, to any person obtaining a copy
paulg 0:41640fc98a43 14 * of this software and associated documentation files (the "Software"), to
paulg 0:41640fc98a43 15 * deal in the Software without restriction, including without limitation the
paulg 0:41640fc98a43 16 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
paulg 0:41640fc98a43 17 * sell copies of the Software, and to permit persons to whom the Software is
paulg 0:41640fc98a43 18 * furnished to do so, subject to the following conditions:
paulg 0:41640fc98a43 19 *
paulg 0:41640fc98a43 20 * The above copyright notice and this permission notice shall be included in
paulg 0:41640fc98a43 21 * all copies or substantial portions of the Software.
paulg 0:41640fc98a43 22 *
paulg 0:41640fc98a43 23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
paulg 0:41640fc98a43 24 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
paulg 0:41640fc98a43 25 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
paulg 0:41640fc98a43 26 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
paulg 0:41640fc98a43 27 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
paulg 0:41640fc98a43 28 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
paulg 0:41640fc98a43 29 * IN THE SOFTWARE.
paulg 0:41640fc98a43 30 *
paulg 0:41640fc98a43 31 * Modifications:
paulg 0:41640fc98a43 32 * Ver Date By Details
paulg 0:41640fc98a43 33 * 0.00 25Mar14 PG File created.
paulg 0:41640fc98a43 34 * 1.00 30Mar14 PG Initial release.
paulg 1:46f098444d0c 35 * 2.00 06May14 PG Many changes and additions to test V2.00 library.
paulg 0:41640fc98a43 36 *
paulg 0:41640fc98a43 37 ******************************************************************************/
paulg 0:41640fc98a43 38
paulg 0:41640fc98a43 39 #include "mbed.h"
paulg 0:41640fc98a43 40 #include "PwmSound.h"
paulg 0:41640fc98a43 41
paulg 0:41640fc98a43 42 PwmSound mySpeaker(p24);
paulg 0:41640fc98a43 43 Serial pc(USBTX, USBRX);
paulg 0:41640fc98a43 44
paulg 1:46f098444d0c 45 void printHelps(void);
paulg 0:41640fc98a43 46 void badArgs(void);
paulg 0:41640fc98a43 47 void nyi(void);
paulg 0:41640fc98a43 48 void pause(void);
paulg 0:41640fc98a43 49
paulg 1:46f098444d0c 50 // Tone fragments
paulg 1:46f098444d0c 51
paulg 1:46f098444d0c 52 #define DOODLY "O3>CG8G8AGPB>C"
paulg 1:46f098444d0c 53 #define YAY "O4L32MLCDEFG" //success
paulg 1:46f098444d0c 54 #define WAH "T80O2L32GFEDC" //failure
paulg 1:46f098444d0c 55
paulg 1:46f098444d0c 56 // Preset melodies in MML format
paulg 1:46f098444d0c 57 // Melodies 0-3 are taken from Michael J. Mefford's MS-DOS PLAY utility which
paulg 1:46f098444d0c 58 // was published as part of a PC Magazine cover disk in 1992.
paulg 1:46f098444d0c 59
paulg 1:46f098444d0c 60 // Super Mario Brothers theme (11 notes)
paulg 0:41640fc98a43 61
paulg 1:46f098444d0c 62 char* smb = {
paulg 1:46f098444d0c 63 "T180 O3 E8 E8 P8 E8 P8 C8 D#4 G4 P4 <G4 P4"
paulg 1:46f098444d0c 64 };
paulg 1:46f098444d0c 65
paulg 1:46f098444d0c 66 char* preset0 = { //short Dragnet theme
paulg 1:46f098444d0c 67 "T90 O2 L8E. L16F# L8G E P2 L8E. L16F# L8G E L3 B-"
paulg 1:46f098444d0c 68 };
paulg 1:46f098444d0c 69
paulg 1:46f098444d0c 70 char* preset1 = { //long Dragnet theme
paulg 1:46f098444d0c 71 "T190O2L4EL8EL4MLG.MNL4G.EL8GL4AL8AL4MLG.MNL2G.L4EL8EL4MLG.MNL4G.EL8GL4AL8AL4MLG."
paulg 1:46f098444d0c 72 "MNL2G.T90L8E.L16F#L8GEP2L8E.L16F#L8GEL3B-"
paulg 1:46f098444d0c 73 };
paulg 1:46f098444d0c 74
paulg 1:46f098444d0c 75 char* preset2 = { //Greensleeves
paulg 1:46f098444d0c 76 "O3A O4L2CL4D E.L8FL4E L2DL4O3B G.L8AL4B O4L2CO3L4A A.L8G#L4A L2BL4G# O3L2EL4A"
paulg 1:46f098444d0c 77 "O4L2CL4D E.L8FL4E L2DL4O3B G.L8AL4B O4L4C.O3L8BL4A L4G#.L8F#L4G# L2A. L2A."
paulg 1:46f098444d0c 78 "O4L2G. L4G.L8F#L4E L2DO3L4B G.L8AL4B L2O4CO3L4A A.L8G#L4A L2BL4G# L2E."
paulg 1:46f098444d0c 79 "O4L2G. L4G.L8F#L4E L2DO3L4B G.L8AL4B O4L4C.O3L8BL4A G#.L8F#L4G# L2A. A."
paulg 0:41640fc98a43 80 };
paulg 0:41640fc98a43 81
paulg 1:46f098444d0c 82 char* preset3 = { //The Entertainer by Scott Joplin
paulg 1:46f098444d0c 83 ":The Entertainer by Scott Joplin\n" //comment lines need a \n
paulg 1:46f098444d0c 84 ""
paulg 1:46f098444d0c 85 "T80 :Prelude\n"
paulg 1:46f098444d0c 86 ""
paulg 1:46f098444d0c 87 "O4MLL64C#MNL16DECO3L8AL16BMSL8G"
paulg 1:46f098444d0c 88 "MLL64C#MNL16DECO2L8AL16BL8MSGMN"
paulg 1:46f098444d0c 89 "O2MLL64C#MNL16DECO1L8AL16BAA-"
paulg 1:46f098444d0c 90 "MSL8GMNP4O3L8GO2L16MLDMND#"
paulg 1:46f098444d0c 91 ""
paulg 1:46f098444d0c 92 "MLO2L16EMSL8O3CMLO2L16EO3MSL8C"
paulg 1:46f098444d0c 93 "MNO2L16EO3L4C.L16O4CDD#"
paulg 1:46f098444d0c 94 "ECDL8EL16O3BO4MSL8D"
paulg 1:46f098444d0c 95 "MNCL16O3MLEGO4MSL8CMLO2L16DMND#"
paulg 1:46f098444d0c 96 "MLO2L16EMSL8O3CMLO2L16EO3MSL8C"
paulg 1:46f098444d0c 97 "MLO2L16EO3L4C.L16MLAMNG"
paulg 1:46f098444d0c 98 "F#AO4CL8EL16DCO3A"
paulg 1:46f098444d0c 99 "O4L4D.O1L16MLDMND#"
paulg 1:46f098444d0c 100 "MLO2L16EMSL8O3CMLO2L16EO3MSL8C"
paulg 1:46f098444d0c 101 "MNO2L16EO3L4C.L16O4CDD#"
paulg 1:46f098444d0c 102 "ECDL8EL16O3BO4MSL8D"
paulg 1:46f098444d0c 103 "MNCL16O3MLEGO4MSL8CMNL16CD"
paulg 1:46f098444d0c 104 "ECDL8EL16CDC"
paulg 1:46f098444d0c 105 "ECDL8EL16CDC"
paulg 1:46f098444d0c 106 "ECDL8EL16O3BO4L8MSDMN"
paulg 1:46f098444d0c 107 "L5MLC.MNL16O3EFF#"
paulg 1:46f098444d0c 108 ""
paulg 1:46f098444d0c 109 "O3L8MSGMNL16AL8GL16EFF#"
paulg 1:46f098444d0c 110 "MSL8GMNL16AL8GL16MSECO2G"
paulg 1:46f098444d0c 111 "MLL16ABO3CDEDCD"
paulg 1:46f098444d0c 112 "MNO2GMLO3EFGAGEMNF"
paulg 1:46f098444d0c 113 "L8MSGMNL16AL8GL16EFF#"
paulg 1:46f098444d0c 114 "L8MSGMNL16AL8GL16GAA#"
paulg 1:46f098444d0c 115 "BL8BL16L8BL16AF#D"
paulg 1:46f098444d0c 116 "L5MLG.MNL16EFF#"
paulg 1:46f098444d0c 117 "MSL8GMNL16AL8GL16EFF#"
paulg 1:46f098444d0c 118 "L8MSGMNL16AL8GL16MLECO3MNG"
paulg 1:46f098444d0c 119 "MLABO4CDEDCD"
paulg 1:46f098444d0c 120 "MSL8MLCL16EGMSO5CO4MNGF#G"
paulg 1:46f098444d0c 121 "MSO5L8CO4MNL16AO5L8CL16O4AO5CO4A"
paulg 1:46f098444d0c 122 "GO5CEL8GL16ECO4G"
paulg 1:46f098444d0c 123 "MSL8AO5CMNL16EL8D"
paulg 1:46f098444d0c 124 "L4C..L16O4EFF#"
paulg 1:46f098444d0c 125 "MSL8GMNL16AL8GL16EFF#"
paulg 1:46f098444d0c 126 "L8GL16AL8GL16MSECO3G"
paulg 1:46f098444d0c 127 "MNABO4CDEDCD"
paulg 1:46f098444d0c 128 "O3GO4EFGAGEF"
paulg 1:46f098444d0c 129 "MSL8GMNL16AL8GL16EFF#"
paulg 1:46f098444d0c 130 "L8GL16AL8GL16GAA#"
paulg 1:46f098444d0c 131 ""
paulg 1:46f098444d0c 132 "BL8BBL16AF#D"
paulg 1:46f098444d0c 133 "MLL64GAGAGAGAGAGAGAGAGL16MNEFF#"
paulg 1:46f098444d0c 134 "L8MSGL16AL8GL16EFF#"
paulg 1:46f098444d0c 135 "L8GL16AL8GL16MSECO3G"
paulg 1:46f098444d0c 136 "MNABO4CDEDCD"
paulg 1:46f098444d0c 137 "MSL8CL16MLEGO5MNCO4GF#G"
paulg 1:46f098444d0c 138 "O5MSL8CO4MNL16AMLO5L8CL16O4AO5"
paulg 1:46f098444d0c 139 "CO4AGO5CEL8GL16ECO4G"
paulg 1:46f098444d0c 140 "L8MSAO5CMNL16EL8DL16MLC"
paulg 1:46f098444d0c 141 "L4CL8C"
paulg 0:41640fc98a43 142 };
paulg 0:41640fc98a43 143
paulg 1:46f098444d0c 144 // The M.GAKKOU KOUKA
paulg 1:46f098444d0c 145 // copyright "Music Composed by Kenkichi Motoi 2009 Wikimedia version 2012"
paulg 0:41640fc98a43 146
paulg 1:46f098444d0c 147 char* preset4 = { //play with sticky shift?
paulg 1:46f098444d0c 148 "T160 O3L4"
paulg 1:46f098444d0c 149 "ED8CE8 GG8ER8 AA8>C<A8 G2R"
paulg 1:46f098444d0c 150 "AA8GA8 >CC8D<R8 EE8DE8 C2R"
paulg 1:46f098444d0c 151 "DD8DD8 DD8DR8 ED8EF8 G2R"
paulg 1:46f098444d0c 152 "AA8GA8 >CC8<AR8 >DC8DE8 D2<R"
paulg 1:46f098444d0c 153 ">EE8DC8< AB8>CC8< GG8EA8 G2R"
paulg 1:46f098444d0c 154 ">CC8<GE8 CD8EA8 GG8DE8 C2R"
paulg 0:41640fc98a43 155 };
paulg 0:41640fc98a43 156
paulg 0:41640fc98a43 157 int main()
paulg 0:41640fc98a43 158 {
paulg 1:46f098444d0c 159 char buf[40];
paulg 0:41640fc98a43 160 int i, n;
paulg 1:46f098444d0c 161 Timer t;
paulg 0:41640fc98a43 162
paulg 1:46f098444d0c 163 pc.printf("\nPWM Sound Demo 8, %s %s\n", __DATE__, __TIME__);
paulg 1:46f098444d0c 164 mySpeaker.play(DOODLY);
paulg 0:41640fc98a43 165
paulg 0:41640fc98a43 166 while(1) {
paulg 1:46f098444d0c 167 pc.printf("Enter command (? for help): ");
paulg 1:46f098444d0c 168 n = pc.getc();
paulg 1:46f098444d0c 169 pc.printf("%c", n);
paulg 1:46f098444d0c 170 if (n == '?') {
paulg 1:46f098444d0c 171 pc.printf("\n");
paulg 1:46f098444d0c 172 printHelps();
paulg 1:46f098444d0c 173 } else if (n =='0') {
paulg 0:41640fc98a43 174 mySpeaker.siren(0);
paulg 1:46f098444d0c 175 } else if (n == '1') {
paulg 0:41640fc98a43 176 i = pc.getc() - '0';
paulg 0:41640fc98a43 177 pc.printf("%d", i);
paulg 1:46f098444d0c 178 mySpeaker.play(YAY);
paulg 1:46f098444d0c 179 } else if (n == '2') {
paulg 1:46f098444d0c 180 i = pc.getc() - '0';
paulg 1:46f098444d0c 181 pc.printf("%d", i);
paulg 1:46f098444d0c 182 mySpeaker.play(WAH);
paulg 1:46f098444d0c 183 } else if (n == '3') {
paulg 0:41640fc98a43 184 i = pc.getc() - '0';
paulg 0:41640fc98a43 185 pc.printf("%d", i);
paulg 0:41640fc98a43 186 mySpeaker.trill(i);
paulg 1:46f098444d0c 187 } else if (n == '4') {
paulg 0:41640fc98a43 188 i = pc.getc() - '0';
paulg 0:41640fc98a43 189 pc.printf("%d", i);
paulg 0:41640fc98a43 190 mySpeaker.phone(i);
paulg 1:46f098444d0c 191 } else if (n == '5') {
paulg 0:41640fc98a43 192 i = pc.getc() - '0';
paulg 0:41640fc98a43 193 pc.printf("%d", i);
paulg 0:41640fc98a43 194 mySpeaker.bip(i);
paulg 1:46f098444d0c 195 wait(1);
paulg 1:46f098444d0c 196 mySpeaker.bop(i);
paulg 1:46f098444d0c 197 } else if (n == '6') {
paulg 1:46f098444d0c 198 i = pc.getc() - '0';
paulg 1:46f098444d0c 199 pc.printf("%d", i);
paulg 1:46f098444d0c 200 mySpeaker.bop(i);
paulg 1:46f098444d0c 201 wait(1);
paulg 1:46f098444d0c 202 mySpeaker.bop(i);
paulg 1:46f098444d0c 203 } else if (n == '7') {
paulg 0:41640fc98a43 204 i = pc.getc() - '0';
paulg 0:41640fc98a43 205 pc.printf("%d", i);
paulg 0:41640fc98a43 206 mySpeaker.beep(i);
paulg 1:46f098444d0c 207 } else if (n == '8') {
paulg 0:41640fc98a43 208 i = pc.getc() - '0';
paulg 0:41640fc98a43 209 pc.printf("%d", i);
paulg 0:41640fc98a43 210 mySpeaker.bleep(i);
paulg 1:46f098444d0c 211 } else if (n =='9') {
paulg 0:41640fc98a43 212 i = pc.getc() - '0';
paulg 0:41640fc98a43 213 pc.printf("%d", i);
paulg 0:41640fc98a43 214 mySpeaker.buzz(i);
paulg 1:46f098444d0c 215 } else if (n == '=') { //press = to stop a continuous sound
paulg 0:41640fc98a43 216 mySpeaker.stop();
paulg 1:46f098444d0c 217 } else if (n == 'm') { //press m for SMB theme
paulg 1:46f098444d0c 218 mySpeaker.play(smb);
paulg 1:46f098444d0c 219 } else if (n == 'p') { //press pn to play a tune in MML format
paulg 1:46f098444d0c 220 i = pc.getc() - '0';
paulg 1:46f098444d0c 221 pc.printf("%d", i);
paulg 1:46f098444d0c 222 if (i == 0) {
paulg 1:46f098444d0c 223 n = mySpeaker.play(preset0);
paulg 1:46f098444d0c 224 } else if (i == 1) {
paulg 1:46f098444d0c 225 n = mySpeaker.play(preset1);
paulg 1:46f098444d0c 226 } else if (i == 2) {
paulg 1:46f098444d0c 227 n = mySpeaker.play(preset2);
paulg 1:46f098444d0c 228 } else if (i == 3) {
paulg 1:46f098444d0c 229 n = mySpeaker.play(preset3);
paulg 1:46f098444d0c 230 } else if (i == 4) {
paulg 1:46f098444d0c 231 n = mySpeaker.play(preset4, 0);
paulg 1:46f098444d0c 232 } else if (i == 5) {
paulg 1:46f098444d0c 233 n = mySpeaker.play(preset4, 1);
paulg 1:46f098444d0c 234 } else if (i == 6) {
paulg 1:46f098444d0c 235 n = mySpeaker.play(preset4, 2);
paulg 1:46f098444d0c 236 } else if (i == 7) {
paulg 1:46f098444d0c 237 n = mySpeaker.play(preset4, 3);
paulg 1:46f098444d0c 238 }
paulg 1:46f098444d0c 239 if (n > 0) {
paulg 1:46f098444d0c 240 pc.printf(" ??input error at char %d", n);
paulg 1:46f098444d0c 241 }
paulg 1:46f098444d0c 242 } else if (n == 'q') { //play quick tune
paulg 1:46f098444d0c 243 scanf("%39s", buf);
paulg 1:46f098444d0c 244 pc.printf("%s", buf);
paulg 1:46f098444d0c 245 n = mySpeaker.play(buf);
paulg 1:46f098444d0c 246 if (n > 0) {
paulg 1:46f098444d0c 247 pc.printf(" ??input error at char %d", n);
paulg 1:46f098444d0c 248 }
paulg 1:46f098444d0c 249 } else if (n == 't') { //press tn to set timbre
paulg 1:46f098444d0c 250 i = pc.getc() - '0';
paulg 1:46f098444d0c 251 pc.printf("%d", i);
paulg 1:46f098444d0c 252 mySpeaker.timbre(i);
paulg 1:46f098444d0c 253 } else if (n == 'z') { //press z to time tone() call
paulg 1:46f098444d0c 254 t.reset();
paulg 1:46f098444d0c 255 t.start();
paulg 1:46f098444d0c 256 for (int i = 0; i < 1000000; i++) {
paulg 1:46f098444d0c 257 mySpeaker.tone(440.0, 0.0);
paulg 1:46f098444d0c 258 }
paulg 1:46f098444d0c 259 t.stop();
paulg 1:46f098444d0c 260 pc.printf("<1 millon calls took %f seconds>", t.read());
paulg 0:41640fc98a43 261 } else {
paulg 0:41640fc98a43 262 badArgs();
paulg 0:41640fc98a43 263 }
paulg 0:41640fc98a43 264 pc.printf("\n");
paulg 0:41640fc98a43 265 } //end of while
paulg 0:41640fc98a43 266 }
paulg 0:41640fc98a43 267
paulg 1:46f098444d0c 268 void printHelps(void) {
paulg 1:46f098444d0c 269 pc.printf("0 Two-tone (police siren) in background (press = to stop)\n");
paulg 1:46f098444d0c 270 pc.printf("1x Yay (success) x times\n");
paulg 1:46f098444d0c 271 pc.printf("2x Wah (failure) x times\n");
paulg 1:46f098444d0c 272 pc.printf("3x Trill x times (0 = continuous in background)\n");
paulg 1:46f098444d0c 273 pc.printf("4x Phone x times\n");
paulg 1:46f098444d0c 274 pc.printf("5 Bip x times (0 = continuous in background)\n");
paulg 1:46f098444d0c 275 pc.printf("6x Bop x times (0 = continuous in background)\n");
paulg 1:46f098444d0c 276 pc.printf("7x Beep x times (0 = continuous in background)\n");
paulg 1:46f098444d0c 277 pc.printf("8x Bleep x times (0 = continuous in background)\n");
paulg 1:46f098444d0c 278 pc.printf("9x Buzz x times (0 = continuous in background)\n");
paulg 1:46f098444d0c 279 pc.printf("= Stop background sound or music\n");
paulg 1:46f098444d0c 280 pc.printf("m Super Mario Brothers theme\n");
paulg 1:46f098444d0c 281 pc.printf("px Play preset tune x in MML format (x = 0-7)\n");
paulg 1:46f098444d0c 282 pc.printf("q abc Play quick tune as entered on the command line\n");
paulg 1:46f098444d0c 283 pc.printf("tx Set timbre (x = 1-4)\n");
paulg 1:46f098444d0c 284 }
paulg 1:46f098444d0c 285
paulg 0:41640fc98a43 286 //************************
paulg 0:41640fc98a43 287 // Miscellaneous functions
paulg 0:41640fc98a43 288 //************************
paulg 0:41640fc98a43 289
paulg 0:41640fc98a43 290 void badArgs(void) {
paulg 0:41640fc98a43 291 pc.printf("?? Bad arguments\n");
paulg 0:41640fc98a43 292 }
paulg 0:41640fc98a43 293
paulg 0:41640fc98a43 294 void nyi(void) {
paulg 0:41640fc98a43 295 pc.printf("!! Not yet implemented\n");
paulg 0:41640fc98a43 296 }
paulg 0:41640fc98a43 297
paulg 0:41640fc98a43 298 void pause(void)
paulg 0:41640fc98a43 299 {
paulg 0:41640fc98a43 300 pc.printf("Press any key to continue . . .\n");
paulg 0:41640fc98a43 301 pc.getc();
paulg 0:41640fc98a43 302 }
paulg 0:41640fc98a43 303
paulg 1:46f098444d0c 304 //END of main.cpp