Quick and horrible speech engine
main.cpp@14:f25c2f72b2aa, 2018-12-01 (annotated)
- Committer:
- spinal
- Date:
- Sat Dec 01 13:57:52 2018 +0000
- Revision:
- 14:f25c2f72b2aa
- Parent:
- 13:0333e08d59e6
- Child:
- 15:bad48ea4468b
Quick and horrible speech engine
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
spinal | 14:f25c2f72b2aa | 1 | /* |
spinal | 14:f25c2f72b2aa | 2 | Shamelessly stole the samples from a Qbasic speech engine... |
spinal | 14:f25c2f72b2aa | 3 | |
spinal | 14:f25c2f72b2aa | 4 | 'BASIC speech engine 2.0 by Steven M |
spinal | 14:f25c2f72b2aa | 5 | 'StevenM86aol.com |
spinal | 14:f25c2f72b2aa | 6 | 'http://members.aol.com/StevenM86/ |
spinal | 14:f25c2f72b2aa | 7 | ' |
spinal | 14:f25c2f72b2aa | 8 | |
spinal | 14:f25c2f72b2aa | 9 | */ |
spinal | 14:f25c2f72b2aa | 10 | |
Pokitto | 0:2d2a3994d55d | 11 | #include "Pokitto.h" |
spinal | 13:0333e08d59e6 | 12 | #include "HWSound.h" |
spinal | 13:0333e08d59e6 | 13 | #include "speak.h" |
spinal | 13:0333e08d59e6 | 14 | #include "music.h" |
Pokitto | 0:2d2a3994d55d | 15 | |
Pokitto | 0:2d2a3994d55d | 16 | Pokitto::Core mygame; |
spinal | 12:37d999e445ad | 17 | Pokitto::Display d; |
Pokitto | 0:2d2a3994d55d | 18 | |
spinal | 12:37d999e445ad | 19 | |
spinal | 13:0333e08d59e6 | 20 | typedef struct{ |
spinal | 13:0333e08d59e6 | 21 | bool playSample; |
spinal | 13:0333e08d59e6 | 22 | int soundPoint; |
spinal | 13:0333e08d59e6 | 23 | const uint8_t *currentSound; |
spinal | 13:0333e08d59e6 | 24 | int currentSoundSize; |
spinal | 13:0333e08d59e6 | 25 | int volume; |
spinal | 13:0333e08d59e6 | 26 | int speed; |
spinal | 13:0333e08d59e6 | 27 | } sampletype; |
spinal | 12:37d999e445ad | 28 | |
spinal | 13:0333e08d59e6 | 29 | sampletype snd[10]; // up to 10 sounds at once? |
spinal | 13:0333e08d59e6 | 30 | int oldQuart; |
spinal | 13:0333e08d59e6 | 31 | |
spinal | 13:0333e08d59e6 | 32 | Ticker sounder; |
spinal | 13:0333e08d59e6 | 33 | char myWord[] = "testing Wan tu HrE for fIv "; |
spinal | 12:37d999e445ad | 34 | |
spinal | 11:a573cacdc078 | 35 | |
spinal | 13:0333e08d59e6 | 36 | void emptyBuffer(){ |
spinal | 13:0333e08d59e6 | 37 | for(int t=0; t<SBUFSIZE;){ |
spinal | 13:0333e08d59e6 | 38 | soundbuf[++t]=0; |
spinal | 12:37d999e445ad | 39 | } |
spinal | 12:37d999e445ad | 40 | |
spinal | 13:0333e08d59e6 | 41 | for(int t=0; t<10; t++){ |
spinal | 13:0333e08d59e6 | 42 | snd[t].playSample=0; |
spinal | 12:37d999e445ad | 43 | } |
spinal | 12:37d999e445ad | 44 | |
spinal | 13:0333e08d59e6 | 45 | } |
spinal | 13:0333e08d59e6 | 46 | |
spinal | 13:0333e08d59e6 | 47 | uint8_t playSound(const unsigned char *sound, uint16_t soundSize, int volume = 255, int speed=255){ |
spinal | 13:0333e08d59e6 | 48 | |
spinal | 13:0333e08d59e6 | 49 | int channel=0; |
spinal | 13:0333e08d59e6 | 50 | |
spinal | 13:0333e08d59e6 | 51 | snd[channel].currentSound = sound; |
spinal | 13:0333e08d59e6 | 52 | snd[channel].currentSoundSize = (soundSize*255)/speed; |
spinal | 13:0333e08d59e6 | 53 | snd[channel].soundPoint = 0; |
spinal | 13:0333e08d59e6 | 54 | snd[channel].playSample = 1; |
spinal | 13:0333e08d59e6 | 55 | snd[channel].volume = volume; |
spinal | 13:0333e08d59e6 | 56 | snd[channel].speed = speed; |
spinal | 13:0333e08d59e6 | 57 | |
spinal | 13:0333e08d59e6 | 58 | return channel; |
spinal | 13:0333e08d59e6 | 59 | } |
spinal | 13:0333e08d59e6 | 60 | |
spinal | 13:0333e08d59e6 | 61 | uint8_t mixSound(int samplePos) |
spinal | 13:0333e08d59e6 | 62 | { |
spinal | 13:0333e08d59e6 | 63 | int temp = 0; |
spinal | 13:0333e08d59e6 | 64 | int t=0; |
spinal | 13:0333e08d59e6 | 65 | if(snd[t].playSample!=0){ |
spinal | 13:0333e08d59e6 | 66 | int currentSample = (snd[t].currentSound[(snd[t].soundPoint*snd[t].speed)>>8]); |
spinal | 13:0333e08d59e6 | 67 | temp = currentSample; |
spinal | 13:0333e08d59e6 | 68 | } |
spinal | 13:0333e08d59e6 | 69 | return temp; |
spinal | 13:0333e08d59e6 | 70 | } |
spinal | 12:37d999e445ad | 71 | |
spinal | 12:37d999e445ad | 72 | |
spinal | 13:0333e08d59e6 | 73 | void updateSample(){ |
spinal | 13:0333e08d59e6 | 74 | |
spinal | 13:0333e08d59e6 | 75 | int quart = soundbufindex / 512; |
spinal | 13:0333e08d59e6 | 76 | int sndOffset[]={512,1024,1536,0}; |
spinal | 12:37d999e445ad | 77 | |
spinal | 13:0333e08d59e6 | 78 | if(oldQuart != quart){ |
spinal | 13:0333e08d59e6 | 79 | oldQuart = quart; |
spinal | 13:0333e08d59e6 | 80 | for(int t=0; t<=SBUFSIZE/4;){ |
spinal | 13:0333e08d59e6 | 81 | soundbuf[t+sndOffset[quart]] = 127; |
spinal | 13:0333e08d59e6 | 82 | uint8_t sample = mixSound(t); |
spinal | 13:0333e08d59e6 | 83 | int s=0; |
spinal | 13:0333e08d59e6 | 84 | if(snd[s].playSample!=0){ |
spinal | 13:0333e08d59e6 | 85 | soundbuf[t+sndOffset[quart]] = sample; |
spinal | 13:0333e08d59e6 | 86 | } |
spinal | 13:0333e08d59e6 | 87 | //for(int s=0; s<10; s++){ |
spinal | 13:0333e08d59e6 | 88 | ++snd[s].soundPoint; |
spinal | 13:0333e08d59e6 | 89 | if(snd[s].soundPoint >= snd[s].currentSoundSize){ |
spinal | 13:0333e08d59e6 | 90 | snd[s].playSample=0; |
spinal | 13:0333e08d59e6 | 91 | } |
spinal | 13:0333e08d59e6 | 92 | //} |
spinal | 13:0333e08d59e6 | 93 | t++; |
spinal | 13:0333e08d59e6 | 94 | } |
spinal | 13:0333e08d59e6 | 95 | } |
spinal | 13:0333e08d59e6 | 96 | } |
spinal | 12:37d999e445ad | 97 | |
spinal | 12:37d999e445ad | 98 | |
spinal | 12:37d999e445ad | 99 | |
spinal | 12:37d999e445ad | 100 | int main () |
spinal | 12:37d999e445ad | 101 | { |
spinal | 12:37d999e445ad | 102 | mygame.begin(); |
spinal | 13:0333e08d59e6 | 103 | pokPlayStream(); |
spinal | 13:0333e08d59e6 | 104 | emptyBuffer(); // clear the sound buffer |
spinal | 12:37d999e445ad | 105 | |
spinal | 13:0333e08d59e6 | 106 | sounder.attach(&updateSample, 0.0001); |
spinal | 12:37d999e445ad | 107 | |
spinal | 13:0333e08d59e6 | 108 | // playSound(rawData, sizeof(rawData)); |
spinal | 11:a573cacdc078 | 109 | |
spinal | 13:0333e08d59e6 | 110 | int letter=0; |
spinal | 12:37d999e445ad | 111 | while (mygame.isRunning()) |
spinal | 12:37d999e445ad | 112 | { |
spinal | 12:37d999e445ad | 113 | if (mygame.update()) |
spinal | 12:37d999e445ad | 114 | { |
spinal | 13:0333e08d59e6 | 115 | // update buttons |
spinal | 12:37d999e445ad | 116 | |
spinal | 13:0333e08d59e6 | 117 | if(snd[0].playSample == 0){ |
spinal | 13:0333e08d59e6 | 118 | int toPlay = myWord[letter]; |
spinal | 13:0333e08d59e6 | 119 | |
spinal | 13:0333e08d59e6 | 120 | if(toPlay < 97 || toPlay > 97+25){ |
spinal | 13:0333e08d59e6 | 121 | toPlay='0'; |
spinal | 13:0333e08d59e6 | 122 | } |
spinal | 13:0333e08d59e6 | 123 | |
spinal | 13:0333e08d59e6 | 124 | if(toPlay>=97 && toPlay <=122){ |
spinal | 13:0333e08d59e6 | 125 | int start = sndPos[toPlay-97]; |
spinal | 13:0333e08d59e6 | 126 | int size = sndSize[toPlay-97]; |
spinal | 13:0333e08d59e6 | 127 | playSound(&ABC[start], size); |
spinal | 13:0333e08d59e6 | 128 | } |
spinal | 12:37d999e445ad | 129 | |
spinal | 13:0333e08d59e6 | 130 | if(toPlay>=65 && toPlay <=90){ |
spinal | 13:0333e08d59e6 | 131 | int start = sndPos[toPlay-65+26]; |
spinal | 13:0333e08d59e6 | 132 | int size = sndSize[toPlay-65+26]; |
spinal | 13:0333e08d59e6 | 133 | playSound(&ABC[start], size); |
spinal | 13:0333e08d59e6 | 134 | } |
spinal | 13:0333e08d59e6 | 135 | |
spinal | 13:0333e08d59e6 | 136 | if(toPlay>=48 && toPlay <=57){ |
spinal | 13:0333e08d59e6 | 137 | int start = sndPos[toPlay-48+52]; |
spinal | 13:0333e08d59e6 | 138 | int size = sndSize[toPlay-48+52]; |
spinal | 13:0333e08d59e6 | 139 | playSound(&ABC[start], size); |
spinal | 13:0333e08d59e6 | 140 | } |
spinal | 13:0333e08d59e6 | 141 | |
spinal | 13:0333e08d59e6 | 142 | if(++letter==sizeof(myWord))letter=0; |
spinal | 12:37d999e445ad | 143 | } |
spinal | 12:37d999e445ad | 144 | |
spinal | 13:0333e08d59e6 | 145 | |
spinal | 12:37d999e445ad | 146 | |
spinal | 12:37d999e445ad | 147 | } |
spinal | 12:37d999e445ad | 148 | } |
spinal | 11:a573cacdc078 | 149 | } |
spinal | 11:a573cacdc078 | 150 | |
spinal | 11:a573cacdc078 | 151 | |
spinal | 13:0333e08d59e6 | 152 | /* |
spinal | 13:0333e08d59e6 | 153 | |
spinal | 13:0333e08d59e6 | 154 | The sound codes are: |
spinal | 13:0333e08d59e6 | 155 | A as in bAnanA: a |
spinal | 13:0333e08d59e6 | 156 | A as in mAp: A |
spinal | 13:0333e08d59e6 | 157 | A as in bOther: 1 |
spinal | 13:0333e08d59e6 | 158 | Ay as in dAY: 2 |
spinal | 13:0333e08d59e6 | 159 | A as in bAd: 3 |
spinal | 13:0333e08d59e6 | 160 | Aw as in nOW: 4 |
spinal | 13:0333e08d59e6 | 161 | Aw as in sAW: 5 |
spinal | 13:0333e08d59e6 | 162 | B as in BaBy: b |
spinal | 13:0333e08d59e6 | 163 | Ch as in CHin: c |
spinal | 13:0333e08d59e6 | 164 | D as in unDone: d |
spinal | 13:0333e08d59e6 | 165 | E as in bEt: e |
spinal | 13:0333e08d59e6 | 166 | Ea as in bEAt: E |
spinal | 13:0333e08d59e6 | 167 | F as in FiFty: f |
spinal | 13:0333e08d59e6 | 168 | G as in Go: g |
spinal | 13:0333e08d59e6 | 169 | G as in Gem: G |
spinal | 13:0333e08d59e6 | 170 | H as in Hat: h |
spinal | 13:0333e08d59e6 | 171 | I as in tIp: i |
spinal | 13:0333e08d59e6 | 172 | I as in bUY: I |
spinal | 13:0333e08d59e6 | 173 | Ir as in bIRd: j |
spinal | 13:0333e08d59e6 | 174 | K as in CooK: k |
spinal | 13:0333e08d59e6 | 175 | L as in pooL: l |
spinal | 13:0333e08d59e6 | 176 | M as in diM: m |
spinal | 13:0333e08d59e6 | 177 | N as in No: n |
spinal | 13:0333e08d59e6 | 178 | Ng as in siNG: N |
spinal | 13:0333e08d59e6 | 179 | O as in bOne: o |
spinal | 13:0333e08d59e6 | 180 | Oi as in cOIn: O |
spinal | 13:0333e08d59e6 | 181 | O as in jOb: 6 |
spinal | 13:0333e08d59e6 | 182 | Oo as in wOOd: 7 |
spinal | 13:0333e08d59e6 | 183 | P as in PePPer: p |
spinal | 13:0333e08d59e6 | 184 | R as in RaRe: r |
spinal | 13:0333e08d59e6 | 185 | S as in leSS: s |
spinal | 13:0333e08d59e6 | 186 | Sh as in SHy: S |
spinal | 13:0333e08d59e6 | 187 | T as in aTTack: t |
spinal | 13:0333e08d59e6 | 188 | Th as in THen: T |
spinal | 13:0333e08d59e6 | 189 | Th as in THirteen: H |
spinal | 13:0333e08d59e6 | 190 | U as in rUle: u |
spinal | 13:0333e08d59e6 | 191 | U as in hUmdrUm: U |
spinal | 13:0333e08d59e6 | 192 | U as in Union: 8 |
spinal | 13:0333e08d59e6 | 193 | U as in cUrable: 9 |
spinal | 13:0333e08d59e6 | 194 | V as in giVe: v |
spinal | 13:0333e08d59e6 | 195 | W as in We: w |
spinal | 13:0333e08d59e6 | 196 | W as in ONe: W |
spinal | 13:0333e08d59e6 | 197 | Z as in raISE: z |
spinal | 13:0333e08d59e6 | 198 | Pause (about 25ms): 0 |
spinal | 13:0333e08d59e6 | 199 | |
spinal | 13:0333e08d59e6 | 200 | */ |