Quick and horrible speech engine

Dependencies:   PokittoLib

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?

UserRevisionLine numberNew 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 */