mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-07-01 22:08:55 -07:00
5704 lines
172 KiB
C++
5704 lines
172 KiB
C++
|
|
#include "stm32_sam.h"
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// All
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
char input[256 + 1] = {0}; //tab39445
|
|
//standard sam sound
|
|
|
|
unsigned char wait1 = 7;
|
|
unsigned char wait2 = 6;
|
|
|
|
unsigned char A, X, Y;
|
|
unsigned char mem44;
|
|
unsigned char mem47;
|
|
unsigned char mem49;
|
|
unsigned char mem39;
|
|
unsigned char mem50;
|
|
unsigned char mem51;
|
|
unsigned char mem53;
|
|
unsigned char mem56;
|
|
unsigned char mem59 = 0;
|
|
|
|
unsigned char phonemeIndexOutput[60]; //tab47296
|
|
unsigned char stressOutput[60]; //tab47365
|
|
unsigned char phonemeLengthOutput[60]; //tab47416
|
|
|
|
// contains the soundbuffer position
|
|
int bufferpos;
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Sam Tabs
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
//tab40672
|
|
const unsigned char stressInputTable[] = {'*', '1', '2', '3', '4', '5', '6', '7', '8'};
|
|
|
|
//tab40682
|
|
const unsigned char signInputTable1[] = {
|
|
' ', '.', '?', ',', '-', 'I', 'I', 'E', 'A', 'A', 'A', 'A', 'U', 'A', 'I', 'E', 'U',
|
|
'O', 'R', 'L', 'W', 'Y', 'W', 'R', 'L', 'W', 'Y', 'M', 'N', 'N', 'D', 'Q', 'S', 'S',
|
|
'F', 'T', '/', '/', 'Z', 'Z', 'V', 'D', 'C', '*', 'J', '*', '*', '*', 'E', 'A', 'O',
|
|
'A', 'O', 'U', 'B', '*', '*', 'D', '*', '*', 'G', '*', '*', 'G', '*', '*', 'P', '*',
|
|
'*', 'T', '*', '*', 'K', '*', '*', 'K', '*', '*', 'U', 'U', 'U'};
|
|
|
|
//tab40763
|
|
const unsigned char signInputTable2[] = {
|
|
'*', '*', '*', '*', '*', 'Y', 'H', 'H', 'E', 'A', 'H', 'O', 'H', 'X', 'X', 'R', 'X',
|
|
'H', 'X', 'X', 'X', 'X', 'H', '*', '*', '*', '*', '*', '*', 'X', 'X', '*', '*', 'H',
|
|
'*', 'H', 'H', 'X', '*', 'H', '*', 'H', 'H', '*', '*', '*', '*', '*', 'Y', 'Y', 'Y',
|
|
'W', 'W', 'W', '*', '*', '*', '*', '*', '*', '*', '*', '*', 'X', '*', '*', '*', '*',
|
|
'*', '*', '*', '*', '*', '*', '*', 'X', '*', '*', 'L', 'M', 'N'};
|
|
|
|
//loc_9F8C
|
|
const unsigned char flags[] = {
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0xA4, 0x84, 0x84, 0xA4,
|
|
0xA4, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x44, 0x44, 0x44, 0x44, 0x44, 0x4C,
|
|
0x4C, 0x4C, 0x48, 0x4C, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x44, 0x44, 0x44, 0x44,
|
|
0x48, 0x40, 0x4C, 0x44, 0x00, 0x00, 0xB4, 0xB4, 0xB4, 0x94, 0x94, 0x94, 0x4E, 0x4E,
|
|
0x4E, 0x4E, 0x4E, 0x4E, 0x4E, 0x4E, 0x4E, 0x4E, 0x4E, 0x4E, 0x4B, 0x4B, 0x4B, 0x4B,
|
|
0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x80, 0xC1, 0xC1
|
|
|
|
};
|
|
|
|
//??? flags overlap flags2
|
|
//loc_9FDA
|
|
const unsigned char flags2[] = {
|
|
0x80, 0xC1, 0xC1, 0xC1, 0xC1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x08, 0x0C, 0x08, 0x04, 0x40,
|
|
0x24, 0x20, 0x20, 0x24, 0x00, 0x00, 0x24, 0x20, 0x20, 0x24, 0x20, 0x20, 0x00, 0x20, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
|
|
|
//tab45616???
|
|
const unsigned char phonemeStressedLengthTable[] = {
|
|
0x00, 0x12, 0x12, 0x12, 8, 0xB, 9, 0xB, 0xE, 0xF, 0xB, 0x10, 0xC, 6, 6, 0xE,
|
|
0xC, 0xE, 0xC, 0xB, 8, 8, 0xB, 0xA, 9, 8, 8, 8, 8, 8, 3, 5,
|
|
2, 2, 2, 2, 2, 2, 6, 6, 8, 6, 6, 2, 9, 4, 2, 1,
|
|
0xE, 0xF, 0xF, 0xF, 0xE, 0xE, 8, 2, 2, 7, 2, 1, 7, 2, 2, 7,
|
|
2, 2, 8, 2, 2, 6, 2, 2, 7, 2, 4, 7, 1, 4, 5, 5};
|
|
|
|
//tab45536???
|
|
const unsigned char phonemeLengthTable[] = {
|
|
0, 0x12, 0x12, 0x12, 8, 8, 8, 8, 8, 0xB, 6, 0xC, 0xA, 5, 5, 0xB, 0xA, 0xA, 0xA, 9,
|
|
8, 7, 9, 7, 6, 8, 6, 7, 7, 7, 2, 5, 2, 2, 2, 2, 2, 2, 6, 6,
|
|
7, 6, 6, 2, 8, 3, 1, 0x1E, 0xD, 0xC, 0xC, 0xC, 0xE, 9, 6, 1, 2, 5, 1, 1,
|
|
6, 1, 2, 6, 1, 2, 8, 2, 2, 4, 2, 2, 6, 1, 4, 6, 1, 4, 0xC7, 0xFF};
|
|
|
|
/*
|
|
|
|
Ind | phoneme | flags |
|
|
-----|---------|----------|
|
|
0 | * | 00000000 |
|
|
1 | .* | 00000000 |
|
|
2 | ?* | 00000000 |
|
|
3 | ,* | 00000000 |
|
|
4 | -* | 00000000 |
|
|
|
|
VOWELS
|
|
5 | IY | 10100100 |
|
|
6 | IH | 10100100 |
|
|
7 | EH | 10100100 |
|
|
8 | AE | 10100100 |
|
|
9 | AA | 10100100 |
|
|
10 | AH | 10100100 |
|
|
11 | AO | 10000100 |
|
|
17 | OH | 10000100 |
|
|
12 | UH | 10000100 |
|
|
16 | UX | 10000100 |
|
|
15 | ER | 10000100 |
|
|
13 | AX | 10100100 |
|
|
14 | IX | 10100100 |
|
|
|
|
DIPHTONGS
|
|
48 | EY | 10110100 |
|
|
49 | AY | 10110100 |
|
|
50 | OY | 10110100 |
|
|
51 | AW | 10010100 |
|
|
52 | OW | 10010100 |
|
|
53 | UW | 10010100 |
|
|
|
|
|
|
21 | YX | 10000100 |
|
|
20 | WX | 10000100 |
|
|
18 | RX | 10000100 |
|
|
19 | LX | 10000100 |
|
|
37 | /X | 01000000 |
|
|
30 | DX | 01001000 |
|
|
|
|
|
|
22 | WH | 01000100 |
|
|
|
|
|
|
VOICED CONSONANTS
|
|
23 | R* | 01000100 |
|
|
24 | L* | 01000100 |
|
|
25 | W* | 01000100 |
|
|
26 | Y* | 01000100 |
|
|
27 | M* | 01001100 |
|
|
28 | N* | 01001100 |
|
|
29 | NX | 01001100 |
|
|
54 | B* | 01001110 |
|
|
57 | D* | 01001110 |
|
|
60 | G* | 01001110 |
|
|
44 | J* | 01001100 |
|
|
38 | Z* | 01000100 |
|
|
39 | ZH | 01000100 |
|
|
40 | V* | 01000100 |
|
|
41 | DH | 01000100 |
|
|
|
|
unvoiced CONSONANTS
|
|
32 | S* | 01000000 |
|
|
33 | SH | 01000000 |
|
|
34 | F* | 01000000 |
|
|
35 | TH | 01000000 |
|
|
66 | P* | 01001011 |
|
|
69 | T* | 01001011 |
|
|
72 | K* | 01001011 |
|
|
42 | CH | 01001000 |
|
|
36 | /H | 01000000 |
|
|
|
|
43 | ** | 01000000 |
|
|
45 | ** | 01000100 |
|
|
46 | ** | 00000000 |
|
|
47 | ** | 00000000 |
|
|
|
|
|
|
55 | ** | 01001110 |
|
|
56 | ** | 01001110 |
|
|
58 | ** | 01001110 |
|
|
59 | ** | 01001110 |
|
|
61 | ** | 01001110 |
|
|
62 | ** | 01001110 |
|
|
63 | GX | 01001110 |
|
|
64 | ** | 01001110 |
|
|
65 | ** | 01001110 |
|
|
67 | ** | 01001011 |
|
|
68 | ** | 01001011 |
|
|
70 | ** | 01001011 |
|
|
71 | ** | 01001011 |
|
|
73 | ** | 01001011 |
|
|
74 | ** | 01001011 |
|
|
75 | KX | 01001011 |
|
|
76 | ** | 01001011 |
|
|
77 | ** | 01001011 |
|
|
|
|
|
|
SPECIAL
|
|
78 | UL | 10000000 |
|
|
79 | UM | 11000001 |
|
|
80 | UN | 11000001 |
|
|
31 | Q* | 01001100 |
|
|
|
|
*/
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// RenderTabs
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
const unsigned char tab48426[5] = {0x18, 0x1A, 0x17, 0x17, 0x17};
|
|
|
|
const unsigned char tab47492[] = {0, 0, 0xE0, 0xE6, 0xEC, 0xF3, 0xF9, 0, 6, 0xC, 6};
|
|
|
|
const unsigned char amplitudeRescale[] = {
|
|
0,
|
|
1,
|
|
2,
|
|
2,
|
|
2,
|
|
3,
|
|
3,
|
|
4,
|
|
4,
|
|
5,
|
|
6,
|
|
8,
|
|
9,
|
|
0xB,
|
|
0xD,
|
|
0xF,
|
|
0 //17 elements?
|
|
};
|
|
|
|
// Used to decide which phoneme's blend lengths. The candidate with the lower score is selected.
|
|
// tab45856
|
|
const unsigned char blendRank[] = {0, 0x1F, 0x1F, 0x1F, 0x1F, 2, 2, 2, 2, 2,
|
|
2, 2, 2, 2, 5, 5, 2, 0xA, 2, 8,
|
|
5, 5, 0xB, 0xA, 9, 8, 8, 0xA0, 8, 8,
|
|
0x17, 0x1F, 0x12, 0x12, 0x12, 0x12, 0x1E, 0x1E, 0x14, 0x14,
|
|
0x14, 0x14, 0x17, 0x17, 0x1A, 0x1A, 0x1D, 0x1D, 2, 2,
|
|
2, 2, 2, 2, 0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B,
|
|
0x1A, 0x1D, 0x1B, 0x1A, 0x1D, 0x1B, 0x17, 0x1D, 0x17, 0x17,
|
|
0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x1D, 0x17, 0x17, 0x17};
|
|
|
|
// Number of frames at the end of a phoneme devoted to interpolating to next phoneme's final value
|
|
//tab45696
|
|
const unsigned char outBlendLength[] = {0, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
|
|
4, 4, 3, 2, 4, 4, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1,
|
|
1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 0, 1, 0, 1, 0, 5,
|
|
5, 5, 5, 5, 4, 4, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2,
|
|
0, 1, 2, 0, 2, 2, 0, 1, 3, 0, 2, 3, 0, 2, 0xA0, 0xA0};
|
|
|
|
// Number of frames at beginning of a phoneme devoted to interpolating to phoneme's final value
|
|
// tab45776
|
|
const unsigned char inBlendLength[] = {0, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
|
|
4, 4, 3, 3, 4, 4, 3, 3, 3, 3, 3, 1, 2, 3, 2, 1,
|
|
3, 3, 3, 3, 1, 1, 3, 3, 3, 2, 2, 3, 2, 3, 0, 0,
|
|
5, 5, 5, 5, 4, 4, 2, 0, 2, 2, 0, 3, 2, 0, 4, 2,
|
|
0, 3, 2, 0, 2, 2, 0, 2, 3, 0, 3, 3, 0, 3, 0xB0, 0xA0};
|
|
|
|
// Looks like it's used as bit flags
|
|
// High bits masked by 248 (11111000)
|
|
//
|
|
// 32: S* 241 11110001
|
|
// 33: SH 226 11100010
|
|
// 34: F* 211 11010011
|
|
// 35: TH 187 10111011
|
|
// 36: /H 124 01111100
|
|
// 37: /X 149 10010101
|
|
// 38: Z* 1 00000001
|
|
// 39: ZH 2 00000010
|
|
// 40: V* 3 00000011
|
|
// 41: DH 3 00000011
|
|
// 43: ** 114 01110010
|
|
// 45: ** 2 00000010
|
|
// 67: ** 27 00011011
|
|
// 70: ** 25 00011001
|
|
// tab45936
|
|
const unsigned char sampledConsonantFlags[] = {
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xF1, 0xE2,0xD3, 0xBB, 0x7C, 0x95, 1, 2,
|
|
3, 3, 0, 0x72, 0, 2, 0, 0, |