Tool for playing 8bit like music on Piezo speaker.

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers PlayTone.cpp Source File

PlayTone.cpp

00001 #include "PlayTone.h"
00002 
00003 PlayTone::PlayTone(PinName PS):_speaker(PS)
00004 {
00005     offset = 0;
00006     
00007     max_BPM = 260;
00008     min_BPM = 40;
00009     
00010     tone[0] = 27.50;
00011     tone[1] = 29.14;
00012     tone[2] = 30.87;
00013     tone[3] = 32.70;    
00014     tone[4] = 34.65;   
00015     tone[5] = 36.71;  
00016     tone[6] = 38.89; 
00017     tone[7] = 41.20;
00018     tone[8] = 43.65;
00019     tone[9] = 46.25;
00020     tone[10] = 49.00;
00021     tone[11] = 51.91;
00022     tone[12] = 55.00;
00023     tone[13] = 58.27;
00024     tone[14] = 61.74;
00025     tone[15] = 65.41;
00026     tone[16] = 69.30;
00027     tone[17] = 73.42;
00028     tone[18] = 77.78;
00029     tone[19] = 82.41;
00030     tone[20] = 87.31;
00031     tone[21] = 92.50;
00032     tone[22] = 98.00;
00033     tone[23] = 103.83;
00034     tone[24] = 110.00;
00035     tone[25] = 116.54;
00036     tone[26] = 123.47;
00037     tone[27] = 130.81;
00038     tone[28] = 138.59;
00039     tone[29] = 146.83;
00040     tone[30] = 155.56;
00041     tone[31] = 164.81;
00042     tone[32] = 174.61;
00043     tone[33] = 185.00;
00044     tone[34] = 196.00;
00045     tone[35] = 207.65,
00046     tone[36] = 220.00;
00047     tone[37] = 233.08;
00048     tone[38] = 246.94;
00049     tone[39] = 261.63;
00050     tone[40] = 277.18;
00051     tone[41] = 293.66;
00052     tone[42] = 311.13;
00053     tone[43] = 329.63;
00054     tone[44] = 349.23;
00055     tone[45] = 369.99;
00056     tone[46] = 392.00;
00057     tone[47] = 415.30,
00058     tone[48] = 440.00;
00059     tone[49] = 466.16;
00060     tone[50] = 493.88;
00061     tone[51] = 523.25;
00062     tone[52] = 554.37;
00063     tone[53] = 587.33;
00064     tone[54] = 622.25;
00065     tone[55] = 659.26;
00066     tone[56] = 698.46;
00067     tone[57] = 739.99;
00068     tone[58] = 783.99;
00069     tone[59] = 830.61,
00070     tone[60] = 880.00;
00071     tone[61] = 932.33;
00072     tone[62] = 987.77;
00073     tone[63] = 1046.50;
00074     tone[64] = 1108.73;
00075     tone[65] = 1174.66;
00076     tone[66] = 1244.51;
00077     tone[67] = 1318.51;
00078     tone[68] = 1396.91;
00079     tone[69] = 1479.98;
00080     tone[70] = 1567.98;
00081     tone[71] = 1661.22,
00082     tone[72] = 1760.00;
00083     tone[73] = 1864.66;
00084     tone[74] = 1975.53;
00085     tone[75] = 2093.00;
00086     tone[76] = 2217.46;
00087     tone[77] = 2349.32;
00088     tone[78] = 2489.02;
00089     tone[79] = 2637.02;
00090     tone[80] = 2793.83;
00091     tone[81] = 2959.96;
00092     tone[82] = 3135.96;
00093     tone[83] = 3322.44;
00094     tone[84] = 3520.00;
00095 }
00096 
00097 void PlayTone::playTone(int ind, float value)
00098 {
00099     int pos = ind+offset;
00100     
00101     pos = (pos<0)? 0 : pos;
00102     pos = (pos>84)? 84 : pos;
00103     
00104     _speaker.play(tone[pos], _bpm_ms*value);
00105 }
00106 
00107 void PlayTone::playStaccato(int ind, float value)
00108 {
00109     int pos = ind+offset;
00110     
00111     pos = (pos<0)? 0 : pos;
00112     pos = (pos>84)? 84 : pos;
00113     
00114     _speaker.play(tone[pos], _bpm_ms*_duty);
00115     int rest = _bpm_ms*float(value - _duty);
00116     wait_ms(rest);
00117 }
00118 
00119 void PlayTone::silence(float value)
00120 {
00121     wait_ms(_bpm_ms*value);
00122 }
00123 
00124 void PlayTone::stop()
00125 {
00126     _speaker.stop();
00127 }
00128 
00129 void PlayTone::transpose(int level)
00130 {
00131     offset = level;
00132 }
00133 
00134 void PlayTone::playSequence(int sequence_length, int notes[], float values[])
00135 {
00136     for(int i=0; i< sequence_length; i++)
00137     {
00138         if(notes[i] > 1)
00139             playTone(notes[i],values[i]);
00140         else
00141             silence(values[i]);
00142     }
00143 }
00144 
00145 void PlayTone::playSequence(int sequence_length, Note notes[])
00146 {
00147     for(int i=0; i< sequence_length; i++)
00148     {
00149         if(notes[i].idx > 1)
00150             playTone(notes[i].idx,notes[i].value);
00151         else
00152             silence(notes[i].value);
00153     }
00154 }
00155 
00156 void PlayTone::playStaccatoSequence(int sequence_length, int notes[], float values[])
00157 {
00158     for(int i=0; i< sequence_length; i++)
00159     {
00160         if(notes[i] > 0)
00161             playStaccato(notes[i],values[i]);
00162         else
00163             silence(values[i]);
00164     }
00165 }
00166 
00167 void PlayTone::playStaccatoSequence(int sequence_length, Note notes[])
00168 {
00169     for(int i=0; i< sequence_length; i++)
00170     {
00171         if(notes[i].idx > 0)
00172             playStaccato(notes[i].idx,notes[i].value);
00173         else
00174             silence(notes[i].value);
00175     }
00176 }
00177 
00178 int PlayTone::setBPM(int Bpm)
00179 {
00180     _bpm = (Bpm < min_BPM)? min_BPM : Bpm;
00181     _bpm = (Bpm > max_BPM)? max_BPM : Bpm;
00182     
00183     _bpm_ms = 60*1000/_bpm;
00184     
00185     return int(_bpm_ms);
00186 }
00187 
00188 void PlayTone::setStaccatoDuty(float duty)
00189 {
00190     _duty = (duty > 1)? 1 : duty;
00191     _duty = (duty < 0)? 0 : duty;
00192 }