March 27, 2011 by iceman1979 Hi, I've been playing around with my nerdkit and the piezo speaker. I was able to program it to play the right hand part of "Music Box Dancer" but when I started looking at the left hand part towards the end of the song there are places where two and three notes are being played at a time. I was wondering if anyone has figured out how to code it to play multiple notes together. Calling the function something like this... play_tone(D5, C5, DUR); Thanks iceman1979, it can be implemented, but it will be much harder then a single note. Let me try to explain. When you play one note with uC, speaker outputs a square wave of certain frequecy, like this ``````___|***|___|***|___|***|___|***|___ `````` when you play a note of a different frequency, speaker plays a different wave ``````_|*|_|*|_|*|_|*|_|*|_ `````` when you play 2 notes on a piano, they form a harmonics (or a disharmony, if you are a bad player), btu essantially what your ear hears is the SUM of two waves: ``````_|*|_|***|_|*|_|***|_|*|_|***|_|*|_|***|_ `````` as you can see it'll be much harder to make uC generate a wave like that. My idea would be to use PWM. Also, you might want to look up some wikipedia articles about addition of waveforms. So here is where I show my ignorance... Wouldn't the low point of the wave be included as well when mixing two frequencies? something like this? ``````___|*|_|***|___|*|_|***|___|*|_|***|___|*|_|***|___ `````` For two notes, you can just connect two pins to the piezo and the speaker will mix them together. For more than two notes, you can calculate the wave form (adding sine waves of different frequencies together) and then there are various methods for converting the waveform into sound. You can use table lookups to make the sine calculations fast. In order of increasing sound quality: A) output 1 or 0 bit depending on whether the waveform is positive or negative. B) use BTc encoding to generate the bits, C) use PWM with 4 to 8 bits of precision, D) use an external DAC.