Quick and horrible speech engine

Dependencies:   PokittoLib

Committer:
spinal
Date:
Sat Jan 05 13:20:14 2019 +0000
Revision:
15:bad48ea4468b
Parent:
14:f25c2f72b2aa
test1

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