Tool for playing 8bit like music on Piezo speaker.
Embed:
(wiki syntax)
Show/hide line numbers
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 }
Generated on Tue Jul 12 2022 20:54:31 by 1.7.2