This is a simple sound library for mbed. This sound library uses a Ticker to simulate a 50% duty cycle pwm signal on any pin. The frequency of this signal can be varied to allow sound to be created by any piezoelectric device that is connected to that pin.

Dependents:   SuperMbedBall Tono

About

This library allows for a buzzer (or piezoelectric device) to output sound based on any inputted frequency. The library provides predefined note frequencies which make song writing convenient. These definitions can be found here. Some pins may not be able to drive output such as the AnalogIn pins on the LPC11U24 model. Only pin 21 seemed to work well so far on this model.

Hardware

One wire from a buzzer is connected to any pin on the mbed and the other wire is connected directly to ground. To reduce the volume of the buzzer, an optional resistor can be connected in series as shown. /media/uploads/mdu7078/buzzer001.png

Circuit diagram constructed using CircuitLab.

Usage

A music object is constructed in the following way:

Constructor

#include "Music.h"

music ms(p21);

This code snipped attaches a frequency modulating Ticker to the specified pin.

This frequency can be modified by setting:

Frequency

ms.freq(240);

To allow more complex behavior, a parsing function is included that can take in strings of formatted input and turn them into songs. This input must be formatted as specified below:

  • A capital letter must be present to specify the note, or R to specify a rest (Only letters A-G, and R are valid)
  • An octave must be specified which is any integer from 0 to 8 inclusive
  • An optional sharp sign ( # ) can be added to augment the note a half step
  • A colon ( : ) must separate the octave and note from the duration
  • The duration must be an integer greater than 0, and less than or equal to 64
  • To separate notes, a semicolon ( ; ) must be used

Furthermore, the length of the string must be specified in order for the entire string to be parsed and a tempo must be provided (beats per minute). An example of this is shown below:

Play a Song

/* This is a test song */
char s1[] = "E4:8; E4:8; R:8; E4:8; R:8; C4:8; E4:4; G4:4; R:4; G3:4; R:4;";
int len = 61;

/* Set up music pin on pin 21 */
music m1(p21);
double tempo = 180;

m1.play(s1,tempo,len);

This code plays the familiar 7-note opening to the Super Mario Brothers theme song. The possibilities for music creation are limited only by the hard memory limits of the mbed.

Committer:
mdu7078
Date:
Mon Apr 29 03:57:42 2013 +0000
Revision:
0:07a4aa44fe9c
Child:
1:51cf7b1a96bd
First commit of the music library.  Parse function is not yet implemented.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mdu7078 0:07a4aa44fe9c 1 /* * * * * * * * * * * * * * * * * * * * * * * * * * *
mdu7078 0:07a4aa44fe9c 2 * This is a simple music library for the mbed. *
mdu7078 0:07a4aa44fe9c 3 * *
mdu7078 0:07a4aa44fe9c 4 * Created by: Michael Dushkoff (mad1841@rit.edu) *
mdu7078 0:07a4aa44fe9c 5 * * * * * * * * * * * * * * * * * * * * * * * * * * */
mdu7078 0:07a4aa44fe9c 6
mdu7078 0:07a4aa44fe9c 7 #include "mbed.h"
mdu7078 0:07a4aa44fe9c 8 #include "Music.h"
mdu7078 0:07a4aa44fe9c 9
mdu7078 0:07a4aa44fe9c 10 music::music(PinName M0, double freq) : _M0(M0), _freq(freq) { // Defenition of motor pins
mdu7078 0:07a4aa44fe9c 11 _flipper.attach(this,&music::flip,1/(2*_freq));
mdu7078 0:07a4aa44fe9c 12 }
mdu7078 0:07a4aa44fe9c 13
mdu7078 0:07a4aa44fe9c 14 void music::freq(double freq){
mdu7078 0:07a4aa44fe9c 15 _freq=freq;
mdu7078 0:07a4aa44fe9c 16 _flipper.detach();
mdu7078 0:07a4aa44fe9c 17 _flipper.attach(this,&music::flip,1/(2*_freq));
mdu7078 0:07a4aa44fe9c 18 }
mdu7078 0:07a4aa44fe9c 19
mdu7078 0:07a4aa44fe9c 20 void music::flip(){
mdu7078 0:07a4aa44fe9c 21 _M0 = !_M0;
mdu7078 0:07a4aa44fe9c 22 }
mdu7078 0:07a4aa44fe9c 23
mdu7078 0:07a4aa44fe9c 24 /*
mdu7078 0:07a4aa44fe9c 25 * This parses a given character array into an m_song
mdu7078 0:07a4aa44fe9c 26 * Format:
mdu7078 0:07a4aa44fe9c 27 * <note_letter><octave>:<length>, . . .
mdu7078 0:07a4aa44fe9c 28 * Example (Super Mario Bros.):
mdu7078 0:07a4aa44fe9c 29 * E3:8, E3:8, R:8, E3:8, R:8, C3:8, E3:4, G3:4, R:4, G2:4, R:4
mdu7078 0:07a4aa44fe9c 30 *
mdu7078 0:07a4aa44fe9c 31 * song - The song character array
mdu7078 0:07a4aa44fe9c 32 * num - The number of characters in the array
mdu7078 0:07a4aa44fe9c 33 */
mdu7078 0:07a4aa44fe9c 34 m_song music::parse(char* song, int num){
mdu7078 0:07a4aa44fe9c 35 m_song out;
mdu7078 0:07a4aa44fe9c 36
mdu7078 0:07a4aa44fe9c 37
mdu7078 0:07a4aa44fe9c 38 return out;
mdu7078 0:07a4aa44fe9c 39 }
mdu7078 0:07a4aa44fe9c 40
mdu7078 0:07a4aa44fe9c 41 /*
mdu7078 0:07a4aa44fe9c 42 * This plays a given song string at a given tempo
mdu7078 0:07a4aa44fe9c 43 *
mdu7078 0:07a4aa44fe9c 44 * song - The song character array
mdu7078 0:07a4aa44fe9c 45 * tempo - The specified beats per minute
mdu7078 0:07a4aa44fe9c 46 * num - The number of characters in the array
mdu7078 0:07a4aa44fe9c 47 */
mdu7078 0:07a4aa44fe9c 48 void music::play(char* song, double tempo, int num){
mdu7078 0:07a4aa44fe9c 49 double dl;
mdu7078 0:07a4aa44fe9c 50 m_song msng = parse(song, num);
mdu7078 0:07a4aa44fe9c 51
mdu7078 0:07a4aa44fe9c 52 /* Play m_song */
mdu7078 0:07a4aa44fe9c 53 for (int i=0; i<msng.len; i++){
mdu7078 0:07a4aa44fe9c 54 // Output the frequency:
mdu7078 0:07a4aa44fe9c 55 freq(msng.note[i].freq);
mdu7078 0:07a4aa44fe9c 56 // Calculate delay:
mdu7078 0:07a4aa44fe9c 57 dl = 60/(tempo/(msng.note[i].duration));
mdu7078 0:07a4aa44fe9c 58 // Wait for the note to be complete
mdu7078 0:07a4aa44fe9c 59 wait(dl);
mdu7078 0:07a4aa44fe9c 60 }
mdu7078 0:07a4aa44fe9c 61 }