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