Quick and horrible speech engine
main.cpp@15:bad48ea4468b, 2019-01-05 (annotated)
- Committer:
- spinal
- Date:
- Sat Jan 05 13:20:14 2019 +0000
- Revision:
- 15:bad48ea4468b
- Parent:
- 14:f25c2f72b2aa
test1
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 | 15:bad48ea4468b | 47 | uint8_t playSound(const unsigned char *sound, uint32_t soundSize, int volume = 255, float speed=255){ |
spinal | 13:0333e08d59e6 | 48 | |
spinal | 15:bad48ea4468b | 49 | int channel = 0; |
spinal | 15:bad48ea4468b | 50 | float spd = (POK_AUD_FREQ / 11025); |
spinal | 13:0333e08d59e6 | 51 | |
spinal | 15:bad48ea4468b | 52 | snd[channel].currentSound = sound; // sound to play |
spinal | 15:bad48ea4468b | 53 | snd[channel].currentSoundSize = (soundSize<<8)/speed; // length of sound array adjusted for speed change |
spinal | 15:bad48ea4468b | 54 | snd[channel].volume = volume; // volume, best kept below 64 as louder will cause clipping when playing multiple samples |
spinal | 15:bad48ea4468b | 55 | snd[channel].speed = (speed/spd); // recalculated above |
spinal | 15:bad48ea4468b | 56 | snd[channel].soundPoint = 0; // where the current sound is upto |
spinal | 15:bad48ea4468b | 57 | snd[channel].playSample = 1; // 1 to play this sound, 0 not to |
spinal | 13:0333e08d59e6 | 58 | |
spinal | 13:0333e08d59e6 | 59 | return channel; |
spinal | 13:0333e08d59e6 | 60 | } |
spinal | 13:0333e08d59e6 | 61 | |
spinal | 13:0333e08d59e6 | 62 | uint8_t mixSound(int samplePos) |
spinal | 13:0333e08d59e6 | 63 | { |
spinal | 13:0333e08d59e6 | 64 | int temp = 0; |
spinal | 13:0333e08d59e6 | 65 | int t=0; |
spinal | 13:0333e08d59e6 | 66 | if(snd[t].playSample!=0){ |
spinal | 13:0333e08d59e6 | 67 | int currentSample = (snd[t].currentSound[(snd[t].soundPoint*snd[t].speed)>>8]); |
spinal | 13:0333e08d59e6 | 68 | temp = currentSample; |
spinal | 13:0333e08d59e6 | 69 | } |
spinal | 13:0333e08d59e6 | 70 | return temp; |
spinal | 13:0333e08d59e6 | 71 | } |
spinal | 12:37d999e445ad | 72 | |
spinal | 12:37d999e445ad | 73 | |
spinal | 13:0333e08d59e6 | 74 | void updateSample(){ |
spinal | 13:0333e08d59e6 | 75 | |
spinal | 13:0333e08d59e6 | 76 | int quart = soundbufindex / 512; |
spinal | 13:0333e08d59e6 | 77 | int sndOffset[]={512,1024,1536,0}; |
spinal | 12:37d999e445ad | 78 | |
spinal | 13:0333e08d59e6 | 79 | if(oldQuart != quart){ |
spinal | 13:0333e08d59e6 | 80 | oldQuart = quart; |
spinal | 13:0333e08d59e6 | 81 | for(int t=0; t<=SBUFSIZE/4;){ |
spinal | 13:0333e08d59e6 | 82 | soundbuf[t+sndOffset[quart]] = 127; |
spinal | 13:0333e08d59e6 | 83 | uint8_t sample = mixSound(t); |
spinal | 13:0333e08d59e6 | 84 | int s=0; |
spinal | 13:0333e08d59e6 | 85 | if(snd[s].playSample!=0){ |
spinal | 13:0333e08d59e6 | 86 | soundbuf[t+sndOffset[quart]] = sample; |
spinal | 13:0333e08d59e6 | 87 | } |
spinal | 13:0333e08d59e6 | 88 | //for(int s=0; s<10; s++){ |
spinal | 13:0333e08d59e6 | 89 | ++snd[s].soundPoint; |
spinal | 13:0333e08d59e6 | 90 | if(snd[s].soundPoint >= snd[s].currentSoundSize){ |
spinal | 13:0333e08d59e6 | 91 | snd[s].playSample=0; |
spinal | 13:0333e08d59e6 | 92 | } |
spinal | 13:0333e08d59e6 | 93 | //} |
spinal | 13:0333e08d59e6 | 94 | t++; |
spinal | 13:0333e08d59e6 | 95 | } |
spinal | 13:0333e08d59e6 | 96 | } |
spinal | 13:0333e08d59e6 | 97 | } |
spinal | 12:37d999e445ad | 98 | |
spinal | 12:37d999e445ad | 99 | |
spinal | 12:37d999e445ad | 100 | |
spinal | 12:37d999e445ad | 101 | int main () |
spinal | 12:37d999e445ad | 102 | { |
spinal | 12:37d999e445ad | 103 | mygame.begin(); |
spinal | 13:0333e08d59e6 | 104 | pokPlayStream(); |
spinal | 13:0333e08d59e6 | 105 | emptyBuffer(); // clear the sound buffer |
spinal | 12:37d999e445ad | 106 | |
spinal | 13:0333e08d59e6 | 107 | sounder.attach(&updateSample, 0.0001); |
spinal | 12:37d999e445ad | 108 | |
spinal | 13:0333e08d59e6 | 109 | // playSound(rawData, sizeof(rawData)); |
spinal | 11:a573cacdc078 | 110 | |
spinal | 13:0333e08d59e6 | 111 | int letter=0; |
spinal | 12:37d999e445ad | 112 | while (mygame.isRunning()) |
spinal | 12:37d999e445ad | 113 | { |
spinal | 12:37d999e445ad | 114 | if (mygame.update()) |
spinal | 12:37d999e445ad | 115 | { |
spinal | 13:0333e08d59e6 | 116 | // update buttons |
spinal | 12:37d999e445ad | 117 | |
spinal | 13:0333e08d59e6 | 118 | if(snd[0].playSample == 0){ |
spinal | 13:0333e08d59e6 | 119 | int toPlay = myWord[letter]; |
spinal | 13:0333e08d59e6 | 120 | |
spinal | 13:0333e08d59e6 | 121 | if(toPlay < 97 || toPlay > 97+25){ |
spinal | 13:0333e08d59e6 | 122 | toPlay='0'; |
spinal | 13:0333e08d59e6 | 123 | } |
spinal | 13:0333e08d59e6 | 124 | |
spinal | 13:0333e08d59e6 | 125 | if(toPlay>=97 && toPlay <=122){ |
spinal | 13:0333e08d59e6 | 126 | int start = sndPos[toPlay-97]; |
spinal | 13:0333e08d59e6 | 127 | int size = sndSize[toPlay-97]; |
spinal | 13:0333e08d59e6 | 128 | playSound(&ABC[start], size); |
spinal | 13:0333e08d59e6 | 129 | } |
spinal | 12:37d999e445ad | 130 | |
spinal | 13:0333e08d59e6 | 131 | if(toPlay>=65 && toPlay <=90){ |
spinal | 13:0333e08d59e6 | 132 | int start = sndPos[toPlay-65+26]; |
spinal | 13:0333e08d59e6 | 133 | int size = sndSize[toPlay-65+26]; |
spinal | 13:0333e08d59e6 | 134 | playSound(&ABC[start], size); |
spinal | 13:0333e08d59e6 | 135 | } |
spinal | 13:0333e08d59e6 | 136 | |
spinal | 13:0333e08d59e6 | 137 | if(toPlay>=48 && toPlay <=57){ |
spinal | 13:0333e08d59e6 | 138 | int start = sndPos[toPlay-48+52]; |
spinal | 13:0333e08d59e6 | 139 | int size = sndSize[toPlay-48+52]; |
spinal | 13:0333e08d59e6 | 140 | playSound(&ABC[start], size); |
spinal | 13:0333e08d59e6 | 141 | } |
spinal | 13:0333e08d59e6 | 142 | |
spinal | 13:0333e08d59e6 | 143 | if(++letter==sizeof(myWord))letter=0; |
spinal | 12:37d999e445ad | 144 | } |
spinal | 12:37d999e445ad | 145 | |
spinal | 13:0333e08d59e6 | 146 | |
spinal | 12:37d999e445ad | 147 | |
spinal | 12:37d999e445ad | 148 | } |
spinal | 12:37d999e445ad | 149 | } |
spinal | 11:a573cacdc078 | 150 | } |
spinal | 11:a573cacdc078 | 151 | |
spinal | 11:a573cacdc078 | 152 | |
spinal | 13:0333e08d59e6 | 153 | /* |
spinal | 13:0333e08d59e6 | 154 | |
spinal | 13:0333e08d59e6 | 155 | The sound codes are: |
spinal | 13:0333e08d59e6 | 156 | A as in bAnanA: a |
spinal | 13:0333e08d59e6 | 157 | A as in mAp: A |
spinal | 13:0333e08d59e6 | 158 | A as in bOther: 1 |
spinal | 13:0333e08d59e6 | 159 | Ay as in dAY: 2 |
spinal | 13:0333e08d59e6 | 160 | A as in bAd: 3 |
spinal | 13:0333e08d59e6 | 161 | Aw as in nOW: 4 |
spinal | 13:0333e08d59e6 | 162 | Aw as in sAW: 5 |
spinal | 13:0333e08d59e6 | 163 | B as in BaBy: b |
spinal | 13:0333e08d59e6 | 164 | Ch as in CHin: c |
spinal | 13:0333e08d59e6 | 165 | D as in unDone: d |
spinal | 13:0333e08d59e6 | 166 | E as in bEt: e |
spinal | 13:0333e08d59e6 | 167 | Ea as in bEAt: E |
spinal | 13:0333e08d59e6 | 168 | F as in FiFty: f |
spinal | 13:0333e08d59e6 | 169 | G as in Go: g |
spinal | 13:0333e08d59e6 | 170 | G as in Gem: G |
spinal | 13:0333e08d59e6 | 171 | H as in Hat: h |
spinal | 13:0333e08d59e6 | 172 | I as in tIp: i |
spinal | 13:0333e08d59e6 | 173 | I as in bUY: I |
spinal | 13:0333e08d59e6 | 174 | Ir as in bIRd: j |
spinal | 13:0333e08d59e6 | 175 | K as in CooK: k |
spinal | 13:0333e08d59e6 | 176 | L as in pooL: l |
spinal | 13:0333e08d59e6 | 177 | M as in diM: m |
spinal | 13:0333e08d59e6 | 178 | N as in No: n |
spinal | 13:0333e08d59e6 | 179 | Ng as in siNG: N |
spinal | 13:0333e08d59e6 | 180 | O as in bOne: o |
spinal | 13:0333e08d59e6 | 181 | Oi as in cOIn: O |
spinal | 13:0333e08d59e6 | 182 | O as in jOb: 6 |
spinal | 13:0333e08d59e6 | 183 | Oo as in wOOd: 7 |
spinal | 13:0333e08d59e6 | 184 | P as in PePPer: p |
spinal | 13:0333e08d59e6 | 185 | R as in RaRe: r |
spinal | 13:0333e08d59e6 | 186 | S as in leSS: s |
spinal | 13:0333e08d59e6 | 187 | Sh as in SHy: S |
spinal | 13:0333e08d59e6 | 188 | T as in aTTack: t |
spinal | 13:0333e08d59e6 | 189 | Th as in THen: T |
spinal | 13:0333e08d59e6 | 190 | Th as in THirteen: H |
spinal | 13:0333e08d59e6 | 191 | U as in rUle: u |
spinal | 13:0333e08d59e6 | 192 | U as in hUmdrUm: U |
spinal | 13:0333e08d59e6 | 193 | U as in Union: 8 |
spinal | 13:0333e08d59e6 | 194 | U as in cUrable: 9 |
spinal | 13:0333e08d59e6 | 195 | V as in giVe: v |
spinal | 13:0333e08d59e6 | 196 | W as in We: w |
spinal | 13:0333e08d59e6 | 197 | W as in ONe: W |
spinal | 13:0333e08d59e6 | 198 | Z as in raISE: z |
spinal | 13:0333e08d59e6 | 199 | Pause (about 25ms): 0 |
spinal | 13:0333e08d59e6 | 200 | |
spinal | 13:0333e08d59e6 | 201 | */ |