Multiple sin wave synthesizer. Output on the DA port.

Dependencies:   mbed

Committer:
titanium
Date:
Thu Jul 18 03:19:56 2019 +0000
Revision:
3:6c77b5c7510f
Parent:
2:82a0131e3c0e
Octaves expanded.; maj7th added.; bugs removed.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
titanium 2:82a0131e3c0e 1 /* sinetone --multiple sin wave generator */
titanium 2:82a0131e3c0e 2 /* copyright Toshihiro Matsui, IISEC, 2018 */
titanium 2:82a0131e3c0e 3 /* Any use/modification/copy of this program is granted to anyone
titanium 2:82a0131e3c0e 4 as long as the above copyright is maintained*/
titanium 2:82a0131e3c0e 5
titanium 0:325b79275f25 6 #include <mbed.h>
titanium 0:325b79275f25 7 #define samplerate 16000
titanium 0:325b79275f25 8 #define MAXFREQS 10
titanium 0:325b79275f25 9
titanium 0:325b79275f25 10 Serial pc(USBTX, USBRX);
titanium 0:325b79275f25 11 Ticker tick1;
titanium 0:325b79275f25 12 PwmOut pwm1(p21);
titanium 0:325b79275f25 13 AnalogOut da1(p18);
titanium 0:325b79275f25 14
titanium 2:82a0131e3c0e 15 // Frequencies of A, A#, B, C, C#, D, D#, E, F, F#, G, G#, totally 12
titanium 3:6c77b5c7510f 16 const int scalefreqs[12*4]={
titanium 3:6c77b5c7510f 17 220, 233, 247, 262, 277, 293, 311, 330, 349, 370, 392, 415,
titanium 3:6c77b5c7510f 18 440, 466,494,523,554,587,622,659,698,740,784,830,
titanium 3:6c77b5c7510f 19 880,932,987,1046,1109,1175,1245,1319,1397,1480,1568,1661,
titanium 3:6c77b5c7510f 20 1760, 1865, 1976, 2093, 2218, 2349, 2489, 2637, 2793, 2960
titanium 3:6c77b5c7510f 21 };
titanium 3:6c77b5c7510f 22 const int chromatics[7]={0,2,3,5,7,8,10};
titanium 0:325b79275f25 23 signed char bytesintab[samplerate];
titanium 0:325b79275f25 24 int freqlist[MAXFREQS];
titanium 0:325b79275f25 25 int seqlist[MAXFREQS]={0};
titanium 0:325b79275f25 26 int maxfreqs=0;
titanium 0:325b79275f25 27
titanium 0:325b79275f25 28 void make_sintab(int count) {
titanium 0:325b79275f25 29 int i;
titanium 0:325b79275f25 30 for (i=0; i<count; i++) {
titanium 0:325b79275f25 31 bytesintab[i]=sin( 2.0 * 3.141592 *((float) i)/((float)samplerate)) *120;
titanium 0:325b79275f25 32 } }
titanium 0:325b79275f25 33
titanium 0:325b79275f25 34 void gentone() {
titanium 0:325b79275f25 35 float outval=0;
titanium 0:325b79275f25 36 int i;
titanium 0:325b79275f25 37 for (i=0; i<maxfreqs; i++) {
titanium 0:325b79275f25 38 outval += bytesintab[seqlist[i]];
titanium 0:325b79275f25 39 seqlist[i] += freqlist[i];
titanium 2:82a0131e3c0e 40 seqlist[i] = seqlist[i] % samplerate; //wrap around at 160000
titanium 0:325b79275f25 41 }
titanium 0:325b79275f25 42 da1.write((outval/(256.0*maxfreqs))+0.5); }
titanium 0:325b79275f25 43
titanium 0:325b79275f25 44 void setfreq(const int tone, const int scale) {
titanium 0:325b79275f25 45 freqlist[tone]=scalefreqs[scale];
titanium 0:325b79275f25 46 seqlist[tone]=0; }
titanium 0:325b79275f25 47
titanium 0:325b79275f25 48 main() {
titanium 3:6c77b5c7510f 49 int ch, chord=0, base=0, sharp=0, tone=0, i;
titanium 0:325b79275f25 50 make_sintab(samplerate); setfreq(0,0); maxfreqs=1;
titanium 0:325b79275f25 51 tick1.attach(&gentone, 1.0/(float)samplerate);
titanium 0:325b79275f25 52 while (1) {
titanium 1:516ea1ca7abb 53 ch=pc.getc();
titanium 3:6c77b5c7510f 54 /* 1..7 changes chord (major, minor, 7th, maj7)*/
titanium 2:82a0131e3c0e 55 /* a..l changes the base */
titanium 3:6c77b5c7510f 56 /* # changes to sharp, % changes to flat (plain) ab*/
titanium 3:6c77b5c7510f 57 if ('a'<=ch && ch<='u') {
titanium 3:6c77b5c7510f 58 if (ch<='g') base=0;
titanium 3:6c77b5c7510f 59 else if (ch<='n') { base=1; ch=ch-7;}
titanium 3:6c77b5c7510f 60 else { base=2; ch=ch-14;}
titanium 3:6c77b5c7510f 61 tone=chromatics[ch-'a']+base*12+sharp;
titanium 3:6c77b5c7510f 62 setfreq(0, tone);
titanium 0:325b79275f25 63 if (chord<=1) maxfreqs=1;
titanium 3:6c77b5c7510f 64 else if (chord==2) { setfreq(1, tone+7); maxfreqs=2;} /*add 5th*/
titanium 3:6c77b5c7510f 65 if (chord==3) { setfreq(1, tone+4); setfreq(2, tone+7); maxfreqs=3;} /*add major 3rd*/
titanium 3:6c77b5c7510f 66 if (chord==5) { setfreq(1, tone+3); setfreq(2, tone+7); maxfreqs=3;} /*add minor 3rd*/
titanium 3:6c77b5c7510f 67 if (chord==7) { setfreq(1, tone+4); setfreq(2, tone+7); setfreq(3, tone+10); maxfreqs=4; }/*7th*/
titanium 3:6c77b5c7510f 68 if (chord==8) { setfreq(1, tone+4); setfreq(2, tone+7); setfreq(3, tone+11); maxfreqs=4; }/*maj7th*/
titanium 0:325b79275f25 69 }
titanium 3:6c77b5c7510f 70 if ('1'<=ch && ch<='8') chord=ch-'0';
titanium 3:6c77b5c7510f 71 if (ch=='#') sharp=1;
titanium 3:6c77b5c7510f 72 if (ch=='%') sharp=0;
titanium 3:6c77b5c7510f 73 pc.printf("octave=%d tone=%c%c chord=%d freqs=", base, ch, (sharp?'#':' '), chord);
titanium 3:6c77b5c7510f 74 for (i=0; i<maxfreqs; i++) pc.printf("%d ", freqlist[i]);
titanium 3:6c77b5c7510f 75 pc.printf("\r\n");}
titanium 0:325b79275f25 76 };
titanium 0:325b79275f25 77
titanium 0:325b79275f25 78