Multiple sin wave synthesizer. Output on the DA port.
Dependencies: mbed
sintone.cpp@3:6c77b5c7510f, 2019-07-18 (annotated)
- 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?
User | Revision | Line number | New 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 |